1 | /*===----------- llvm-c/LLJIT.h - OrcV2 LLJIT C bindings ----------*- C -*-===*\ |
2 | |* *| |
3 | |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| |
4 | |* Exceptions. *| |
5 | |* See https://llvm.org/LICENSE.txt for license information. *| |
6 | |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| |
7 | |* *| |
8 | |*===----------------------------------------------------------------------===*| |
9 | |* *| |
10 | |* This header declares the C interface to the LLJIT class in *| |
11 | |* libLLVMOrcJIT.a, which provides a simple MCJIT-like ORC JIT. *| |
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. Only C API usage documentation is *| |
19 | |* provided. See the C++ documentation for all higher level ORC API *| |
20 | |* details. *| |
21 | |* *| |
22 | \*===----------------------------------------------------------------------===*/ |
23 | |
24 | #ifndef LLVM_C_LLJIT_H |
25 | #define LLVM_C_LLJIT_H |
26 | |
27 | #include "llvm-c/Error.h" |
28 | #include "llvm-c/Orc.h" |
29 | #include "llvm-c/TargetMachine.h" |
30 | #include "llvm-c/Types.h" |
31 | |
32 | LLVM_C_EXTERN_C_BEGIN |
33 | |
34 | /** |
35 | * @defgroup LLVMCExecutionEngineLLJIT LLJIT |
36 | * @ingroup LLVMCExecutionEngine |
37 | * |
38 | * @{ |
39 | */ |
40 | |
41 | /** |
42 | * A function for constructing an ObjectLinkingLayer instance to be used |
43 | * by an LLJIT instance. |
44 | * |
45 | * Clients can call LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator to |
46 | * set the creator function to use when constructing an LLJIT instance. |
47 | * This can be used to override the default linking layer implementation |
48 | * that would otherwise be chosen by LLJITBuilder. |
49 | * |
50 | * Object linking layers returned by this function will become owned by the |
51 | * LLJIT instance. The client is not responsible for managing their lifetimes |
52 | * after the function returns. |
53 | */ |
54 | typedef LLVMOrcObjectLayerRef ( |
55 | *LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction)( |
56 | void *Ctx, LLVMOrcExecutionSessionRef ES, const char *Triple); |
57 | |
58 | /** |
59 | * A reference to an orc::LLJITBuilder instance. |
60 | */ |
61 | typedef struct LLVMOrcOpaqueLLJITBuilder *LLVMOrcLLJITBuilderRef; |
62 | |
63 | /** |
64 | * A reference to an orc::LLJIT instance. |
65 | */ |
66 | typedef struct LLVMOrcOpaqueLLJIT *LLVMOrcLLJITRef; |
67 | |
68 | /** |
69 | * Create an LLVMOrcLLJITBuilder. |
70 | * |
71 | * The client owns the resulting LLJITBuilder and should dispose of it using |
72 | * LLVMOrcDisposeLLJITBuilder once they are done with it. |
73 | */ |
74 | LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void); |
75 | |
76 | /** |
77 | * Dispose of an LLVMOrcLLJITBuilderRef. This should only be called if ownership |
78 | * has not been passed to LLVMOrcCreateLLJIT (e.g. because some error prevented |
79 | * that function from being called). |
80 | */ |
81 | void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder); |
82 | |
83 | /** |
84 | * Set the JITTargetMachineBuilder to be used when constructing the LLJIT |
85 | * instance. Calling this function is optional: if it is not called then the |
86 | * LLJITBuilder will use JITTargeTMachineBuilder::detectHost to construct a |
87 | * JITTargetMachineBuilder. |
88 | * |
89 | * This function takes ownership of the JTMB argument: clients should not |
90 | * dispose of the JITTargetMachineBuilder after calling this function. |
91 | */ |
92 | void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder( |
93 | LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB); |
94 | |
95 | /** |
96 | * Set an ObjectLinkingLayer creator function for this LLJIT instance. |
97 | */ |
98 | void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator( |
99 | LLVMOrcLLJITBuilderRef Builder, |
100 | LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx); |
101 | |
102 | /** |
103 | * Create an LLJIT instance from an LLJITBuilder. |
104 | * |
105 | * This operation takes ownership of the Builder argument: clients should not |
106 | * dispose of the builder after calling this function (even if the function |
107 | * returns an error). If a null Builder argument is provided then a |
108 | * default-constructed LLJITBuilder will be used. |
109 | * |
110 | * On success the resulting LLJIT instance is uniquely owned by the client and |
111 | * automatically manages the memory of all JIT'd code and all modules that are |
112 | * transferred to it (e.g. via LLVMOrcLLJITAddLLVMIRModule). Disposing of the |
113 | * LLJIT instance will free all memory managed by the JIT, including JIT'd code |
114 | * and not-yet compiled modules. |
115 | */ |
116 | LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result, |
117 | LLVMOrcLLJITBuilderRef Builder); |
118 | |
119 | /** |
120 | * Dispose of an LLJIT instance. |
121 | */ |
122 | LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J); |
123 | |
124 | /** |
125 | * Get a reference to the ExecutionSession for this LLJIT instance. |
126 | * |
127 | * The ExecutionSession is owned by the LLJIT instance. The client is not |
128 | * responsible for managing its memory. |
129 | */ |
130 | LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J); |
131 | |
132 | /** |
133 | * Return a reference to the Main JITDylib. |
134 | * |
135 | * The JITDylib is owned by the LLJIT instance. The client is not responsible |
136 | * for managing its memory. |
137 | */ |
138 | LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J); |
139 | |
140 | /** |
141 | * Return the target triple for this LLJIT instance. This string is owned by |
142 | * the LLJIT instance and should not be freed by the client. |
143 | */ |
144 | const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J); |
145 | |
146 | /** |
147 | * Returns the global prefix character according to the LLJIT's DataLayout. |
148 | */ |
149 | char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J); |
150 | |
151 | /** |
152 | * Mangles the given string according to the LLJIT instance's DataLayout, then |
153 | * interns the result in the SymbolStringPool and returns a reference to the |
154 | * pool entry. Clients should call LLVMOrcReleaseSymbolStringPoolEntry to |
155 | * decrement the ref-count on the pool entry once they are finished with this |
156 | * value. |
157 | */ |
158 | LLVMOrcSymbolStringPoolEntryRef |
159 | LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName); |
160 | |
161 | /** |
162 | * Add a buffer representing an object file to the given JITDylib in the given |
163 | * LLJIT instance. This operation transfers ownership of the buffer to the |
164 | * LLJIT instance. The buffer should not be disposed of or referenced once this |
165 | * function returns. |
166 | * |
167 | * Resources associated with the given object will be tracked by the given |
168 | * JITDylib's default resource tracker. |
169 | */ |
170 | LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD, |
171 | LLVMMemoryBufferRef ObjBuffer); |
172 | |
173 | /** |
174 | * Add a buffer representing an object file to the given ResourceTracker's |
175 | * JITDylib in the given LLJIT instance. This operation transfers ownership of |
176 | * the buffer to the LLJIT instance. The buffer should not be disposed of or |
177 | * referenced once this function returns. |
178 | * |
179 | * Resources associated with the given object will be tracked by ResourceTracker |
180 | * RT. |
181 | */ |
182 | LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J, |
183 | LLVMOrcResourceTrackerRef RT, |
184 | LLVMMemoryBufferRef ObjBuffer); |
185 | |
186 | /** |
187 | * Add an IR module to the given JITDylib in the given LLJIT instance. This |
188 | * operation transfers ownership of the TSM argument to the LLJIT instance. |
189 | * The TSM argument should not be disposed of or referenced once this |
190 | * function returns. |
191 | * |
192 | * Resources associated with the given Module will be tracked by the given |
193 | * JITDylib's default resource tracker. |
194 | */ |
195 | LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J, |
196 | LLVMOrcJITDylibRef JD, |
197 | LLVMOrcThreadSafeModuleRef TSM); |
198 | |
199 | /** |
200 | * Add an IR module to the given ResourceTracker's JITDylib in the given LLJIT |
201 | * instance. This operation transfers ownership of the TSM argument to the LLJIT |
202 | * instance. The TSM argument should not be disposed of or referenced once this |
203 | * function returns. |
204 | * |
205 | * Resources associated with the given Module will be tracked by ResourceTracker |
206 | * RT. |
207 | */ |
208 | LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J, |
209 | LLVMOrcResourceTrackerRef JD, |
210 | LLVMOrcThreadSafeModuleRef TSM); |
211 | |
212 | /** |
213 | * Look up the given symbol in the main JITDylib of the given LLJIT instance. |
214 | * |
215 | * This operation does not take ownership of the Name argument. |
216 | */ |
217 | LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J, |
218 | LLVMOrcExecutorAddress *Result, |
219 | const char *Name); |
220 | |
221 | /** |
222 | * Returns a non-owning reference to the LLJIT instance's object linking layer. |
223 | */ |
224 | LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J); |
225 | |
226 | /** |
227 | * Returns a non-owning reference to the LLJIT instance's object linking layer. |
228 | */ |
229 | LLVMOrcObjectTransformLayerRef |
230 | LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J); |
231 | |
232 | /** |
233 | * Returns a non-owning reference to the LLJIT instance's IR transform layer. |
234 | */ |
235 | LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J); |
236 | |
237 | /** |
238 | * Get the LLJIT instance's default data layout string. |
239 | * |
240 | * This string is owned by the LLJIT instance and does not need to be freed |
241 | * by the caller. |
242 | */ |
243 | const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J); |
244 | |
245 | /** |
246 | * @} |
247 | */ |
248 | |
249 | LLVM_C_EXTERN_C_END |
250 | |
251 | #endif /* LLVM_C_LLJIT_H */ |
252 | |