diff --git a/src/librustc_trans/trans/context.rs b/src/librustc_trans/trans/context.rs index 10edb72f0e200..a39ab4978edb3 100644 --- a/src/librustc_trans/trans/context.rs +++ b/src/librustc_trans/trans/context.rs @@ -873,14 +873,12 @@ fn declare_intrinsic(ccx: &CrateContext, key: & &'static str) -> Option void); ifn!("llvm.expect.i1", fn(i1, i1) -> i1); - ifn!("llvm.assume", fn(i1) -> void); // Some intrinsics were introduced in later versions of LLVM, but they have - // fallbacks in libc or libm and such. Currently, all of these intrinsics - // were introduced in LLVM 3.4, so we case on that. + // fallbacks in libc or libm and such. macro_rules! compatible_ifn { - ($name:expr, $cname:ident ($($arg:expr),*) -> $ret:expr) => ( - if unsafe { llvm::LLVMVersionMinor() >= 4 } { + ($name:expr, $cname:ident ($($arg:expr),*) -> $ret:expr, $llvm_version:expr) => ( + if unsafe { llvm::LLVMVersionMinor() >= $llvm_version } { // The `if key == $name` is already in ifn! ifn!($name, fn($($arg),*) -> $ret); } else if *key == $name { @@ -893,10 +891,11 @@ fn declare_intrinsic(ccx: &CrateContext, key: & &'static str) -> Option t_f32); - compatible_ifn!("llvm.copysign.f64", copysign(t_f64, t_f64) -> t_f64); - compatible_ifn!("llvm.round.f32", roundf(t_f32) -> t_f32); - compatible_ifn!("llvm.round.f64", round(t_f64) -> t_f64); + compatible_ifn!("llvm.copysign.f32", copysignf(t_f32, t_f32) -> t_f32, 4); + compatible_ifn!("llvm.copysign.f64", copysign(t_f64, t_f64) -> t_f64, 4); + compatible_ifn!("llvm.round.f32", roundf(t_f32) -> t_f32, 4); + compatible_ifn!("llvm.round.f64", round(t_f64) -> t_f64, 4); + compatible_ifn!("llvm.assume", llvmcompat_assume(i1) -> void, 6); if ccx.sess().opts.debuginfo != NoDebugInfo { diff --git a/src/rt/rust_builtin.c b/src/rt/rust_builtin.c index 03cd3fd6b88ea..8bf184770b48f 100644 --- a/src/rt/rust_builtin.c +++ b/src/rt/rust_builtin.c @@ -13,6 +13,7 @@ #include #include #include +#include #if !defined(__WIN32__) #include @@ -199,6 +200,11 @@ rust_unset_sigprocmask() { int *__dfly_error(void) { return __error(); } #endif +void +llvmcompat_assume(bool c) { + // empty stub for LLVM before 3.6 +} + // // Local Variables: // mode: C++ diff --git a/src/rustllvm/ExecutionEngineWrapper.cpp b/src/rustllvm/ExecutionEngineWrapper.cpp index d37cf9d12a5e0..2a8b2aa25a8fc 100644 --- a/src/rustllvm/ExecutionEngineWrapper.cpp +++ b/src/rustllvm/ExecutionEngineWrapper.cpp @@ -82,7 +82,6 @@ extern "C" LLVMExecutionEngineRef LLVMBuildExecutionEngine( InitializeNativeTargetAsmPrinter(); InitializeNativeTargetAsmParser(); - std::unique_ptr m(unwrap(mod)); RustJITMemoryManager *mm = unwrap(mref); std::string error_str; @@ -91,12 +90,22 @@ extern "C" LLVMExecutionEngineRef LLVMBuildExecutionEngine( options.JITEmitDebugInfo = true; options.NoFramePointerElim = true; +#if LLVM_VERSION_MINOR > 5 + std::unique_ptr m(unwrap(mod)); ExecutionEngine *ee = EngineBuilder(std::move(m)) .setEngineKind(EngineKind::JIT) .setErrorStr(&error_str) .setMCJITMemoryManager(mm) .setTargetOptions(options) .create(); +#else + ExecutionEngine *ee = EngineBuilder(unwrap(mod)) + .setEngineKind(EngineKind::JIT) + .setErrorStr(&error_str) + .setMCJITMemoryManager(mm) + .setTargetOptions(options) + .create(); +#endif if (!ee) LLVMRustSetLastError(error_str.c_str());