LLVMJIT: Remove the TargetMachine cache.

TargetMachine have internal fields mutated during compilation.
In order to support concurrent implementation, each compile needs a new TargetMachine.

Bug: b/153803432
Change-Id: I1a46d8e0193e6176c777d82ce10008afca91ec94
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/44013
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/src/Reactor/LLVMJIT.cpp b/src/Reactor/LLVMJIT.cpp
index 6dd5c48..bbd91e3 100644
--- a/src/Reactor/LLVMJIT.cpp
+++ b/src/Reactor/LLVMJIT.cpp
@@ -75,41 +75,6 @@
 
 namespace {
 
-// Cache provides a simple, thread-safe key-value store.
-template<typename KEY, typename VALUE>
-class Cache
-{
-public:
-	Cache() = default;
-	Cache(const Cache &other);
-	VALUE getOrCreate(KEY key, std::function<VALUE()> create);
-
-private:
-	mutable std::mutex mutex;  // mutable required for copy constructor.
-	std::unordered_map<KEY, VALUE> map;
-};
-
-template<typename KEY, typename VALUE>
-Cache<KEY, VALUE>::Cache(const Cache &other)
-{
-	std::unique_lock<std::mutex> lock(other.mutex);
-	map = other.map;
-}
-
-template<typename KEY, typename VALUE>
-VALUE Cache<KEY, VALUE>::getOrCreate(KEY key, std::function<VALUE()> create)
-{
-	std::unique_lock<std::mutex> lock(mutex);
-	auto it = map.find(key);
-	if(it != map.end())
-	{
-		return it->second;
-	}
-	auto value = create();
-	map.emplace(key, value);
-	return value;
-}
-
 // JITGlobals is a singleton that holds all the immutable machine specific
 // information for the host device.
 class JITGlobals
@@ -125,7 +90,7 @@
 	const llvm::TargetOptions targetOptions;
 	const llvm::DataLayout dataLayout;
 
-	TargetMachineSPtr getTargetMachine(rr::Optimization::Level optlevel);
+	TargetMachineSPtr createTargetMachine(rr::Optimization::Level optlevel);
 
 private:
 	static JITGlobals create();
@@ -136,8 +101,6 @@
 	           const llvm::TargetOptions &targetOptions,
 	           const llvm::DataLayout &dataLayout);
 	JITGlobals(const JITGlobals &) = default;
-
-	Cache<rr::Optimization::Level, TargetMachineSPtr> targetMachines;
 };
 
 JITGlobals *JITGlobals::get()
@@ -146,7 +109,7 @@
 	return &instance;
 }
 
-JITGlobals::TargetMachineSPtr JITGlobals::getTargetMachine(rr::Optimization::Level optlevel)
+JITGlobals::TargetMachineSPtr JITGlobals::createTargetMachine(rr::Optimization::Level optlevel)
 {
 #ifdef ENABLE_RR_DEBUG_INFO
 	auto llvmOptLevel = toLLVM(rr::Optimization::Level::None);
@@ -154,15 +117,13 @@
 	auto llvmOptLevel = toLLVM(optlevel);
 #endif  // ENABLE_RR_DEBUG_INFO
 
-	return targetMachines.getOrCreate(optlevel, [&]() {
-		return TargetMachineSPtr(llvm::EngineBuilder()
-		                             .setOptLevel(llvmOptLevel)
-		                             .setMCPU(mcpu)
-		                             .setMArch(march)
-		                             .setMAttrs(mattrs)
-		                             .setTargetOptions(targetOptions)
-		                             .selectTarget());
-	});
+	return TargetMachineSPtr(llvm::EngineBuilder()
+	                             .setOptLevel(llvmOptLevel)
+	                             .setMCPU(mcpu)
+	                             .setMArch(march)
+	                             .setMAttrs(mattrs)
+	                             .setTargetOptions(targetOptions)
+	                             .selectTarget());
 }
 
 JITGlobals JITGlobals::create()
@@ -618,7 +579,7 @@
 			          return;
 		          }
 	          }))
-	    , targetMachine(JITGlobals::get()->getTargetMachine(config.getOptimization().getLevel()))
+	    , targetMachine(JITGlobals::get()->createTargetMachine(config.getOptimization().getLevel()))
 	    , compileLayer(objLayer, llvm::orc::SimpleCompiler(*targetMachine))
 	    , objLayer(
 	          session,