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