diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2014-08-09 12:43:45 -0400 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2014-10-12 09:18:14 -0400 |
| commit | 4deb4bcba590e707e23670d8b40bc5520c5ab7fe (patch) | |
| tree | b526b8d7a52e985301ee3a96e7aaf95b01453c1a | |
| parent | 86509d8d7ab68c5e4202dea9ff1bfb79409f2f8d (diff) | |
| download | rust-4deb4bcba590e707e23670d8b40bc5520c5ab7fe.tar.gz rust-4deb4bcba590e707e23670d8b40bc5520c5ab7fe.zip | |
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.
| -rw-r--r-- | src/librustc/back/write.rs | 7 | ||||
| -rw-r--r-- | src/librustc_llvm/lib.rs | 2 | ||||
| -rw-r--r-- | src/rustllvm/PassWrapper.cpp | 2 |
3 files changed, 9 insertions, 2 deletions
diff --git a/src/librustc/back/write.rs b/src/librustc/back/write.rs index 603f5ed227c..f1cd8b52e5e 100644 --- a/src/librustc/back/write.rs +++ b/src/librustc/back/write.rs @@ -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, ) diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index e1576e37cc6..a1a6412af11 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -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); diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index eb074001d58..ce3090390db 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -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; |
