PostgreSQL Source Code: src/backend/jit/llvm/llvmjit.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
15
16#include <llvm-c/Analysis.h>
17#include <llvm-c/BitReader.h>
18#include <llvm-c/BitWriter.h>
19#include <llvm-c/Core.h>
20#include <llvm-c/ExecutionEngine.h>
21#if LLVM_VERSION_MAJOR > 16
22#include <llvm-c/Transforms/PassBuilder.h>
23#endif
24#include <llvm-c/Orc.h>
25#include <llvm-c/OrcEE.h>
26#include <llvm-c/LLJIT.h>
27#include <llvm-c/Support.h>
28#include <llvm-c/Target.h>
29#if LLVM_VERSION_MAJOR < 17
30#include <llvm-c/Transforms/IPO.h>
31#include <llvm-c/Transforms/PassManagerBuilder.h>
32#include <llvm-c/Transforms/Scalar.h>
33#include <llvm-c/Transforms/Utils.h>
34#endif
35
44
45#define LLVMJIT_LLVM_CONTEXT_REUSE_MAX 100
46
47
49{
53
54
55
77
81
83
86
87
89
90
95
96
101
102
107static void llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module);
108
113
116
117
119
121{
122 .name = "LLVM JIT context",
126 .DebugPrint = NULL
127};
128
129
130static inline void
132{
134}
135static inline void
137{
139}
140
142 .name = "llvmjit",
143 .version = PG_VERSION
144);
145
146
147
148
149
150void
152{
156}
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172static void
174{
176 elog(ERROR, "Trying to recreate a non-existing context");
177
178
179
180
181
183 {
185 return;
186 }
187
189 {
191 return;
192 }
193
194
195
196
197
198
199
201
205
206
207
208
209
210
212}
213
214
215
216
217
218
219
220
221
222LLVMJitContext *
224{
225 LLVMJitContext *context;
226
228
230
232
234
236 sizeof(LLVMJitContext));
237 context->base.flags = jitFlags;
238
239
242
244
245 return context;
246}
247
248
249
250
251static void
253{
254 LLVMJitContext *llvm_jit_context = (LLVMJitContext *) context;
256
257
258
259
260
262
263
264
265
266
267
269 return;
270
272
273 if (llvm_jit_context->module)
274 {
275 LLVMDisposeModule(llvm_jit_context->module);
276 llvm_jit_context->module = NULL;
277 }
278
279 foreach(lc, llvm_jit_context->handles)
280 {
282
283 {
284 LLVMOrcExecutionSessionRef ee;
285 LLVMOrcSymbolStringPoolRef sp;
286
289
290
291
292
293
294
295
296 ee = LLVMOrcLLJITGetExecutionSession(jit_handle->lljit);
297 sp = LLVMOrcExecutionSessionGetSymbolStringPool(ee);
298 LLVMOrcSymbolStringPoolClearDeadEntries(sp);
299 }
300
301 pfree(jit_handle);
302 }
303 list_free(llvm_jit_context->handles);
304 llvm_jit_context->handles = NIL;
305
307
308 if (llvm_jit_context->resowner)
310}
311
312
313
314
315LLVMModuleRef
317{
319
320
321
322
323 if (!context->module)
324 {
325 context->compiled = false;
327 context->module = LLVMModuleCreateWithNameInContext("pg", llvm_context);
328 LLVMSetTarget(context->module, llvm_triple);
329 LLVMSetDataLayout(context->module, llvm_layout);
330 }
331
332 return context->module;
333}
334
335
336
337
338
339
340char *
342{
343 Assert(context->module != NULL);
344
345 context->base.instr.created_functions++;
346
347
348
349
350
352 basename,
353 context->module_generation,
354 context->counter++);
355}
356
357
358
359
360
361void *
363{
365
367
368
369
370
371
372 if (!context->compiled)
373 {
375 }
376
377
378
379
380
381
382 foreach(lc, context->handles)
383 {
387 LLVMErrorRef error;
388 LLVMOrcJITTargetAddress addr;
389
391
392 addr = 0;
395 elog(ERROR, "failed to look up symbol \"%s\": %s",
397
398
399
400
401
402
403
406 endtime, starttime);
407
408 if (addr)
409 return (void *) (uintptr_t) addr;
410 }
411
413
414 return NULL;
415}
416
417
418
419
420
421LLVMTypeRef
423{
424 LLVMValueRef v_srcvar;
425 LLVMTypeRef typ;
426
427
429 if (!v_srcvar)
430 elog(ERROR, "variable %s not in llvmjit_types.c", varname);
431
432 typ = LLVMGlobalGetValueType(v_srcvar);
433
434 return typ;
435}
436
437
438
439
440
441LLVMTypeRef
443{
444 LLVMValueRef v_srcvar;
445 LLVMTypeRef typ;
446
448 if (!v_srcvar)
449 elog(ERROR, "function %s not in llvmjit_types.c", varname);
450
452
453 return typ;
454}
455
456
457
458
459
460
461
462
463LLVMValueRef
465{
466 LLVMValueRef v_srcfn;
467 LLVMValueRef v_fn;
468
469
470 v_fn = LLVMGetNamedFunction(mod, funcname);
471 if (v_fn)
472 return v_fn;
473
475
476 if (!v_srcfn)
478
479 v_fn = LLVMAddFunction(mod,
483
484 return v_fn;
485}
486
487
488
489
490
491static void
493{
494 int num_attributes;
495 LLVMAttributeRef *attrs;
496
497 num_attributes = LLVMGetAttributeCountAtIndex(v_from, index);
498
499 if (num_attributes == 0)
500 return;
501
502 attrs = palloc(sizeof(LLVMAttributeRef) * num_attributes);
503 LLVMGetAttributesAtIndex(v_from, index, attrs);
504
505 for (int attno = 0; attno < num_attributes; attno++)
506 LLVMAddAttributeAtIndex(v_to, index, attrs[attno]);
507
509}
510
511
512
513
514
515void
517{
519
520
522
524 {
525
527 }
528
529
530 param_count = LLVMCountParams(v_from);
531
532 for (int paramidx = 1; paramidx <= param_count; paramidx++)
534}
535
536
537
538
539LLVMValueRef
541 LLVMBuilderRef builder,
542 LLVMModuleRef mod,
544{
545 char *modname;
546 char *basename;
548
549 LLVMValueRef v_fn;
550
552
553 if (modname != NULL && basename != NULL)
554 {
555
557 }
558 else if (basename != NULL)
559 {
560
562 }
563 else
564 {
565
566
567
568
569
570 LLVMValueRef v_fn_addr;
571
574 v_fn = LLVMGetNamedGlobal(mod, funcname);
575 if (v_fn != 0)
577
579
581 LLVMSetInitializer(v_fn, v_fn_addr);
582 LLVMSetGlobalConstant(v_fn, true);
583 LLVMSetLinkage(v_fn, LLVMPrivateLinkage);
584 LLVMSetUnnamedAddr(v_fn, true);
585
587 }
588
589
590 v_fn = LLVMGetNamedFunction(mod, funcname);
591 if (v_fn != 0)
592 return v_fn;
593
595
596 return v_fn;
597}
598
599
600
601
602static void
604{
605#if LLVM_VERSION_MAJOR < 17
606 LLVMPassManagerBuilderRef llvm_pmb;
607 LLVMPassManagerRef llvm_mpm;
608 LLVMPassManagerRef llvm_fpm;
609 LLVMValueRef func;
610 int compile_optlevel;
611
612 if (context->base.flags & PGJIT_OPT3)
613 compile_optlevel = 3;
614 else
615 compile_optlevel = 0;
616
617
618
619
620
621
622 llvm_pmb = LLVMPassManagerBuilderCreate();
623 LLVMPassManagerBuilderSetOptLevel(llvm_pmb, compile_optlevel);
624 llvm_fpm = LLVMCreateFunctionPassManagerForModule(module);
625
626 if (context->base.flags & PGJIT_OPT3)
627 {
628
629 LLVMPassManagerBuilderUseInlinerWithThreshold(llvm_pmb, 512);
630 }
631 else
632 {
633
634 LLVMAddPromoteMemoryToRegisterPass(llvm_fpm);
635 }
636
637 LLVMPassManagerBuilderPopulateFunctionPassManager(llvm_pmb, llvm_fpm);
638
639
640
641
642
643 LLVMInitializeFunctionPassManager(llvm_fpm);
644 for (func = LLVMGetFirstFunction(context->module);
645 func != NULL;
646 func = LLVMGetNextFunction(func))
647 LLVMRunFunctionPassManager(llvm_fpm, func);
648 LLVMFinalizeFunctionPassManager(llvm_fpm);
649 LLVMDisposePassManager(llvm_fpm);
650
651
652
653
654
655 llvm_mpm = LLVMCreatePassManager();
656 LLVMPassManagerBuilderPopulateModulePassManager(llvm_pmb,
657 llvm_mpm);
658
659 if (!(context->base.flags & PGJIT_OPT3))
660 LLVMAddAlwaysInlinerPass(llvm_mpm);
661
663 && !(context->base.flags & PGJIT_OPT3))
664 LLVMAddFunctionInliningPass(llvm_mpm);
665 LLVMRunPassManager(llvm_mpm, context->module);
666 LLVMDisposePassManager(llvm_mpm);
667
668 LLVMPassManagerBuilderDispose(llvm_pmb);
669#else
670 LLVMPassBuilderOptionsRef options;
671 LLVMErrorRef err;
672 const char *passes;
673
674 if (context->base.flags & PGJIT_OPT3)
675 passes = "default";
676 else
677 passes = "default,mem2reg";
678
679 options = LLVMCreatePassBuilderOptions();
680
681#ifdef LLVM_PASS_DEBUG
682 LLVMPassBuilderOptionsSetDebugLogging(options, 1);
683#endif
684
685
686#ifdef USE_ASSERT_CHECKING
687 LLVMPassBuilderOptionsSetVerifyEach(options, true);
688#endif
689
690 LLVMPassBuilderOptionsSetInlinerThreshold(options, 512);
691
692 err = LLVMRunPasses(module, passes, NULL, options);
693
696
697 LLVMDisposePassBuilderOptions(options);
698#endif
699}
700
701
702
703
704static void
706{
711 LLVMOrcLLJITRef compile_orc;
712
713 if (context->base.flags & PGJIT_OPT3)
715 else
717
718
720 {
725 endtime, starttime);
726 }
727
729 {
731
734 context->module_generation);
735 LLVMWriteBitcodeToFile(context->module, filename);
737 }
738
739
740
745 endtime, starttime);
746
748 {
750
753 context->module_generation);
754 LLVMWriteBitcodeToFile(context->module, filename);
756 }
757
760
761
762
763
764
765
766
768 {
769 LLVMOrcThreadSafeModuleRef ts_module;
770 LLVMErrorRef error;
771 LLVMOrcJITDylibRef jd = LLVMOrcLLJITGetMainJITDylib(compile_orc);
772
773 ts_module = LLVMOrcCreateNewThreadSafeModule(context->module, llvm_ts_context);
774
775 handle->lljit = compile_orc;
776 handle->resource_tracker = LLVMOrcJITDylibCreateResourceTracker(jd);
777
778
779
780
781
782
783
784 context->module = NULL;
785 error = LLVMOrcLLJITAddLLVMIRModuleWithRT(compile_orc,
787 ts_module);
788
790 elog(ERROR, "failed to JIT module: %s",
792
793
794 }
795
798 endtime, starttime);
799
800 context->module = NULL;
801 context->compiled = true;
802
803
805 context->handles = lappend(context->handles, handle);
807
809 (errmsg_internal("time to inline: %.3fs, opt: %.3fs, emit: %.3fs",
815}
816
817
818
819
820static void
822{
824 char *error = NULL;
825 char *cpu = NULL;
826 char *features = NULL;
827 LLVMTargetMachineRef opt0_tm;
828 LLVMTargetMachineRef opt3_tm;
829
831 return;
832
834
835 LLVMInitializeNativeTarget();
836 LLVMInitializeNativeAsmPrinter();
837 LLVMInitializeNativeAsmParser();
838
840 {
842
845 }
846
847
848
849
850
852
853
854
855
857
859 {
861 }
862
863
864
865
866
867
868
869 cpu = LLVMGetHostCPUName();
870 features = LLVMGetHostCPUFeatures();
871 elog(DEBUG2, "LLVMJIT detected CPU \"%s\", with features \"%s\"",
872 cpu, features);
873
874 opt0_tm =
876 LLVMCodeGenLevelNone,
877 LLVMRelocDefault,
878 LLVMCodeModelJITDefault);
879 opt3_tm =
881 LLVMCodeGenLevelAggressive,
882 LLVMRelocDefault,
883 LLVMCodeModelJITDefault);
884
885 LLVMDisposeMessage(cpu);
886 cpu = NULL;
887 LLVMDisposeMessage(features);
888 features = NULL;
889
890
891 LLVMLoadLibraryPermanently(NULL);
892
893 {
895
897 opt0_tm = 0;
898
900 opt3_tm = 0;
901 }
902
904
906
908}
909
910static void
912{
913
914
915
916
917
918
919
920
922 {
924 return;
925 }
926
928 elog(PANIC, "LLVMJitContext in use count not 0 at exit (is %zu)",
930
931 {
933 {
936 }
938 {
941 }
943 {
946 }
947 }
948}
949
950
951static LLVMTypeRef
953{
954 LLVMValueRef value;
955 LLVMTypeRef typ;
956
957
958 value = LLVMGetNamedFunction(mod, name);
961
963
964 return typ;
965}
966
967
968
969
970
971static void
973{
975 elog(ERROR, "failed to extract target information, llvmjit_types.c not loaded");
976
979
982}
983
984
985
986
987
988
989
990static void
992{
994 LLVMMemoryBufferRef buf;
995 char *msg;
996
998
999
1000 if (LLVMCreateMemoryBufferWithContentsOfFile(path, &buf, &msg))
1001 {
1002 elog(ERROR, "LLVMCreateMemoryBufferWithContentsOfFile(%s) failed: %s",
1003 path, msg);
1004 }
1005
1006
1008 {
1009 elog(ERROR, "LLVMParseBitcodeInContext2 of %s failed", path);
1010 }
1011 LLVMDisposeMemoryBuffer(buf);
1012
1034
1038}
1039
1040
1041
1042
1043
1044void
1046{
1047 *modname = NULL;
1049
1050
1051
1052
1053 if (strncmp(name, "pgextern.", strlen("pgextern.")) == 0)
1054 {
1055
1056
1057
1058
1060 (*funcname)++;
1061
1062 *modname = pnstrdup(name + strlen("pgextern."),
1063 *funcname - name - strlen("pgextern.") - 1);
1065
1067 }
1068 else
1069 {
1070 *modname = NULL;
1072 }
1073}
1074
1075
1076
1077
1078static uint64_t
1080{
1081 uintptr_t addr;
1083 char *modname;
1084
1085
1086
1087
1088
1089#if defined(__darwin__)
1090 if (symname[0] != '_')
1091 elog(ERROR, "expected prefixed symbol name, but got \"%s\"", symname);
1092 symname++;
1093#endif
1094
1096
1097
1099
1100 if (modname)
1102 true, NULL);
1103 else
1104 addr = (uintptr_t) LLVMSearchForAddressOfSymbol(symname);
1105
1107 if (modname)
1109
1110
1111 if (!addr)
1112 elog(WARNING, "failed to resolve name %s", symname);
1113
1114 return (uint64_t) addr;
1115}
1116
1117static LLVMErrorRef
1119 LLVMOrcLookupStateRef *LookupState, LLVMOrcLookupKind Kind,
1120 LLVMOrcJITDylibRef JD, LLVMOrcJITDylibLookupFlags JDLookupFlags,
1121 LLVMOrcCLookupSet LookupSet, size_t LookupSetSize)
1122{
1123#if LLVM_VERSION_MAJOR > 14
1124 LLVMOrcCSymbolMapPairs symbols = palloc0(sizeof(LLVMOrcCSymbolMapPair) * LookupSetSize);
1125#else
1126 LLVMOrcCSymbolMapPairs symbols = palloc0(sizeof(LLVMJITCSymbolMapPair) * LookupSetSize);
1127#endif
1128 LLVMErrorRef error;
1129 LLVMOrcMaterializationUnitRef mu;
1130
1131 for (int i = 0; i < LookupSetSize; i++)
1132 {
1133 const char *name = LLVMOrcSymbolStringPoolEntryStr(LookupSet[i].Name);
1134
1135 LLVMOrcRetainSymbolStringPoolEntry(LookupSet[i].Name);
1136 symbols[i].Name = LookupSet[i].Name;
1138 symbols[i].Sym.Flags.GenericFlags = LLVMJITSymbolGenericFlagsExported;
1139 }
1140
1141 mu = LLVMOrcAbsoluteSymbols(symbols, LookupSetSize);
1142 error = LLVMOrcJITDylibDefine(JD, mu);
1143 if (error != LLVMErrorSuccess)
1144 LLVMOrcDisposeMaterializationUnit(mu);
1145
1147
1149}
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160static void
1162{
1163 elog(WARNING, "error during JITing: %s",
1165}
1166
1167
1168
1169
1170static LLVMOrcObjectLayerRef
1172{
1173#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER
1174 LLVMOrcObjectLayerRef objlayer =
1175 LLVMOrcCreateRTDyldObjectLinkingLayerWithSafeSectionMemoryManager(ES);
1176#else
1177 LLVMOrcObjectLayerRef objlayer =
1178 LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(ES);
1179#endif
1180
1181
1182#if defined(HAVE_DECL_LLVMCREATEGDBREGISTRATIONLISTENER) && HAVE_DECL_LLVMCREATEGDBREGISTRATIONLISTENER
1184 {
1185 LLVMJITEventListenerRef l = LLVMCreateGDBRegistrationListener();
1186
1187 LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(objlayer, l);
1188 }
1189#endif
1190
1191#if defined(HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER) && HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER
1193 {
1194 LLVMJITEventListenerRef l = LLVMCreatePerfJITEventListener();
1195
1196 LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(objlayer, l);
1197 }
1198#endif
1199
1200 return objlayer;
1201}
1202
1203
1204
1205
1206
1207static LLVMOrcLLJITRef
1209{
1210 LLVMOrcLLJITRef lljit;
1211 LLVMOrcJITTargetMachineBuilderRef tm_builder;
1212 LLVMOrcLLJITBuilderRef lljit_builder;
1213 LLVMErrorRef error;
1214 LLVMOrcDefinitionGeneratorRef main_gen;
1215 LLVMOrcDefinitionGeneratorRef ref_gen;
1216
1217 lljit_builder = LLVMOrcCreateLLJITBuilder();
1218 tm_builder = LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(tm);
1219 LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(lljit_builder, tm_builder);
1220
1221 LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(lljit_builder,
1223 NULL);
1224
1225 error = LLVMOrcCreateLLJIT(&lljit, lljit_builder);
1227 elog(ERROR, "failed to create lljit instance: %s",
1229
1230 LLVMOrcExecutionSessionSetErrorReporter(LLVMOrcLLJITGetExecutionSession(lljit),
1232
1233
1234
1235
1236
1237 error = LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(&main_gen,
1238 LLVMOrcLLJITGetGlobalPrefix(lljit),
1239 0, NULL);
1241 elog(ERROR, "failed to create generator: %s",
1243 LLVMOrcJITDylibAddGenerator(LLVMOrcLLJITGetMainJITDylib(lljit), main_gen);
1244
1245
1246
1247
1248
1249#if LLVM_VERSION_MAJOR > 14
1250 ref_gen = LLVMOrcCreateCustomCAPIDefinitionGenerator(llvm_resolve_symbols, NULL, NULL);
1251#else
1252 ref_gen = LLVMOrcCreateCustomCAPIDefinitionGenerator(llvm_resolve_symbols, NULL);
1253#endif
1254 LLVMOrcJITDylibAddGenerator(LLVMOrcLLJITGetMainJITDylib(lljit), ref_gen);
1255
1256 return lljit;
1257}
1258
1259static char *
1261{
1262 char *orig = LLVMGetErrorMessage(error);
1263 char *msg = pstrdup(orig);
1264
1265 LLVMDisposeErrorMessage(orig);
1266
1267 return msg;
1268}
1269
1270
1271
1272
1273static void
1275{
1276 LLVMJitContext *context = (LLVMJitContext *) DatumGetPointer(res);
1277
1278 context->resowner = NULL;
1280}
void * load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle)
int errmsg_internal(const char *fmt,...)
int errhidestmt(bool hide_stmt)
int errhidecontext(bool hide_ctx)
#define ereport(elevel,...)
void err(int eval, const char *fmt,...)
void fmgr_symbol(Oid functionId, char **mod, char **fn)
char pkglib_path[MAXPGPATH]
Assert(PointerIsAligned(start, uint64))
#define INSTR_TIME_SET_CURRENT(t)
#define INSTR_TIME_GET_DOUBLE(t)
#define INSTR_TIME_ACCUM_DIFF(x, y, z)
void on_proc_exit(pg_on_exit_callback function, Datum arg)
bool proc_exit_inprogress
void jit_release_context(JitContext *context)
bool jit_profiling_support
bool jit_debugging_support
List * lappend(List *list, void *datum)
void list_free(List *list)
LLVMTypeRef StructFunctionCallInfoData
LLVMTypeRef StructMinimalTupleData
LLVMTypeRef StructMinimalTupleTableSlot
LLVMTypeRef StructPlanState
static LLVMContextRef llvm_context
LLVMJitContext * llvm_create_context(int jitFlags)
LLVMTypeRef StructExprState
static LLVMOrcLLJITRef llvm_opt3_orc
static const char * llvm_triple
LLVMTypeRef StructExprEvalStep
LLVMValueRef llvm_pg_func(LLVMModuleRef mod, const char *funcname)
static void llvm_recreate_llvm_context(void)
struct LLVMJitHandle LLVMJitHandle
LLVMTypeRef TypeParamBool
LLVMTypeRef StructMemoryContextData
static void llvm_set_target(void)
static LLVMTargetRef llvm_targetref
static bool llvm_session_initialized
LLVMTypeRef StructAggStatePerGroupData
static void llvm_create_types(void)
LLVMTypeRef llvm_pg_var_type(const char *varname)
static void ResourceOwnerRememberJIT(ResourceOwner owner, LLVMJitContext *handle)
static void llvm_session_initialize(void)
static size_t llvm_jit_context_in_use_count
static const char * llvm_layout
LLVMValueRef llvm_function_reference(LLVMJitContext *context, LLVMBuilderRef builder, LLVMModuleRef mod, FunctionCallInfo fcinfo)
char * llvm_expand_funcname(struct LLVMJitContext *context, const char *basename)
static void ResOwnerReleaseJitContext(Datum res)
void llvm_split_symbol_name(const char *name, char **modname, char **funcname)
LLVMTypeRef llvm_pg_var_func_type(const char *varname)
LLVMTypeRef StructTupleTableSlot
LLVMTypeRef TypeStorageBool
static LLVMTypeRef load_return_type(LLVMModuleRef mod, const char *name)
static size_t llvm_generation
static LLVMOrcLLJITRef llvm_opt0_orc
static LLVMOrcObjectLayerRef llvm_create_object_layer(void *Ctx, LLVMOrcExecutionSessionRef ES, const char *Triple)
static void ResourceOwnerForgetJIT(ResourceOwner owner, LLVMJitContext *handle)
static void llvm_compile_module(LLVMJitContext *context)
LLVMTypeRef StructHeapTupleTableSlot
static char * llvm_error_message(LLVMErrorRef error)
static LLVMOrcLLJITRef llvm_create_jit_instance(LLVMTargetMachineRef tm)
static LLVMModuleRef llvm_types_module
static void llvm_shutdown(int code, Datum arg)
PG_MODULE_MAGIC_EXT(.name="llvmjit",.version=PG_VERSION)
static LLVMOrcThreadSafeContextRef llvm_ts_context
static const ResourceOwnerDesc jit_resowner_desc
#define LLVMJIT_LLVM_CONTEXT_REUSE_MAX
static LLVMErrorRef llvm_resolve_symbols(LLVMOrcDefinitionGeneratorRef GeneratorObj, void *Ctx, LLVMOrcLookupStateRef *LookupState, LLVMOrcLookupKind Kind, LLVMOrcJITDylibRef JD, LLVMOrcJITDylibLookupFlags JDLookupFlags, LLVMOrcCLookupSet LookupSet, size_t LookupSetSize)
static void llvm_copy_attributes_at_index(LLVMValueRef v_from, LLVMValueRef v_to, uint32 index)
LLVMModuleRef llvm_mutable_module(LLVMJitContext *context)
LLVMTypeRef StructAggState
LLVMTypeRef TypePGFunction
LLVMTypeRef StructTupleDescData
LLVMValueRef AttributeTemplate
static size_t llvm_llvm_context_reuse_count
LLVMTypeRef StructExprContext
static void llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module)
static uint64_t llvm_resolve_symbol(const char *name, void *ctx)
LLVMTypeRef StructHeapTupleHeaderData
static void llvm_log_jit_error(void *ctx, LLVMErrorRef error)
LLVMTypeRef StructHeapTupleData
static void llvm_release_context(JitContext *context)
void * llvm_get_function(LLVMJitContext *context, const char *funcname)
LLVMTypeRef StructNullableDatum
LLVMValueRef ExecEvalSubroutineTemplate
LLVMValueRef ExecEvalBoolSubroutineTemplate
void _PG_jit_provider_init(JitProviderCallbacks *cb)
LLVMTypeRef StructAggStatePerTransData
void llvm_copy_attributes(LLVMValueRef v_from, LLVMValueRef v_to)
void llvm_enter_fatal_on_oom(void)
bool llvm_in_fatal_on_oom(void)
void llvm_assert_in_fatal_section(void)
void llvm_reset_after_error(void)
void llvm_leave_fatal_on_oom(void)
bool llvm_compile_expr(ExprState *state)
void llvm_inline(LLVMModuleRef M)
void llvm_inline_reset_caches(void)
LLVMTypeRef LLVMGetFunctionReturnType(LLVMValueRef r)
LLVMTypeRef LLVMGetFunctionType(LLVMValueRef r)
void * MemoryContextAlloc(MemoryContext context, Size size)
void * MemoryContextAllocZero(MemoryContext context, Size size)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext TopMemoryContext
char * pnstrdup(const char *in, Size len)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
char * psprintf(const char *fmt,...)
ResourceOwner CurrentResourceOwner
void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerEnlarge(ResourceOwner owner)
#define RELEASE_PRIO_JIT_CONTEXTS
@ RESOURCE_RELEASE_BEFORE_LOCKS
JitProviderCompileExprCB compile_expr
JitProviderResetAfterErrorCB reset_after_error
JitProviderReleaseContextCB release_context
LLVMOrcResourceTrackerRef resource_tracker