@@ -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 + '_ {
238250pub 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> {
801814pub struct MsvcLinker < ' a > {
802815 cmd : Command ,
803816 sess : & ' a Session ,
804- info : & ' a LinkerInfo ,
817+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
805818}
806819
807820impl < ' 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> {
10421055pub struct EmLinker < ' a > {
10431056 cmd : Command ,
10441057 sess : & ' a Session ,
1045- info : & ' a LinkerInfo ,
1058+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
10461059}
10471060
10481061impl < ' 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> {
11981211pub struct WasmLd < ' a > {
11991212 cmd : Command ,
12001213 sess : & ' a Session ,
1201- info : & ' a LinkerInfo ,
1214+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
12021215}
12031216
12041217impl < ' 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> {
15181535pub struct BpfLinker < ' a > {
15191536 cmd : Command ,
15201537 sess : & ' a Session ,
1521- info : & ' a LinkerInfo ,
1538+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
15221539}
15231540
15241541impl < ' 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