Commit 588d32cb by Nicolas Capens Committed by Nicolas Capens

Reduce the LLVM compile layer object lifetime

It's only used for compilation, so don't hang on to it for the entire lifetime of the routine. Likewise the dylib reference can be local. Bug: b/177024837 Change-Id: I261e877f983aa3ec52ef61dc6976da75a4fd5efb Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/51588Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAntonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
parent 58d987a0
...@@ -622,13 +622,6 @@ auto &Unwrap(T &&v) ...@@ -622,13 +622,6 @@ auto &Unwrap(T &&v)
// settings and no Reactor routine directly links against another. // settings and no Reactor routine directly links against another.
class JITRoutine : public rr::Routine class JITRoutine : public rr::Routine
{ {
std::string name;
llvm::orc::ExecutionSession session;
llvm::orc::RTDyldObjectLinkingLayer objectLayer;
llvm::orc::IRCompileLayer compileLayer;
llvm::orc::JITDylib &dylib;
std::vector<const void *> addresses;
public: public:
JITRoutine( JITRoutine(
std::unique_ptr<llvm::Module> module, std::unique_ptr<llvm::Module> module,
...@@ -642,8 +635,6 @@ public: ...@@ -642,8 +635,6 @@ public:
static MemoryMapper memoryMapper; static MemoryMapper memoryMapper;
return std::make_unique<llvm::SectionMemoryManager>(&memoryMapper); return std::make_unique<llvm::SectionMemoryManager>(&memoryMapper);
}) })
, compileLayer(session, objectLayer, std::make_unique<llvm::orc::ConcurrentIRCompiler>(JITGlobals::get()->getTargetMachineBuilder(config.getOptimization().getLevel())))
, dylib(Unwrap(session.createJITDylib("<routine>")))
, addresses(count) , addresses(count)
{ {
#ifdef ENABLE_RR_DEBUG_INFO #ifdef ENABLE_RR_DEBUG_INFO
...@@ -669,8 +660,6 @@ public: ...@@ -669,8 +660,6 @@ public:
objectLayer.setAutoClaimResponsibilityForObjectSymbols(true); objectLayer.setAutoClaimResponsibilityForObjectSymbols(true);
} }
dylib.addGenerator(std::make_unique<ExternalSymbolGenerator>());
llvm::SmallVector<llvm::orc::SymbolStringPtr, 8> functionNames(count); llvm::SmallVector<llvm::orc::SymbolStringPtr, 8> functionNames(count);
llvm::orc::MangleAndInterner mangle(session, JITGlobals::get()->getDataLayout()); llvm::orc::MangleAndInterner mangle(session, JITGlobals::get()->getDataLayout());
...@@ -691,11 +680,14 @@ public: ...@@ -691,11 +680,14 @@ public:
rr::AsmFile::emitAsmFile(asmFilename, JITGlobals::get()->getTargetMachineBuilder(config.getOptimization().getLevel()), *module); rr::AsmFile::emitAsmFile(asmFilename, JITGlobals::get()->getTargetMachineBuilder(config.getOptimization().getLevel()), *module);
#endif #endif
// Once the module is passed to the compileLayer, the // Once the module is passed to the compileLayer, the llvm::Functions are freed.
// llvm::Functions are freed. Make sure funcs are not referenced // Make sure funcs are not referenced after this point.
// after this point.
funcs = nullptr; funcs = nullptr;
llvm::orc::IRCompileLayer compileLayer(session, objectLayer, std::make_unique<llvm::orc::ConcurrentIRCompiler>(JITGlobals::get()->getTargetMachineBuilder(config.getOptimization().getLevel())));
llvm::orc::JITDylib &dylib(Unwrap(session.createJITDylib("<routine>")));
dylib.addGenerator(std::make_unique<ExternalSymbolGenerator>());
llvm::cantFail(compileLayer.add(dylib, llvm::orc::ThreadSafeModule(std::move(module), std::move(context)))); llvm::cantFail(compileLayer.add(dylib, llvm::orc::ThreadSafeModule(std::move(module), std::move(context))));
// Resolve the function addresses. // Resolve the function addresses.
...@@ -726,6 +718,12 @@ public: ...@@ -726,6 +718,12 @@ public:
{ {
return addresses[index]; return addresses[index];
} }
private:
std::string name;
llvm::orc::ExecutionSession session;
llvm::orc::RTDyldObjectLinkingLayer objectLayer;
std::vector<const void *> addresses;
}; };
} // anonymous namespace } // anonymous namespace
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment