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/+/51588
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/src/Reactor/LLVMJIT.cpp b/src/Reactor/LLVMJIT.cpp
index e6e1839..d334f7d 100644
--- a/src/Reactor/LLVMJIT.cpp
+++ b/src/Reactor/LLVMJIT.cpp
@@ -622,13 +622,6 @@
 // settings and no Reactor routine directly links against another.
 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:
 	JITRoutine(
 	    std::unique_ptr<llvm::Module> module,
@@ -642,8 +635,6 @@
 		    static MemoryMapper 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)
 	{
 #ifdef ENABLE_RR_DEBUG_INFO
@@ -669,8 +660,6 @@
 			objectLayer.setAutoClaimResponsibilityForObjectSymbols(true);
 		}
 
-		dylib.addGenerator(std::make_unique<ExternalSymbolGenerator>());
-
 		llvm::SmallVector<llvm::orc::SymbolStringPtr, 8> functionNames(count);
 		llvm::orc::MangleAndInterner mangle(session, JITGlobals::get()->getDataLayout());
 
@@ -691,11 +680,14 @@
 		rr::AsmFile::emitAsmFile(asmFilename, JITGlobals::get()->getTargetMachineBuilder(config.getOptimization().getLevel()), *module);
 #endif
 
-		// Once the module is passed to the compileLayer, the
-		// llvm::Functions are freed. Make sure funcs are not referenced
-		// after this point.
+		// Once the module is passed to the compileLayer, the llvm::Functions are freed.
+		// Make sure funcs are not referenced after this point.
 		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))));
 
 		// Resolve the function addresses.
@@ -726,6 +718,12 @@
 	{
 		return addresses[index];
 	}
+
+private:
+	std::string name;
+	llvm::orc::ExecutionSession session;
+	llvm::orc::RTDyldObjectLinkingLayer objectLayer;
+	std::vector<const void *> addresses;
 };
 
 }  // anonymous namespace