blob: 1179f677389f385566f5de744d8e8ba27d063ced [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 Hames14cb9b42020-10-01 11:24:34 -070061void LLVMOrcExecutionSessionSetErrorReporter(
62 LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError,
63 void *Ctx) {
64 unwrap(ES)->setErrorReporter(
65 [=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); });
66}
67
Lang Hames1cd84932020-04-09 12:15:13 -070068LLVMOrcSymbolStringPoolEntryRef
69LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
70 return wrap(
71 OrcV2CAPIHelper::releaseSymbolStringPtr(unwrap(ES)->intern(Name)));
72}
73
74void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
75 OrcV2CAPIHelper::releasePoolEntry(unwrap(S));
76}
77
Lang Hames9a0d1b62020-09-16 13:46:55 -070078LLVMOrcJITDylibRef
79LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,
80 const char *Name) {
81 return wrap(&unwrap(ES)->createBareJITDylib(Name));
82}
83
84LLVMErrorRef
85LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,
86 LLVMOrcJITDylibRef *Result,
87 const char *Name) {
88 auto JD = unwrap(ES)->createJITDylib(Name);
89 if (!JD)
90 return wrap(JD.takeError());
91 *Result = wrap(&*JD);
92 return LLVMErrorSuccess;
93}
94
95LLVMOrcJITDylibRef
96LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
97 const char *Name) {
98 return wrap(unwrap(ES)->getJITDylibByName(Name));
99}
100
Lang Hames1cd84932020-04-09 12:15:13 -0700101void LLVMOrcDisposeJITDylibDefinitionGenerator(
102 LLVMOrcJITDylibDefinitionGeneratorRef DG) {
103 delete unwrap(DG);
104}
105
106void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
107 LLVMOrcJITDylibDefinitionGeneratorRef DG) {
Lang Hames5d2e3592020-10-01 14:40:08 -0700108 unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG)));
Lang Hames1cd84932020-04-09 12:15:13 -0700109}
110
111LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(
112 LLVMOrcJITDylibDefinitionGeneratorRef *Result, char GlobalPrefix,
113 LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
114 assert(Result && "Result can not be null");
115 assert((Filter || !FilterCtx) &&
116 "if Filter is null then FilterCtx must also be null");
117
118 DynamicLibrarySearchGenerator::SymbolPredicate Pred;
119 if (Filter)
120 Pred = [=](const SymbolStringPtr &Name) -> bool {
121 return Filter(wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)), FilterCtx);
122 };
123
124 auto ProcessSymsGenerator =
125 DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred);
126
127 if (!ProcessSymsGenerator) {
128 *Result = 0;
129 return wrap(ProcessSymsGenerator.takeError());
130 }
131
132 *Result = wrap(ProcessSymsGenerator->release());
133 return LLVMErrorSuccess;
134}
135
136LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
Lang Hames633ea072020-03-14 14:16:42 -0700137 return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
138}
139
140LLVMContextRef
141LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
142 return wrap(unwrap(TSCtx)->getContext());
143}
144
145void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
146 delete unwrap(TSCtx);
147}
148
149LLVMOrcThreadSafeModuleRef
150LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,
151 LLVMOrcThreadSafeContextRef TSCtx) {
152 return wrap(
153 new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));
154}
155
156void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
157 delete unwrap(TSM);
158}
159
Lang Hames1cd84932020-04-09 12:15:13 -0700160LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(
161 LLVMOrcJITTargetMachineBuilderRef *Result) {
162 assert(Result && "Result can not be null");
163
164 auto JTMB = JITTargetMachineBuilder::detectHost();
165 if (!JTMB) {
166 Result = 0;
167 return wrap(JTMB.takeError());
168 }
169
170 *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB)));
171 return LLVMErrorSuccess;
172}
173
Lang Hames59ed45b2020-04-10 14:07:51 -0700174LLVMOrcJITTargetMachineBuilderRef
175LLVMOrcJITTargetMachineBuilderFromTargetMachine(LLVMTargetMachineRef TM) {
176 auto *TemplateTM = unwrap(TM);
177
178 auto JTMB =
179 std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple());
180
181 (*JTMB)
182 .setCPU(TemplateTM->getTargetCPU().str())
183 .setRelocationModel(TemplateTM->getRelocationModel())
184 .setCodeModel(TemplateTM->getCodeModel())
185 .setCodeGenOptLevel(TemplateTM->getOptLevel())
186 .setFeatures(TemplateTM->getTargetFeatureString())
187 .setOptions(TemplateTM->Options);
188
189 LLVMDisposeTargetMachine(TM);
190
191 return wrap(JTMB.release());
192}
193
Lang Hames1cd84932020-04-09 12:15:13 -0700194void LLVMOrcDisposeJITTargetMachineBuilder(
195 LLVMOrcJITTargetMachineBuilderRef JTMB) {
196 delete unwrap(JTMB);
197}
198
199LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
200 return wrap(new LLJITBuilder());
201}
202
203void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
204 delete unwrap(Builder);
205}
206
207void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(
208 LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {
209 unwrap(Builder)->setJITTargetMachineBuilder(*unwrap(JTMB));
210}
211
212LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,
213 LLVMOrcLLJITBuilderRef Builder) {
214 assert(Result && "Result can not be null");
215
216 if (!Builder)
217 Builder = LLVMOrcCreateLLJITBuilder();
218
219 auto J = unwrap(Builder)->create();
220 LLVMOrcDisposeLLJITBuilder(Builder);
Lang Hames633ea072020-03-14 14:16:42 -0700221
222 if (!J) {
223 Result = 0;
224 return wrap(J.takeError());
225 }
226
227 *Result = wrap(J->release());
228 return LLVMErrorSuccess;
229}
230
231LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
232 delete unwrap(J);
233 return LLVMErrorSuccess;
234}
235
Lang Hames1cd84932020-04-09 12:15:13 -0700236LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
237 return wrap(&unwrap(J)->getExecutionSession());
238}
239
240LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
241 return wrap(&unwrap(J)->getMainJITDylib());
242}
243
Lang Hames0d5f15f2020-04-09 16:17:04 -0700244const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {
245 return unwrap(J)->getTargetTriple().str().c_str();
246}
247
Lang Hames1cd84932020-04-09 12:15:13 -0700248char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
249 return unwrap(J)->getDataLayout().getGlobalPrefix();
250}
251
252LLVMOrcSymbolStringPoolEntryRef
253LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {
254 return wrap(OrcV2CAPIHelper::releaseSymbolStringPtr(
255 unwrap(J)->mangleAndIntern(UnmangledName)));
256}
257
Lang Hames37bcf2d2020-04-09 17:54:59 -0700258LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,
Lang Hames0d5f15f2020-04-09 16:17:04 -0700259 LLVMMemoryBufferRef ObjBuffer) {
260 return wrap(unwrap(J)->addObjectFile(
Lang Hames37bcf2d2020-04-09 17:54:59 -0700261 *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));
Lang Hames0d5f15f2020-04-09 16:17:04 -0700262}
263
Lang Hames633ea072020-03-14 14:16:42 -0700264LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,
Lang Hames37bcf2d2020-04-09 17:54:59 -0700265 LLVMOrcJITDylibRef JD,
Lang Hames633ea072020-03-14 14:16:42 -0700266 LLVMOrcThreadSafeModuleRef TSM) {
Lang Hamesc88d9ea2020-10-01 15:25:06 -0700267 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));
268 return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM)));
Lang Hames633ea072020-03-14 14:16:42 -0700269}
270
271LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,
272 LLVMOrcJITTargetAddress *Result,
273 const char *Name) {
Lang Hames1cd84932020-04-09 12:15:13 -0700274 assert(Result && "Result can not be null");
275
Lang Hames633ea072020-03-14 14:16:42 -0700276 auto Sym = unwrap(J)->lookup(Name);
277 if (!Sym) {
278 *Result = 0;
279 return wrap(Sym.takeError());
280 }
281
282 *Result = Sym->getAddress();
283 return LLVMErrorSuccess;
284}