1 /*-------------------------------------------------------------------------
2  * jit.h
3  *	  Provider independent JIT infrastructure.
4  *
5  * Copyright (c) 2016-2021, 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