From 07c9833945e3f762f5d5cffc7272b6477bd14291 Mon Sep 17 00:00:00 2001 From: soumyadeep2007 Date: Sun, 27 Oct 2019 23:35:45 -0700 Subject: [PATCH v1] Rely on llvmjit_types for building EvalFunc calls Rely on llvmjit_types's referenced_functions for building calls to EvalFuncs. This ensures signature checks for the calls constructed. Discussion: https://postgr.es/m/20191024224303.jvdx3hq3ak2vbit3%40alap3.anarazel.de:wq --- src/backend/jit/llvm/llvmjit.c | 60 +++++++++++++++++++ src/backend/jit/llvm/llvmjit_expr.c | 88 +++++++++++----------------- src/backend/jit/llvm/llvmjit_types.c | 31 +++++++++- src/include/jit/llvmjit.h | 30 +++++++++- 4 files changed, 153 insertions(+), 56 deletions(-) diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c index cdac7b1c5d..7a66d48645 100644 --- a/src/backend/jit/llvm/llvmjit.c +++ b/src/backend/jit/llvm/llvmjit.c @@ -98,6 +98,37 @@ LLVMValueRef FuncExecAggInitGroup; LLVMValueRef FuncExecEvalArrayCoerceRelabel; LLVMValueRef FuncExecEvalArrayCoerceUnpack; LLVMValueRef FuncExecEvalArrayCoercePack; +LLVMValueRef FuncExecAggInitGroup; +LLVMValueRef FuncExecAggTransReparent; +LLVMValueRef FuncExecEvalAggOrderedTransDatum; +LLVMValueRef FuncExecEvalAggOrderedTransTuple; +LLVMValueRef FuncExecEvalAlternativeSubPlan; +LLVMValueRef FuncExecEvalArrayExpr; +LLVMValueRef FuncExecEvalConstraintCheck; +LLVMValueRef FuncExecEvalConstraintNotNull; +LLVMValueRef FuncExecEvalConvertRowtype; +LLVMValueRef FuncExecEvalCurrentOfExpr; +LLVMValueRef FuncExecEvalFieldSelect; +LLVMValueRef FuncExecEvalFieldStoreDeForm; +LLVMValueRef FuncExecEvalFieldStoreForm; +LLVMValueRef FuncExecEvalFuncExprFusage; +LLVMValueRef FuncExecEvalFuncExprStrictFusage; +LLVMValueRef FuncExecEvalGroupingFunc; +LLVMValueRef FuncExecEvalMinMax; +LLVMValueRef FuncExecEvalNextValueExpr; +LLVMValueRef FuncExecEvalParamExec; +LLVMValueRef FuncExecEvalParamExtern; +LLVMValueRef FuncExecEvalRow; +LLVMValueRef FuncExecEvalRowNotNull; +LLVMValueRef FuncExecEvalRowNull; +LLVMValueRef FuncExecEvalScalarArrayOp; +LLVMValueRef FuncExecEvalSQLValueFunction; +LLVMValueRef FuncExecEvalSubPlan; +LLVMValueRef FuncExecEvalSubscriptingRefAssign; +LLVMValueRef FuncExecEvalSubscriptingRefFetch; +LLVMValueRef FuncExecEvalSubscriptingRefOld; +LLVMValueRef FuncExecEvalWholeRowVar; +LLVMValueRef FuncExecEvalXmlExpr; static bool llvm_session_initialized = false; @@ -928,6 +959,35 @@ llvm_create_types(void) FuncExecEvalArrayCoerceRelabel = LLVMGetNamedFunction(mod, "ExecEvalArrayCoerceRelabel"); FuncExecEvalArrayCoerceUnpack = LLVMGetNamedFunction(mod, "ExecEvalArrayCoerceUnpack"); FuncExecEvalArrayCoercePack = LLVMGetNamedFunction(mod, "ExecEvalArrayCoercePack"); + FuncExecEvalFuncExprFusage = LLVMGetNamedFunction(mod, "ExecEvalFuncExprFusage"); + FuncExecEvalFuncExprStrictFusage = LLVMGetNamedFunction(mod, "ExecEvalFuncExprStrictFusage"); + FuncExecEvalRowNull = LLVMGetNamedFunction(mod, "ExecEvalRowNull"); + FuncExecEvalRowNotNull = LLVMGetNamedFunction(mod, "ExecEvalRowNotNull"); + FuncExecEvalParamExec = LLVMGetNamedFunction(mod, "ExecEvalParamExec"); + FuncExecEvalParamExtern = LLVMGetNamedFunction(mod, "ExecEvalParamExtern"); + FuncExecEvalSubscriptingRefOld = LLVMGetNamedFunction(mod, "ExecEvalSubscriptingRefOld"); + FuncExecEvalSubscriptingRefAssign = LLVMGetNamedFunction(mod, "ExecEvalSubscriptingRefAssign"); + FuncExecEvalSubscriptingRefFetch = LLVMGetNamedFunction(mod, "ExecEvalSubscriptingRefFetch"); + FuncExecEvalSQLValueFunction = LLVMGetNamedFunction(mod, "ExecEvalSQLValueFunction"); + FuncExecEvalCurrentOfExpr = LLVMGetNamedFunction(mod, "ExecEvalCurrentOfExpr"); + FuncExecEvalNextValueExpr = LLVMGetNamedFunction(mod, "ExecEvalNextValueExpr"); + FuncExecEvalArrayExpr = LLVMGetNamedFunction(mod, "ExecEvalArrayExpr"); + FuncExecEvalRow = LLVMGetNamedFunction(mod, "ExecEvalRow"); + FuncExecEvalMinMax = LLVMGetNamedFunction(mod, "ExecEvalMinMax"); + FuncExecEvalFieldSelect = LLVMGetNamedFunction(mod, "ExecEvalFieldSelect"); + FuncExecEvalFieldStoreDeForm = LLVMGetNamedFunction(mod, "ExecEvalFieldStoreDeForm"); + FuncExecEvalFieldStoreForm = LLVMGetNamedFunction(mod, "ExecEvalFieldStoreForm"); + FuncExecEvalConstraintNotNull = LLVMGetNamedFunction(mod, "ExecEvalConstraintNotNull"); + FuncExecEvalConstraintCheck = LLVMGetNamedFunction(mod, "ExecEvalConstraintCheck"); + FuncExecEvalConvertRowtype = LLVMGetNamedFunction(mod, "ExecEvalConvertRowtype"); + FuncExecEvalScalarArrayOp = LLVMGetNamedFunction(mod, "ExecEvalScalarArrayOp"); + FuncExecEvalXmlExpr = LLVMGetNamedFunction(mod, "ExecEvalXmlExpr"); + FuncExecEvalGroupingFunc = LLVMGetNamedFunction(mod, "ExecEvalGroupingFunc"); + FuncExecEvalSubPlan = LLVMGetNamedFunction(mod, "ExecEvalSubPlan"); + FuncExecEvalAlternativeSubPlan = LLVMGetNamedFunction(mod, "ExecEvalAlternativeSubPlan"); + FuncExecEvalAggOrderedTransDatum = LLVMGetNamedFunction(mod, "ExecEvalAggOrderedTransDatum"); + FuncExecEvalAggOrderedTransTuple = LLVMGetNamedFunction(mod, "ExecEvalAggOrderedTransTuple"); + FuncExecEvalWholeRowVar = LLVMGetNamedFunction(mod, "ExecEvalWholeRowVar"); /* * Leave the module alive, otherwise references to function would be diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index bbe0fd0cb3..9284e32bde 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -131,12 +131,12 @@ static LLVMValueRef BuildV1CallFC(ExprCompileState *ecs, LLVMValueRef v_fcinfo, LLVMValueRef *v_fcinfo_isnull); -#define build_EvalXFunc(ecs, funcname, opno, ...) \ - build_EvalXFuncInt(ecs, funcname, opno, \ +#define build_EvalXFunc(ecs, v_fn, opno, ...) \ + build_EvalXFuncInt(ecs, v_fn, opno, \ lengthof(((LLVMValueRef[]){__VA_ARGS__})), \ ((LLVMValueRef[]){__VA_ARGS__})) -static void build_EvalXFuncInt(ExprCompileState *ecs, const char *funcname, +static void build_EvalXFuncInt(ExprCompileState *ecs, LLVMValueRef v_fn, int opno, int natts, LLVMValueRef v_args[]); /* @@ -561,7 +561,7 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_WHOLEROW: - build_EvalXFunc(&ecs, "ExecEvalWholeRowVar", opno, + build_EvalXFunc(&ecs, FuncExecEvalWholeRowVar, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -798,7 +798,7 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_FUNCEXPR_FUSAGE: - build_EvalXFunc(&ecs, "ExecEvalFuncExprFusage", opno, + build_EvalXFunc(&ecs, FuncExecEvalFuncExprFusage, opno, v_resultp, expr_fcinfo_ref(&ecs, op->d.func.fcinfo_data, NULL)); LLVMBuildBr(b, opblocks[opno + 1]); @@ -806,7 +806,7 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) case EEOP_FUNCEXPR_STRICT_FUSAGE: - build_EvalXFunc(&ecs, "ExecEvalFuncExprStrictFusage", opno, + build_EvalXFunc(&ecs, FuncExecEvalFuncExprStrictFusage, opno, v_resultp, expr_fcinfo_ref(&ecs, op->d.func.fcinfo_data, NULL)); LLVMBuildBr(b, opblocks[opno + 1]); @@ -1190,13 +1190,13 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_NULLTEST_ROWISNULL: - build_EvalXFunc(&ecs, "ExecEvalRowNull", opno, + build_EvalXFunc(&ecs, FuncExecEvalRowNull, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_NULLTEST_ROWISNOTNULL: - build_EvalXFunc(&ecs, "ExecEvalRowNotNull", opno, + build_EvalXFunc(&ecs, FuncExecEvalRowNotNull, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -1269,13 +1269,13 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_PARAM_EXEC: - build_EvalXFunc(&ecs, "ExecEvalParamExec", opno, + build_EvalXFunc(&ecs, FuncExecEvalParamExec, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_PARAM_EXTERN: - build_EvalXFunc(&ecs, "ExecEvalParamExtern", opno, + build_EvalXFunc(&ecs, FuncExecEvalParamExtern, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -1322,21 +1322,21 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_SBSREF_OLD: - build_EvalXFunc(&ecs, "ExecEvalSubscriptingRefOld", opno, + build_EvalXFunc(&ecs, FuncExecEvalSubscriptingRefOld, opno, v_resultp, expr_nullable_datum_ref(&ecs, op->d.sbsref.prev)); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_SBSREF_ASSIGN: - build_EvalXFunc(&ecs, "ExecEvalSubscriptingRefAssign", opno, + build_EvalXFunc(&ecs, FuncExecEvalSubscriptingRefAssign, opno, v_resultp, expr_nullable_datum_ref(&ecs, op->d.sbsref.replace)); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_SBSREF_FETCH: - build_EvalXFunc(&ecs, "ExecEvalSubscriptingRefFetch", opno, + build_EvalXFunc(&ecs, FuncExecEvalSubscriptingRefFetch, opno, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -1755,24 +1755,24 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_SQLVALUEFUNCTION: - build_EvalXFunc(&ecs, "ExecEvalSQLValueFunction", opno, + build_EvalXFunc(&ecs, FuncExecEvalSQLValueFunction, opno, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_CURRENTOFEXPR: - build_EvalXFunc(&ecs, "ExecEvalCurrentOfExpr", opno); + build_EvalXFunc(&ecs, FuncExecEvalCurrentOfExpr, opno); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_NEXTVALUEEXPR: - build_EvalXFunc(&ecs, "ExecEvalNextValueExpr", opno, + build_EvalXFunc(&ecs, FuncExecEvalNextValueExpr, opno, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_ARRAYEXPR: - build_EvalXFunc(&ecs, "ExecEvalArrayExpr", opno, v_resultp, + build_EvalXFunc(&ecs, FuncExecEvalArrayExpr, opno, v_resultp, expr_nullable_datum_array_ref(&ecs, op->d.arrayexpr.elements)); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -1842,7 +1842,7 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_ROW: - build_EvalXFunc(&ecs, "ExecEvalRow", opno, + build_EvalXFunc(&ecs, FuncExecEvalRow, opno, v_resultp, expr_nullable_datum_array_ref(&ecs, op->d.row.elements)); LLVMBuildBr(b, opblocks[opno + 1]); @@ -2003,7 +2003,7 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_MINMAX: - build_EvalXFunc(&ecs, "ExecEvalMinMax", opno, + build_EvalXFunc(&ecs, FuncExecEvalMinMax, opno, v_resultp, expr_nullable_datum_array_ref(&ecs, op->d.minmax.arguments), expr_fcinfo_ref(&ecs, op->d.minmax.fcinfo_data, NULL)); @@ -2011,20 +2011,20 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) break; case EEOP_FIELDSELECT: - build_EvalXFunc(&ecs, "ExecEvalFieldSelect", opno, + build_EvalXFunc(&ecs, FuncExecEvalFieldSelect, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_FIELDSTORE_DEFORM: - build_EvalXFunc(&ecs, "ExecEvalFieldStoreDeForm", opno, + build_EvalXFunc(&ecs, FuncExecEvalFieldStoreDeForm, opno, ecs.v_econtext, v_resultp, expr_nullable_datum_array_ref(&ecs, op->d.fieldstore.columns)); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_FIELDSTORE_FORM: - build_EvalXFunc(&ecs, "ExecEvalFieldStoreForm", opno, + build_EvalXFunc(&ecs, FuncExecEvalFieldStoreForm, opno, v_resultp, expr_nullable_datum_array_ref(&ecs, op->d.fieldstore.columns)); LLVMBuildBr(b, opblocks[opno + 1]); @@ -2101,32 +2101,32 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_DOMAIN_NOTNULL: - build_EvalXFunc(&ecs, "ExecEvalConstraintNotNull", opno, + build_EvalXFunc(&ecs, FuncExecEvalConstraintNotNull, opno, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_DOMAIN_CHECK: - build_EvalXFunc(&ecs, "ExecEvalConstraintCheck", opno, + build_EvalXFunc(&ecs, FuncExecEvalConstraintCheck, opno, expr_nullable_datum_ref(&ecs, op->d.domaincheck.check)); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_CONVERT_ROWTYPE: - build_EvalXFunc(&ecs, "ExecEvalConvertRowtype", opno, + build_EvalXFunc(&ecs, FuncExecEvalConvertRowtype, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_SCALARARRAYOP: - build_EvalXFunc(&ecs, "ExecEvalScalarArrayOp", opno, + build_EvalXFunc(&ecs, FuncExecEvalScalarArrayOp, opno, v_resultp, expr_fcinfo_ref(&ecs, op->d.scalararrayop.fcinfo_data, NULL)); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_XMLEXPR: - build_EvalXFunc(&ecs, "ExecEvalXmlExpr", opno, + build_EvalXFunc(&ecs, FuncExecEvalXmlExpr, opno, v_resultp, expr_nullable_datum_array_ref(&ecs, op->d.xmlexpr.args), expr_nullable_datum_array_ref(&ecs, op->d.xmlexpr.named_args)); @@ -2162,7 +2162,7 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_GROUPING_FUNC: - build_EvalXFunc(&ecs, "ExecEvalGroupingFunc", opno, + build_EvalXFunc(&ecs, FuncExecEvalGroupingFunc, opno, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -2196,13 +2196,13 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_SUBPLAN: - build_EvalXFunc(&ecs, "ExecEvalSubPlan", opno, + build_EvalXFunc(&ecs, FuncExecEvalSubPlan, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_ALTERNATIVE_SUBPLAN: - build_EvalXFunc(&ecs, "ExecEvalAlternativeSubPlan", opno, + build_EvalXFunc(&ecs, FuncExecEvalAlternativeSubPlan, opno, ecs.v_econtext, v_resultp); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -2551,13 +2551,13 @@ llvm_compile_expr(ExprState *state, ExprStateBuilder *esb) } case EEOP_AGG_ORDERED_TRANS_DATUM: - build_EvalXFunc(&ecs, "ExecEvalAggOrderedTransDatum", opno, + build_EvalXFunc(&ecs, FuncExecEvalAggOrderedTransDatum, opno, expr_nullable_datum_array_ref(&ecs, op->d.agg_trans_ordered.columns)); LLVMBuildBr(b, opblocks[opno + 1]); break; case EEOP_AGG_ORDERED_TRANS_TUPLE: - build_EvalXFunc(&ecs, "ExecEvalAggOrderedTransTuple", opno, + build_EvalXFunc(&ecs, FuncExecEvalAggOrderedTransTuple, opno, expr_nullable_datum_array_ref(&ecs, op->d.agg_trans_ordered.columns)); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -3115,37 +3115,17 @@ BuildV1CallFC(ExprCompileState *ecs, * Implement an expression step by calling the function funcname. */ static void -build_EvalXFuncInt(ExprCompileState *ecs, const char *funcname, int opno, +build_EvalXFuncInt(ExprCompileState *ecs, LLVMValueRef v_fn, int opno, int nargs, LLVMValueRef v_args[]) { LLVMValueRef v_opno = l_int32_const(opno); LLVMValueRef v_opp; - LLVMTypeRef sig; - LLVMValueRef v_fn; LLVMValueRef *params; - LLVMTypeRef *param_types; params = palloc(sizeof(LLVMValueRef) * (2 + nargs)); - param_types = palloc(sizeof(LLVMValueRef) * (2 + nargs)); v_opp = LLVMBuildGEP(ecs->b, ecs->v_steps, (LLVMValueRef[]){l_int32_const(0), v_opno}, 2, ""); - v_fn = LLVMGetNamedFunction(ecs->mod, funcname); - if (!v_fn) - { - int argno = 0; - - param_types[argno++] = l_ptr(StructExprState); - param_types[argno++] = l_ptr(StructExprEvalStep); - - for (int i = 0; i < nargs; i++) - param_types[argno++] = LLVMTypeOf(v_args[i]); - - sig = LLVMFunctionType(LLVMVoidType(), - param_types, argno, - false); - v_fn = LLVMAddFunction(ecs->mod, funcname, sig); - } { int argno = 0; @@ -3156,6 +3136,6 @@ build_EvalXFuncInt(ExprCompileState *ecs, const char *funcname, int opno, for (int i = 0; i < nargs; i++) params[argno++] = v_args[i]; - LLVMBuildCall(ecs->b, v_fn, params, argno, ""); + LLVMBuildCall(ecs->b, llvm_get_decl(ecs->mod, v_fn), params, argno, ""); } } diff --git a/src/backend/jit/llvm/llvmjit_types.c b/src/backend/jit/llvm/llvmjit_types.c index 082b312060..d414e60b99 100644 --- a/src/backend/jit/llvm/llvmjit_types.c +++ b/src/backend/jit/llvm/llvmjit_types.c @@ -114,5 +114,34 @@ void *referenced_functions[] = ExecAggInitGroup, ExecEvalArrayCoerceRelabel, ExecEvalArrayCoerceUnpack, - ExecEvalArrayCoercePack + ExecEvalArrayCoercePack, + ExecEvalFuncExprFusage, + ExecEvalFuncExprStrictFusage, + ExecEvalRowNull, + ExecEvalRowNotNull, + ExecEvalParamExec, + ExecEvalParamExtern, + ExecEvalSubscriptingRefOld, + ExecEvalSubscriptingRefAssign, + ExecEvalSubscriptingRefFetch, + ExecEvalSQLValueFunction, + ExecEvalCurrentOfExpr, + ExecEvalNextValueExpr, + ExecEvalArrayExpr, + ExecEvalRow, + ExecEvalMinMax, + ExecEvalFieldSelect, + ExecEvalFieldStoreDeForm, + ExecEvalFieldStoreForm, + ExecEvalConstraintNotNull, + ExecEvalConstraintCheck, + ExecEvalConvertRowtype, + ExecEvalScalarArrayOp, + ExecEvalXmlExpr, + ExecEvalGroupingFunc, + ExecEvalSubPlan, + ExecEvalAlternativeSubPlan, + ExecEvalAggOrderedTransDatum, + ExecEvalAggOrderedTransTuple, + ExecEvalWholeRowVar }; diff --git a/src/include/jit/llvmjit.h b/src/include/jit/llvmjit.h index 751bb69e25..4fd0dc7072 100644 --- a/src/include/jit/llvmjit.h +++ b/src/include/jit/llvmjit.h @@ -97,7 +97,35 @@ extern LLVMValueRef FuncExecAggInitGroup; extern LLVMValueRef FuncExecEvalArrayCoerceRelabel; extern LLVMValueRef FuncExecEvalArrayCoerceUnpack; extern LLVMValueRef FuncExecEvalArrayCoercePack; - +extern LLVMValueRef FuncExecEvalFuncExprFusage; +extern LLVMValueRef FuncExecEvalFuncExprStrictFusage; +extern LLVMValueRef FuncExecEvalRowNull; +extern LLVMValueRef FuncExecEvalRowNotNull; +extern LLVMValueRef FuncExecEvalParamExec; +extern LLVMValueRef FuncExecEvalParamExtern; +extern LLVMValueRef FuncExecEvalSubscriptingRefOld; +extern LLVMValueRef FuncExecEvalSubscriptingRefAssign; +extern LLVMValueRef FuncExecEvalSubscriptingRefFetch; +extern LLVMValueRef FuncExecEvalSQLValueFunction; +extern LLVMValueRef FuncExecEvalCurrentOfExpr; +extern LLVMValueRef FuncExecEvalNextValueExpr; +extern LLVMValueRef FuncExecEvalArrayExpr; +extern LLVMValueRef FuncExecEvalRow; +extern LLVMValueRef FuncExecEvalMinMax; +extern LLVMValueRef FuncExecEvalFieldSelect; +extern LLVMValueRef FuncExecEvalFieldStoreDeForm; +extern LLVMValueRef FuncExecEvalFieldStoreForm; +extern LLVMValueRef FuncExecEvalConstraintNotNull; +extern LLVMValueRef FuncExecEvalConstraintCheck; +extern LLVMValueRef FuncExecEvalConvertRowtype; +extern LLVMValueRef FuncExecEvalScalarArrayOp; +extern LLVMValueRef FuncExecEvalXmlExpr; +extern LLVMValueRef FuncExecEvalGroupingFunc; +extern LLVMValueRef FuncExecEvalSubPlan; +extern LLVMValueRef FuncExecEvalAlternativeSubPlan; +extern LLVMValueRef FuncExecEvalAggOrderedTransDatum; +extern LLVMValueRef FuncExecEvalAggOrderedTransTuple; +extern LLVMValueRef FuncExecEvalWholeRowVar; extern void llvm_enter_fatal_on_oom(void); extern void llvm_leave_fatal_on_oom(void); -- 2.23.0