Pass through of target features to llvm-bitcode-linker and handling them
The .ptx version produced by llc can be specified by passing it with --mattr. Currently it is not possible to specify the .ptx version with -Ctarget-feature because these are not passed through to llvm-bitcode-linker and handled by it. This commit adds both. --target-feature and -mattr are passed with equals to mitigate issues when the value starts with a - (minus).
This commit is contained in:
parent
2445dd794e
commit
831d9f39e9
3 changed files with 23 additions and 2 deletions
|
@ -2518,6 +2518,12 @@ fn add_order_independent_options(
|
||||||
"--target-cpu",
|
"--target-cpu",
|
||||||
&codegen_results.crate_info.target_cpu,
|
&codegen_results.crate_info.target_cpu,
|
||||||
]);
|
]);
|
||||||
|
if codegen_results.crate_info.target_features.len() > 0 {
|
||||||
|
cmd.link_arg(&format!(
|
||||||
|
"--target-feature={}",
|
||||||
|
&codegen_results.crate_info.target_features.join(",")
|
||||||
|
));
|
||||||
|
}
|
||||||
} else if flavor == LinkerFlavor::Ptx {
|
} else if flavor == LinkerFlavor::Ptx {
|
||||||
cmd.link_args(&["--fallback-arch", &codegen_results.crate_info.target_cpu]);
|
cmd.link_args(&["--fallback-arch", &codegen_results.crate_info.target_cpu]);
|
||||||
} else if flavor == LinkerFlavor::Bpf {
|
} else if flavor == LinkerFlavor::Bpf {
|
||||||
|
|
|
@ -27,6 +27,10 @@ pub struct Args {
|
||||||
#[arg(long)]
|
#[arg(long)]
|
||||||
target_cpu: Option<String>,
|
target_cpu: Option<String>,
|
||||||
|
|
||||||
|
/// The target features
|
||||||
|
#[arg(long)]
|
||||||
|
target_feature: Option<String>,
|
||||||
|
|
||||||
/// Write output to the filename
|
/// Write output to the filename
|
||||||
#[arg(short, long)]
|
#[arg(short, long)]
|
||||||
output: PathBuf,
|
output: PathBuf,
|
||||||
|
@ -49,7 +53,7 @@ fn main() -> anyhow::Result<()> {
|
||||||
|
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
|
|
||||||
let mut linker = Session::new(args.target, args.target_cpu, args.output);
|
let mut linker = Session::new(args.target, args.target_cpu, args.target_feature, args.output);
|
||||||
|
|
||||||
linker.add_exported_symbols(args.export_symbol);
|
linker.add_exported_symbols(args.export_symbol);
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ use crate::{Optimization, Target};
|
||||||
pub struct Session {
|
pub struct Session {
|
||||||
target: Target,
|
target: Target,
|
||||||
cpu: Option<String>,
|
cpu: Option<String>,
|
||||||
|
feature: Option<String>,
|
||||||
symbols: Vec<String>,
|
symbols: Vec<String>,
|
||||||
|
|
||||||
/// A file that `llvm-link` supports, like a bitcode file or an archive.
|
/// A file that `llvm-link` supports, like a bitcode file or an archive.
|
||||||
|
@ -21,7 +22,12 @@ pub struct Session {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Session {
|
impl Session {
|
||||||
pub fn new(target: crate::Target, cpu: Option<String>, out_path: PathBuf) -> Self {
|
pub fn new(
|
||||||
|
target: crate::Target,
|
||||||
|
cpu: Option<String>,
|
||||||
|
feature: Option<String>,
|
||||||
|
out_path: PathBuf,
|
||||||
|
) -> Self {
|
||||||
let link_path = out_path.with_extension("o");
|
let link_path = out_path.with_extension("o");
|
||||||
let opt_path = out_path.with_extension("optimized.o");
|
let opt_path = out_path.with_extension("optimized.o");
|
||||||
let sym_path = out_path.with_extension("symbols.txt");
|
let sym_path = out_path.with_extension("symbols.txt");
|
||||||
|
@ -29,6 +35,7 @@ impl Session {
|
||||||
Session {
|
Session {
|
||||||
target,
|
target,
|
||||||
cpu,
|
cpu,
|
||||||
|
feature,
|
||||||
symbols: Vec::new(),
|
symbols: Vec::new(),
|
||||||
files: Vec::new(),
|
files: Vec::new(),
|
||||||
link_path,
|
link_path,
|
||||||
|
@ -134,6 +141,10 @@ impl Session {
|
||||||
lcc_command.arg("--mcpu").arg(mcpu);
|
lcc_command.arg("--mcpu").arg(mcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(mattr) = &self.feature {
|
||||||
|
lcc_command.arg(&format!("--mattr={}", mattr));
|
||||||
|
}
|
||||||
|
|
||||||
let lcc_output = lcc_command
|
let lcc_output = lcc_command
|
||||||
.arg(&self.opt_path)
|
.arg(&self.opt_path)
|
||||||
.arg("-o").arg(&self.out_path)
|
.arg("-o").arg(&self.out_path)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue