1
Fork 0

Add RWPI/ROPI relocation model support

Adds support for using LLVM 4's ROPI and RWPI relocation models for ARM
This commit is contained in:
Amit Aryeh Levy 2017-04-25 20:05:51 -04:00
parent b0a4074c5e
commit 32b92669e4
3 changed files with 22 additions and 5 deletions

View file

@ -288,6 +288,9 @@ pub enum RelocMode {
Static = 1, Static = 1,
PIC = 2, PIC = 2,
DynamicNoPic = 3, DynamicNoPic = 3,
ROPI = 4,
RWPI = 5,
ROPI_RWPI = 6,
} }
/// LLVMRustCodeModel /// LLVMRustCodeModel

View file

@ -37,11 +37,14 @@ use std::sync::mpsc::channel;
use std::thread; use std::thread;
use libc::{c_uint, c_void}; use libc::{c_uint, c_void};
pub const RELOC_MODEL_ARGS : [(&'static str, llvm::RelocMode); 4] = [ pub const RELOC_MODEL_ARGS : [(&'static str, llvm::RelocMode); 7] = [
("pic", llvm::RelocMode::PIC), ("pic", llvm::RelocMode::PIC),
("static", llvm::RelocMode::Static), ("static", llvm::RelocMode::Static),
("default", llvm::RelocMode::Default), ("default", llvm::RelocMode::Default),
("dynamic-no-pic", llvm::RelocMode::DynamicNoPic), ("dynamic-no-pic", llvm::RelocMode::DynamicNoPic),
("ropi", llvm::RelocMode::ROPI),
("rwpi", llvm::RelocMode::RWPI),
("ropi-rwpi", llvm::RelocMode::ROPI_RWPI),
]; ];
pub const CODE_GEN_MODEL_ARGS : [(&'static str, llvm::CodeModel); 5] = [ pub const CODE_GEN_MODEL_ARGS : [(&'static str, llvm::CodeModel); 5] = [

View file

@ -290,7 +290,7 @@ extern "C" void LLVMRustPrintTargetFeatures(LLVMTargetMachineRef) {
extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine( extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
const char *TripleStr, const char *CPU, const char *Feature, const char *TripleStr, const char *CPU, const char *Feature,
LLVMRustCodeModel RustCM, LLVMRelocMode Reloc, LLVMRustCodeModel RustCM, int Reloc,
LLVMRustCodeGenOptLevel RustOptLevel, bool UseSoftFloat, LLVMRustCodeGenOptLevel RustOptLevel, bool UseSoftFloat,
bool PositionIndependentExecutable, bool FunctionSections, bool PositionIndependentExecutable, bool FunctionSections,
bool DataSections) { bool DataSections) {
@ -304,15 +304,26 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
auto OptLevel = fromRust(RustOptLevel); auto OptLevel = fromRust(RustOptLevel);
switch (Reloc) { switch (Reloc) {
case LLVMRelocStatic: case 1:
RM = Reloc::Static; RM = Reloc::Static;
break; break;
case LLVMRelocPIC: case 2:
RM = Reloc::PIC_; RM = Reloc::PIC_;
break; break;
case LLVMRelocDynamicNoPic: case 3:
RM = Reloc::DynamicNoPIC; RM = Reloc::DynamicNoPIC;
break; 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: default:
#if LLVM_VERSION_LE(3, 8) #if LLVM_VERSION_LE(3, 8)
RM = Reloc::Default; RM = Reloc::Default;