auto merge of #9617 : crabtw/rust/softfp, r=alexcrichton

This change adds --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.
This commit is contained in:
bors 2013-09-30 23:51:31 -07:00
commit f6df7ab839
5 changed files with 14 additions and 4 deletions

View File

@ -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)

View File

@ -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
)
}
}

View File

@ -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),
]
}

View File

@ -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,

View File

@ -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,