@@ -14,9 +14,13 @@ use cranelift_jit::{JITBuilder, JITModule};
14
14
use crate :: { prelude:: * , BackendConfig } ;
15
15
use crate :: { CodegenCx , CodegenMode } ;
16
16
17
+ struct JitState {
18
+ backend_config : BackendConfig ,
19
+ jit_module : JITModule ,
20
+ }
21
+
17
22
thread_local ! {
18
- pub static BACKEND_CONFIG : RefCell <Option <BackendConfig >> = RefCell :: new( None ) ;
19
- pub static CURRENT_MODULE : RefCell <Option <JITModule >> = RefCell :: new( None ) ;
23
+ static LAZY_JIT_STATE : RefCell <Option <JitState >> = RefCell :: new( None ) ;
20
24
}
21
25
22
26
pub ( crate ) fn run_jit ( tcx : TyCtxt < ' _ > , backend_config : BackendConfig ) -> ! {
@@ -106,10 +110,6 @@ pub(crate) fn run_jit(tcx: TyCtxt<'_>, backend_config: BackendConfig) -> ! {
106
110
// useful as some dynamic linkers use it as a marker to jump over.
107
111
argv. push ( std:: ptr:: null ( ) ) ;
108
112
109
- BACKEND_CONFIG . with ( |tls_backend_config| {
110
- assert ! ( tls_backend_config. borrow_mut( ) . replace( backend_config) . is_none( ) )
111
- } ) ;
112
-
113
113
let start_sig = Signature {
114
114
params : vec ! [
115
115
AbiParam :: new( jit_module. target_config( ) . pointer_type( ) ) ,
@@ -121,8 +121,11 @@ pub(crate) fn run_jit(tcx: TyCtxt<'_>, backend_config: BackendConfig) -> ! {
121
121
let start_func_id = jit_module. declare_function ( "main" , Linkage :: Import , & start_sig) . unwrap ( ) ;
122
122
let finalized_start: * const u8 = jit_module. get_finalized_function ( start_func_id) ;
123
123
124
- CURRENT_MODULE
125
- . with ( |current_module| assert ! ( current_module. borrow_mut( ) . replace( jit_module) . is_none( ) ) ) ;
124
+ LAZY_JIT_STATE . with ( |lazy_jit_state| {
125
+ let mut lazy_jit_state = lazy_jit_state. borrow_mut ( ) ;
126
+ assert ! ( lazy_jit_state. is_none( ) ) ;
127
+ * lazy_jit_state = Some ( JitState { backend_config, jit_module } ) ;
128
+ } ) ;
126
129
127
130
let f: extern "C" fn ( c_int , * const * const c_char ) -> c_int =
128
131
unsafe { :: std:: mem:: transmute ( finalized_start) } ;
@@ -136,11 +139,11 @@ extern "C" fn __clif_jit_fn(instance_ptr: *const Instance<'static>) -> *const u8
136
139
// lift is used to ensure the correct lifetime for instance.
137
140
let instance = tcx. lift ( unsafe { * instance_ptr } ) . unwrap ( ) ;
138
141
139
- CURRENT_MODULE . with ( |jit_module | {
140
- let mut jit_module = jit_module . borrow_mut ( ) ;
141
- let jit_module = jit_module . as_mut ( ) . unwrap ( ) ;
142
- let backend_config =
143
- BACKEND_CONFIG . with ( | backend_config| backend_config . borrow ( ) . clone ( ) . unwrap ( ) ) ;
142
+ LAZY_JIT_STATE . with ( |lazy_jit_state | {
143
+ let mut lazy_jit_state = lazy_jit_state . borrow_mut ( ) ;
144
+ let lazy_jit_state = lazy_jit_state . as_mut ( ) . unwrap ( ) ;
145
+ let jit_module = & mut lazy_jit_state . jit_module ;
146
+ let backend_config = lazy_jit_state . backend_config . clone ( ) ;
144
147
145
148
let name = tcx. symbol_name ( instance) . name . to_string ( ) ;
146
149
let sig = crate :: abi:: get_function_sig ( tcx, jit_module. isa ( ) . triple ( ) , instance) ;
0 commit comments