From ee4859123e3d47aef8cfe078f7faee2ebcecb613 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 1 Oct 2024 05:05:51 -0400 Subject: [PATCH] jit: Use opaque pointers in all supported LLVM versions. LLVM's opaque pointer change began in LLVM 14, but remained optional until LLVM 16. When commit 37d5babb added opaque pointer support, we didn't turn it on for LLVM 14 and 15 yet because we didn't want to risk weird bitcode incompatibility problems in released branches of PostgreSQL. (That might have been overly cautious, I don't know.) Now that PostgreSQL 18 has dropped support for LLVM versions < 14, and since it hasn't been released yet and no extensions or bitcode have been built against it in the wild yet, we can be more aggressive. We can rip out the support code and build system clutter that made opaque pointer use optional. Author: Thomas Munro Reviewed-by: Peter Eisentraut 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 bd85838291..ffc68a335d 100755 --- a/configure +++ b/configure @@ -7281,95 +7281,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 6a35b2880b..a764347649 100644 --- a/configure.ac +++ b/configure.ac @@ -631,9 +631,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 2a83415d43..f346af9c75 100644 --- a/src/backend/jit/llvm/llvmjit.c +++ b/src/backend/jit/llvm/llvmjit.c @@ -840,19 +840,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 4a4232661b..c1b6a9363e 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 += get_option('c_args') bitcode_cflags += cppflags diff --git a/src/include/jit/llvmjit_emit.h b/src/include/jit/llvmjit_emit.h index 4f35f3dca1..0a04c85d9b 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 } /*