blob: b0aa1cf5ca6295358138308a5defef833703fe9d [file] [log] [blame]
Lang Hames633ea072020-03-14 14:16:42 -07001//===--------------- OrcV2CBindings.cpp - C bindings OrcV2 APIs -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm-c/Orc.h"
10#include "llvm-c/TargetMachine.h"
11
12#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
13#include "llvm/ExecutionEngine/Orc/LLJIT.h"
14
15using namespace llvm;
16using namespace llvm::orc;
17
Lang Hames1cd84932020-04-09 12:15:13 -070018namespace llvm {
19namespace orc {
20
21class OrcV2CAPIHelper {
22public:
23 using PoolEntry = SymbolStringPtr::PoolEntry;
24 using PoolEntryPtr = SymbolStringPtr::PoolEntryPtr;
25
26 static PoolEntryPtr releaseSymbolStringPtr(SymbolStringPtr S) {
27 PoolEntryPtr Result = nullptr;
28 std::swap(Result, S.S);
29 return Result;
30 }
31
32 static PoolEntryPtr getRawPoolEntryPtr(const SymbolStringPtr &S) {
33 return S.S;
34 }
35
36 static void releasePoolEntry(PoolEntryPtr P) {
37 SymbolStringPtr S;
38 S.S = P;
39 }
40};
41
42} // end namespace orc
43} // end namespace llvm
44
45DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef)
46DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry,
47 LLVMOrcSymbolStringPoolEntryRef)
48DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)
Lang Hames5d2e3592020-10-01 14:40:08 -070049DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator,
Lang Hames1cd84932020-04-09 12:15:13 -070050 LLVMOrcJITDylibDefinitionGeneratorRef)
Lang Hames633ea072020-03-14 14:16:42 -070051DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext,
52 LLVMOrcThreadSafeContextRef)
53DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef)
Lang Hames1cd84932020-04-09 12:15:13 -070054DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder,
55 LLVMOrcJITTargetMachineBuilderRef)
56DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef)
Lang Hames633ea072020-03-14 14:16:42 -070057DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef)
58
Lang Hames59ed45b2020-04-10 14:07:51 -070059DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
60
Lang Hames1cd84932020-04-09 12:15:13 -070061LLVMOrcSymbolStringPoolEntryRef
62LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
63 return wrap(
64 OrcV2CAPIHelper::releaseSymbolStringPtr(unwrap(ES)->intern(Name)));
65}
66
67void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
68 OrcV2CAPIHelper::releasePoolEntry(unwrap(S));
69}
70
Lang Hames9a0d1b62020-09-16 13:46:55 -070071LLVMOrcJITDylibRef
72LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,
73 const char *Name) {
74 return wrap(&unwrap(ES)->createBareJITDylib(Name));
75}
76
77LLVMErrorRef
78LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,
79 LLVMOrcJITDylibRef *Result,
80 const char *Name) {
81 auto JD = unwrap(ES)->createJITDylib(Name);
82 if (!JD)
83 return wrap(JD.takeError());
84 *Result = wrap(&*JD);
85 return LLVMErrorSuccess;
86}
87
88LLVMOrcJITDylibRef
89LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
90 const char *Name) {
91 return wrap(unwrap(ES)->getJITDylibByName(Name));
92}
93
Lang Hames1cd84932020-04-09 12:15:13 -070094void LLVMOrcDisposeJITDylibDefinitionGenerator(
95 LLVMOrcJITDylibDefinitionGeneratorRef DG) {
96 delete unwrap(DG);
97}
98
99void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
100 LLVMOrcJITDylibDefinitionGeneratorRef DG) {
Lang Hames5d2e3592020-10-01 14:40:08 -0700101 unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG)));
Lang Hames1cd84932020-04-09 12:15:13 -0700102}
103
104LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
105 LLVMOrcJITDylibDefinitionGeneratorRef *Result, char GlobalPrefix,
106 LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
107 assert(Result && "Result can not be null");
108 assert((Filter || !FilterCtx) &&
109 "if Filter is null then FilterCtx must also be null");
110
111 DynamicLibrarySearchGenerator::SymbolPredicate Pred;
112 if (Filter)
113 Pred = [=](const SymbolStringPtr &Name) -> bool {
114 return Filter(wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)), FilterCtx);
115 };
116
117 auto ProcessSymsGenerator =
118 DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred);
119
120 if (!ProcessSymsGenerator) {
121 *Result = 0;
122 return wrap(ProcessSymsGenerator.takeError());
123 }
124
125 *Result = wrap(ProcessSymsGenerator->release());
126 return LLVMErrorSuccess;
127}
128
129LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
Lang Hames633ea072020-03-14 14:16:42 -0700130 return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
131}
132
133LLVMContextRef
134LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
135 return wrap(unwrap(TSCtx)->getContext());
136}
137
138void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
139 delete unwrap(TSCtx);
140}
141
142LLVMOrcThreadSafeModuleRef
143LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
144 LLVMOrcThreadSafeContextRef TSCtx) {
145 return wrap(
146 new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));
147}
148
149void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
150 delete unwrap(TSM);
151}
152
Lang Hames1cd84932020-04-09 12:15:13 -0700153LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(
154 LLVMOrcJITTargetMachineBuilderRef *Result) {
155 assert(Result && "Result can not be null");
156
157 auto JTMB = JITTargetMachineBuilder::detectHost();
158 if (!JTMB) {
159 Result = 0;
160 return wrap(JTMB.takeError());
161 }
162
163 *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB)));
164 return LLVMErrorSuccess;
165}
166
Lang Hames59ed45b2020-04-10 14:07:51 -0700167LLVMOrcJITTargetMachineBuilderRef
168LLVMOrcJITTargetMachineBuilderFromTargetMachine(LLVMTargetMachineRef TM) {
169 auto *TemplateTM = unwrap(TM);
170
171 auto JTMB =
172 std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple());
173
174 (*JTMB)
175 .setCPU(TemplateTM->getTargetCPU().str())
176 .setRelocationModel(TemplateTM->getRelocationModel())
177 .setCodeModel(TemplateTM->getCodeModel())
178 .setCodeGenOptLevel(TemplateTM->getOptLevel())
179 .setFeatures(TemplateTM->getTargetFeatureString())
180 .setOptions(TemplateTM->Options);
181
182 LLVMDisposeTargetMachine(TM);
183
184 return wrap(JTMB.release());
185}
186
Lang Hames1cd84932020-04-09 12:15:13 -0700187void LLVMOrcDisposeJITTargetMachineBuilder(
188 LLVMOrcJITTargetMachineBuilderRef JTMB) {
189 delete unwrap(JTMB);
190}
191
192LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
193 return wrap(new LLJITBuilder());
194}
195
196void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
197 delete unwrap(Builder);
198}
199
200void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
201 LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {
202 unwrap(Builder)->setJITTargetMachineBuilder(*unwrap(JTMB));
203}
204
205LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
206 LLVMOrcLLJITBuilderRef Builder) {
207 assert(Result && "Result can not be null");
208
209 if (!Builder)
210 Builder = LLVMOrcCreateLLJITBuilder();
211
212 auto J = unwrap(Builder)->create();
213 LLVMOrcDisposeLLJITBuilder(Builder);
Lang Hames633ea072020-03-14 14:16:42 -0700214
215 if (!J) {
216 Result = 0;
217 return wrap(J.takeError());
218 }
219
220 *Result = wrap(J->release());
221 return LLVMErrorSuccess;
222}
223
224LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
225 delete unwrap(J);
226 return LLVMErrorSuccess;
227}
228
Lang Hames1cd84932020-04-09 12:15:13 -0700229LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
230 return wrap(&unwrap(J)->getExecutionSession());
231}
232
233LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
234 return wrap(&unwrap(J)->getMainJITDylib());
235}
236
Lang Hames0d5f15f2020-04-09 16:17:04 -0700237const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {
238 return unwrap(J)->getTargetTriple().str().c_str();
239}
240
Lang Hames1cd84932020-04-09 12:15:13 -0700241char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
242 return unwrap(J)->getDataLayout().getGlobalPrefix();
243}
244
245LLVMOrcSymbolStringPoolEntryRef
246LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {
247 return wrap(OrcV2CAPIHelper::releaseSymbolStringPtr(
248 unwrap(J)->mangleAndIntern(UnmangledName)));
249}
250
Lang Hames37bcf2d2020-04-09 17:54:59 -0700251LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
Lang Hames0d5f15f2020-04-09 16:17:04 -0700252 LLVMMemoryBufferRef ObjBuffer) {
253 return wrap(unwrap(J)->addObjectFile(
Lang Hames37bcf2d2020-04-09 17:54:59 -0700254 *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
Lang Hames0d5f15f2020-04-09 16:17:04 -0700255}
256
Lang Hames633ea072020-03-14 14:16:42 -0700257LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
Lang Hames37bcf2d2020-04-09 17:54:59 -0700258 LLVMOrcJITDylibRef JD,
Lang Hames633ea072020-03-14 14:16:42 -0700259 LLVMOrcThreadSafeModuleRef TSM) {
Lang Hamesc88d9ea2020-10-01 15:25:06 -0700260 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
261 return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM)));
Lang Hames633ea072020-03-14 14:16:42 -0700262}
263
264LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
265 LLVMOrcJITTargetAddress *Result,
266 const char *Name) {
Lang Hames1cd84932020-04-09 12:15:13 -0700267 assert(Result && "Result can not be null");
268
Lang Hames633ea072020-03-14 14:16:42 -0700269 auto Sym = unwrap(J)->lookup(Name);
270 if (!Sym) {
271 *Result = 0;
272 return wrap(Sym.takeError());
273 }
274
275 *Result = Sym->getAddress();
276 return LLVMErrorSuccess;
277}