Reland “Make Reactor buildable with LLVM 18”
Relevant LLVM API changes:
https://github.com/llvm/llvm-project/pull/66295
https://github.com/llvm/llvm-project/pull/71029
https://github.com/llvm/llvm-project/pull/74261
This reverts commit fefba0024aa6cecf17fb26fe44c0f59aa1c59734.
Change-Id: I2389e8a777d010eb4200b5c4d97b88834d066a43
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/75428
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Shahbaz Youssefi <syoussefi@google.com>
Reviewed-by: Geoff Lang <geofflang@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@google.com>
diff --git a/src/Reactor/LLVMJIT.cpp b/src/Reactor/LLVMJIT.cpp
index 262c69e..6db6ca1 100644
--- a/src/Reactor/LLVMJIT.cpp
+++ b/src/Reactor/LLVMJIT.cpp
@@ -47,7 +47,11 @@
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/CommandLine.h"
+#if LLVM_VERSION_MAJOR >= 18
+#include "llvm/TargetParser/Host.h"
+#else
#include "llvm/Support/Host.h"
+#endif
#include "llvm/Support/TargetSelect.h"
#include "llvm/Transforms/InstCombine/InstCombine.h"
#include "llvm/Transforms/Instrumentation/AddressSanitizer.h"
@@ -73,6 +77,12 @@
# include "llvm/Transforms/IPO.h"
#endif
+#if LLVM_VERSION_MAJOR < 18
+using LLVMOptLevel = llvm::CodeGenOpt::Level;
+#else
+using LLVMOptLevel = llvm::CodeGenOptLevel;
+#endif
+
#ifdef _MSC_VER
__pragma(warning(pop))
#endif
@@ -190,7 +200,7 @@
private:
JITGlobals(llvm::orc::JITTargetMachineBuilder &&jitTargetMachineBuilder, llvm::DataLayout &&dataLayout);
- static llvm::CodeGenOpt::Level toLLVM(int level);
+ static LLVMOptLevel toLLVM(int level);
const llvm::orc::JITTargetMachineBuilder jitTargetMachineBuilder;
const llvm::DataLayout dataLayout;
@@ -303,26 +313,30 @@
{
}
-llvm::CodeGenOpt::Level JITGlobals::toLLVM(int level)
+LLVMOptLevel JITGlobals::toLLVM(int level)
{
+#if LLVM_VERSION_MAJOR < 18
+#define CodeGenOptLevel CodeGenOpt
+#endif
// TODO(b/173257647): MemorySanitizer instrumentation produces IR which takes
// a lot longer to process by the machine code optimization passes. Disabling
// them has a negligible effect on code quality but compiles much faster.
if(__has_feature(memory_sanitizer))
{
- return llvm::CodeGenOpt::None;
+ return llvm::CodeGenOptLevel::None;
}
switch(level)
{
- case 0: return llvm::CodeGenOpt::None;
- case 1: return llvm::CodeGenOpt::Less;
- case 2: return llvm::CodeGenOpt::Default;
- case 3: return llvm::CodeGenOpt::Aggressive;
+ case 0: return llvm::CodeGenOptLevel::None;
+ case 1: return llvm::CodeGenOptLevel::Less;
+ case 2: return llvm::CodeGenOptLevel::Default;
+ case 3: return llvm::CodeGenOptLevel::Aggressive;
default: UNREACHABLE("Unknown Optimization Level %d", int(level));
}
- return llvm::CodeGenOpt::Default;
+ return llvm::CodeGenOptLevel::Default;
+#undef CodeGenOptLevel
}
class MemoryMapper final : public llvm::SectionMemoryManager::MemoryMapper
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index dda6d91..62b4009 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -59,6 +59,12 @@
} // namespace llvm
#endif
+#if LLVM_VERSION_MAJOR >= 18
+#define our_getInt8PtrTy llvm::PointerType::getUnqual
+#else
+#define our_getInt8PtrTy llvm::Type::getInt8PtrTy
+#endif
+
namespace {
// Used to automatically invoke llvm_shutdown() when driver is unloaded
@@ -3782,7 +3788,7 @@
void VPrintf(const std::vector<Value *> &vals)
{
auto i32Ty = llvm::Type::getInt32Ty(*jit->context);
- auto i8PtrTy = llvm::Type::getInt8PtrTy(*jit->context);
+ auto i8PtrTy = our_getInt8PtrTy(*jit->context);
auto funcTy = llvm::FunctionType::get(i32Ty, { i8PtrTy }, true);
auto func = jit->module->getOrInsertFunction("rr::DebugPrintf", funcTy);
jit->builder->CreateCall(func, V(vals));
@@ -3851,7 +3857,7 @@
auto i1Ty = llvm::Type::getInt1Ty(*jit->context);
auto i8Ty = llvm::Type::getInt8Ty(*jit->context);
auto i32Ty = llvm::Type::getInt32Ty(*jit->context);
- auto i8PtrTy = llvm::Type::getInt8PtrTy(*jit->context);
+ auto i8PtrTy = our_getInt8PtrTy(*jit->context);
auto promiseTy = jit->coroutine.yieldType;
auto promisePtrTy = promiseTy->getPointerTo();
@@ -4016,7 +4022,7 @@
// coroutine.
auto voidTy = llvm::Type::getVoidTy(*jit->context);
auto i1Ty = llvm::Type::getInt1Ty(*jit->context);
- auto i8PtrTy = llvm::Type::getInt8PtrTy(*jit->context);
+ auto i8PtrTy = our_getInt8PtrTy(*jit->context);
auto handleTy = i8PtrTy;
auto boolTy = i1Ty;
auto promiseTy = T(YieldType);