Back-patch LLVM 14 API changes.
authorThomas Munro
Tue, 15 Mar 2022 22:35:00 +0000 (11:35 +1300)
committerThomas Munro
Tue, 15 Mar 2022 22:41:13 +0000 (11:41 +1300)
Since LLVM 14 has stopped changing and is about to be released,
back-patch the following changes from the master branch:

  e6a7600202105919bffd62b3dfd941f4a94e082b
  807fee1a39de6bb8184082012e643951abb9ad1d
  a56e7b66010f330782243de9e25ac2a6596be0e1

Back-patch to 11, where LLVM JIT support came in.

src/backend/jit/llvm/Makefile
src/backend/jit/llvm/llvmjit_error.cpp
src/backend/jit/llvm/llvmjit_inline.cpp

index 0268bd46d5c00068d6645dc9c502dcf8e29764c3..2da122a391e587f62eb5d7c48b23b1da2b957fff 100644 (file)
@@ -22,6 +22,12 @@ endif
 PGFILEDESC = "llvmjit - JIT using LLVM"
 NAME = llvmjit
 
+# LLVM 14 produces deprecation warnings.  We'll need to make some changes
+# before the relevant functions are removed, but for now silence the warnings.
+ifeq ($(GCC), yes)
+LLVM_CFLAGS += -Wno-deprecated-declarations
+endif
+
 # All files in this directory use LLVM.
 CFLAGS += $(LLVM_CFLAGS)
 CXXFLAGS += $(LLVM_CXXFLAGS)
index 7c8f3252e20b8c1917bf0ad66ebcfa4ce3018784..2182a03c9137556343deca403c54e4fb5e76233f 100644 (file)
@@ -23,15 +23,22 @@ extern "C"
 
 #include "jit/llvmjit.h"
 
+#include 
 
 static int fatal_new_handler_depth = 0;
 static std::new_handler old_new_handler = NULL;
 
 static void fatal_system_new_handler(void);
 #if LLVM_VERSION_MAJOR > 4
+static void fatal_llvm_new_handler(void *user_data, const char *reason, bool gen_crash_diag);
+#if LLVM_VERSION_MAJOR < 14
 static void fatal_llvm_new_handler(void *user_data, const std::string& reason, bool gen_crash_diag);
 #endif
+#endif
+static void fatal_llvm_error_handler(void *user_data, const char *reason, bool gen_crash_diag);
+#if LLVM_VERSION_MAJOR < 14
 static void fatal_llvm_error_handler(void *user_data, const std::string& reason, bool gen_crash_diag);
+#endif
 
 
 /*
@@ -129,23 +136,41 @@ fatal_system_new_handler(void)
 #if LLVM_VERSION_MAJOR > 4
 static void
 fatal_llvm_new_handler(void *user_data,
-                      const std::string& reason,
+                      const char *reason,
                       bool gen_crash_diag)
 {
    ereport(FATAL,
            (errcode(ERRCODE_OUT_OF_MEMORY),
             errmsg("out of memory"),
-            errdetail("While in LLVM: %s", reason.c_str())));
+            errdetail("While in LLVM: %s", reason)));
+}
+#if LLVM_VERSION_MAJOR < 14
+static void
+fatal_llvm_new_handler(void *user_data,
+                      const std::string& reason,
+                      bool gen_crash_diag)
+{
+   fatal_llvm_new_handler(user_data, reason.c_str(), gen_crash_diag);
 }
 #endif
+#endif
 
 static void
 fatal_llvm_error_handler(void *user_data,
-                        const std::string& reason,
+                        const char *reason,
                         bool gen_crash_diag)
 {
    ereport(FATAL,
            (errcode(ERRCODE_OUT_OF_MEMORY),
-            errmsg("fatal llvm error: %s",
-                   reason.c_str())));
+            errmsg("fatal llvm error: %s", reason)));
 }
+
+#if LLVM_VERSION_MAJOR < 14
+static void
+fatal_llvm_error_handler(void *user_data,
+                        const std::string& reason,
+                        bool gen_crash_diag)
+{
+   fatal_llvm_error_handler(user_data, reason.c_str(), gen_crash_diag);
+}
+#endif
index 40b18d9a0eb32b3799284d937732e7ced1c3efa8..01168cab41b443b36d03a72f931240fdff6b067d 100644 (file)
@@ -594,7 +594,11 @@ function_inlinable(llvm::Function &F,
    if (F.materialize())
        elog(FATAL, "failed to materialize metadata");
 
-   if (F.getAttributes().hasFnAttribute(llvm::Attribute::NoInline))
+#if LLVM_VERSION_MAJOR < 14
+#define hasFnAttr hasFnAttribute
+#endif
+
+   if (F.getAttributes().hasFnAttr(llvm::Attribute::NoInline))
    {
        ilog(DEBUG1, "ineligibile to import %s due to noinline",
             F.getName().data());
@@ -871,7 +875,9 @@ create_redirection_function(std::unique_ptr &importMod,
    llvm::Function *AF;
    llvm::BasicBlock *BB;
    llvm::CallInst *fwdcall;
+#if LLVM_VERSION_MAJOR < 14
    llvm::Attribute inlineAttribute;
+#endif
 
    AF = llvm::Function::Create(F->getFunctionType(),
                                LinkageTypes::AvailableExternallyLinkage,
@@ -880,9 +886,13 @@ create_redirection_function(std::unique_ptr &importMod,
 
    Builder.SetInsertPoint(BB);
    fwdcall = Builder.CreateCall(F, &*AF->arg_begin());
+#if LLVM_VERSION_MAJOR < 14
    inlineAttribute = llvm::Attribute::get(Context,
                                           llvm::Attribute::AlwaysInline);
    fwdcall->addAttribute(~0U, inlineAttribute);
+#else
+   fwdcall->addFnAttr(llvm::Attribute::AlwaysInline);
+#endif
    Builder.CreateRet(fwdcall);
 
    return AF;