Skip to content

Commit f1cdd3b

Browse files
authored
Rollup merge of rust-lang#137676 - petrochenkov:winresp, r=Kobzol
linker: Fix escaping style for response files on Windows If we use a С/С++ compiler as linker, then Posix-style escaping should be used. Also temporarily fixup rustbuild to not fail at least in common scenarios, until the bootstrap compiler is updated. Fixes rust-lang#137498
2 parents 4606610 + 9a2362a commit f1cdd3b

File tree

5 files changed

+37
-13
lines changed

5 files changed

+37
-13
lines changed

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

+6-2
Original file line numberDiff line numberDiff line change
@@ -1726,8 +1726,12 @@ fn exec_linker(
17261726
args.push_str(
17271727
&Escape {
17281728
arg: arg.to_str().unwrap(),
1729-
// LLD also uses MSVC-like parsing for @-files by default when running on windows hosts
1730-
is_like_msvc: sess.target.is_like_msvc || (cfg!(windows) && flavor.uses_lld()),
1729+
// Windows-style escaping for @-files is used by
1730+
// - all linkers targeting MSVC-like targets, including LLD
1731+
// - all LLD flavors running on Windows hosts
1732+
// С/С++ compilers use Posix-style escaping (except clang-cl, which we do not use).
1733+
is_like_msvc: sess.target.is_like_msvc
1734+
|| (cfg!(windows) && flavor.uses_lld() && !flavor.uses_cc()),
17311735
}
17321736
.to_string(),
17331737
);

Diff for: src/bootstrap/src/core/build_steps/test.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,13 @@ impl Step for Cargotest {
269269
.args(builder.config.test_args())
270270
.env("RUSTC", builder.rustc(compiler))
271271
.env("RUSTDOC", builder.rustdoc(compiler));
272-
add_rustdoc_cargo_linker_args(&mut cmd, builder, compiler.host, LldThreads::No);
272+
add_rustdoc_cargo_linker_args(
273+
&mut cmd,
274+
builder,
275+
compiler.host,
276+
LldThreads::No,
277+
compiler.stage,
278+
);
273279
cmd.delay_failure().run(builder);
274280
}
275281
}
@@ -847,7 +853,7 @@ impl Step for RustdocTheme {
847853
.env("CFG_RELEASE_CHANNEL", &builder.config.channel)
848854
.env("RUSTDOC_REAL", builder.rustdoc(self.compiler))
849855
.env("RUSTC_BOOTSTRAP", "1");
850-
cmd.args(linker_args(builder, self.compiler.host, LldThreads::No));
856+
cmd.args(linker_args(builder, self.compiler.host, LldThreads::No, self.compiler.stage));
851857

852858
cmd.delay_failure().run(builder);
853859
}
@@ -1023,7 +1029,13 @@ impl Step for RustdocGUI {
10231029
cmd.env("RUSTDOC", builder.rustdoc(self.compiler))
10241030
.env("RUSTC", builder.rustc(self.compiler));
10251031

1026-
add_rustdoc_cargo_linker_args(&mut cmd, builder, self.compiler.host, LldThreads::No);
1032+
add_rustdoc_cargo_linker_args(
1033+
&mut cmd,
1034+
builder,
1035+
self.compiler.host,
1036+
LldThreads::No,
1037+
self.compiler.stage,
1038+
);
10271039

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

18881900
let mut hostflags = flags.clone();
18891901
hostflags.push(format!("-Lnative={}", builder.test_helpers_out(compiler.host).display()));
1890-
hostflags.extend(linker_flags(builder, compiler.host, LldThreads::No));
1902+
hostflags.extend(linker_flags(builder, compiler.host, LldThreads::No, compiler.stage));
18911903

18921904
let mut targetflags = flags;
18931905
targetflags.push(format!("-Lnative={}", builder.test_helpers_out(target).display()));

Diff for: src/bootstrap/src/core/builder/cargo.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ impl Cargo {
260260
}
261261
}
262262

263-
for arg in linker_args(builder, compiler.host, LldThreads::Yes) {
263+
for arg in linker_args(builder, compiler.host, LldThreads::Yes, 0) {
264264
self.hostflags.arg(&arg);
265265
}
266266

@@ -270,10 +270,10 @@ impl Cargo {
270270
}
271271
// We want to set -Clinker using Cargo, therefore we only call `linker_flags` and not
272272
// `linker_args` here.
273-
for flag in linker_flags(builder, target, LldThreads::Yes) {
273+
for flag in linker_flags(builder, target, LldThreads::Yes, compiler.stage) {
274274
self.rustflags.arg(&flag);
275275
}
276-
for arg in linker_args(builder, target, LldThreads::Yes) {
276+
for arg in linker_args(builder, target, LldThreads::Yes, compiler.stage) {
277277
self.rustdocflags.arg(&arg);
278278
}
279279

Diff for: src/bootstrap/src/core/builder/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1462,7 +1462,7 @@ impl<'a> Builder<'a> {
14621462
cmd.arg("-Dwarnings");
14631463
}
14641464
cmd.arg("-Znormalize-docs");
1465-
cmd.args(linker_args(self, compiler.host, LldThreads::Yes));
1465+
cmd.args(linker_args(self, compiler.host, LldThreads::Yes, compiler.stage));
14661466
cmd
14671467
}
14681468

Diff for: src/bootstrap/src/utils/helpers.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,9 @@ pub fn linker_args(
430430
builder: &Builder<'_>,
431431
target: TargetSelection,
432432
lld_threads: LldThreads,
433+
stage: u32,
433434
) -> Vec<String> {
434-
let mut args = linker_flags(builder, target, lld_threads);
435+
let mut args = linker_flags(builder, target, lld_threads, stage);
435436

436437
if let Some(linker) = builder.linker(target) {
437438
args.push(format!("-Clinker={}", linker.display()));
@@ -446,12 +447,18 @@ pub fn linker_flags(
446447
builder: &Builder<'_>,
447448
target: TargetSelection,
448449
lld_threads: LldThreads,
450+
stage: u32,
449451
) -> Vec<String> {
450452
let mut args = vec![];
451453
if !builder.is_lld_direct_linker(target) && builder.config.lld_mode.is_used() {
452454
match builder.config.lld_mode {
453455
LldMode::External => {
454-
args.push("-Clinker-flavor=gnu-lld-cc".to_string());
456+
// cfg(bootstrap) - remove after updating bootstrap compiler (#137498)
457+
if stage == 0 && target.is_windows() {
458+
args.push("-Clink-arg=-fuse-ld=lld".to_string());
459+
} else {
460+
args.push("-Clinker-flavor=gnu-lld-cc".to_string());
461+
}
455462
// FIXME(kobzol): remove this flag once MCP510 gets stabilized
456463
args.push("-Zunstable-options".to_string());
457464
}
@@ -479,8 +486,9 @@ pub fn add_rustdoc_cargo_linker_args(
479486
builder: &Builder<'_>,
480487
target: TargetSelection,
481488
lld_threads: LldThreads,
489+
stage: u32,
482490
) {
483-
let args = linker_args(builder, target, lld_threads);
491+
let args = linker_args(builder, target, lld_threads, stage);
484492
let mut flags = cmd
485493
.get_envs()
486494
.find_map(|(k, v)| if k == OsStr::new("RUSTDOCFLAGS") { v } else { None })

0 commit comments

Comments
 (0)