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

Commitf28956b

Browse files
committed
jit: Support opaque pointers in LLVM 16.
Remove use of LLVMGetElementType() and provide the type of all pointersto LLVMBuildXXX() functions when emitting IR, as required by modern LLVMversions[1]. * For LLVM <= 14, we'll still use the old LLVMBuildXXX() functions. * For LLVM == 15, we'll continue to do the same, explicitly opting out of opaque pointer mode. * For LLVM >= 16, we'll use the new LLVMBuildXXX2() functions that take the extra type argument.The difference is hidden behind some new IR emitting wrapper functionsl_load(), l_gep(), l_call() etc. The change is mostly mechanical,except that at each site the correct type had to be provided.In some places we needed to do some extra work to get functions types,including some new wrappers for C++ APIs that are not yet exposed by inLLVM's C API, and some new "example" functions in llvmjit_types.cbecause it's no longer possible to start from the function pointer typeand ask for the function type.Back-patch to 12, because it's a little tricker in 11 and we agreed notto put the latest LLVM support into the upcoming final release of 11.[1]https://llvm.org/docs/OpaquePointers.htmlReviewed-by: Dmitry Dolgov <9erthalion6@gmail.com>Reviewed-by: Ronan Dunklau <ronan.dunklau@aiven.io>Reviewed-by: Andres Freund <andres@anarazel.de>Discussion:https://postgr.es/m/CA%2BhUKGKNX_%3Df%2B1C4r06WETKTq0G4Z_7q4L4Fxn5WWpMycDj9Fw%40mail.gmail.com
1 parentebc093f commitf28956b

File tree

7 files changed

+502
-297
lines changed

7 files changed

+502
-297
lines changed

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

Lines changed: 75 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,10 @@ LLVMTypeRef StructExprState;
8585
LLVMTypeRefStructAggState;
8686
LLVMTypeRefStructAggStatePerGroupData;
8787
LLVMTypeRefStructAggStatePerTransData;
88+
LLVMTypeRefStructPlanState;
8889

8990
LLVMValueRefAttributeTemplate;
91+
LLVMValueRefExecEvalSubroutineTemplate;
9092

9193
LLVMModuleRefllvm_types_module=NULL;
9294

@@ -369,6 +371,45 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
369371
returnNULL;
370372
}
371373

374+
/*
375+
* Return type of a variable in llvmjit_types.c. This is useful to keep types
376+
* in sync between plain C and JIT related code.
377+
*/
378+
LLVMTypeRef
379+
llvm_pg_var_type(constchar*varname)
380+
{
381+
LLVMValueRefv_srcvar;
382+
LLVMTypeReftyp;
383+
384+
/* this'll return a *pointer* to the global */
385+
v_srcvar=LLVMGetNamedGlobal(llvm_types_module,varname);
386+
if (!v_srcvar)
387+
elog(ERROR,"variable %s not in llvmjit_types.c",varname);
388+
389+
typ=LLVMGlobalGetValueType(v_srcvar);
390+
391+
returntyp;
392+
}
393+
394+
/*
395+
* Return function type of a variable in llvmjit_types.c. This is useful to
396+
* keep function types in sync between C and JITed code.
397+
*/
398+
LLVMTypeRef
399+
llvm_pg_var_func_type(constchar*varname)
400+
{
401+
LLVMValueRefv_srcvar;
402+
LLVMTypeReftyp;
403+
404+
v_srcvar=LLVMGetNamedFunction(llvm_types_module,varname);
405+
if (!v_srcvar)
406+
elog(ERROR,"function %s not in llvmjit_types.c",varname);
407+
408+
typ=LLVMGetFunctionType(v_srcvar);
409+
410+
returntyp;
411+
}
412+
372413
/*
373414
* Return declaration for a function referenced in llvmjit_types.c, adding it
374415
* to the module if necessary.
@@ -394,7 +435,7 @@ llvm_pg_func(LLVMModuleRef mod, const char *funcname)
394435

395436
v_fn=LLVMAddFunction(mod,
396437
funcname,
397-
LLVMGetElementType(LLVMTypeOf(v_srcfn)));
438+
LLVMGetFunctionType(v_srcfn));
398439
llvm_copy_attributes(v_srcfn,v_fn);
399440

400441
returnv_fn;
@@ -490,7 +531,7 @@ llvm_function_reference(LLVMJitContext *context,
490531
fcinfo->flinfo->fn_oid);
491532
v_fn=LLVMGetNamedGlobal(mod,funcname);
492533
if (v_fn!=0)
493-
returnLLVMBuildLoad(builder,v_fn,"");
534+
returnl_load(builder,TypePGFunction,v_fn,"");
494535

495536
v_fn_addr=l_ptr_const(fcinfo->flinfo->fn_addr,TypePGFunction);
496537

@@ -500,15 +541,15 @@ llvm_function_reference(LLVMJitContext *context,
500541
LLVMSetLinkage(v_fn,LLVMPrivateLinkage);
501542
LLVMSetUnnamedAddr(v_fn, true);
502543

503-
returnLLVMBuildLoad(builder,v_fn,"");
544+
returnl_load(builder,TypePGFunction,v_fn,"");
504545
}
505546

506547
/* check if function already has been added */
507548
v_fn=LLVMGetNamedFunction(mod,funcname);
508549
if (v_fn!=0)
509550
returnv_fn;
510551

511-
v_fn=LLVMAddFunction(mod,funcname,LLVMGetElementType(TypePGFunction));
552+
v_fn=LLVMAddFunction(mod,funcname,LLVMGetFunctionType(AttributeTemplate));
512553

513554
returnv_fn;
514555
}
@@ -760,12 +801,15 @@ llvm_session_initialize(void)
760801
LLVMInitializeNativeAsmParser();
761802

762803
/*
763-
* When targeting an LLVM version with opaque pointers enabled by
764-
* default, turn them off for the context we build our code in. We don't
765-
* need to do so for other contexts (e.g. llvm_ts_context). Once the IR is
766-
* generated, it carries the necessary information.
804+
* When targeting LLVM 15, turn off opaque pointers for the context we
805+
* build our code in. We don't need to do so for other contexts (e.g.
806+
* llvm_ts_context). Once the IR is generated, it carries the necessary
807+
* information.
808+
*
809+
* For 16 and above, opaque pointers must be used, and we have special
810+
* code for that.
767811
*/
768-
#ifLLVM_VERSION_MAJOR>14
812+
#ifLLVM_VERSION_MAJOR==15
769813
LLVMContextSetOpaquePointers(LLVMGetGlobalContext(), false);
770814
#endif
771815

@@ -915,26 +959,6 @@ llvm_shutdown(int code, Datum arg)
915959
#endif/* LLVM_VERSION_MAJOR > 11 */
916960
}
917961

918-
/* helper for llvm_create_types, returning a global var's type */
919-
staticLLVMTypeRef
920-
load_type(LLVMModuleRefmod,constchar*name)
921-
{
922-
LLVMValueRefvalue;
923-
LLVMTypeReftyp;
924-
925-
/* this'll return a *pointer* to the global */
926-
value=LLVMGetNamedGlobal(mod,name);
927-
if (!value)
928-
elog(ERROR,"type %s is unknown",name);
929-
930-
/* therefore look at the contained type and return that */
931-
typ=LLVMTypeOf(value);
932-
Assert(typ!=NULL);
933-
typ=LLVMGetElementType(typ);
934-
Assert(typ!=NULL);
935-
returntyp;
936-
}
937-
938962
/* helper for llvm_create_types, returning a function's return type */
939963
staticLLVMTypeRef
940964
load_return_type(LLVMModuleRefmod,constchar*name)
@@ -947,15 +971,7 @@ load_return_type(LLVMModuleRef mod, const char *name)
947971
if (!value)
948972
elog(ERROR,"function %s is unknown",name);
949973

950-
/* get type of function pointer */
951-
typ=LLVMTypeOf(value);
952-
Assert(typ!=NULL);
953-
/* dereference pointer */
954-
typ=LLVMGetElementType(typ);
955-
Assert(typ!=NULL);
956-
/* and look at return type */
957-
typ=LLVMGetReturnType(typ);
958-
Assert(typ!=NULL);
974+
typ=LLVMGetFunctionReturnType(value);/* in llvmjit_wrap.cpp */
959975

960976
returntyp;
961977
}
@@ -996,26 +1012,30 @@ llvm_create_types(void)
9961012
llvm_triple=pstrdup(LLVMGetTarget(llvm_types_module));
9971013
llvm_layout=pstrdup(LLVMGetDataLayoutStr(llvm_types_module));
9981014

999-
TypeSizeT=load_type(llvm_types_module,"TypeSizeT");
1015+
TypeSizeT=llvm_pg_var_type("TypeSizeT");
10001016
TypeParamBool=load_return_type(llvm_types_module,"FunctionReturningBool");
1001-
TypeStorageBool=load_type(llvm_types_module,"TypeStorageBool");
1002-
TypePGFunction=load_type(llvm_types_module,"TypePGFunction");
1003-
StructNullableDatum=load_type(llvm_types_module,"StructNullableDatum");
1004-
StructExprContext=load_type(llvm_types_module,"StructExprContext");
1005-
StructExprEvalStep=load_type(llvm_types_module,"StructExprEvalStep");
1006-
StructExprState=load_type(llvm_types_module,"StructExprState");
1007-
StructFunctionCallInfoData=load_type(llvm_types_module,"StructFunctionCallInfoData");
1008-
StructMemoryContextData=load_type(llvm_types_module,"StructMemoryContextData");
1009-
StructTupleTableSlot=load_type(llvm_types_module,"StructTupleTableSlot");
1010-
StructHeapTupleTableSlot=load_type(llvm_types_module,"StructHeapTupleTableSlot");
1011-
StructMinimalTupleTableSlot=load_type(llvm_types_module,"StructMinimalTupleTableSlot");
1012-
StructHeapTupleData=load_type(llvm_types_module,"StructHeapTupleData");
1013-
StructTupleDescData=load_type(llvm_types_module,"StructTupleDescData");
1014-
StructAggState=load_type(llvm_types_module,"StructAggState");
1015-
StructAggStatePerGroupData=load_type(llvm_types_module,"StructAggStatePerGroupData");
1016-
StructAggStatePerTransData=load_type(llvm_types_module,"StructAggStatePerTransData");
1017+
TypeStorageBool=llvm_pg_var_type("TypeStorageBool");
1018+
TypePGFunction=llvm_pg_var_type("TypePGFunction");
1019+
StructNullableDatum=llvm_pg_var_type("StructNullableDatum");
1020+
StructExprContext=llvm_pg_var_type("StructExprContext");
1021+
StructExprEvalStep=llvm_pg_var_type("StructExprEvalStep");
1022+
StructExprState=llvm_pg_var_type("StructExprState");
1023+
StructFunctionCallInfoData=llvm_pg_var_type("StructFunctionCallInfoData");
1024+
StructMemoryContextData=llvm_pg_var_type("StructMemoryContextData");
1025+
StructTupleTableSlot=llvm_pg_var_type("StructTupleTableSlot");
1026+
StructHeapTupleTableSlot=llvm_pg_var_type("StructHeapTupleTableSlot");
1027+
StructMinimalTupleTableSlot=llvm_pg_var_type("StructMinimalTupleTableSlot");
1028+
StructHeapTupleData=llvm_pg_var_type("StructHeapTupleData");
1029+
StructHeapTupleHeaderData=llvm_pg_var_type("StructHeapTupleHeaderData");
1030+
StructTupleDescData=llvm_pg_var_type("StructTupleDescData");
1031+
StructAggState=llvm_pg_var_type("StructAggState");
1032+
StructAggStatePerGroupData=llvm_pg_var_type("StructAggStatePerGroupData");
1033+
StructAggStatePerTransData=llvm_pg_var_type("StructAggStatePerTransData");
1034+
StructPlanState=llvm_pg_var_type("StructPlanState");
1035+
StructMinimalTupleData=llvm_pg_var_type("StructMinimalTupleData");
10171036

10181037
AttributeTemplate=LLVMGetNamedFunction(llvm_types_module,"AttributeTemplate");
1038+
ExecEvalSubroutineTemplate=LLVMGetNamedFunction(llvm_types_module,"ExecEvalSubroutineTemplate");
10191039
}
10201040

10211041
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp