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