Skip to content

Commit b4a12f9

Browse files
committed
Don't store the full LinkerInfo inside Linker impls
1 parent cfff3a3 commit b4a12f9

File tree

1 file changed

+44
-27
lines changed

1 file changed

+44
-27
lines changed

compiler/rustc_codegen_ssa/src/back/linker.rs

+44-27
Original file line numberDiff line numberDiff line change
@@ -153,28 +153,40 @@ pub fn get_linker<'a>(
153153

154154
match flavor {
155155
LinkerFlavor::Lld(LldFlavor::Link) | LinkerFlavor::Msvc => {
156-
Box::new(MsvcLinker { cmd, sess, info }) as Box<dyn Linker>
156+
Box::new(MsvcLinker { cmd, sess, exports: &info.exports }) as Box<dyn Linker>
157157
}
158-
LinkerFlavor::Em => Box::new(EmLinker { cmd, sess, info }) as Box<dyn Linker>,
159-
LinkerFlavor::Gcc => {
160-
Box::new(GccLinker { cmd, sess, info, hinted_static: false, is_ld: false })
161-
as Box<dyn Linker>
158+
LinkerFlavor::Em => {
159+
Box::new(EmLinker { cmd, sess, exports: &info.exports }) as Box<dyn Linker>
162160
}
161+
LinkerFlavor::Gcc => Box::new(GccLinker {
162+
cmd,
163+
sess,
164+
exports: &info.exports,
165+
target_cpu: &info.target_cpu,
166+
hinted_static: false,
167+
is_ld: false,
168+
}) as Box<dyn Linker>,
163169

164170
LinkerFlavor::Lld(LldFlavor::Ld)
165171
| LinkerFlavor::Lld(LldFlavor::Ld64)
166-
| LinkerFlavor::Ld => {
167-
Box::new(GccLinker { cmd, sess, info, hinted_static: false, is_ld: true })
168-
as Box<dyn Linker>
169-
}
172+
| LinkerFlavor::Ld => Box::new(GccLinker {
173+
cmd,
174+
sess,
175+
exports: &info.exports,
176+
target_cpu: &info.target_cpu,
177+
hinted_static: false,
178+
is_ld: true,
179+
}) as Box<dyn Linker>,
170180

171181
LinkerFlavor::Lld(LldFlavor::Wasm) => {
172-
Box::new(WasmLd::new(cmd, sess, info)) as Box<dyn Linker>
182+
Box::new(WasmLd::new(cmd, sess, &info.exports)) as Box<dyn Linker>
173183
}
174184

175185
LinkerFlavor::PtxLinker => Box::new(PtxLinker { cmd, sess }) as Box<dyn Linker>,
176186

177-
LinkerFlavor::BpfLinker => Box::new(BpfLinker { cmd, sess, info }) as Box<dyn Linker>,
187+
LinkerFlavor::BpfLinker => {
188+
Box::new(BpfLinker { cmd, sess, exports: &info.exports }) as Box<dyn Linker>
189+
}
178190
}
179191
}
180192

@@ -238,7 +250,8 @@ impl dyn Linker + '_ {
238250
pub struct GccLinker<'a> {
239251
cmd: Command,
240252
sess: &'a Session,
241-
info: &'a LinkerInfo,
253+
exports: &'a FxHashMap<CrateType, Vec<String>>,
254+
target_cpu: &'a str,
242255
hinted_static: bool, // Keeps track of the current hinting mode.
243256
// Link as ld
244257
is_ld: bool,
@@ -313,7 +326,7 @@ impl<'a> GccLinker<'a> {
313326
};
314327

315328
self.linker_arg(&format!("-plugin-opt={}", opt_level));
316-
self.linker_arg(&format!("-plugin-opt=mcpu={}", self.info.target_cpu));
329+
self.linker_arg(&format!("-plugin-opt=mcpu={}", self.target_cpu));
317330
}
318331

319332
fn build_dylib(&mut self, out_filename: &Path) {
@@ -671,7 +684,7 @@ impl<'a> Linker for GccLinker<'a> {
671684
// Write a plain, newline-separated list of symbols
672685
let res: io::Result<()> = try {
673686
let mut f = BufWriter::new(File::create(&path)?);
674-
for sym in self.info.exports[&crate_type].iter() {
687+
for sym in self.exports[&crate_type].iter() {
675688
debug!(" _{}", sym);
676689
writeln!(f, "_{}", sym)?;
677690
}
@@ -686,7 +699,7 @@ impl<'a> Linker for GccLinker<'a> {
686699
// .def file similar to MSVC one but without LIBRARY section
687700
// because LD doesn't like when it's empty
688701
writeln!(f, "EXPORTS")?;
689-
for symbol in self.info.exports[&crate_type].iter() {
702+
for symbol in self.exports[&crate_type].iter() {
690703
debug!(" _{}", symbol);
691704
writeln!(f, " {}", symbol)?;
692705
}
@@ -699,9 +712,9 @@ impl<'a> Linker for GccLinker<'a> {
699712
let res: io::Result<()> = try {
700713
let mut f = BufWriter::new(File::create(&path)?);
701714
writeln!(f, "{{")?;
702-
if !self.info.exports[&crate_type].is_empty() {
715+
if !self.exports[&crate_type].is_empty() {
703716
writeln!(f, " global:")?;
704-
for sym in self.info.exports[&crate_type].iter() {
717+
for sym in self.exports[&crate_type].iter() {
705718
debug!(" {};", sym);
706719
writeln!(f, " {};", sym)?;
707720
}
@@ -801,7 +814,7 @@ impl<'a> Linker for GccLinker<'a> {
801814
pub struct MsvcLinker<'a> {
802815
cmd: Command,
803816
sess: &'a Session,
804-
info: &'a LinkerInfo,
817+
exports: &'a FxHashMap<CrateType, Vec<String>>,
805818
}
806819

807820
impl<'a> Linker for MsvcLinker<'a> {
@@ -989,7 +1002,7 @@ impl<'a> Linker for MsvcLinker<'a> {
9891002
// straight to exports.
9901003
writeln!(f, "LIBRARY")?;
9911004
writeln!(f, "EXPORTS")?;
992-
for symbol in self.info.exports[&crate_type].iter() {
1005+
for symbol in self.exports[&crate_type].iter() {
9931006
debug!(" _{}", symbol);
9941007
writeln!(f, " {}", symbol)?;
9951008
}
@@ -1042,7 +1055,7 @@ impl<'a> Linker for MsvcLinker<'a> {
10421055
pub struct EmLinker<'a> {
10431056
cmd: Command,
10441057
sess: &'a Session,
1045-
info: &'a LinkerInfo,
1058+
exports: &'a FxHashMap<CrateType, Vec<String>>,
10461059
}
10471060

10481061
impl<'a> Linker for EmLinker<'a> {
@@ -1155,7 +1168,7 @@ impl<'a> Linker for EmLinker<'a> {
11551168
}
11561169

11571170
fn export_symbols(&mut self, _tmpdir: &Path, crate_type: CrateType) {
1158-
let symbols = &self.info.exports[&crate_type];
1171+
let symbols = &self.exports[&crate_type];
11591172

11601173
debug!("EXPORTED SYMBOLS:");
11611174

@@ -1198,11 +1211,15 @@ impl<'a> Linker for EmLinker<'a> {
11981211
pub struct WasmLd<'a> {
11991212
cmd: Command,
12001213
sess: &'a Session,
1201-
info: &'a LinkerInfo,
1214+
exports: &'a FxHashMap<CrateType, Vec<String>>,
12021215
}
12031216

12041217
impl<'a> WasmLd<'a> {
1205-
fn new(mut cmd: Command, sess: &'a Session, info: &'a LinkerInfo) -> WasmLd<'a> {
1218+
fn new(
1219+
mut cmd: Command,
1220+
sess: &'a Session,
1221+
exports: &'a FxHashMap<CrateType, Vec<String>>,
1222+
) -> WasmLd<'a> {
12061223
// If the atomics feature is enabled for wasm then we need a whole bunch
12071224
// of flags:
12081225
//
@@ -1235,7 +1252,7 @@ impl<'a> WasmLd<'a> {
12351252
cmd.arg("--export=__tls_align");
12361253
cmd.arg("--export=__tls_base");
12371254
}
1238-
WasmLd { cmd, sess, info }
1255+
WasmLd { cmd, sess, exports }
12391256
}
12401257
}
12411258

@@ -1352,7 +1369,7 @@ impl<'a> Linker for WasmLd<'a> {
13521369
fn no_default_libraries(&mut self) {}
13531370

13541371
fn export_symbols(&mut self, _tmpdir: &Path, crate_type: CrateType) {
1355-
for sym in self.info.exports[&crate_type].iter() {
1372+
for sym in self.exports[&crate_type].iter() {
13561373
self.cmd.arg("--export").arg(&sym);
13571374
}
13581375

@@ -1518,7 +1535,7 @@ impl<'a> Linker for PtxLinker<'a> {
15181535
pub struct BpfLinker<'a> {
15191536
cmd: Command,
15201537
sess: &'a Session,
1521-
info: &'a LinkerInfo,
1538+
exports: &'a FxHashMap<CrateType, Vec<String>>,
15221539
}
15231540

15241541
impl<'a> Linker for BpfLinker<'a> {
@@ -1609,7 +1626,7 @@ impl<'a> Linker for BpfLinker<'a> {
16091626
let path = tmpdir.join("symbols");
16101627
let res: io::Result<()> = try {
16111628
let mut f = BufWriter::new(File::create(&path)?);
1612-
for sym in self.info.exports[&crate_type].iter() {
1629+
for sym in self.exports[&crate_type].iter() {
16131630
writeln!(f, "{}", sym)?;
16141631
}
16151632
};

0 commit comments

Comments
 (0)