1
Fork 0

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:
kulst 2025-02-05 21:33:58 +01:00
parent 2445dd794e
commit 831d9f39e9
3 changed files with 23 additions and 2 deletions

View file

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

View file

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

View file

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