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  * A function for constructing an ObjectLinkingLayer instance to be used
36  * by an LLJIT instance.
37  *
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.
42  *
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.
46  */
47 typedef LLVMOrcObjectLayerRef (
48     *LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction)(
49     void *Ctx, LLVMOrcExecutionSessionRef ES, const char *Triple);
50 
51 /**
52  * A reference to an orc::LLJITBuilder instance.
53  */
54 typedef struct LLVMOrcOpaqueLLJITBuilder *LLVMOrcLLJITBuilderRef;
55 
56 /**
57  * A reference to an orc::LLJIT instance.
58  */
59 typedef struct LLVMOrcOpaqueLLJIT *LLVMOrcLLJITRef;
60 
61 /**
62  * Create an LLVMOrcLLJITBuilder.
63  *
64  * The client owns the resulting LLJITBuilder and should dispose of it using
65  * LLVMOrcDisposeLLJITBuilder once they are done with it.
66  */
67 LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void);
68 
69 /**
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).
73  */
74 void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder);
75 
76 /**
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.
81  */
82 void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
83     LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB);
84 
85 /**
86  * Set an ObjectLinkingLayer creator function for this LLJIT instance.
87  */
88 void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(
89     LLVMOrcLLJITBuilderRef Builder,
90     LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx);
91 
92 /**
93  * Create an LLJIT instance from an LLJITBuilder.
94  *
95  * This operation takes ownership of the Builder argument: clients should not
96  * dispose of the builder after calling this function (even if the function
97  * returns an error). If a null Builder argument is provided then a
98  * default-constructed LLJITBuilder will be used.
99  *
100  * On success the resulting LLJIT instance is uniquely owned by the client and
101  * automatically manages the memory of all JIT'd code and all modules that are
102  * transferred to it (e.g. via LLVMOrcLLJITAddLLVMIRModule). Disposing of the
103  * LLJIT instance will free all memory managed by the JIT, including JIT'd code
104  * and not-yet compiled modules.
105  */
106 LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
107                                 LLVMOrcLLJITBuilderRef Builder);
108 
109 /**
110  * Dispose of an LLJIT instance.
111  */
112 LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J);
113 
114 /**
115  * Get a reference to the ExecutionSession for this LLJIT instance.
116  *
117  * The ExecutionSession is owned by the LLJIT instance. The client is not
118  * responsible for managing its memory.
119  */
120 LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J);
121 
122 /**
123  * Return a reference to the Main JITDylib.
124  *
125  * The JITDylib is owned by the LLJIT instance. The client is not responsible
126  * for managing its memory.
127  */
128 LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J);
129 
130 /**
131  * Return the target triple for this LLJIT instance. This string is owned by
132  * the LLJIT instance and should not be freed by the client.
133  */
134 const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J);
135 
136 /**
137  * Returns the global prefix character according to the LLJIT's DataLayout.
138  */
139 char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J);
140 
141 /**
142  * Mangles the given string according to the LLJIT instance's DataLayout, then
143  * interns the result in the SymbolStringPool and returns a reference to the
144  * pool entry. Clients should call LLVMOrcReleaseSymbolStringPoolEntry to
145  * decrement the ref-count on the pool entry once they are finished with this
146  * value.
147  */
148 LLVMOrcSymbolStringPoolEntryRef
149 LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName);
150 
151 /**
152  * Add a buffer representing an object file to the given JITDylib in the given
153  * LLJIT instance. This operation transfers ownership of the buffer to the
154  * LLJIT instance. The buffer should not be disposed of or referenced once this
155  * function returns.
156  *
157  * Resources associated with the given object will be tracked by the given
158  * JITDylib's default resource tracker.
159  */
160 LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
161                                        LLVMMemoryBufferRef ObjBuffer);
162 
163 /**
164  * Add a buffer representing an object file to the given ResourceTracker's
165  * JITDylib in the given LLJIT instance. This operation transfers ownership of
166  * the buffer to the LLJIT instance. The buffer should not be disposed of or
167  * referenced once this function returns.
168  *
169  * Resources associated with the given object will be tracked by ResourceTracker
170  * RT.
171  */
172 LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J,
173                                              LLVMOrcResourceTrackerRef RT,
174                                              LLVMMemoryBufferRef ObjBuffer);
175 
176 /**
177  * Add an IR module to the given JITDylib in the given LLJIT instance. This
178  * operation transfers ownership of the TSM argument to the LLJIT instance.
179  * The TSM argument should not be disposed of or referenced once this
180  * function returns.
181  *
182  * Resources associated with the given Module will be tracked by the given
183  * JITDylib's default resource tracker.
184  */
185 LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
186                                          LLVMOrcJITDylibRef JD,
187                                          LLVMOrcThreadSafeModuleRef TSM);
188 
189 /**
190  * Add an IR module to the given ResourceTracker's JITDylib in the given LLJIT
191  * instance. This operation transfers ownership of the TSM argument to the LLJIT
192  * instance. The TSM argument should not be disposed of or referenced once this
193  * function returns.
194  *
195  * Resources associated with the given Module will be tracked by ResourceTracker
196  * RT.
197  */
198 LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J,
199                                                LLVMOrcResourceTrackerRef JD,
200                                                LLVMOrcThreadSafeModuleRef TSM);
201 
202 /**
203  * Look up the given symbol in the main JITDylib of the given LLJIT instance.
204  *
205  * This operation does not take ownership of the Name argument.
206  */
207 LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
208                                 LLVMOrcJITTargetAddress *Result,
209                                 const char *Name);
210 
211 LLVM_C_EXTERN_C_END
212 
213 #endif /* LLVM_C_LLJIT_H */
214