@@ -89,18 +89,12 @@ LLVMTypeRef StructExprState;
89
89
LLVMTypeRef StructAggState ;
90
90
LLVMTypeRef StructAggStatePerGroupData ;
91
91
LLVMTypeRef StructAggStatePerTransData ;
92
+ LLVMTypeRef StructPlanState ;
92
93
93
94
LLVMValueRef AttributeTemplate ;
94
- LLVMValueRef FuncStrlen ;
95
- LLVMValueRef FuncVarsizeAny ;
96
- LLVMValueRef FuncSlotGetsomeattrsInt ;
97
- LLVMValueRef FuncSlotGetmissingattrs ;
98
- LLVMValueRef FuncMakeExpandedObjectReadOnlyInternal ;
99
- LLVMValueRef FuncExecEvalSubscriptingRef ;
100
- LLVMValueRef FuncExecEvalSysVar ;
101
- LLVMValueRef FuncExecAggTransReparent ;
102
- LLVMValueRef FuncExecAggInitGroup ;
95
+ LLVMValueRef ExecEvalSubroutineTemplate ;
103
96
97
+ LLVMModuleRef llvm_types_module = NULL ;
104
98
105
99
static bool llvm_session_initialized = false;
106
100
static size_t llvm_generation = 0 ;
@@ -382,26 +376,71 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
382
376
}
383
377
384
378
/*
385
- * Return declaration for passed function, adding it to the module if
386
- * necessary.
379
+ * Return type of a variable in llvmjit_types.c. This is useful to keep types
380
+ * in sync between plain C and JIT related code.
381
+ */
382
+ LLVMTypeRef
383
+ llvm_pg_var_type (const char * varname )
384
+ {
385
+ LLVMValueRef v_srcvar ;
386
+ LLVMTypeRef typ ;
387
+
388
+ /* this'll return a *pointer* to the global */
389
+ v_srcvar = LLVMGetNamedGlobal (llvm_types_module , varname );
390
+ if (!v_srcvar )
391
+ elog (ERROR , "variable %s not in llvmjit_types.c" , varname );
392
+
393
+ typ = LLVMGlobalGetValueType (v_srcvar );
394
+
395
+ return typ ;
396
+ }
397
+
398
+ /*
399
+ * Return function type of a variable in llvmjit_types.c. This is useful to
400
+ * keep function types in sync between C and JITed code.
401
+ */
402
+ LLVMTypeRef
403
+ llvm_pg_var_func_type (const char * varname )
404
+ {
405
+ LLVMValueRef v_srcvar ;
406
+ LLVMTypeRef typ ;
407
+
408
+ v_srcvar = LLVMGetNamedFunction (llvm_types_module , varname );
409
+ if (!v_srcvar )
410
+ elog (ERROR , "function %s not in llvmjit_types.c" , varname );
411
+
412
+ typ = LLVMGetFunctionType (v_srcvar );
413
+
414
+ return typ ;
415
+ }
416
+
417
+ /*
418
+ * Return declaration for a function referenced in llvmjit_types.c, adding it
419
+ * to the module if necessary.
387
420
*
388
- * This is used to make functions imported by llvm_create_types() known to the
389
- * module that's currently being worked on.
421
+ * This is used to make functions discovered via llvm_create_types() known to
422
+ * the module that's currently being worked on.
390
423
*/
391
424
LLVMValueRef
392
- llvm_get_decl (LLVMModuleRef mod , LLVMValueRef v_src )
425
+ llvm_pg_func (LLVMModuleRef mod , const char * funcname )
393
426
{
427
+ LLVMValueRef v_srcfn ;
394
428
LLVMValueRef v_fn ;
395
429
396
430
/* don't repeatedly add function */
397
- v_fn = LLVMGetNamedFunction (mod , LLVMGetValueName ( v_src ) );
431
+ v_fn = LLVMGetNamedFunction (mod , funcname );
398
432
if (v_fn )
399
433
return v_fn ;
400
434
435
+ v_srcfn = LLVMGetNamedFunction (llvm_types_module , funcname );
436
+
437
+ if (!v_srcfn )
438
+ elog (ERROR , "function %s not in llvmjit_types.c" , funcname );
439
+
401
440
v_fn = LLVMAddFunction (mod ,
402
- LLVMGetValueName ( v_src ) ,
403
- LLVMGetElementType ( LLVMTypeOf ( v_src ) ));
404
- llvm_copy_attributes (v_src , v_fn );
441
+ funcname ,
442
+ LLVMGetFunctionType ( v_srcfn ));
443
+ llvm_copy_attributes (v_srcfn , v_fn );
405
444
406
445
return v_fn ;
407
446
}
@@ -496,7 +535,7 @@ llvm_function_reference(LLVMJitContext *context,
496
535
fcinfo -> flinfo -> fn_oid );
497
536
v_fn = LLVMGetNamedGlobal (mod , funcname );
498
537
if (v_fn != 0 )
499
- return LLVMBuildLoad (builder , v_fn , "" );
538
+ return l_load (builder , TypePGFunction , v_fn , "" );
500
539
501
540
v_fn_addr = l_ptr_const (fcinfo -> flinfo -> fn_addr , TypePGFunction );
502
541
@@ -506,15 +545,15 @@ llvm_function_reference(LLVMJitContext *context,
506
545
LLVMSetLinkage (v_fn , LLVMPrivateLinkage );
507
546
LLVMSetUnnamedAddr (v_fn , true);
508
547
509
- return LLVMBuildLoad (builder , v_fn , "" );
548
+ return l_load (builder , TypePGFunction , v_fn , "" );
510
549
}
511
550
512
551
/* check if function already has been added */
513
552
v_fn = LLVMGetNamedFunction (mod , funcname );
514
553
if (v_fn != 0 )
515
554
return v_fn ;
516
555
517
- v_fn = LLVMAddFunction (mod , funcname , LLVMGetElementType ( TypePGFunction ));
556
+ v_fn = LLVMAddFunction (mod , funcname , LLVMGetFunctionType ( AttributeTemplate ));
518
557
519
558
return v_fn ;
520
559
}
@@ -766,12 +805,15 @@ llvm_session_initialize(void)
766
805
LLVMInitializeNativeAsmParser ();
767
806
768
807
/*
769
- * When targeting an LLVM version with opaque pointers enabled by
770
- * default, turn them off for the context we build our code in. We don't
771
- * need to do so for other contexts (e.g. llvm_ts_context). Once the IR is
772
- * generated, it carries the necessary information.
808
+ * When targeting LLVM 15, turn off opaque pointers for the context we
809
+ * build our code in. We don't need to do so for other contexts (e.g.
810
+ * llvm_ts_context). Once the IR is generated, it carries the necessary
811
+ * information.
812
+ *
813
+ * For 16 and above, opaque pointers must be used, and we have special
814
+ * code for that.
773
815
*/
774
- #if LLVM_VERSION_MAJOR > 14
816
+ #if LLVM_VERSION_MAJOR == 15
775
817
LLVMContextSetOpaquePointers (LLVMGetGlobalContext (), false);
776
818
#endif
777
819
@@ -921,26 +963,6 @@ llvm_shutdown(int code, Datum arg)
921
963
#endif /* LLVM_VERSION_MAJOR > 11 */
922
964
}
923
965
924
- /* helper for llvm_create_types, returning a global var's type */
925
- static LLVMTypeRef
926
- load_type (LLVMModuleRef mod , const char * name )
927
- {
928
- LLVMValueRef value ;
929
- LLVMTypeRef typ ;
930
-
931
- /* this'll return a *pointer* to the global */
932
- value = LLVMGetNamedGlobal (mod , name );
933
- if (!value )
934
- elog (ERROR , "type %s is unknown" , name );
935
-
936
- /* therefore look at the contained type and return that */
937
- typ = LLVMTypeOf (value );
938
- Assert (typ != NULL );
939
- typ = LLVMGetElementType (typ );
940
- Assert (typ != NULL );
941
- return typ ;
942
- }
943
-
944
966
/* helper for llvm_create_types, returning a function's return type */
945
967
static LLVMTypeRef
946
968
load_return_type (LLVMModuleRef mod , const char * name )
@@ -953,15 +975,7 @@ load_return_type(LLVMModuleRef mod, const char *name)
953
975
if (!value )
954
976
elog (ERROR , "function %s is unknown" , name );
955
977
956
- /* get type of function pointer */
957
- typ = LLVMTypeOf (value );
958
- Assert (typ != NULL );
959
- /* dereference pointer */
960
- typ = LLVMGetElementType (typ );
961
- Assert (typ != NULL );
962
- /* and look at return type */
963
- typ = LLVMGetReturnType (typ );
964
- Assert (typ != NULL );
978
+ typ = LLVMGetFunctionReturnType (value ); /* in llvmjit_wrap.cpp */
965
979
966
980
return typ ;
967
981
}
@@ -978,7 +992,6 @@ llvm_create_types(void)
978
992
char path [MAXPGPATH ];
979
993
LLVMMemoryBufferRef buf ;
980
994
char * msg ;
981
- LLVMModuleRef mod = NULL ;
982
995
983
996
snprintf (path , MAXPGPATH , "%s/%s" , pkglib_path , "llvmjit_types.bc" );
984
997
@@ -990,7 +1003,7 @@ llvm_create_types(void)
990
1003
}
991
1004
992
1005
/* eagerly load contents, going to need it all */
993
- if (LLVMParseBitcode2 (buf , & mod ))
1006
+ if (LLVMParseBitcode2 (buf , & llvm_types_module ))
994
1007
{
995
1008
elog (ERROR , "LLVMParseBitcode2 of %s failed" , path );
996
1009
}
@@ -1000,45 +1013,33 @@ llvm_create_types(void)
1000
1013
* Load triple & layout from clang emitted file so we're guaranteed to be
1001
1014
* compatible.
1002
1015
*/
1003
- llvm_triple = pstrdup (LLVMGetTarget (mod ));
1004
- llvm_layout = pstrdup (LLVMGetDataLayoutStr (mod ));
1005
-
1006
- TypeSizeT = load_type (mod , "TypeSizeT" );
1007
- TypeParamBool = load_return_type (mod , "FunctionReturningBool" );
1008
- TypeStorageBool = load_type (mod , "TypeStorageBool" );
1009
- TypePGFunction = load_type (mod , "TypePGFunction" );
1010
- StructNullableDatum = load_type (mod , "StructNullableDatum" );
1011
- StructExprContext = load_type (mod , "StructExprContext" );
1012
- StructExprEvalStep = load_type (mod , "StructExprEvalStep" );
1013
- StructExprState = load_type (mod , "StructExprState" );
1014
- StructFunctionCallInfoData = load_type (mod , "StructFunctionCallInfoData" );
1015
- StructMemoryContextData = load_type (mod , "StructMemoryContextData" );
1016
- StructTupleTableSlot = load_type (mod , "StructTupleTableSlot" );
1017
- StructHeapTupleTableSlot = load_type (mod , "StructHeapTupleTableSlot" );
1018
- StructMinimalTupleTableSlot = load_type (mod , "StructMinimalTupleTableSlot" );
1019
- StructHeapTupleData = load_type (mod , "StructHeapTupleData" );
1020
- StructTupleDescData = load_type (mod , "StructTupleDescData" );
1021
- StructAggState = load_type (mod , "StructAggState" );
1022
- StructAggStatePerGroupData = load_type (mod , "StructAggStatePerGroupData" );
1023
- StructAggStatePerTransData = load_type (mod , "StructAggStatePerTransData" );
1024
-
1025
- AttributeTemplate = LLVMGetNamedFunction (mod , "AttributeTemplate" );
1026
- FuncStrlen = LLVMGetNamedFunction (mod , "strlen" );
1027
- FuncVarsizeAny = LLVMGetNamedFunction (mod , "varsize_any" );
1028
- FuncSlotGetsomeattrsInt = LLVMGetNamedFunction (mod , "slot_getsomeattrs_int" );
1029
- FuncSlotGetmissingattrs = LLVMGetNamedFunction (mod , "slot_getmissingattrs" );
1030
- FuncMakeExpandedObjectReadOnlyInternal = LLVMGetNamedFunction (mod , "MakeExpandedObjectReadOnlyInternal" );
1031
- FuncExecEvalSubscriptingRef = LLVMGetNamedFunction (mod , "ExecEvalSubscriptingRef" );
1032
- FuncExecEvalSysVar = LLVMGetNamedFunction (mod , "ExecEvalSysVar" );
1033
- FuncExecAggTransReparent = LLVMGetNamedFunction (mod , "ExecAggTransReparent" );
1034
- FuncExecAggInitGroup = LLVMGetNamedFunction (mod , "ExecAggInitGroup" );
1035
-
1036
- /*
1037
- * Leave the module alive, otherwise references to function would be
1038
- * dangling.
1039
- */
1040
-
1041
- return ;
1016
+ llvm_triple = pstrdup (LLVMGetTarget (llvm_types_module ));
1017
+ llvm_layout = pstrdup (LLVMGetDataLayoutStr (llvm_types_module ));
1018
+
1019
+ TypeSizeT = llvm_pg_var_type ("TypeSizeT" );
1020
+ TypeParamBool = load_return_type (llvm_types_module , "FunctionReturningBool" );
1021
+ TypeStorageBool = llvm_pg_var_type ("TypeStorageBool" );
1022
+ TypePGFunction = llvm_pg_var_type ("TypePGFunction" );
1023
+ StructNullableDatum = llvm_pg_var_type ("StructNullableDatum" );
1024
+ StructExprContext = llvm_pg_var_type ("StructExprContext" );
1025
+ StructExprEvalStep = llvm_pg_var_type ("StructExprEvalStep" );
1026
+ StructExprState = llvm_pg_var_type ("StructExprState" );
1027
+ StructFunctionCallInfoData = llvm_pg_var_type ("StructFunctionCallInfoData" );
1028
+ StructMemoryContextData = llvm_pg_var_type ("StructMemoryContextData" );
1029
+ StructTupleTableSlot = llvm_pg_var_type ("StructTupleTableSlot" );
1030
+ StructHeapTupleTableSlot = llvm_pg_var_type ("StructHeapTupleTableSlot" );
1031
+ StructMinimalTupleTableSlot = llvm_pg_var_type ("StructMinimalTupleTableSlot" );
1032
+ StructHeapTupleData = llvm_pg_var_type ("StructHeapTupleData" );
1033
+ StructHeapTupleHeaderData = llvm_pg_var_type ("StructHeapTupleHeaderData" );
1034
+ StructTupleDescData = llvm_pg_var_type ("StructTupleDescData" );
1035
+ StructAggState = llvm_pg_var_type ("StructAggState" );
1036
+ StructAggStatePerGroupData = llvm_pg_var_type ("StructAggStatePerGroupData" );
1037
+ StructAggStatePerTransData = llvm_pg_var_type ("StructAggStatePerTransData" );
1038
+ StructPlanState = llvm_pg_var_type ("StructPlanState" );
1039
+ StructMinimalTupleData = llvm_pg_var_type ("StructMinimalTupleData" );
1040
+
1041
+ AttributeTemplate = LLVMGetNamedFunction (llvm_types_module , "AttributeTemplate" );
1042
+ ExecEvalSubroutineTemplate = LLVMGetNamedFunction (llvm_types_module , "ExecEvalSubroutineTemplate" );
1042
1043
}
1043
1044
1044
1045
/*
0 commit comments