@@ -76,16 +76,8 @@ LLVMTypeRef StructAggStatePerGroupData;
7676LLVMTypeRef StructAggStatePerTransData ;
7777
7878LLVMValueRef 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 ;
8879
80+ LLVMModuleRef llvm_types_module = NULL ;
8981
9082static bool llvm_session_initialized = false;
9183static size_t llvm_generation = 0 ;
@@ -301,26 +293,32 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
301293}
302294
303295/*
304- * Return declaration for passed function, adding it to the module if
305- * necessary.
296+ * Return declaration for a function referenced in llvmjit_types.c, adding it
297+ * to the module if necessary.
306298 *
307- * This is used to make functions imported by llvm_create_types() known to the
308- * module that's currently being worked on.
299+ * This is used to make functions discovered via llvm_create_types() known to
300+ * the module that's currently being worked on.
309301 */
310302LLVMValueRef
311- llvm_get_decl (LLVMModuleRef mod , LLVMValueRef v_src )
303+ llvm_pg_func (LLVMModuleRef mod , const char * funcname )
312304{
305+ LLVMValueRef v_srcfn ;
313306 LLVMValueRef v_fn ;
314307
315308 /* don't repeatedly add function */
316- v_fn = LLVMGetNamedFunction (mod , LLVMGetValueName ( v_src ) );
309+ v_fn = LLVMGetNamedFunction (mod , funcname );
317310 if (v_fn )
318311 return v_fn ;
319312
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+
320318 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 );
324322
325323 return v_fn ;
326324}
@@ -775,7 +773,6 @@ llvm_create_types(void)
775773 char path [MAXPGPATH ];
776774 LLVMMemoryBufferRef buf ;
777775 char * msg ;
778- LLVMModuleRef mod = NULL ;
779776
780777 snprintf (path , MAXPGPATH , "%s/%s" , pkglib_path , "llvmjit_types.bc" );
781778
@@ -787,7 +784,7 @@ llvm_create_types(void)
787784 }
788785
789786 /* eagerly load contents, going to need it all */
790- if (LLVMParseBitcode2 (buf , & mod ))
787+ if (LLVMParseBitcode2 (buf , & llvm_types_module ))
791788 {
792789 elog (ERROR , "LLVMParseBitcode2 of %s failed" , path );
793790 }
@@ -797,43 +794,29 @@ llvm_create_types(void)
797794 * Load triple & layout from clang emitted file so we're guaranteed to be
798795 * compatible.
799796 */
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" );
837820}
838821
839822/*
0 commit comments