1 | /*===----------- llvm-c/OrcBindings.h - Orc Lib C Iface ---------*- C++ -*-===*\ |
2 | |* *| |
3 | |* The LLVM Compiler Infrastructure *| |
4 | |* *| |
5 | |* This file is distributed under the University of Illinois Open Source *| |
6 | |* License. See LICENSE.TXT for details. *| |
7 | |* *| |
8 | |*===----------------------------------------------------------------------===*| |
9 | |* *| |
10 | |* This header declares the C interface to libLLVMOrcJIT.a, which implements *| |
11 | |* JIT compilation of LLVM IR. *| |
12 | |* *| |
13 | |* Many exotic languages can interoperate with C code but have a harder time *| |
14 | |* with C++ due to name mangling. So in addition to C, this interface enables *| |
15 | |* tools written in such languages. *| |
16 | |* *| |
17 | |* Note: This interface is experimental. It is *NOT* stable, and may be *| |
18 | |* changed without warning. *| |
19 | |* *| |
20 | \*===----------------------------------------------------------------------===*/ |
21 | |
22 | #ifndef LLVM_C_ORCBINDINGS_H |
23 | #define LLVM_C_ORCBINDINGS_H |
24 | |
25 | #include "llvm-c/Error.h" |
26 | #include "llvm-c/Object.h" |
27 | #include "llvm-c/TargetMachine.h" |
28 | |
29 | #ifdef __cplusplus |
30 | extern "C" { |
31 | #endif |
32 | |
33 | typedef struct LLVMOrcOpaqueJITStack *LLVMOrcJITStackRef; |
34 | typedef uint64_t LLVMOrcModuleHandle; |
35 | typedef uint64_t LLVMOrcTargetAddress; |
36 | typedef uint64_t (*LLVMOrcSymbolResolverFn)(const char *Name, void *LookupCtx); |
37 | typedef uint64_t (*LLVMOrcLazyCompileCallbackFn)(LLVMOrcJITStackRef JITStack, |
38 | void *CallbackCtx); |
39 | |
40 | /** |
41 | * Create an ORC JIT stack. |
42 | * |
43 | * The client owns the resulting stack, and must call OrcDisposeInstance(...) |
44 | * to destroy it and free its memory. The JIT stack will take ownership of the |
45 | * TargetMachine, which will be destroyed when the stack is destroyed. The |
46 | * client should not attempt to dispose of the Target Machine, or it will result |
47 | * in a double-free. |
48 | */ |
49 | LLVMOrcJITStackRef LLVMOrcCreateInstance(LLVMTargetMachineRef TM); |
50 | |
51 | /** |
52 | * Get the error message for the most recent error (if any). |
53 | * |
54 | * This message is owned by the ORC JIT Stack and will be freed when the stack |
55 | * is disposed of by LLVMOrcDisposeInstance. |
56 | */ |
57 | const char *LLVMOrcGetErrorMsg(LLVMOrcJITStackRef JITStack); |
58 | |
59 | /** |
60 | * Mangle the given symbol. |
61 | * Memory will be allocated for MangledSymbol to hold the result. The client |
62 | */ |
63 | void LLVMOrcGetMangledSymbol(LLVMOrcJITStackRef JITStack, char **MangledSymbol, |
64 | const char *Symbol); |
65 | |
66 | /** |
67 | * Dispose of a mangled symbol. |
68 | */ |
69 | void LLVMOrcDisposeMangledSymbol(char *MangledSymbol); |
70 | |
71 | /** |
72 | * Create a lazy compile callback. |
73 | */ |
74 | LLVMErrorRef LLVMOrcCreateLazyCompileCallback( |
75 | LLVMOrcJITStackRef JITStack, LLVMOrcTargetAddress *RetAddr, |
76 | LLVMOrcLazyCompileCallbackFn Callback, void *CallbackCtx); |
77 | |
78 | /** |
79 | * Create a named indirect call stub. |
80 | */ |
81 | LLVMErrorRef LLVMOrcCreateIndirectStub(LLVMOrcJITStackRef JITStack, |
82 | const char *StubName, |
83 | LLVMOrcTargetAddress InitAddr); |
84 | |
85 | /** |
86 | * Set the pointer for the given indirect stub. |
87 | */ |
88 | LLVMErrorRef LLVMOrcSetIndirectStubPointer(LLVMOrcJITStackRef JITStack, |
89 | const char *StubName, |
90 | LLVMOrcTargetAddress NewAddr); |
91 | |
92 | /** |
93 | * Add module to be eagerly compiled. |
94 | */ |
95 | LLVMErrorRef LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack, |
96 | LLVMOrcModuleHandle *RetHandle, |
97 | LLVMModuleRef Mod, |
98 | LLVMOrcSymbolResolverFn SymbolResolver, |
99 | void *SymbolResolverCtx); |
100 | |
101 | /** |
102 | * Add module to be lazily compiled one function at a time. |
103 | */ |
104 | LLVMErrorRef LLVMOrcAddLazilyCompiledIR(LLVMOrcJITStackRef JITStack, |
105 | LLVMOrcModuleHandle *RetHandle, |
106 | LLVMModuleRef Mod, |
107 | LLVMOrcSymbolResolverFn SymbolResolver, |
108 | void *SymbolResolverCtx); |
109 | |
110 | /** |
111 | * Add an object file. |
112 | * |
113 | * This method takes ownership of the given memory buffer and attempts to add |
114 | * it to the JIT as an object file. |
115 | * Clients should *not* dispose of the 'Obj' argument: the JIT will manage it |
116 | * from this call onwards. |
117 | */ |
118 | LLVMErrorRef LLVMOrcAddObjectFile(LLVMOrcJITStackRef JITStack, |
119 | LLVMOrcModuleHandle *RetHandle, |
120 | LLVMMemoryBufferRef Obj, |
121 | LLVMOrcSymbolResolverFn SymbolResolver, |
122 | void *SymbolResolverCtx); |
123 | |
124 | /** |
125 | * Remove a module set from the JIT. |
126 | * |
127 | * This works for all modules that can be added via OrcAdd*, including object |
128 | * files. |
129 | */ |
130 | LLVMErrorRef LLVMOrcRemoveModule(LLVMOrcJITStackRef JITStack, |
131 | LLVMOrcModuleHandle H); |
132 | |
133 | /** |
134 | * Get symbol address from JIT instance. |
135 | */ |
136 | LLVMErrorRef LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack, |
137 | LLVMOrcTargetAddress *RetAddr, |
138 | const char *SymbolName); |
139 | |
140 | /** |
141 | * Get symbol address from JIT instance, searching only the specified |
142 | * handle. |
143 | */ |
144 | LLVMErrorRef LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack, |
145 | LLVMOrcTargetAddress *RetAddr, |
146 | LLVMOrcModuleHandle H, |
147 | const char *SymbolName); |
148 | |
149 | /** |
150 | * Dispose of an ORC JIT stack. |
151 | */ |
152 | LLVMErrorRef LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack); |
153 | |
154 | /** |
155 | * Register a JIT Event Listener. |
156 | * |
157 | * A NULL listener is ignored. |
158 | */ |
159 | void LLVMOrcRegisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L); |
160 | |
161 | /** |
162 | * Unegister a JIT Event Listener. |
163 | * |
164 | * A NULL listener is ignored. |
165 | */ |
166 | void LLVMOrcUnregisterJITEventListener(LLVMOrcJITStackRef JITStack, LLVMJITEventListenerRef L); |
167 | |
168 | #ifdef __cplusplus |
169 | } |
170 | #endif /* extern "C" */ |
171 | |
172 | #endif /* LLVM_C_ORCBINDINGS_H */ |
173 | |