auto merge of #17975 : thestinger/rust/fPIE, r=eddyb
Position independent code has fewer requirements in executables, so pass the appropriate flag to LLVM in order to allow more optimization. At the moment this means faster thread-local storage.
This commit is contained in:
commit
7dbd4349c4
@ -34,7 +34,6 @@ use std::sync::{Arc, Mutex};
|
||||
use std::task::TaskBuilder;
|
||||
use libc::{c_uint, c_int, c_void};
|
||||
|
||||
|
||||
#[deriving(Clone, PartialEq, PartialOrd, Ord, Eq)]
|
||||
pub enum OutputType {
|
||||
OutputTypeBitcode,
|
||||
@ -44,7 +43,6 @@ pub enum OutputType {
|
||||
OutputTypeExe,
|
||||
}
|
||||
|
||||
|
||||
pub fn llvm_err(handler: &diagnostic::Handler, msg: String) -> ! {
|
||||
unsafe {
|
||||
let cstr = llvm::LLVMRustGetLastError();
|
||||
@ -202,6 +200,10 @@ fn create_target_machine(sess: &Session) -> TargetMachineRef {
|
||||
(sess.targ_cfg.os == abi::OsMacos &&
|
||||
sess.targ_cfg.arch == abi::X86_64);
|
||||
|
||||
let any_library = sess.crate_types.borrow().iter().any(|ty| {
|
||||
*ty != config::CrateTypeExecutable
|
||||
});
|
||||
|
||||
// OSX has -dead_strip, which doesn't rely on ffunction_sections
|
||||
// FIXME(#13846) this should be enabled for windows
|
||||
let ffunction_sections = sess.targ_cfg.os != abi::OsMacos &&
|
||||
@ -240,6 +242,7 @@ fn create_target_machine(sess: &Session) -> TargetMachineRef {
|
||||
true /* EnableSegstk */,
|
||||
use_softfp,
|
||||
no_fp_elim,
|
||||
!any_library && reloc_model == llvm::RelocPIC,
|
||||
ffunction_sections,
|
||||
fdata_sections,
|
||||
)
|
||||
|
@ -353,6 +353,7 @@ pub enum CodeGenOptLevel {
|
||||
CodeGenLevelAggressive = 3,
|
||||
}
|
||||
|
||||
#[deriving(PartialEq)]
|
||||
#[repr(C)]
|
||||
pub enum RelocMode {
|
||||
RelocDefault = 0,
|
||||
@ -1907,6 +1908,7 @@ extern {
|
||||
EnableSegstk: bool,
|
||||
UseSoftFP: bool,
|
||||
NoFramePointerElim: bool,
|
||||
PositionIndependentExecutable: bool,
|
||||
FunctionSections: bool,
|
||||
DataSections: bool) -> TargetMachineRef;
|
||||
pub fn LLVMRustDisposeTargetMachine(T: TargetMachineRef);
|
||||
|
@ -71,6 +71,7 @@ LLVMRustCreateTargetMachine(const char *triple,
|
||||
bool EnableSegmentedStacks,
|
||||
bool UseSoftFloat,
|
||||
bool NoFramePointerElim,
|
||||
bool PositionIndependentExecutable,
|
||||
bool FunctionSections,
|
||||
bool DataSections) {
|
||||
std::string Error;
|
||||
@ -83,6 +84,7 @@ LLVMRustCreateTargetMachine(const char *triple,
|
||||
}
|
||||
|
||||
TargetOptions Options;
|
||||
Options.PositionIndependentExecutable = PositionIndependentExecutable;
|
||||
Options.NoFramePointerElim = NoFramePointerElim;
|
||||
#if LLVM_VERSION_MINOR < 5
|
||||
Options.EnableSegmentedStacks = EnableSegmentedStacks;
|
||||
|
Loading…
Reference in New Issue
Block a user