xref: /freebsd/contrib/llvm-project/llvm/include/llvm-c/Orc.h (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
1*5ffd83dbSDimitry Andric /*===---------------- llvm-c/Orc.h - OrcV2 C bindings -----------*- C++ -*-===*\
2*5ffd83dbSDimitry Andric |*                                                                            *|
3*5ffd83dbSDimitry Andric |* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
4*5ffd83dbSDimitry Andric |* Exceptions.                                                                *|
5*5ffd83dbSDimitry Andric |* See https://llvm.org/LICENSE.txt for license information.                  *|
6*5ffd83dbSDimitry Andric |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
7*5ffd83dbSDimitry Andric |*                                                                            *|
8*5ffd83dbSDimitry Andric |*===----------------------------------------------------------------------===*|
9*5ffd83dbSDimitry Andric |*                                                                            *|
10*5ffd83dbSDimitry Andric |* This header declares the C interface to libLLVMOrcJIT.a, which implements  *|
11*5ffd83dbSDimitry Andric |* JIT compilation of LLVM IR. Minimal documentation of C API specific issues *|
12*5ffd83dbSDimitry Andric |* (especially memory ownership rules) is provided. Core Orc concepts are     *|
13*5ffd83dbSDimitry Andric |* documented in llvm/docs/ORCv2.rst and APIs are documented in the C++       *|
14*5ffd83dbSDimitry Andric |* headers                                                                    *|
15*5ffd83dbSDimitry Andric |*                                                                            *|
16*5ffd83dbSDimitry Andric |* Many exotic languages can interoperate with C code but have a harder time  *|
17*5ffd83dbSDimitry Andric |* with C++ due to name mangling. So in addition to C, this interface enables *|
18*5ffd83dbSDimitry Andric |* tools written in such languages.                                           *|
19*5ffd83dbSDimitry Andric |*                                                                            *|
20*5ffd83dbSDimitry Andric |* Note: This interface is experimental. It is *NOT* stable, and may be       *|
21*5ffd83dbSDimitry Andric |*       changed without warning. Only C API usage documentation is           *|
22*5ffd83dbSDimitry Andric |*       provided. See the C++ documentation for all higher level ORC API     *|
23*5ffd83dbSDimitry Andric |*       details.                                                             *|
24*5ffd83dbSDimitry Andric |*                                                                            *|
25*5ffd83dbSDimitry Andric \*===----------------------------------------------------------------------===*/
26*5ffd83dbSDimitry Andric 
27*5ffd83dbSDimitry Andric #ifndef LLVM_C_ORC_H
28*5ffd83dbSDimitry Andric #define LLVM_C_ORC_H
29*5ffd83dbSDimitry Andric 
30*5ffd83dbSDimitry Andric #include "llvm-c/Error.h"
31*5ffd83dbSDimitry Andric #include "llvm-c/TargetMachine.h"
32*5ffd83dbSDimitry Andric #include "llvm-c/Types.h"
33*5ffd83dbSDimitry Andric 
34*5ffd83dbSDimitry Andric LLVM_C_EXTERN_C_BEGIN
35*5ffd83dbSDimitry Andric 
36*5ffd83dbSDimitry Andric /**
37*5ffd83dbSDimitry Andric  * Represents an address in the target process.
38*5ffd83dbSDimitry Andric  */
39*5ffd83dbSDimitry Andric typedef uint64_t LLVMOrcJITTargetAddress;
40*5ffd83dbSDimitry Andric 
41*5ffd83dbSDimitry Andric /**
42*5ffd83dbSDimitry Andric  * A reference to an orc::ExecutionSession instance.
43*5ffd83dbSDimitry Andric  */
44*5ffd83dbSDimitry Andric typedef struct LLVMOrcOpaqueExecutionSession *LLVMOrcExecutionSessionRef;
45*5ffd83dbSDimitry Andric 
46*5ffd83dbSDimitry Andric /**
47*5ffd83dbSDimitry Andric  * A reference to an orc::SymbolStringPool table entry.
48*5ffd83dbSDimitry Andric  */
49*5ffd83dbSDimitry Andric typedef struct LLVMOrcQuaqueSymbolStringPoolEntryPtr
50*5ffd83dbSDimitry Andric     *LLVMOrcSymbolStringPoolEntryRef;
51*5ffd83dbSDimitry Andric 
52*5ffd83dbSDimitry Andric /**
53*5ffd83dbSDimitry Andric  * A reference to an orc::JITDylib instance.
54*5ffd83dbSDimitry Andric  */
55*5ffd83dbSDimitry Andric typedef struct LLVMOrcOpaqueJITDylib *LLVMOrcJITDylibRef;
56*5ffd83dbSDimitry Andric 
57*5ffd83dbSDimitry Andric /**
58*5ffd83dbSDimitry Andric  * A reference to an orc::JITDylib::DefinitionGenerator.
59*5ffd83dbSDimitry Andric  */
60*5ffd83dbSDimitry Andric typedef struct LLVMOrcOpaqueJITDylibDefinitionGenerator
61*5ffd83dbSDimitry Andric     *LLVMOrcJITDylibDefinitionGeneratorRef;
62*5ffd83dbSDimitry Andric 
63*5ffd83dbSDimitry Andric /**
64*5ffd83dbSDimitry Andric  * Predicate function for SymbolStringPoolEntries.
65*5ffd83dbSDimitry Andric  */
66*5ffd83dbSDimitry Andric typedef int (*LLVMOrcSymbolPredicate)(LLVMOrcSymbolStringPoolEntryRef Sym,
67*5ffd83dbSDimitry Andric                                       void *Ctx);
68*5ffd83dbSDimitry Andric 
69*5ffd83dbSDimitry Andric /**
70*5ffd83dbSDimitry Andric  * A reference to an orc::ThreadSafeContext instance.
71*5ffd83dbSDimitry Andric  */
72*5ffd83dbSDimitry Andric typedef struct LLVMOrcOpaqueThreadSafeContext *LLVMOrcThreadSafeContextRef;
73*5ffd83dbSDimitry Andric 
74*5ffd83dbSDimitry Andric /**
75*5ffd83dbSDimitry Andric  * A reference to an orc::ThreadSafeModule instance.
76*5ffd83dbSDimitry Andric  */
77*5ffd83dbSDimitry Andric typedef struct LLVMOrcOpaqueThreadSafeModule *LLVMOrcThreadSafeModuleRef;
78*5ffd83dbSDimitry Andric 
79*5ffd83dbSDimitry Andric /**
80*5ffd83dbSDimitry Andric  * A reference to an orc::JITTargetMachineBuilder instance.
81*5ffd83dbSDimitry Andric  */
82*5ffd83dbSDimitry Andric typedef struct LLVMOrcOpaqueJITTargetMachineBuilder
83*5ffd83dbSDimitry Andric     *LLVMOrcJITTargetMachineBuilderRef;
84*5ffd83dbSDimitry Andric 
85*5ffd83dbSDimitry Andric /**
86*5ffd83dbSDimitry Andric  * A reference to an orc::LLJITBuilder instance.
87*5ffd83dbSDimitry Andric  */
88*5ffd83dbSDimitry Andric typedef struct LLVMOrcOpaqueLLJITBuilder *LLVMOrcLLJITBuilderRef;
89*5ffd83dbSDimitry Andric 
90*5ffd83dbSDimitry Andric /**
91*5ffd83dbSDimitry Andric  * A reference to an orc::LLJIT instance.
92*5ffd83dbSDimitry Andric  */
93*5ffd83dbSDimitry Andric typedef struct LLVMOrcOpaqueLLJIT *LLVMOrcLLJITRef;
94*5ffd83dbSDimitry Andric 
95*5ffd83dbSDimitry Andric /**
96*5ffd83dbSDimitry Andric  * Intern a string in the ExecutionSession's SymbolStringPool and return a
97*5ffd83dbSDimitry Andric  * reference to it. This increments the ref-count of the pool entry, and the
98*5ffd83dbSDimitry Andric  * returned value should be released once the client is done with it by
99*5ffd83dbSDimitry Andric  * calling LLVMOrReleaseSymbolStringPoolEntry.
100*5ffd83dbSDimitry Andric  *
101*5ffd83dbSDimitry Andric  * Since strings are uniqued within the SymbolStringPool
102*5ffd83dbSDimitry Andric  * LLVMOrcSymbolStringPoolEntryRefs can be compared by value to test string
103*5ffd83dbSDimitry Andric  * equality.
104*5ffd83dbSDimitry Andric  *
105*5ffd83dbSDimitry Andric  * Note that this function does not perform linker-mangling on the string.
106*5ffd83dbSDimitry Andric  */
107*5ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef
108*5ffd83dbSDimitry Andric LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name);
109*5ffd83dbSDimitry Andric 
110*5ffd83dbSDimitry Andric /**
111*5ffd83dbSDimitry Andric  * Reduces the ref-count for of a SymbolStringPool entry.
112*5ffd83dbSDimitry Andric  */
113*5ffd83dbSDimitry Andric void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S);
114*5ffd83dbSDimitry Andric 
115*5ffd83dbSDimitry Andric /**
116*5ffd83dbSDimitry Andric  * Dispose of a JITDylib::DefinitionGenerator. This should only be called if
117*5ffd83dbSDimitry Andric  * ownership has not been passed to a JITDylib (e.g. because some error
118*5ffd83dbSDimitry Andric  * prevented the client from calling LLVMOrcJITDylibAddGenerator).
119*5ffd83dbSDimitry Andric  */
120*5ffd83dbSDimitry Andric void LLVMOrcDisposeJITDylibDefinitionGenerator(
121*5ffd83dbSDimitry Andric     LLVMOrcJITDylibDefinitionGeneratorRef DG);
122*5ffd83dbSDimitry Andric 
123*5ffd83dbSDimitry Andric /**
124*5ffd83dbSDimitry Andric  * Add a JITDylib::DefinitionGenerator to the given JITDylib.
125*5ffd83dbSDimitry Andric  *
126*5ffd83dbSDimitry Andric  * The JITDylib will take ownership of the given generator: The client is no
127*5ffd83dbSDimitry Andric  * longer responsible for managing its memory.
128*5ffd83dbSDimitry Andric  */
129*5ffd83dbSDimitry Andric void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
130*5ffd83dbSDimitry Andric                                  LLVMOrcJITDylibDefinitionGeneratorRef DG);
131*5ffd83dbSDimitry Andric 
132*5ffd83dbSDimitry Andric /**
133*5ffd83dbSDimitry Andric  * Get a DynamicLibrarySearchGenerator that will reflect process symbols into
134*5ffd83dbSDimitry Andric  * the JITDylib. On success the resulting generator is owned by the client.
135*5ffd83dbSDimitry Andric  * Ownership is typically transferred by adding the instance to a JITDylib
136*5ffd83dbSDimitry Andric  * using LLVMOrcJITDylibAddGenerator,
137*5ffd83dbSDimitry Andric  *
138*5ffd83dbSDimitry Andric  * The GlobalPrefix argument specifies the character that appears on the front
139*5ffd83dbSDimitry Andric  * of linker-mangled symbols for the target platform (e.g. '_' on MachO).
140*5ffd83dbSDimitry Andric  * If non-null, this character will be stripped from the start of all symbol
141*5ffd83dbSDimitry Andric  * strings before passing the remaining substring to dlsym.
142*5ffd83dbSDimitry Andric  *
143*5ffd83dbSDimitry Andric  * The optional Filter and Ctx arguments can be used to supply a symbol name
144*5ffd83dbSDimitry Andric  * filter: Only symbols for which the filter returns true will be visible to
145*5ffd83dbSDimitry Andric  * JIT'd code. If the Filter argument is null then all process symbols will
146*5ffd83dbSDimitry Andric  * be visible to JIT'd code. Note that the symbol name passed to the Filter
147*5ffd83dbSDimitry Andric  * function is the full mangled symbol: The client is responsible for stripping
148*5ffd83dbSDimitry Andric  * the global prefix if present.
149*5ffd83dbSDimitry Andric  */
150*5ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
151*5ffd83dbSDimitry Andric     LLVMOrcJITDylibDefinitionGeneratorRef *Result, char GlobalPrefx,
152*5ffd83dbSDimitry Andric     LLVMOrcSymbolPredicate Filter, void *FilterCtx);
153*5ffd83dbSDimitry Andric 
154*5ffd83dbSDimitry Andric /**
155*5ffd83dbSDimitry Andric  * Create a ThreadSafeContext containing a new LLVMContext.
156*5ffd83dbSDimitry Andric  *
157*5ffd83dbSDimitry Andric  * Ownership of the underlying ThreadSafeContext data is shared: Clients
158*5ffd83dbSDimitry Andric  * can and should dispose of their ThreadSafeContext as soon as they no longer
159*5ffd83dbSDimitry Andric  * need to refer to it directly. Other references (e.g. from ThreadSafeModules
160*5ffd83dbSDimitry Andric  * will keep the data alive as long as it is needed.
161*5ffd83dbSDimitry Andric  */
162*5ffd83dbSDimitry Andric LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void);
163*5ffd83dbSDimitry Andric 
164*5ffd83dbSDimitry Andric /**
165*5ffd83dbSDimitry Andric  * Get a reference to the wrapped LLVMContext.
166*5ffd83dbSDimitry Andric  */
167*5ffd83dbSDimitry Andric LLVMContextRef
168*5ffd83dbSDimitry Andric LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx);
169*5ffd83dbSDimitry Andric 
170*5ffd83dbSDimitry Andric /**
171*5ffd83dbSDimitry Andric  * Dispose of a ThreadSafeContext.
172*5ffd83dbSDimitry Andric  */
173*5ffd83dbSDimitry Andric void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx);
174*5ffd83dbSDimitry Andric 
175*5ffd83dbSDimitry Andric /**
176*5ffd83dbSDimitry Andric  * Create a ThreadSafeModule wrapper around the given LLVM module. This takes
177*5ffd83dbSDimitry Andric  * ownership of the M argument which should not be disposed of or referenced
178*5ffd83dbSDimitry Andric  * after this function returns.
179*5ffd83dbSDimitry Andric  *
180*5ffd83dbSDimitry Andric  * Ownership of the ThreadSafeModule is unique: If it is transferred to the JIT
181*5ffd83dbSDimitry Andric  * (e.g. by LLVMOrcLLJITAddLLVMIRModule), in which case the client is no longer
182*5ffd83dbSDimitry Andric  * responsible for it. If it is not transferred to the JIT then the client
183*5ffd83dbSDimitry Andric  * should call LLVMOrcDisposeThreadSafeModule to dispose of it.
184*5ffd83dbSDimitry Andric  */
185*5ffd83dbSDimitry Andric LLVMOrcThreadSafeModuleRef
186*5ffd83dbSDimitry Andric LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
187*5ffd83dbSDimitry Andric                                  LLVMOrcThreadSafeContextRef TSCtx);
188*5ffd83dbSDimitry Andric 
189*5ffd83dbSDimitry Andric /**
190*5ffd83dbSDimitry Andric  * Dispose of a ThreadSafeModule. This should only be called if ownership has
191*5ffd83dbSDimitry Andric  * not been passed to LLJIT (e.g. because some error prevented the client from
192*5ffd83dbSDimitry Andric  * adding this to the JIT).
193*5ffd83dbSDimitry Andric  */
194*5ffd83dbSDimitry Andric void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM);
195*5ffd83dbSDimitry Andric 
196*5ffd83dbSDimitry Andric /**
197*5ffd83dbSDimitry Andric  * Create a JITTargetMachineBuilder by detecting the host.
198*5ffd83dbSDimitry Andric  *
199*5ffd83dbSDimitry Andric  * On success the client owns the resulting JITTargetMachineBuilder. It must be
200*5ffd83dbSDimitry Andric  * passed to a consuming operation (e.g. LLVMOrcCreateLLJITBuilder) or disposed
201*5ffd83dbSDimitry Andric  * of by calling LLVMOrcDisposeJITTargetMachineBuilder.
202*5ffd83dbSDimitry Andric  */
203*5ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(
204*5ffd83dbSDimitry Andric     LLVMOrcJITTargetMachineBuilderRef *Result);
205*5ffd83dbSDimitry Andric 
206*5ffd83dbSDimitry Andric /**
207*5ffd83dbSDimitry Andric  * Create a JITTargetMachineBuilder from the given TargetMachine template.
208*5ffd83dbSDimitry Andric  *
209*5ffd83dbSDimitry Andric  * This operation takes ownership of the given TargetMachine and destroys it
210*5ffd83dbSDimitry Andric  * before returing. The resulting JITTargetMachineBuilder is owned by the client
211*5ffd83dbSDimitry Andric  * and must be passed to a consuming operation (e.g. LLVMOrcCreateLLJITBuilder)
212*5ffd83dbSDimitry Andric  * or disposed of by calling LLVMOrcDisposeJITTargetMachineBuilder.
213*5ffd83dbSDimitry Andric  */
214*5ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef
215*5ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM);
216*5ffd83dbSDimitry Andric 
217*5ffd83dbSDimitry Andric /**
218*5ffd83dbSDimitry Andric  * Dispose of a JITTargetMachineBuilder.
219*5ffd83dbSDimitry Andric  */
220*5ffd83dbSDimitry Andric void LLVMOrcDisposeJITTargetMachineBuilder(
221*5ffd83dbSDimitry Andric     LLVMOrcJITTargetMachineBuilderRef JTMB);
222*5ffd83dbSDimitry Andric 
223*5ffd83dbSDimitry Andric /**
224*5ffd83dbSDimitry Andric  * Create an LLJITTargetMachineBuilder.
225*5ffd83dbSDimitry Andric  *
226*5ffd83dbSDimitry Andric  * The client owns the resulting LLJITBuilder and should dispose of it using
227*5ffd83dbSDimitry Andric  * LLVMOrcDisposeLLJITBuilder once they are done with it.
228*5ffd83dbSDimitry Andric  */
229*5ffd83dbSDimitry Andric LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void);
230*5ffd83dbSDimitry Andric 
231*5ffd83dbSDimitry Andric /**
232*5ffd83dbSDimitry Andric  * Dispose of an LLVMOrcLLJITBuilderRef. This should only be called if ownership
233*5ffd83dbSDimitry Andric  * has not been passed to LLVMOrcCreateLLJIT (e.g. because some error prevented
234*5ffd83dbSDimitry Andric  * that function from being called).
235*5ffd83dbSDimitry Andric  */
236*5ffd83dbSDimitry Andric void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder);
237*5ffd83dbSDimitry Andric 
238*5ffd83dbSDimitry Andric /**
239*5ffd83dbSDimitry Andric  * Set the JITTargetMachineBuilder to be used when constructing the LLJIT
240*5ffd83dbSDimitry Andric  * instance. Calling this function is optional: if it is not called then the
241*5ffd83dbSDimitry Andric  * LLJITBuilder will use JITTargeTMachineBuilder::detectHost to construct a
242*5ffd83dbSDimitry Andric  * JITTargetMachineBuilder.
243*5ffd83dbSDimitry Andric  */
244*5ffd83dbSDimitry Andric void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
245*5ffd83dbSDimitry Andric     LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB);
246*5ffd83dbSDimitry Andric 
247*5ffd83dbSDimitry Andric /**
248*5ffd83dbSDimitry Andric  * Create an LLJIT instance from an LLJITBuilder.
249*5ffd83dbSDimitry Andric  *
250*5ffd83dbSDimitry Andric  * This operation takes ownership of the Builder argument: clients should not
251*5ffd83dbSDimitry Andric  * dispose of the builder after calling this function (even if the function
252*5ffd83dbSDimitry Andric  * returns an error). If a null Builder argument is provided then a
253*5ffd83dbSDimitry Andric  * default-constructed LLJITBuilder will be used.
254*5ffd83dbSDimitry Andric  *
255*5ffd83dbSDimitry Andric  * On success the resulting LLJIT instance is uniquely owned by the client and
256*5ffd83dbSDimitry Andric  * automatically manages the memory of all JIT'd code and all modules that are
257*5ffd83dbSDimitry Andric  * transferred to it (e.g. via LLVMOrcLLJITAddLLVMIRModule). Disposing of the
258*5ffd83dbSDimitry Andric  * LLJIT instance will free all memory managed by the JIT, including JIT'd code
259*5ffd83dbSDimitry Andric  * and not-yet compiled modules.
260*5ffd83dbSDimitry Andric  */
261*5ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
262*5ffd83dbSDimitry Andric                                 LLVMOrcLLJITBuilderRef Builder);
263*5ffd83dbSDimitry Andric 
264*5ffd83dbSDimitry Andric /**
265*5ffd83dbSDimitry Andric  * Dispose of an LLJIT instance.
266*5ffd83dbSDimitry Andric  */
267*5ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J);
268*5ffd83dbSDimitry Andric 
269*5ffd83dbSDimitry Andric /**
270*5ffd83dbSDimitry Andric  * Get a reference to the ExecutionSession for this LLJIT instance.
271*5ffd83dbSDimitry Andric  *
272*5ffd83dbSDimitry Andric  * The ExecutionSession is owned by the LLJIT instance. The client is not
273*5ffd83dbSDimitry Andric  * responsible for managing its memory.
274*5ffd83dbSDimitry Andric  */
275*5ffd83dbSDimitry Andric LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J);
276*5ffd83dbSDimitry Andric 
277*5ffd83dbSDimitry Andric /**
278*5ffd83dbSDimitry Andric  * Return a reference to the Main JITDylib.
279*5ffd83dbSDimitry Andric  *
280*5ffd83dbSDimitry Andric  * The JITDylib is owned by the LLJIT instance. The client is not responsible
281*5ffd83dbSDimitry Andric  * for managing its memory.
282*5ffd83dbSDimitry Andric  */
283*5ffd83dbSDimitry Andric LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J);
284*5ffd83dbSDimitry Andric 
285*5ffd83dbSDimitry Andric /**
286*5ffd83dbSDimitry Andric  * Return the target triple for this LLJIT instance. This string is owned by
287*5ffd83dbSDimitry Andric  * the LLJIT instance and should not be freed by the client.
288*5ffd83dbSDimitry Andric  */
289*5ffd83dbSDimitry Andric const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J);
290*5ffd83dbSDimitry Andric 
291*5ffd83dbSDimitry Andric /**
292*5ffd83dbSDimitry Andric  * Returns the global prefix character according to the LLJIT's DataLayout.
293*5ffd83dbSDimitry Andric  */
294*5ffd83dbSDimitry Andric char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J);
295*5ffd83dbSDimitry Andric 
296*5ffd83dbSDimitry Andric /**
297*5ffd83dbSDimitry Andric  * Mangles the given string according to the LLJIT instance's DataLayout, then
298*5ffd83dbSDimitry Andric  * interns the result in the SymbolStringPool and returns a reference to the
299*5ffd83dbSDimitry Andric  * pool entry. Clients should call LLVMOrcReleaseSymbolStringPoolEntry to
300*5ffd83dbSDimitry Andric  * decrement the ref-count on the pool entry once they are finished with this
301*5ffd83dbSDimitry Andric  * value.
302*5ffd83dbSDimitry Andric  */
303*5ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef
304*5ffd83dbSDimitry Andric LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName);
305*5ffd83dbSDimitry Andric 
306*5ffd83dbSDimitry Andric /**
307*5ffd83dbSDimitry Andric  * Add a buffer representing an object file to the given JITDylib in the given
308*5ffd83dbSDimitry Andric  * LLJIT instance. This operation transfers ownership of the buffer to the
309*5ffd83dbSDimitry Andric  * LLJIT instance. The buffer should not be disposed of or referenced once this
310*5ffd83dbSDimitry Andric  * function returns.
311*5ffd83dbSDimitry Andric  */
312*5ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
313*5ffd83dbSDimitry Andric                                        LLVMMemoryBufferRef ObjBuffer);
314*5ffd83dbSDimitry Andric 
315*5ffd83dbSDimitry Andric /**
316*5ffd83dbSDimitry Andric  * Add an IR module to the given JITDylib of the given LLJIT instance. This
317*5ffd83dbSDimitry Andric  * operation transfers ownership of the TSM argument to the LLJIT instance.
318*5ffd83dbSDimitry Andric  * The TSM argument should not be 3disposed of or referenced once this
319*5ffd83dbSDimitry Andric  * function returns.
320*5ffd83dbSDimitry Andric  */
321*5ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
322*5ffd83dbSDimitry Andric                                          LLVMOrcJITDylibRef JD,
323*5ffd83dbSDimitry Andric                                          LLVMOrcThreadSafeModuleRef TSM);
324*5ffd83dbSDimitry Andric /**
325*5ffd83dbSDimitry Andric  * Look up the given symbol in the main JITDylib of the given LLJIT instance.
326*5ffd83dbSDimitry Andric  *
327*5ffd83dbSDimitry Andric  * This operation does not take ownership of the Name argument.
328*5ffd83dbSDimitry Andric  */
329*5ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
330*5ffd83dbSDimitry Andric                                 LLVMOrcJITTargetAddress *Result,
331*5ffd83dbSDimitry Andric                                 const char *Name);
332*5ffd83dbSDimitry Andric 
333*5ffd83dbSDimitry Andric LLVM_C_EXTERN_C_END
334*5ffd83dbSDimitry Andric 
335*5ffd83dbSDimitry Andric #endif /* LLVM_C_ORC_H */
336