]>
Commit | Line | Data |
---|---|---|
d8d2d607 JP |
1 | From d033f8f8bea9c7b5c4ae43a95b569ceccdaddd7a Mon Sep 17 00:00:00 2001 |
2 | From: Thomas Munro <tmunro@postgresql.org> | |
3 | Date: Wed, 19 Oct 2022 22:32:14 +1300 | |
4 | Subject: [PATCH] Track LLVM 15 changes. | |
5 | ||
6 | Per https://llvm.org/docs/OpaquePointers.html, support for non-opaque | |
7 | pointers still exists and we can request that on our context. We have | |
8 | until LLVM 16 to move to opaque pointers, a much larger change. | |
9 | ||
10 | Back-patch to 11, where LLVM support arrived. | |
11 | ||
12 | Author: Thomas Munro <thomas.munro@gmail.com> | |
13 | Author: Andres Freund <andres@anarazel.de> | |
14 | Discussion: https://postgr.es/m/CAMHz58Sf_xncdyqsekoVsNeKcruKootLtVH6cYXVhhUR1oKPCg%40mail.gmail.com | |
15 | --- | |
16 | configure | 89 +++++++++++++++++++++++++ | |
17 | configure.ac | 3 + | |
18 | src/backend/jit/llvm/llvmjit.c | 18 +++++ | |
19 | src/backend/jit/llvm/llvmjit_inline.cpp | 1 + | |
20 | 4 files changed, 111 insertions(+) | |
21 | ||
22 | diff --git a/configure b/configure | |
23 | index 57ec071cf9..a15c2253d5 100755 | |
24 | --- a/configure | |
25 | +++ b/configure | |
26 | @@ -7259,6 +7259,95 @@ if test x"$pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard" = x"yes"; | |
27 | fi | |
28 | ||
29 | ||
30 | + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -Xclang -no-opaque-pointers, for BITCODE_CFLAGS" >&5 | |
31 | +$as_echo_n "checking whether ${CLANG} supports -Xclang -no-opaque-pointers, for BITCODE_CFLAGS... " >&6; } | |
32 | +if ${pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers+:} false; then : | |
33 | + $as_echo_n "(cached) " >&6 | |
34 | +else | |
35 | + pgac_save_CFLAGS=$CFLAGS | |
36 | +pgac_save_CC=$CC | |
37 | +CC=${CLANG} | |
38 | +CFLAGS="${BITCODE_CFLAGS} -Xclang -no-opaque-pointers" | |
39 | +ac_save_c_werror_flag=$ac_c_werror_flag | |
40 | +ac_c_werror_flag=yes | |
41 | +cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
42 | +/* end confdefs.h. */ | |
43 | + | |
44 | +int | |
45 | +main () | |
46 | +{ | |
47 | + | |
48 | + ; | |
49 | + return 0; | |
50 | +} | |
51 | +_ACEOF | |
52 | +if ac_fn_c_try_compile "$LINENO"; then : | |
53 | + pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers=yes | |
54 | +else | |
55 | + pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers=no | |
56 | +fi | |
57 | +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext | |
58 | +ac_c_werror_flag=$ac_save_c_werror_flag | |
59 | +CFLAGS="$pgac_save_CFLAGS" | |
60 | +CC="$pgac_save_CC" | |
61 | +fi | |
62 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" >&5 | |
63 | +$as_echo "$pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" >&6; } | |
64 | +if test x"$pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" = x"yes"; then | |
65 | + BITCODE_CFLAGS="${BITCODE_CFLAGS} -Xclang -no-opaque-pointers" | |
66 | +fi | |
67 | + | |
68 | + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -Xclang -no-opaque-pointers, for BITCODE_CXXFLAGS" >&5 | |
69 | +$as_echo_n "checking whether ${CLANGXX} supports -Xclang -no-opaque-pointers, for BITCODE_CXXFLAGS... " >&6; } | |
70 | +if ${pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers+:} false; then : | |
71 | + $as_echo_n "(cached) " >&6 | |
72 | +else | |
73 | + pgac_save_CXXFLAGS=$CXXFLAGS | |
74 | +pgac_save_CXX=$CXX | |
75 | +CXX=${CLANGXX} | |
76 | +CXXFLAGS="${BITCODE_CXXFLAGS} -Xclang -no-opaque-pointers" | |
77 | +ac_save_cxx_werror_flag=$ac_cxx_werror_flag | |
78 | +ac_cxx_werror_flag=yes | |
79 | +ac_ext=cpp | |
80 | +ac_cpp='$CXXCPP $CPPFLAGS' | |
81 | +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' | |
82 | +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' | |
83 | +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu | |
84 | + | |
85 | +cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
86 | +/* end confdefs.h. */ | |
87 | + | |
88 | +int | |
89 | +main () | |
90 | +{ | |
91 | + | |
92 | + ; | |
93 | + return 0; | |
94 | +} | |
95 | +_ACEOF | |
96 | +if ac_fn_cxx_try_compile "$LINENO"; then : | |
97 | + pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers=yes | |
98 | +else | |
99 | + pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers=no | |
100 | +fi | |
101 | +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext | |
102 | +ac_ext=c | |
103 | +ac_cpp='$CPP $CPPFLAGS' | |
104 | +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' | |
105 | +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' | |
106 | +ac_compiler_gnu=$ac_cv_c_compiler_gnu | |
107 | + | |
108 | +ac_cxx_werror_flag=$ac_save_cxx_werror_flag | |
109 | +CXXFLAGS="$pgac_save_CXXFLAGS" | |
110 | +CXX="$pgac_save_CXX" | |
111 | +fi | |
112 | +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" >&5 | |
113 | +$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" >&6; } | |
114 | +if test x"$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" = x"yes"; then | |
115 | + BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -Xclang -no-opaque-pointers" | |
116 | +fi | |
117 | + | |
118 | + | |
119 | NOT_THE_CFLAGS="" | |
120 | { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -Wunused-command-line-argument, for NOT_THE_CFLAGS" >&5 | |
121 | $as_echo_n "checking whether ${CLANG} supports -Wunused-command-line-argument, for NOT_THE_CFLAGS... " >&6; } | |
122 | diff --git a/configure.ac b/configure.ac | |
123 | index 227bc896b6..6d13ae5888 100644 | |
124 | --- a/configure.ac | |
125 | +++ b/configure.ac | |
126 | @@ -600,6 +600,9 @@ if test "$with_llvm" = yes ; then | |
127 | PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-fexcess-precision=standard]) | |
128 | PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANGXX, BITCODE_CXXFLAGS, [-fexcess-precision=standard]) | |
129 | ||
130 | + PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-Xclang -no-opaque-pointers]) | |
131 | + PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANGXX, BITCODE_CXXFLAGS, [-Xclang -no-opaque-pointers]) | |
132 | + | |
133 | NOT_THE_CFLAGS="" | |
134 | PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, NOT_THE_CFLAGS, [-Wunused-command-line-argument]) | |
135 | if test -n "$NOT_THE_CFLAGS"; then | |
136 | diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c | |
137 | index fb29449573..199fff4f77 100644 | |
138 | --- a/src/backend/jit/llvm/llvmjit.c | |
139 | +++ b/src/backend/jit/llvm/llvmjit.c | |
140 | @@ -798,6 +798,16 @@ llvm_session_initialize(void) | |
141 | LLVMInitializeNativeAsmPrinter(); | |
142 | LLVMInitializeNativeAsmParser(); | |
143 | ||
144 | + /* | |
145 | + * When targeting an LLVM version with opaque pointers enabled by | |
146 | + * default, turn them off for the context we build our code in. We don't | |
147 | + * need to do so for other contexts (e.g. llvm_ts_context). Once the IR is | |
148 | + * generated, it carries the necessary information. | |
149 | + */ | |
150 | +#if LLVM_VERSION_MAJOR > 14 | |
151 | + LLVMContextSetOpaquePointers(LLVMGetGlobalContext(), false); | |
152 | +#endif | |
153 | + | |
154 | /* | |
155 | * Synchronize types early, as that also includes inferring the target | |
156 | * triple. | |
157 | @@ -1112,7 +1122,11 @@ llvm_resolve_symbols(LLVMOrcDefinitionGeneratorRef GeneratorObj, void *Ctx, | |
158 | LLVMOrcJITDylibRef JD, LLVMOrcJITDylibLookupFlags JDLookupFlags, | |
159 | LLVMOrcCLookupSet LookupSet, size_t LookupSetSize) | |
160 | { | |
161 | +#if LLVM_VERSION_MAJOR > 14 | |
162 | + LLVMOrcCSymbolMapPairs symbols = palloc0(sizeof(LLVMOrcCSymbolMapPair) * LookupSetSize); | |
163 | +#else | |
164 | LLVMOrcCSymbolMapPairs symbols = palloc0(sizeof(LLVMJITCSymbolMapPair) * LookupSetSize); | |
165 | +#endif | |
166 | LLVMErrorRef error; | |
167 | LLVMOrcMaterializationUnitRef mu; | |
168 | ||
169 | @@ -1230,7 +1244,11 @@ llvm_create_jit_instance(LLVMTargetMachineRef tm) | |
170 | * Symbol resolution support for "special" functions, e.g. a call into an | |
171 | * SQL callable function. | |
172 | */ | |
173 | +#if LLVM_VERSION_MAJOR > 14 | |
174 | + ref_gen = LLVMOrcCreateCustomCAPIDefinitionGenerator(llvm_resolve_symbols, NULL, NULL); | |
175 | +#else | |
176 | ref_gen = LLVMOrcCreateCustomCAPIDefinitionGenerator(llvm_resolve_symbols, NULL); | |
177 | +#endif | |
178 | LLVMOrcJITDylibAddGenerator(LLVMOrcLLJITGetMainJITDylib(lljit), ref_gen); | |
179 | ||
180 | return lljit; | |
181 | diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp | |
182 | index 9bb4b672a7..774d9e8b66 100644 | |
183 | --- a/src/backend/jit/llvm/llvmjit_inline.cpp | |
184 | +++ b/src/backend/jit/llvm/llvmjit_inline.cpp | |
185 | @@ -62,6 +62,7 @@ extern "C" | |
186 | #include <llvm/IR/ModuleSummaryIndex.h> | |
187 | #include <llvm/Linker/IRMover.h> | |
188 | #include <llvm/Support/ManagedStatic.h> | |
189 | +#include <llvm/Support/MemoryBuffer.h> | |
190 | ||
191 | ||
192 | /* | |
193 | -- | |
194 | 2.30.2 | |
195 |