PostgreSQL Source Code: src/include/jit/llvmjit.h Source File

PostgreSQL Source Code git master
llvmjit.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 * llvmjit.h
3 * LLVM JIT provider.
4 *
5 * Copyright (c) 2016-2025, PostgreSQL Global Development Group
6 *
7 * src/include/jit/llvmjit.h
8 *
9 *-------------------------------------------------------------------------
10 */
11#ifndef LLVMJIT_H
12#define LLVMJIT_H
13
14/*
15 * To avoid breaking cpluspluscheck, allow including the file even when LLVM
16 * is not available.
17 */
18#ifdef USE_LLVM
19
20#include "jit/llvmjit_backport.h"
21
22#include <llvm-c/Types.h>
23#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER
24#include <llvm-c/OrcEE.h>
25#endif
26
27
28/*
29 * File needs to be includable by both C and C++ code, and include other
30 * headers doing the same. Therefore wrap C portion in our own extern "C" if
31 * in C++ mode.
32 */
33#ifdef __cplusplus
34extern "C"
35{
36#endif
37
38#include "access/tupdesc.h"
39#include "fmgr.h"
40#include "jit/jit.h"
41#include "nodes/pg_list.h"
42
43typedef struct LLVMJitContext
44{
45 JitContext base;
46
47 /* used to ensure cleanup of context */
48 ResourceOwner resowner;
49
50 /* number of modules created */
51 size_t module_generation;
52
53 /*
54 * The LLVM Context used by this JIT context. An LLVM context is reused
55 * across many compilations, but occasionally reset to prevent it using
56 * too much memory due to more and more types accumulating.
57 */
58 LLVMContextRef llvm_context;
59
60 /* current, "open for write", module */
61 LLVMModuleRef module;
62
63 /* is there any pending code that needs to be emitted */
64 bool compiled;
65
66 /* # of objects emitted, used to generate non-conflicting names */
67 int counter;
68
69 /* list of handles for code emitted via Orc */
70 List *handles;
71} LLVMJitContext;
72
73/* type and struct definitions */
74extern PGDLLIMPORT LLVMTypeRef TypeParamBool;
75extern PGDLLIMPORT LLVMTypeRef TypePGFunction;
76extern PGDLLIMPORT LLVMTypeRef TypeSizeT;
77extern PGDLLIMPORT LLVMTypeRef TypeDatum;
78extern PGDLLIMPORT LLVMTypeRef TypeStorageBool;
79
80extern PGDLLIMPORT LLVMTypeRef StructNullableDatum;
81extern PGDLLIMPORT LLVMTypeRef StructTupleDescData;
82extern PGDLLIMPORT LLVMTypeRef StructHeapTupleData;
83extern PGDLLIMPORT LLVMTypeRef StructHeapTupleHeaderData;
84extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleData;
85extern PGDLLIMPORT LLVMTypeRef StructTupleTableSlot;
86extern PGDLLIMPORT LLVMTypeRef StructHeapTupleTableSlot;
87extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleTableSlot;
88extern PGDLLIMPORT LLVMTypeRef StructMemoryContextData;
89extern PGDLLIMPORT LLVMTypeRef StructFunctionCallInfoData;
90extern PGDLLIMPORT LLVMTypeRef StructExprContext;
91extern PGDLLIMPORT LLVMTypeRef StructExprEvalStep;
92extern PGDLLIMPORT LLVMTypeRef StructExprState;
93extern PGDLLIMPORT LLVMTypeRef StructAggState;
94extern PGDLLIMPORT LLVMTypeRef StructAggStatePerTransData;
95extern PGDLLIMPORT LLVMTypeRef StructAggStatePerGroupData;
96extern PGDLLIMPORT LLVMTypeRef StructPlanState;
97
98extern PGDLLIMPORT LLVMValueRef AttributeTemplate;
99extern PGDLLIMPORT LLVMValueRef ExecEvalBoolSubroutineTemplate;
100extern PGDLLIMPORT LLVMValueRef ExecEvalSubroutineTemplate;
101
102
103extern void llvm_enter_fatal_on_oom(void);
104extern void llvm_leave_fatal_on_oom(void);
105extern bool llvm_in_fatal_on_oom(void);
106extern void llvm_reset_after_error(void);
107extern void llvm_assert_in_fatal_section(void);
108
109extern LLVMJitContext *llvm_create_context(int jitFlags);
110extern LLVMModuleRef llvm_mutable_module(LLVMJitContext *context);
111extern char *llvm_expand_funcname(LLVMJitContext *context, const char *basename);
112extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
113extern void llvm_split_symbol_name(const char *name, char **modname, char **funcname);
114extern LLVMTypeRef llvm_pg_var_type(const char *varname);
115extern LLVMTypeRef llvm_pg_var_func_type(const char *varname);
116extern LLVMValueRef llvm_pg_func(LLVMModuleRef mod, const char *funcname);
117extern void llvm_copy_attributes(LLVMValueRef from, LLVMValueRef to);
118extern LLVMValueRef llvm_function_reference(LLVMJitContext *context,
119 LLVMBuilderRef builder,
120 LLVMModuleRef mod,
121 FunctionCallInfo fcinfo);
122
123extern void llvm_inline_reset_caches(void);
124extern void llvm_inline(LLVMModuleRef mod);
125
126/*
127 ****************************************************************************
128 * Code generation functions.
129 ****************************************************************************
130 */
131extern bool llvm_compile_expr(struct ExprState *state);
132struct TupleTableSlotOps;
133extern LLVMValueRef slot_compile_deform(struct LLVMJitContext *context, TupleDesc desc,
134 const struct TupleTableSlotOps *ops, int natts);
135
136/*
137 ****************************************************************************
138 * Extensions / Backward compatibility section of the LLVM C API
139 * Error handling related functions.
140 ****************************************************************************
141 */
142extern LLVMTypeRef LLVMGetFunctionReturnType(LLVMValueRef r);
143extern LLVMTypeRef LLVMGetFunctionType(LLVMValueRef r);
144#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER
145extern LLVMOrcObjectLayerRef LLVMOrcCreateRTDyldObjectLinkingLayerWithSafeSectionMemoryManager(LLVMOrcExecutionSessionRef ES);
146#endif
147
148#ifdef __cplusplus
149} /* extern "C" */
150#endif
151
152#endif /* USE_LLVM */
153#endif /* LLVMJIT_H */
#define PGDLLIMPORT
Definition: c.h:1319
#define funcname
Definition: indent_codes.h:69
LLVMTypeRef StructFunctionCallInfoData
Definition: llvmjit.c:70
LLVMTypeRef StructMinimalTupleData
Definition: llvmjit.c:63
LLVMTypeRef StructMinimalTupleTableSlot
Definition: llvmjit.c:68
LLVMTypeRef StructPlanState
Definition: llvmjit.c:77
static LLVMContextRef llvm_context
Definition: llvmjit.c:95
LLVMJitContext * llvm_create_context(int jitFlags)
Definition: llvmjit.c:224
LLVMTypeRef StructExprState
Definition: llvmjit.c:73
LLVMTypeRef StructExprEvalStep
Definition: llvmjit.c:72
LLVMValueRef llvm_pg_func(LLVMModuleRef mod, const char *funcname)
Definition: llvmjit.c:465
LLVMTypeRef TypeParamBool
Definition: llvmjit.c:58
LLVMTypeRef StructMemoryContextData
Definition: llvmjit.c:69
LLVMTypeRef StructAggStatePerGroupData
Definition: llvmjit.c:75
LLVMTypeRef llvm_pg_var_type(const char *varname)
Definition: llvmjit.c:423
LLVMTypeRef TypeSizeT
Definition: llvmjit.c:56
LLVMValueRef llvm_function_reference(LLVMJitContext *context, LLVMBuilderRef builder, LLVMModuleRef mod, FunctionCallInfo fcinfo)
Definition: llvmjit.c:541
char * llvm_expand_funcname(struct LLVMJitContext *context, const char *basename)
Definition: llvmjit.c:342
void llvm_split_symbol_name(const char *name, char **modname, char **funcname)
Definition: llvmjit.c:1047
LLVMTypeRef llvm_pg_var_func_type(const char *varname)
Definition: llvmjit.c:443
LLVMTypeRef StructTupleTableSlot
Definition: llvmjit.c:65
LLVMTypeRef TypeStorageBool
Definition: llvmjit.c:59
LLVMTypeRef TypeDatum
Definition: llvmjit.c:57
LLVMTypeRef StructHeapTupleTableSlot
Definition: llvmjit.c:67
LLVMModuleRef llvm_mutable_module(LLVMJitContext *context)
Definition: llvmjit.c:317
LLVMTypeRef StructAggState
Definition: llvmjit.c:74
LLVMTypeRef TypePGFunction
Definition: llvmjit.c:60
LLVMTypeRef StructTupleDescData
Definition: llvmjit.c:64
LLVMValueRef AttributeTemplate
Definition: llvmjit.c:79
LLVMTypeRef StructExprContext
Definition: llvmjit.c:71
LLVMTypeRef StructHeapTupleHeaderData
Definition: llvmjit.c:66
LLVMTypeRef StructHeapTupleData
Definition: llvmjit.c:62
void * llvm_get_function(LLVMJitContext *context, const char *funcname)
Definition: llvmjit.c:363
LLVMTypeRef StructNullableDatum
Definition: llvmjit.c:61
LLVMValueRef ExecEvalSubroutineTemplate
Definition: llvmjit.c:80
LLVMValueRef ExecEvalBoolSubroutineTemplate
Definition: llvmjit.c:81
LLVMTypeRef StructAggStatePerTransData
Definition: llvmjit.c:76
void llvm_copy_attributes(LLVMValueRef v_from, LLVMValueRef v_to)
Definition: llvmjit.c:517
LLVMValueRef slot_compile_deform(LLVMJitContext *context, TupleDesc desc, const TupleTableSlotOps *ops, int natts)
Definition: llvmjit_deform.c:34
void llvm_enter_fatal_on_oom(void)
bool llvm_in_fatal_on_oom(void)
void llvm_assert_in_fatal_section(void)
void llvm_reset_after_error(void)
void llvm_leave_fatal_on_oom(void)
bool llvm_compile_expr(ExprState *state)
Definition: llvmjit_expr.c:78
void llvm_inline(LLVMModuleRef M)
void llvm_inline_reset_caches(void)
LLVMTypeRef LLVMGetFunctionReturnType(LLVMValueRef r)
Definition: llvmjit_wrap.cpp:38
LLVMTypeRef LLVMGetFunctionType(LLVMValueRef r)
Definition: llvmjit_wrap.cpp:44
Definition: jit.h:58
Definition: pg_list.h:54
Definition: regguts.h:323
const char * name

AltStyle によって変換されたページ (->オリジナル) /