[llvm-dev] ORC JIT Weekly #42 -- JITLinkMemoryManager refactor lands, libunwind improvements, and edge visitor patterns

Lang Hames via llvm-dev llvm-dev at lists.llvm.org
Sun Oct 17 22:46:56 PDT 2021

Hi All,

The JITLInkMemoryManager refactor finally landed in [1] (though it required
a revert and a few follow-up patches to finally stick). The commit message
has the details, but the short version is that:

1. JITLinkMemoryManagers now have direct access to the LinkGraph, giving
them much greater control over JIT'd memory layout.

2. The BasicLayout type lets you ignore the LinkGraph and get back to a
segment-based view of the world if you don't care about the details (all
existing allocators were updated to use this utility in the refactor).

3. JITLinkMemoryManager::Allocation has been split into
JTILinkMemoryManager::InFlightAlloc and
JITLinkMemoryManager::FinalizedAlloc. This allows in-flight allocation data
structures to be written naturally, while FinalizedAlloc has been trimmed
down to a single uint64_t-wrapper to make tracking of JIT'd memory as
efficient as possible.

4. JITLinkMemoryManager now allows you to attach "allocation actions" to a
graph. These are wrapper function calls to be be made in the executor at
finalize and deallocate time. Allocation actions allow for registration and
deregistration of special sections (e.g. eh-frames) without making extra
IPC round-trips. This should make cross-process JITing more efficient, and
the ORC runtime easier to read.

Support for allocation actions has not been added to the ORC runtime yet,
but it's on the to-do list and I expect to get to it within the next few

Other notable contributions this week:

Peter Housel posted a review for new dynamic eh-frame registration APIs in
libunwind [2]: __unw_add_dynamic_eh_frame_section, and
__unw_remove_dynamic_eh_frame_section. When these functions are detected
the JIT will be able to use them to register EH frames in a uniform way on
both Linux and Darwin, simplifying use of libunwind on both platforms.

Stephen Fan committed a handy edge-visitor utility for JITLink [3]. This
utility makes one pass over all existing edges in a LinkGraph, applying a
variadic list of visitors to each edge. Together with his new TableManager
visitors, this results in a really succinct expression of GOT, PLT and TLV
lowering for ELF in JITLink:

Error buildTables_ELF_x86_64(LinkGraph &G) {
   GOTTableManager_ELF_x86_64 GOT;
   PLTTableManager_ELF_x86_64 PLT(GOT);
   TLSInfoTableManager_ELF_x86_64 TLSInfo;
   visitExistingEdges(G, GOT, PLT, TLSInfo);
   return Error::success();

I hope to update the MachO backends to use this utility soon. :)

Up next on my todo list: merging the TargetProcessControlTypes.h header
into OrcRTBridge. The aim will be to make OrcRTBridge the definitive header
connecting LLVM and generic ORC Runtime symbol names and types.

-- Lang.

[2] https://reviews.llvm.org/D111863
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20211017/aeb89c44/attachment.html>

More information about the llvm-dev mailing list