Skip to content

Commit 0c8c20c

Browse files
authored
Improvements to JITLink, to ease transition (#54841)
This doesn't switch the default to JITLink, but does some updates to get JITLink working (and more efficient) across all of our supported platforms. Refs #50248
2 parents ae94729 + 218edea commit 0c8c20c

File tree

6 files changed

+252
-252
lines changed

6 files changed

+252
-252
lines changed

src/cgmemmgr.cpp

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -833,28 +833,6 @@ class RTDyldMemoryManagerJL : public SectionMemoryManager {
833833
mapAddresses(Dyld, ro_alloc);
834834
mapAddresses(Dyld, exe_alloc);
835835
}
836-
#ifdef _OS_WINDOWS_
837-
template <typename Alloc>
838-
void *lookupWriteAddressFor(void *rt_addr, Alloc &&allocator)
839-
{
840-
for (auto &alloc: allocator->allocations) {
841-
if (alloc.rt_addr == rt_addr) {
842-
return alloc.wr_addr;
843-
}
844-
}
845-
return nullptr;
846-
}
847-
void *lookupWriteAddressFor(void *rt_addr)
848-
{
849-
if (!ro_alloc)
850-
return rt_addr;
851-
if (void *ptr = lookupWriteAddressFor(rt_addr, ro_alloc))
852-
return ptr;
853-
if (void *ptr = lookupWriteAddressFor(rt_addr, exe_alloc))
854-
return ptr;
855-
return rt_addr;
856-
}
857-
#endif // _OS_WINDOWS_
858836
};
859837

860838
uint8_t *RTDyldMemoryManagerJL::allocateCodeSection(uintptr_t Size,
@@ -947,13 +925,6 @@ void RTDyldMemoryManagerJL::deregisterEHFrames(uint8_t *Addr,
947925

948926
}
949927

950-
#ifdef _OS_WINDOWS_
951-
void *lookupWriteAddressFor(RTDyldMemoryManager *memmgr, void *rt_addr)
952-
{
953-
return ((RTDyldMemoryManagerJL*)memmgr)->lookupWriteAddressFor(rt_addr);
954-
}
955-
#endif
956-
957928
RTDyldMemoryManager* createRTDyldMemoryManager()
958929
{
959930
return new RTDyldMemoryManagerJL();

src/codegen.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10371,6 +10371,7 @@ static void init_jit_functions(void)
1037110371

1037210372
#ifdef _OS_WINDOWS_
1037310373
#if defined(_CPU_X86_64_)
10374+
add_named_global("__julia_personality", &__julia_personality);
1037410375
#if defined(_COMPILER_GCC_)
1037510376
add_named_global("___chkstk_ms", &___chkstk_ms);
1037610377
#else
@@ -10396,7 +10397,7 @@ static void init_jit_functions(void)
1039610397
}
1039710398

1039810399
#ifdef JL_USE_INTEL_JITEVENTS
10399-
char jl_using_intel_jitevents; // Non-zero if running under Intel VTune Amplifier
10400+
char jl_using_intel_jitevents = 0; // Non-zero if running under Intel VTune Amplifier
1040010401
#endif
1040110402

1040210403
#ifdef JL_USE_OPROFILE_JITEVENTS
@@ -10510,9 +10511,6 @@ extern "C" void jl_init_llvm(void)
1051010511
#if defined(JL_USE_INTEL_JITEVENTS) || \
1051110512
defined(JL_USE_OPROFILE_JITEVENTS) || \
1051210513
defined(JL_USE_PERF_JITEVENTS)
10513-
#ifdef JL_USE_JITLINK
10514-
#pragma message("JIT profiling support (JL_USE_*_JITEVENTS) not yet available on platforms that use JITLink")
10515-
#else
1051610514
const char *jit_profiling = getenv("ENABLE_JITPROFILING");
1051710515

1051810516
#if defined(JL_USE_INTEL_JITEVENTS)
@@ -10529,24 +10527,23 @@ extern "C" void jl_init_llvm(void)
1052910527

1053010528
#if defined(JL_USE_PERF_JITEVENTS)
1053110529
if (jit_profiling && atoi(jit_profiling)) {
10532-
jl_using_perf_jitevents= 1;
10530+
jl_using_perf_jitevents = 1;
1053310531
}
1053410532
#endif
1053510533

1053610534
#ifdef JL_USE_INTEL_JITEVENTS
1053710535
if (jl_using_intel_jitevents)
10538-
jl_ExecutionEngine->RegisterJITEventListener(JITEventListener::createIntelJITEventListener());
10536+
jl_ExecutionEngine->enableIntelJITEventListener();
1053910537
#endif
1054010538

1054110539
#ifdef JL_USE_OPROFILE_JITEVENTS
1054210540
if (jl_using_oprofile_jitevents)
10543-
jl_ExecutionEngine->RegisterJITEventListener(JITEventListener::createOProfileJITEventListener());
10541+
jl_ExecutionEngine->enableOProfileJITEventListener();
1054410542
#endif
1054510543

1054610544
#ifdef JL_USE_PERF_JITEVENTS
1054710545
if (jl_using_perf_jitevents)
10548-
jl_ExecutionEngine->RegisterJITEventListener(JITEventListener::createPerfJITEventListener());
10549-
#endif
10546+
jl_ExecutionEngine->enablePerfJITEventListener();
1055010547
#endif
1055110548
#endif
1055210549

src/debug-registry.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ class JITDebugInfoRegistry
145145
void add_code_in_flight(llvm::StringRef name, jl_code_instance_t *codeinst, const llvm::DataLayout &DL) JL_NOTSAFEPOINT;
146146
jl_method_instance_t *lookupLinfo(size_t pointer) JL_NOTSAFEPOINT;
147147
void registerJITObject(const llvm::object::ObjectFile &Object,
148-
std::function<uint64_t(const llvm::StringRef &)> getLoadAddress,
149-
std::function<void*(void*)> lookupWriteAddress);
148+
std::function<uint64_t(const llvm::StringRef &)> getLoadAddress);
150149
objectmap_t& getObjectMap() JL_NOTSAFEPOINT;
151150
void add_image_info(image_info_t info) JL_NOTSAFEPOINT;
152151
bool get_image_info(uint64_t base, image_info_t *info) const JL_NOTSAFEPOINT;

src/debuginfo.cpp

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,21 @@ static void create_PRUNTIME_FUNCTION(uint8_t *Code, size_t Size, StringRef fnnam
223223
#endif
224224

225225
void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
226-
std::function<uint64_t(const StringRef &)> getLoadAddress,
227-
std::function<void*(void*)> lookupWriteAddress)
226+
std::function<uint64_t(const StringRef &)> getLoadAddress)
228227
{
229228
object::section_iterator EndSection = Object.section_end();
230229

230+
bool anyfunctions = false;
231+
for (const object::SymbolRef &sym_iter : Object.symbols()) {
232+
object::SymbolRef::Type SymbolType = cantFail(sym_iter.getType());
233+
if (SymbolType != object::SymbolRef::ST_Function)
234+
continue;
235+
anyfunctions = true;
236+
break;
237+
}
238+
if (!anyfunctions)
239+
return;
240+
231241
#ifdef _CPU_ARM_
232242
// ARM does not have/use .eh_frame
233243
uint64_t arm_exidx_addr = 0;
@@ -281,14 +291,13 @@ void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
281291
#if defined(_OS_WINDOWS_)
282292
uint64_t SectionAddrCheck = 0;
283293
uint64_t SectionLoadCheck = 0; (void)SectionLoadCheck;
284-
uint64_t SectionWriteCheck = 0; (void)SectionWriteCheck;
285294
uint8_t *UnwindData = NULL;
286295
#if defined(_CPU_X86_64_)
287296
uint8_t *catchjmp = NULL;
288297
for (const object::SymbolRef &sym_iter : Object.symbols()) {
289298
StringRef sName = cantFail(sym_iter.getName());
290299
if (sName.equals("__UnwindData") || sName.equals("__catchjmp")) {
291-
uint64_t Addr = cantFail(sym_iter.getAddress());
300+
uint64_t Addr = cantFail(sym_iter.getAddress()); // offset into object (including section offset)
292301
auto Section = cantFail(sym_iter.getSection());
293302
assert(Section != EndSection && Section->isText());
294303
uint64_t SectionAddr = Section->getAddress();
@@ -300,10 +309,7 @@ void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
300309
SectionLoadCheck == SectionLoadAddr);
301310
SectionAddrCheck = SectionAddr;
302311
SectionLoadCheck = SectionLoadAddr;
303-
SectionWriteCheck = SectionLoadAddr;
304-
if (lookupWriteAddress)
305-
SectionWriteCheck = (uintptr_t)lookupWriteAddress((void*)SectionLoadAddr);
306-
Addr += SectionWriteCheck - SectionLoadCheck;
312+
Addr += SectionLoadAddr - SectionAddr;
307313
if (sName.equals("__UnwindData")) {
308314
UnwindData = (uint8_t*)Addr;
309315
}
@@ -314,25 +320,7 @@ void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
314320
}
315321
assert(catchjmp);
316322
assert(UnwindData);
317-
assert(SectionAddrCheck);
318323
assert(SectionLoadCheck);
319-
assert(!memcmp(catchjmp, "\0\0\0\0\0\0\0\0\0\0\0\0", 12) &&
320-
!memcmp(UnwindData, "\0\0\0\0\0\0\0\0\0\0\0\0", 12));
321-
catchjmp[0] = 0x48;
322-
catchjmp[1] = 0xb8; // mov RAX, QWORD PTR [&__julia_personality]
323-
*(uint64_t*)(&catchjmp[2]) = (uint64_t)&__julia_personality;
324-
catchjmp[10] = 0xff;
325-
catchjmp[11] = 0xe0; // jmp RAX
326-
UnwindData[0] = 0x09; // version info, UNW_FLAG_EHANDLER
327-
UnwindData[1] = 4; // size of prolog (bytes)
328-
UnwindData[2] = 2; // count of unwind codes (slots)
329-
UnwindData[3] = 0x05; // frame register (rbp) = rsp
330-
UnwindData[4] = 4; // second instruction
331-
UnwindData[5] = 0x03; // mov RBP, RSP
332-
UnwindData[6] = 1; // first instruction
333-
UnwindData[7] = 0x50; // push RBP
334-
*(DWORD*)&UnwindData[8] = (DWORD)(catchjmp - (uint8_t*)SectionWriteCheck); // relative location of catchjmp
335-
UnwindData -= SectionWriteCheck - SectionLoadCheck;
336324
#endif // defined(_OS_X86_64_)
337325
#endif // defined(_OS_WINDOWS_)
338326

@@ -353,7 +341,7 @@ void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
353341
uint64_t SectionAddr = Section->getAddress();
354342
StringRef secName = cantFail(Section->getName());
355343
uint64_t SectionLoadAddr = getLoadAddress(secName);
356-
Addr -= SectionAddr - SectionLoadAddr;
344+
Addr += SectionLoadAddr - SectionAddr;
357345
StringRef sName = cantFail(sym_iter.getName());
358346
uint64_t SectionSize = Section->getSize();
359347
size_t Size = sym_size.second;
@@ -404,10 +392,9 @@ void JITDebugInfoRegistry::registerJITObject(const object::ObjectFile &Object,
404392
}
405393

406394
void jl_register_jit_object(const object::ObjectFile &Object,
407-
std::function<uint64_t(const StringRef &)> getLoadAddress,
408-
std::function<void *(void *)> lookupWriteAddress)
395+
std::function<uint64_t(const StringRef &)> getLoadAddress)
409396
{
410-
getJITDebugRegistry().registerJITObject(Object, getLoadAddress, lookupWriteAddress);
397+
getJITDebugRegistry().registerJITObject(Object, getLoadAddress);
411398
}
412399

413400
// TODO: convert the safe names from aotcomile.cpp:makeSafeName back into symbols

0 commit comments

Comments
 (0)