Skip to content

Commit e6882ad

Browse files
committed
Auto merge of rust-lang#126832 - petrochenkov:linkarg, r=<try>
linker: Refactor interface for passing arguments to linker Separate arguments into passed to the underlying linker, to cc wrapper, or supported by both. Also avoid allocations in all the argument passing functions. The interfaces would look nicer if not the limitations on returning `&mut Self` in `dyn`-compatible traits, and unnecessary conflicts between `Trait` and `dyn Trait` methods. try-job: test-various
2 parents 7b21c18 + 16eada4 commit e6882ad

File tree

2 files changed

+317
-373
lines changed

2 files changed

+317
-373
lines changed

Diff for: compiler/rustc_codegen_ssa/src/back/link.rs

+36-34
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ use tempfile::Builder as TempFileBuilder;
4545

4646
use itertools::Itertools;
4747
use std::collections::BTreeSet;
48-
use std::ffi::{OsStr, OsString};
48+
use std::ffi::OsString;
4949
use std::fs::{read, File, OpenOptions};
5050
use std::io::{BufWriter, Write};
5151
use std::ops::Deref;
@@ -1306,12 +1306,12 @@ fn link_sanitizer_runtime(
13061306
let filename = format!("rustc{channel}_rt.{name}");
13071307
let path = find_sanitizer_runtime(sess, &filename);
13081308
let rpath = path.to_str().expect("non-utf8 component in path");
1309-
linker.args(&["-Wl,-rpath", "-Xlinker", rpath]);
1309+
linker.cc_args(&["-Wl,-rpath", "-Xlinker", rpath]);
13101310
linker.link_dylib_by_name(&filename, false, true);
13111311
} else if sess.target.is_like_msvc && flavor == LinkerFlavor::Msvc(Lld::No) && name == "asan" {
13121312
// MSVC provides the `/INFERASANLIBS` argument to automatically find the
13131313
// compatible ASAN library.
1314-
linker.arg("/INFERASANLIBS");
1314+
linker.link_arg("/INFERASANLIBS");
13151315
} else {
13161316
let filename = format!("librustc{channel}_rt.{name}.a");
13171317
let path = find_sanitizer_runtime(sess, &filename).join(&filename);
@@ -1888,9 +1888,9 @@ fn add_post_link_objects(
18881888
/// FIXME: Determine where exactly these args need to be inserted.
18891889
fn add_pre_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
18901890
if let Some(args) = sess.target.pre_link_args.get(&flavor) {
1891-
cmd.args(args.iter().map(Deref::deref));
1891+
cmd.verbatim_args(args.iter().map(Deref::deref));
18921892
}
1893-
cmd.args(&sess.opts.unstable_opts.pre_link_args);
1893+
cmd.verbatim_args(&sess.opts.unstable_opts.pre_link_args);
18941894
}
18951895

18961896
/// Add a link script embedded in the target, if applicable.
@@ -1908,8 +1908,7 @@ fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_ty
19081908
sess.dcx().emit_fatal(errors::LinkScriptWriteFailure { path, error });
19091909
}
19101910

1911-
cmd.arg("--script");
1912-
cmd.arg(path);
1911+
cmd.link_arg("--script").link_arg(path);
19131912
}
19141913
_ => {}
19151914
}
@@ -1918,7 +1917,7 @@ fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_ty
19181917
/// Add arbitrary "user defined" args defined from command line.
19191918
/// FIXME: Determine where exactly these args need to be inserted.
19201919
fn add_user_defined_link_args(cmd: &mut dyn Linker, sess: &Session) {
1921-
cmd.args(&sess.opts.cg.link_args);
1920+
cmd.verbatim_args(&sess.opts.cg.link_args);
19221921
}
19231922

19241923
/// Add arbitrary "late link" args defined by the target spec.
@@ -1936,23 +1935,23 @@ fn add_late_link_args(
19361935
});
19371936
if any_dynamic_crate {
19381937
if let Some(args) = sess.target.late_link_args_dynamic.get(&flavor) {
1939-
cmd.args(args.iter().map(Deref::deref));
1938+
cmd.verbatim_args(args.iter().map(Deref::deref));
19401939
}
19411940
} else {
19421941
if let Some(args) = sess.target.late_link_args_static.get(&flavor) {
1943-
cmd.args(args.iter().map(Deref::deref));
1942+
cmd.verbatim_args(args.iter().map(Deref::deref));
19441943
}
19451944
}
19461945
if let Some(args) = sess.target.late_link_args.get(&flavor) {
1947-
cmd.args(args.iter().map(Deref::deref));
1946+
cmd.verbatim_args(args.iter().map(Deref::deref));
19481947
}
19491948
}
19501949

19511950
/// Add arbitrary "post-link" args defined by the target spec.
19521951
/// FIXME: Determine where exactly these args need to be inserted.
19531952
fn add_post_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
19541953
if let Some(args) = sess.target.post_link_args.get(&flavor) {
1955-
cmd.args(args.iter().map(Deref::deref));
1954+
cmd.verbatim_args(args.iter().map(Deref::deref));
19561955
}
19571956
}
19581957

@@ -2119,7 +2118,7 @@ fn add_rpath_args(
21192118
is_like_osx: sess.target.is_like_osx,
21202119
linker_is_gnu: sess.target.linker_flavor.is_gnu(),
21212120
};
2122-
cmd.args(&rpath::get_rpath_flags(&rpath_config));
2121+
cmd.cc_args(&rpath::get_rpath_flags(&rpath_config));
21232122
}
21242123
}
21252124

@@ -2378,7 +2377,7 @@ fn add_order_independent_options(
23782377
} else {
23792378
""
23802379
};
2381-
cmd.arg(format!("--dynamic-linker={prefix}ld.so.1"));
2380+
cmd.link_arg(format!("--dynamic-linker={prefix}ld.so.1"));
23822381
}
23832382

23842383
if sess.target.eh_frame_header {
@@ -2393,31 +2392,29 @@ fn add_order_independent_options(
23932392
}
23942393

23952394
if sess.target.os == "emscripten" {
2396-
cmd.arg("-s");
2397-
cmd.arg(if sess.panic_strategy() == PanicStrategy::Abort {
2395+
cmd.cc_arg("-s").cc_arg(if sess.panic_strategy() == PanicStrategy::Abort {
23982396
"DISABLE_EXCEPTION_CATCHING=1"
23992397
} else {
24002398
"DISABLE_EXCEPTION_CATCHING=0"
24012399
});
24022400
}
24032401

24042402
if flavor == LinkerFlavor::Llbc {
2405-
cmd.arg("--target");
2406-
cmd.arg(sess.target.llvm_target.as_ref());
2407-
cmd.arg("--target-cpu");
2408-
cmd.arg(&codegen_results.crate_info.target_cpu);
2403+
cmd.link_args(&[
2404+
"--target",
2405+
sess.target.llvm_target.as_ref(),
2406+
"--target-cpu",
2407+
&codegen_results.crate_info.target_cpu,
2408+
]);
24092409
} else if flavor == LinkerFlavor::Ptx {
2410-
cmd.arg("--fallback-arch");
2411-
cmd.arg(&codegen_results.crate_info.target_cpu);
2410+
cmd.link_args(&["--fallback-arch", &codegen_results.crate_info.target_cpu]);
24122411
} else if flavor == LinkerFlavor::Bpf {
2413-
cmd.arg("--cpu");
2414-
cmd.arg(&codegen_results.crate_info.target_cpu);
2412+
cmd.link_args(&["--cpu", &codegen_results.crate_info.target_cpu]);
24152413
if let Some(feat) = [sess.opts.cg.target_feature.as_str(), &sess.target.options.features]
24162414
.into_iter()
24172415
.find(|feat| !feat.is_empty())
24182416
{
2419-
cmd.arg("--cpu-features");
2420-
cmd.arg(feat);
2417+
cmd.link_args(&["--cpu-features", feat]);
24212418
}
24222419
}
24232420

@@ -2618,7 +2615,11 @@ fn add_native_libs_from_crate(
26182615
NativeLibKind::WasmImportModule => {}
26192616
NativeLibKind::LinkArg => {
26202617
if link_static {
2621-
cmd.linker_arg(OsStr::new(name), verbatim);
2618+
if verbatim {
2619+
cmd.verbatim_arg(name);
2620+
} else {
2621+
cmd.link_arg(name);
2622+
}
26222623
}
26232624
}
26242625
}
@@ -3012,10 +3013,10 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
30123013
// This is admittedly a bit strange, as on most targets
30133014
// `-isysroot` only applies to include header files, but on Apple
30143015
// targets this also applies to libraries and frameworks.
3015-
cmd.args(&["-isysroot", &sdk_root]);
3016+
cmd.cc_args(&["-isysroot", &sdk_root]);
30163017
}
30173018
LinkerFlavor::Darwin(Cc::No, _) => {
3018-
cmd.args(&["-syslibroot", &sdk_root]);
3019+
cmd.link_args(&["-syslibroot", &sdk_root]);
30193020
}
30203021
_ => unreachable!(),
30213022
}
@@ -3026,8 +3027,9 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
30263027
// search path.
30273028

30283029
// The flags are called `-L` and `-F` both in Clang, ld64 and ldd.
3029-
cmd.arg(format!("-L{sdk_root}/System/iOSSupport/usr/lib"));
3030-
cmd.arg(format!("-F{sdk_root}/System/iOSSupport/System/Library/Frameworks"));
3030+
let sdk_root = Path::new(&sdk_root);
3031+
cmd.include_path(&sdk_root.join("System/iOSSupport/usr/lib"));
3032+
cmd.framework_path(&sdk_root.join("System/iOSSupport/System/Library/Frameworks"));
30313033
}
30323034
}
30333035

@@ -3142,7 +3144,7 @@ fn add_lld_args(
31423144
for path in sess.get_tools_search_paths(false) {
31433145
let linker_path = path.join("gcc-ld");
31443146
linker_path_exists |= linker_path.exists();
3145-
cmd.arg({
3147+
cmd.cc_arg({
31463148
let mut arg = OsString::from("-B");
31473149
arg.push(linker_path);
31483150
arg
@@ -3162,7 +3164,7 @@ fn add_lld_args(
31623164
// is to use LLD but the `wasm32-wasip2` target relies on a wrapper around
31633165
// this, `wasm-component-ld`, which is overridden if this option is passed.
31643166
if !sess.target.is_like_wasm {
3165-
cmd.arg("-fuse-ld=lld");
3167+
cmd.cc_arg("-fuse-ld=lld");
31663168
}
31673169

31683170
if !flavor.is_gnu() {
@@ -3186,7 +3188,7 @@ fn add_lld_args(
31863188
// targeting a different linker flavor on macOS, and that's also always
31873189
// the case when targeting WASM.
31883190
if sess.target.linker_flavor != sess.host.linker_flavor {
3189-
cmd.arg(format!("--target={}", sess.target.llvm_target));
3191+
cmd.cc_arg(format!("--target={}", sess.target.llvm_target));
31903192
}
31913193
}
31923194
}

0 commit comments

Comments
 (0)