Skip to content

Commit af31c33

Browse files
committed
linker: Refactor interface for passing arguments to linker
1 parent c3774be commit af31c33

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