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 2956c6cd251e6..b3d38fc074a31 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 ee7fbed9e9f11..dfa7a2a7a1000 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 19e866c70a3fe..aa321a11548b9 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 49798288d40d0..8e77f98eeba12 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 615c2cc61cbee..8d0b447fa4a1e 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,