Here are some systematic rules I'd like to propose to anchor this
stuff to reality and avoid future doubt and litigation:

1.  Build farm animals testing LLVM determine the set of OSes and LLVM
versions we consider.
2.  We exclude OSes that will be out of full vendor support when a
release ships.
3.  We exclude OSes that don't bless an LLVM release (eg macOS running
an arbitrarily picked version), and animals running only to cover
ancient LLVM compiled from source for coverage (Andres's sid
menagerie).

By these rules we can't require LLVM 14 for another year, because
Ubuntu and Amazon Linux are standing in the way*:

    animal     |  arch   | llvm_version |   os   | os_release | end_of_support
---------------+---------+--------------+--------+------------+----------------
 branta        | s390x   | 10.0.0       | Ubuntu | 20.04      | 2025-04-01
 splitfin      | aarch64 | 10.0.0       | Ubuntu | 20.04      | 2025-04-01
 urutau        | s390x   | 10.0.0       | Ubuntu | 20.04      | 2025-04-01
 massasauga    | aarch64 | 11.1.0       | Amazon | 2          | 2025-06-30
 snakefly      | aarch64 | 11.1.0       | Amazon | 2          | 2025-06-30
 sarus         | s390x   | 14.0.0       | Ubuntu | 22.04      | 2027-06-01
 shiner        | aarch64 | 14.0.0       | Ubuntu | 22.04      | 2027-06-01
 turbot        | aarch64 | 14.0.0       | Ubuntu | 22.04      | 2027-06-01
 lora          | s390x   | 15.0.7       | RHEL   | 9          | 2027-05-31
 mamushi       | s390x   | 15.0.7       | RHEL   | 9          | 2027-05-31
 nicator       | ppc64le | 15.0.7       | Alma   | 9          | 2027-05-31
 oystercatcher | aarch64 | 15.0.7       | Alma   | 9          | 2027-05-31

Ideally more distros would be present in this vacuum-horizon decision
table, but I don't think it'd change the conclusion: 10 is the
trailing edge.  Therefore the attached patch scales back its ambition
to that release.  Tested on LLVM 10-18.

If I pushed this we'd need to disable or upgrade the following to
avoid failure in configure on master:

   animal    |        arch        | llvm_version |   os   | os_release
| end_of_support
-------------+--------------------+--------------+--------+------------+----------------
 dragonet    | x86_64             | 3.9.1        | Debian | sid        |
 phycodurus  | x86_64             | 3.9.1        | Debian | sid        |
 desmoxytes  | x86_64             | 4.0.1        | Debian | sid        |
 petalura    | x86_64             | 4.0.1        | Debian | sid        |
 mantid      | x86_64             | 5.0.1        | CentOS | 7
| 2019-08-06
 idiacanthus | x86_64             | 5.0.2        | Debian | sid        |
 pogona      | x86_64             | 5.0.2        | Debian | sid        |
 cotinga     | s390x              | 6.0.0        | Ubuntu | 18.04
| 2023-06-01
 vimba       | aarch64            | 6.0.0        | Ubuntu | 18.04
| 2023-06-01
 komodoensis | x86_64             | 6.0.1        | Debian | sid        |
 topminnow   | mips64el; -mabi=32 | 6.0.1        | Debian | 8
| 2018-06-17
 xenodermus  | x86_64             | 6.0.1        | Debian | sid        |
 alimoche    | aarch64            | 7.0.1        | Debian | 10
| 2022-09-10
 blackneck   | aarch64            | 7.0.1        | Debian | 10
| 2022-09-10
 bonito      | ppc64le            | 7.0.1        | Fedora | 29
| 2019-11-26

*Some distros announce EOL date by month without saying which day, so
in my data collecting operation I just punched in the first of the
month, *shrug*
From 581b88879316065dab113d1512aeac7e9932b0af Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.mu...@gmail.com>
Date: Thu, 19 Oct 2023 04:45:46 +1300
Subject: [PATCH v4] jit: Require at least LLVM 10.

Remove support for older LLVM versions.  The default on common software
distributions will be at least LLVM 10 when PostgreSQL 17 ships.

Discussion: https://postgr.es/m/CA%2BhUKGLhNs5geZaVNj2EJ79Dx9W8fyWUU3HxcpZy55sMGcY%3DiA%40mail.gmail.com
---
 config/llvm.m4                          | 10 ++--
 configure                               | 43 ++---------------
 doc/src/sgml/installation.sgml          |  4 +-
 meson.build                             |  2 +-
 src/backend/jit/llvm/llvmjit.c          | 53 ++-------------------
 src/backend/jit/llvm/llvmjit_error.cpp  | 10 ----
 src/backend/jit/llvm/llvmjit_expr.c     |  6 +--
 src/backend/jit/llvm/llvmjit_inline.cpp | 38 +--------------
 src/backend/jit/llvm/llvmjit_wrap.cpp   | 61 -------------------------
 src/include/jit/llvmjit.h               | 17 -------
 src/include/pg_config.h.in              | 12 -----
 src/tools/msvc/Solution.pm              |  3 --
 12 files changed, 17 insertions(+), 242 deletions(-)

diff --git a/config/llvm.m4 b/config/llvm.m4
index 21d8cd4f90..44769d819a 100644
--- a/config/llvm.m4
+++ b/config/llvm.m4
@@ -13,7 +13,7 @@ AC_DEFUN([PGAC_LLVM_SUPPORT],
   AC_REQUIRE([AC_PROG_AWK])
 
   AC_ARG_VAR(LLVM_CONFIG, [path to llvm-config command])
-  PGAC_PATH_PROGS(LLVM_CONFIG, llvm-config llvm-config-7 llvm-config-6.0 llvm-config-5.0 llvm-config-4.0 llvm-config-3.9)
+  PGAC_PATH_PROGS(LLVM_CONFIG, llvm-config llvm-config-17 llvm-config-16 llvm-config-15 llvm-config-14 llvm-config-13 llvm-config-12 llvm-config-11 llvm-config-10)
 
   # no point continuing if llvm wasn't found
   if test -z "$LLVM_CONFIG"; then
@@ -25,14 +25,14 @@ AC_DEFUN([PGAC_LLVM_SUPPORT],
     AC_MSG_ERROR([$LLVM_CONFIG does not work])
   fi
   # and whether the version is supported
-  if echo $pgac_llvm_version | $AWK -F '.' '{ if ([$]1 >= 4 || ([$]1 == 3 && [$]2 >= 9)) exit 1; else exit 0;}';then
-    AC_MSG_ERROR([$LLVM_CONFIG version is $pgac_llvm_version but at least 3.9 is required])
+  if echo $pgac_llvm_version | $AWK -F '.' '{ if ([$]1 >= 10) exit 1; else exit 0;}';then
+    AC_MSG_ERROR([$LLVM_CONFIG version is $pgac_llvm_version but at least 10 is required])
   fi
   AC_MSG_NOTICE([using llvm $pgac_llvm_version])
 
   # need clang to create some bitcode files
   AC_ARG_VAR(CLANG, [path to clang compiler to generate bitcode])
-  PGAC_PATH_PROGS(CLANG, clang clang-7 clang-6.0 clang-5.0 clang-4.0 clang-3.9)
+  PGAC_PATH_PROGS(CLANG, clang clang-17 clang-16 clang-15 clang-14 clang-13 clang-12 clang-11 clang-10)
   if test -z "$CLANG"; then
     AC_MSG_ERROR([clang not found, but required when compiling --with-llvm, specify with CLANG=])
   fi
@@ -115,8 +115,6 @@ AC_DEFUN([PGAC_CHECK_LLVM_FUNCTIONS],
   # Check which functionality is present
   SAVE_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $LLVM_CPPFLAGS"
-  AC_CHECK_DECLS([LLVMOrcGetSymbolAddressIn], [], [], [[#include <llvm-c/OrcBindings.h>]])
-  AC_CHECK_DECLS([LLVMGetHostCPUName, LLVMGetHostCPUFeatures], [], [], [[#include <llvm-c/TargetMachine.h>]])
   AC_CHECK_DECLS([LLVMCreateGDBRegistrationListener, LLVMCreatePerfJITEventListener], [], [], [[#include <llvm-c/ExecutionEngine.h>]])
   CPPFLAGS="$SAVE_CPPFLAGS"
 ])# PGAC_CHECK_LLVM_FUNCTIONS
diff --git a/configure b/configure
index c2cb1b1b24..1f848959ef 100755
--- a/configure
+++ b/configure
@@ -5056,7 +5056,7 @@ if test "$with_llvm" = yes; then :
 
 
   if test -z "$LLVM_CONFIG"; then
-  for ac_prog in llvm-config llvm-config-7 llvm-config-6.0 llvm-config-5.0 llvm-config-4.0 llvm-config-3.9
+  for ac_prog in llvm-config llvm-config-17 llvm-config-16 llvm-config-15 llvm-config-14 llvm-config-13 llvm-config-12 llvm-config-11 llvm-config-10
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
@@ -5120,8 +5120,8 @@ fi
     as_fn_error $? "$LLVM_CONFIG does not work" "$LINENO" 5
   fi
   # and whether the version is supported
-  if echo $pgac_llvm_version | $AWK -F '.' '{ if ($1 >= 4 || ($1 == 3 && $2 >= 9)) exit 1; else exit 0;}';then
-    as_fn_error $? "$LLVM_CONFIG version is $pgac_llvm_version but at least 3.9 is required" "$LINENO" 5
+  if echo $pgac_llvm_version | $AWK -F '.' '{ if ($1 >= 10) exit 1; else exit 0;}';then
+    as_fn_error $? "$LLVM_CONFIG version is $pgac_llvm_version but at least 10 is required" "$LINENO" 5
   fi
   { $as_echo "$as_me:${as_lineno-$LINENO}: using llvm $pgac_llvm_version" >&5
 $as_echo "$as_me: using llvm $pgac_llvm_version" >&6;}
@@ -5129,7 +5129,7 @@ $as_echo "$as_me: using llvm $pgac_llvm_version" >&6;}
   # need clang to create some bitcode files
 
   if test -z "$CLANG"; then
-  for ac_prog in clang clang-7 clang-6.0 clang-5.0 clang-4.0 clang-3.9
+  for ac_prog in clang clang-17 clang-16 clang-15 clang-14 clang-13 clang-12 clang-11 clang-10
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
@@ -16573,41 +16573,6 @@ if test "$with_llvm" = yes; then
   # Check which functionality is present
   SAVE_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $LLVM_CPPFLAGS"
-  ac_fn_c_check_decl "$LINENO" "LLVMOrcGetSymbolAddressIn" "ac_cv_have_decl_LLVMOrcGetSymbolAddressIn" "#include <llvm-c/OrcBindings.h>
-"
-if test "x$ac_cv_have_decl_LLVMOrcGetSymbolAddressIn" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN $ac_have_decl
-_ACEOF
-
-  ac_fn_c_check_decl "$LINENO" "LLVMGetHostCPUName" "ac_cv_have_decl_LLVMGetHostCPUName" "#include <llvm-c/TargetMachine.h>
-"
-if test "x$ac_cv_have_decl_LLVMGetHostCPUName" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_LLVMGETHOSTCPUNAME $ac_have_decl
-_ACEOF
-ac_fn_c_check_decl "$LINENO" "LLVMGetHostCPUFeatures" "ac_cv_have_decl_LLVMGetHostCPUFeatures" "#include <llvm-c/TargetMachine.h>
-"
-if test "x$ac_cv_have_decl_LLVMGetHostCPUFeatures" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_LLVMGETHOSTCPUFEATURES $ac_have_decl
-_ACEOF
-
   ac_fn_c_check_decl "$LINENO" "LLVMCreateGDBRegistrationListener" "ac_cv_have_decl_LLVMCreateGDBRegistrationListener" "#include <llvm-c/ExecutionEngine.h>
 "
 if test "x$ac_cv_have_decl_LLVMCreateGDBRegistrationListener" = xyes; then :
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 8e0b2705d3..dc95752f89 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -965,7 +965,7 @@ build-postgresql:
          linkend="jit"/>)</phrase>.  This
          requires the <productname>LLVM</productname> library to be installed.
          The minimum required version of <productname>LLVM</productname> is
-         currently 3.9.
+         currently 10.
         </para>
         <para>
          <command>llvm-config</command><indexterm><primary>llvm-config</primary></indexterm>
@@ -2432,7 +2432,7 @@ ninja install
         condition="standalone-ignore"> (see <xref linkend="jit"/>)</phrase>.
         This requires the <productname>LLVM</productname> library to be
         installed.  The minimum required version of
-        <productname>LLVM</productname> is currently 3.9.  Disabled by
+        <productname>LLVM</productname> is currently 10.  Disabled by
         default.
        </para>
 
diff --git a/meson.build b/meson.build
index 2d516c8f37..8e43f76bdf 100644
--- a/meson.build
+++ b/meson.build
@@ -748,7 +748,7 @@ endif
 llvmopt = get_option('llvm')
 llvm = not_found_dep
 if add_languages('cpp', required: llvmopt, native: false)
-  llvm = dependency('llvm', version: '>=3.9', method: 'config-tool', required: llvmopt)
+  llvm = dependency('llvm', version: '>=10', method: 'config-tool', required: llvmopt)
 
   if llvm.found()
 
diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index 58f638859a..fcb065cec9 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -34,10 +34,8 @@
 #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"
@@ -354,10 +352,7 @@ llvm_expand_funcname(struct LLVMJitContext *context, const char *basename)
 void *
 llvm_get_function(LLVMJitContext *context, const char *funcname)
 {
-#if LLVM_VERSION_MAJOR > 11 || \
-	defined(HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN) && HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN
 	ListCell   *lc;
-#endif
 
 	llvm_assert_in_fatal_section();
 
@@ -405,7 +400,7 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 		if (addr)
 			return (void *) (uintptr_t) addr;
 	}
-#elif defined(HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN) && HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN
+#else
 	foreach(lc, context->handles)
 	{
 		LLVMOrcTargetAddress addr;
@@ -417,28 +412,6 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 		if (addr)
 			return (void *) (uintptr_t) addr;
 	}
-#elif LLVM_VERSION_MAJOR < 5
-	{
-		LLVMOrcTargetAddress addr;
-
-		if ((addr = LLVMOrcGetSymbolAddress(llvm_opt0_orc, funcname)))
-			return (void *) (uintptr_t) addr;
-		if ((addr = LLVMOrcGetSymbolAddress(llvm_opt3_orc, funcname)))
-			return (void *) (uintptr_t) addr;
-	}
-#else
-	{
-		LLVMOrcTargetAddress addr;
-
-		if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, funcname))
-			elog(ERROR, "failed to look up symbol \"%s\"", funcname);
-		if (addr)
-			return (void *) (uintptr_t) addr;
-		if (LLVMOrcGetSymbolAddress(llvm_opt3_orc, &addr, funcname))
-			elog(ERROR, "failed to look up symbol \"%s\"", funcname);
-		if (addr)
-			return (void *) (uintptr_t) addr;
-	}
 #endif
 
 	elog(ERROR, "failed to JIT: %s", funcname);
@@ -526,7 +499,7 @@ llvm_copy_attributes_at_index(LLVMValueRef v_from, LLVMValueRef v_to, uint32 ind
 	int			num_attributes;
 	LLVMAttributeRef *attrs;
 
-	num_attributes = LLVMGetAttributeCountAtIndexPG(v_from, index);
+	num_attributes = LLVMGetAttributeCountAtIndex(v_from, index);
 
 	/*
 	 * Not just for efficiency: LLVM <= 3.9 crashes when
@@ -825,7 +798,7 @@ llvm_compile_module(LLVMJitContext *context)
 
 		/* LLVMOrcLLJITAddLLVMIRModuleWithRT takes ownership of the module */
 	}
-#elif LLVM_VERSION_MAJOR > 6
+#else
 	{
 		handle->stack = compile_orc;
 		if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &handle->orc_handle, context->module,
@@ -834,26 +807,6 @@ llvm_compile_module(LLVMJitContext *context)
 
 		/* LLVMOrcAddEagerlyCompiledIR takes ownership of the module */
 	}
-#elif LLVM_VERSION_MAJOR > 4
-	{
-		LLVMSharedModuleRef smod;
-
-		smod = LLVMOrcMakeSharedModule(context->module);
-		handle->stack = compile_orc;
-		if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &handle->orc_handle, smod,
-										llvm_resolve_symbol, NULL))
-			elog(ERROR, "failed to JIT module");
-
-		LLVMOrcDisposeSharedModuleRef(smod);
-	}
-#else							/* LLVM 4.0 and 3.9 */
-	{
-		handle->stack = compile_orc;
-		handle->orc_handle = LLVMOrcAddEagerlyCompiledIR(compile_orc, context->module,
-														 llvm_resolve_symbol, NULL);
-
-		LLVMDisposeModule(context->module);
-	}
 #endif
 
 	INSTR_TIME_SET_CURRENT(endtime);
diff --git a/src/backend/jit/llvm/llvmjit_error.cpp b/src/backend/jit/llvm/llvmjit_error.cpp
index ea40f5a124..58b5959baf 100644
--- a/src/backend/jit/llvm/llvmjit_error.cpp
+++ b/src/backend/jit/llvm/llvmjit_error.cpp
@@ -29,12 +29,10 @@ 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);
@@ -65,9 +63,7 @@ llvm_enter_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		old_new_handler = std::set_new_handler(fatal_system_new_handler);
-#if LLVM_VERSION_MAJOR > 4
 		llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler);
-#endif
 		llvm::install_fatal_error_handler(fatal_llvm_error_handler);
 	}
 	fatal_new_handler_depth++;
@@ -83,9 +79,7 @@ llvm_leave_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		std::set_new_handler(old_new_handler);
-#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
-#endif
 		llvm::remove_fatal_error_handler();
 	}
 }
@@ -110,9 +104,7 @@ llvm_reset_after_error(void)
 	if (fatal_new_handler_depth != 0)
 	{
 		std::set_new_handler(old_new_handler);
-#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
-#endif
 		llvm::remove_fatal_error_handler();
 	}
 	fatal_new_handler_depth = 0;
@@ -133,7 +125,6 @@ fatal_system_new_handler(void)
 			 errdetail("while in LLVM")));
 }
 
-#if LLVM_VERSION_MAJOR > 4
 static void
 fatal_llvm_new_handler(void *user_data,
 					   const char *reason,
@@ -153,7 +144,6 @@ fatal_llvm_new_handler(void *user_data,
 	fatal_llvm_new_handler(user_data, reason.c_str(), gen_crash_diag);
 }
 #endif
-#endif
 
 static void
 fatal_llvm_error_handler(void *user_data,
diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c
index a3a0876bff..a950564afa 100644
--- a/src/backend/jit/llvm/llvmjit_expr.c
+++ b/src/backend/jit/llvm/llvmjit_expr.c
@@ -2644,12 +2644,8 @@ create_LifetimeEnd(LLVMModuleRef mod)
 	LLVMTypeRef param_types[2];
 	LLVMContextRef lc;
 
-	/* LLVM 5+ has a variadic pointer argument */
-#if LLVM_VERSION_MAJOR < 5
-	const char *nm = "llvm.lifetime.end";
-#else
+	/* variadic pointer argument */
 	const char *nm = "llvm.lifetime.end.p0i8";
-#endif
 
 	fn = LLVMGetNamedFunction(mod, nm);
 	if (fn)
diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp
index d92d7f3c88..b38f48b026 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -49,12 +49,7 @@ extern "C"
 #include <llvm/ADT/StringSet.h>
 #include <llvm/ADT/StringMap.h>
 #include <llvm/Analysis/ModuleSummaryAnalysis.h>
-#if LLVM_VERSION_MAJOR > 3
 #include <llvm/Bitcode/BitcodeReader.h>
-#else
-#include <llvm/Bitcode/ReaderWriter.h>
-#include <llvm/Support/Error.h>
-#endif
 #include <llvm/IR/Attributes.h>
 #include <llvm/IR/DebugInfo.h>
 #include <llvm/IR/IntrinsicInst.h>
@@ -267,14 +262,12 @@ llvm_build_inline_plan(LLVMContextRef lc, llvm::Module *mod)
 
 			fs = llvm::cast<llvm::FunctionSummary>(gvs);
 
-#if LLVM_VERSION_MAJOR > 3
 			if (gvs->notEligibleToImport())
 			{
 				ilog(DEBUG1, "ineligibile to import %s due to summary",
 					 symbolName.data());
 				continue;
 			}
-#endif
 
 			if ((int) fs->instCount() > inlineState.costLimit)
 			{
@@ -458,16 +451,9 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 		}
 
-#if LLVM_VERSION_MAJOR > 4
-#define IRMOVE_PARAMS , /*IsPerformingImport=*/false
-#elif LLVM_VERSION_MAJOR > 3
-#define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
-#else
-#define IRMOVE_PARAMS
-#endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
-					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
-					   IRMOVE_PARAMS))
+					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {},
+					   /*IsPerformingImport=*/false))
 			elog(FATAL, "function import failed with linker error");
 	}
 }
@@ -793,7 +779,6 @@ llvm_load_summary(llvm::StringRef path)
 	{
 		llvm::MemoryBufferRef ref(*MBOrErr.get().get());
 
-#if LLVM_VERSION_MAJOR > 3
 		llvm::Expected<std::unique_ptr<llvm::ModuleSummaryIndex> > IndexOrErr =
 			llvm::getModuleSummaryIndex(ref);
 		if (IndexOrErr)
@@ -801,15 +786,6 @@ llvm_load_summary(llvm::StringRef path)
 		elog(FATAL, "failed to load summary \"%s\": %s",
 			 path.data(),
 			 toString(IndexOrErr.takeError()).c_str());
-#else
-		llvm::ErrorOr<std::unique_ptr<llvm::ModuleSummaryIndex> > IndexOrErr =
-			llvm::getModuleSummaryIndex(ref, [](const llvm::DiagnosticInfo &) {});
-		if (IndexOrErr)
-			return std::move(IndexOrErr.get());
-		elog(FATAL, "failed to load summary \"%s\": %s",
-			 path.data(),
-			 IndexOrErr.getError().message().c_str());
-#endif
 	}
 	return nullptr;
 }
@@ -853,22 +829,12 @@ summaries_for_guid(const InlineSearchPath& path, llvm::GlobalValue::GUID guid)
 
 	for (auto index : path)
 	{
-#if LLVM_VERSION_MAJOR > 4
 		llvm::ValueInfo funcVI = index->getValueInfo(guid);
 
 		/* if index doesn't know function, we don't have a body, continue */
 		if (funcVI)
 			for (auto &gv : funcVI.getSummaryList())
 				matches.push_back(gv.get());
-#else
-		const llvm::const_gvsummary_iterator &I =
-			index->findGlobalValueSummaryList(guid);
-		if (I != index->end())
-		{
-			for (auto &gv : I->second)
-				matches.push_back(gv.get());
-		}
-#endif
 	}
 
 	return matches;
diff --git a/src/backend/jit/llvm/llvmjit_wrap.cpp b/src/backend/jit/llvm/llvmjit_wrap.cpp
index 90a41b9191..6f6ccb36c5 100644
--- a/src/backend/jit/llvm/llvmjit_wrap.cpp
+++ b/src/backend/jit/llvm/llvmjit_wrap.cpp
@@ -21,16 +21,7 @@ extern "C"
 /* Avoid macro clash with LLVM's C++ headers */
 #undef Min
 
-#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"
 
@@ -38,50 +29,6 @@ extern "C"
 /*
  * C-API extensions.
  */
-#if defined(HAVE_DECL_LLVMGETHOSTCPUNAME) && !HAVE_DECL_LLVMGETHOSTCPUNAME
-char *LLVMGetHostCPUName(void) {
-	return strdup(llvm::sys::getHostCPUName().data());
-}
-#endif
-
-
-#if defined(HAVE_DECL_LLVMGETHOSTCPUFEATURES) && !HAVE_DECL_LLVMGETHOSTCPUFEATURES
-char *LLVMGetHostCPUFeatures(void) {
-	llvm::SubtargetFeatures Features;
-	llvm::StringMap<bool> HostFeatures;
-
-	if (llvm::sys::getHostCPUFeatures(HostFeatures))
-		for (auto &F : HostFeatures)
-			Features.AddFeature(F.first(), F.second);
-
-	return strdup(Features.getString().c_str());
-}
-#endif
-
-/*
- * Like LLVM's LLVMGetAttributeCountAtIndex(), works around a bug in LLVM 3.9.
- *
- * In LLVM <= 3.9, LLVMGetAttributeCountAtIndex() segfaults if there are no
- * attributes at an index (fixed in LLVM commit ce9bb1097dc2).
- */
-unsigned
-LLVMGetAttributeCountAtIndexPG(LLVMValueRef F, uint32 Idx)
-{
-	/*
-	 * This is more expensive, so only do when using a problematic LLVM
-	 * version.
-	 */
-#if LLVM_VERSION_MAJOR < 4
-	if (!llvm::unwrap<llvm::Function>(F)->getAttributes().hasAttributes(Idx))
-		return 0;
-#endif
-
-	/*
-	 * There is no nice public API to determine the count nicely, so just
-	 * always fall back to LLVM's C API.
-	 */
-	return LLVMGetAttributeCountAtIndex(F, Idx);
-}
 
 LLVMTypeRef
 LLVMGetFunctionReturnType(LLVMValueRef r)
@@ -94,11 +41,3 @@ LLVMGetFunctionType(LLVMValueRef r)
 {
 	return llvm::wrap(llvm::unwrap<llvm::Function>(r)->getFunctionType());
 }
-
-#if LLVM_VERSION_MAJOR < 8
-LLVMTypeRef
-LLVMGlobalGetValueType(LLVMValueRef g)
-{
-	return llvm::wrap(llvm::unwrap<llvm::GlobalValue>(g)->getValueType());
-}
-#endif
diff --git a/src/include/jit/llvmjit.h b/src/include/jit/llvmjit.h
index 3ab86de3ac..e90b390bf4 100644
--- a/src/include/jit/llvmjit.h
+++ b/src/include/jit/llvmjit.h
@@ -130,26 +130,9 @@ extern LLVMValueRef slot_compile_deform(struct LLVMJitContext *context, TupleDes
  * Error handling related functions.
  ****************************************************************************
  */
-#if defined(HAVE_DECL_LLVMGETHOSTCPUNAME) && !HAVE_DECL_LLVMGETHOSTCPUNAME
-/** Get the host CPU as a string. The result needs to be disposed with
-  LLVMDisposeMessage. */
-extern char *LLVMGetHostCPUName(void);
-#endif
-
-#if defined(HAVE_DECL_LLVMGETHOSTCPUFEATURES) && !HAVE_DECL_LLVMGETHOSTCPUFEATURES
-/** Get the host CPU features as a string. The result needs to be disposed
-  with LLVMDisposeMessage. */
-extern char *LLVMGetHostCPUFeatures(void);
-#endif
-
-extern unsigned LLVMGetAttributeCountAtIndexPG(LLVMValueRef F, uint32 Idx);
 extern LLVMTypeRef LLVMGetFunctionReturnType(LLVMValueRef r);
 extern LLVMTypeRef LLVMGetFunctionType(LLVMValueRef r);
 
-#if LLVM_MAJOR_VERSION < 8
-extern LLVMTypeRef LLVMGlobalGetValueType(LLVMValueRef g);
-#endif
-
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index d8a2985567..481470ee59 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -103,18 +103,6 @@
    `LLVMCreatePerfJITEventListener', and to 0 if you don't. */
 #undef HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER
 
-/* Define to 1 if you have the declaration of `LLVMGetHostCPUFeatures', and to
-   0 if you don't. */
-#undef HAVE_DECL_LLVMGETHOSTCPUFEATURES
-
-/* Define to 1 if you have the declaration of `LLVMGetHostCPUName', and to 0
-   if you don't. */
-#undef HAVE_DECL_LLVMGETHOSTCPUNAME
-
-/* Define to 1 if you have the declaration of `LLVMOrcGetSymbolAddressIn', and
-   to 0 if you don't. */
-#undef HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN
-
 /* Define to 1 if you have the declaration of `posix_fadvise', and to 0 if you
    don't. */
 #undef HAVE_DECL_POSIX_FADVISE
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index a50f730260..5066bd9e28 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -235,9 +235,6 @@ sub GenerateFiles
 		HAVE_DECL_F_FULLFSYNC => 0,
 		HAVE_DECL_LLVMCREATEGDBREGISTRATIONLISTENER => 0,
 		HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER => 0,
-		HAVE_DECL_LLVMGETHOSTCPUNAME => 0,
-		HAVE_DECL_LLVMGETHOSTCPUFEATURES => 0,
-		HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN => 0,
 		HAVE_DECL_POSIX_FADVISE => 0,
 		HAVE_DECL_PREADV => 0,
 		HAVE_DECL_PWRITEV => 0,
-- 
2.42.0

Reply via email to