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
{