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