Skip to content

Commit a981507

Browse files
committed
linker: Refactor interface for passing arguments to linker
1 parent d03d6c0 commit a981507

File tree

2 files changed

+314
-373
lines changed

2 files changed

+314
-373
lines changed

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);
@@ -1891,9 +1891,9 @@ fn add_post_link_objects(
18911891
/// FIXME: Determine where exactly these args need to be inserted.
18921892
fn add_pre_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
18931893
if let Some(args) = sess.target.pre_link_args.get(&flavor) {
1894-
cmd.args(args.iter().map(Deref::deref));
1894+
cmd.verbatim_args(args.iter().map(Deref::deref));
18951895
}
1896-
cmd.args(&sess.opts.unstable_opts.pre_link_args);
1896+
cmd.verbatim_args(&sess.opts.unstable_opts.pre_link_args);
18971897
}
18981898

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

1914-
cmd.arg("--script");
1915-
cmd.arg(path);
1914+
cmd.link_arg("--script").link_arg(path);
19161915
}
19171916
_ => {}
19181917
}
@@ -1921,7 +1920,7 @@ fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_ty
19211920
/// Add arbitrary "user defined" args defined from command line.
19221921
/// FIXME: Determine where exactly these args need to be inserted.
19231922
fn add_user_defined_link_args(cmd: &mut dyn Linker, sess: &Session) {
1924-
cmd.args(&sess.opts.cg.link_args);
1923+
cmd.verbatim_args(&sess.opts.cg.link_args);
19251924
}
19261925

19271926
/// Add arbitrary "late link" args defined by the target spec.
@@ -1939,23 +1938,23 @@ fn add_late_link_args(
19391938
});
19401939
if any_dynamic_crate {
19411940
if let Some(args) = sess.target.late_link_args_dynamic.get(&flavor) {
1942-
cmd.args(args.iter().map(Deref::deref));
1941+
cmd.verbatim_args(args.iter().map(Deref::deref));
19431942
}
19441943
} else {
19451944
if let Some(args) = sess.target.late_link_args_static.get(&flavor) {
1946-
cmd.args(args.iter().map(Deref::deref));
1945+
cmd.verbatim_args(args.iter().map(Deref::deref));
19471946
}
19481947
}
19491948
if let Some(args) = sess.target.late_link_args.get(&flavor) {
1950-
cmd.args(args.iter().map(Deref::deref));
1949+
cmd.verbatim_args(args.iter().map(Deref::deref));
19511950
}
19521951
}
19531952

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

@@ -2122,7 +2121,7 @@ fn add_rpath_args(
21222121
is_like_osx: sess.target.is_like_osx,
21232122
linker_is_gnu: sess.target.linker_flavor.is_gnu(),
21242123
};
2125-
cmd.args(&rpath::get_rpath_flags(&rpath_config));
2124+
cmd.cc_args(&rpath::get_rpath_flags(&rpath_config));
21262125
}
21272126
}
21282127

@@ -2381,7 +2380,7 @@ fn add_order_independent_options(
23812380
} else {
23822381
""
23832382
};
2384-
cmd.arg(format!("--dynamic-linker={prefix}ld.so.1"));
2383+
cmd.link_arg(format!("--dynamic-linker={prefix}ld.so.1"));
23852384
}
23862385

23872386
if sess.target.eh_frame_header {
@@ -2396,31 +2395,29 @@ fn add_order_independent_options(
23962395
}
23972396

23982397
if sess.target.os == "emscripten" {
2399-
cmd.arg("-s");
2400-
cmd.arg(if sess.panic_strategy() == PanicStrategy::Abort {
2398+
cmd.cc_arg("-s").cc_arg(if sess.panic_strategy() == PanicStrategy::Abort {
24012399
"DISABLE_EXCEPTION_CATCHING=1"
24022400
} else {
24032401
"DISABLE_EXCEPTION_CATCHING=0"
24042402
});
24052403
}
24062404

24072405
if flavor == LinkerFlavor::Llbc {
2408-
cmd.arg("--target");
2409-
cmd.arg(sess.target.llvm_target.as_ref());
2410-
cmd.arg("--target-cpu");
2411-
cmd.arg(&codegen_results.crate_info.target_cpu);
2406+
cmd.link_args(&[
2407+
"--target",
2408+
sess.target.llvm_target.as_ref(),
2409+
"--target-cpu",
2410+
&codegen_results.crate_info.target_cpu,
2411+
]);
24122412
} else if flavor == LinkerFlavor::Ptx {
2413-
cmd.arg("--fallback-arch");
2414-
cmd.arg(&codegen_results.crate_info.target_cpu);
2413+
cmd.link_args(&["--fallback-arch", &codegen_results.crate_info.target_cpu]);
24152414
} else if flavor == LinkerFlavor::Bpf {
2416-
cmd.arg("--cpu");
2417-
cmd.arg(&codegen_results.crate_info.target_cpu);
2415+
cmd.link_args(&["--cpu", &codegen_results.crate_info.target_cpu]);
24182416
if let Some(feat) = [sess.opts.cg.target_feature.as_str(), &sess.target.options.features]
24192417
.into_iter()
24202418
.find(|feat| !feat.is_empty())
24212419
{
2422-
cmd.arg("--cpu-features");
2423-
cmd.arg(feat);
2420+
cmd.link_args(&["--cpu-features", feat]);
24242421
}
24252422
}
24262423

@@ -2621,7 +2618,11 @@ fn add_native_libs_from_crate(
26212618
NativeLibKind::WasmImportModule => {}
26222619
NativeLibKind::LinkArg => {
26232620
if link_static {
2624-
cmd.linker_arg(OsStr::new(name), verbatim);
2621+
if verbatim {
2622+
cmd.verbatim_arg(name);
2623+
} else {
2624+
cmd.link_arg(name);
2625+
}
26252626
}
26262627
}
26272628
}
@@ -3015,10 +3016,10 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
30153016
// This is admittedly a bit strange, as on most targets
30163017
// `-isysroot` only applies to include header files, but on Apple
30173018
// targets this also applies to libraries and frameworks.
3018-
cmd.args(&["-isysroot", &sdk_root]);
3019+
cmd.cc_args(&["-isysroot", &sdk_root]);
30193020
}
30203021
LinkerFlavor::Darwin(Cc::No, _) => {
3021-
cmd.args(&["-syslibroot", &sdk_root]);
3022+
cmd.link_args(&["-syslibroot", &sdk_root]);
30223023
}
30233024
_ => unreachable!(),
30243025
}
@@ -3029,8 +3030,9 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
30293030
// search path.
30303031

30313032
// The flags are called `-L` and `-F` both in Clang, ld64 and ldd.
3032-
cmd.arg(format!("-L{sdk_root}/System/iOSSupport/usr/lib"));
3033-
cmd.arg(format!("-F{sdk_root}/System/iOSSupport/System/Library/Frameworks"));
3033+
let sdk_root = Path::new(&sdk_root);
3034+
cmd.include_path(&sdk_root.join("System/iOSSupport/usr/lib"));
3035+
cmd.framework_path(&sdk_root.join("System/iOSSupport/System/Library/Frameworks"));
30343036
}
30353037
}
30363038

@@ -3145,7 +3147,7 @@ fn add_lld_args(
31453147
for path in sess.get_tools_search_paths(false) {
31463148
let linker_path = path.join("gcc-ld");
31473149
linker_path_exists |= linker_path.exists();
3148-
cmd.arg({
3150+
cmd.cc_arg({
31493151
let mut arg = OsString::from("-B");
31503152
arg.push(linker_path);
31513153
arg
@@ -3165,7 +3167,7 @@ fn add_lld_args(
31653167
// is to use LLD but the `wasm32-wasip2` target relies on a wrapper around
31663168
// this, `wasm-component-ld`, which is overridden if this option is passed.
31673169
if !sess.target.is_like_wasm {
3168-
cmd.arg("-fuse-ld=lld");
3170+
cmd.cc_arg("-fuse-ld=lld");
31693171
}
31703172

31713173
if !flavor.is_gnu() {
@@ -3189,7 +3191,7 @@ fn add_lld_args(
31893191
// targeting a different linker flavor on macOS, and that's also always
31903192
// the case when targeting WASM.
31913193
if sess.target.linker_flavor != sess.host.linker_flavor {
3192-
cmd.arg(format!("--target={}", sess.target.llvm_target));
3194+
cmd.cc_arg(format!("--target={}", sess.target.llvm_target));
31933195
}
31943196
}
31953197
}

0 commit comments

Comments
 (0)