optimize position independent code in executables
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:
parent
86509d8d7a
commit
4deb4bcba5
3 changed files with 9 additions and 2 deletions
|
@ -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 a new issue