@@ -67,13 +67,12 @@ fn create_jit_module(
67
67
hotswap : bool ,
68
68
) -> ( JITModule , CodegenCx ) {
69
69
let crate_info = CrateInfo :: new ( tcx, "dummy_target_cpu" . to_string ( ) ) ;
70
- let imported_symbols = load_imported_symbols_for_jit ( tcx. sess , crate_info) ;
71
70
72
71
let isa = crate :: build_isa ( tcx. sess , backend_config) ;
73
72
let mut jit_builder = JITBuilder :: with_isa ( isa, cranelift_module:: default_libcall_names ( ) ) ;
74
73
jit_builder. hotswap ( hotswap) ;
75
74
crate :: compiler_builtins:: register_functions_for_jit ( & mut jit_builder) ;
76
- jit_builder. symbols ( imported_symbols ) ;
75
+ jit_builder. symbol_lookup_fn ( dep_symbol_lookup_fn ( tcx . sess , crate_info ) ) ;
77
76
jit_builder. symbol ( "__clif_jit_fn" , clif_jit_fn as * const u8 ) ;
78
77
let mut jit_module = JITModule :: new ( jit_builder) ;
79
78
@@ -286,10 +285,10 @@ fn jit_fn(instance_ptr: *const Instance<'static>, trampoline_ptr: *const u8) ->
286
285
} )
287
286
}
288
287
289
- fn load_imported_symbols_for_jit (
288
+ fn dep_symbol_lookup_fn (
290
289
sess : & Session ,
291
290
crate_info : CrateInfo ,
292
- ) -> Vec < ( String , * const u8 ) > {
291
+ ) -> Box < dyn Fn ( & str ) -> Option < * const u8 > > {
293
292
use rustc_middle:: middle:: dependency_format:: Linkage ;
294
293
295
294
let mut dylib_paths = Vec :: new ( ) ;
@@ -316,39 +315,23 @@ fn load_imported_symbols_for_jit(
316
315
}
317
316
}
318
317
319
- let mut imported_symbols = Vec :: new ( ) ;
320
- for path in dylib_paths {
321
- use object:: { Object , ObjectSymbol } ;
322
- let lib = libloading:: Library :: new ( & path) . unwrap ( ) ;
323
- let obj = std:: fs:: read ( path) . unwrap ( ) ;
324
- let obj = object:: File :: parse ( & * obj) . unwrap ( ) ;
325
- imported_symbols. extend ( obj. dynamic_symbols ( ) . filter_map ( |symbol| {
326
- let name = symbol. name ( ) . unwrap ( ) . to_string ( ) ;
327
- if name. is_empty ( ) || !symbol. is_global ( ) || symbol. is_undefined ( ) {
328
- return None ;
329
- }
330
- if name. starts_with ( "rust_metadata_" ) {
331
- // The metadata is part of a section that is not loaded by the dynamic linker in
332
- // case of cg_llvm.
333
- return None ;
334
- }
335
- let dlsym_name = if cfg ! ( target_os = "macos" ) {
336
- // On macOS `dlsym` expects the name without leading `_`.
337
- assert ! ( name. starts_with( '_' ) , "{:?}" , name) ;
338
- & name[ 1 ..]
339
- } else {
340
- & name
341
- } ;
342
- let symbol: libloading:: Symbol < ' _ , * const u8 > =
343
- unsafe { lib. get ( dlsym_name. as_bytes ( ) ) } . unwrap ( ) ;
344
- Some ( ( name, * symbol) )
345
- } ) ) ;
346
- std:: mem:: forget ( lib)
347
- }
318
+ let imported_dylibs = Box :: leak (
319
+ dylib_paths
320
+ . into_iter ( )
321
+ . map ( |path| libloading:: Library :: new ( & path) . unwrap ( ) )
322
+ . collect :: < Box < [ _ ] > > ( ) ,
323
+ ) ;
348
324
349
325
sess. abort_if_errors ( ) ;
350
326
351
- imported_symbols
327
+ Box :: new ( move |sym_name| {
328
+ for dylib in & * imported_dylibs {
329
+ if let Ok ( sym) = unsafe { dylib. get :: < * const u8 > ( sym_name. as_bytes ( ) ) } {
330
+ return Some ( * sym) ;
331
+ }
332
+ }
333
+ None
334
+ } )
352
335
}
353
336
354
337
fn codegen_shim < ' tcx > (
0 commit comments