123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- /*-------------------------------------------------------------------------
- * llvmjit.h
- * LLVM JIT provider.
- *
- * Copyright (c) 2016-2022, PostgreSQL Global Development Group
- *
- * src/include/jit/llvmjit.h
- *
- *-------------------------------------------------------------------------
- */
- #ifndef LLVMJIT_H
- #define LLVMJIT_H
- /*
- * To avoid breaking cpluspluscheck, allow including the file even when LLVM
- * is not available.
- */
- #ifdef USE_LLVM
- #include <llvm-c/Types.h>
- /*
- * File needs to be includable by both C and C++ code, and include other
- * headers doing the same. Therefore wrap C portion in our own extern "C" if
- * in C++ mode.
- */
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- #include "access/tupdesc.h"
- #include "fmgr.h"
- #include "jit/jit.h"
- #include "nodes/pg_list.h"
- typedef struct LLVMJitContext
- {
- JitContext base;
- /* number of modules created */
- size_t module_generation;
- /* current, "open for write", module */
- LLVMModuleRef module;
- /* is there any pending code that needs to be emitted */
- bool compiled;
- /* # of objects emitted, used to generate non-conflicting names */
- int counter;
- /* list of handles for code emitted via Orc */
- List *handles;
- } LLVMJitContext;
- /* llvm module containing information about types */
- extern PGDLLIMPORT LLVMModuleRef llvm_types_module;
- /* type and struct definitions */
- extern PGDLLIMPORT LLVMTypeRef TypeParamBool;
- extern PGDLLIMPORT LLVMTypeRef TypePGFunction;
- extern PGDLLIMPORT LLVMTypeRef TypeSizeT;
- extern PGDLLIMPORT LLVMTypeRef TypeStorageBool;
- extern PGDLLIMPORT LLVMTypeRef StructNullableDatum;
- extern PGDLLIMPORT LLVMTypeRef StructTupleDescData;
- extern PGDLLIMPORT LLVMTypeRef StructHeapTupleData;
- extern PGDLLIMPORT LLVMTypeRef StructTupleTableSlot;
- extern PGDLLIMPORT LLVMTypeRef StructHeapTupleTableSlot;
- extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleTableSlot;
- extern PGDLLIMPORT LLVMTypeRef StructMemoryContextData;
- extern PGDLLIMPORT LLVMTypeRef StructFunctionCallInfoData;
- extern PGDLLIMPORT LLVMTypeRef StructExprContext;
- extern PGDLLIMPORT LLVMTypeRef StructExprEvalStep;
- extern PGDLLIMPORT LLVMTypeRef StructExprState;
- extern PGDLLIMPORT LLVMTypeRef StructAggState;
- extern PGDLLIMPORT LLVMTypeRef StructAggStatePerTransData;
- extern PGDLLIMPORT LLVMTypeRef StructAggStatePerGroupData;
- extern PGDLLIMPORT LLVMValueRef AttributeTemplate;
- extern void llvm_enter_fatal_on_oom(void);
- extern void llvm_leave_fatal_on_oom(void);
- extern bool llvm_in_fatal_on_oom(void);
- extern void llvm_reset_after_error(void);
- extern void llvm_assert_in_fatal_section(void);
- extern LLVMJitContext *llvm_create_context(int jitFlags);
- extern LLVMModuleRef llvm_mutable_module(LLVMJitContext *context);
- extern char *llvm_expand_funcname(LLVMJitContext *context, const char *basename);
- extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
- extern void llvm_split_symbol_name(const char *name, char **modname, char **funcname);
- extern LLVMTypeRef llvm_pg_var_type(const char *varname);
- extern LLVMTypeRef llvm_pg_var_func_type(const char *varname);
- extern LLVMValueRef llvm_pg_func(LLVMModuleRef mod, const char *funcname);
- extern void llvm_copy_attributes(LLVMValueRef from, LLVMValueRef to);
- extern LLVMValueRef llvm_function_reference(LLVMJitContext *context,
- LLVMBuilderRef builder,
- LLVMModuleRef mod,
- FunctionCallInfo fcinfo);
- extern void llvm_inline(LLVMModuleRef mod);
- /*
- ****************************************************************************
- * Code generation functions.
- ****************************************************************************
- */
- extern bool llvm_compile_expr(struct ExprState *state);
- struct TupleTableSlotOps;
- extern LLVMValueRef slot_compile_deform(struct LLVMJitContext *context, TupleDesc desc,
- const struct TupleTableSlotOps *ops, int natts);
- /*
- ****************************************************************************
- * Extensions / Backward compatibility section of the LLVM C API
- * Error handling related functions.
- ****************************************************************************
- */
- #if defined(HAVE_DECL_LLVMGETHOSTCPUNAME) && !HAVE_DECL_LLVMGETHOSTCPUNAME
- /** Get the host CPU as a string. The result needs to be disposed with
- LLVMDisposeMessage. */
- extern char *LLVMGetHostCPUName(void);
- #endif
- #if defined(HAVE_DECL_LLVMGETHOSTCPUFEATURES) && !HAVE_DECL_LLVMGETHOSTCPUFEATURES
- /** Get the host CPU features as a string. The result needs to be disposed
- with LLVMDisposeMessage. */
- extern char *LLVMGetHostCPUFeatures(void);
- #endif
- extern unsigned LLVMGetAttributeCountAtIndexPG(LLVMValueRef F, uint32 Idx);
- #ifdef __cplusplus
- } /* extern "C" */
- #endif
- #endif /* USE_LLVM */
- #endif /* LLVMJIT_H */
|