C++14: Use enum class builtin hashing

Instead of casting to int for a map key.

Bug: b/147359661
Change-Id: Id777f7285f9349e7ab855c4a5a26d6a2aa4c02ba
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/39953
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index d5244a8..99c43de 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -192,10 +192,7 @@
 	           const llvm::DataLayout &dataLayout);
 	JITGlobals(const JITGlobals &) = default;
 
-	// The cache key here is actually a rr::Optimization::Level. We use int
-	// as 'enum class' types do not provide builtin hash functions until
-	// C++14. See: https://stackoverflow.com/a/29618545.
-	Cache<int, TargetMachineSPtr> targetMachines;
+	Cache<rr::Optimization::Level, TargetMachineSPtr> targetMachines;
 };
 
 JITGlobals *JITGlobals::get()
@@ -206,13 +203,15 @@
 
 JITGlobals::TargetMachineSPtr JITGlobals::getTargetMachine(rr::Optimization::Level optlevel)
 {
-	return targetMachines.getOrCreate(static_cast<int>(optlevel), [&]() {
-		return TargetMachineSPtr(llvm::EngineBuilder()
 #ifdef ENABLE_RR_DEBUG_INFO
-		                             .setOptLevel(toLLVM(rr::Optimization::Level::None))
-#else
-		                                                                 .setOptLevel(toLLVM(optlevel))
+	auto llvmOptLevel = toLLVM(rr::Optimization::Level::None);
+#else   // ENABLE_RR_DEBUG_INFO
+	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)