@@ -76,16 +76,8 @@ LLVMTypeRef StructAggStatePerGroupData;
76
76
LLVMTypeRef StructAggStatePerTransData ;
77
77
78
78
LLVMValueRef AttributeTemplate ;
79
- LLVMValueRef FuncStrlen ;
80
- LLVMValueRef FuncVarsizeAny ;
81
- LLVMValueRef FuncSlotGetsomeattrsInt ;
82
- LLVMValueRef FuncSlotGetmissingattrs ;
83
- LLVMValueRef FuncMakeExpandedObjectReadOnlyInternal ;
84
- LLVMValueRef FuncExecEvalSubscriptingRef ;
85
- LLVMValueRef FuncExecEvalSysVar ;
86
- LLVMValueRef FuncExecAggTransReparent ;
87
- LLVMValueRef FuncExecAggInitGroup ;
88
79
80
+ LLVMModuleRef llvm_types_module = NULL ;
89
81
90
82
static bool llvm_session_initialized = false;
91
83
static size_t llvm_generation = 0 ;
@@ -301,26 +293,32 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
301
293
}
302
294
303
295
/*
304
- * Return declaration forpassed function, adding it to the module if
305
- * necessary.
296
+ * Return declaration fora function referenced in llvmjit_types.c, adding it
297
+ *to the module if necessary.
306
298
*
307
- * This is used to make functionsimported by llvm_create_types() known to the
308
- * module that's currently being worked on.
299
+ * This is used to make functionsdiscovered via llvm_create_types() known to
300
+ *the module that's currently being worked on.
309
301
*/
310
302
LLVMValueRef
311
- llvm_get_decl (LLVMModuleRef mod ,LLVMValueRef v_src )
303
+ llvm_pg_func (LLVMModuleRef mod ,const char * funcname )
312
304
{
305
+ LLVMValueRef v_srcfn ;
313
306
LLVMValueRef v_fn ;
314
307
315
308
/* don't repeatedly add function */
316
- v_fn = LLVMGetNamedFunction (mod ,LLVMGetValueName ( v_src ) );
309
+ v_fn = LLVMGetNamedFunction (mod ,funcname );
317
310
if (v_fn )
318
311
return v_fn ;
319
312
313
+ v_srcfn = LLVMGetNamedFunction (llvm_types_module ,funcname );
314
+
315
+ if (!v_srcfn )
316
+ elog (ERROR ,"function %s not in llvmjit_types.c" ,funcname );
317
+
320
318
v_fn = LLVMAddFunction (mod ,
321
- LLVMGetValueName ( v_src ) ,
322
- LLVMGetElementType (LLVMTypeOf (v_src )));
323
- llvm_copy_attributes (v_src ,v_fn );
319
+ funcname ,
320
+ LLVMGetElementType (LLVMTypeOf (v_srcfn )));
321
+ llvm_copy_attributes (v_srcfn ,v_fn );
324
322
325
323
return v_fn ;
326
324
}
@@ -775,7 +773,6 @@ llvm_create_types(void)
775
773
char path [MAXPGPATH ];
776
774
LLVMMemoryBufferRef buf ;
777
775
char * msg ;
778
- LLVMModuleRef mod = NULL ;
779
776
780
777
snprintf (path ,MAXPGPATH ,"%s/%s" ,pkglib_path ,"llvmjit_types.bc" );
781
778
@@ -787,7 +784,7 @@ llvm_create_types(void)
787
784
}
788
785
789
786
/* eagerly load contents, going to need it all */
790
- if (LLVMParseBitcode2 (buf ,& mod ))
787
+ if (LLVMParseBitcode2 (buf ,& llvm_types_module ))
791
788
{
792
789
elog (ERROR ,"LLVMParseBitcode2 of %s failed" ,path );
793
790
}
@@ -797,43 +794,29 @@ llvm_create_types(void)
797
794
* Load triple & layout from clang emitted file so we're guaranteed to be
798
795
* compatible.
799
796
*/
800
- llvm_triple = pstrdup (LLVMGetTarget (mod ));
801
- llvm_layout = pstrdup (LLVMGetDataLayoutStr (mod ));
802
-
803
- TypeSizeT = load_type (mod ,"TypeSizeT" );
804
- TypeParamBool = load_return_type (mod ,"FunctionReturningBool" );
805
- TypeStorageBool = load_type (mod ,"TypeStorageBool" );
806
- TypePGFunction = load_type (mod ,"TypePGFunction" );
807
- StructNullableDatum = load_type (mod ,"StructNullableDatum" );
808
- StructExprContext = load_type (mod ,"StructExprContext" );
809
- StructExprEvalStep = load_type (mod ,"StructExprEvalStep" );
810
- StructExprState = load_type (mod ,"StructExprState" );
811
- StructFunctionCallInfoData = load_type (mod ,"StructFunctionCallInfoData" );
812
- StructMemoryContextData = load_type (mod ,"StructMemoryContextData" );
813
- StructTupleTableSlot = load_type (mod ,"StructTupleTableSlot" );
814
- StructHeapTupleTableSlot = load_type (mod ,"StructHeapTupleTableSlot" );
815
- StructMinimalTupleTableSlot = load_type (mod ,"StructMinimalTupleTableSlot" );
816
- StructHeapTupleData = load_type (mod ,"StructHeapTupleData" );
817
- StructTupleDescData = load_type (mod ,"StructTupleDescData" );
818
- StructAggState = load_type (mod ,"StructAggState" );
819
- StructAggStatePerGroupData = load_type (mod ,"StructAggStatePerGroupData" );
820
- StructAggStatePerTransData = load_type (mod ,"StructAggStatePerTransData" );
821
-
822
- AttributeTemplate = LLVMGetNamedFunction (mod ,"AttributeTemplate" );
823
- FuncStrlen = LLVMGetNamedFunction (mod ,"strlen" );
824
- FuncVarsizeAny = LLVMGetNamedFunction (mod ,"varsize_any" );
825
- FuncSlotGetsomeattrsInt = LLVMGetNamedFunction (mod ,"slot_getsomeattrs_int" );
826
- FuncSlotGetmissingattrs = LLVMGetNamedFunction (mod ,"slot_getmissingattrs" );
827
- FuncMakeExpandedObjectReadOnlyInternal = LLVMGetNamedFunction (mod ,"MakeExpandedObjectReadOnlyInternal" );
828
- FuncExecEvalSubscriptingRef = LLVMGetNamedFunction (mod ,"ExecEvalSubscriptingRef" );
829
- FuncExecEvalSysVar = LLVMGetNamedFunction (mod ,"ExecEvalSysVar" );
830
- FuncExecAggTransReparent = LLVMGetNamedFunction (mod ,"ExecAggTransReparent" );
831
- FuncExecAggInitGroup = LLVMGetNamedFunction (mod ,"ExecAggInitGroup" );
832
-
833
- /*
834
- * Leave the module alive, otherwise references to function would be
835
- * dangling.
836
- */
797
+ llvm_triple = pstrdup (LLVMGetTarget (llvm_types_module ));
798
+ llvm_layout = pstrdup (LLVMGetDataLayoutStr (llvm_types_module ));
799
+
800
+ TypeSizeT = load_type (llvm_types_module ,"TypeSizeT" );
801
+ TypeParamBool = load_return_type (llvm_types_module ,"FunctionReturningBool" );
802
+ TypeStorageBool = load_type (llvm_types_module ,"TypeStorageBool" );
803
+ TypePGFunction = load_type (llvm_types_module ,"TypePGFunction" );
804
+ StructNullableDatum = load_type (llvm_types_module ,"StructNullableDatum" );
805
+ StructExprContext = load_type (llvm_types_module ,"StructExprContext" );
806
+ StructExprEvalStep = load_type (llvm_types_module ,"StructExprEvalStep" );
807
+ StructExprState = load_type (llvm_types_module ,"StructExprState" );
808
+ StructFunctionCallInfoData = load_type (llvm_types_module ,"StructFunctionCallInfoData" );
809
+ StructMemoryContextData = load_type (llvm_types_module ,"StructMemoryContextData" );
810
+ StructTupleTableSlot = load_type (llvm_types_module ,"StructTupleTableSlot" );
811
+ StructHeapTupleTableSlot = load_type (llvm_types_module ,"StructHeapTupleTableSlot" );
812
+ StructMinimalTupleTableSlot = load_type (llvm_types_module ,"StructMinimalTupleTableSlot" );
813
+ StructHeapTupleData = load_type (llvm_types_module ,"StructHeapTupleData" );
814
+ StructTupleDescData = load_type (llvm_types_module ,"StructTupleDescData" );
815
+ StructAggState = load_type (llvm_types_module ,"StructAggState" );
816
+ StructAggStatePerGroupData = load_type (llvm_types_module ,"StructAggStatePerGroupData" );
817
+ StructAggStatePerTransData = load_type (llvm_types_module ,"StructAggStatePerTransData" );
818
+
819
+ AttributeTemplate = LLVMGetNamedFunction (llvm_types_module ,"AttributeTemplate" );
837
820
}
838
821
839
822
/*