Skip to content

Commit d9f9e67

Browse files
committed
Refactor rust(do)c linker flags
1 parent b3c9ffd commit d9f9e67

File tree

4 files changed

+51
-65
lines changed

4 files changed

+51
-65
lines changed

src/bootstrap/src/core/build_steps/test.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ use crate::utils;
2929
use crate::utils::cache::{Interned, INTERNER};
3030
use crate::utils::exec::BootstrapCommand;
3131
use crate::utils::helpers::{
32-
self, add_link_lib_path, add_rustdoc_cargo_lld_flags, add_rustdoc_lld_flags, dylib_path,
33-
dylib_path_var, output, t, target_supports_cranelift_backend, up_to_date, LldThreads,
32+
self, add_link_lib_path, add_rustdoc_cargo_linker_args, dylib_path, dylib_path_var,
33+
linker_args, output, t, target_supports_cranelift_backend, up_to_date, LldThreads,
3434
};
3535
use crate::utils::render_tests::{add_flags_and_try_run_tests, try_run_tests};
3636
use crate::{envify, CLang, DocTests, GitRepo, Mode};
@@ -277,7 +277,7 @@ impl Step for Cargotest {
277277
.args(builder.config.test_args())
278278
.env("RUSTC", builder.rustc(compiler))
279279
.env("RUSTDOC", builder.rustdoc(compiler));
280-
add_rustdoc_cargo_lld_flags(&mut cmd, builder, compiler.host, LldThreads::No);
280+
add_rustdoc_cargo_linker_args(&mut cmd, builder, compiler.host, LldThreads::No);
281281
builder.run_delaying_failure(cmd);
282282
}
283283
}
@@ -863,7 +863,7 @@ impl Step for RustdocTheme {
863863
.env("CFG_RELEASE_CHANNEL", &builder.config.channel)
864864
.env("RUSTDOC_REAL", builder.rustdoc(self.compiler))
865865
.env("RUSTC_BOOTSTRAP", "1");
866-
add_rustdoc_lld_flags(&mut cmd, builder, self.compiler.host, LldThreads::No);
866+
cmd.args(linker_args(builder, self.compiler.host, LldThreads::No));
867867

868868
builder.run_delaying_failure(&mut cmd);
869869
}
@@ -1039,7 +1039,7 @@ impl Step for RustdocGUI {
10391039
cmd.env("RUSTDOC", builder.rustdoc(self.compiler))
10401040
.env("RUSTC", builder.rustc(self.compiler));
10411041

1042-
add_rustdoc_cargo_lld_flags(&mut cmd, builder, self.compiler.host, LldThreads::No);
1042+
add_rustdoc_cargo_linker_args(&mut cmd, builder, self.compiler.host, LldThreads::No);
10431043

10441044
for path in &builder.paths {
10451045
if let Some(p) = helpers::is_valid_test_suite_arg(path, "tests/rustdoc-gui", builder) {
@@ -1746,14 +1746,14 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
17461746

17471747
let mut hostflags = flags.clone();
17481748
hostflags.push(format!("-Lnative={}", builder.test_helpers_out(compiler.host).display()));
1749-
hostflags.extend(builder.lld_flags(compiler.host));
1749+
hostflags.extend(linker_args(builder, compiler.host, LldThreads::No));
17501750
for flag in hostflags {
17511751
cmd.arg("--host-rustcflags").arg(flag);
17521752
}
17531753

17541754
let mut targetflags = flags;
17551755
targetflags.push(format!("-Lnative={}", builder.test_helpers_out(target).display()));
1756-
targetflags.extend(builder.lld_flags(target));
1756+
targetflags.extend(linker_args(builder, compiler.host, LldThreads::No));
17571757
for flag in targetflags {
17581758
cmd.arg("--target-rustcflags").arg(flag);
17591759
}

src/bootstrap/src/core/builder.rs

+13-12
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ use crate::core::build_steps::{check, clean, compile, dist, doc, install, run, s
1919
use crate::core::config::flags::{Color, Subcommand};
2020
use crate::core::config::{DryRun, SplitDebuginfo, TargetSelection};
2121
use crate::utils::cache::{Cache, Interned, INTERNER};
22-
use crate::utils::helpers::{self, add_dylib_path, add_link_lib_path, add_rustdoc_lld_flags, exe};
22+
use crate::utils::helpers::{
23+
self, add_dylib_path, add_link_lib_path, exe, linker_args, linker_flags,
24+
};
2325
use crate::utils::helpers::{libdir, output, t, LldThreads};
2426
use crate::Crate;
2527
use crate::EXTRA_CHECK_CFGS;
@@ -1174,7 +1176,7 @@ impl<'a> Builder<'a> {
11741176
cmd.env_remove("MAKEFLAGS");
11751177
cmd.env_remove("MFLAGS");
11761178

1177-
add_rustdoc_lld_flags(&mut cmd, self, compiler.host, LldThreads::Yes);
1179+
cmd.args(linker_args(self, compiler.host, LldThreads::Yes));
11781180
cmd
11791181
}
11801182

@@ -1673,21 +1675,20 @@ impl<'a> Builder<'a> {
16731675
rustflags.arg(&format!("-Zstack-protector={stack_protector}"));
16741676
}
16751677

1676-
if let Some(host_linker) = self.linker(compiler.host) {
1677-
hostflags.arg(format!("-Clinker={}", host_linker.display()));
1678-
}
1679-
if self.is_fuse_ld_lld(compiler.host) {
1680-
hostflags.arg("-Clink-args=-fuse-ld=lld");
1681-
}
1678+
linker_args(self, compiler.host, LldThreads::Yes).into_iter().for_each(|flag| {
1679+
hostflags.arg(flag);
1680+
});
16821681

16831682
if let Some(target_linker) = self.linker(target) {
16841683
let target = crate::envify(&target.triple);
16851684
cargo.env(&format!("CARGO_TARGET_{target}_LINKER"), target_linker);
16861685
}
1687-
if self.is_fuse_ld_lld(target) {
1688-
rustflags.arg("-Clink-args=-fuse-ld=lld");
1689-
}
1690-
self.lld_flags(target).for_each(|flag| {
1686+
// We want to set -Clinker using Cargo, therefore we only call `linker_flags` and not
1687+
// `linker_args` here.
1688+
linker_flags(self, target, LldThreads::Yes).into_iter().for_each(|flag| {
1689+
rustflags.arg(&flag);
1690+
});
1691+
linker_args(self, target, LldThreads::Yes).into_iter().for_each(|flag| {
16911692
rustdocflags.arg(&flag);
16921693
});
16931694

src/bootstrap/src/lib.rs

-15
Original file line numberDiff line numberDiff line change
@@ -1271,21 +1271,6 @@ impl Build {
12711271
self.config.use_lld && !target.is_msvc()
12721272
}
12731273

1274-
fn lld_flags(&self, target: TargetSelection) -> impl Iterator<Item = String> {
1275-
let mut options = [None, None];
1276-
1277-
if self.config.use_lld {
1278-
if self.is_fuse_ld_lld(target) {
1279-
options[0] = Some("-Clink-arg=-fuse-ld=lld".to_string());
1280-
}
1281-
1282-
let no_threads = helpers::lld_flag_no_threads(target.contains("windows"));
1283-
options[1] = Some(format!("-Clink-arg=-Wl,{no_threads}"));
1284-
}
1285-
1286-
IntoIterator::into_iter(options).flatten()
1287-
}
1288-
12891274
/// Returns if this target should statically link the C runtime, if specified
12901275
fn crt_static(&self, target: TargetSelection) -> Option<bool> {
12911276
if target.contains("pc-windows-msvc") {

src/bootstrap/src/utils/helpers.rs

+31-31
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
use build_helper::util::fail;
77
use std::env;
8-
use std::ffi::{OsStr, OsString};
8+
use std::ffi::OsStr;
99
use std::fs;
1010
use std::io;
1111
use std::path::{Path, PathBuf};
@@ -476,22 +476,46 @@ pub enum LldThreads {
476476
No,
477477
}
478478

479-
pub fn add_rustdoc_lld_flags(
480-
cmd: &mut Command,
479+
/// Returns the linker arguments for rustc/rustdoc for the given builder and target.
480+
pub fn linker_args(
481481
builder: &Builder<'_>,
482482
target: TargetSelection,
483483
lld_threads: LldThreads,
484-
) {
485-
cmd.args(build_rustdoc_lld_flags(builder, target, lld_threads));
484+
) -> Vec<String> {
485+
let mut args = linker_flags(builder, target, lld_threads);
486+
487+
if let Some(linker) = builder.linker(target) {
488+
args.push(format!("-Clinker={}", linker.display()));
489+
}
490+
491+
args
486492
}
487493

488-
pub fn add_rustdoc_cargo_lld_flags(
494+
/// Returns the linker arguments for rustc/rustdoc for the given builder and target, without the
495+
/// -Clinker flag.
496+
pub fn linker_flags(
497+
builder: &Builder<'_>,
498+
target: TargetSelection,
499+
lld_threads: LldThreads,
500+
) -> Vec<String> {
501+
let mut args = vec![];
502+
if builder.is_fuse_ld_lld(target) {
503+
args.push(String::from("-Clink-arg=-fuse-ld=lld"));
504+
505+
if matches!(lld_threads, LldThreads::No) {
506+
args.push(format!("-Clink-arg=-Wl,{}", lld_flag_no_threads(target.is_msvc())));
507+
}
508+
}
509+
args
510+
}
511+
512+
pub fn add_rustdoc_cargo_linker_args(
489513
cmd: &mut Command,
490514
builder: &Builder<'_>,
491515
target: TargetSelection,
492516
lld_threads: LldThreads,
493517
) {
494-
let args = build_rustdoc_lld_flags(builder, target, lld_threads);
518+
let args = linker_args(builder, target, lld_threads);
495519
let mut flags = cmd
496520
.get_envs()
497521
.find_map(|(k, v)| if k == OsStr::new("RUSTDOCFLAGS") { v } else { None })
@@ -507,27 +531,3 @@ pub fn add_rustdoc_cargo_lld_flags(
507531
cmd.env("RUSTDOCFLAGS", flags);
508532
}
509533
}
510-
511-
fn build_rustdoc_lld_flags(
512-
builder: &Builder<'_>,
513-
target: TargetSelection,
514-
lld_threads: LldThreads,
515-
) -> Vec<OsString> {
516-
let mut args = vec![];
517-
518-
if let Some(linker) = builder.linker(target) {
519-
let mut flag = std::ffi::OsString::from("-Clinker=");
520-
flag.push(linker);
521-
args.push(flag);
522-
}
523-
if builder.is_fuse_ld_lld(target) {
524-
args.push(OsString::from("-Clink-arg=-fuse-ld=lld"));
525-
if matches!(lld_threads, LldThreads::No) {
526-
args.push(OsString::from(format!(
527-
"-Clink-arg=-Wl,{}",
528-
lld_flag_no_threads(target.contains("windows"))
529-
)));
530-
}
531-
}
532-
args
533-
}

0 commit comments

Comments
 (0)