jit: Changes for LLVM 17.
authorThomas Munro <[email protected]>
Wed, 18 Oct 2023 09:15:54 +0000 (22:15 +1300)
committerThomas Munro <[email protected]>
Wed, 18 Oct 2023 16:13:23 +0000 (05:13 +1300)
Changes required by https://llvm.org/docs/NewPassManager.html.

Back-patch to 12, leaving the final release of 11 unchanged, consistent
with earlier decision not to back-patch LLVM 16 support either.

Author: Dmitry Dolgov <[email protected]>
Reviewed-by: Andres Freund <[email protected]>
Reviewed-by: Thomas Munro <[email protected]>
Discussion: https://postgr.es/m/CA%2BhUKG%2BWXznXCyTgCADd%3DHWkP9Qksa6chd7L%3DGCnZo-MBgg9Lg%40mail.gmail.com

src/backend/jit/llvm/llvmjit.c
src/backend/jit/llvm/llvmjit_wrap.cpp

index 1c8e1ab3a766ff61096f9af1d167e74b2ee6c76b..58f638859a46f37c62c421c4c8be60923ff3f519 100644 (file)
@@ -18,6 +18,9 @@
 #include <llvm-c/BitWriter.h>
 #include <llvm-c/Core.h>
 #include <llvm-c/ExecutionEngine.h>
+#if LLVM_VERSION_MAJOR > 16
+#include <llvm-c/Transforms/PassBuilder.h>
+#endif
 #if LLVM_VERSION_MAJOR > 11
 #include <llvm-c/Orc.h>
 #include <llvm-c/OrcEE.h>
 #endif
 #include <llvm-c/Support.h>
 #include <llvm-c/Target.h>
+#if LLVM_VERSION_MAJOR < 17
 #include <llvm-c/Transforms/IPO.h>
 #include <llvm-c/Transforms/PassManagerBuilder.h>
 #include <llvm-c/Transforms/Scalar.h>
 #if LLVM_VERSION_MAJOR > 6
 #include <llvm-c/Transforms/Utils.h>
 #endif
+#endif
 
 #include "jit/llvmjit.h"
 #include "jit/llvmjit_emit.h"
@@ -630,6 +635,7 @@ llvm_function_reference(LLVMJitContext *context,
 static void
 llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module)
 {
+#if LLVM_VERSION_MAJOR < 17
    LLVMPassManagerBuilderRef llvm_pmb;
    LLVMPassManagerRef llvm_mpm;
    LLVMPassManagerRef llvm_fpm;
@@ -693,6 +699,31 @@ llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module)
    LLVMDisposePassManager(llvm_mpm);
 
    LLVMPassManagerBuilderDispose(llvm_pmb);
+#else
+   LLVMPassBuilderOptionsRef options;
+   LLVMErrorRef err;
+   const char *passes;
+
+   if (context->base.flags & PGJIT_OPT3)
+       passes = "default<O3>";
+   else
+       passes = "default<O0>,mem2reg";
+
+   options = LLVMCreatePassBuilderOptions();
+
+#ifdef LLVM_PASS_DEBUG
+   LLVMPassBuilderOptionsSetDebugLogging(options, 1);
+#endif
+
+   LLVMPassBuilderOptionsSetInlinerThreshold(options, 512);
+
+   err = LLVMRunPasses(module, passes, NULL, options);
+
+   if (err)
+       elog(ERROR, "failed to JIT module: %s", llvm_error_message(err));
+
+   LLVMDisposePassBuilderOptions(options);
+#endif
 }
 
 /*
index cb896e2b6a521dc6f843b92154f4d5ba77f053c8..90a41b919123be6d7b2fe2283e08178c2fde8dee 100644 (file)
@@ -23,8 +23,14 @@ extern "C"
 
 #include <llvm/IR/Attributes.h>
 #include <llvm/IR/Function.h>
+#if LLVM_VERSION_MAJOR < 17
 #include <llvm/MC/SubtargetFeature.h>
+#endif
+#if LLVM_VERSION_MAJOR > 16
+#include <llvm/TargetParser/Host.h>
+#else
 #include <llvm/Support/Host.h>
+#endif
 
 #include "jit/llvmjit.h"