1
1
use std:: ffi:: CString ;
2
2
use std:: sync:: Arc ;
3
3
4
+ use rustc_ast:: expand:: allocator:: AllocatorKind ;
4
5
use rustc_data_structures:: memmap:: Mmap ;
5
6
use rustc_hir:: def_id:: { CrateNum , LOCAL_CRATE } ;
6
7
use rustc_middle:: middle:: exported_symbols:: { ExportedSymbol , SymbolExportInfo , SymbolExportLevel } ;
@@ -10,6 +11,7 @@ use tracing::info;
10
11
11
12
use crate :: back:: symbol_export:: { self , symbol_name_for_instance_in_crate} ;
12
13
use crate :: back:: write:: CodegenContext ;
14
+ use crate :: base:: allocator_kind_for_codegen;
13
15
use crate :: errors:: { DynamicLinkingWithLTO , LtoDisallowed , LtoDylib , LtoProcMacro } ;
14
16
use crate :: traits:: * ;
15
17
@@ -94,6 +96,19 @@ pub(super) fn exported_symbols_for_lto(
94
96
. filter_map ( |& ( s, info) : & ( ExportedSymbol < ' _ > , SymbolExportInfo ) | {
95
97
if info. level . is_below_threshold ( export_threshold) || info. used {
96
98
Some ( symbol_name_for_instance_in_crate ( tcx, s, cnum) )
99
+ } else if export_threshold == SymbolExportLevel :: C
100
+ && info. rustc_std_internal_symbol
101
+ && let Some ( AllocatorKind :: Default ) = allocator_kind_for_codegen ( tcx)
102
+ {
103
+ // Export the __rdl_* exports for usage by the allocator shim when not using
104
+ // #[global_allocator]. Most of the conditions above are only used to avoid
105
+ // unnecessary expensive symbol_name_for_instance_in_crate calls.
106
+ let sym = symbol_name_for_instance_in_crate ( tcx, s, cnum) ;
107
+ if sym. contains ( "__rdl_" ) || sym. contains ( "__rg_oom" ) {
108
+ Some ( sym)
109
+ } else {
110
+ None
111
+ }
97
112
} else {
98
113
None
99
114
}
0 commit comments