Skip to content

Commit

Permalink
Added LLVMRustRelocMode
Browse files Browse the repository at this point in the history
Replaces the llvm-c exposed LLVMRelocMode, which does not include all
relocation model variants, with a LLVMRustRelocMode modeled after
LLVMRustCodeMode.
  • Loading branch information
alevy committed Apr 28, 2017
1 parent 32b9266 commit 0f00f27
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 41 deletions.
14 changes: 7 additions & 7 deletions src/librustc_llvm/ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
77 changes: 43 additions & 34 deletions src/rustllvm/PassWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
///
Expand Down Expand Up @@ -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));
Expand Down

0 comments on commit 0f00f27

Please sign in to comment.