From 7f0e733f1d8e597faee4bff0fc04838867725fad Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 30 Jun 2015 08:56:56 -0700 Subject: [PATCH] rustc_trans: Update LLVMBuildLandingPad signature The C API of this function changed so it no longer takes a personality function. A shim was introduced to call the right LLVM function (depending on which version we're compiled against) to set the personality function on the outer function. The compiler only ever sets one personality function for all generated functions, so this should be equivalent. --- src/librustc_llvm/lib.rs | 13 +++++++------ src/librustc_trans/trans/build.rs | 2 +- src/librustc_trans/trans/builder.rs | 8 +++++--- src/rustllvm/RustWrapper.cpp | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 10 deletions(-) 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 +}