18#include <llvm-c/Core.h>
19#include <llvm-c/Target.h>
27static inline LLVMValueRef
28l_ptr_const(
void *ptr, LLVMTypeRef
type)
30 LLVMValueRef
c = LLVMConstInt(
TypeSizeT, (uintptr_t) ptr,
false);
32 return LLVMConstIntToPtr(
c,
type);
38static inline LLVMTypeRef
41 return LLVMPointerType(t, 0);
47static inline LLVMValueRef
48l_int8_const(LLVMContextRef lc,
int8 i)
50 return LLVMConstInt(LLVMInt8TypeInContext(lc),
i,
false);
56static inline LLVMValueRef
57l_int16_const(LLVMContextRef lc,
int16 i)
59 return LLVMConstInt(LLVMInt16TypeInContext(lc),
i,
false);
65static inline LLVMValueRef
66l_int32_const(LLVMContextRef lc,
int32 i)
68 return LLVMConstInt(LLVMInt32TypeInContext(lc),
i,
false);
74static inline LLVMValueRef
75l_int64_const(LLVMContextRef lc,
int64 i)
77 return LLVMConstInt(LLVMInt64TypeInContext(lc),
i,
false);
83static inline LLVMValueRef
84l_sizet_const(
size_t i)
92static inline LLVMValueRef
101static inline LLVMValueRef
110static inline LLVMValueRef
116static inline LLVMValueRef
117l_struct_gep(LLVMBuilderRef
b, LLVMTypeRef t, LLVMValueRef v,
int32 idx,
const char *
name)
119 return LLVMBuildStructGEP2(
b, t, v,
idx,
"");
122static inline LLVMValueRef
123l_gep(LLVMBuilderRef
b, LLVMTypeRef t, LLVMValueRef v, LLVMValueRef *indices,
int32 nindices,
const char *
name)
125 return LLVMBuildGEP2(
b, t, v, indices, nindices,
name);
128static inline LLVMValueRef
129l_load(LLVMBuilderRef
b, LLVMTypeRef t, LLVMValueRef v,
const char *
name)
131 return LLVMBuildLoad2(
b, t, v,
name);
134static inline LLVMValueRef
135l_call(LLVMBuilderRef
b, LLVMTypeRef t, LLVMValueRef
fn, LLVMValueRef *
args,
int32 nargs,
const char *
name)
137 return LLVMBuildCall2(
b, t,
fn,
args, nargs,
name);
143static inline LLVMValueRef
144l_load_struct_gep(LLVMBuilderRef
b, LLVMTypeRef t, LLVMValueRef v,
int32 idx,
const char *
name)
147 LLVMStructGetTypeAtIndex(t,
idx),
148 l_struct_gep(
b, t, v,
idx,
""),
155static inline LLVMValueRef
156l_load_gep1(LLVMBuilderRef
b, LLVMTypeRef t, LLVMValueRef v, LLVMValueRef
idx,
const char *
name)
158 return l_load(
b, t, l_gep(
b, t, v, &
idx, 1,
""),
name);
162static inline LLVMBasicBlockRef l_bb_before_v(LLVMBasicBlockRef r,
const char *fmt,...)
pg_attribute_printf(2, 3);
168static inline LLVMBasicBlockRef
169l_bb_before_v(LLVMBasicBlockRef r, const
char *fmt,...)
179 lc = LLVMGetTypeContext(LLVMTypeOf(LLVMGetBasicBlockParent(r)));
181 return LLVMInsertBasicBlockInContext(lc, r,
buf);
185static inline LLVMBasicBlockRef l_bb_append_v(LLVMValueRef f,
const char *fmt,...)
pg_attribute_printf(2, 3);
191static inline LLVMBasicBlockRef
192l_bb_append_v(LLVMValueRef f, const
char *fmt,...)
202 lc = LLVMGetTypeContext(LLVMTypeOf(f));
204 return LLVMAppendBasicBlockInContext(lc, f,
buf);
211l_callsite_ro(LLVMValueRef f)
213 const char argname[] =
"readonly";
214 LLVMAttributeRef ref;
216 ref = LLVMCreateStringAttribute(LLVMGetTypeContext(LLVMTypeOf(f)),
221 LLVMAddCallSiteAttribute(f, LLVMAttributeFunctionIndex, ref);
228l_callsite_alwaysinline(LLVMValueRef f)
230 const char argname[] =
"alwaysinline";
232 LLVMAttributeRef attr;
234 id = LLVMGetEnumAttributeKindForName(argname,
235 sizeof(argname) - 1);
236 attr = LLVMCreateEnumAttribute(LLVMGetTypeContext(LLVMTypeOf(f)),
id, 0);
237 LLVMAddCallSiteAttribute(f, LLVMAttributeFunctionIndex, attr);
243static inline LLVMValueRef
244l_mcxt_switch(LLVMModuleRef mod, LLVMBuilderRef
b, LLVMValueRef nc)
246 const char *cmc =
"CurrentMemoryContext";
250 if (!(
cur = LLVMGetNamedGlobal(mod, cmc)))
253 LLVMBuildStore(
b, nc,
cur);
261static inline LLVMValueRef
262l_funcnullp(LLVMBuilderRef
b, LLVMValueRef v_fcinfo,
size_t argno)
267 v_args = l_struct_gep(
b,
272 v_argn = l_struct_gep(
b,
277 return l_struct_gep(
b,
287static inline LLVMValueRef
288l_funcvaluep(LLVMBuilderRef
b, LLVMValueRef v_fcinfo,
size_t argno)
293 v_args = l_struct_gep(
b,
298 v_argn = l_struct_gep(
b,
303 return l_struct_gep(
b,
313static inline LLVMValueRef
314l_funcnull(LLVMBuilderRef
b, LLVMValueRef v_fcinfo,
size_t argno)
322static inline LLVMValueRef
323l_funcvalue(LLVMBuilderRef
b, LLVMValueRef v_fcinfo,
size_t argno)
325 return l_load(
b,
TypeDatum, l_funcvaluep(
b, v_fcinfo, argno),
"");
Datum idx(PG_FUNCTION_ARGS)
#define pg_attribute_printf(f, a)
#define FIELDNO_FUNCTIONCALLINFODATA_ARGS
LLVMTypeRef StructFunctionCallInfoData
LLVMTypeRef TypeParamBool
LLVMTypeRef StructMemoryContextData
LLVMTypeRef TypeStorageBool
LLVMTypeRef StructNullableDatum
#define FIELDNO_NULLABLE_DATUM_ISNULL
#define FIELDNO_NULLABLE_DATUM_DATUM
static void * fn(void *arg)