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

Commit37d5bab

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 parent3f9b1f2 commit37d5bab

File tree

8 files changed

+481
-264
lines changed

8 files changed

+481
-264
lines changed

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

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,10 @@ LLVMTypeRef TypeStorageBool;
6464
LLVMTypeRefTypePGFunction;
6565
LLVMTypeRefStructNullableDatum;
6666
LLVMTypeRefStructHeapTupleData;
67+
LLVMTypeRefStructMinimalTupleData;
6768
LLVMTypeRefStructTupleDescData;
6869
LLVMTypeRefStructTupleTableSlot;
70+
LLVMTypeRefStructHeapTupleHeaderData;
6971
LLVMTypeRefStructHeapTupleTableSlot;
7072
LLVMTypeRefStructMinimalTupleTableSlot;
7173
LLVMTypeRefStructMemoryContextData;
@@ -76,8 +78,11 @@ LLVMTypeRef StructExprState;
7678
LLVMTypeRefStructAggState;
7779
LLVMTypeRefStructAggStatePerGroupData;
7880
LLVMTypeRefStructAggStatePerTransData;
81+
LLVMTypeRefStructPlanState;
7982

8083
LLVMValueRefAttributeTemplate;
84+
LLVMValueRefExecEvalSubroutineTemplate;
85+
LLVMValueRefExecEvalBoolSubroutineTemplate;
8186

8287
staticLLVMModuleRefllvm_types_module=NULL;
8388

@@ -451,11 +456,7 @@ llvm_pg_var_type(const char *varname)
451456
if (!v_srcvar)
452457
elog(ERROR,"variable %s not in llvmjit_types.c",varname);
453458

454-
/* look at the contained type */
455-
typ=LLVMTypeOf(v_srcvar);
456-
Assert(typ!=NULL&&LLVMGetTypeKind(typ)==LLVMPointerTypeKind);
457-
typ=LLVMGetElementType(typ);
458-
Assert(typ!=NULL);
459+
typ=LLVMGlobalGetValueType(v_srcvar);
459460

460461
returntyp;
461462
}
@@ -467,12 +468,14 @@ llvm_pg_var_type(const char *varname)
467468
LLVMTypeRef
468469
llvm_pg_var_func_type(constchar*varname)
469470
{
470-
LLVMTypeReftyp=llvm_pg_var_type(varname);
471+
LLVMValueRefv_srcvar;
472+
LLVMTypeReftyp;
473+
474+
v_srcvar=LLVMGetNamedFunction(llvm_types_module,varname);
475+
if (!v_srcvar)
476+
elog(ERROR,"function %s not in llvmjit_types.c",varname);
471477

472-
/* look at the contained type */
473-
Assert(LLVMGetTypeKind(typ)==LLVMPointerTypeKind);
474-
typ=LLVMGetElementType(typ);
475-
Assert(typ!=NULL&&LLVMGetTypeKind(typ)==LLVMFunctionTypeKind);
478+
typ=LLVMGetFunctionType(v_srcvar);
476479

477480
returntyp;
478481
}
@@ -502,7 +505,7 @@ llvm_pg_func(LLVMModuleRef mod, const char *funcname)
502505

503506
v_fn=LLVMAddFunction(mod,
504507
funcname,
505-
LLVMGetElementType(LLVMTypeOf(v_srcfn)));
508+
LLVMGetFunctionType(v_srcfn));
506509
llvm_copy_attributes(v_srcfn,v_fn);
507510

508511
returnv_fn;
@@ -598,7 +601,7 @@ llvm_function_reference(LLVMJitContext *context,
598601
fcinfo->flinfo->fn_oid);
599602
v_fn=LLVMGetNamedGlobal(mod,funcname);
600603
if (v_fn!=0)
601-
returnLLVMBuildLoad(builder,v_fn,"");
604+
returnl_load(builder,TypePGFunction,v_fn,"");
602605

603606
v_fn_addr=l_ptr_const(fcinfo->flinfo->fn_addr,TypePGFunction);
604607

@@ -608,15 +611,15 @@ llvm_function_reference(LLVMJitContext *context,
608611
LLVMSetLinkage(v_fn,LLVMPrivateLinkage);
609612
LLVMSetUnnamedAddr(v_fn, true);
610613

611-
returnLLVMBuildLoad(builder,v_fn,"");
614+
returnl_load(builder,TypePGFunction,v_fn,"");
612615
}
613616

614617
/* check if function already has been added */
615618
v_fn=LLVMGetNamedFunction(mod,funcname);
616619
if (v_fn!=0)
617620
returnv_fn;
618621

619-
v_fn=LLVMAddFunction(mod,funcname,LLVMGetElementType(TypePGFunction));
622+
v_fn=LLVMAddFunction(mod,funcname,LLVMGetFunctionType(AttributeTemplate));
620623

621624
returnv_fn;
622625
}
@@ -874,12 +877,15 @@ llvm_session_initialize(void)
874877
}
875878

876879
/*
877-
* When targeting an LLVM version with opaque pointers enabled by default,
878-
* turn them off for the context we build our code in. We don't need to
879-
* do so for other contexts (e.g. llvm_ts_context). Once the IR is
880-
* generated, it carries the necessary information.
880+
* When targeting LLVM 15, turn off opaque pointers for the context we
881+
* build our code in. We don't need to do so for other contexts (e.g.
882+
* llvm_ts_context). Once the IR is generated, it carries the necessary
883+
* information.
884+
*
885+
* For 16 and above, opaque pointers must be used, and we have special
886+
* code for that.
881887
*/
882-
#ifLLVM_VERSION_MAJOR>14
888+
#ifLLVM_VERSION_MAJOR==15
883889
LLVMContextSetOpaquePointers(LLVMGetGlobalContext(), false);
884890
#endif
885891

@@ -1050,15 +1056,7 @@ load_return_type(LLVMModuleRef mod, const char *name)
10501056
if (!value)
10511057
elog(ERROR,"function %s is unknown",name);
10521058

1053-
/* get type of function pointer */
1054-
typ=LLVMTypeOf(value);
1055-
Assert(typ!=NULL);
1056-
/* dereference pointer */
1057-
typ=LLVMGetElementType(typ);
1058-
Assert(typ!=NULL);
1059-
/* and look at return type */
1060-
typ=LLVMGetReturnType(typ);
1061-
Assert(typ!=NULL);
1059+
typ=LLVMGetFunctionReturnType(value);/* in llvmjit_wrap.cpp */
10621060

10631061
returntyp;
10641062
}
@@ -1123,12 +1121,17 @@ llvm_create_types(void)
11231121
StructHeapTupleTableSlot=llvm_pg_var_type("StructHeapTupleTableSlot");
11241122
StructMinimalTupleTableSlot=llvm_pg_var_type("StructMinimalTupleTableSlot");
11251123
StructHeapTupleData=llvm_pg_var_type("StructHeapTupleData");
1124+
StructHeapTupleHeaderData=llvm_pg_var_type("StructHeapTupleHeaderData");
11261125
StructTupleDescData=llvm_pg_var_type("StructTupleDescData");
11271126
StructAggState=llvm_pg_var_type("StructAggState");
11281127
StructAggStatePerGroupData=llvm_pg_var_type("StructAggStatePerGroupData");
11291128
StructAggStatePerTransData=llvm_pg_var_type("StructAggStatePerTransData");
1129+
StructPlanState=llvm_pg_var_type("StructPlanState");
1130+
StructMinimalTupleData=llvm_pg_var_type("StructMinimalTupleData");
11301131

11311132
AttributeTemplate=LLVMGetNamedFunction(llvm_types_module,"AttributeTemplate");
1133+
ExecEvalSubroutineTemplate=LLVMGetNamedFunction(llvm_types_module,"ExecEvalSubroutineTemplate");
1134+
ExecEvalBoolSubroutineTemplate=LLVMGetNamedFunction(llvm_types_module,"ExecEvalBoolSubroutineTemplate");
11321135
}
11331136

11341137
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp