You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
7.2 KiB
191 lines
7.2 KiB
# From 0fed706031df781bb5889a859c47379e3c37f4f4 Mon Sep 17 00:00:00 2001 |
|
# From: Thomas Munro <thomas.munro@gmail.com> |
|
# Date: Thu, 22 Sep 2022 23:38:56 +1200 |
|
# Subject: [PATCH v2] WIP: jit: LLVM 15: Minimal changes. |
|
|
|
# Per https://llvm.org/docs/OpaquePointers.html, support for non-opaque |
|
# pointers still exists and we can request that on our context. We have |
|
# until LLVM 16 to move to opaque pointers. |
|
# --- |
|
# src/backend/jit/llvm/llvmjit.c | 18 +++++++ |
|
# src/backend/jit/llvm/meson.build | 3 ++ |
|
# configure | 89 ++++++++++++++++++++++++++++++++ |
|
# configure.ac | 3 ++ |
|
# 4 files changed, 113 insertions(+) |
|
|
|
diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c |
|
index fd3eecf27d3..bccfcfa9698 100644 |
|
--- a/src/backend/jit/llvm/llvmjit.c |
|
+++ b/src/backend/jit/llvm/llvmjit.c |
|
@@ -798,6 +798,16 @@ llvm_session_initialize(void) |
|
LLVMInitializeNativeAsmPrinter(); |
|
LLVMInitializeNativeAsmParser(); |
|
|
|
+ /* |
|
+ * When targetting an llvm version with opaque pointers enabled by |
|
+ * default, turn them off for the context we build our code in. Don't need |
|
+ * to do so for other contexts (e.g. llvm_ts_context) - once the IR is |
|
+ * generated, it carries the necessary information. |
|
+ */ |
|
+#if LLVM_VERSION_MAJOR > 14 |
|
+ LLVMContextSetOpaquePointers(LLVMGetGlobalContext(), false); |
|
+#endif |
|
+ |
|
/* |
|
* Synchronize types early, as that also includes inferring the target |
|
* triple. |
|
@@ -1112,7 +1122,11 @@ llvm_resolve_symbols(LLVMOrcDefinitionGeneratorRef GeneratorObj, void *Ctx, |
|
LLVMOrcJITDylibRef JD, LLVMOrcJITDylibLookupFlags JDLookupFlags, |
|
LLVMOrcCLookupSet LookupSet, size_t LookupSetSize) |
|
{ |
|
+#if LLVM_VERSION_MAJOR > 14 |
|
+ LLVMOrcCSymbolMapPairs symbols = palloc0(sizeof(LLVMOrcCSymbolMapPair) * LookupSetSize); |
|
+#else |
|
LLVMOrcCSymbolMapPairs symbols = palloc0(sizeof(LLVMJITCSymbolMapPair) * LookupSetSize); |
|
+#endif |
|
LLVMErrorRef error; |
|
LLVMOrcMaterializationUnitRef mu; |
|
|
|
@@ -1230,7 +1244,11 @@ llvm_create_jit_instance(LLVMTargetMachineRef tm) |
|
* Symbol resolution support for "special" functions, e.g. a call into an |
|
* SQL callable function. |
|
*/ |
|
+#if LLVM_VERSION_MAJOR > 14 |
|
+ ref_gen = LLVMOrcCreateCustomCAPIDefinitionGenerator(llvm_resolve_symbols, NULL, NULL); |
|
+#else |
|
ref_gen = LLVMOrcCreateCustomCAPIDefinitionGenerator(llvm_resolve_symbols, NULL); |
|
+#endif |
|
LLVMOrcJITDylibAddGenerator(LLVMOrcLLJITGetMainJITDylib(lljit), ref_gen); |
|
|
|
return lljit; |
|
# diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build |
|
# index de2e624ab58..e5a702163b7 100644 |
|
# --- a/src/backend/jit/llvm/meson.build |
|
# +++ b/src/backend/jit/llvm/meson.build |
|
# @@ -51,6 +51,9 @@ 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/configure b/configure |
|
index 1caca21b625..cf457a0ed4a 100755 |
|
--- a/configure |
|
+++ b/configure |
|
@@ -7391,6 +7391,95 @@ 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 10fa55dd154..ecc6c495db9 100644 |
|
--- a/configure.ac |
|
+++ b/configure.ac |
|
@@ -625,6 +625,9 @@ 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 |
|
-- |
|
2.37.3.542.gdd3f6c4cae |
|
|
|
|