[llvm] [ORC] Add opt-in per-JITDylib colocating slab allocator (PR #207970)

Jared Wyles via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 28 20:09:42 PDT 2026


================
@@ -54,9 +55,58 @@ class MapperJITLinkMemoryManager::InFlightAlloc
 };
 
 MapperJITLinkMemoryManager::MapperJITLinkMemoryManager(
-    size_t ReservationGranularity, std::unique_ptr<MemoryMapper> Mapper)
-    : ReservationUnits(ReservationGranularity), AvailableMemory(AMAllocator),
-      Mapper(std::move(Mapper)) {}
+    size_t ReservationGranularity, std::unique_ptr<MemoryMapper> Mapper,
+    bool ColocatePerJITDylib)
+    : ReservationUnits(ReservationGranularity),
+      ColocatePerJITDylib(ColocatePerJITDylib), Mapper(std::move(Mapper)) {}
+
+// Lazily creates and stores Key's pool on first access. Pools are
+// heap-allocated behind unique_ptr so the returned reference survives map
+// rehashing, and AMAllocator (declared before the pools) outlives them.
+MapperJITLinkMemoryManager::AvailableMemoryMap &
+MapperJITLinkMemoryManager::getAvailableMemory(const JITLinkDylib *Key) {
+  auto &Pool = AvailableMemoryPools[Key];
+  if (!Pool)
+    Pool = std::make_unique<AvailableMemoryMap>(AMAllocator);
+  return *Pool;
+}
+
+void MapperJITLinkMemoryManager::allowSingleSlab() {
+  OnSecondSlab = []() -> Error {
+    return make_error<StringError>(
+        "JITDylib slab exhausted (single-slab mode); enable multiple slabs to "
+        "allow growth",
+        inconvertibleErrorCode());
+  };
+}
+
+void MapperJITLinkMemoryManager::allowMultipleSlabs() {
+  OnSecondSlab = []() -> Error { return Error::success(); };
+}
+
+void MapperJITLinkMemoryManager::setOnSecondSlab(
+    unique_function<Error()> Policy) {
+  OnSecondSlab = std::move(Policy);
+}
+
+size_t MapperJITLinkMemoryManager::defaultSlabSize() {
----------------
jaredwy wrote:

This function could be constexpr. 

https://github.com/llvm/llvm-project/pull/207970


More information about the llvm-commits mailing list