From 350b5438cd0b2a9ed33c0cdb1b36d7e4cbe1ab2b Mon Sep 17 00:00:00 2001 From: Jyun-Yan You Date: Mon, 30 Sep 2013 13:20:52 +0800 Subject: [PATCH] add -Z soft-float option This change adds -Z soft-float option for generating software floating point library calls. It also implies using soft float ABI, that is the same as llc. It is useful for targets that have no FPU. --- mk/platform.mk | 2 +- src/librustc/back/link.rs | 4 +++- src/librustc/driver/session.rs | 2 ++ src/librustc/lib/llvm.rs | 3 ++- src/rustllvm/PassWrapper.cpp | 7 ++++++- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/mk/platform.mk b/mk/platform.mk index 2956c6cd251..b3d38fc074a 100644 --- a/mk/platform.mk +++ b/mk/platform.mk @@ -343,7 +343,7 @@ CFG_PATH_MUNGE_mips-unknown-linux-gnu := true CFG_LDPATH_mips-unknown-linux-gnu := CFG_RUN_mips-unknown-linux-gnu= CFG_RUN_TARG_mips-unknown-linux-gnu= -RUSTC_FLAGS_mips-unknown-linux-gnu := --linker=$(CXX_mips-unknown-linux-gnu) --target-cpu mips32r2 --target-feature +mips32r2,+o32 +RUSTC_FLAGS_mips-unknown-linux-gnu := --linker=$(CXX_mips-unknown-linux-gnu) --target-cpu mips32r2 --target-feature +mips32r2,+o32 -Z soft-float # i686-pc-mingw32 configuration CC_i686-pc-mingw32=$(CC) diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index ee7fbed9e9f..dfa7a2a7a10 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -264,6 +264,7 @@ pub mod write { session::Default => lib::llvm::CodeGenLevelDefault, session::Aggressive => lib::llvm::CodeGenLevelAggressive, }; + let use_softfp = sess.opts.debugging_opts & session::use_softfp != 0; let tm = do sess.targ_cfg.target_strs.target_triple.with_c_str |T| { do sess.opts.target_cpu.with_c_str |CPU| { @@ -273,7 +274,8 @@ pub mod write { lib::llvm::CodeModelDefault, lib::llvm::RelocPIC, OptLevel, - true + true, + use_softfp ) } } diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs index 19e866c70a3..aa321a11548 100644 --- a/src/librustc/driver/session.rs +++ b/src/librustc/driver/session.rs @@ -80,6 +80,7 @@ pub static print_llvm_passes: uint = 1 << 26; pub static no_vectorize_loops: uint = 1 << 27; pub static no_vectorize_slp: uint = 1 << 28; pub static no_prepopulate_passes: uint = 1 << 29; +pub static use_softfp: uint = 1 << 30; pub fn debugging_opts_map() -> ~[(~str, ~str, uint)] { ~[(~"verbose", ~"in general, enable more debug printouts", verbose), @@ -135,6 +136,7 @@ pub fn debugging_opts_map() -> ~[(~str, ~str, uint)] { (~"no-vectorize-slp", ~"Don't run LLVM's SLP vectorization passes", no_vectorize_slp), + (~"soft-float", ~"Generate software floating point library calls", use_softfp), ] } diff --git a/src/librustc/lib/llvm.rs b/src/librustc/lib/llvm.rs index 49798288d40..8e77f98eeba 100644 --- a/src/librustc/lib/llvm.rs +++ b/src/librustc/lib/llvm.rs @@ -2149,7 +2149,8 @@ pub mod llvm { Model: CodeGenModel, Reloc: RelocMode, Level: CodeGenOptLevel, - EnableSegstk: bool) -> TargetMachineRef; + EnableSegstk: bool, + UseSoftFP: bool) -> TargetMachineRef; pub fn LLVMRustDisposeTargetMachine(T: TargetMachineRef); pub fn LLVMRustAddAnalysisPasses(T: TargetMachineRef, PM: PassManagerRef, diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 615c2cc61cb..8d0b447fa4a 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -67,7 +67,8 @@ LLVMRustCreateTargetMachine(const char *triple, CodeModel::Model CM, Reloc::Model RM, CodeGenOpt::Level OptLevel, - bool EnableSegmentedStacks) { + bool EnableSegmentedStacks, + bool UseSoftFloat) { std::string Error; Triple Trip(Triple::normalize(triple)); const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Trip.getTriple(), @@ -84,6 +85,10 @@ LLVMRustCreateTargetMachine(const char *triple, Options.FloatABIType = (Trip.getEnvironment() == Triple::GNUEABIHF) ? FloatABI::Hard : FloatABI::Default; + Options.UseSoftFloat = UseSoftFloat; + if (UseSoftFloat) { + Options.FloatABIType = FloatABI::Soft; + } TargetMachine *TM = TheTarget->createTargetMachine(Trip.getTriple(), cpu,