Skip to content

Commit 8e2c787

Browse files
committed
Include upstream patch rust-lang/rust#137676
1 parent dbf1130 commit 8e2c787

File tree

1 file changed

+173
-0
lines changed

1 file changed

+173
-0
lines changed

patches/137676.patch

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
From 9a2362a76eac403552fd93a0977e10731f3d9de3 Mon Sep 17 00:00:00 2001
2+
From: Vadim Petrochenkov <[email protected]>
3+
Date: Wed, 26 Feb 2025 16:24:39 +0300
4+
Subject: [PATCH] linker: Fix escaping style for response files on Windows
5+
MIME-Version: 1.0
6+
Content-Type: text/plain; charset=UTF-8
7+
Content-Transfer-Encoding: 8bit
8+
9+
If we use a С/С++ compiler as linker, then Posix-style escaping should be used.
10+
---
11+
compiler/rustc_codegen_ssa/src/back/link.rs | 8 ++++++--
12+
src/bootstrap/src/core/build_steps/test.rs | 20 ++++++++++++++++----
13+
src/bootstrap/src/core/builder/cargo.rs | 6 +++---
14+
src/bootstrap/src/core/builder/mod.rs | 2 +-
15+
src/bootstrap/src/utils/helpers.rs | 14 +++++++++++---
16+
5 files changed, 37 insertions(+), 13 deletions(-)
17+
18+
diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs
19+
index b090730ac6b51..5054ae561c043 100644
20+
--- a/compiler/rustc_codegen_ssa/src/back/link.rs
21+
+++ b/compiler/rustc_codegen_ssa/src/back/link.rs
22+
@@ -1726,8 +1726,12 @@ fn exec_linker(
23+
args.push_str(
24+
&Escape {
25+
arg: arg.to_str().unwrap(),
26+
- // LLD also uses MSVC-like parsing for @-files by default when running on windows hosts
27+
- is_like_msvc: sess.target.is_like_msvc || (cfg!(windows) && flavor.uses_lld()),
28+
+ // Windows-style escaping for @-files is used by
29+
+ // - all linkers targeting MSVC-like targets, including LLD
30+
+ // - all LLD flavors running on Windows hosts
31+
+ // С/С++ compilers use Posix-style escaping (except clang-cl, which we do not use).
32+
+ is_like_msvc: sess.target.is_like_msvc
33+
+ || (cfg!(windows) && flavor.uses_lld() && !flavor.uses_cc()),
34+
}
35+
.to_string(),
36+
);
37+
diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs
38+
index dfcf26cedd65f..e4f888ac793c0 100644
39+
--- a/src/bootstrap/src/core/build_steps/test.rs
40+
+++ b/src/bootstrap/src/core/build_steps/test.rs
41+
@@ -269,7 +269,13 @@ impl Step for Cargotest {
42+
.args(builder.config.test_args())
43+
.env("RUSTC", builder.rustc(compiler))
44+
.env("RUSTDOC", builder.rustdoc(compiler));
45+
- add_rustdoc_cargo_linker_args(&mut cmd, builder, compiler.host, LldThreads::No);
46+
+ add_rustdoc_cargo_linker_args(
47+
+ &mut cmd,
48+
+ builder,
49+
+ compiler.host,
50+
+ LldThreads::No,
51+
+ compiler.stage,
52+
+ );
53+
cmd.delay_failure().run(builder);
54+
}
55+
}
56+
@@ -847,7 +853,7 @@ impl Step for RustdocTheme {
57+
.env("CFG_RELEASE_CHANNEL", &builder.config.channel)
58+
.env("RUSTDOC_REAL", builder.rustdoc(self.compiler))
59+
.env("RUSTC_BOOTSTRAP", "1");
60+
- cmd.args(linker_args(builder, self.compiler.host, LldThreads::No));
61+
+ cmd.args(linker_args(builder, self.compiler.host, LldThreads::No, self.compiler.stage));
62+
63+
cmd.delay_failure().run(builder);
64+
}
65+
@@ -1023,7 +1029,13 @@ impl Step for RustdocGUI {
66+
cmd.env("RUSTDOC", builder.rustdoc(self.compiler))
67+
.env("RUSTC", builder.rustc(self.compiler));
68+
69+
- add_rustdoc_cargo_linker_args(&mut cmd, builder, self.compiler.host, LldThreads::No);
70+
+ add_rustdoc_cargo_linker_args(
71+
+ &mut cmd,
72+
+ builder,
73+
+ self.compiler.host,
74+
+ LldThreads::No,
75+
+ self.compiler.stage,
76+
+ );
77+
78+
for path in &builder.paths {
79+
if let Some(p) = helpers::is_valid_test_suite_arg(path, "tests/rustdoc-gui", builder) {
80+
@@ -1883,7 +1895,7 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
81+
82+
let mut hostflags = flags.clone();
83+
hostflags.push(format!("-Lnative={}", builder.test_helpers_out(compiler.host).display()));
84+
- hostflags.extend(linker_flags(builder, compiler.host, LldThreads::No));
85+
+ hostflags.extend(linker_flags(builder, compiler.host, LldThreads::No, compiler.stage));
86+
87+
let mut targetflags = flags;
88+
targetflags.push(format!("-Lnative={}", builder.test_helpers_out(target).display()));
89+
diff --git a/src/bootstrap/src/core/builder/cargo.rs b/src/bootstrap/src/core/builder/cargo.rs
90+
index 4f6d53e9fc893..8ada7afed8e92 100644
91+
--- a/src/bootstrap/src/core/builder/cargo.rs
92+
+++ b/src/bootstrap/src/core/builder/cargo.rs
93+
@@ -260,7 +260,7 @@ impl Cargo {
94+
}
95+
}
96+
97+
- for arg in linker_args(builder, compiler.host, LldThreads::Yes) {
98+
+ for arg in linker_args(builder, compiler.host, LldThreads::Yes, 0) {
99+
self.hostflags.arg(&arg);
100+
}
101+
102+
@@ -270,10 +270,10 @@ impl Cargo {
103+
}
104+
// We want to set -Clinker using Cargo, therefore we only call `linker_flags` and not
105+
// `linker_args` here.
106+
- for flag in linker_flags(builder, target, LldThreads::Yes) {
107+
+ for flag in linker_flags(builder, target, LldThreads::Yes, compiler.stage) {
108+
self.rustflags.arg(&flag);
109+
}
110+
- for arg in linker_args(builder, target, LldThreads::Yes) {
111+
+ for arg in linker_args(builder, target, LldThreads::Yes, compiler.stage) {
112+
self.rustdocflags.arg(&arg);
113+
}
114+
115+
diff --git a/src/bootstrap/src/core/builder/mod.rs b/src/bootstrap/src/core/builder/mod.rs
116+
index 9c04f097bee27..c8e2856bdc874 100644
117+
--- a/src/bootstrap/src/core/builder/mod.rs
118+
+++ b/src/bootstrap/src/core/builder/mod.rs
119+
@@ -1462,7 +1462,7 @@ impl<'a> Builder<'a> {
120+
cmd.arg("-Dwarnings");
121+
}
122+
cmd.arg("-Znormalize-docs");
123+
- cmd.args(linker_args(self, compiler.host, LldThreads::Yes));
124+
+ cmd.args(linker_args(self, compiler.host, LldThreads::Yes, compiler.stage));
125+
cmd
126+
}
127+
128+
diff --git a/src/bootstrap/src/utils/helpers.rs b/src/bootstrap/src/utils/helpers.rs
129+
index 3fee397da091d..7ad308cd06728 100644
130+
--- a/src/bootstrap/src/utils/helpers.rs
131+
+++ b/src/bootstrap/src/utils/helpers.rs
132+
@@ -430,8 +430,9 @@ pub fn linker_args(
133+
builder: &Builder<'_>,
134+
target: TargetSelection,
135+
lld_threads: LldThreads,
136+
+ stage: u32,
137+
) -> Vec<String> {
138+
- let mut args = linker_flags(builder, target, lld_threads);
139+
+ let mut args = linker_flags(builder, target, lld_threads, stage);
140+
141+
if let Some(linker) = builder.linker(target) {
142+
args.push(format!("-Clinker={}", linker.display()));
143+
@@ -446,12 +447,18 @@ pub fn linker_flags(
144+
builder: &Builder<'_>,
145+
target: TargetSelection,
146+
lld_threads: LldThreads,
147+
+ stage: u32,
148+
) -> Vec<String> {
149+
let mut args = vec![];
150+
if !builder.is_lld_direct_linker(target) && builder.config.lld_mode.is_used() {
151+
match builder.config.lld_mode {
152+
LldMode::External => {
153+
- args.push("-Clinker-flavor=gnu-lld-cc".to_string());
154+
+ // cfg(bootstrap) - remove after updating bootstrap compiler (#137498)
155+
+ if stage == 0 && target.is_windows() {
156+
+ args.push("-Clink-arg=-fuse-ld=lld".to_string());
157+
+ } else {
158+
+ args.push("-Clinker-flavor=gnu-lld-cc".to_string());
159+
+ }
160+
// FIXME(kobzol): remove this flag once MCP510 gets stabilized
161+
args.push("-Zunstable-options".to_string());
162+
}
163+
@@ -479,8 +486,9 @@ pub fn add_rustdoc_cargo_linker_args(
164+
builder: &Builder<'_>,
165+
target: TargetSelection,
166+
lld_threads: LldThreads,
167+
+ stage: u32,
168+
) {
169+
- let args = linker_args(builder, target, lld_threads);
170+
+ let args = linker_args(builder, target, lld_threads, stage);
171+
let mut flags = cmd
172+
.get_envs()
173+
.find_map(|(k, v)| if k == OsStr::new("RUSTDOCFLAGS") { v } else { None })

0 commit comments

Comments
 (0)