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:
commit
f6df7ab839
|
@ -343,7 +343,7 @@ CFG_PATH_MUNGE_mips-unknown-linux-gnu := true
|
||||||
CFG_LDPATH_mips-unknown-linux-gnu :=
|
CFG_LDPATH_mips-unknown-linux-gnu :=
|
||||||
CFG_RUN_mips-unknown-linux-gnu=
|
CFG_RUN_mips-unknown-linux-gnu=
|
||||||
CFG_RUN_TARG_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
|
# i686-pc-mingw32 configuration
|
||||||
CC_i686-pc-mingw32=$(CC)
|
CC_i686-pc-mingw32=$(CC)
|
||||||
|
|
|
@ -264,6 +264,7 @@ pub mod write {
|
||||||
session::Default => lib::llvm::CodeGenLevelDefault,
|
session::Default => lib::llvm::CodeGenLevelDefault,
|
||||||
session::Aggressive => lib::llvm::CodeGenLevelAggressive,
|
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| {
|
let tm = do sess.targ_cfg.target_strs.target_triple.with_c_str |T| {
|
||||||
do sess.opts.target_cpu.with_c_str |CPU| {
|
do sess.opts.target_cpu.with_c_str |CPU| {
|
||||||
|
@ -273,7 +274,8 @@ pub mod write {
|
||||||
lib::llvm::CodeModelDefault,
|
lib::llvm::CodeModelDefault,
|
||||||
lib::llvm::RelocPIC,
|
lib::llvm::RelocPIC,
|
||||||
OptLevel,
|
OptLevel,
|
||||||
true
|
true,
|
||||||
|
use_softfp
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,6 +80,7 @@ pub static print_llvm_passes: uint = 1 << 26;
|
||||||
pub static no_vectorize_loops: uint = 1 << 27;
|
pub static no_vectorize_loops: uint = 1 << 27;
|
||||||
pub static no_vectorize_slp: uint = 1 << 28;
|
pub static no_vectorize_slp: uint = 1 << 28;
|
||||||
pub static no_prepopulate_passes: uint = 1 << 29;
|
pub static no_prepopulate_passes: uint = 1 << 29;
|
||||||
|
pub static use_softfp: uint = 1 << 30;
|
||||||
|
|
||||||
pub fn debugging_opts_map() -> ~[(~str, ~str, uint)] {
|
pub fn debugging_opts_map() -> ~[(~str, ~str, uint)] {
|
||||||
~[(~"verbose", ~"in general, enable more debug printouts", verbose),
|
~[(~"verbose", ~"in general, enable more debug printouts", verbose),
|
||||||
|
@ -135,6 +136,7 @@ pub fn debugging_opts_map() -> ~[(~str, ~str, uint)] {
|
||||||
(~"no-vectorize-slp",
|
(~"no-vectorize-slp",
|
||||||
~"Don't run LLVM's SLP vectorization passes",
|
~"Don't run LLVM's SLP vectorization passes",
|
||||||
no_vectorize_slp),
|
no_vectorize_slp),
|
||||||
|
(~"soft-float", ~"Generate software floating point library calls", use_softfp),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2149,7 +2149,8 @@ pub mod llvm {
|
||||||
Model: CodeGenModel,
|
Model: CodeGenModel,
|
||||||
Reloc: RelocMode,
|
Reloc: RelocMode,
|
||||||
Level: CodeGenOptLevel,
|
Level: CodeGenOptLevel,
|
||||||
EnableSegstk: bool) -> TargetMachineRef;
|
EnableSegstk: bool,
|
||||||
|
UseSoftFP: bool) -> TargetMachineRef;
|
||||||
pub fn LLVMRustDisposeTargetMachine(T: TargetMachineRef);
|
pub fn LLVMRustDisposeTargetMachine(T: TargetMachineRef);
|
||||||
pub fn LLVMRustAddAnalysisPasses(T: TargetMachineRef,
|
pub fn LLVMRustAddAnalysisPasses(T: TargetMachineRef,
|
||||||
PM: PassManagerRef,
|
PM: PassManagerRef,
|
||||||
|
|
|
@ -67,7 +67,8 @@ LLVMRustCreateTargetMachine(const char *triple,
|
||||||
CodeModel::Model CM,
|
CodeModel::Model CM,
|
||||||
Reloc::Model RM,
|
Reloc::Model RM,
|
||||||
CodeGenOpt::Level OptLevel,
|
CodeGenOpt::Level OptLevel,
|
||||||
bool EnableSegmentedStacks) {
|
bool EnableSegmentedStacks,
|
||||||
|
bool UseSoftFloat) {
|
||||||
std::string Error;
|
std::string Error;
|
||||||
Triple Trip(Triple::normalize(triple));
|
Triple Trip(Triple::normalize(triple));
|
||||||
const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Trip.getTriple(),
|
const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Trip.getTriple(),
|
||||||
|
@ -84,6 +85,10 @@ LLVMRustCreateTargetMachine(const char *triple,
|
||||||
Options.FloatABIType =
|
Options.FloatABIType =
|
||||||
(Trip.getEnvironment() == Triple::GNUEABIHF) ? FloatABI::Hard :
|
(Trip.getEnvironment() == Triple::GNUEABIHF) ? FloatABI::Hard :
|
||||||
FloatABI::Default;
|
FloatABI::Default;
|
||||||
|
Options.UseSoftFloat = UseSoftFloat;
|
||||||
|
if (UseSoftFloat) {
|
||||||
|
Options.FloatABIType = FloatABI::Soft;
|
||||||
|
}
|
||||||
|
|
||||||
TargetMachine *TM = TheTarget->createTargetMachine(Trip.getTriple(),
|
TargetMachine *TM = TheTarget->createTargetMachine(Trip.getTriple(),
|
||||||
cpu,
|
cpu,
|
||||||
|
|
Loading…
Reference in New Issue