1 /*===----------- llvm-c/LLJIT.h - OrcV2 LLJIT C bindings --------*- C++ -*-===*\
3 |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
5 |* See https://llvm.org/LICENSE.txt for license information. *|
6 |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
8 |*===----------------------------------------------------------------------===*|
10 |* This header declares the C interface to the LLJIT class in *|
11 |* libLLVMOrcJIT.a, which provides a simple MCJIT-like ORC JIT. *|
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. *|
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 *|
22 \*===----------------------------------------------------------------------===*/
24 #ifndef LLVM_C_LLJIT_H
25 #define LLVM_C_LLJIT_H
27 #include "llvm-c/Error.h"
28 #include "llvm-c/Orc.h"
29 #include "llvm-c/TargetMachine.h"
30 #include "llvm-c/Types.h"
35 * A function for constructing an ObjectLinkingLayer instance to be used
36 * by an LLJIT instance.
38 * Clients can call LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator to
39 * set the creator function to use when constructing an LLJIT instance.
40 * This can be used to override the default linking layer implementation
41 * that would otherwise be chosen by LLJITBuilder.
43 * Object linking layers returned by this function will become owned by the
44 * LLJIT instance. The client is not responsible for managing their lifetimes
45 * after the function returns.
47 typedef LLVMOrcObjectLayerRef (
48 *LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction
)(
49 void *Ctx
, LLVMOrcExecutionSessionRef ES
, const char *Triple
);
52 * A reference to an orc::LLJITBuilder instance.
54 typedef struct LLVMOrcOpaqueLLJITBuilder
*LLVMOrcLLJITBuilderRef
;
57 * A reference to an orc::LLJIT instance.
59 typedef struct LLVMOrcOpaqueLLJIT
*LLVMOrcLLJITRef
;
62 * Create an LLVMOrcLLJITBuilder.
64 * The client owns the resulting LLJITBuilder and should dispose of it using
65 * LLVMOrcDisposeLLJITBuilder once they are done with it.
67 LLVMOrcLLJITBuilderRef
LLVMOrcCreateLLJITBuilder(void);
70 * Dispose of an LLVMOrcLLJITBuilderRef. This should only be called if ownership
71 * has not been passed to LLVMOrcCreateLLJIT (e.g. because some error prevented
72 * that function from being called).
74 void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder
);
77 * Set the JITTargetMachineBuilder to be used when constructing the LLJIT
78 * instance. Calling this function is optional: if it is not called then the
79 * LLJITBuilder will use JITTargeTMachineBuilder::detectHost to construct a
80 * JITTargetMachineBuilder.
82 * This function takes ownership of the JTMB argument: clients should not
83 * dispose of the JITTargetMachineBuilder after calling this function.
85 void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
86 LLVMOrcLLJITBuilderRef Builder
, LLVMOrcJITTargetMachineBuilderRef JTMB
);
89 * Set an ObjectLinkingLayer creator function for this LLJIT instance.
91 void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(
92 LLVMOrcLLJITBuilderRef Builder
,
93 LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F
, void *Ctx
);
96 * Create an LLJIT instance from an LLJITBuilder.
98 * This operation takes ownership of the Builder argument: clients should not
99 * dispose of the builder after calling this function (even if the function
100 * returns an error). If a null Builder argument is provided then a
101 * default-constructed LLJITBuilder will be used.
103 * On success the resulting LLJIT instance is uniquely owned by the client and
104 * automatically manages the memory of all JIT'd code and all modules that are
105 * transferred to it (e.g. via LLVMOrcLLJITAddLLVMIRModule). Disposing of the
106 * LLJIT instance will free all memory managed by the JIT, including JIT'd code
107 * and not-yet compiled modules.
109 LLVMErrorRef
LLVMOrcCreateLLJIT(LLVMOrcLLJITRef
*Result
,
110 LLVMOrcLLJITBuilderRef Builder
);
113 * Dispose of an LLJIT instance.
115 LLVMErrorRef
LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J
);
118 * Get a reference to the ExecutionSession for this LLJIT instance.
120 * The ExecutionSession is owned by the LLJIT instance. The client is not
121 * responsible for managing its memory.
123 LLVMOrcExecutionSessionRef
LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J
);
126 * Return a reference to the Main JITDylib.
128 * The JITDylib is owned by the LLJIT instance. The client is not responsible
129 * for managing its memory.
131 LLVMOrcJITDylibRef
LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J
);
134 * Return the target triple for this LLJIT instance. This string is owned by
135 * the LLJIT instance and should not be freed by the client.
137 const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J
);
140 * Returns the global prefix character according to the LLJIT's DataLayout.
142 char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J
);
145 * Mangles the given string according to the LLJIT instance's DataLayout, then
146 * interns the result in the SymbolStringPool and returns a reference to the
147 * pool entry. Clients should call LLVMOrcReleaseSymbolStringPoolEntry to
148 * decrement the ref-count on the pool entry once they are finished with this
151 LLVMOrcSymbolStringPoolEntryRef
152 LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J
, const char *UnmangledName
);
155 * Add a buffer representing an object file to the given JITDylib in the given
156 * LLJIT instance. This operation transfers ownership of the buffer to the
157 * LLJIT instance. The buffer should not be disposed of or referenced once this
160 * Resources associated with the given object will be tracked by the given
161 * JITDylib's default resource tracker.
163 LLVMErrorRef
LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J
, LLVMOrcJITDylibRef JD
,
164 LLVMMemoryBufferRef ObjBuffer
);
167 * Add a buffer representing an object file to the given ResourceTracker's
168 * JITDylib in the given LLJIT instance. This operation transfers ownership of
169 * the buffer to the LLJIT instance. The buffer should not be disposed of or
170 * referenced once this function returns.
172 * Resources associated with the given object will be tracked by ResourceTracker
175 LLVMErrorRef
LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J
,
176 LLVMOrcResourceTrackerRef RT
,
177 LLVMMemoryBufferRef ObjBuffer
);
180 * Add an IR module to the given JITDylib in the given LLJIT instance. This
181 * operation transfers ownership of the TSM argument to the LLJIT instance.
182 * The TSM argument should not be disposed of or referenced once this
185 * Resources associated with the given Module will be tracked by the given
186 * JITDylib's default resource tracker.
188 LLVMErrorRef
LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J
,
189 LLVMOrcJITDylibRef JD
,
190 LLVMOrcThreadSafeModuleRef TSM
);
193 * Add an IR module to the given ResourceTracker's JITDylib in the given LLJIT
194 * instance. This operation transfers ownership of the TSM argument to the LLJIT
195 * instance. The TSM argument should not be disposed of or referenced once this
198 * Resources associated with the given Module will be tracked by ResourceTracker
201 LLVMErrorRef
LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J
,
202 LLVMOrcResourceTrackerRef JD
,
203 LLVMOrcThreadSafeModuleRef TSM
);
206 * Look up the given symbol in the main JITDylib of the given LLJIT instance.
208 * This operation does not take ownership of the Name argument.
210 LLVMErrorRef
LLVMOrcLLJITLookup(LLVMOrcLLJITRef J
,
211 LLVMOrcExecutorAddress
*Result
,
215 * Returns a non-owning reference to the LLJIT instance's object linking layer.
217 LLVMOrcObjectLayerRef
LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J
);
220 * Returns a non-owning reference to the LLJIT instance's object linking layer.
222 LLVMOrcObjectTransformLayerRef
223 LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J
);
226 * Returns a non-owning reference to the LLJIT instance's IR transform layer.
228 LLVMOrcIRTransformLayerRef
LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J
);
231 * Get the LLJIT instance's default data layout string.
233 * This string is owned by the LLJIT instance and does not need to be freed
236 const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J
);
240 #endif /* LLVM_C_LLJIT_H */