2
0

llvmjit.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*-------------------------------------------------------------------------
  2. * llvmjit.h
  3. * LLVM JIT provider.
  4. *
  5. * Copyright (c) 2016-2022, PostgreSQL Global Development Group
  6. *
  7. * src/include/jit/llvmjit.h
  8. *
  9. *-------------------------------------------------------------------------
  10. */
  11. #ifndef LLVMJIT_H
  12. #define LLVMJIT_H
  13. /*
  14. * To avoid breaking cpluspluscheck, allow including the file even when LLVM
  15. * is not available.
  16. */
  17. #ifdef USE_LLVM
  18. #include <llvm-c/Types.h>
  19. /*
  20. * File needs to be includable by both C and C++ code, and include other
  21. * headers doing the same. Therefore wrap C portion in our own extern "C" if
  22. * in C++ mode.
  23. */
  24. #ifdef __cplusplus
  25. extern "C"
  26. {
  27. #endif
  28. #include "access/tupdesc.h"
  29. #include "fmgr.h"
  30. #include "jit/jit.h"
  31. #include "nodes/pg_list.h"
  32. typedef struct LLVMJitContext
  33. {
  34. JitContext base;
  35. /* number of modules created */
  36. size_t module_generation;
  37. /* current, "open for write", module */
  38. LLVMModuleRef module;
  39. /* is there any pending code that needs to be emitted */
  40. bool compiled;
  41. /* # of objects emitted, used to generate non-conflicting names */
  42. int counter;
  43. /* list of handles for code emitted via Orc */
  44. List *handles;
  45. } LLVMJitContext;
  46. /* llvm module containing information about types */
  47. extern PGDLLIMPORT LLVMModuleRef llvm_types_module;
  48. /* type and struct definitions */
  49. extern PGDLLIMPORT LLVMTypeRef TypeParamBool;
  50. extern PGDLLIMPORT LLVMTypeRef TypePGFunction;
  51. extern PGDLLIMPORT LLVMTypeRef TypeSizeT;
  52. extern PGDLLIMPORT LLVMTypeRef TypeStorageBool;
  53. extern PGDLLIMPORT LLVMTypeRef StructNullableDatum;
  54. extern PGDLLIMPORT LLVMTypeRef StructTupleDescData;
  55. extern PGDLLIMPORT LLVMTypeRef StructHeapTupleData;
  56. extern PGDLLIMPORT LLVMTypeRef StructTupleTableSlot;
  57. extern PGDLLIMPORT LLVMTypeRef StructHeapTupleTableSlot;
  58. extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleTableSlot;
  59. extern PGDLLIMPORT LLVMTypeRef StructMemoryContextData;
  60. extern PGDLLIMPORT LLVMTypeRef StructFunctionCallInfoData;
  61. extern PGDLLIMPORT LLVMTypeRef StructExprContext;
  62. extern PGDLLIMPORT LLVMTypeRef StructExprEvalStep;
  63. extern PGDLLIMPORT LLVMTypeRef StructExprState;
  64. extern PGDLLIMPORT LLVMTypeRef StructAggState;
  65. extern PGDLLIMPORT LLVMTypeRef StructAggStatePerTransData;
  66. extern PGDLLIMPORT LLVMTypeRef StructAggStatePerGroupData;
  67. extern PGDLLIMPORT LLVMValueRef AttributeTemplate;
  68. extern void llvm_enter_fatal_on_oom(void);
  69. extern void llvm_leave_fatal_on_oom(void);
  70. extern bool llvm_in_fatal_on_oom(void);
  71. extern void llvm_reset_after_error(void);
  72. extern void llvm_assert_in_fatal_section(void);
  73. extern LLVMJitContext *llvm_create_context(int jitFlags);
  74. extern LLVMModuleRef llvm_mutable_module(LLVMJitContext *context);
  75. extern char *llvm_expand_funcname(LLVMJitContext *context, const char *basename);
  76. extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
  77. extern void llvm_split_symbol_name(const char *name, char **modname, char **funcname);
  78. extern LLVMTypeRef llvm_pg_var_type(const char *varname);
  79. extern LLVMTypeRef llvm_pg_var_func_type(const char *varname);
  80. extern LLVMValueRef llvm_pg_func(LLVMModuleRef mod, const char *funcname);
  81. extern void llvm_copy_attributes(LLVMValueRef from, LLVMValueRef to);
  82. extern LLVMValueRef llvm_function_reference(LLVMJitContext *context,
  83. LLVMBuilderRef builder,
  84. LLVMModuleRef mod,
  85. FunctionCallInfo fcinfo);
  86. extern void llvm_inline(LLVMModuleRef mod);
  87. /*
  88. ****************************************************************************
  89. * Code generation functions.
  90. ****************************************************************************
  91. */
  92. extern bool llvm_compile_expr(struct ExprState *state);
  93. struct TupleTableSlotOps;
  94. extern LLVMValueRef slot_compile_deform(struct LLVMJitContext *context, TupleDesc desc,
  95. const struct TupleTableSlotOps *ops, int natts);
  96. /*
  97. ****************************************************************************
  98. * Extensions / Backward compatibility section of the LLVM C API
  99. * Error handling related functions.
  100. ****************************************************************************
  101. */
  102. #if defined(HAVE_DECL_LLVMGETHOSTCPUNAME) && !HAVE_DECL_LLVMGETHOSTCPUNAME
  103. /** Get the host CPU as a string. The result needs to be disposed with
  104. LLVMDisposeMessage. */
  105. extern char *LLVMGetHostCPUName(void);
  106. #endif
  107. #if defined(HAVE_DECL_LLVMGETHOSTCPUFEATURES) && !HAVE_DECL_LLVMGETHOSTCPUFEATURES
  108. /** Get the host CPU features as a string. The result needs to be disposed
  109. with LLVMDisposeMessage. */
  110. extern char *LLVMGetHostCPUFeatures(void);
  111. #endif
  112. extern unsigned LLVMGetAttributeCountAtIndexPG(LLVMValueRef F, uint32 Idx);
  113. #ifdef __cplusplus
  114. } /* extern "C" */
  115. #endif
  116. #endif /* USE_LLVM */
  117. #endif /* LLVMJIT_H */