Skip to content

Commit 513481e

Browse files
committed
re-enable generic RegisterJITEventListener for the Julia OrcJIT
the NonOwningBinary class is a special adaptor that behaves like OwningBinary<object::ObjectFile>, but which expects to be able to reuse the object file and that ownership will be maintained elsewhere allowing for getObjectForDebug to return the same object to all consumers
1 parent 707430a commit 513481e

File tree

4 files changed

+70
-166
lines changed

4 files changed

+70
-166
lines changed

src/codegen.cpp

+3-10
Original file line numberDiff line numberDiff line change
@@ -1410,9 +1410,6 @@ const jl_value_t *jl_dump_function_asm(void *f, int raw_mc)
14101410
}
14111411

14121412
if (raw_mc) {
1413-
#ifdef LLVM37
1414-
jl_cleanup_DI(context);
1415-
#endif
14161413
return (jl_value_t*)jl_pchar_to_array((char*)fptr, symsize);
14171414
}
14181415

@@ -1428,10 +1425,7 @@ const jl_value_t *jl_dump_function_asm(void *f, int raw_mc)
14281425
#endif
14291426
);
14301427

1431-
#ifdef LLVM37
1432-
if (isJIT)
1433-
jl_cleanup_DI(context);
1434-
#else
1428+
#ifndef LLVM37
14351429
fstream.flush();
14361430
#endif
14371431

@@ -5843,8 +5837,8 @@ extern "C" void jl_init_codegen(void)
58435837
jl_setup_module(m);
58445838
init_julia_llvm_env(m);
58455839

5846-
#ifndef USE_ORCJIT
5847-
jl_ExecutionEngine->RegisterJITEventListener(CreateJuliaJITEventListener());
5840+
jl_ExecutionEngine->RegisterJITEventListener(
5841+
CreateJuliaJITEventListener());
58485842
#ifdef JL_USE_INTEL_JITEVENTS
58495843
if (jl_using_intel_jitevents)
58505844
jl_ExecutionEngine->RegisterJITEventListener(
@@ -5856,7 +5850,6 @@ extern "C" void jl_init_codegen(void)
58565850
jl_ExecutionEngine->RegisterJITEventListener(
58575851
JITEventListener::createOProfileJITEventListener());
58585852
#endif // JL_USE_OPROFILE_JITEVENTS
5859-
#endif
58605853

58615854
BOX_F(int8,int8); UBOX_F(uint8,uint8);
58625855
BOX_F(int16,int16); UBOX_F(uint16,uint16);

src/codegen_internal.h

-5
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,8 @@ extern int jl_DI_for_fptr(uint64_t fptr, uint64_t *symsize, int64_t *slide, int6
2727
extern bool jl_dylib_DI_for_fptr(size_t pointer, const object::ObjectFile **object, llvm::DIContext **context, int64_t *slide, int64_t *section_slide,
2828
bool onlySysImg, bool *isSysImg, void **saddr, char **name, char **filename);
2929

30-
#ifdef USE_MCJIT
31-
extern void jl_cleanup_DI(llvm::DIContext *context);
32-
#endif
33-
3430
#ifdef USE_ORCJIT
3531
extern JL_DLLEXPORT void ORCNotifyObjectEmitted(JITEventListener *Listener,
3632
const object::ObjectFile &obj,
37-
const object::ObjectFile &debugObj,
3833
const RuntimeDyld::LoadedObjectInfo &L);
3934
#endif

src/debuginfo.cpp

+8-43
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,8 @@ struct ObjectInfo {
9191
const object::ObjectFile *object;
9292
size_t SectionSize;
9393
ptrdiff_t slide;
94-
#ifdef LLVM39
94+
#ifdef LLVM37
9595
DIContext *context;
96-
#elif defined(LLVM37)
97-
const llvm::LoadedObjectInfo *L;
9896
#endif
9997
#if defined(_OS_DARWIN_) && !defined(LLVM37)
10098
const char *name;
@@ -273,29 +271,25 @@ class JuliaJITEventListener: public JITEventListener
273271
return NULL;
274272
}
275273
#ifdef LLVM36
276-
277274
virtual void NotifyObjectEmitted(const object::ObjectFile &obj,
278275
const RuntimeDyld::LoadedObjectInfo &L)
279-
{
280-
return _NotifyObjectEmitted(obj,obj,L);
281-
}
282-
283-
virtual void _NotifyObjectEmitted(const object::ObjectFile &obj,
284-
const object::ObjectFile &debugObj,
285-
const RuntimeDyld::LoadedObjectInfo &L)
286276
#else
287277
virtual void NotifyObjectEmitted(const ObjectImage &obj)
288278
#endif
289279
{
290280
int8_t gc_state = jl_gc_safe_enter();
291281
uv_rwlock_wrlock(&threadsafe);
292282
jl_gc_safe_leave(gc_state);
283+
293284
#ifdef LLVM36
285+
const object::OwningBinary<object::ObjectFile> &debugObjOwner = L.getObjectForDebug(obj);
286+
const object::ObjectFile &debugObj =
287+
(debugObjOwner.getBinary() ? *debugObjOwner.getBinary() : obj);
294288
object::section_iterator Section = debugObj.section_begin();
295289
object::section_iterator EndSection = debugObj.section_end();
296290
#else
297-
object::section_iterator Section = debugObj.begin_sections();
298-
object::section_iterator EndSection = debugObj.end_sections();
291+
object::section_iterator Section = obj.begin_sections();
292+
object::section_iterator EndSection = obj.end_sections();
299293
#endif
300294

301295
#ifdef LLVM38
@@ -444,11 +438,7 @@ class JuliaJITEventListener: public JITEventListener
444438
ObjectInfo tmp = {&debugObj,
445439
(size_t)SectionSize,
446440
(ptrdiff_t)(SectionAddr - SectionLoadAddr),
447-
#ifdef LLVM39
448441
new DWARFContextInMemory(debugObj, &L),
449-
#else
450-
L.clone().release(),
451-
#endif
452442
};
453443
objectmap[SectionLoadAddr] = tmp;
454444
first = false;
@@ -524,11 +514,6 @@ class JuliaJITEventListener: public JITEventListener
524514
#endif
525515
ObjectInfo tmp = {objfile, (size_t)Size,
526516
(ptrdiff_t)(SectionAddr - SectionLoadAddr),
527-
#ifdef LLVM39
528-
new DWARFContextInMemory(*objfile, &L),
529-
#elif defined(LLVM37)
530-
L.clone().release(),
531-
#endif
532517
#ifdef _OS_DARWIN_
533518
strndup(sName.data(), sName.size()),
534519
#endif
@@ -568,16 +553,6 @@ class JuliaJITEventListener: public JITEventListener
568553
#endif // USE_MCJIT
569554
};
570555

571-
#ifdef USE_ORCJIT
572-
JL_DLLEXPORT void ORCNotifyObjectEmitted(JITEventListener *Listener,
573-
const object::ObjectFile &obj,
574-
const object::ObjectFile &debugObj,
575-
const RuntimeDyld::LoadedObjectInfo &L)
576-
{
577-
((JuliaJITEventListener*)Listener)->_NotifyObjectEmitted(obj,debugObj,L);
578-
}
579-
#endif
580-
581556
extern "C"
582557
char *jl_demangle(const char *name)
583558
{
@@ -1045,10 +1020,8 @@ int jl_DI_for_fptr(uint64_t fptr, uint64_t *symsize, int64_t *slide, int64_t *se
10451020
*section_slide = fit->second.slide;
10461021
*object = fit->second.object;
10471022
if (context) {
1048-
#if defined(LLVM39)
1023+
#if defined(LLVM37)
10491024
*context = fit->second.context;
1050-
#elif defined(LLVM37)
1051-
*context = new DWARFContextInMemory(*fit->second.object, fit->second.L);
10521025
#else
10531026
*context = DIContext::getDWARFContext(*fit->second.object);
10541027
#endif
@@ -1100,13 +1073,6 @@ JL_DLLEXPORT uint64_t jl_get_section_start(uint64_t fptr)
11001073

11011074
#endif
11021075

1103-
void jl_cleanup_DI(llvm::DIContext *context)
1104-
{
1105-
#ifndef LLVM39
1106-
delete context;
1107-
#endif
1108-
}
1109-
11101076
// Set *name and *filename to either NULL or malloc'd string
11111077
void jl_getFunctionInfo(char **name, char **filename, size_t *line,
11121078
char **inlinedat_file, size_t *inlinedat_line, jl_lambda_info_t **outer_linfo,
@@ -1130,7 +1096,6 @@ void jl_getFunctionInfo(char **name, char **filename, size_t *line,
11301096
if (jl_DI_for_fptr(pointer, &symsize, &slide, NULL, &object, &context)) {
11311097
*outer_linfo = jl_jit_events->lookupLinfo(pointer);
11321098
lookup_pointer(context, name, line, filename, inlinedat_line, inlinedat_file, pointer+slide, 1, fromC);
1133-
jl_cleanup_DI(context);
11341099
return;
11351100
}
11361101
#else // !USE_MCJIT

0 commit comments

Comments
 (0)