diff options
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/back/linker.rs | 71 |
1 files changed, 44 insertions, 27 deletions
diff --git a/compiler/rustc_codegen_ssa/src/back/linker.rs b/compiler/rustc_codegen_ssa/src/back/linker.rs index c5a595cbf08..b16685e76a7 100644 --- a/compiler/rustc_codegen_ssa/src/back/linker.rs +++ b/compiler/rustc_codegen_ssa/src/back/linker.rs @@ -153,28 +153,40 @@ pub fn get_linker<'a>( match flavor { LinkerFlavor::Lld(LldFlavor::Link) | LinkerFlavor::Msvc => { - Box::new(MsvcLinker { cmd, sess, info }) as Box<dyn Linker> + Box::new(MsvcLinker { cmd, sess, exports: &info.exports }) as Box<dyn Linker> } - LinkerFlavor::Em => Box::new(EmLinker { cmd, sess, info }) as Box<dyn Linker>, - LinkerFlavor::Gcc => { - Box::new(GccLinker { cmd, sess, info, hinted_static: false, is_ld: false }) - as Box<dyn Linker> + LinkerFlavor::Em => { + Box::new(EmLinker { cmd, sess, exports: &info.exports }) as Box<dyn Linker> } + LinkerFlavor::Gcc => Box::new(GccLinker { + cmd, + sess, + exports: &info.exports, + target_cpu: &info.target_cpu, + hinted_static: false, + is_ld: false, + }) as Box<dyn Linker>, LinkerFlavor::Lld(LldFlavor::Ld) | LinkerFlavor::Lld(LldFlavor::Ld64) - | LinkerFlavor::Ld => { - Box::new(GccLinker { cmd, sess, info, hinted_static: false, is_ld: true }) - as Box<dyn Linker> - } + | LinkerFlavor::Ld => Box::new(GccLinker { + cmd, + sess, + exports: &info.exports, + target_cpu: &info.target_cpu, + hinted_static: false, + is_ld: true, + }) as Box<dyn Linker>, LinkerFlavor::Lld(LldFlavor::Wasm) => { - Box::new(WasmLd::new(cmd, sess, info)) as Box<dyn Linker> + Box::new(WasmLd::new(cmd, sess, &info.exports)) as Box<dyn Linker> } LinkerFlavor::PtxLinker => Box::new(PtxLinker { cmd, sess }) as Box<dyn Linker>, - LinkerFlavor::BpfLinker => Box::new(BpfLinker { cmd, sess, info }) as Box<dyn Linker>, + LinkerFlavor::BpfLinker => { + Box::new(BpfLinker { cmd, sess, exports: &info.exports }) as Box<dyn Linker> + } } } @@ -238,7 +250,8 @@ impl dyn Linker + '_ { pub struct GccLinker<'a> { cmd: Command, sess: &'a Session, - info: &'a LinkerInfo, + exports: &'a FxHashMap<CrateType, Vec<String>>, + target_cpu: &'a str, hinted_static: bool, // Keeps track of the current hinting mode. // Link as ld is_ld: bool, @@ -313,7 +326,7 @@ impl<'a> GccLinker<'a> { }; self.linker_arg(&format!("-plugin-opt={}", opt_level)); - self.linker_arg(&format!("-plugin-opt=mcpu={}", self.info.target_cpu)); + self.linker_arg(&format!("-plugin-opt=mcpu={}", self.target_cpu)); } fn build_dylib(&mut self, out_filename: &Path) { @@ -671,7 +684,7 @@ impl<'a> Linker for GccLinker<'a> { // Write a plain, newline-separated list of symbols let res: io::Result<()> = try { let mut f = BufWriter::new(File::create(&path)?); - for sym in self.info.exports[&crate_type].iter() { + for sym in self.exports[&crate_type].iter() { debug!(" _{}", sym); writeln!(f, "_{}", sym)?; } @@ -686,7 +699,7 @@ impl<'a> Linker for GccLinker<'a> { // .def file similar to MSVC one but without LIBRARY section // because LD doesn't like when it's empty writeln!(f, "EXPORTS")?; - for symbol in self.info.exports[&crate_type].iter() { + for symbol in self.exports[&crate_type].iter() { debug!(" _{}", symbol); writeln!(f, " {}", symbol)?; } @@ -699,9 +712,9 @@ impl<'a> Linker for GccLinker<'a> { let res: io::Result<()> = try { let mut f = BufWriter::new(File::create(&path)?); writeln!(f, "{{")?; - if !self.info.exports[&crate_type].is_empty() { + if !self.exports[&crate_type].is_empty() { writeln!(f, " global:")?; - for sym in self.info.exports[&crate_type].iter() { + for sym in self.exports[&crate_type].iter() { debug!(" {};", sym); writeln!(f, " {};", sym)?; } @@ -801,7 +814,7 @@ impl<'a> Linker for GccLinker<'a> { pub struct MsvcLinker<'a> { cmd: Command, sess: &'a Session, - info: &'a LinkerInfo, + exports: &'a FxHashMap<CrateType, Vec<String>>, } impl<'a> Linker for MsvcLinker<'a> { @@ -989,7 +1002,7 @@ impl<'a> Linker for MsvcLinker<'a> { // straight to exports. writeln!(f, "LIBRARY")?; writeln!(f, "EXPORTS")?; - for symbol in self.info.exports[&crate_type].iter() { + for symbol in self.exports[&crate_type].iter() { debug!(" _{}", symbol); writeln!(f, " {}", symbol)?; } @@ -1042,7 +1055,7 @@ impl<'a> Linker for MsvcLinker<'a> { pub struct EmLinker<'a> { cmd: Command, sess: &'a Session, - info: &'a LinkerInfo, + exports: &'a FxHashMap<CrateType, Vec<String>>, } impl<'a> Linker for EmLinker<'a> { @@ -1155,7 +1168,7 @@ impl<'a> Linker for EmLinker<'a> { } fn export_symbols(&mut self, _tmpdir: &Path, crate_type: CrateType) { - let symbols = &self.info.exports[&crate_type]; + let symbols = &self.exports[&crate_type]; debug!("EXPORTED SYMBOLS:"); @@ -1198,11 +1211,15 @@ impl<'a> Linker for EmLinker<'a> { pub struct WasmLd<'a> { cmd: Command, sess: &'a Session, - info: &'a LinkerInfo, + exports: &'a FxHashMap<CrateType, Vec<String>>, } impl<'a> WasmLd<'a> { - fn new(mut cmd: Command, sess: &'a Session, info: &'a LinkerInfo) -> WasmLd<'a> { + fn new( + mut cmd: Command, + sess: &'a Session, + exports: &'a FxHashMap<CrateType, Vec<String>>, + ) -> WasmLd<'a> { // If the atomics feature is enabled for wasm then we need a whole bunch // of flags: // @@ -1235,7 +1252,7 @@ impl<'a> WasmLd<'a> { cmd.arg("--export=__tls_align"); cmd.arg("--export=__tls_base"); } - WasmLd { cmd, sess, info } + WasmLd { cmd, sess, exports } } } @@ -1352,7 +1369,7 @@ impl<'a> Linker for WasmLd<'a> { fn no_default_libraries(&mut self) {} fn export_symbols(&mut self, _tmpdir: &Path, crate_type: CrateType) { - for sym in self.info.exports[&crate_type].iter() { + for sym in self.exports[&crate_type].iter() { self.cmd.arg("--export").arg(&sym); } @@ -1518,7 +1535,7 @@ impl<'a> Linker for PtxLinker<'a> { pub struct BpfLinker<'a> { cmd: Command, sess: &'a Session, - info: &'a LinkerInfo, + exports: &'a FxHashMap<CrateType, Vec<String>>, } impl<'a> Linker for BpfLinker<'a> { @@ -1609,7 +1626,7 @@ impl<'a> Linker for BpfLinker<'a> { let path = tmpdir.join("symbols"); let res: io::Result<()> = try { let mut f = BufWriter::new(File::create(&path)?); - for sym in self.info.exports[&crate_type].iter() { + for sym in self.exports[&crate_type].iter() { writeln!(f, "{}", sym)?; } }; |
