1
Fork 0

auto merge of #5996 : sanxiyn/rust/target-feature, r=graydon

Fix #1879.
This commit is contained in:
bors 2013-04-22 17:36:49 -07:00
commit 773f7e7560
5 changed files with 64 additions and 59 deletions

View file

@ -61,17 +61,23 @@ pub fn llvm_err(sess: Session, msg: ~str) -> ! {
pub fn WriteOutputFile(sess: Session,
PM: lib::llvm::PassManagerRef, M: ModuleRef,
Triple: *c_char,
Triple: &str,
Feature: &str,
Output: &str,
// FIXME: When #2334 is fixed, change
// c_uint to FileType
Output: *c_char, FileType: c_uint,
FileType: c_uint,
OptLevel: c_int,
EnableSegmentedStacks: bool) {
unsafe {
do str::as_c_str(Triple) |Triple| {
do str::as_c_str(Feature) |Feature| {
do str::as_c_str(Output) |Output| {
let result = llvm::LLVMRustWriteOutputFile(
PM,
M,
Triple,
Feature,
Output,
FileType,
OptLevel,
@ -81,6 +87,9 @@ pub fn WriteOutputFile(sess: Session,
}
}
}
}
}
}
pub mod jit {
use back::link::llvm_err;
@ -310,66 +319,49 @@ pub mod write {
llvm::LLVMWriteBitcodeToFile(llmod, buf)
});
pm = mk_pass_manager();
// Save the assembly file if -S is used
// Save the assembly file if -S is used
if output_type == output_type_assembly {
let _: () = str::as_c_str(
sess.targ_cfg.target_strs.target_triple,
|buf_t| {
str::as_c_str(output.to_str(), |buf_o| {
WriteOutputFile(
sess,
pm.llpm,
llmod,
buf_t,
buf_o,
sess.targ_cfg.target_strs.target_triple,
opts.target_feature,
output.to_str(),
lib::llvm::AssemblyFile as c_uint,
CodeGenOptLevel,
true)
})
});
true);
}
// Save the object file for -c or --save-temps alone
// This .o is needed when an exe is built
if output_type == output_type_object ||
output_type == output_type_exe {
let _: () = str::as_c_str(
sess.targ_cfg.target_strs.target_triple,
|buf_t| {
str::as_c_str(output.to_str(), |buf_o| {
WriteOutputFile(
sess,
pm.llpm,
llmod,
buf_t,
buf_o,
sess.targ_cfg.target_strs.target_triple,
opts.target_feature,
output.to_str(),
lib::llvm::ObjectFile as c_uint,
CodeGenOptLevel,
true)
})
});
true);
}
} else {
// If we aren't saving temps then just output the file
// type corresponding to the '-c' or '-S' flag used
let _: () = str::as_c_str(
sess.targ_cfg.target_strs.target_triple,
|buf_t| {
str::as_c_str(output.to_str(), |buf_o| {
WriteOutputFile(
sess,
pm.llpm,
llmod,
buf_t,
buf_o,
sess.targ_cfg.target_strs.target_triple,
opts.target_feature,
output.to_str(),
FileType as c_uint,
CodeGenOptLevel,
true)
})
});
true);
}
// Clean up and return

View file

@ -599,6 +599,7 @@ pub fn build_session_options(binary: @~str,
let sysroot_opt = getopts::opt_maybe_str(matches, ~"sysroot");
let sysroot_opt = sysroot_opt.map(|m| Path(*m));
let target_opt = getopts::opt_maybe_str(matches, ~"target");
let target_feature_opt = getopts::opt_maybe_str(matches, ~"target-feature");
let save_temps = getopts::opt_present(matches, ~"save-temps");
match output_type {
// unless we're emitting huamn-readable assembly, omit comments.
@ -637,6 +638,10 @@ pub fn build_session_options(binary: @~str,
None => host_triple(),
Some(s) => s
};
let target_feature = match target_feature_opt {
None => ~"",
Some(s) => s
};
let addl_lib_search_paths =
getopts::opt_strs(matches, ~"L")
@ -659,6 +664,7 @@ pub fn build_session_options(binary: @~str,
addl_lib_search_paths: addl_lib_search_paths,
maybe_sysroot: sysroot_opt,
target_triple: target,
target_feature: target_feature,
cfg: cfg,
binary: binary,
test: test,
@ -769,6 +775,9 @@ pub fn optgroups() -> ~[getopts::groups::OptGroup] {
~"Target triple cpu-manufacturer-kernel[-os]
to compile for (see chapter 3.4 of http://www.sourceware.org/autobook/
for detail)", ~"TRIPLE"),
optopt(~"", ~"target-feature",
~"Target specific attributes (llc -mattr=help
for detail)", ~"FEATURE"),
optopt(~"", ~"android-cross-path",
~"The path to the Android NDK", "PATH"),
optmulti(~"W", ~"warn",

View file

@ -126,6 +126,7 @@ pub struct options {
addl_lib_search_paths: ~[Path],
maybe_sysroot: Option<Path>,
target_triple: ~str,
target_feature: ~str,
// User-specified cfg meta items. The compiler itself will add additional
// items to the crate config, and during parsing the entire crate config
// will be added to the crate AST node. This should not be used for
@ -302,6 +303,7 @@ pub fn basic_options() -> @options {
addl_lib_search_paths: ~[],
maybe_sysroot: None,
target_triple: host_triple(),
target_feature: ~"",
cfg: ~[],
binary: @~"rustc",
test: false,

View file

@ -1799,9 +1799,10 @@ pub mod llvm {
pub unsafe fn LLVMRustWriteOutputFile(PM: PassManagerRef,
M: ModuleRef,
Triple: *c_char,
Feature: *c_char,
Output: *c_char,
// FIXME: When #2334 is fixed,
// change c_uint to FileType
Output: *c_char,
FileType: c_uint,
OptLevel: c_int,
EnableSegmentedStacks: bool)

View file

@ -434,6 +434,7 @@ extern "C" bool
LLVMRustWriteOutputFile(LLVMPassManagerRef PMR,
LLVMModuleRef M,
const char *triple,
const char *feature,
const char *path,
TargetMachine::CodeGenFileType FileType,
CodeGenOpt::Level OptLevel,
@ -461,7 +462,7 @@ LLVMRustWriteOutputFile(LLVMPassManagerRef PMR,
std::string Err;
std::string Trip(Triple::normalize(triple));
std::string FeaturesStr;
std::string FeaturesStr(feature);
std::string CPUStr("generic");
const Target *TheTarget = TargetRegistry::lookupTarget(Trip, Err);
TargetMachine *Target =