Skip to content

Commit d617902

Browse files
committed
update bootstrap mcp510 handling
beta and stage1 need to use different flags (-C vs -Z) to be able to use the old and new `linker-features` and `link-self-contained` flags
1 parent 3f194a8 commit d617902

File tree

4 files changed

+46
-16
lines changed

4 files changed

+46
-16
lines changed

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,13 @@ impl Step for Cargotest {
262262
.args(builder.config.test_args())
263263
.env("RUSTC", builder.rustc(compiler))
264264
.env("RUSTDOC", builder.rustdoc(compiler));
265-
add_rustdoc_cargo_linker_args(&mut cmd, builder, compiler.host, LldThreads::No);
265+
add_rustdoc_cargo_linker_args(
266+
&mut cmd,
267+
builder,
268+
compiler.host,
269+
LldThreads::No,
270+
compiler.stage,
271+
);
266272
cmd.delay_failure().run(builder);
267273
}
268274
}
@@ -857,7 +863,7 @@ impl Step for RustdocTheme {
857863
.env("CFG_RELEASE_CHANNEL", &builder.config.channel)
858864
.env("RUSTDOC_REAL", builder.rustdoc(self.compiler))
859865
.env("RUSTC_BOOTSTRAP", "1");
860-
cmd.args(linker_args(builder, self.compiler.host, LldThreads::No));
866+
cmd.args(linker_args(builder, self.compiler.host, LldThreads::No, self.compiler.stage));
861867

862868
cmd.delay_failure().run(builder);
863869
}
@@ -1033,7 +1039,13 @@ impl Step for RustdocGUI {
10331039
cmd.env("RUSTDOC", builder.rustdoc(self.compiler))
10341040
.env("RUSTC", builder.rustc(self.compiler));
10351041

1036-
add_rustdoc_cargo_linker_args(&mut cmd, builder, self.compiler.host, LldThreads::No);
1042+
add_rustdoc_cargo_linker_args(
1043+
&mut cmd,
1044+
builder,
1045+
self.compiler.host,
1046+
LldThreads::No,
1047+
self.compiler.stage,
1048+
);
10371049

10381050
for path in &builder.paths {
10391051
if let Some(p) = helpers::is_valid_test_suite_arg(path, "tests/rustdoc-gui", builder) {
@@ -1812,7 +1824,7 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
18121824
}
18131825

18141826
let mut hostflags = flags.clone();
1815-
hostflags.extend(linker_flags(builder, compiler.host, LldThreads::No));
1827+
hostflags.extend(linker_flags(builder, compiler.host, LldThreads::No, compiler.stage));
18161828

18171829
let mut targetflags = flags;
18181830

src/bootstrap/src/core/builder/cargo.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ impl Cargo {
115115
// No need to configure the target linker for these command types.
116116
Kind::Clean | Kind::Check | Kind::Suggest | Kind::Format | Kind::Setup => {}
117117
_ => {
118-
cargo.configure_linker(builder);
118+
cargo.configure_linker(builder, mode);
119119
}
120120
}
121121

@@ -209,7 +209,7 @@ impl Cargo {
209209

210210
// FIXME(onur-ozkan): Add coverage to make sure modifications to this function
211211
// doesn't cause cache invalidations (e.g., #130108).
212-
fn configure_linker(&mut self, builder: &Builder<'_>) -> &mut Cargo {
212+
fn configure_linker(&mut self, builder: &Builder<'_>, mode: Mode) -> &mut Cargo {
213213
let target = self.target;
214214
let compiler = self.compiler;
215215

@@ -264,7 +264,12 @@ impl Cargo {
264264
}
265265
}
266266

267-
for arg in linker_args(builder, compiler.host, LldThreads::Yes) {
267+
// We use the snapshot compiler when building host code (build scripts/proc macros) of
268+
// `Mode::Std` tools, so we need to determine the current stage here to pass the proper
269+
// linker args (e.g. -C vs -Z).
270+
// This should stay synchronized with the [cargo] function.
271+
let host_stage = if mode == Mode::Std { 0 } else { compiler.stage };
272+
for arg in linker_args(builder, compiler.host, LldThreads::Yes, host_stage) {
268273
self.hostflags.arg(&arg);
269274
}
270275

@@ -274,10 +279,10 @@ impl Cargo {
274279
}
275280
// We want to set -Clinker using Cargo, therefore we only call `linker_flags` and not
276281
// `linker_args` here.
277-
for flag in linker_flags(builder, target, LldThreads::Yes) {
282+
for flag in linker_flags(builder, target, LldThreads::Yes, compiler.stage) {
278283
self.rustflags.arg(&flag);
279284
}
280-
for arg in linker_args(builder, target, LldThreads::Yes) {
285+
for arg in linker_args(builder, target, LldThreads::Yes, compiler.stage) {
281286
self.rustdocflags.arg(&arg);
282287
}
283288

src/bootstrap/src/core/builder/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1599,7 +1599,7 @@ You have to build a stage1 compiler for `{}` first, and then use it to build a s
15991599
cmd.arg("-Dwarnings");
16001600
}
16011601
cmd.arg("-Znormalize-docs");
1602-
cmd.args(linker_args(self, compiler.host, LldThreads::Yes));
1602+
cmd.args(linker_args(self, compiler.host, LldThreads::Yes, compiler.stage));
16031603
cmd
16041604
}
16051605

src/bootstrap/src/utils/helpers.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -404,8 +404,9 @@ pub fn linker_args(
404404
builder: &Builder<'_>,
405405
target: TargetSelection,
406406
lld_threads: LldThreads,
407+
stage: u32,
407408
) -> Vec<String> {
408-
let mut args = linker_flags(builder, target, lld_threads);
409+
let mut args = linker_flags(builder, target, lld_threads, stage);
409410

410411
if let Some(linker) = builder.linker(target) {
411412
args.push(format!("-Clinker={}", linker.display()));
@@ -420,19 +421,30 @@ pub fn linker_flags(
420421
builder: &Builder<'_>,
421422
target: TargetSelection,
422423
lld_threads: LldThreads,
424+
stage: u32,
423425
) -> Vec<String> {
424426
let mut args = vec![];
425427
if !builder.is_lld_direct_linker(target) && builder.config.lld_mode.is_used() {
426428
match builder.config.lld_mode {
427429
LldMode::External => {
428-
args.push("-Zlinker-features=+lld".to_string());
429-
// FIXME(kobzol): remove this flag once MCP510 gets stabilized
430+
// cfg(bootstrap) - remove the stage 0 check after updating the bootstrap compiler:
431+
// `-Clinker-features` has been stabilized.
432+
if stage == 0 {
433+
args.push("-Zlinker-features=+lld".to_string());
434+
} else {
435+
args.push("-Clinker-features=+lld".to_string());
436+
}
430437
args.push("-Zunstable-options".to_string());
431438
}
432439
LldMode::SelfContained => {
433-
args.push("-Zlinker-features=+lld".to_string());
440+
// cfg(bootstrap) - remove the stage 0 check after updating the bootstrap compiler:
441+
// `-Clinker-features` has been stabilized.
442+
if stage == 0 {
443+
args.push("-Zlinker-features=+lld".to_string());
444+
} else {
445+
args.push("-Clinker-features=+lld".to_string());
446+
}
434447
args.push("-Clink-self-contained=+linker".to_string());
435-
// FIXME(kobzol): remove this flag once MCP510 gets stabilized
436448
args.push("-Zunstable-options".to_string());
437449
}
438450
LldMode::Unused => unreachable!(),
@@ -453,8 +465,9 @@ pub fn add_rustdoc_cargo_linker_args(
453465
builder: &Builder<'_>,
454466
target: TargetSelection,
455467
lld_threads: LldThreads,
468+
stage: u32,
456469
) {
457-
let args = linker_args(builder, target, lld_threads);
470+
let args = linker_args(builder, target, lld_threads, stage);
458471
let mut flags = cmd
459472
.get_envs()
460473
.find_map(|(k, v)| if k == OsStr::new("RUSTDOCFLAGS") { v } else { None })

0 commit comments

Comments
 (0)