diff options
| author | Amit Aryeh Levy <amit@amitlevy.com> | 2017-04-28 17:21:59 -0500 |
|---|---|---|
| committer | Amit Aryeh Levy <amit@amitlevy.com> | 2017-04-28 17:33:56 -0500 |
| commit | 0f00f27e0d4743b14f7c0d0fca9731a45eae487a (patch) | |
| tree | 6d966bd680e8f739a396f554d4368e5f2e0095b7 /src/rustllvm/PassWrapper.cpp | |
| parent | 32b92669e4ec83005eff2641b092f25be09373b8 (diff) | |
| download | rust-0f00f27e0d4743b14f7c0d0fca9731a45eae487a.tar.gz rust-0f00f27e0d4743b14f7c0d0fca9731a45eae487a.zip | |
Added LLVMRustRelocMode
Replaces the llvm-c exposed LLVMRelocMode, which does not include all relocation model variants, with a LLVMRustRelocMode modeled after LLVMRustCodeMode.
Diffstat (limited to 'src/rustllvm/PassWrapper.cpp')
| -rw-r--r-- | src/rustllvm/PassWrapper.cpp | 77 |
1 files changed, 43 insertions, 34 deletions
diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 1e19e28e78a..f91145fbb5e 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<Reloc::Model> 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<Reloc::Model> 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)); |
