@ -57,12 +57,19 @@ static Datum ExecRunCompiledExpr(ExprState *state, ExprContext *econtext, bool *
static LLVMValueRef BuildV1Call ( LLVMJitContext * context , LLVMBuilderRef b ,
static LLVMValueRef BuildV1Call ( LLVMJitContext * context , LLVMBuilderRef b ,
LLVMModuleRef mod , FunctionCallInfo fcinfo ,
LLVMModuleRef mod , FunctionCallInfo fcinfo ,
LLVMValueRef * v_fcinfo_isnull ) ;
LLVMValueRef * v_fcinfo_isnull ) ;
static void build_EvalXFunc ( LLVMBuilderRef b , LLVMModuleRef mod ,
static LLVMValueRef build_EvalXFuncInt ( LLVMBuilderRef b , LLVMModuleRef mod ,
const char * funcname ,
const char * funcname ,
LLVMValueRef v_state , LLVMValueRef v_econtext ,
LLVMValueRef v_state ,
ExprEvalStep * op ) ;
ExprEvalStep * op ,
int natts , LLVMValueRef v_args [ ] ) ;
static LLVMValueRef create_LifetimeEnd ( LLVMModuleRef mod ) ;
static LLVMValueRef create_LifetimeEnd ( LLVMModuleRef mod ) ;
/* macro making it easier to call ExecEval* functions */
# define build_EvalXFunc(b, mod, funcname, v_state, op, ...) \
build_EvalXFuncInt ( b , mod , funcname , v_state , op , \
lengthof ( ( ( LLVMValueRef [ ] ) { __VA_ARGS__ } ) ) , \
( ( LLVMValueRef [ ] ) { __VA_ARGS__ } ) )
/*
/*
* JIT compile expression .
* JIT compile expression .
@ -344,7 +351,7 @@ llvm_compile_expr(ExprState *state)
params [ 1 ] = l_int32_const ( op - > d . fetch . last_var ) ;
params [ 1 ] = l_int32_const ( op - > d . fetch . last_var ) ;
LLVMBuildCall ( b ,
LLVMBuildCall ( b ,
llvm_get_decl ( mod , FuncSlotGetsomeattrsInt ) ,
llvm_pg_func ( mod , " slot_getsomeattrs_int " ) ,
params , lengthof ( params ) , " " ) ;
params , lengthof ( params ) , " " ) ;
}
}
@ -393,7 +400,6 @@ llvm_compile_expr(ExprState *state)
case EEOP_SCAN_SYSVAR :
case EEOP_SCAN_SYSVAR :
{
{
LLVMValueRef v_slot ;
LLVMValueRef v_slot ;
LLVMValueRef v_params [ 4 ] ;
if ( opcode = = EEOP_INNER_SYSVAR )
if ( opcode = = EEOP_INNER_SYSVAR )
v_slot = v_innerslot ;
v_slot = v_innerslot ;
@ -402,14 +408,8 @@ llvm_compile_expr(ExprState *state)
else
else
v_slot = v_scanslot ;
v_slot = v_scanslot ;
v_params [ 0 ] = v_state ;
build_EvalXFunc ( b , mod , " ExecEvalSysVar " ,
v_params [ 1 ] = l_ptr_const ( op , l_ptr ( StructExprEvalStep ) ) ;
v_state , op , v_econtext , v_slot ) ;
v_params [ 2 ] = v_econtext ;
v_params [ 3 ] = v_slot ;
LLVMBuildCall ( b ,
llvm_get_decl ( mod , FuncExecEvalSysVar ) ,
v_params , lengthof ( v_params ) , " " ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -417,7 +417,7 @@ llvm_compile_expr(ExprState *state)
case EEOP_WHOLEROW :
case EEOP_WHOLEROW :
build_EvalXFunc ( b , mod , " ExecEvalWholeRowVar " ,
build_EvalXFunc ( b , mod , " ExecEvalWholeRowVar " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -514,7 +514,7 @@ llvm_compile_expr(ExprState *state)
v_params [ 0 ] = v_value ;
v_params [ 0 ] = v_value ;
v_value =
v_value =
LLVMBuildCall ( b ,
LLVMBuildCall ( b ,
llvm_get_decl ( mod , FuncMakeExpandedObjectReadOnlyInternal ) ,
llvm_pg_func ( mod , " MakeExpandedObjectReadOnlyInternal " ) ,
v_params , lengthof ( v_params ) , " " ) ;
v_params , lengthof ( v_params ) , " " ) ;
/*
/*
@ -631,14 +631,14 @@ llvm_compile_expr(ExprState *state)
case EEOP_FUNCEXPR_FUSAGE :
case EEOP_FUNCEXPR_FUSAGE :
build_EvalXFunc ( b , mod , " ExecEvalFuncExprFusage " ,
build_EvalXFunc ( b , mod , " ExecEvalFuncExprFusage " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_FUNCEXPR_STRICT_FUSAGE :
case EEOP_FUNCEXPR_STRICT_FUSAGE :
build_EvalXFunc ( b , mod , " ExecEvalFuncExprStrictFusage " ,
build_EvalXFunc ( b , mod , " ExecEvalFuncExprStrictFusage " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -999,13 +999,13 @@ llvm_compile_expr(ExprState *state)
case EEOP_NULLTEST_ROWISNULL :
case EEOP_NULLTEST_ROWISNULL :
build_EvalXFunc ( b , mod , " ExecEvalRowNull " ,
build_EvalXFunc ( b , mod , " ExecEvalRowNull " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_NULLTEST_ROWISNOTNULL :
case EEOP_NULLTEST_ROWISNOTNULL :
build_EvalXFunc ( b , mod , " ExecEvalRowNotNull " ,
build_EvalXFunc ( b , mod , " ExecEvalRowNotNull " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -1076,13 +1076,13 @@ llvm_compile_expr(ExprState *state)
case EEOP_PARAM_EXEC :
case EEOP_PARAM_EXEC :
build_EvalXFunc ( b , mod , " ExecEvalParamExec " ,
build_EvalXFunc ( b , mod , " ExecEvalParamExec " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_PARAM_EXTERN :
case EEOP_PARAM_EXTERN :
build_EvalXFunc ( b , mod , " ExecEvalParamExtern " ,
build_EvalXFunc ( b , mod , " ExecEvalParamExtern " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -1117,19 +1117,19 @@ llvm_compile_expr(ExprState *state)
case EEOP_SBSREF_OLD :
case EEOP_SBSREF_OLD :
build_EvalXFunc ( b , mod , " ExecEvalSubscriptingRefOld " ,
build_EvalXFunc ( b , mod , " ExecEvalSubscriptingRefOld " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_SBSREF_ASSIGN :
case EEOP_SBSREF_ASSIGN :
build_EvalXFunc ( b , mod , " ExecEvalSubscriptingRefAssign " ,
build_EvalXFunc ( b , mod , " ExecEvalSubscriptingRefAssign " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_SBSREF_FETCH :
case EEOP_SBSREF_FETCH :
build_EvalXFunc ( b , mod , " ExecEvalSubscriptingRefFetch " ,
build_EvalXFunc ( b , mod , " ExecEvalSubscriptingRefFetch " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -1221,7 +1221,7 @@ llvm_compile_expr(ExprState *state)
v_params [ 0 ] = v_value ;
v_params [ 0 ] = v_value ;
v_ret =
v_ret =
LLVMBuildCall ( b ,
LLVMBuildCall ( b ,
llvm_get_decl ( mod , FuncMakeExpandedObjectReadOnlyInternal ) ,
llvm_pg_func ( mod , " MakeExpandedObjectReadOnlyInternal " ) ,
v_params , lengthof ( v_params ) , " " ) ;
v_params , lengthof ( v_params ) , " " ) ;
LLVMBuildStore ( b , v_ret , v_resvaluep ) ;
LLVMBuildStore ( b , v_ret , v_resvaluep ) ;
@ -1539,37 +1539,37 @@ llvm_compile_expr(ExprState *state)
case EEOP_SQLVALUEFUNCTION :
case EEOP_SQLVALUEFUNCTION :
build_EvalXFunc ( b , mod , " ExecEvalSQLValueFunction " ,
build_EvalXFunc ( b , mod , " ExecEvalSQLValueFunction " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_CURRENTOFEXPR :
case EEOP_CURRENTOFEXPR :
build_EvalXFunc ( b , mod , " ExecEvalCurrentOfExpr " ,
build_EvalXFunc ( b , mod , " ExecEvalCurrentOfExpr " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_NEXTVALUEEXPR :
case EEOP_NEXTVALUEEXPR :
build_EvalXFunc ( b , mod , " ExecEvalNextValueExpr " ,
build_EvalXFunc ( b , mod , " ExecEvalNextValueExpr " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_ARRAYEXPR :
case EEOP_ARRAYEXPR :
build_EvalXFunc ( b , mod , " ExecEvalArrayExpr " ,
build_EvalXFunc ( b , mod , " ExecEvalArrayExpr " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_ARRAYCOERCE :
case EEOP_ARRAYCOERCE :
build_EvalXFunc ( b , mod , " ExecEvalArrayCoerce " ,
build_EvalXFunc ( b , mod , " ExecEvalArrayCoerce " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_ROW :
case EEOP_ROW :
build_EvalXFunc ( b , mod , " ExecEvalRow " ,
build_EvalXFunc ( b , mod , " ExecEvalRow " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -1724,40 +1724,35 @@ llvm_compile_expr(ExprState *state)
case EEOP_MINMAX :
case EEOP_MINMAX :
build_EvalXFunc ( b , mod , " ExecEvalMinMax " ,
build_EvalXFunc ( b , mod , " ExecEvalMinMax " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_FIELDSELECT :
case EEOP_FIELDSELECT :
build_EvalXFunc ( b , mod , " ExecEvalFieldSelect " ,
build_EvalXFunc ( b , mod , " ExecEvalFieldSelect " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_FIELDSTORE_DEFORM :
case EEOP_FIELDSTORE_DEFORM :
build_EvalXFunc ( b , mod , " ExecEvalFieldStoreDeForm " ,
build_EvalXFunc ( b , mod , " ExecEvalFieldStoreDeForm " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_FIELDSTORE_FORM :
case EEOP_FIELDSTORE_FORM :
build_EvalXFunc ( b , mod , " ExecEvalFieldStoreForm " ,
build_EvalXFunc ( b , mod , " ExecEvalFieldStoreForm " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_SBSREF_SUBSCRIPT :
case EEOP_SBSREF_SUBSCRIPT :
{
{
int jumpdone = op - > d . sbsref_subscript . jumpdone ;
int jumpdone = op - > d . sbsref_subscript . jumpdone ;
LLVMValueRef v_params [ 2 ] ;
LLVMValueRef v_ret ;
LLVMValueRef v_ret ;
v_params [ 0 ] = v_state ;
v_ret = build_EvalXFunc ( b , mod , " ExecEvalSubscriptingRef " ,
v_params [ 1 ] = l_ptr_const ( op , l_ptr ( StructExprEvalStep ) ) ;
v_state , op ) ;
v_ret =
LLVMBuildCall ( b ,
llvm_get_decl ( mod , FuncExecEvalSubscriptingRef ) ,
v_params , lengthof ( v_params ) , " " ) ;
v_ret = LLVMBuildZExt ( b , v_ret , TypeStorageBool , " " ) ;
v_ret = LLVMBuildZExt ( b , v_ret , TypeStorageBool , " " ) ;
LLVMBuildCondBr ( b ,
LLVMBuildCondBr ( b ,
@ -1824,31 +1819,31 @@ llvm_compile_expr(ExprState *state)
case EEOP_DOMAIN_NOTNULL :
case EEOP_DOMAIN_NOTNULL :
build_EvalXFunc ( b , mod , " ExecEvalConstraintNotNull " ,
build_EvalXFunc ( b , mod , " ExecEvalConstraintNotNull " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_DOMAIN_CHECK :
case EEOP_DOMAIN_CHECK :
build_EvalXFunc ( b , mod , " ExecEvalConstraintCheck " ,
build_EvalXFunc ( b , mod , " ExecEvalConstraintCheck " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_CONVERT_ROWTYPE :
case EEOP_CONVERT_ROWTYPE :
build_EvalXFunc ( b , mod , " ExecEvalConvertRowtype " ,
build_EvalXFunc ( b , mod , " ExecEvalConvertRowtype " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_SCALARARRAYOP :
case EEOP_SCALARARRAYOP :
build_EvalXFunc ( b , mod , " ExecEvalScalarArrayOp " ,
build_EvalXFunc ( b , mod , " ExecEvalScalarArrayOp " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_XMLEXPR :
case EEOP_XMLEXPR :
build_EvalXFunc ( b , mod , " ExecEvalXmlExpr " ,
build_EvalXFunc ( b , mod , " ExecEvalXmlExpr " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -1883,7 +1878,7 @@ llvm_compile_expr(ExprState *state)
case EEOP_GROUPING_FUNC :
case EEOP_GROUPING_FUNC :
build_EvalXFunc ( b , mod , " ExecEvalGroupingFunc " ,
build_EvalXFunc ( b , mod , " ExecEvalGroupingFunc " ,
v_state , v_econtext , op ) ;
v_state , op ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -1919,13 +1914,13 @@ llvm_compile_expr(ExprState *state)
case EEOP_SUBPLAN :
case EEOP_SUBPLAN :
build_EvalXFunc ( b , mod , " ExecEvalSubPlan " ,
build_EvalXFunc ( b , mod , " ExecEvalSubPlan " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_ALTERNATIVE_SUBPLAN :
case EEOP_ALTERNATIVE_SUBPLAN :
build_EvalXFunc ( b , mod , " ExecEvalAlternativeSubPlan " ,
build_EvalXFunc ( b , mod , " ExecEvalAlternativeSubPlan " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -2138,7 +2133,7 @@ llvm_compile_expr(ExprState *state)
params [ 2 ] = v_pergroupp ;
params [ 2 ] = v_pergroupp ;
LLVMBuildCall ( b ,
LLVMBuildCall ( b ,
llvm_get_decl ( mod , FuncExecAggInitGroup ) ,
llvm_pg_func ( mod , " ExecAggInitGroup " ) ,
params , lengthof ( params ) ,
params , lengthof ( params ) ,
" " ) ;
" " ) ;
}
}
@ -2357,7 +2352,7 @@ llvm_compile_expr(ExprState *state)
params [ 5 ] = LLVMBuildTrunc ( b , v_transnull ,
params [ 5 ] = LLVMBuildTrunc ( b , v_transnull ,
TypeParamBool , " " ) ;
TypeParamBool , " " ) ;
v_fn = llvm_get_decl ( mod , FuncExecAggTransReparent ) ;
v_fn = llvm_pg_func ( mod , " ExecAggTransReparent " ) ;
v_newval =
v_newval =
LLVMBuildCall ( b , v_fn ,
LLVMBuildCall ( b , v_fn ,
params , lengthof ( params ) ,
params , lengthof ( params ) ,
@ -2386,13 +2381,13 @@ llvm_compile_expr(ExprState *state)
case EEOP_AGG_ORDERED_TRANS_DATUM :
case EEOP_AGG_ORDERED_TRANS_DATUM :
build_EvalXFunc ( b , mod , " ExecEvalAggOrderedTransDatum " ,
build_EvalXFunc ( b , mod , " ExecEvalAggOrderedTransDatum " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
case EEOP_AGG_ORDERED_TRANS_TUPLE :
case EEOP_AGG_ORDERED_TRANS_TUPLE :
build_EvalXFunc ( b , mod , " ExecEvalAggOrderedTransTuple " ,
build_EvalXFunc ( b , mod , " ExecEvalAggOrderedTransTuple " ,
v_state , v_econtext , op ) ;
v_state , op , v_econtext ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
LLVMBuildBr ( b , opblocks [ opno + 1 ] ) ;
break ;
break ;
@ -2504,36 +2499,34 @@ BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b,
/*
/*
* Implement an expression step by calling the function funcname .
* Implement an expression step by calling the function funcname .
*/
*/
static void
static LLVMValueRef
build_EvalXFunc ( LLVMBuilderRef b , LLVMModuleRef mod , const char * funcname ,
build_EvalXFuncInt ( LLVMBuilderRef b , LLVMModuleRef mod , const char * funcname ,
LLVMValueRef v_state , LLVMValueRef v_econtext ,
LLVMValueRef v_state , ExprEvalStep * op ,
ExprEvalStep * op )
int nargs , LLVMValueRef v_args [ ] )
{
{
LLVMTypeRef sig ;
LLVMValueRef v_fn = llvm_pg_func ( mod , funcname ) ;
LLVMValueRef v_fn ;
LLVMValueRef * params ;
LLVMTypeRef param_types [ 3 ] ;
int argno = 0 ;
LLVMValueRef params [ 3 ] ;
LLVMValueRef v_ret ;
v_fn = LLVMGetNamedFunction ( mod , funcname ) ;
/* cheap pre-check as llvm just asserts out */
if ( ! v_fn )
if ( LLVMCountParams ( v_fn ) ! = ( nargs + 2 ) )
{
elog ( ERROR , " parameter mismatch: %s expects %d passed %d " ,
param_types [ 0 ] = l_ptr ( StructExprState ) ;
funcname , LLVMCountParams ( v_fn ) , nargs + 2 ) ;
param_types [ 1 ] = l_ptr ( StructExprEvalStep ) ;
param_types [ 2 ] = l_ptr ( StructExprContext ) ;
sig = LLVMFunctionType ( LLVMVoidType ( ) ,
params = palloc ( sizeof ( LLVMValueRef ) * ( 2 + nargs ) ) ;
param_types , lengthof ( param_types ) ,
false ) ;
v_fn = LLVMAddFunction ( mod , funcname , sig ) ;
}
params [ 0 ] = v_state ;
params [ argno + + ] = v_state ;
params [ 1 ] = l_ptr_const ( op , l_ptr ( StructExprEvalStep ) ) ;
params [ argno + + ] = l_ptr_const ( op , l_ptr ( StructExprEvalStep ) ) ;
params [ 2 ] = v_econtext ;
LLVMBuildCall ( b ,
for ( int i = 0 ; i < nargs ; i + + )
v_fn ,
params [ argno + + ] = v_args [ i ] ;
params , lengthof ( params ) , " " ) ;
v_ret = LLVMBuildCall ( b , v_fn , params , argno , " " ) ;
pfree ( params ) ;
return v_ret ;
}
}
static LLVMValueRef
static LLVMValueRef