/*------------------------------------------------------------------------- * llvmjit.h * LLVM JIT provider. * * Copyright (c) 2016-2018, PostgreSQL Global Development Group * * src/include/jit/llvmjit.h * *------------------------------------------------------------------------- */ #ifndef LLVMJIT_H #define LLVMJIT_H #ifndef USE_LLVM #error "llvmjit.h should only be included by code dealing with llvm" #endif #include /* * 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 "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; /* type and struct definitions */ extern LLVMTypeRef TypeSizeT; extern LLVMValueRef AttributeTemplate; extern LLVMValueRef FuncStrlen; extern void llvm_enter_fatal_on_oom(void); extern void llvm_leave_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 LLVMValueRef llvm_get_decl(LLVMModuleRef mod, LLVMValueRef f); extern void llvm_copy_attributes(LLVMValueRef from, LLVMValueRef to); /* **************************************************************************** * 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 /** Get the host CPU features as a string. The result needs to be disposed with LLVMDisposeMessage. */ extern char *LLVMGetHostCPUFeatures(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* LLVMJIT_H */