Skip to content

Commit d0a1ce5

Browse files
authored
Merge pull request #1 from rtfeldman/exceptions
Exception Primitives
2 parents 8434933 + aa15f9e commit d0a1ce5

28 files changed

+611
-85
lines changed

.travis.yml

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
language: rust
22

3-
dist: trusty
43
sudo: required
54
cache:
65
directories:
@@ -47,6 +46,7 @@ matrix:
4746
- *BASE_PACKAGES
4847
- llvm-3.6-dev
4948
rust: nightly-2019-07-25
49+
dist: trusty
5050
- env:
5151
- LLVM_VERSION="3.7"
5252
<<: *BASE
@@ -59,6 +59,7 @@ matrix:
5959
- *BASE_PACKAGES
6060
- llvm-3.7-dev
6161
rust: nightly-2019-07-25
62+
dist: trusty
6263
- env:
6364
- LLVM_VERSION="3.8"
6465
<<: *BASE
@@ -71,6 +72,7 @@ matrix:
7172
- *BASE_PACKAGES
7273
- llvm-3.8-dev
7374
rust: nightly-2019-07-25
75+
dist: trusty
7476
# 3.9 seems to have a linking issue :/
7577
# - env:
7678
# - LLVM_VERSION="3.9"
@@ -83,6 +85,8 @@ matrix:
8385
# packages:
8486
# - *BASE_PACKAGES
8587
# - llvm-3.9-dev
88+
# rust: nightly-2019-07-25
89+
# dist: trusty
8690
- env:
8791
- LLVM_VERSION="4.0"
8892
<<: *BASE
@@ -95,6 +99,7 @@ matrix:
9599
- *BASE_PACKAGES
96100
- llvm-4.0-dev
97101
rust: nightly-2019-07-25
102+
dist: trusty
98103
- env:
99104
- LLVM_VERSION="5.0"
100105
<<: *BASE
@@ -107,6 +112,7 @@ matrix:
107112
- *BASE_PACKAGES
108113
- llvm-5.0-dev
109114
rust: nightly-2019-07-25
115+
dist: trusty
110116
- env:
111117
- LLVM_VERSION="6.0"
112118
<<: *BASE
@@ -119,6 +125,7 @@ matrix:
119125
- *BASE_PACKAGES
120126
- llvm-6.0-dev
121127
rust: nightly-2019-07-25
128+
dist: trusty
122129
- env:
123130
- LLVM_VERSION="7.0"
124131
<<: *BASE
@@ -131,6 +138,7 @@ matrix:
131138
- *BASE_PACKAGES
132139
- llvm-7-dev
133140
rust: nightly-2019-07-25
141+
dist: trusty
134142
- env:
135143
- LLVM_VERSION="8.0"
136144
<<: *BASE
@@ -143,6 +151,37 @@ matrix:
143151
- *BASE_PACKAGES
144152
- llvm-8-dev
145153
rust: nightly-2019-07-25
154+
dist: trusty
155+
- env:
156+
- LLVM_VERSION="9.0"
157+
<<: *BASE
158+
addons:
159+
apt:
160+
sources:
161+
- *BASE_SOURCES
162+
- llvm-toolchain-bionic-9
163+
- sourceline: 'deb https://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main'
164+
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
165+
packages:
166+
- *BASE_PACKAGES
167+
- llvm-9-dev
168+
rust: nightly-2019-07-25
169+
dist: bionic
170+
- env:
171+
- LLVM_VERSION="10.0"
172+
<<: *BASE
173+
addons:
174+
apt:
175+
sources:
176+
- *BASE_SOURCES
177+
- llvm-toolchain-bionic-10
178+
- sourceline: 'deb https://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main'
179+
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
180+
packages:
181+
- *BASE_PACKAGES
182+
- llvm-10-dev
183+
rust: nightly-2019-07-25
184+
dist: bionic
146185
- deploy: # Documentation build; Only latest supported LLVM version for now
147186
provider: pages
148187
skip-cleanup: true
@@ -152,10 +191,10 @@ matrix:
152191
on:
153192
branch: master
154193
before_install:
155-
- export PATH=/usr/lib/llvm-8/bin/:$HOME/.local/bin:$PATH
156-
- export LLVM_PATH=/usr/share/llvm-8/cmake/
194+
- export PATH=/usr/lib/llvm-10/bin/:$HOME/.local/bin:$PATH
195+
- export LLVM_PATH=/usr/share/llvm-10/cmake/
157196
script:
158-
- cargo doc --no-default-features --features "target-all,llvm8-0" --color=always
197+
- cargo doc --no-default-features --features "target-all,llvm10-0" --color=always
159198
- echo '<meta http-equiv="refresh" content="1; url=inkwell/index.html">' > target/doc/index.html
160199
rust: nightly
161200
name: "GitHub IO Documentation Deployment"
@@ -171,7 +210,11 @@ matrix:
171210
# - llvm-toolchain-trusty-5.0
172211
# - llvm-toolchain-trusty-6.0
173212
# - llvm-toolchain-trusty-7
174-
- llvm-toolchain-trusty-8
213+
# - llvm-toolchain-trusty-8
214+
# - llvm-toolchain-bionic-9
215+
- llvm-toolchain-bionic-10
216+
- sourceline: 'deb https://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main'
217+
key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
175218
packages:
176219
- *BASE_PACKAGES
177220
# - llvm-3.6-dev
@@ -182,7 +225,10 @@ matrix:
182225
# - llvm-5.0-dev
183226
# - llvm-6.0-dev
184227
# - llvm-7-dev
185-
- llvm-8-dev
228+
# - llvm-8-dev
229+
# - llvm-9-dev
230+
- llvm-10-dev
231+
dist: bionic
186232

187233
env:
188234
global:

Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ categories = ["development-tools::ffi"]
1111
edition = "2018"
1212

1313
[features]
14-
default = ["target-all"]
14+
default = ["target-all", "llvm10-0"]
1515
# Please update internal_macros::FEATURE_VERSIONS when adding a new LLVM version
1616
llvm3-6 = []
1717
llvm3-7 = []
@@ -22,6 +22,8 @@ llvm5-0 = []
2222
llvm6-0 = []
2323
llvm7-0 = []
2424
llvm8-0 = []
25+
llvm9-0 = []
26+
llvm10-0 = []
2527
# Don't link aganist LLVM libraries. This is useful if another dependency is
2628
# installing LLVM. See llvm-sys for more details.
2729
no-llvm-linking = ["llvm-sys/no-llvm-linking"]
@@ -63,7 +65,7 @@ experimental = ["static-alloc"]
6365
either = "1.5"
6466
inkwell_internals = { path = "./internal_macros", version = "0.1.0" }
6567
libc = "0.2"
66-
llvm-sys = "80.1"
68+
llvm-sys = "100.0.1"
6769
once_cell = "1.2"
6870
parking_lot = "0.10"
6971
regex = "1"

internal_macros/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ use syn::spanned::Spanned;
1919
use syn::{Token, LitFloat, Ident, Item, Field, Variant, Attribute};
2020

2121
// This array should match the LLVM features in the top level Cargo manifest
22-
const FEATURE_VERSIONS: [&str; 9] =
23-
["llvm3-6", "llvm3-7", "llvm3-8", "llvm3-9", "llvm4-0", "llvm5-0", "llvm6-0", "llvm7-0", "llvm8-0"];
22+
const FEATURE_VERSIONS: [&str; 11] =
23+
["llvm3-6", "llvm3-7", "llvm3-8", "llvm3-9", "llvm4-0", "llvm5-0", "llvm6-0", "llvm7-0", "llvm8-0", "llvm9-0", "llvm10-0"];
2424

2525
/// Gets the index of the feature version that represents `latest`
2626
fn get_latest_feature_index(features: &[&str]) -> usize {

src/basic_block.rs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! A `BasicBlock` is a container of instructions.
22
3-
use llvm_sys::core::{LLVMGetBasicBlockParent, LLVMGetBasicBlockTerminator, LLVMGetNextBasicBlock, LLVMIsABasicBlock, LLVMIsConstant, LLVMMoveBasicBlockAfter, LLVMMoveBasicBlockBefore, LLVMPrintTypeToString, LLVMPrintValueToString, LLVMTypeOf, LLVMDeleteBasicBlock, LLVMGetPreviousBasicBlock, LLVMRemoveBasicBlockFromParent, LLVMGetFirstInstruction, LLVMGetLastInstruction, LLVMGetTypeContext, LLVMBasicBlockAsValue};
3+
use llvm_sys::core::{LLVMGetBasicBlockParent, LLVMGetBasicBlockTerminator, LLVMGetNextBasicBlock, LLVMIsABasicBlock, LLVMIsConstant, LLVMMoveBasicBlockAfter, LLVMMoveBasicBlockBefore, LLVMPrintTypeToString, LLVMPrintValueToString, LLVMTypeOf, LLVMDeleteBasicBlock, LLVMGetPreviousBasicBlock, LLVMRemoveBasicBlockFromParent, LLVMGetFirstInstruction, LLVMGetLastInstruction, LLVMGetTypeContext, LLVMBasicBlockAsValue, LLVMReplaceAllUsesWith};
44
#[llvm_versions(3.9..=latest)]
55
use llvm_sys::core::LLVMGetBasicBlockName;
66
use llvm_sys::prelude::{LLVMValueRef, LLVMBasicBlockRef};
@@ -450,6 +450,41 @@ impl<'ctx> BasicBlock<'ctx> {
450450
CStr::from_ptr(ptr)
451451
}
452452
}
453+
454+
/// Replaces all uses of this basic block with another.
455+
///
456+
/// # Example
457+
///
458+
/// ```
459+
/// use inkwell::context::Context;
460+
///
461+
/// let context = Context::create();
462+
/// let builder = context.create_builder();
463+
/// let module = context.create_module("my_mod");
464+
/// let void_type = context.void_type();
465+
/// let fn_type = void_type.fn_type(&[], false);
466+
/// let fn_val = module.add_function("my_fn", fn_type, None);
467+
/// let entry = context.append_basic_block(fn_val, "entry");
468+
/// let bb1 = context.append_basic_block(fn_val, "bb1");
469+
/// let bb2 = context.append_basic_block(fn_val, "bb2");
470+
/// builder.position_at_end(entry);
471+
/// let branch_inst = builder.build_unconditional_branch(bb1);
472+
///
473+
/// bb1.replace_all_uses_with(&bb2);
474+
///
475+
/// assert_eq!(branch_inst.get_operand(0).unwrap().right().unwrap(), bb2);
476+
/// ```
477+
pub fn replace_all_uses_with(&self, other: &BasicBlock<'ctx>) {
478+
let value = unsafe { LLVMBasicBlockAsValue(self.basic_block) };
479+
let other = unsafe { LLVMBasicBlockAsValue(other.basic_block) };
480+
481+
// LLVM may infinite-loop when they aren't distinct, which is UB in C++.
482+
if value != other {
483+
unsafe {
484+
LLVMReplaceAllUsesWith(value, other);
485+
}
486+
}
487+
}
453488
}
454489

455490
impl fmt::Debug for BasicBlock<'_> {

0 commit comments

Comments
 (0)