LLVMJIT: Fix memory leak
We were calling `new MemoryMapper` and passing it into the `llvm::SectionMemoryManager`, but the `SectionMemoryManager` does not take ownership, resulting in a leak.
Given that the `MemoryMapper` is entirely stateless, just use a pointer to a single static instance.
Bug: b/171402030
Change-Id: Ic3a118a5f4aeea6b6b60861399993e81827c9d48
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/49488
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Reactor/LLVMJIT.cpp b/src/Reactor/LLVMJIT.cpp
index 5aa28a0..67cbbda 100644
--- a/src/Reactor/LLVMJIT.cpp
+++ b/src/Reactor/LLVMJIT.cpp
@@ -484,9 +484,6 @@
// settings and no Reactor routine directly links against another.
class JITRoutine : public rr::Routine
{
- using ObjLayer = llvm::orc::RTDyldObjectLinkingLayer;
- using CompileLayer = llvm::orc::IRCompileLayer;
-
llvm::orc::RTDyldObjectLinkingLayer objectLayer;
llvm::orc::IRCompileLayer compileLayer;
llvm::orc::MangleAndInterner mangle;
@@ -501,7 +498,10 @@
llvm::Function **funcs,
size_t count,
const rr::Config &config)
- : objectLayer(session, []() { return std::make_unique<llvm::SectionMemoryManager>(new MemoryMapper()); })
+ : objectLayer(session, []() {
+ static MemoryMapper mm;
+ return std::make_unique<llvm::SectionMemoryManager>(&mm);
+ })
, compileLayer(session, objectLayer, std::make_unique<llvm::orc::ConcurrentIRCompiler>(JITGlobals::get()->getTargetMachineBuilder(config.getOptimization().getLevel())))
, mangle(session, JITGlobals::get()->getDataLayout())
, ctx(std::make_unique<llvm::LLVMContext>())