LLVMReactor: Support LLVM 17+

Change-Id: I9263c16450f0cd68ce472f8735cefc9de0dc0d53
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/72128
Tested-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Geoff Lang <geofflang@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@google.com>
Presubmit-Ready: 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 07dc654..0f61e07 100644
--- a/src/Reactor/LLVMJIT.cpp
+++ b/src/Reactor/LLVMJIT.cpp
@@ -258,8 +258,12 @@
 #endif
 
 		// Reactor's MemorySanitizer support depends on intercepting __emutls_get_address calls.
+#if LLVM_VERSION_MAJOR < 17
 		ASSERT(!__has_feature(memory_sanitizer) || (jitTargetMachineBuilder.getOptions().ExplicitEmulatedTLS &&
 		                                            jitTargetMachineBuilder.getOptions().EmulatedTLS));
+#else
+		ASSERT(!__has_feature(memory_sanitizer) || jitTargetMachineBuilder.getOptions().EmulatedTLS);
+#endif
 
 		auto dataLayout = jitTargetMachineBuilder.getDefaultDataLayoutForTarget();
 		ASSERT_MSG(dataLayout, "JITTargetMachineBuilder::getDefaultDataLayoutForTarget() failed");
@@ -660,13 +664,25 @@
 			auto unmangled = *name;
 #endif
 
+#if LLVM_VERSION_MAJOR < 17
+			auto toSymbol = [](void *ptr) {
+				return llvm::JITEvaluatedSymbol(
+				    static_cast<llvm::JITTargetAddress>(reinterpret_cast<uintptr_t>(ptr)),
+				    llvm::JITSymbolFlags::Exported);
+			};
+#else
+			auto toSymbol = [](void *ptr) {
+				return llvm::orc::ExecutorSymbolDef{
+					llvm::orc::ExecutorAddr(reinterpret_cast<uintptr_t>(ptr)),
+					llvm::JITSymbolFlags::Exported,
+				};
+			};
+#endif
+
 			auto it = resolver.functions.find(unmangled.str());
 			if(it != resolver.functions.end())
 			{
-				symbols[name] = llvm::JITEvaluatedSymbol(
-				    static_cast<llvm::JITTargetAddress>(reinterpret_cast<uintptr_t>(it->second)),
-				    llvm::JITSymbolFlags::Exported);
-
+				symbols[name] = toSymbol(it->second);
 				continue;
 			}
 
@@ -681,10 +697,7 @@
 
 			if(address)
 			{
-				symbols[name] = llvm::JITEvaluatedSymbol(
-				    static_cast<llvm::JITTargetAddress>(reinterpret_cast<uintptr_t>(address)),
-				    llvm::JITSymbolFlags::Exported);
-
+				symbols[name] = toSymbol(address);
 				continue;
 			}
 #endif
@@ -866,7 +879,11 @@
 			}
 			else  // Successful compilation
 			{
+#if LLVM_VERSION_MAJOR < 17
 				addresses[i] = reinterpret_cast<void *>(static_cast<intptr_t>(symbol->getAddress()));
+#else
+				addresses[i] = reinterpret_cast<void *>(static_cast<intptr_t>(symbol->getAddress().getValue()));
+#endif
 			}
 		}
 
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index fde6476..aa4aaaa 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -68,6 +68,15 @@
 // for destructing objects at exit. See crbug.com/1074222
 thread_local rr::JITBuilder *jit = nullptr;
 
+auto getNumElements(llvm::FixedVectorType *vec)
+{
+#if LLVM_VERSION_MAJOR >= 11
+	return vec->getElementCount();
+#else
+	return vec->getNumElements();
+#endif
+}
+
 llvm::Value *lowerPAVG(llvm::Value *x, llvm::Value *y)
 {
 	llvm::VectorType *ty = llvm::cast<llvm::VectorType>(x->getType());
@@ -142,13 +151,8 @@
 	llvm::Constant *one;
 	if(llvm::FixedVectorType *vectorTy = llvm::dyn_cast<llvm::FixedVectorType>(ty))
 	{
-		one = llvm::ConstantVector::getSplat(
-#if LLVM_VERSION_MAJOR >= 11
-		    vectorTy->getElementCount(),
-#else
-		    vectorTy->getNumElements(),
-#endif
-		    llvm::ConstantFP::get(vectorTy->getElementType(), 1));
+		one = llvm::ConstantVector::getSplat(getNumElements(vectorTy),
+		                                     llvm::ConstantFP::get(vectorTy->getElementType(), 1));
 	}
 	else
 	{
@@ -165,39 +169,24 @@
 [[maybe_unused]] llvm::Value *lowerVectorShl(llvm::Value *x, uint64_t scalarY)
 {
 	llvm::FixedVectorType *ty = llvm::cast<llvm::FixedVectorType>(x->getType());
-	llvm::Value *y = llvm::ConstantVector::getSplat(
-#if LLVM_VERSION_MAJOR >= 11
-	    ty->getElementCount(),
-#else
-	    ty->getNumElements(),
-#endif
-	    llvm::ConstantInt::get(ty->getElementType(), scalarY));
+	llvm::Value *y = llvm::ConstantVector::getSplat(getNumElements(ty),
+	                                                llvm::ConstantInt::get(ty->getElementType(), scalarY));
 	return jit->builder->CreateShl(x, y);
 }
 
 [[maybe_unused]] llvm::Value *lowerVectorAShr(llvm::Value *x, uint64_t scalarY)
 {
 	llvm::FixedVectorType *ty = llvm::cast<llvm::FixedVectorType>(x->getType());
-	llvm::Value *y = llvm::ConstantVector::getSplat(
-#if LLVM_VERSION_MAJOR >= 11
-	    ty->getElementCount(),
-#else
-	    ty->getNumElements(),
-#endif
-	    llvm::ConstantInt::get(ty->getElementType(), scalarY));
+	llvm::Value *y = llvm::ConstantVector::getSplat(getNumElements(ty),
+	                                                llvm::ConstantInt::get(ty->getElementType(), scalarY));
 	return jit->builder->CreateAShr(x, y);
 }
 
 [[maybe_unused]] llvm::Value *lowerVectorLShr(llvm::Value *x, uint64_t scalarY)
 {
 	llvm::FixedVectorType *ty = llvm::cast<llvm::FixedVectorType>(x->getType());
-	llvm::Value *y = llvm::ConstantVector::getSplat(
-#if LLVM_VERSION_MAJOR >= 11
-	    ty->getElementCount(),
-#else
-	    ty->getNumElements(),
-#endif
-	    llvm::ConstantInt::get(ty->getElementType(), scalarY));
+	llvm::Value *y = llvm::ConstantVector::getSplat(getNumElements(ty),
+	                                                llvm::ConstantInt::get(ty->getElementType(), scalarY));
 	return jit->builder->CreateLShr(x, y);
 }
 
@@ -360,10 +349,10 @@
 llvm::Value *clampForShift(llvm::Value *rhs)
 {
 	llvm::Value *max;
-	if(auto *vec = llvm::dyn_cast<llvm::VectorType>(rhs->getType()))
+	if(auto *vec = llvm::dyn_cast<llvm::FixedVectorType>(rhs->getType()))
 	{
 		auto N = vec->getElementType()->getIntegerBitWidth() - 1;
-		max = llvm::ConstantVector::getSplat(vec->getNumElements(), llvm::ConstantInt::get(vec->getElementType(), N));
+		max = llvm::ConstantVector::getSplat(getNumElements(vec), llvm::ConstantInt::get(vec->getElementType(), N));
 	}
 	else
 	{