@@ -245,50 +245,37 @@ fn exported_symbols_provider_local(
245
245
) )
246
246
}
247
247
248
+ // Rust assumes that all code provided to (non-plugin) LTO comes from Rust, so it knows about
249
+ // all symbols that are involved. This doesn't hold up for symbols that get injected by LLVM,
250
+ // so they need to be special-cased.
251
+ let mut externally_injected_weak_symbols = Vec :: new ( ) ;
248
252
if tcx. sess . instrument_coverage ( ) || tcx. sess . opts . cg . profile_generate . enabled ( ) {
249
253
// These are weak symbols that point to the profile version and the
250
254
// profile name, which need to be treated as exported so LTO doesn't nix
251
255
// them.
252
- const PROFILER_WEAK_SYMBOLS : [ & str ; 2 ] =
253
- [ "__llvm_profile_raw_version" , "__llvm_profile_filename" ] ;
254
-
255
- symbols. extend ( PROFILER_WEAK_SYMBOLS . iter ( ) . map ( |sym| {
256
- let exported_symbol = ExportedSymbol :: NoDefId ( SymbolName :: new ( tcx, sym) ) ;
257
- (
258
- exported_symbol,
259
- SymbolExportInfo {
260
- level : SymbolExportLevel :: C ,
261
- kind : SymbolExportKind :: Data ,
262
- used : false ,
263
- } ,
264
- )
265
- } ) ) ;
256
+ externally_injected_weak_symbols. push ( "__llvm_profile_raw_version" ) ;
257
+ externally_injected_weak_symbols. push ( "__llvm_profile_filename" ) ;
266
258
}
267
-
268
259
if tcx. sess . opts . unstable_opts . sanitizer . contains ( SanitizerSet :: MEMORY ) {
269
- let mut msan_weak_symbols = Vec :: new ( ) ;
270
-
271
260
// Similar to profiling, preserve weak msan symbol during LTO.
272
261
if tcx. sess . opts . unstable_opts . sanitizer_recover . contains ( SanitizerSet :: MEMORY ) {
273
- msan_weak_symbols . push ( "__msan_keep_going" ) ;
262
+ externally_injected_weak_symbols . push ( "__msan_keep_going" ) ;
274
263
}
275
-
276
264
if tcx. sess . opts . unstable_opts . sanitizer_memory_track_origins != 0 {
277
- msan_weak_symbols . push ( "__msan_track_origins" ) ;
265
+ externally_injected_weak_symbols . push ( "__msan_track_origins" ) ;
278
266
}
279
-
280
- symbols. extend ( msan_weak_symbols. into_iter ( ) . map ( |sym| {
281
- let exported_symbol = ExportedSymbol :: NoDefId ( SymbolName :: new ( tcx, sym) ) ;
282
- (
283
- exported_symbol,
284
- SymbolExportInfo {
285
- level : SymbolExportLevel :: C ,
286
- kind : SymbolExportKind :: Data ,
287
- used : false ,
288
- } ,
289
- )
290
- } ) ) ;
291
267
}
268
+ symbols. extend ( externally_injected_weak_symbols. into_iter ( ) . map ( |sym| {
269
+ let exported_symbol = ExportedSymbol :: NoDefId ( SymbolName :: new ( tcx, sym) ) ;
270
+ (
271
+ exported_symbol,
272
+ SymbolExportInfo {
273
+ level : SymbolExportLevel :: C ,
274
+ kind : SymbolExportKind :: Data ,
275
+ used : false ,
276
+ } ,
277
+ )
278
+ } ) ) ;
292
279
293
280
if tcx. sess . crate_types ( ) . contains ( & CrateType :: Dylib )
294
281
|| tcx. sess . crate_types ( ) . contains ( & CrateType :: ProcMacro )
0 commit comments