@@ -153,28 +153,40 @@ pub fn get_linker<'a>(
153
153
154
154
match flavor {
155
155
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 >
157
157
}
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 >
162
160
}
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 > ,
163
169
164
170
LinkerFlavor :: Lld ( LldFlavor :: Ld )
165
171
| 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 > ,
170
180
171
181
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 >
173
183
}
174
184
175
185
LinkerFlavor :: PtxLinker => Box :: new ( PtxLinker { cmd, sess } ) as Box < dyn Linker > ,
176
186
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
+ }
178
190
}
179
191
}
180
192
@@ -238,7 +250,8 @@ impl dyn Linker + '_ {
238
250
pub struct GccLinker < ' a > {
239
251
cmd : Command ,
240
252
sess : & ' a Session ,
241
- info : & ' a LinkerInfo ,
253
+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
254
+ target_cpu : & ' a str ,
242
255
hinted_static : bool , // Keeps track of the current hinting mode.
243
256
// Link as ld
244
257
is_ld : bool ,
@@ -313,7 +326,7 @@ impl<'a> GccLinker<'a> {
313
326
} ;
314
327
315
328
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) ) ;
317
330
}
318
331
319
332
fn build_dylib ( & mut self , out_filename : & Path ) {
@@ -671,7 +684,7 @@ impl<'a> Linker for GccLinker<'a> {
671
684
// Write a plain, newline-separated list of symbols
672
685
let res: io:: Result < ( ) > = try {
673
686
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 ( ) {
675
688
debug ! ( " _{}" , sym) ;
676
689
writeln ! ( f, "_{}" , sym) ?;
677
690
}
@@ -686,7 +699,7 @@ impl<'a> Linker for GccLinker<'a> {
686
699
// .def file similar to MSVC one but without LIBRARY section
687
700
// because LD doesn't like when it's empty
688
701
writeln ! ( f, "EXPORTS" ) ?;
689
- for symbol in self . info . exports [ & crate_type] . iter ( ) {
702
+ for symbol in self . exports [ & crate_type] . iter ( ) {
690
703
debug ! ( " _{}" , symbol) ;
691
704
writeln ! ( f, " {}" , symbol) ?;
692
705
}
@@ -699,9 +712,9 @@ impl<'a> Linker for GccLinker<'a> {
699
712
let res: io:: Result < ( ) > = try {
700
713
let mut f = BufWriter :: new ( File :: create ( & path) ?) ;
701
714
writeln ! ( f, "{{" ) ?;
702
- if !self . info . exports [ & crate_type] . is_empty ( ) {
715
+ if !self . exports [ & crate_type] . is_empty ( ) {
703
716
writeln ! ( f, " global:" ) ?;
704
- for sym in self . info . exports [ & crate_type] . iter ( ) {
717
+ for sym in self . exports [ & crate_type] . iter ( ) {
705
718
debug ! ( " {};" , sym) ;
706
719
writeln ! ( f, " {};" , sym) ?;
707
720
}
@@ -801,7 +814,7 @@ impl<'a> Linker for GccLinker<'a> {
801
814
pub struct MsvcLinker < ' a > {
802
815
cmd : Command ,
803
816
sess : & ' a Session ,
804
- info : & ' a LinkerInfo ,
817
+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
805
818
}
806
819
807
820
impl < ' a > Linker for MsvcLinker < ' a > {
@@ -989,7 +1002,7 @@ impl<'a> Linker for MsvcLinker<'a> {
989
1002
// straight to exports.
990
1003
writeln ! ( f, "LIBRARY" ) ?;
991
1004
writeln ! ( f, "EXPORTS" ) ?;
992
- for symbol in self . info . exports [ & crate_type] . iter ( ) {
1005
+ for symbol in self . exports [ & crate_type] . iter ( ) {
993
1006
debug ! ( " _{}" , symbol) ;
994
1007
writeln ! ( f, " {}" , symbol) ?;
995
1008
}
@@ -1042,7 +1055,7 @@ impl<'a> Linker for MsvcLinker<'a> {
1042
1055
pub struct EmLinker < ' a > {
1043
1056
cmd : Command ,
1044
1057
sess : & ' a Session ,
1045
- info : & ' a LinkerInfo ,
1058
+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
1046
1059
}
1047
1060
1048
1061
impl < ' a > Linker for EmLinker < ' a > {
@@ -1155,7 +1168,7 @@ impl<'a> Linker for EmLinker<'a> {
1155
1168
}
1156
1169
1157
1170
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] ;
1159
1172
1160
1173
debug ! ( "EXPORTED SYMBOLS:" ) ;
1161
1174
@@ -1198,11 +1211,15 @@ impl<'a> Linker for EmLinker<'a> {
1198
1211
pub struct WasmLd < ' a > {
1199
1212
cmd : Command ,
1200
1213
sess : & ' a Session ,
1201
- info : & ' a LinkerInfo ,
1214
+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
1202
1215
}
1203
1216
1204
1217
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 > {
1206
1223
// If the atomics feature is enabled for wasm then we need a whole bunch
1207
1224
// of flags:
1208
1225
//
@@ -1235,7 +1252,7 @@ impl<'a> WasmLd<'a> {
1235
1252
cmd. arg ( "--export=__tls_align" ) ;
1236
1253
cmd. arg ( "--export=__tls_base" ) ;
1237
1254
}
1238
- WasmLd { cmd, sess, info }
1255
+ WasmLd { cmd, sess, exports }
1239
1256
}
1240
1257
}
1241
1258
@@ -1352,7 +1369,7 @@ impl<'a> Linker for WasmLd<'a> {
1352
1369
fn no_default_libraries ( & mut self ) { }
1353
1370
1354
1371
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 ( ) {
1356
1373
self . cmd . arg ( "--export" ) . arg ( & sym) ;
1357
1374
}
1358
1375
@@ -1518,7 +1535,7 @@ impl<'a> Linker for PtxLinker<'a> {
1518
1535
pub struct BpfLinker < ' a > {
1519
1536
cmd : Command ,
1520
1537
sess : & ' a Session ,
1521
- info : & ' a LinkerInfo ,
1538
+ exports : & ' a FxHashMap < CrateType , Vec < String > > ,
1522
1539
}
1523
1540
1524
1541
impl < ' a > Linker for BpfLinker < ' a > {
@@ -1609,7 +1626,7 @@ impl<'a> Linker for BpfLinker<'a> {
1609
1626
let path = tmpdir. join ( "symbols" ) ;
1610
1627
let res: io:: Result < ( ) > = try {
1611
1628
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 ( ) {
1613
1630
writeln ! ( f, "{}" , sym) ?;
1614
1631
}
1615
1632
} ;
0 commit comments