@@ -251,9 +251,10 @@ class JuliaJITEventListener: public JITEventListener
251
251
virtual void NotifyFunctionEmitted (const Function &F, void *Code,
252
252
size_t Size , const EmittedFunctionDetails &Details)
253
253
{
254
+ jl_tls_states_t *ptls = jl_get_ptls_states ();
254
255
// This function modify linfo->fptr in GC safe region.
255
256
// This should be fine since the GC won't scan this field.
256
- int8_t gc_state = jl_gc_safe_enter ();
257
+ int8_t gc_state = jl_gc_safe_enter (ptls );
257
258
uv_rwlock_wrlock (&threadsafe);
258
259
StringRef sName = F.getName ();
259
260
StringMap<jl_lambda_info_t *>::iterator linfo_it = linfo_in_flight.find (sName );
@@ -274,7 +275,7 @@ class JuliaJITEventListener: public JITEventListener
274
275
const_cast <Function*>(&F)->deleteBody ();
275
276
#endif
276
277
uv_rwlock_wrunlock (&threadsafe);
277
- jl_gc_safe_leave (gc_state);
278
+ jl_gc_safe_leave (ptls, gc_state);
278
279
}
279
280
280
281
std::map<size_t , FuncInfo, revcomp>& getMap ()
@@ -309,9 +310,10 @@ class JuliaJITEventListener: public JITEventListener
309
310
virtual void NotifyObjectEmitted (const ObjectImage &obj)
310
311
#endif
311
312
{
313
+ jl_tls_states_t *ptls = jl_get_ptls_states ();
312
314
// This function modify linfo->fptr in GC safe region.
313
315
// This should be fine since the GC won't scan this field.
314
- int8_t gc_state = jl_gc_safe_enter ();
316
+ int8_t gc_state = jl_gc_safe_enter (ptls );
315
317
uv_rwlock_wrlock (&threadsafe);
316
318
#ifdef LLVM36
317
319
object::section_iterator Section = debugObj.section_begin ();
@@ -601,7 +603,7 @@ class JuliaJITEventListener: public JITEventListener
601
603
#endif
602
604
#endif
603
605
uv_rwlock_wrunlock (&threadsafe);
604
- jl_gc_safe_leave (gc_state);
606
+ jl_gc_safe_leave (ptls, gc_state);
605
607
}
606
608
607
609
// must implement if we ever start freeing code
@@ -1174,17 +1176,18 @@ int jl_DI_for_fptr(uint64_t fptr, uint64_t *symsize, int64_t *slide, int64_t *se
1174
1176
extern " C"
1175
1177
JL_DLLEXPORT jl_value_t *jl_get_dobj_data (uint64_t fptr)
1176
1178
{
1179
+ jl_tls_states_t *ptls = jl_get_ptls_states ();
1177
1180
// Used by Gallium.jl
1178
1181
const object::ObjectFile *object = NULL ;
1179
1182
DIContext *context;
1180
1183
int64_t slide, section_slide;
1181
- int8_t gc_state = jl_gc_safe_enter ();
1184
+ int8_t gc_state = jl_gc_safe_enter (ptls );
1182
1185
if (!jl_DI_for_fptr (fptr, NULL , &slide, NULL , &object, NULL ))
1183
1186
if (!jl_dylib_DI_for_fptr (fptr, &object, &context, &slide, §ion_slide, false , NULL , NULL , NULL , NULL )) {
1184
- jl_gc_safe_leave (gc_state);
1187
+ jl_gc_safe_leave (ptls, gc_state);
1185
1188
return jl_nothing;
1186
1189
}
1187
- jl_gc_safe_leave (gc_state);
1190
+ jl_gc_safe_leave (ptls, gc_state);
1188
1191
if (object == NULL )
1189
1192
return jl_nothing;
1190
1193
return (jl_value_t *)jl_ptr_to_array_1d ((jl_value_t *)jl_array_uint8_type,
@@ -1195,8 +1198,9 @@ JL_DLLEXPORT jl_value_t *jl_get_dobj_data(uint64_t fptr)
1195
1198
extern " C"
1196
1199
JL_DLLEXPORT uint64_t jl_get_section_start (uint64_t fptr)
1197
1200
{
1201
+ jl_tls_states_t *ptls = jl_get_ptls_states ();
1198
1202
// Used by Gallium.jl
1199
- int8_t gc_state = jl_gc_safe_enter ();
1203
+ int8_t gc_state = jl_gc_safe_enter (ptls );
1200
1204
std::map<size_t , ObjectInfo, revcomp> &objmap = jl_jit_events->getObjectMap ();
1201
1205
std::map<size_t , ObjectInfo, revcomp>::iterator fit = objmap.lower_bound (fptr);
1202
1206
@@ -1212,7 +1216,7 @@ JL_DLLEXPORT uint64_t jl_get_section_start(uint64_t fptr)
1212
1216
}
1213
1217
}
1214
1218
uv_rwlock_rdunlock (&threadsafe);
1215
- jl_gc_safe_leave (gc_state);
1219
+ jl_gc_safe_leave (ptls, gc_state);
1216
1220
return ret;
1217
1221
}
1218
1222
0 commit comments