Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb059d2f

Browse files
committed
jit: Reference expression step functions via llvmjit_types.
The main benefit of doing so is that this allows llvm to ensure thattypes match - previously that'd only be detected by a crash within thecalled function. There were a number of cases where we passed asuperfluous parameter...To avoid needing to add all the functions to llvmjit.{c,h}, insteadget them from the llvm module for llvmjit_types.c. Also use that forthe functions from llvmjit_types already in llvmjit.h.Author: Soumyadeep Chakraborty and Andres FreundDiscussion:https://postgr.es/m/CADwEdooww3wZv-sXSfatzFRwMuwa186LyTwkBfwEW6NjtooBPA@mail.gmail.com
1 parentc4f3b63 commitb059d2f

File tree

5 files changed

+157
-158
lines changed

5 files changed

+157
-158
lines changed

‎src/backend/jit/llvm/llvmjit.c

Lines changed: 40 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,8 @@ LLVMTypeRef StructAggStatePerGroupData;
7676
LLVMTypeRefStructAggStatePerTransData;
7777

7878
LLVMValueRefAttributeTemplate;
79-
LLVMValueRefFuncStrlen;
80-
LLVMValueRefFuncVarsizeAny;
81-
LLVMValueRefFuncSlotGetsomeattrsInt;
82-
LLVMValueRefFuncSlotGetmissingattrs;
83-
LLVMValueRefFuncMakeExpandedObjectReadOnlyInternal;
84-
LLVMValueRefFuncExecEvalSubscriptingRef;
85-
LLVMValueRefFuncExecEvalSysVar;
86-
LLVMValueRefFuncExecAggTransReparent;
87-
LLVMValueRefFuncExecAggInitGroup;
8879

80+
LLVMModuleRefllvm_types_module=NULL;
8981

9082
staticboolllvm_session_initialized= false;
9183
staticsize_tllvm_generation=0;
@@ -301,26 +293,32 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
301293
}
302294

303295
/*
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 ifnecessary.
306298
*
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+
*themodule that's currently being worked on.
309301
*/
310302
LLVMValueRef
311-
llvm_get_decl(LLVMModuleRefmod,LLVMValueRefv_src)
303+
llvm_pg_func(LLVMModuleRefmod,constchar*funcname)
312304
{
305+
LLVMValueRefv_srcfn;
313306
LLVMValueRefv_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
returnv_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
returnv_fn;
326324
}
@@ -775,7 +773,6 @@ llvm_create_types(void)
775773
charpath[MAXPGPATH];
776774
LLVMMemoryBufferRefbuf;
777775
char*msg;
778-
LLVMModuleRefmod=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
/*

‎src/backend/jit/llvm/llvmjit_deform.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
331331
v_params[0]=v_slot;
332332
v_params[1]=LLVMBuildZExt(b,v_maxatt,LLVMInt32Type(),"");
333333
v_params[2]=l_int32_const(natts);
334-
LLVMBuildCall(b,llvm_get_decl(mod,FuncSlotGetmissingattrs),
334+
LLVMBuildCall(b,llvm_pg_func(mod,"slot_getmissingattrs"),
335335
v_params,lengthof(v_params),"");
336336
LLVMBuildBr(b,b_find_start);
337337
}
@@ -682,7 +682,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
682682
elseif (att->attlen==-1)
683683
{
684684
v_incby=LLVMBuildCall(b,
685-
llvm_get_decl(mod,FuncVarsizeAny),
685+
llvm_pg_func(mod,"varsize_any"),
686686
&v_attdatap,1,
687687
"varsize_any");
688688
l_callsite_ro(v_incby);
@@ -691,7 +691,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc,
691691
elseif (att->attlen==-2)
692692
{
693693
v_incby=LLVMBuildCall(b,
694-
llvm_get_decl(mod,FuncStrlen),
694+
llvm_pg_func(mod,"strlen"),
695695
&v_attdatap,1,"strlen");
696696

697697
l_callsite_ro(v_incby);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp