15ffd83dbSDimitry Andric //===--------------- OrcV2CBindings.cpp - C bindings OrcV2 APIs -----------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 9e8d8bef9SDimitry Andric #include "llvm-c/LLJIT.h" 105ffd83dbSDimitry Andric #include "llvm-c/Orc.h" 11e8d8bef9SDimitry Andric #include "llvm-c/OrcEE.h" 125ffd83dbSDimitry Andric #include "llvm-c/TargetMachine.h" 135ffd83dbSDimitry Andric 145ffd83dbSDimitry Andric #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h" 155ffd83dbSDimitry Andric #include "llvm/ExecutionEngine/Orc/LLJIT.h" 16fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h" 17e8d8bef9SDimitry Andric #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" 18e8d8bef9SDimitry Andric #include "llvm/ExecutionEngine/SectionMemoryManager.h" 195ffd83dbSDimitry Andric 205ffd83dbSDimitry Andric using namespace llvm; 215ffd83dbSDimitry Andric using namespace llvm::orc; 225ffd83dbSDimitry Andric 235ffd83dbSDimitry Andric namespace llvm { 245ffd83dbSDimitry Andric namespace orc { 255ffd83dbSDimitry Andric 26e8d8bef9SDimitry Andric class InProgressLookupState; 27e8d8bef9SDimitry Andric 285ffd83dbSDimitry Andric class OrcV2CAPIHelper { 295ffd83dbSDimitry Andric public: 305ffd83dbSDimitry Andric using PoolEntry = SymbolStringPtr::PoolEntry; 315ffd83dbSDimitry Andric using PoolEntryPtr = SymbolStringPtr::PoolEntryPtr; 325ffd83dbSDimitry Andric 33fe6060f1SDimitry Andric // Move from SymbolStringPtr to PoolEntryPtr (no change in ref count). 34fe6060f1SDimitry Andric static PoolEntryPtr moveFromSymbolStringPtr(SymbolStringPtr S) { 355ffd83dbSDimitry Andric PoolEntryPtr Result = nullptr; 365ffd83dbSDimitry Andric std::swap(Result, S.S); 375ffd83dbSDimitry Andric return Result; 385ffd83dbSDimitry Andric } 395ffd83dbSDimitry Andric 40fe6060f1SDimitry Andric // Move from a PoolEntryPtr to a SymbolStringPtr (no change in ref count). 41fe6060f1SDimitry Andric static SymbolStringPtr moveToSymbolStringPtr(PoolEntryPtr P) { 42fe6060f1SDimitry Andric SymbolStringPtr S; 43fe6060f1SDimitry Andric S.S = P; 44fe6060f1SDimitry Andric return S; 45fe6060f1SDimitry Andric } 46fe6060f1SDimitry Andric 47fe6060f1SDimitry Andric // Copy a pool entry to a SymbolStringPtr (increments ref count). 48fe6060f1SDimitry Andric static SymbolStringPtr copyToSymbolStringPtr(PoolEntryPtr P) { 49e8d8bef9SDimitry Andric return SymbolStringPtr(P); 50e8d8bef9SDimitry Andric } 51e8d8bef9SDimitry Andric 525ffd83dbSDimitry Andric static PoolEntryPtr getRawPoolEntryPtr(const SymbolStringPtr &S) { 535ffd83dbSDimitry Andric return S.S; 545ffd83dbSDimitry Andric } 555ffd83dbSDimitry Andric 56e8d8bef9SDimitry Andric static void retainPoolEntry(PoolEntryPtr P) { 57e8d8bef9SDimitry Andric SymbolStringPtr S(P); 58e8d8bef9SDimitry Andric S.S = nullptr; 59e8d8bef9SDimitry Andric } 60e8d8bef9SDimitry Andric 615ffd83dbSDimitry Andric static void releasePoolEntry(PoolEntryPtr P) { 625ffd83dbSDimitry Andric SymbolStringPtr S; 635ffd83dbSDimitry Andric S.S = P; 645ffd83dbSDimitry Andric } 65e8d8bef9SDimitry Andric 66e8d8bef9SDimitry Andric static InProgressLookupState *extractLookupState(LookupState &LS) { 67e8d8bef9SDimitry Andric return LS.IPLS.release(); 68e8d8bef9SDimitry Andric } 69e8d8bef9SDimitry Andric 70e8d8bef9SDimitry Andric static void resetLookupState(LookupState &LS, InProgressLookupState *IPLS) { 71e8d8bef9SDimitry Andric return LS.reset(IPLS); 72e8d8bef9SDimitry Andric } 735ffd83dbSDimitry Andric }; 745ffd83dbSDimitry Andric 75e8d8bef9SDimitry Andric } // namespace orc 76e8d8bef9SDimitry Andric } // namespace llvm 775ffd83dbSDimitry Andric 785ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef) 79e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef) 805ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry, 815ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef) 82e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationUnit, 83e8d8bef9SDimitry Andric LLVMOrcMaterializationUnitRef) 84fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationResponsibility, 85fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef) 865ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef) 87e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef) 88e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator, 89e8d8bef9SDimitry Andric LLVMOrcDefinitionGeneratorRef) 90e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(InProgressLookupState, LLVMOrcLookupStateRef) 915ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext, 925ffd83dbSDimitry Andric LLVMOrcThreadSafeContextRef) 935ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef) 945ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder, 955ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef) 96e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectLayer, LLVMOrcObjectLayerRef) 97fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRTransformLayer, LLVMOrcIRTransformLayerRef) 98fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectTransformLayer, 99fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerRef) 100fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DumpObjects, LLVMOrcDumpObjectsRef) 101fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IndirectStubsManager, 102fe6060f1SDimitry Andric LLVMOrcIndirectStubsManagerRef) 103fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LazyCallThroughManager, 104fe6060f1SDimitry Andric LLVMOrcLazyCallThroughManagerRef) 1055ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef) 1065ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef) 1075ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef) 1085ffd83dbSDimitry Andric 109fe6060f1SDimitry Andric namespace { 110fe6060f1SDimitry Andric 111fe6060f1SDimitry Andric class OrcCAPIMaterializationUnit : public llvm::orc::MaterializationUnit { 112fe6060f1SDimitry Andric public: 113fe6060f1SDimitry Andric OrcCAPIMaterializationUnit( 114fe6060f1SDimitry Andric std::string Name, SymbolFlagsMap InitialSymbolFlags, 115fe6060f1SDimitry Andric SymbolStringPtr InitSymbol, void *Ctx, 116fe6060f1SDimitry Andric LLVMOrcMaterializationUnitMaterializeFunction Materialize, 117fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDiscardFunction Discard, 118fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDestroyFunction Destroy) 1190eae32dcSDimitry Andric : llvm::orc::MaterializationUnit( 1200eae32dcSDimitry Andric Interface(std::move(InitialSymbolFlags), std::move(InitSymbol))), 121fe6060f1SDimitry Andric Name(std::move(Name)), Ctx(Ctx), Materialize(Materialize), 122fe6060f1SDimitry Andric Discard(Discard), Destroy(Destroy) {} 123fe6060f1SDimitry Andric 124fe6060f1SDimitry Andric ~OrcCAPIMaterializationUnit() { 125fe6060f1SDimitry Andric if (Ctx) 126fe6060f1SDimitry Andric Destroy(Ctx); 127fe6060f1SDimitry Andric } 128fe6060f1SDimitry Andric 129fe6060f1SDimitry Andric StringRef getName() const override { return Name; } 130fe6060f1SDimitry Andric 131fe6060f1SDimitry Andric void materialize(std::unique_ptr<MaterializationResponsibility> R) override { 132fe6060f1SDimitry Andric void *Tmp = Ctx; 133fe6060f1SDimitry Andric Ctx = nullptr; 134fe6060f1SDimitry Andric Materialize(Tmp, wrap(R.release())); 135fe6060f1SDimitry Andric } 136fe6060f1SDimitry Andric 137fe6060f1SDimitry Andric private: 138fe6060f1SDimitry Andric void discard(const JITDylib &JD, const SymbolStringPtr &Name) override { 139fe6060f1SDimitry Andric Discard(Ctx, wrap(&JD), wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name))); 140fe6060f1SDimitry Andric } 141fe6060f1SDimitry Andric 142fe6060f1SDimitry Andric std::string Name; 143fe6060f1SDimitry Andric void *Ctx = nullptr; 144fe6060f1SDimitry Andric LLVMOrcMaterializationUnitMaterializeFunction Materialize = nullptr; 145fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDiscardFunction Discard = nullptr; 146fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDestroyFunction Destroy = nullptr; 147fe6060f1SDimitry Andric }; 148fe6060f1SDimitry Andric 149fe6060f1SDimitry Andric static JITSymbolFlags toJITSymbolFlags(LLVMJITSymbolFlags F) { 150fe6060f1SDimitry Andric 151fe6060f1SDimitry Andric JITSymbolFlags JSF; 152fe6060f1SDimitry Andric 153fe6060f1SDimitry Andric if (F.GenericFlags & LLVMJITSymbolGenericFlagsExported) 154fe6060f1SDimitry Andric JSF |= JITSymbolFlags::Exported; 155fe6060f1SDimitry Andric if (F.GenericFlags & LLVMJITSymbolGenericFlagsWeak) 156fe6060f1SDimitry Andric JSF |= JITSymbolFlags::Weak; 157fe6060f1SDimitry Andric if (F.GenericFlags & LLVMJITSymbolGenericFlagsCallable) 158fe6060f1SDimitry Andric JSF |= JITSymbolFlags::Callable; 159fe6060f1SDimitry Andric if (F.GenericFlags & LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly) 160fe6060f1SDimitry Andric JSF |= JITSymbolFlags::MaterializationSideEffectsOnly; 161fe6060f1SDimitry Andric 162fe6060f1SDimitry Andric JSF.getTargetFlags() = F.TargetFlags; 163fe6060f1SDimitry Andric 164fe6060f1SDimitry Andric return JSF; 165fe6060f1SDimitry Andric } 166fe6060f1SDimitry Andric 167fe6060f1SDimitry Andric static LLVMJITSymbolFlags fromJITSymbolFlags(JITSymbolFlags JSF) { 168fe6060f1SDimitry Andric LLVMJITSymbolFlags F = {0, 0}; 169fe6060f1SDimitry Andric if (JSF & JITSymbolFlags::Exported) 170fe6060f1SDimitry Andric F.GenericFlags |= LLVMJITSymbolGenericFlagsExported; 171fe6060f1SDimitry Andric if (JSF & JITSymbolFlags::Weak) 172fe6060f1SDimitry Andric F.GenericFlags |= LLVMJITSymbolGenericFlagsWeak; 173fe6060f1SDimitry Andric if (JSF & JITSymbolFlags::Callable) 174fe6060f1SDimitry Andric F.GenericFlags |= LLVMJITSymbolGenericFlagsCallable; 175fe6060f1SDimitry Andric if (JSF & JITSymbolFlags::MaterializationSideEffectsOnly) 176fe6060f1SDimitry Andric F.GenericFlags |= LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly; 177fe6060f1SDimitry Andric 178fe6060f1SDimitry Andric F.TargetFlags = JSF.getTargetFlags(); 179fe6060f1SDimitry Andric 180fe6060f1SDimitry Andric return F; 181fe6060f1SDimitry Andric } 182fe6060f1SDimitry Andric 183fe6060f1SDimitry Andric static SymbolMap toSymbolMap(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) { 184fe6060f1SDimitry Andric SymbolMap SM; 185fe6060f1SDimitry Andric for (size_t I = 0; I != NumPairs; ++I) { 186fe6060f1SDimitry Andric JITSymbolFlags Flags = toJITSymbolFlags(Syms[I].Sym.Flags); 187*06c3fb27SDimitry Andric SM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] = { 188*06c3fb27SDimitry Andric ExecutorAddr(Syms[I].Sym.Address), Flags}; 189fe6060f1SDimitry Andric } 190fe6060f1SDimitry Andric return SM; 191fe6060f1SDimitry Andric } 192fe6060f1SDimitry Andric 193fe6060f1SDimitry Andric static SymbolDependenceMap 194fe6060f1SDimitry Andric toSymbolDependenceMap(LLVMOrcCDependenceMapPairs Pairs, size_t NumPairs) { 195fe6060f1SDimitry Andric SymbolDependenceMap SDM; 196fe6060f1SDimitry Andric for (size_t I = 0; I != NumPairs; ++I) { 197fe6060f1SDimitry Andric JITDylib *JD = unwrap(Pairs[I].JD); 198fe6060f1SDimitry Andric SymbolNameSet Names; 199fe6060f1SDimitry Andric 200fe6060f1SDimitry Andric for (size_t J = 0; J != Pairs[I].Names.Length; ++J) { 201fe6060f1SDimitry Andric auto Sym = Pairs[I].Names.Symbols[J]; 202fe6060f1SDimitry Andric Names.insert(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Sym))); 203fe6060f1SDimitry Andric } 204fe6060f1SDimitry Andric SDM[JD] = Names; 205fe6060f1SDimitry Andric } 206fe6060f1SDimitry Andric return SDM; 207fe6060f1SDimitry Andric } 208fe6060f1SDimitry Andric 20981ad6265SDimitry Andric static LookupKind toLookupKind(LLVMOrcLookupKind K) { 21081ad6265SDimitry Andric switch (K) { 21181ad6265SDimitry Andric case LLVMOrcLookupKindStatic: 21281ad6265SDimitry Andric return LookupKind::Static; 21381ad6265SDimitry Andric case LLVMOrcLookupKindDLSym: 21481ad6265SDimitry Andric return LookupKind::DLSym; 21581ad6265SDimitry Andric } 21681ad6265SDimitry Andric llvm_unreachable("unrecognized LLVMOrcLookupKind value"); 21781ad6265SDimitry Andric } 21881ad6265SDimitry Andric 21981ad6265SDimitry Andric static LLVMOrcLookupKind fromLookupKind(LookupKind K) { 22081ad6265SDimitry Andric switch (K) { 22181ad6265SDimitry Andric case LookupKind::Static: 22281ad6265SDimitry Andric return LLVMOrcLookupKindStatic; 22381ad6265SDimitry Andric case LookupKind::DLSym: 22481ad6265SDimitry Andric return LLVMOrcLookupKindDLSym; 22581ad6265SDimitry Andric } 22681ad6265SDimitry Andric llvm_unreachable("unrecognized LookupKind value"); 22781ad6265SDimitry Andric } 22881ad6265SDimitry Andric 22981ad6265SDimitry Andric static JITDylibLookupFlags 23081ad6265SDimitry Andric toJITDylibLookupFlags(LLVMOrcJITDylibLookupFlags LF) { 23181ad6265SDimitry Andric switch (LF) { 23281ad6265SDimitry Andric case LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly: 23381ad6265SDimitry Andric return JITDylibLookupFlags::MatchExportedSymbolsOnly; 23481ad6265SDimitry Andric case LLVMOrcJITDylibLookupFlagsMatchAllSymbols: 23581ad6265SDimitry Andric return JITDylibLookupFlags::MatchAllSymbols; 23681ad6265SDimitry Andric } 23781ad6265SDimitry Andric llvm_unreachable("unrecognized LLVMOrcJITDylibLookupFlags value"); 23881ad6265SDimitry Andric } 23981ad6265SDimitry Andric 24081ad6265SDimitry Andric static LLVMOrcJITDylibLookupFlags 24181ad6265SDimitry Andric fromJITDylibLookupFlags(JITDylibLookupFlags LF) { 24281ad6265SDimitry Andric switch (LF) { 24381ad6265SDimitry Andric case JITDylibLookupFlags::MatchExportedSymbolsOnly: 24481ad6265SDimitry Andric return LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly; 24581ad6265SDimitry Andric case JITDylibLookupFlags::MatchAllSymbols: 24681ad6265SDimitry Andric return LLVMOrcJITDylibLookupFlagsMatchAllSymbols; 24781ad6265SDimitry Andric } 24881ad6265SDimitry Andric llvm_unreachable("unrecognized JITDylibLookupFlags value"); 24981ad6265SDimitry Andric } 25081ad6265SDimitry Andric 25181ad6265SDimitry Andric static SymbolLookupFlags toSymbolLookupFlags(LLVMOrcSymbolLookupFlags SLF) { 25281ad6265SDimitry Andric switch (SLF) { 25381ad6265SDimitry Andric case LLVMOrcSymbolLookupFlagsRequiredSymbol: 25481ad6265SDimitry Andric return SymbolLookupFlags::RequiredSymbol; 25581ad6265SDimitry Andric case LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol: 25681ad6265SDimitry Andric return SymbolLookupFlags::WeaklyReferencedSymbol; 25781ad6265SDimitry Andric } 25881ad6265SDimitry Andric llvm_unreachable("unrecognized LLVMOrcSymbolLookupFlags value"); 25981ad6265SDimitry Andric } 26081ad6265SDimitry Andric 26181ad6265SDimitry Andric static LLVMOrcSymbolLookupFlags fromSymbolLookupFlags(SymbolLookupFlags SLF) { 26281ad6265SDimitry Andric switch (SLF) { 26381ad6265SDimitry Andric case SymbolLookupFlags::RequiredSymbol: 26481ad6265SDimitry Andric return LLVMOrcSymbolLookupFlagsRequiredSymbol; 26581ad6265SDimitry Andric case SymbolLookupFlags::WeaklyReferencedSymbol: 26681ad6265SDimitry Andric return LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol; 26781ad6265SDimitry Andric } 26881ad6265SDimitry Andric llvm_unreachable("unrecognized SymbolLookupFlags value"); 26981ad6265SDimitry Andric } 27081ad6265SDimitry Andric 27181ad6265SDimitry Andric static LLVMJITEvaluatedSymbol 272*06c3fb27SDimitry Andric fromExecutorSymbolDef(const ExecutorSymbolDef &S) { 273*06c3fb27SDimitry Andric return {S.getAddress().getValue(), fromJITSymbolFlags(S.getFlags())}; 27481ad6265SDimitry Andric } 27581ad6265SDimitry Andric 276fe6060f1SDimitry Andric } // end anonymous namespace 277fe6060f1SDimitry Andric 27881ad6265SDimitry Andric namespace llvm { 27981ad6265SDimitry Andric namespace orc { 28081ad6265SDimitry Andric 28181ad6265SDimitry Andric class CAPIDefinitionGenerator final : public DefinitionGenerator { 28281ad6265SDimitry Andric public: 28381ad6265SDimitry Andric CAPIDefinitionGenerator( 28481ad6265SDimitry Andric LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose, void *Ctx, 28581ad6265SDimitry Andric LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate) 28681ad6265SDimitry Andric : Dispose(Dispose), Ctx(Ctx), TryToGenerate(TryToGenerate) {} 28781ad6265SDimitry Andric 28881ad6265SDimitry Andric ~CAPIDefinitionGenerator() { 28981ad6265SDimitry Andric if (Dispose) 29081ad6265SDimitry Andric Dispose(Ctx); 29181ad6265SDimitry Andric } 29281ad6265SDimitry Andric 29381ad6265SDimitry Andric Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD, 29481ad6265SDimitry Andric JITDylibLookupFlags JDLookupFlags, 29581ad6265SDimitry Andric const SymbolLookupSet &LookupSet) override { 29681ad6265SDimitry Andric 29781ad6265SDimitry Andric // Take the lookup state. 29881ad6265SDimitry Andric LLVMOrcLookupStateRef LSR = ::wrap(OrcV2CAPIHelper::extractLookupState(LS)); 29981ad6265SDimitry Andric 30081ad6265SDimitry Andric // Translate the lookup kind. 30181ad6265SDimitry Andric LLVMOrcLookupKind CLookupKind = fromLookupKind(K); 30281ad6265SDimitry Andric 30381ad6265SDimitry Andric // Translate the JITDylibLookupFlags. 30481ad6265SDimitry Andric LLVMOrcJITDylibLookupFlags CJDLookupFlags = 30581ad6265SDimitry Andric fromJITDylibLookupFlags(JDLookupFlags); 30681ad6265SDimitry Andric 30781ad6265SDimitry Andric // Translate the lookup set. 30881ad6265SDimitry Andric std::vector<LLVMOrcCLookupSetElement> CLookupSet; 30981ad6265SDimitry Andric CLookupSet.reserve(LookupSet.size()); 31081ad6265SDimitry Andric for (auto &KV : LookupSet) { 31181ad6265SDimitry Andric LLVMOrcSymbolStringPoolEntryRef Name = 31281ad6265SDimitry Andric ::wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV.first)); 31381ad6265SDimitry Andric LLVMOrcSymbolLookupFlags SLF = fromSymbolLookupFlags(KV.second); 31481ad6265SDimitry Andric CLookupSet.push_back({Name, SLF}); 31581ad6265SDimitry Andric } 31681ad6265SDimitry Andric 31781ad6265SDimitry Andric // Run the C TryToGenerate function. 31881ad6265SDimitry Andric auto Err = unwrap(TryToGenerate(::wrap(this), Ctx, &LSR, CLookupKind, 31981ad6265SDimitry Andric ::wrap(&JD), CJDLookupFlags, 32081ad6265SDimitry Andric CLookupSet.data(), CLookupSet.size())); 32181ad6265SDimitry Andric 32281ad6265SDimitry Andric // Restore the lookup state. 32381ad6265SDimitry Andric OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(LSR)); 32481ad6265SDimitry Andric 32581ad6265SDimitry Andric return Err; 32681ad6265SDimitry Andric } 32781ad6265SDimitry Andric 32881ad6265SDimitry Andric private: 32981ad6265SDimitry Andric LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose; 33081ad6265SDimitry Andric void *Ctx; 33181ad6265SDimitry Andric LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate; 33281ad6265SDimitry Andric }; 33381ad6265SDimitry Andric 33481ad6265SDimitry Andric } // end namespace orc 33581ad6265SDimitry Andric } // end namespace llvm 33681ad6265SDimitry Andric 337e8d8bef9SDimitry Andric void LLVMOrcExecutionSessionSetErrorReporter( 338e8d8bef9SDimitry Andric LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError, 339e8d8bef9SDimitry Andric void *Ctx) { 340e8d8bef9SDimitry Andric unwrap(ES)->setErrorReporter( 341e8d8bef9SDimitry Andric [=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); }); 342e8d8bef9SDimitry Andric } 343e8d8bef9SDimitry Andric 344e8d8bef9SDimitry Andric LLVMOrcSymbolStringPoolRef 345e8d8bef9SDimitry Andric LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) { 346fe6060f1SDimitry Andric return wrap( 347fe6060f1SDimitry Andric unwrap(ES)->getExecutorProcessControl().getSymbolStringPool().get()); 348e8d8bef9SDimitry Andric } 349e8d8bef9SDimitry Andric 350e8d8bef9SDimitry Andric void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) { 351e8d8bef9SDimitry Andric unwrap(SSP)->clearDeadEntries(); 352e8d8bef9SDimitry Andric } 353e8d8bef9SDimitry Andric 3545ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef 3555ffd83dbSDimitry Andric LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) { 3565ffd83dbSDimitry Andric return wrap( 357fe6060f1SDimitry Andric OrcV2CAPIHelper::moveFromSymbolStringPtr(unwrap(ES)->intern(Name))); 3585ffd83dbSDimitry Andric } 3595ffd83dbSDimitry Andric 36081ad6265SDimitry Andric void LLVMOrcExecutionSessionLookup( 36181ad6265SDimitry Andric LLVMOrcExecutionSessionRef ES, LLVMOrcLookupKind K, 36281ad6265SDimitry Andric LLVMOrcCJITDylibSearchOrder SearchOrder, size_t SearchOrderSize, 36381ad6265SDimitry Andric LLVMOrcCLookupSet Symbols, size_t SymbolsSize, 36481ad6265SDimitry Andric LLVMOrcExecutionSessionLookupHandleResultFunction HandleResult, void *Ctx) { 36581ad6265SDimitry Andric assert(ES && "ES cannot be null"); 36681ad6265SDimitry Andric assert(SearchOrder && "SearchOrder cannot be null"); 36781ad6265SDimitry Andric assert(Symbols && "Symbols cannot be null"); 36881ad6265SDimitry Andric assert(HandleResult && "HandleResult cannot be null"); 36981ad6265SDimitry Andric 37081ad6265SDimitry Andric JITDylibSearchOrder SO; 37181ad6265SDimitry Andric for (size_t I = 0; I != SearchOrderSize; ++I) 37281ad6265SDimitry Andric SO.push_back({unwrap(SearchOrder[I].JD), 37381ad6265SDimitry Andric toJITDylibLookupFlags(SearchOrder[I].JDLookupFlags)}); 37481ad6265SDimitry Andric 37581ad6265SDimitry Andric SymbolLookupSet SLS; 37681ad6265SDimitry Andric for (size_t I = 0; I != SymbolsSize; ++I) 37781ad6265SDimitry Andric SLS.add(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Symbols[I].Name)), 37881ad6265SDimitry Andric toSymbolLookupFlags(Symbols[I].LookupFlags)); 37981ad6265SDimitry Andric 38081ad6265SDimitry Andric unwrap(ES)->lookup( 38181ad6265SDimitry Andric toLookupKind(K), SO, std::move(SLS), SymbolState::Ready, 38281ad6265SDimitry Andric [HandleResult, Ctx](Expected<SymbolMap> Result) { 38381ad6265SDimitry Andric if (Result) { 38481ad6265SDimitry Andric SmallVector<LLVMOrcCSymbolMapPair> CResult; 38581ad6265SDimitry Andric for (auto &KV : *Result) 38681ad6265SDimitry Andric CResult.push_back(LLVMOrcCSymbolMapPair{ 38781ad6265SDimitry Andric wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV.first)), 388*06c3fb27SDimitry Andric fromExecutorSymbolDef(KV.second)}); 38981ad6265SDimitry Andric HandleResult(LLVMErrorSuccess, CResult.data(), CResult.size(), Ctx); 39081ad6265SDimitry Andric } else 39181ad6265SDimitry Andric HandleResult(wrap(Result.takeError()), nullptr, 0, Ctx); 39281ad6265SDimitry Andric }, 39381ad6265SDimitry Andric NoDependenciesToRegister); 39481ad6265SDimitry Andric } 39581ad6265SDimitry Andric 396e8d8bef9SDimitry Andric void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) { 397e8d8bef9SDimitry Andric OrcV2CAPIHelper::retainPoolEntry(unwrap(S)); 398e8d8bef9SDimitry Andric } 399e8d8bef9SDimitry Andric 4005ffd83dbSDimitry Andric void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) { 4015ffd83dbSDimitry Andric OrcV2CAPIHelper::releasePoolEntry(unwrap(S)); 4025ffd83dbSDimitry Andric } 4035ffd83dbSDimitry Andric 404e8d8bef9SDimitry Andric const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S) { 405e8d8bef9SDimitry Andric return unwrap(S)->getKey().data(); 406e8d8bef9SDimitry Andric } 407e8d8bef9SDimitry Andric 408e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef 409e8d8bef9SDimitry Andric LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD) { 410e8d8bef9SDimitry Andric auto RT = unwrap(JD)->createResourceTracker(); 411e8d8bef9SDimitry Andric // Retain the pointer for the C API client. 412e8d8bef9SDimitry Andric RT->Retain(); 413e8d8bef9SDimitry Andric return wrap(RT.get()); 414e8d8bef9SDimitry Andric } 415e8d8bef9SDimitry Andric 416e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef 417e8d8bef9SDimitry Andric LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD) { 418e8d8bef9SDimitry Andric auto RT = unwrap(JD)->getDefaultResourceTracker(); 419e8d8bef9SDimitry Andric // Retain the pointer for the C API client. 420e8d8bef9SDimitry Andric return wrap(RT.get()); 421e8d8bef9SDimitry Andric } 422e8d8bef9SDimitry Andric 423e8d8bef9SDimitry Andric void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) { 424e8d8bef9SDimitry Andric ResourceTrackerSP TmpRT(unwrap(RT)); 425e8d8bef9SDimitry Andric TmpRT->Release(); 426e8d8bef9SDimitry Andric } 427e8d8bef9SDimitry Andric 428e8d8bef9SDimitry Andric void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT, 429e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef DstRT) { 430e8d8bef9SDimitry Andric ResourceTrackerSP TmpRT(unwrap(SrcRT)); 431e8d8bef9SDimitry Andric TmpRT->transferTo(*unwrap(DstRT)); 432e8d8bef9SDimitry Andric } 433e8d8bef9SDimitry Andric 434e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) { 435e8d8bef9SDimitry Andric ResourceTrackerSP TmpRT(unwrap(RT)); 436e8d8bef9SDimitry Andric return wrap(TmpRT->remove()); 437e8d8bef9SDimitry Andric } 438e8d8bef9SDimitry Andric 439e8d8bef9SDimitry Andric void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) { 440e8d8bef9SDimitry Andric std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG)); 441e8d8bef9SDimitry Andric } 442e8d8bef9SDimitry Andric 443e8d8bef9SDimitry Andric void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) { 444e8d8bef9SDimitry Andric std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 445e8d8bef9SDimitry Andric } 446e8d8bef9SDimitry Andric 447fe6060f1SDimitry Andric LLVMOrcMaterializationUnitRef LLVMOrcCreateCustomMaterializationUnit( 448fe6060f1SDimitry Andric const char *Name, void *Ctx, LLVMOrcCSymbolFlagsMapPairs Syms, 449fe6060f1SDimitry Andric size_t NumSyms, LLVMOrcSymbolStringPoolEntryRef InitSym, 450fe6060f1SDimitry Andric LLVMOrcMaterializationUnitMaterializeFunction Materialize, 451fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDiscardFunction Discard, 452fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDestroyFunction Destroy) { 453fe6060f1SDimitry Andric SymbolFlagsMap SFM; 454fe6060f1SDimitry Andric for (size_t I = 0; I != NumSyms; ++I) 455fe6060f1SDimitry Andric SFM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] = 456fe6060f1SDimitry Andric toJITSymbolFlags(Syms[I].Flags); 457e8d8bef9SDimitry Andric 458fe6060f1SDimitry Andric auto IS = OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(InitSym)); 459e8d8bef9SDimitry Andric 460fe6060f1SDimitry Andric return wrap(new OrcCAPIMaterializationUnit( 461fe6060f1SDimitry Andric Name, std::move(SFM), std::move(IS), Ctx, Materialize, Discard, Destroy)); 462e8d8bef9SDimitry Andric } 463e8d8bef9SDimitry Andric 464fe6060f1SDimitry Andric LLVMOrcMaterializationUnitRef 465fe6060f1SDimitry Andric LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) { 466fe6060f1SDimitry Andric SymbolMap SM = toSymbolMap(Syms, NumPairs); 467e8d8bef9SDimitry Andric return wrap(absoluteSymbols(std::move(SM)).release()); 468e8d8bef9SDimitry Andric } 469e8d8bef9SDimitry Andric 470fe6060f1SDimitry Andric LLVMOrcMaterializationUnitRef LLVMOrcLazyReexports( 471fe6060f1SDimitry Andric LLVMOrcLazyCallThroughManagerRef LCTM, LLVMOrcIndirectStubsManagerRef ISM, 472fe6060f1SDimitry Andric LLVMOrcJITDylibRef SourceJD, LLVMOrcCSymbolAliasMapPairs CallableAliases, 473fe6060f1SDimitry Andric size_t NumPairs) { 474fe6060f1SDimitry Andric 475fe6060f1SDimitry Andric SymbolAliasMap SAM; 476fe6060f1SDimitry Andric for (size_t I = 0; I != NumPairs; ++I) { 477fe6060f1SDimitry Andric auto pair = CallableAliases[I]; 478fe6060f1SDimitry Andric JITSymbolFlags Flags = toJITSymbolFlags(pair.Entry.Flags); 479fe6060f1SDimitry Andric SymbolStringPtr Name = 480fe6060f1SDimitry Andric OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(pair.Entry.Name)); 481fe6060f1SDimitry Andric SAM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(pair.Name))] = 482fe6060f1SDimitry Andric SymbolAliasMapEntry(Name, Flags); 483fe6060f1SDimitry Andric } 484fe6060f1SDimitry Andric 485fe6060f1SDimitry Andric return wrap(lazyReexports(*unwrap(LCTM), *unwrap(ISM), *unwrap(SourceJD), 486fe6060f1SDimitry Andric std::move(SAM)) 487fe6060f1SDimitry Andric .release()); 488fe6060f1SDimitry Andric } 489fe6060f1SDimitry Andric 490fe6060f1SDimitry Andric void LLVMOrcDisposeMaterializationResponsibility( 491fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 492fe6060f1SDimitry Andric std::unique_ptr<MaterializationResponsibility> TmpMR(unwrap(MR)); 493fe6060f1SDimitry Andric } 494fe6060f1SDimitry Andric 495fe6060f1SDimitry Andric LLVMOrcJITDylibRef LLVMOrcMaterializationResponsibilityGetTargetDylib( 496fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 497fe6060f1SDimitry Andric return wrap(&unwrap(MR)->getTargetJITDylib()); 498fe6060f1SDimitry Andric } 499fe6060f1SDimitry Andric 500fe6060f1SDimitry Andric LLVMOrcExecutionSessionRef 501fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityGetExecutionSession( 502fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 503fe6060f1SDimitry Andric return wrap(&unwrap(MR)->getExecutionSession()); 504fe6060f1SDimitry Andric } 505fe6060f1SDimitry Andric 506fe6060f1SDimitry Andric LLVMOrcCSymbolFlagsMapPairs LLVMOrcMaterializationResponsibilityGetSymbols( 507fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, size_t *NumPairs) { 508fe6060f1SDimitry Andric 509fe6060f1SDimitry Andric auto Symbols = unwrap(MR)->getSymbols(); 510fe6060f1SDimitry Andric LLVMOrcCSymbolFlagsMapPairs Result = static_cast<LLVMOrcCSymbolFlagsMapPairs>( 511fe6060f1SDimitry Andric safe_malloc(Symbols.size() * sizeof(LLVMOrcCSymbolFlagsMapPair))); 512fe6060f1SDimitry Andric size_t I = 0; 513fe6060f1SDimitry Andric for (auto const &pair : Symbols) { 514fe6060f1SDimitry Andric auto Name = wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(pair.first)); 515fe6060f1SDimitry Andric auto Flags = pair.second; 516fe6060f1SDimitry Andric Result[I] = {Name, fromJITSymbolFlags(Flags)}; 517fe6060f1SDimitry Andric I++; 518fe6060f1SDimitry Andric } 519fe6060f1SDimitry Andric *NumPairs = Symbols.size(); 520fe6060f1SDimitry Andric return Result; 521fe6060f1SDimitry Andric } 522fe6060f1SDimitry Andric 523fe6060f1SDimitry Andric void LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs) { 524fe6060f1SDimitry Andric free(Pairs); 525fe6060f1SDimitry Andric } 526fe6060f1SDimitry Andric 527fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef 528fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityGetInitializerSymbol( 529fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 530fe6060f1SDimitry Andric auto Sym = unwrap(MR)->getInitializerSymbol(); 531fe6060f1SDimitry Andric return wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Sym)); 532fe6060f1SDimitry Andric } 533fe6060f1SDimitry Andric 534fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef * 535fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityGetRequestedSymbols( 536fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, size_t *NumSymbols) { 537fe6060f1SDimitry Andric 538fe6060f1SDimitry Andric auto Symbols = unwrap(MR)->getRequestedSymbols(); 539fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef *Result = 540fe6060f1SDimitry Andric static_cast<LLVMOrcSymbolStringPoolEntryRef *>(safe_malloc( 541fe6060f1SDimitry Andric Symbols.size() * sizeof(LLVMOrcSymbolStringPoolEntryRef))); 542fe6060f1SDimitry Andric size_t I = 0; 543fe6060f1SDimitry Andric for (auto &Name : Symbols) { 544fe6060f1SDimitry Andric Result[I] = wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)); 545fe6060f1SDimitry Andric I++; 546fe6060f1SDimitry Andric } 547fe6060f1SDimitry Andric *NumSymbols = Symbols.size(); 548fe6060f1SDimitry Andric return Result; 549fe6060f1SDimitry Andric } 550fe6060f1SDimitry Andric 551fe6060f1SDimitry Andric void LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef *Symbols) { 552fe6060f1SDimitry Andric free(Symbols); 553fe6060f1SDimitry Andric } 554fe6060f1SDimitry Andric 555fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyResolved( 556fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, LLVMOrcCSymbolMapPairs Symbols, 557fe6060f1SDimitry Andric size_t NumPairs) { 558fe6060f1SDimitry Andric SymbolMap SM = toSymbolMap(Symbols, NumPairs); 559fe6060f1SDimitry Andric return wrap(unwrap(MR)->notifyResolved(std::move(SM))); 560fe6060f1SDimitry Andric } 561fe6060f1SDimitry Andric 562fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyEmitted( 563fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 564fe6060f1SDimitry Andric return wrap(unwrap(MR)->notifyEmitted()); 565fe6060f1SDimitry Andric } 566fe6060f1SDimitry Andric 567fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityDefineMaterializing( 568fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 569fe6060f1SDimitry Andric LLVMOrcCSymbolFlagsMapPairs Syms, size_t NumSyms) { 570fe6060f1SDimitry Andric SymbolFlagsMap SFM; 571fe6060f1SDimitry Andric for (size_t I = 0; I != NumSyms; ++I) 572fe6060f1SDimitry Andric SFM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] = 573fe6060f1SDimitry Andric toJITSymbolFlags(Syms[I].Flags); 574fe6060f1SDimitry Andric 575fe6060f1SDimitry Andric return wrap(unwrap(MR)->defineMaterializing(std::move(SFM))); 576fe6060f1SDimitry Andric } 577fe6060f1SDimitry Andric 578fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityReplace( 579fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 580fe6060f1SDimitry Andric LLVMOrcMaterializationUnitRef MU) { 581fe6060f1SDimitry Andric std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 582fe6060f1SDimitry Andric return wrap(unwrap(MR)->replace(std::move(TmpMU))); 583fe6060f1SDimitry Andric } 584fe6060f1SDimitry Andric 585fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityDelegate( 586fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 587fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef *Symbols, size_t NumSymbols, 588fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef *Result) { 589fe6060f1SDimitry Andric SymbolNameSet Syms; 590fe6060f1SDimitry Andric for (size_t I = 0; I != NumSymbols; I++) { 591fe6060f1SDimitry Andric Syms.insert(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Symbols[I]))); 592fe6060f1SDimitry Andric } 593fe6060f1SDimitry Andric auto OtherMR = unwrap(MR)->delegate(Syms); 594fe6060f1SDimitry Andric 595fe6060f1SDimitry Andric if (!OtherMR) { 596fe6060f1SDimitry Andric return wrap(OtherMR.takeError()); 597fe6060f1SDimitry Andric } 598fe6060f1SDimitry Andric *Result = wrap(OtherMR->release()); 599fe6060f1SDimitry Andric return LLVMErrorSuccess; 600fe6060f1SDimitry Andric } 601fe6060f1SDimitry Andric 602fe6060f1SDimitry Andric void LLVMOrcMaterializationResponsibilityAddDependencies( 603fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 604fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef Name, 605fe6060f1SDimitry Andric LLVMOrcCDependenceMapPairs Dependencies, size_t NumPairs) { 606fe6060f1SDimitry Andric 607fe6060f1SDimitry Andric SymbolDependenceMap SDM = toSymbolDependenceMap(Dependencies, NumPairs); 608fe6060f1SDimitry Andric auto Sym = OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Name)); 609fe6060f1SDimitry Andric unwrap(MR)->addDependencies(Sym, SDM); 610fe6060f1SDimitry Andric } 611fe6060f1SDimitry Andric 612fe6060f1SDimitry Andric void LLVMOrcMaterializationResponsibilityAddDependenciesForAll( 613fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 614fe6060f1SDimitry Andric LLVMOrcCDependenceMapPairs Dependencies, size_t NumPairs) { 615fe6060f1SDimitry Andric 616fe6060f1SDimitry Andric SymbolDependenceMap SDM = toSymbolDependenceMap(Dependencies, NumPairs); 617fe6060f1SDimitry Andric unwrap(MR)->addDependenciesForAll(SDM); 618fe6060f1SDimitry Andric } 619fe6060f1SDimitry Andric 620fe6060f1SDimitry Andric void LLVMOrcMaterializationResponsibilityFailMaterialization( 621fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 622fe6060f1SDimitry Andric unwrap(MR)->failMaterialization(); 623fe6060f1SDimitry Andric } 624fe6060f1SDimitry Andric 625fe6060f1SDimitry Andric void LLVMOrcIRTransformLayerEmit(LLVMOrcIRTransformLayerRef IRLayer, 626fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 627fe6060f1SDimitry Andric LLVMOrcThreadSafeModuleRef TSM) { 628fe6060f1SDimitry Andric std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 629fe6060f1SDimitry Andric unwrap(IRLayer)->emit( 630fe6060f1SDimitry Andric std::unique_ptr<MaterializationResponsibility>(unwrap(MR)), 631fe6060f1SDimitry Andric std::move(*TmpTSM)); 632fe6060f1SDimitry Andric } 633fe6060f1SDimitry Andric 634e8d8bef9SDimitry Andric LLVMOrcJITDylibRef 635e8d8bef9SDimitry Andric LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES, 636e8d8bef9SDimitry Andric const char *Name) { 637e8d8bef9SDimitry Andric return wrap(&unwrap(ES)->createBareJITDylib(Name)); 638e8d8bef9SDimitry Andric } 639e8d8bef9SDimitry Andric 640e8d8bef9SDimitry Andric LLVMErrorRef 641e8d8bef9SDimitry Andric LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES, 642e8d8bef9SDimitry Andric LLVMOrcJITDylibRef *Result, 643e8d8bef9SDimitry Andric const char *Name) { 644e8d8bef9SDimitry Andric auto JD = unwrap(ES)->createJITDylib(Name); 645e8d8bef9SDimitry Andric if (!JD) 646e8d8bef9SDimitry Andric return wrap(JD.takeError()); 647e8d8bef9SDimitry Andric *Result = wrap(&*JD); 648e8d8bef9SDimitry Andric return LLVMErrorSuccess; 649e8d8bef9SDimitry Andric } 650e8d8bef9SDimitry Andric 651e8d8bef9SDimitry Andric LLVMOrcJITDylibRef 652e8d8bef9SDimitry Andric LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES, 653e8d8bef9SDimitry Andric const char *Name) { 654e8d8bef9SDimitry Andric return wrap(unwrap(ES)->getJITDylibByName(Name)); 655e8d8bef9SDimitry Andric } 656e8d8bef9SDimitry Andric 657e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD, 658e8d8bef9SDimitry Andric LLVMOrcMaterializationUnitRef MU) { 659e8d8bef9SDimitry Andric std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 660e8d8bef9SDimitry Andric 661e8d8bef9SDimitry Andric if (auto Err = unwrap(JD)->define(TmpMU)) { 662e8d8bef9SDimitry Andric TmpMU.release(); 663e8d8bef9SDimitry Andric return wrap(std::move(Err)); 664e8d8bef9SDimitry Andric } 665e8d8bef9SDimitry Andric return LLVMErrorSuccess; 666e8d8bef9SDimitry Andric } 667e8d8bef9SDimitry Andric 668e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) { 669e8d8bef9SDimitry Andric return wrap(unwrap(JD)->clear()); 6705ffd83dbSDimitry Andric } 6715ffd83dbSDimitry Andric 6725ffd83dbSDimitry Andric void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD, 673e8d8bef9SDimitry Andric LLVMOrcDefinitionGeneratorRef DG) { 674e8d8bef9SDimitry Andric unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG))); 675e8d8bef9SDimitry Andric } 676e8d8bef9SDimitry Andric 677e8d8bef9SDimitry Andric LLVMOrcDefinitionGeneratorRef LLVMOrcCreateCustomCAPIDefinitionGenerator( 67881ad6265SDimitry Andric LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F, void *Ctx, 67981ad6265SDimitry Andric LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose) { 68081ad6265SDimitry Andric auto DG = std::make_unique<CAPIDefinitionGenerator>(Dispose, Ctx, F); 681e8d8bef9SDimitry Andric return wrap(DG.release()); 6825ffd83dbSDimitry Andric } 6835ffd83dbSDimitry Andric 68481ad6265SDimitry Andric void LLVMOrcLookupStateContinueLookup(LLVMOrcLookupStateRef S, 68581ad6265SDimitry Andric LLVMErrorRef Err) { 68681ad6265SDimitry Andric LookupState LS; 68781ad6265SDimitry Andric OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(S)); 68881ad6265SDimitry Andric LS.continueLookup(unwrap(Err)); 68981ad6265SDimitry Andric } 69081ad6265SDimitry Andric 6915ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess( 692e8d8bef9SDimitry Andric LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix, 6935ffd83dbSDimitry Andric LLVMOrcSymbolPredicate Filter, void *FilterCtx) { 6945ffd83dbSDimitry Andric assert(Result && "Result can not be null"); 6955ffd83dbSDimitry Andric assert((Filter || !FilterCtx) && 6965ffd83dbSDimitry Andric "if Filter is null then FilterCtx must also be null"); 6975ffd83dbSDimitry Andric 6985ffd83dbSDimitry Andric DynamicLibrarySearchGenerator::SymbolPredicate Pred; 6995ffd83dbSDimitry Andric if (Filter) 7005ffd83dbSDimitry Andric Pred = [=](const SymbolStringPtr &Name) -> bool { 701e8d8bef9SDimitry Andric return Filter(FilterCtx, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name))); 7025ffd83dbSDimitry Andric }; 7035ffd83dbSDimitry Andric 7045ffd83dbSDimitry Andric auto ProcessSymsGenerator = 7055ffd83dbSDimitry Andric DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred); 7065ffd83dbSDimitry Andric 7075ffd83dbSDimitry Andric if (!ProcessSymsGenerator) { 70804eeddc0SDimitry Andric *Result = nullptr; 7095ffd83dbSDimitry Andric return wrap(ProcessSymsGenerator.takeError()); 7105ffd83dbSDimitry Andric } 7115ffd83dbSDimitry Andric 7125ffd83dbSDimitry Andric *Result = wrap(ProcessSymsGenerator->release()); 7135ffd83dbSDimitry Andric return LLVMErrorSuccess; 7145ffd83dbSDimitry Andric } 7155ffd83dbSDimitry Andric 716349cc55cSDimitry Andric LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForPath( 717349cc55cSDimitry Andric LLVMOrcDefinitionGeneratorRef *Result, const char *FileName, 718349cc55cSDimitry Andric char GlobalPrefix, LLVMOrcSymbolPredicate Filter, void *FilterCtx) { 719349cc55cSDimitry Andric assert(Result && "Result can not be null"); 720349cc55cSDimitry Andric assert(FileName && "FileName can not be null"); 721349cc55cSDimitry Andric assert((Filter || !FilterCtx) && 722349cc55cSDimitry Andric "if Filter is null then FilterCtx must also be null"); 723349cc55cSDimitry Andric 724349cc55cSDimitry Andric DynamicLibrarySearchGenerator::SymbolPredicate Pred; 725349cc55cSDimitry Andric if (Filter) 726349cc55cSDimitry Andric Pred = [=](const SymbolStringPtr &Name) -> bool { 727349cc55cSDimitry Andric return Filter(FilterCtx, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name))); 728349cc55cSDimitry Andric }; 729349cc55cSDimitry Andric 730349cc55cSDimitry Andric auto LibrarySymsGenerator = 731349cc55cSDimitry Andric DynamicLibrarySearchGenerator::Load(FileName, GlobalPrefix, Pred); 732349cc55cSDimitry Andric 733349cc55cSDimitry Andric if (!LibrarySymsGenerator) { 73404eeddc0SDimitry Andric *Result = nullptr; 735349cc55cSDimitry Andric return wrap(LibrarySymsGenerator.takeError()); 736349cc55cSDimitry Andric } 737349cc55cSDimitry Andric 738349cc55cSDimitry Andric *Result = wrap(LibrarySymsGenerator->release()); 739349cc55cSDimitry Andric return LLVMErrorSuccess; 740349cc55cSDimitry Andric } 741349cc55cSDimitry Andric 742349cc55cSDimitry Andric LLVMErrorRef LLVMOrcCreateStaticLibrarySearchGeneratorForPath( 743349cc55cSDimitry Andric LLVMOrcDefinitionGeneratorRef *Result, LLVMOrcObjectLayerRef ObjLayer, 744*06c3fb27SDimitry Andric const char *FileName) { 745349cc55cSDimitry Andric assert(Result && "Result can not be null"); 746349cc55cSDimitry Andric assert(FileName && "Filename can not be null"); 747349cc55cSDimitry Andric assert(ObjLayer && "ObjectLayer can not be null"); 748349cc55cSDimitry Andric 749349cc55cSDimitry Andric auto LibrarySymsGenerator = 750349cc55cSDimitry Andric StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer), FileName); 751349cc55cSDimitry Andric if (!LibrarySymsGenerator) { 75204eeddc0SDimitry Andric *Result = nullptr; 753349cc55cSDimitry Andric return wrap(LibrarySymsGenerator.takeError()); 754349cc55cSDimitry Andric } 755349cc55cSDimitry Andric *Result = wrap(LibrarySymsGenerator->release()); 756349cc55cSDimitry Andric return LLVMErrorSuccess; 757349cc55cSDimitry Andric } 758349cc55cSDimitry Andric 7595ffd83dbSDimitry Andric LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) { 7605ffd83dbSDimitry Andric return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>())); 7615ffd83dbSDimitry Andric } 7625ffd83dbSDimitry Andric 7635ffd83dbSDimitry Andric LLVMContextRef 7645ffd83dbSDimitry Andric LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) { 7655ffd83dbSDimitry Andric return wrap(unwrap(TSCtx)->getContext()); 7665ffd83dbSDimitry Andric } 7675ffd83dbSDimitry Andric 7685ffd83dbSDimitry Andric void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) { 7695ffd83dbSDimitry Andric delete unwrap(TSCtx); 7705ffd83dbSDimitry Andric } 7715ffd83dbSDimitry Andric 772fe6060f1SDimitry Andric LLVMErrorRef 773fe6060f1SDimitry Andric LLVMOrcThreadSafeModuleWithModuleDo(LLVMOrcThreadSafeModuleRef TSM, 774fe6060f1SDimitry Andric LLVMOrcGenericIRModuleOperationFunction F, 775fe6060f1SDimitry Andric void *Ctx) { 776fe6060f1SDimitry Andric return wrap(unwrap(TSM)->withModuleDo( 777fe6060f1SDimitry Andric [&](Module &M) { return unwrap(F(Ctx, wrap(&M))); })); 778fe6060f1SDimitry Andric } 779fe6060f1SDimitry Andric 7805ffd83dbSDimitry Andric LLVMOrcThreadSafeModuleRef 7815ffd83dbSDimitry Andric LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M, 7825ffd83dbSDimitry Andric LLVMOrcThreadSafeContextRef TSCtx) { 7835ffd83dbSDimitry Andric return wrap( 7845ffd83dbSDimitry Andric new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx))); 7855ffd83dbSDimitry Andric } 7865ffd83dbSDimitry Andric 7875ffd83dbSDimitry Andric void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) { 7885ffd83dbSDimitry Andric delete unwrap(TSM); 7895ffd83dbSDimitry Andric } 7905ffd83dbSDimitry Andric 7915ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost( 7925ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef *Result) { 7935ffd83dbSDimitry Andric assert(Result && "Result can not be null"); 7945ffd83dbSDimitry Andric 7955ffd83dbSDimitry Andric auto JTMB = JITTargetMachineBuilder::detectHost(); 7965ffd83dbSDimitry Andric if (!JTMB) { 79704eeddc0SDimitry Andric Result = nullptr; 7985ffd83dbSDimitry Andric return wrap(JTMB.takeError()); 7995ffd83dbSDimitry Andric } 8005ffd83dbSDimitry Andric 8015ffd83dbSDimitry Andric *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB))); 8025ffd83dbSDimitry Andric return LLVMErrorSuccess; 8035ffd83dbSDimitry Andric } 8045ffd83dbSDimitry Andric 8055ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef 806e8d8bef9SDimitry Andric LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM) { 8075ffd83dbSDimitry Andric auto *TemplateTM = unwrap(TM); 8085ffd83dbSDimitry Andric 8095ffd83dbSDimitry Andric auto JTMB = 8105ffd83dbSDimitry Andric std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple()); 8115ffd83dbSDimitry Andric 8125ffd83dbSDimitry Andric (*JTMB) 8135ffd83dbSDimitry Andric .setCPU(TemplateTM->getTargetCPU().str()) 8145ffd83dbSDimitry Andric .setRelocationModel(TemplateTM->getRelocationModel()) 8155ffd83dbSDimitry Andric .setCodeModel(TemplateTM->getCodeModel()) 8165ffd83dbSDimitry Andric .setCodeGenOptLevel(TemplateTM->getOptLevel()) 8175ffd83dbSDimitry Andric .setFeatures(TemplateTM->getTargetFeatureString()) 8185ffd83dbSDimitry Andric .setOptions(TemplateTM->Options); 8195ffd83dbSDimitry Andric 8205ffd83dbSDimitry Andric LLVMDisposeTargetMachine(TM); 8215ffd83dbSDimitry Andric 8225ffd83dbSDimitry Andric return wrap(JTMB.release()); 8235ffd83dbSDimitry Andric } 8245ffd83dbSDimitry Andric 8255ffd83dbSDimitry Andric void LLVMOrcDisposeJITTargetMachineBuilder( 8265ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef JTMB) { 8275ffd83dbSDimitry Andric delete unwrap(JTMB); 8285ffd83dbSDimitry Andric } 8295ffd83dbSDimitry Andric 830fe6060f1SDimitry Andric char *LLVMOrcJITTargetMachineBuilderGetTargetTriple( 831fe6060f1SDimitry Andric LLVMOrcJITTargetMachineBuilderRef JTMB) { 832fe6060f1SDimitry Andric auto Tmp = unwrap(JTMB)->getTargetTriple().str(); 833fe6060f1SDimitry Andric char *TargetTriple = (char *)malloc(Tmp.size() + 1); 834fe6060f1SDimitry Andric strcpy(TargetTriple, Tmp.c_str()); 835fe6060f1SDimitry Andric return TargetTriple; 836fe6060f1SDimitry Andric } 837fe6060f1SDimitry Andric 838fe6060f1SDimitry Andric void LLVMOrcJITTargetMachineBuilderSetTargetTriple( 839fe6060f1SDimitry Andric LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple) { 840fe6060f1SDimitry Andric unwrap(JTMB)->getTargetTriple() = Triple(TargetTriple); 841fe6060f1SDimitry Andric } 842fe6060f1SDimitry Andric 843fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcObjectLayerAddObjectFile(LLVMOrcObjectLayerRef ObjLayer, 844fe6060f1SDimitry Andric LLVMOrcJITDylibRef JD, 845fe6060f1SDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 846fe6060f1SDimitry Andric return wrap(unwrap(ObjLayer)->add( 847fe6060f1SDimitry Andric *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 848fe6060f1SDimitry Andric } 849fe6060f1SDimitry Andric 850*06c3fb27SDimitry Andric LLVMErrorRef LLVMOrcObjectLayerAddObjectFileWithRT(LLVMOrcObjectLayerRef ObjLayer, 851fe6060f1SDimitry Andric LLVMOrcResourceTrackerRef RT, 852fe6060f1SDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 853fe6060f1SDimitry Andric return wrap( 854fe6060f1SDimitry Andric unwrap(ObjLayer)->add(ResourceTrackerSP(unwrap(RT)), 855fe6060f1SDimitry Andric std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 856fe6060f1SDimitry Andric } 857fe6060f1SDimitry Andric 858fe6060f1SDimitry Andric void LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer, 859fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef R, 860fe6060f1SDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 861fe6060f1SDimitry Andric unwrap(ObjLayer)->emit( 862fe6060f1SDimitry Andric std::unique_ptr<MaterializationResponsibility>(unwrap(R)), 863fe6060f1SDimitry Andric std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))); 864fe6060f1SDimitry Andric } 865fe6060f1SDimitry Andric 866d409305fSDimitry Andric void LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer) { 867e8d8bef9SDimitry Andric delete unwrap(ObjLayer); 868e8d8bef9SDimitry Andric } 869e8d8bef9SDimitry Andric 870fe6060f1SDimitry Andric void LLVMOrcIRTransformLayerSetTransform( 871fe6060f1SDimitry Andric LLVMOrcIRTransformLayerRef IRTransformLayer, 872fe6060f1SDimitry Andric LLVMOrcIRTransformLayerTransformFunction TransformFunction, void *Ctx) { 873fe6060f1SDimitry Andric unwrap(IRTransformLayer) 874fe6060f1SDimitry Andric ->setTransform( 875fe6060f1SDimitry Andric [=](ThreadSafeModule TSM, 876fe6060f1SDimitry Andric MaterializationResponsibility &R) -> Expected<ThreadSafeModule> { 877fe6060f1SDimitry Andric LLVMOrcThreadSafeModuleRef TSMRef = 878fe6060f1SDimitry Andric wrap(new ThreadSafeModule(std::move(TSM))); 879fe6060f1SDimitry Andric if (LLVMErrorRef Err = TransformFunction(Ctx, &TSMRef, wrap(&R))) { 880fe6060f1SDimitry Andric assert(!TSMRef && "TSMRef was not reset to null on error"); 881fe6060f1SDimitry Andric return unwrap(Err); 882fe6060f1SDimitry Andric } 883bdd1243dSDimitry Andric assert(TSMRef && "Transform succeeded, but TSMRef was set to null"); 884bdd1243dSDimitry Andric ThreadSafeModule Result = std::move(*unwrap(TSMRef)); 885bdd1243dSDimitry Andric LLVMOrcDisposeThreadSafeModule(TSMRef); 886bdd1243dSDimitry Andric return std::move(Result); 887fe6060f1SDimitry Andric }); 888fe6060f1SDimitry Andric } 889fe6060f1SDimitry Andric 890fe6060f1SDimitry Andric void LLVMOrcObjectTransformLayerSetTransform( 891fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerRef ObjTransformLayer, 892fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerTransformFunction TransformFunction, void *Ctx) { 893fe6060f1SDimitry Andric unwrap(ObjTransformLayer) 894fe6060f1SDimitry Andric ->setTransform([TransformFunction, Ctx](std::unique_ptr<MemoryBuffer> Obj) 895fe6060f1SDimitry Andric -> Expected<std::unique_ptr<MemoryBuffer>> { 896fe6060f1SDimitry Andric LLVMMemoryBufferRef ObjBuffer = wrap(Obj.release()); 897fe6060f1SDimitry Andric if (LLVMErrorRef Err = TransformFunction(Ctx, &ObjBuffer)) { 898fe6060f1SDimitry Andric assert(!ObjBuffer && "ObjBuffer was not reset to null on error"); 899fe6060f1SDimitry Andric return unwrap(Err); 900fe6060f1SDimitry Andric } 901fe6060f1SDimitry Andric return std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)); 902fe6060f1SDimitry Andric }); 903fe6060f1SDimitry Andric } 904fe6060f1SDimitry Andric 905fe6060f1SDimitry Andric LLVMOrcDumpObjectsRef LLVMOrcCreateDumpObjects(const char *DumpDir, 906fe6060f1SDimitry Andric const char *IdentifierOverride) { 907fe6060f1SDimitry Andric assert(DumpDir && "DumpDir should not be null"); 908fe6060f1SDimitry Andric assert(IdentifierOverride && "IdentifierOverride should not be null"); 909fe6060f1SDimitry Andric return wrap(new DumpObjects(DumpDir, IdentifierOverride)); 910fe6060f1SDimitry Andric } 911fe6060f1SDimitry Andric 912fe6060f1SDimitry Andric void LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects) { 913fe6060f1SDimitry Andric delete unwrap(DumpObjects); 914fe6060f1SDimitry Andric } 915fe6060f1SDimitry Andric 916fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcDumpObjects_CallOperator(LLVMOrcDumpObjectsRef DumpObjects, 917fe6060f1SDimitry Andric LLVMMemoryBufferRef *ObjBuffer) { 918fe6060f1SDimitry Andric std::unique_ptr<MemoryBuffer> OB(unwrap(*ObjBuffer)); 919fe6060f1SDimitry Andric if (auto Result = (*unwrap(DumpObjects))(std::move(OB))) { 920fe6060f1SDimitry Andric *ObjBuffer = wrap(Result->release()); 921fe6060f1SDimitry Andric return LLVMErrorSuccess; 922fe6060f1SDimitry Andric } else { 923fe6060f1SDimitry Andric *ObjBuffer = nullptr; 924fe6060f1SDimitry Andric return wrap(Result.takeError()); 925fe6060f1SDimitry Andric } 926fe6060f1SDimitry Andric } 927fe6060f1SDimitry Andric 9285ffd83dbSDimitry Andric LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) { 9295ffd83dbSDimitry Andric return wrap(new LLJITBuilder()); 9305ffd83dbSDimitry Andric } 9315ffd83dbSDimitry Andric 9325ffd83dbSDimitry Andric void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) { 9335ffd83dbSDimitry Andric delete unwrap(Builder); 9345ffd83dbSDimitry Andric } 9355ffd83dbSDimitry Andric 9365ffd83dbSDimitry Andric void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder( 9375ffd83dbSDimitry Andric LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) { 938fe6060f1SDimitry Andric unwrap(Builder)->setJITTargetMachineBuilder(std::move(*unwrap(JTMB))); 939fe6060f1SDimitry Andric LLVMOrcDisposeJITTargetMachineBuilder(JTMB); 9405ffd83dbSDimitry Andric } 9415ffd83dbSDimitry Andric 942e8d8bef9SDimitry Andric void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator( 943e8d8bef9SDimitry Andric LLVMOrcLLJITBuilderRef Builder, 944e8d8bef9SDimitry Andric LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx) { 945e8d8bef9SDimitry Andric unwrap(Builder)->setObjectLinkingLayerCreator( 946e8d8bef9SDimitry Andric [=](ExecutionSession &ES, const Triple &TT) { 947e8d8bef9SDimitry Andric auto TTStr = TT.str(); 948e8d8bef9SDimitry Andric return std::unique_ptr<ObjectLayer>( 949e8d8bef9SDimitry Andric unwrap(F(Ctx, wrap(&ES), TTStr.c_str()))); 950e8d8bef9SDimitry Andric }); 951e8d8bef9SDimitry Andric } 952e8d8bef9SDimitry Andric 9535ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result, 9545ffd83dbSDimitry Andric LLVMOrcLLJITBuilderRef Builder) { 9555ffd83dbSDimitry Andric assert(Result && "Result can not be null"); 9565ffd83dbSDimitry Andric 9575ffd83dbSDimitry Andric if (!Builder) 9585ffd83dbSDimitry Andric Builder = LLVMOrcCreateLLJITBuilder(); 9595ffd83dbSDimitry Andric 9605ffd83dbSDimitry Andric auto J = unwrap(Builder)->create(); 9615ffd83dbSDimitry Andric LLVMOrcDisposeLLJITBuilder(Builder); 9625ffd83dbSDimitry Andric 9635ffd83dbSDimitry Andric if (!J) { 96404eeddc0SDimitry Andric Result = nullptr; 9655ffd83dbSDimitry Andric return wrap(J.takeError()); 9665ffd83dbSDimitry Andric } 9675ffd83dbSDimitry Andric 9685ffd83dbSDimitry Andric *Result = wrap(J->release()); 9695ffd83dbSDimitry Andric return LLVMErrorSuccess; 9705ffd83dbSDimitry Andric } 9715ffd83dbSDimitry Andric 9725ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) { 9735ffd83dbSDimitry Andric delete unwrap(J); 9745ffd83dbSDimitry Andric return LLVMErrorSuccess; 9755ffd83dbSDimitry Andric } 9765ffd83dbSDimitry Andric 9775ffd83dbSDimitry Andric LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) { 9785ffd83dbSDimitry Andric return wrap(&unwrap(J)->getExecutionSession()); 9795ffd83dbSDimitry Andric } 9805ffd83dbSDimitry Andric 9815ffd83dbSDimitry Andric LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) { 9825ffd83dbSDimitry Andric return wrap(&unwrap(J)->getMainJITDylib()); 9835ffd83dbSDimitry Andric } 9845ffd83dbSDimitry Andric 9855ffd83dbSDimitry Andric const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) { 9865ffd83dbSDimitry Andric return unwrap(J)->getTargetTriple().str().c_str(); 9875ffd83dbSDimitry Andric } 9885ffd83dbSDimitry Andric 9895ffd83dbSDimitry Andric char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) { 9905ffd83dbSDimitry Andric return unwrap(J)->getDataLayout().getGlobalPrefix(); 9915ffd83dbSDimitry Andric } 9925ffd83dbSDimitry Andric 9935ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef 9945ffd83dbSDimitry Andric LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) { 995fe6060f1SDimitry Andric return wrap(OrcV2CAPIHelper::moveFromSymbolStringPtr( 9965ffd83dbSDimitry Andric unwrap(J)->mangleAndIntern(UnmangledName))); 9975ffd83dbSDimitry Andric } 9985ffd83dbSDimitry Andric 9995ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD, 10005ffd83dbSDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 10015ffd83dbSDimitry Andric return wrap(unwrap(J)->addObjectFile( 10025ffd83dbSDimitry Andric *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 10035ffd83dbSDimitry Andric } 10045ffd83dbSDimitry Andric 1005e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J, 1006e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef RT, 1007e8d8bef9SDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 1008e8d8bef9SDimitry Andric return wrap(unwrap(J)->addObjectFile( 1009e8d8bef9SDimitry Andric ResourceTrackerSP(unwrap(RT)), 1010e8d8bef9SDimitry Andric std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 1011e8d8bef9SDimitry Andric } 1012e8d8bef9SDimitry Andric 10135ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J, 10145ffd83dbSDimitry Andric LLVMOrcJITDylibRef JD, 10155ffd83dbSDimitry Andric LLVMOrcThreadSafeModuleRef TSM) { 1016e8d8bef9SDimitry Andric std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 1017e8d8bef9SDimitry Andric return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM))); 1018e8d8bef9SDimitry Andric } 1019e8d8bef9SDimitry Andric 1020e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J, 1021e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef RT, 1022e8d8bef9SDimitry Andric LLVMOrcThreadSafeModuleRef TSM) { 1023e8d8bef9SDimitry Andric std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 1024e8d8bef9SDimitry Andric return wrap(unwrap(J)->addIRModule(ResourceTrackerSP(unwrap(RT)), 1025e8d8bef9SDimitry Andric std::move(*TmpTSM))); 10265ffd83dbSDimitry Andric } 10275ffd83dbSDimitry Andric 10285ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J, 10295ffd83dbSDimitry Andric LLVMOrcJITTargetAddress *Result, 10305ffd83dbSDimitry Andric const char *Name) { 10315ffd83dbSDimitry Andric assert(Result && "Result can not be null"); 10325ffd83dbSDimitry Andric 10335ffd83dbSDimitry Andric auto Sym = unwrap(J)->lookup(Name); 10345ffd83dbSDimitry Andric if (!Sym) { 10355ffd83dbSDimitry Andric *Result = 0; 10365ffd83dbSDimitry Andric return wrap(Sym.takeError()); 10375ffd83dbSDimitry Andric } 10385ffd83dbSDimitry Andric 103981ad6265SDimitry Andric *Result = Sym->getValue(); 10405ffd83dbSDimitry Andric return LLVMErrorSuccess; 10415ffd83dbSDimitry Andric } 1042e8d8bef9SDimitry Andric 1043fe6060f1SDimitry Andric LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J) { 1044fe6060f1SDimitry Andric return wrap(&unwrap(J)->getObjLinkingLayer()); 1045fe6060f1SDimitry Andric } 1046fe6060f1SDimitry Andric 1047fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerRef 1048fe6060f1SDimitry Andric LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J) { 1049fe6060f1SDimitry Andric return wrap(&unwrap(J)->getObjTransformLayer()); 1050fe6060f1SDimitry Andric } 1051fe6060f1SDimitry Andric 1052e8d8bef9SDimitry Andric LLVMOrcObjectLayerRef 1053e8d8bef9SDimitry Andric LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager( 1054e8d8bef9SDimitry Andric LLVMOrcExecutionSessionRef ES) { 1055e8d8bef9SDimitry Andric assert(ES && "ES must not be null"); 1056e8d8bef9SDimitry Andric return wrap(new RTDyldObjectLinkingLayer( 1057e8d8bef9SDimitry Andric *unwrap(ES), [] { return std::make_unique<SectionMemoryManager>(); })); 1058e8d8bef9SDimitry Andric } 1059e8d8bef9SDimitry Andric 1060bdd1243dSDimitry Andric LLVMOrcObjectLayerRef 1061bdd1243dSDimitry Andric LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks( 1062bdd1243dSDimitry Andric LLVMOrcExecutionSessionRef ES, void *CreateContextCtx, 1063bdd1243dSDimitry Andric LLVMMemoryManagerCreateContextCallback CreateContext, 1064bdd1243dSDimitry Andric LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating, 1065bdd1243dSDimitry Andric LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection, 1066bdd1243dSDimitry Andric LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection, 1067bdd1243dSDimitry Andric LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory, 1068bdd1243dSDimitry Andric LLVMMemoryManagerDestroyCallback Destroy) { 1069bdd1243dSDimitry Andric 1070bdd1243dSDimitry Andric struct MCJITMemoryManagerLikeCallbacks { 1071bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacks() = default; 1072bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacks( 1073bdd1243dSDimitry Andric void *CreateContextCtx, 1074bdd1243dSDimitry Andric LLVMMemoryManagerCreateContextCallback CreateContext, 1075bdd1243dSDimitry Andric LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating, 1076bdd1243dSDimitry Andric LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection, 1077bdd1243dSDimitry Andric LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection, 1078bdd1243dSDimitry Andric LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory, 1079bdd1243dSDimitry Andric LLVMMemoryManagerDestroyCallback Destroy) 1080bdd1243dSDimitry Andric : CreateContextCtx(CreateContextCtx), CreateContext(CreateContext), 1081bdd1243dSDimitry Andric NotifyTerminating(NotifyTerminating), 1082bdd1243dSDimitry Andric AllocateCodeSection(AllocateCodeSection), 1083bdd1243dSDimitry Andric AllocateDataSection(AllocateDataSection), 1084bdd1243dSDimitry Andric FinalizeMemory(FinalizeMemory), Destroy(Destroy) {} 1085bdd1243dSDimitry Andric 1086bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacks(MCJITMemoryManagerLikeCallbacks &&Other) { 1087bdd1243dSDimitry Andric std::swap(CreateContextCtx, Other.CreateContextCtx); 1088bdd1243dSDimitry Andric std::swap(CreateContext, Other.CreateContext); 1089bdd1243dSDimitry Andric std::swap(NotifyTerminating, Other.NotifyTerminating); 1090bdd1243dSDimitry Andric std::swap(AllocateCodeSection, Other.AllocateCodeSection); 1091bdd1243dSDimitry Andric std::swap(AllocateDataSection, Other.AllocateDataSection); 1092bdd1243dSDimitry Andric std::swap(FinalizeMemory, Other.FinalizeMemory); 1093bdd1243dSDimitry Andric std::swap(Destroy, Other.Destroy); 1094bdd1243dSDimitry Andric } 1095bdd1243dSDimitry Andric 1096bdd1243dSDimitry Andric ~MCJITMemoryManagerLikeCallbacks() { 1097bdd1243dSDimitry Andric if (NotifyTerminating) 1098bdd1243dSDimitry Andric NotifyTerminating(CreateContextCtx); 1099bdd1243dSDimitry Andric } 1100bdd1243dSDimitry Andric 1101bdd1243dSDimitry Andric void *CreateContextCtx = nullptr; 1102bdd1243dSDimitry Andric LLVMMemoryManagerCreateContextCallback CreateContext = nullptr; 1103bdd1243dSDimitry Andric LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating = nullptr; 1104bdd1243dSDimitry Andric LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection = nullptr; 1105bdd1243dSDimitry Andric LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection = nullptr; 1106bdd1243dSDimitry Andric LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory = nullptr; 1107bdd1243dSDimitry Andric LLVMMemoryManagerDestroyCallback Destroy = nullptr; 1108bdd1243dSDimitry Andric }; 1109bdd1243dSDimitry Andric 1110bdd1243dSDimitry Andric class MCJITMemoryManagerLikeCallbacksMemMgr : public RTDyldMemoryManager { 1111bdd1243dSDimitry Andric public: 1112bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacksMemMgr( 1113bdd1243dSDimitry Andric const MCJITMemoryManagerLikeCallbacks &CBs) 1114bdd1243dSDimitry Andric : CBs(CBs) { 1115bdd1243dSDimitry Andric Opaque = CBs.CreateContext(CBs.CreateContextCtx); 1116bdd1243dSDimitry Andric } 1117bdd1243dSDimitry Andric ~MCJITMemoryManagerLikeCallbacksMemMgr() override { CBs.Destroy(Opaque); } 1118bdd1243dSDimitry Andric 1119bdd1243dSDimitry Andric uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, 1120bdd1243dSDimitry Andric unsigned SectionID, 1121bdd1243dSDimitry Andric StringRef SectionName) override { 1122bdd1243dSDimitry Andric return CBs.AllocateCodeSection(Opaque, Size, Alignment, SectionID, 1123bdd1243dSDimitry Andric SectionName.str().c_str()); 1124bdd1243dSDimitry Andric } 1125bdd1243dSDimitry Andric 1126bdd1243dSDimitry Andric uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, 1127bdd1243dSDimitry Andric unsigned SectionID, StringRef SectionName, 1128bdd1243dSDimitry Andric bool isReadOnly) override { 1129bdd1243dSDimitry Andric return CBs.AllocateDataSection(Opaque, Size, Alignment, SectionID, 1130bdd1243dSDimitry Andric SectionName.str().c_str(), isReadOnly); 1131bdd1243dSDimitry Andric } 1132bdd1243dSDimitry Andric 1133bdd1243dSDimitry Andric bool finalizeMemory(std::string *ErrMsg) override { 1134bdd1243dSDimitry Andric char *ErrMsgCString = nullptr; 1135bdd1243dSDimitry Andric bool Result = CBs.FinalizeMemory(Opaque, &ErrMsgCString); 1136bdd1243dSDimitry Andric assert((Result || !ErrMsgCString) && 1137bdd1243dSDimitry Andric "Did not expect an error message if FinalizeMemory succeeded"); 1138bdd1243dSDimitry Andric if (ErrMsgCString) { 1139bdd1243dSDimitry Andric if (ErrMsg) 1140bdd1243dSDimitry Andric *ErrMsg = ErrMsgCString; 1141bdd1243dSDimitry Andric free(ErrMsgCString); 1142bdd1243dSDimitry Andric } 1143bdd1243dSDimitry Andric return Result; 1144bdd1243dSDimitry Andric } 1145bdd1243dSDimitry Andric 1146bdd1243dSDimitry Andric private: 1147bdd1243dSDimitry Andric const MCJITMemoryManagerLikeCallbacks &CBs; 1148bdd1243dSDimitry Andric void *Opaque = nullptr; 1149bdd1243dSDimitry Andric }; 1150bdd1243dSDimitry Andric 1151bdd1243dSDimitry Andric assert(ES && "ES must not be null"); 1152bdd1243dSDimitry Andric assert(CreateContext && "CreateContext must not be null"); 1153bdd1243dSDimitry Andric assert(NotifyTerminating && "NotifyTerminating must not be null"); 1154bdd1243dSDimitry Andric assert(AllocateCodeSection && "AllocateCodeSection must not be null"); 1155bdd1243dSDimitry Andric assert(AllocateDataSection && "AllocateDataSection must not be null"); 1156bdd1243dSDimitry Andric assert(FinalizeMemory && "FinalizeMemory must not be null"); 1157bdd1243dSDimitry Andric assert(Destroy && "Destroy must not be null"); 1158bdd1243dSDimitry Andric 1159bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacks CBs( 1160bdd1243dSDimitry Andric CreateContextCtx, CreateContext, NotifyTerminating, AllocateCodeSection, 1161bdd1243dSDimitry Andric AllocateDataSection, FinalizeMemory, Destroy); 1162bdd1243dSDimitry Andric 1163bdd1243dSDimitry Andric return wrap(new RTDyldObjectLinkingLayer(*unwrap(ES), [CBs = std::move(CBs)] { 1164bdd1243dSDimitry Andric return std::make_unique<MCJITMemoryManagerLikeCallbacksMemMgr>(CBs); 1165bdd1243dSDimitry Andric })); 1166bdd1243dSDimitry Andric 1167bdd1243dSDimitry Andric return nullptr; 1168bdd1243dSDimitry Andric } 1169bdd1243dSDimitry Andric 1170e8d8bef9SDimitry Andric void LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener( 1171e8d8bef9SDimitry Andric LLVMOrcObjectLayerRef RTDyldObjLinkingLayer, 1172e8d8bef9SDimitry Andric LLVMJITEventListenerRef Listener) { 1173e8d8bef9SDimitry Andric assert(RTDyldObjLinkingLayer && "RTDyldObjLinkingLayer must not be null"); 1174e8d8bef9SDimitry Andric assert(Listener && "Listener must not be null"); 1175e8d8bef9SDimitry Andric reinterpret_cast<RTDyldObjectLinkingLayer *>(unwrap(RTDyldObjLinkingLayer)) 1176e8d8bef9SDimitry Andric ->registerJITEventListener(*unwrap(Listener)); 1177e8d8bef9SDimitry Andric } 1178fe6060f1SDimitry Andric 1179fe6060f1SDimitry Andric LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J) { 1180fe6060f1SDimitry Andric return wrap(&unwrap(J)->getIRTransformLayer()); 1181fe6060f1SDimitry Andric } 1182fe6060f1SDimitry Andric 1183fe6060f1SDimitry Andric const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J) { 1184fe6060f1SDimitry Andric return unwrap(J)->getDataLayout().getStringRepresentation().c_str(); 1185fe6060f1SDimitry Andric } 1186fe6060f1SDimitry Andric 1187fe6060f1SDimitry Andric LLVMOrcIndirectStubsManagerRef 1188fe6060f1SDimitry Andric LLVMOrcCreateLocalIndirectStubsManager(const char *TargetTriple) { 1189fe6060f1SDimitry Andric auto builder = createLocalIndirectStubsManagerBuilder(Triple(TargetTriple)); 1190fe6060f1SDimitry Andric return wrap(builder().release()); 1191fe6060f1SDimitry Andric } 1192fe6060f1SDimitry Andric 1193fe6060f1SDimitry Andric void LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM) { 1194fe6060f1SDimitry Andric std::unique_ptr<IndirectStubsManager> TmpISM(unwrap(ISM)); 1195fe6060f1SDimitry Andric } 1196fe6060f1SDimitry Andric 1197fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcCreateLocalLazyCallThroughManager( 1198fe6060f1SDimitry Andric const char *TargetTriple, LLVMOrcExecutionSessionRef ES, 1199fe6060f1SDimitry Andric LLVMOrcJITTargetAddress ErrorHandlerAddr, 1200fe6060f1SDimitry Andric LLVMOrcLazyCallThroughManagerRef *Result) { 1201*06c3fb27SDimitry Andric auto LCTM = createLocalLazyCallThroughManager( 1202*06c3fb27SDimitry Andric Triple(TargetTriple), *unwrap(ES), ExecutorAddr(ErrorHandlerAddr)); 1203fe6060f1SDimitry Andric 1204fe6060f1SDimitry Andric if (!LCTM) 1205fe6060f1SDimitry Andric return wrap(LCTM.takeError()); 1206fe6060f1SDimitry Andric *Result = wrap(LCTM->release()); 1207fe6060f1SDimitry Andric return LLVMErrorSuccess; 1208fe6060f1SDimitry Andric } 1209fe6060f1SDimitry Andric 1210fe6060f1SDimitry Andric void LLVMOrcDisposeLazyCallThroughManager( 1211fe6060f1SDimitry Andric LLVMOrcLazyCallThroughManagerRef LCM) { 1212fe6060f1SDimitry Andric std::unique_ptr<LazyCallThroughManager> TmpLCM(unwrap(LCM)); 1213fe6060f1SDimitry Andric } 1214