diff --git a/src/librustc_llvm/ffi.rs b/src/librustc_llvm/ffi.rs index a9a8ee93df15f..5cb5a62c93b35 100644 --- a/src/librustc_llvm/ffi.rs +++ b/src/librustc_llvm/ffi.rs @@ -284,13 +284,13 @@ pub enum CodeGenOptLevel { #[derive(Copy, Clone, PartialEq)] #[repr(C)] pub enum RelocMode { - Default = 0, - Static = 1, - PIC = 2, - DynamicNoPic = 3, - ROPI = 4, - RWPI = 5, - ROPI_RWPI = 6, + Default, + Static, + PIC, + DynamicNoPic, + ROPI, + RWPI, + ROPI_RWPI, } /// LLVMRustCodeModel diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 1e19e28e78aad..f91145fbb5e15 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -239,6 +239,47 @@ static CodeGenOpt::Level fromRust(LLVMRustCodeGenOptLevel Level) { } } +enum class LLVMRustRelocMode { + Default, + Static, + PIC, + DynamicNoPic, + ROPI, + RWPI, + ROPIRWPI, +}; + +#if LLVM_VERSION_LE(3, 8) +static Reloc::Model fromRust(LLVMRustRelocMode RustReloc) { +#else +static Optional fromRust(LLVMRustRelocMode RustReloc) { +#endif + switch (RustReloc) { + case LLVMRustRelocMode::Default: +#if LLVM_VERSION_LE(3, 8) + return Reloc::Default; +#else + return None; +#endif + case LLVMRustRelocMode::Static: + return Reloc::Static; + case LLVMRustRelocMode::PIC: + return Reloc::PIC_; + case LLVMRustRelocMode::DynamicNoPic: + return Reloc::DynamicNoPIC; +#if LLVM_VERSION_GE(4, 0) + case LLVMRustRelocMode::ROPI: + return Reloc::ROPI; + case LLVMRustRelocMode::RWPI: + return Reloc::RWPI; + case LLVMRustRelocMode::ROPIRWPI: + return Reloc::ROPI_RWPI; +#endif + default: + llvm_unreachable("Bad RelocModel."); + } +} + #if LLVM_RUSTLLVM /// getLongestEntryLength - Return the length of the longest entry in the table. /// @@ -290,46 +331,14 @@ extern "C" void LLVMRustPrintTargetFeatures(LLVMTargetMachineRef) { extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine( const char *TripleStr, const char *CPU, const char *Feature, - LLVMRustCodeModel RustCM, int Reloc, + LLVMRustCodeModel RustCM, LLVMRustRelocMode RustReloc, LLVMRustCodeGenOptLevel RustOptLevel, bool UseSoftFloat, bool PositionIndependentExecutable, bool FunctionSections, bool DataSections) { -#if LLVM_VERSION_LE(3, 8) - Reloc::Model RM; -#else - Optional RM; -#endif auto CM = fromRust(RustCM); auto OptLevel = fromRust(RustOptLevel); - - switch (Reloc) { - case 1: - RM = Reloc::Static; - break; - case 2: - RM = Reloc::PIC_; - break; - case 3: - RM = Reloc::DynamicNoPIC; - break; -#if LLVM_VERSION_GE(4, 0) - case 4: - RM = Reloc::ROPI; - break; - case 5: - RM = Reloc::RWPI; - break; - case 6: - RM = Reloc::ROPI_RWPI; - break; -#endif - default: -#if LLVM_VERSION_LE(3, 8) - RM = Reloc::Default; -#endif - break; - } + auto RM = fromRust(RustReloc); std::string Error; Triple Trip(Triple::normalize(TripleStr));