From 4296205aca732668fb64f8a5e11bd95524b5f15e Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Fri, 20 Oct 2023 15:13:26 +1300
Subject: [PATCH v2 2/2] jit: Use opaque pointers in all supported LLVM
 versions.

Historically we adapted to different LLVM API changes when forced to by
new LLVM releases, but we tried to avoid changing how we interacted with
already-released LLVM versions, because we needed to back-patch into our
release branches and we wanted to keep them as stable as possible.  For
PostgreSQL 17, having dropped support for LLVM versions < 14, let's be
more aggressive and adopt LLVM opaque pointers everywhere for tidier and
more consistent code.

Discussions: https://postgr.es/m/CA%2BhUKGLhNs5geZaVNj2EJ79Dx9W8fyWUU3HxcpZy55sMGcY%3DiA%40mail.gmail.com
---
 configure                        | 89 --------------------------------
 configure.ac                     |  3 --
 src/backend/jit/llvm/llvmjit.c   | 13 -----
 src/backend/jit/llvm/meson.build |  3 --
 src/include/jit/llvmjit_emit.h   | 16 ------
 5 files changed, 124 deletions(-)

diff --git a/configure b/configure
index f4a04485e1..b026e2e935 100755
--- a/configure
+++ b/configure
@@ -7560,95 +7560,6 @@ if test x"$pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard" = x"yes";
 fi
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -Xclang -no-opaque-pointers, for BITCODE_CFLAGS" >&5
-$as_echo_n "checking whether ${CLANG} supports -Xclang -no-opaque-pointers, for BITCODE_CFLAGS... " >&6; }
-if ${pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  pgac_save_CFLAGS=$CFLAGS
-pgac_save_CC=$CC
-CC=${CLANG}
-CFLAGS="${BITCODE_CFLAGS} -Xclang -no-opaque-pointers"
-ac_save_c_werror_flag=$ac_c_werror_flag
-ac_c_werror_flag=yes
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers=yes
-else
-  pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_c_werror_flag=$ac_save_c_werror_flag
-CFLAGS="$pgac_save_CFLAGS"
-CC="$pgac_save_CC"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" >&5
-$as_echo "$pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" >&6; }
-if test x"$pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" = x"yes"; then
-  BITCODE_CFLAGS="${BITCODE_CFLAGS} -Xclang -no-opaque-pointers"
-fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -Xclang -no-opaque-pointers, for BITCODE_CXXFLAGS" >&5
-$as_echo_n "checking whether ${CLANGXX} supports -Xclang -no-opaque-pointers, for BITCODE_CXXFLAGS... " >&6; }
-if ${pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  pgac_save_CXXFLAGS=$CXXFLAGS
-pgac_save_CXX=$CXX
-CXX=${CLANGXX}
-CXXFLAGS="${BITCODE_CXXFLAGS} -Xclang -no-opaque-pointers"
-ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-ac_cxx_werror_flag=yes
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers=yes
-else
-  pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-CXXFLAGS="$pgac_save_CXXFLAGS"
-CXX="$pgac_save_CXX"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" >&5
-$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" >&6; }
-if test x"$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" = x"yes"; then
-  BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -Xclang -no-opaque-pointers"
-fi
-
-
   NOT_THE_CFLAGS=""
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -Wunused-command-line-argument, for NOT_THE_CFLAGS" >&5
 $as_echo_n "checking whether ${CLANG} supports -Wunused-command-line-argument, for NOT_THE_CFLAGS... " >&6; }
diff --git a/configure.ac b/configure.ac
index 440b08d113..2947d0d37a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -649,9 +649,6 @@ if test "$with_llvm" = yes ; then
   PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-fexcess-precision=standard])
   PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANGXX, BITCODE_CXXFLAGS, [-fexcess-precision=standard])
 
-  PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-Xclang -no-opaque-pointers])
-  PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANGXX, BITCODE_CXXFLAGS, [-Xclang -no-opaque-pointers])
-
   NOT_THE_CFLAGS=""
   PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, NOT_THE_CFLAGS, [-Wunused-command-line-argument])
   if test -n "$NOT_THE_CFLAGS"; then
diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index d31e4759a6..a3a44e13e9 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -809,19 +809,6 @@ llvm_session_initialize(void)
 		llvm_llvm_context_reuse_count = 0;
 	}
 
-	/*
-	 * When targeting LLVM 15, turn off opaque pointers for the context we
-	 * build our code in.  We don't need to do so for other contexts (e.g.
-	 * llvm_ts_context).  Once the IR is generated, it carries the necessary
-	 * information.
-	 *
-	 * For 16 and above, opaque pointers must be used, and we have special
-	 * code for that.
-	 */
-#if LLVM_VERSION_MAJOR == 15
-	LLVMContextSetOpaquePointers(LLVMGetGlobalContext(), false);
-#endif
-
 	/*
 	 * Synchronize types early, as that also includes inferring the target
 	 * triple.
diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build
index 8ffaf41460..4743333c3f 100644
--- a/src/backend/jit/llvm/meson.build
+++ b/src/backend/jit/llvm/meson.build
@@ -60,9 +60,6 @@ endif
 
 # XXX: Need to determine proper version of the function cflags for clang
 bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv']
-if llvm.version().version_compare('=15.0')
-  bitcode_cflags += ['-Xclang', '-no-opaque-pointers']
-endif
 bitcode_cflags += cppflags
 
 # XXX: Worth improving on the logic to find directories here
diff --git a/src/include/jit/llvmjit_emit.h b/src/include/jit/llvmjit_emit.h
index b1f0ea56c0..a37b723d28 100644
--- a/src/include/jit/llvmjit_emit.h
+++ b/src/include/jit/llvmjit_emit.h
@@ -107,41 +107,25 @@ l_pbool_const(bool i)
 static inline LLVMValueRef
 l_struct_gep(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef v, int32 idx, const char *name)
 {
-#if LLVM_VERSION_MAJOR < 16
-	return LLVMBuildStructGEP(b, v, idx, "");
-#else
 	return LLVMBuildStructGEP2(b, t, v, idx, "");
-#endif
 }
 
 static inline LLVMValueRef
 l_gep(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef v, LLVMValueRef *indices, int32 nindices, const char *name)
 {
-#if LLVM_VERSION_MAJOR < 16
-	return LLVMBuildGEP(b, v, indices, nindices, name);
-#else
 	return LLVMBuildGEP2(b, t, v, indices, nindices, name);
-#endif
 }
 
 static inline LLVMValueRef
 l_load(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef v, const char *name)
 {
-#if LLVM_VERSION_MAJOR < 16
-	return LLVMBuildLoad(b, v, name);
-#else
 	return LLVMBuildLoad2(b, t, v, name);
-#endif
 }
 
 static inline LLVMValueRef
 l_call(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef fn, LLVMValueRef *args, int32 nargs, const char *name)
 {
-#if LLVM_VERSION_MAJOR < 16
-	return LLVMBuildCall(b, fn, args, nargs, name);
-#else
 	return LLVMBuildCall2(b, t, fn, args, nargs, name);
-#endif
 }
 
 /*
-- 
2.42.0

