1 | /*------------------------------------------------------------------------- |
2 | * jit.h |
3 | * Provider independent JIT infrastructure. |
4 | * |
5 | * Copyright (c) 2016-2019, PostgreSQL Global Development Group |
6 | * |
7 | * src/include/jit/jit.h |
8 | * |
9 | *------------------------------------------------------------------------- |
10 | */ |
11 | #ifndef JIT_H |
12 | #define JIT_H |
13 | |
14 | #include "executor/instrument.h" |
15 | #include "utils/resowner.h" |
16 | |
17 | |
18 | /* Flags determining what kind of JIT operations to perform */ |
19 | #define PGJIT_NONE 0 |
20 | #define PGJIT_PERFORM (1 << 0) |
21 | #define PGJIT_OPT3 (1 << 1) |
22 | #define PGJIT_INLINE (1 << 2) |
23 | #define PGJIT_EXPR (1 << 3) |
24 | #define PGJIT_DEFORM (1 << 4) |
25 | |
26 | |
27 | typedef struct JitInstrumentation |
28 | { |
29 | /* number of emitted functions */ |
30 | size_t created_functions; |
31 | |
32 | /* accumulated time to generate code */ |
33 | instr_time generation_counter; |
34 | |
35 | /* accumulated time for inlining */ |
36 | instr_time inlining_counter; |
37 | |
38 | /* accumulated time for optimization */ |
39 | instr_time optimization_counter; |
40 | |
41 | /* accumulated time for code emission */ |
42 | instr_time emission_counter; |
43 | } JitInstrumentation; |
44 | |
45 | /* |
46 | * DSM structure for accumulating jit instrumentation of all workers. |
47 | */ |
48 | typedef struct SharedJitInstrumentation |
49 | { |
50 | int num_workers; |
51 | JitInstrumentation jit_instr[FLEXIBLE_ARRAY_MEMBER]; |
52 | } SharedJitInstrumentation; |
53 | |
54 | typedef struct JitContext |
55 | { |
56 | /* see PGJIT_* above */ |
57 | int flags; |
58 | |
59 | ResourceOwner resowner; |
60 | |
61 | JitInstrumentation instr; |
62 | } JitContext; |
63 | |
64 | typedef struct JitProviderCallbacks JitProviderCallbacks; |
65 | |
66 | extern void _PG_jit_provider_init(JitProviderCallbacks *cb); |
67 | typedef void (*JitProviderInit) (JitProviderCallbacks *cb); |
68 | typedef void (*JitProviderResetAfterErrorCB) (void); |
69 | typedef void (*JitProviderReleaseContextCB) (JitContext *context); |
70 | struct ExprState; |
71 | typedef bool (*JitProviderCompileExprCB) (struct ExprState *state); |
72 | |
73 | struct JitProviderCallbacks |
74 | { |
75 | JitProviderResetAfterErrorCB reset_after_error; |
76 | JitProviderReleaseContextCB release_context; |
77 | JitProviderCompileExprCB compile_expr; |
78 | }; |
79 | |
80 | |
81 | /* GUCs */ |
82 | extern bool jit_enabled; |
83 | extern char *jit_provider; |
84 | extern bool jit_debugging_support; |
85 | extern bool jit_dump_bitcode; |
86 | extern bool jit_expressions; |
87 | extern bool jit_profiling_support; |
88 | extern bool jit_tuple_deforming; |
89 | extern double jit_above_cost; |
90 | extern double jit_inline_above_cost; |
91 | extern double jit_optimize_above_cost; |
92 | |
93 | |
94 | extern void jit_reset_after_error(void); |
95 | extern void jit_release_context(JitContext *context); |
96 | |
97 | /* |
98 | * Functions for attempting to JIT code. Callers must accept that these might |
99 | * not be able to perform JIT (i.e. return false). |
100 | */ |
101 | extern bool jit_compile_expr(struct ExprState *state); |
102 | extern void InstrJitAgg(JitInstrumentation *dst, JitInstrumentation *add); |
103 | |
104 | |
105 | #endif /* JIT_H */ |
106 | |