diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index 7afcb54cce43..05f82b86ebbc 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -1136,12 +1136,13 @@ extern { Catch: BasicBlockRef, Name: *const c_char) -> ValueRef; - pub fn LLVMBuildLandingPad(B: BuilderRef, - Ty: TypeRef, - PersFn: ValueRef, - NumClauses: c_uint, - Name: *const c_char) - -> ValueRef; + pub fn LLVMRustBuildLandingPad(B: BuilderRef, + Ty: TypeRef, + PersFn: ValueRef, + NumClauses: c_uint, + Name: *const c_char, + F: ValueRef) + -> ValueRef; pub fn LLVMBuildResume(B: BuilderRef, Exn: ValueRef) -> ValueRef; pub fn LLVMBuildUnreachable(B: BuilderRef) -> ValueRef; diff --git a/src/librustc_trans/trans/build.rs b/src/librustc_trans/trans/build.rs index 7d6825040442..3e4452a23b9f 100644 --- a/src/librustc_trans/trans/build.rs +++ b/src/librustc_trans/trans/build.rs @@ -1039,7 +1039,7 @@ pub fn LandingPad(cx: Block, ty: Type, pers_fn: ValueRef, num_clauses: usize) -> ValueRef { check_not_terminated(cx); assert!(!cx.unreachable.get()); - B(cx).landing_pad(ty, pers_fn, num_clauses) + B(cx).landing_pad(ty, pers_fn, num_clauses, cx.fcx.llfn) } pub fn SetCleanup(cx: Block, landing_pad: ValueRef) { diff --git a/src/librustc_trans/trans/builder.rs b/src/librustc_trans/trans/builder.rs index 32d9ee7a508b..e39fc18dc7bf 100644 --- a/src/librustc_trans/trans/builder.rs +++ b/src/librustc_trans/trans/builder.rs @@ -927,11 +927,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - pub fn landing_pad(&self, ty: Type, pers_fn: ValueRef, num_clauses: usize) -> ValueRef { + pub fn landing_pad(&self, ty: Type, pers_fn: ValueRef, + num_clauses: usize, + llfn: ValueRef) -> ValueRef { self.count_insn("landingpad"); unsafe { - llvm::LLVMBuildLandingPad( - self.llbuilder, ty.to_ref(), pers_fn, num_clauses as c_uint, noname()) + llvm::LLVMRustBuildLandingPad(self.llbuilder, ty.to_ref(), pers_fn, + num_clauses as c_uint, noname(), llfn) } } diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 6861ad43a3cf..163e95b890f4 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -942,3 +942,18 @@ extern "C" void LLVMWriteSMDiagnosticToString(LLVMSMDiagnosticRef d, RustStringR raw_rust_string_ostream os(str); unwrap(d)->print("", os); } + +extern "C" LLVMValueRef +LLVMRustBuildLandingPad(LLVMBuilderRef Builder, + LLVMTypeRef Ty, + LLVMValueRef PersFn, + unsigned NumClauses, + const char* Name, + LLVMValueRef F) { +#if LLVM_VERSION_MINOR >= 7 + unwrap(F)->setPersonalityFn(unwrap(PersFn)); + return LLVMBuildLandingPad(Builder, Ty, NumClauses, Name); +#else + return LLVMBuildLandingPad(Builder, Ty, PersFn, NumClauses, Name); +#endif +}