Skip to content

Commit b059d2f

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

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
LLVMTypeRef StructAggStatePerTransData;
7777

7878
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;
8879

80+
LLVMModuleRef llvm_types_module = NULL;
8981

9082
static bool llvm_session_initialized = false;
9183
static 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
*/
310302
LLVMValueRef
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
/*

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
else if (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
else if (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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy