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: 30e8d8bef9SDimitry Andric static InProgressLookupState *extractLookupState(LookupState &LS) { 31e8d8bef9SDimitry Andric return LS.IPLS.release(); 32e8d8bef9SDimitry Andric } 33e8d8bef9SDimitry Andric 34e8d8bef9SDimitry Andric static void resetLookupState(LookupState &LS, InProgressLookupState *IPLS) { 35e8d8bef9SDimitry Andric return LS.reset(IPLS); 36e8d8bef9SDimitry Andric } 375ffd83dbSDimitry Andric }; 385ffd83dbSDimitry Andric 39e8d8bef9SDimitry Andric } // namespace orc 40e8d8bef9SDimitry Andric } // namespace llvm 415ffd83dbSDimitry Andric 42*5f757f3fSDimitry Andric inline LLVMOrcSymbolStringPoolEntryRef wrap(SymbolStringPoolEntryUnsafe E) { 43*5f757f3fSDimitry Andric return reinterpret_cast<LLVMOrcSymbolStringPoolEntryRef>(E.rawPtr()); 44*5f757f3fSDimitry Andric } 45*5f757f3fSDimitry Andric 46*5f757f3fSDimitry Andric inline SymbolStringPoolEntryUnsafe unwrap(LLVMOrcSymbolStringPoolEntryRef E) { 47*5f757f3fSDimitry Andric return reinterpret_cast<SymbolStringPoolEntryUnsafe::PoolEntry *>(E); 48*5f757f3fSDimitry Andric } 49*5f757f3fSDimitry Andric 505ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef) 51e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef) 52e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationUnit, 53e8d8bef9SDimitry Andric LLVMOrcMaterializationUnitRef) 54fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationResponsibility, 55fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef) 565ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef) 57e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef) 58e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator, 59e8d8bef9SDimitry Andric LLVMOrcDefinitionGeneratorRef) 60e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(InProgressLookupState, LLVMOrcLookupStateRef) 615ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext, 625ffd83dbSDimitry Andric LLVMOrcThreadSafeContextRef) 635ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef) 645ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder, 655ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef) 66e8d8bef9SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectLayer, LLVMOrcObjectLayerRef) 67fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRTransformLayer, LLVMOrcIRTransformLayerRef) 68fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectTransformLayer, 69fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerRef) 70fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DumpObjects, LLVMOrcDumpObjectsRef) 71fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IndirectStubsManager, 72fe6060f1SDimitry Andric LLVMOrcIndirectStubsManagerRef) 73fe6060f1SDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LazyCallThroughManager, 74fe6060f1SDimitry Andric LLVMOrcLazyCallThroughManagerRef) 755ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef) 765ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef) 775ffd83dbSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef) 785ffd83dbSDimitry Andric 79fe6060f1SDimitry Andric namespace { 80fe6060f1SDimitry Andric 81fe6060f1SDimitry Andric class OrcCAPIMaterializationUnit : public llvm::orc::MaterializationUnit { 82fe6060f1SDimitry Andric public: 83fe6060f1SDimitry Andric OrcCAPIMaterializationUnit( 84fe6060f1SDimitry Andric std::string Name, SymbolFlagsMap InitialSymbolFlags, 85fe6060f1SDimitry Andric SymbolStringPtr InitSymbol, void *Ctx, 86fe6060f1SDimitry Andric LLVMOrcMaterializationUnitMaterializeFunction Materialize, 87fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDiscardFunction Discard, 88fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDestroyFunction Destroy) 890eae32dcSDimitry Andric : llvm::orc::MaterializationUnit( 900eae32dcSDimitry Andric Interface(std::move(InitialSymbolFlags), std::move(InitSymbol))), 91fe6060f1SDimitry Andric Name(std::move(Name)), Ctx(Ctx), Materialize(Materialize), 92fe6060f1SDimitry Andric Discard(Discard), Destroy(Destroy) {} 93fe6060f1SDimitry Andric 94fe6060f1SDimitry Andric ~OrcCAPIMaterializationUnit() { 95fe6060f1SDimitry Andric if (Ctx) 96fe6060f1SDimitry Andric Destroy(Ctx); 97fe6060f1SDimitry Andric } 98fe6060f1SDimitry Andric 99fe6060f1SDimitry Andric StringRef getName() const override { return Name; } 100fe6060f1SDimitry Andric 101fe6060f1SDimitry Andric void materialize(std::unique_ptr<MaterializationResponsibility> R) override { 102fe6060f1SDimitry Andric void *Tmp = Ctx; 103fe6060f1SDimitry Andric Ctx = nullptr; 104fe6060f1SDimitry Andric Materialize(Tmp, wrap(R.release())); 105fe6060f1SDimitry Andric } 106fe6060f1SDimitry Andric 107fe6060f1SDimitry Andric private: 108fe6060f1SDimitry Andric void discard(const JITDylib &JD, const SymbolStringPtr &Name) override { 109*5f757f3fSDimitry Andric Discard(Ctx, wrap(&JD), wrap(SymbolStringPoolEntryUnsafe::from(Name))); 110fe6060f1SDimitry Andric } 111fe6060f1SDimitry Andric 112fe6060f1SDimitry Andric std::string Name; 113fe6060f1SDimitry Andric void *Ctx = nullptr; 114fe6060f1SDimitry Andric LLVMOrcMaterializationUnitMaterializeFunction Materialize = nullptr; 115fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDiscardFunction Discard = nullptr; 116fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDestroyFunction Destroy = nullptr; 117fe6060f1SDimitry Andric }; 118fe6060f1SDimitry Andric 119fe6060f1SDimitry Andric static JITSymbolFlags toJITSymbolFlags(LLVMJITSymbolFlags F) { 120fe6060f1SDimitry Andric 121fe6060f1SDimitry Andric JITSymbolFlags JSF; 122fe6060f1SDimitry Andric 123fe6060f1SDimitry Andric if (F.GenericFlags & LLVMJITSymbolGenericFlagsExported) 124fe6060f1SDimitry Andric JSF |= JITSymbolFlags::Exported; 125fe6060f1SDimitry Andric if (F.GenericFlags & LLVMJITSymbolGenericFlagsWeak) 126fe6060f1SDimitry Andric JSF |= JITSymbolFlags::Weak; 127fe6060f1SDimitry Andric if (F.GenericFlags & LLVMJITSymbolGenericFlagsCallable) 128fe6060f1SDimitry Andric JSF |= JITSymbolFlags::Callable; 129fe6060f1SDimitry Andric if (F.GenericFlags & LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly) 130fe6060f1SDimitry Andric JSF |= JITSymbolFlags::MaterializationSideEffectsOnly; 131fe6060f1SDimitry Andric 132fe6060f1SDimitry Andric JSF.getTargetFlags() = F.TargetFlags; 133fe6060f1SDimitry Andric 134fe6060f1SDimitry Andric return JSF; 135fe6060f1SDimitry Andric } 136fe6060f1SDimitry Andric 137fe6060f1SDimitry Andric static LLVMJITSymbolFlags fromJITSymbolFlags(JITSymbolFlags JSF) { 138fe6060f1SDimitry Andric LLVMJITSymbolFlags F = {0, 0}; 139fe6060f1SDimitry Andric if (JSF & JITSymbolFlags::Exported) 140fe6060f1SDimitry Andric F.GenericFlags |= LLVMJITSymbolGenericFlagsExported; 141fe6060f1SDimitry Andric if (JSF & JITSymbolFlags::Weak) 142fe6060f1SDimitry Andric F.GenericFlags |= LLVMJITSymbolGenericFlagsWeak; 143fe6060f1SDimitry Andric if (JSF & JITSymbolFlags::Callable) 144fe6060f1SDimitry Andric F.GenericFlags |= LLVMJITSymbolGenericFlagsCallable; 145fe6060f1SDimitry Andric if (JSF & JITSymbolFlags::MaterializationSideEffectsOnly) 146fe6060f1SDimitry Andric F.GenericFlags |= LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly; 147fe6060f1SDimitry Andric 148fe6060f1SDimitry Andric F.TargetFlags = JSF.getTargetFlags(); 149fe6060f1SDimitry Andric 150fe6060f1SDimitry Andric return F; 151fe6060f1SDimitry Andric } 152fe6060f1SDimitry Andric 153fe6060f1SDimitry Andric static SymbolMap toSymbolMap(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) { 154fe6060f1SDimitry Andric SymbolMap SM; 155fe6060f1SDimitry Andric for (size_t I = 0; I != NumPairs; ++I) { 156fe6060f1SDimitry Andric JITSymbolFlags Flags = toJITSymbolFlags(Syms[I].Sym.Flags); 157*5f757f3fSDimitry Andric SM[unwrap(Syms[I].Name).moveToSymbolStringPtr()] = { 15806c3fb27SDimitry Andric ExecutorAddr(Syms[I].Sym.Address), Flags}; 159fe6060f1SDimitry Andric } 160fe6060f1SDimitry Andric return SM; 161fe6060f1SDimitry Andric } 162fe6060f1SDimitry Andric 163fe6060f1SDimitry Andric static SymbolDependenceMap 164fe6060f1SDimitry Andric toSymbolDependenceMap(LLVMOrcCDependenceMapPairs Pairs, size_t NumPairs) { 165fe6060f1SDimitry Andric SymbolDependenceMap SDM; 166fe6060f1SDimitry Andric for (size_t I = 0; I != NumPairs; ++I) { 167fe6060f1SDimitry Andric JITDylib *JD = unwrap(Pairs[I].JD); 168fe6060f1SDimitry Andric SymbolNameSet Names; 169fe6060f1SDimitry Andric 170fe6060f1SDimitry Andric for (size_t J = 0; J != Pairs[I].Names.Length; ++J) { 171fe6060f1SDimitry Andric auto Sym = Pairs[I].Names.Symbols[J]; 172*5f757f3fSDimitry Andric Names.insert(unwrap(Sym).moveToSymbolStringPtr()); 173fe6060f1SDimitry Andric } 174fe6060f1SDimitry Andric SDM[JD] = Names; 175fe6060f1SDimitry Andric } 176fe6060f1SDimitry Andric return SDM; 177fe6060f1SDimitry Andric } 178fe6060f1SDimitry Andric 17981ad6265SDimitry Andric static LookupKind toLookupKind(LLVMOrcLookupKind K) { 18081ad6265SDimitry Andric switch (K) { 18181ad6265SDimitry Andric case LLVMOrcLookupKindStatic: 18281ad6265SDimitry Andric return LookupKind::Static; 18381ad6265SDimitry Andric case LLVMOrcLookupKindDLSym: 18481ad6265SDimitry Andric return LookupKind::DLSym; 18581ad6265SDimitry Andric } 18681ad6265SDimitry Andric llvm_unreachable("unrecognized LLVMOrcLookupKind value"); 18781ad6265SDimitry Andric } 18881ad6265SDimitry Andric 18981ad6265SDimitry Andric static LLVMOrcLookupKind fromLookupKind(LookupKind K) { 19081ad6265SDimitry Andric switch (K) { 19181ad6265SDimitry Andric case LookupKind::Static: 19281ad6265SDimitry Andric return LLVMOrcLookupKindStatic; 19381ad6265SDimitry Andric case LookupKind::DLSym: 19481ad6265SDimitry Andric return LLVMOrcLookupKindDLSym; 19581ad6265SDimitry Andric } 19681ad6265SDimitry Andric llvm_unreachable("unrecognized LookupKind value"); 19781ad6265SDimitry Andric } 19881ad6265SDimitry Andric 19981ad6265SDimitry Andric static JITDylibLookupFlags 20081ad6265SDimitry Andric toJITDylibLookupFlags(LLVMOrcJITDylibLookupFlags LF) { 20181ad6265SDimitry Andric switch (LF) { 20281ad6265SDimitry Andric case LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly: 20381ad6265SDimitry Andric return JITDylibLookupFlags::MatchExportedSymbolsOnly; 20481ad6265SDimitry Andric case LLVMOrcJITDylibLookupFlagsMatchAllSymbols: 20581ad6265SDimitry Andric return JITDylibLookupFlags::MatchAllSymbols; 20681ad6265SDimitry Andric } 20781ad6265SDimitry Andric llvm_unreachable("unrecognized LLVMOrcJITDylibLookupFlags value"); 20881ad6265SDimitry Andric } 20981ad6265SDimitry Andric 21081ad6265SDimitry Andric static LLVMOrcJITDylibLookupFlags 21181ad6265SDimitry Andric fromJITDylibLookupFlags(JITDylibLookupFlags LF) { 21281ad6265SDimitry Andric switch (LF) { 21381ad6265SDimitry Andric case JITDylibLookupFlags::MatchExportedSymbolsOnly: 21481ad6265SDimitry Andric return LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly; 21581ad6265SDimitry Andric case JITDylibLookupFlags::MatchAllSymbols: 21681ad6265SDimitry Andric return LLVMOrcJITDylibLookupFlagsMatchAllSymbols; 21781ad6265SDimitry Andric } 21881ad6265SDimitry Andric llvm_unreachable("unrecognized JITDylibLookupFlags value"); 21981ad6265SDimitry Andric } 22081ad6265SDimitry Andric 22181ad6265SDimitry Andric static SymbolLookupFlags toSymbolLookupFlags(LLVMOrcSymbolLookupFlags SLF) { 22281ad6265SDimitry Andric switch (SLF) { 22381ad6265SDimitry Andric case LLVMOrcSymbolLookupFlagsRequiredSymbol: 22481ad6265SDimitry Andric return SymbolLookupFlags::RequiredSymbol; 22581ad6265SDimitry Andric case LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol: 22681ad6265SDimitry Andric return SymbolLookupFlags::WeaklyReferencedSymbol; 22781ad6265SDimitry Andric } 22881ad6265SDimitry Andric llvm_unreachable("unrecognized LLVMOrcSymbolLookupFlags value"); 22981ad6265SDimitry Andric } 23081ad6265SDimitry Andric 23181ad6265SDimitry Andric static LLVMOrcSymbolLookupFlags fromSymbolLookupFlags(SymbolLookupFlags SLF) { 23281ad6265SDimitry Andric switch (SLF) { 23381ad6265SDimitry Andric case SymbolLookupFlags::RequiredSymbol: 23481ad6265SDimitry Andric return LLVMOrcSymbolLookupFlagsRequiredSymbol; 23581ad6265SDimitry Andric case SymbolLookupFlags::WeaklyReferencedSymbol: 23681ad6265SDimitry Andric return LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol; 23781ad6265SDimitry Andric } 23881ad6265SDimitry Andric llvm_unreachable("unrecognized SymbolLookupFlags value"); 23981ad6265SDimitry Andric } 24081ad6265SDimitry Andric 24181ad6265SDimitry Andric static LLVMJITEvaluatedSymbol 24206c3fb27SDimitry Andric fromExecutorSymbolDef(const ExecutorSymbolDef &S) { 24306c3fb27SDimitry Andric return {S.getAddress().getValue(), fromJITSymbolFlags(S.getFlags())}; 24481ad6265SDimitry Andric } 24581ad6265SDimitry Andric 246fe6060f1SDimitry Andric } // end anonymous namespace 247fe6060f1SDimitry Andric 24881ad6265SDimitry Andric namespace llvm { 24981ad6265SDimitry Andric namespace orc { 25081ad6265SDimitry Andric 25181ad6265SDimitry Andric class CAPIDefinitionGenerator final : public DefinitionGenerator { 25281ad6265SDimitry Andric public: 25381ad6265SDimitry Andric CAPIDefinitionGenerator( 25481ad6265SDimitry Andric LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose, void *Ctx, 25581ad6265SDimitry Andric LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate) 25681ad6265SDimitry Andric : Dispose(Dispose), Ctx(Ctx), TryToGenerate(TryToGenerate) {} 25781ad6265SDimitry Andric 25881ad6265SDimitry Andric ~CAPIDefinitionGenerator() { 25981ad6265SDimitry Andric if (Dispose) 26081ad6265SDimitry Andric Dispose(Ctx); 26181ad6265SDimitry Andric } 26281ad6265SDimitry Andric 26381ad6265SDimitry Andric Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD, 26481ad6265SDimitry Andric JITDylibLookupFlags JDLookupFlags, 26581ad6265SDimitry Andric const SymbolLookupSet &LookupSet) override { 26681ad6265SDimitry Andric 26781ad6265SDimitry Andric // Take the lookup state. 26881ad6265SDimitry Andric LLVMOrcLookupStateRef LSR = ::wrap(OrcV2CAPIHelper::extractLookupState(LS)); 26981ad6265SDimitry Andric 27081ad6265SDimitry Andric // Translate the lookup kind. 27181ad6265SDimitry Andric LLVMOrcLookupKind CLookupKind = fromLookupKind(K); 27281ad6265SDimitry Andric 27381ad6265SDimitry Andric // Translate the JITDylibLookupFlags. 27481ad6265SDimitry Andric LLVMOrcJITDylibLookupFlags CJDLookupFlags = 27581ad6265SDimitry Andric fromJITDylibLookupFlags(JDLookupFlags); 27681ad6265SDimitry Andric 27781ad6265SDimitry Andric // Translate the lookup set. 27881ad6265SDimitry Andric std::vector<LLVMOrcCLookupSetElement> CLookupSet; 27981ad6265SDimitry Andric CLookupSet.reserve(LookupSet.size()); 28081ad6265SDimitry Andric for (auto &KV : LookupSet) { 28181ad6265SDimitry Andric LLVMOrcSymbolStringPoolEntryRef Name = 282*5f757f3fSDimitry Andric ::wrap(SymbolStringPoolEntryUnsafe::from(KV.first)); 28381ad6265SDimitry Andric LLVMOrcSymbolLookupFlags SLF = fromSymbolLookupFlags(KV.second); 28481ad6265SDimitry Andric CLookupSet.push_back({Name, SLF}); 28581ad6265SDimitry Andric } 28681ad6265SDimitry Andric 28781ad6265SDimitry Andric // Run the C TryToGenerate function. 28881ad6265SDimitry Andric auto Err = unwrap(TryToGenerate(::wrap(this), Ctx, &LSR, CLookupKind, 28981ad6265SDimitry Andric ::wrap(&JD), CJDLookupFlags, 29081ad6265SDimitry Andric CLookupSet.data(), CLookupSet.size())); 29181ad6265SDimitry Andric 29281ad6265SDimitry Andric // Restore the lookup state. 29381ad6265SDimitry Andric OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(LSR)); 29481ad6265SDimitry Andric 29581ad6265SDimitry Andric return Err; 29681ad6265SDimitry Andric } 29781ad6265SDimitry Andric 29881ad6265SDimitry Andric private: 29981ad6265SDimitry Andric LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose; 30081ad6265SDimitry Andric void *Ctx; 30181ad6265SDimitry Andric LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate; 30281ad6265SDimitry Andric }; 30381ad6265SDimitry Andric 30481ad6265SDimitry Andric } // end namespace orc 30581ad6265SDimitry Andric } // end namespace llvm 30681ad6265SDimitry Andric 307e8d8bef9SDimitry Andric void LLVMOrcExecutionSessionSetErrorReporter( 308e8d8bef9SDimitry Andric LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError, 309e8d8bef9SDimitry Andric void *Ctx) { 310e8d8bef9SDimitry Andric unwrap(ES)->setErrorReporter( 311e8d8bef9SDimitry Andric [=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); }); 312e8d8bef9SDimitry Andric } 313e8d8bef9SDimitry Andric 314e8d8bef9SDimitry Andric LLVMOrcSymbolStringPoolRef 315e8d8bef9SDimitry Andric LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) { 316fe6060f1SDimitry Andric return wrap( 317fe6060f1SDimitry Andric unwrap(ES)->getExecutorProcessControl().getSymbolStringPool().get()); 318e8d8bef9SDimitry Andric } 319e8d8bef9SDimitry Andric 320e8d8bef9SDimitry Andric void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) { 321e8d8bef9SDimitry Andric unwrap(SSP)->clearDeadEntries(); 322e8d8bef9SDimitry Andric } 323e8d8bef9SDimitry Andric 3245ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef 3255ffd83dbSDimitry Andric LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) { 326*5f757f3fSDimitry Andric return wrap(SymbolStringPoolEntryUnsafe::take(unwrap(ES)->intern(Name))); 3275ffd83dbSDimitry Andric } 3285ffd83dbSDimitry Andric 32981ad6265SDimitry Andric void LLVMOrcExecutionSessionLookup( 33081ad6265SDimitry Andric LLVMOrcExecutionSessionRef ES, LLVMOrcLookupKind K, 33181ad6265SDimitry Andric LLVMOrcCJITDylibSearchOrder SearchOrder, size_t SearchOrderSize, 33281ad6265SDimitry Andric LLVMOrcCLookupSet Symbols, size_t SymbolsSize, 33381ad6265SDimitry Andric LLVMOrcExecutionSessionLookupHandleResultFunction HandleResult, void *Ctx) { 33481ad6265SDimitry Andric assert(ES && "ES cannot be null"); 33581ad6265SDimitry Andric assert(SearchOrder && "SearchOrder cannot be null"); 33681ad6265SDimitry Andric assert(Symbols && "Symbols cannot be null"); 33781ad6265SDimitry Andric assert(HandleResult && "HandleResult cannot be null"); 33881ad6265SDimitry Andric 33981ad6265SDimitry Andric JITDylibSearchOrder SO; 34081ad6265SDimitry Andric for (size_t I = 0; I != SearchOrderSize; ++I) 34181ad6265SDimitry Andric SO.push_back({unwrap(SearchOrder[I].JD), 34281ad6265SDimitry Andric toJITDylibLookupFlags(SearchOrder[I].JDLookupFlags)}); 34381ad6265SDimitry Andric 34481ad6265SDimitry Andric SymbolLookupSet SLS; 34581ad6265SDimitry Andric for (size_t I = 0; I != SymbolsSize; ++I) 346*5f757f3fSDimitry Andric SLS.add(unwrap(Symbols[I].Name).moveToSymbolStringPtr(), 34781ad6265SDimitry Andric toSymbolLookupFlags(Symbols[I].LookupFlags)); 34881ad6265SDimitry Andric 34981ad6265SDimitry Andric unwrap(ES)->lookup( 35081ad6265SDimitry Andric toLookupKind(K), SO, std::move(SLS), SymbolState::Ready, 35181ad6265SDimitry Andric [HandleResult, Ctx](Expected<SymbolMap> Result) { 35281ad6265SDimitry Andric if (Result) { 35381ad6265SDimitry Andric SmallVector<LLVMOrcCSymbolMapPair> CResult; 35481ad6265SDimitry Andric for (auto &KV : *Result) 35581ad6265SDimitry Andric CResult.push_back(LLVMOrcCSymbolMapPair{ 356*5f757f3fSDimitry Andric wrap(SymbolStringPoolEntryUnsafe::from(KV.first)), 35706c3fb27SDimitry Andric fromExecutorSymbolDef(KV.second)}); 35881ad6265SDimitry Andric HandleResult(LLVMErrorSuccess, CResult.data(), CResult.size(), Ctx); 35981ad6265SDimitry Andric } else 36081ad6265SDimitry Andric HandleResult(wrap(Result.takeError()), nullptr, 0, Ctx); 36181ad6265SDimitry Andric }, 36281ad6265SDimitry Andric NoDependenciesToRegister); 36381ad6265SDimitry Andric } 36481ad6265SDimitry Andric 365e8d8bef9SDimitry Andric void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) { 366*5f757f3fSDimitry Andric unwrap(S).retain(); 367e8d8bef9SDimitry Andric } 368e8d8bef9SDimitry Andric 3695ffd83dbSDimitry Andric void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) { 370*5f757f3fSDimitry Andric unwrap(S).release(); 3715ffd83dbSDimitry Andric } 3725ffd83dbSDimitry Andric 373e8d8bef9SDimitry Andric const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S) { 374*5f757f3fSDimitry Andric return unwrap(S).rawPtr()->getKey().data(); 375e8d8bef9SDimitry Andric } 376e8d8bef9SDimitry Andric 377e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef 378e8d8bef9SDimitry Andric LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD) { 379e8d8bef9SDimitry Andric auto RT = unwrap(JD)->createResourceTracker(); 380e8d8bef9SDimitry Andric // Retain the pointer for the C API client. 381e8d8bef9SDimitry Andric RT->Retain(); 382e8d8bef9SDimitry Andric return wrap(RT.get()); 383e8d8bef9SDimitry Andric } 384e8d8bef9SDimitry Andric 385e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef 386e8d8bef9SDimitry Andric LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD) { 387e8d8bef9SDimitry Andric auto RT = unwrap(JD)->getDefaultResourceTracker(); 388e8d8bef9SDimitry Andric // Retain the pointer for the C API client. 389e8d8bef9SDimitry Andric return wrap(RT.get()); 390e8d8bef9SDimitry Andric } 391e8d8bef9SDimitry Andric 392e8d8bef9SDimitry Andric void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) { 393e8d8bef9SDimitry Andric ResourceTrackerSP TmpRT(unwrap(RT)); 394e8d8bef9SDimitry Andric TmpRT->Release(); 395e8d8bef9SDimitry Andric } 396e8d8bef9SDimitry Andric 397e8d8bef9SDimitry Andric void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT, 398e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef DstRT) { 399e8d8bef9SDimitry Andric ResourceTrackerSP TmpRT(unwrap(SrcRT)); 400e8d8bef9SDimitry Andric TmpRT->transferTo(*unwrap(DstRT)); 401e8d8bef9SDimitry Andric } 402e8d8bef9SDimitry Andric 403e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) { 404e8d8bef9SDimitry Andric ResourceTrackerSP TmpRT(unwrap(RT)); 405e8d8bef9SDimitry Andric return wrap(TmpRT->remove()); 406e8d8bef9SDimitry Andric } 407e8d8bef9SDimitry Andric 408e8d8bef9SDimitry Andric void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) { 409e8d8bef9SDimitry Andric std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG)); 410e8d8bef9SDimitry Andric } 411e8d8bef9SDimitry Andric 412e8d8bef9SDimitry Andric void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) { 413e8d8bef9SDimitry Andric std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 414e8d8bef9SDimitry Andric } 415e8d8bef9SDimitry Andric 416fe6060f1SDimitry Andric LLVMOrcMaterializationUnitRef LLVMOrcCreateCustomMaterializationUnit( 417fe6060f1SDimitry Andric const char *Name, void *Ctx, LLVMOrcCSymbolFlagsMapPairs Syms, 418fe6060f1SDimitry Andric size_t NumSyms, LLVMOrcSymbolStringPoolEntryRef InitSym, 419fe6060f1SDimitry Andric LLVMOrcMaterializationUnitMaterializeFunction Materialize, 420fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDiscardFunction Discard, 421fe6060f1SDimitry Andric LLVMOrcMaterializationUnitDestroyFunction Destroy) { 422fe6060f1SDimitry Andric SymbolFlagsMap SFM; 423fe6060f1SDimitry Andric for (size_t I = 0; I != NumSyms; ++I) 424*5f757f3fSDimitry Andric SFM[unwrap(Syms[I].Name).moveToSymbolStringPtr()] = 425fe6060f1SDimitry Andric toJITSymbolFlags(Syms[I].Flags); 426e8d8bef9SDimitry Andric 427*5f757f3fSDimitry Andric auto IS = unwrap(InitSym).moveToSymbolStringPtr(); 428e8d8bef9SDimitry Andric 429fe6060f1SDimitry Andric return wrap(new OrcCAPIMaterializationUnit( 430fe6060f1SDimitry Andric Name, std::move(SFM), std::move(IS), Ctx, Materialize, Discard, Destroy)); 431e8d8bef9SDimitry Andric } 432e8d8bef9SDimitry Andric 433fe6060f1SDimitry Andric LLVMOrcMaterializationUnitRef 434fe6060f1SDimitry Andric LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) { 435fe6060f1SDimitry Andric SymbolMap SM = toSymbolMap(Syms, NumPairs); 436e8d8bef9SDimitry Andric return wrap(absoluteSymbols(std::move(SM)).release()); 437e8d8bef9SDimitry Andric } 438e8d8bef9SDimitry Andric 439fe6060f1SDimitry Andric LLVMOrcMaterializationUnitRef LLVMOrcLazyReexports( 440fe6060f1SDimitry Andric LLVMOrcLazyCallThroughManagerRef LCTM, LLVMOrcIndirectStubsManagerRef ISM, 441fe6060f1SDimitry Andric LLVMOrcJITDylibRef SourceJD, LLVMOrcCSymbolAliasMapPairs CallableAliases, 442fe6060f1SDimitry Andric size_t NumPairs) { 443fe6060f1SDimitry Andric 444fe6060f1SDimitry Andric SymbolAliasMap SAM; 445fe6060f1SDimitry Andric for (size_t I = 0; I != NumPairs; ++I) { 446fe6060f1SDimitry Andric auto pair = CallableAliases[I]; 447fe6060f1SDimitry Andric JITSymbolFlags Flags = toJITSymbolFlags(pair.Entry.Flags); 448*5f757f3fSDimitry Andric SymbolStringPtr Name = unwrap(pair.Entry.Name).moveToSymbolStringPtr(); 449*5f757f3fSDimitry Andric SAM[unwrap(pair.Name).moveToSymbolStringPtr()] = 450fe6060f1SDimitry Andric SymbolAliasMapEntry(Name, Flags); 451fe6060f1SDimitry Andric } 452fe6060f1SDimitry Andric 453fe6060f1SDimitry Andric return wrap(lazyReexports(*unwrap(LCTM), *unwrap(ISM), *unwrap(SourceJD), 454fe6060f1SDimitry Andric std::move(SAM)) 455fe6060f1SDimitry Andric .release()); 456fe6060f1SDimitry Andric } 457fe6060f1SDimitry Andric 458fe6060f1SDimitry Andric void LLVMOrcDisposeMaterializationResponsibility( 459fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 460fe6060f1SDimitry Andric std::unique_ptr<MaterializationResponsibility> TmpMR(unwrap(MR)); 461fe6060f1SDimitry Andric } 462fe6060f1SDimitry Andric 463fe6060f1SDimitry Andric LLVMOrcJITDylibRef LLVMOrcMaterializationResponsibilityGetTargetDylib( 464fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 465fe6060f1SDimitry Andric return wrap(&unwrap(MR)->getTargetJITDylib()); 466fe6060f1SDimitry Andric } 467fe6060f1SDimitry Andric 468fe6060f1SDimitry Andric LLVMOrcExecutionSessionRef 469fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityGetExecutionSession( 470fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 471fe6060f1SDimitry Andric return wrap(&unwrap(MR)->getExecutionSession()); 472fe6060f1SDimitry Andric } 473fe6060f1SDimitry Andric 474fe6060f1SDimitry Andric LLVMOrcCSymbolFlagsMapPairs LLVMOrcMaterializationResponsibilityGetSymbols( 475fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, size_t *NumPairs) { 476fe6060f1SDimitry Andric 477fe6060f1SDimitry Andric auto Symbols = unwrap(MR)->getSymbols(); 478fe6060f1SDimitry Andric LLVMOrcCSymbolFlagsMapPairs Result = static_cast<LLVMOrcCSymbolFlagsMapPairs>( 479fe6060f1SDimitry Andric safe_malloc(Symbols.size() * sizeof(LLVMOrcCSymbolFlagsMapPair))); 480fe6060f1SDimitry Andric size_t I = 0; 481fe6060f1SDimitry Andric for (auto const &pair : Symbols) { 482*5f757f3fSDimitry Andric auto Name = wrap(SymbolStringPoolEntryUnsafe::from(pair.first)); 483fe6060f1SDimitry Andric auto Flags = pair.second; 484fe6060f1SDimitry Andric Result[I] = {Name, fromJITSymbolFlags(Flags)}; 485fe6060f1SDimitry Andric I++; 486fe6060f1SDimitry Andric } 487fe6060f1SDimitry Andric *NumPairs = Symbols.size(); 488fe6060f1SDimitry Andric return Result; 489fe6060f1SDimitry Andric } 490fe6060f1SDimitry Andric 491fe6060f1SDimitry Andric void LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs) { 492fe6060f1SDimitry Andric free(Pairs); 493fe6060f1SDimitry Andric } 494fe6060f1SDimitry Andric 495fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef 496fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityGetInitializerSymbol( 497fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 498fe6060f1SDimitry Andric auto Sym = unwrap(MR)->getInitializerSymbol(); 499*5f757f3fSDimitry Andric return wrap(SymbolStringPoolEntryUnsafe::from(Sym)); 500fe6060f1SDimitry Andric } 501fe6060f1SDimitry Andric 502fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef * 503fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityGetRequestedSymbols( 504fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, size_t *NumSymbols) { 505fe6060f1SDimitry Andric 506fe6060f1SDimitry Andric auto Symbols = unwrap(MR)->getRequestedSymbols(); 507fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef *Result = 508fe6060f1SDimitry Andric static_cast<LLVMOrcSymbolStringPoolEntryRef *>(safe_malloc( 509fe6060f1SDimitry Andric Symbols.size() * sizeof(LLVMOrcSymbolStringPoolEntryRef))); 510fe6060f1SDimitry Andric size_t I = 0; 511fe6060f1SDimitry Andric for (auto &Name : Symbols) { 512*5f757f3fSDimitry Andric Result[I] = wrap(SymbolStringPoolEntryUnsafe::from(Name)); 513fe6060f1SDimitry Andric I++; 514fe6060f1SDimitry Andric } 515fe6060f1SDimitry Andric *NumSymbols = Symbols.size(); 516fe6060f1SDimitry Andric return Result; 517fe6060f1SDimitry Andric } 518fe6060f1SDimitry Andric 519fe6060f1SDimitry Andric void LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef *Symbols) { 520fe6060f1SDimitry Andric free(Symbols); 521fe6060f1SDimitry Andric } 522fe6060f1SDimitry Andric 523fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyResolved( 524fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, LLVMOrcCSymbolMapPairs Symbols, 525fe6060f1SDimitry Andric size_t NumPairs) { 526fe6060f1SDimitry Andric SymbolMap SM = toSymbolMap(Symbols, NumPairs); 527fe6060f1SDimitry Andric return wrap(unwrap(MR)->notifyResolved(std::move(SM))); 528fe6060f1SDimitry Andric } 529fe6060f1SDimitry Andric 530fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyEmitted( 531fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 532fe6060f1SDimitry Andric return wrap(unwrap(MR)->notifyEmitted()); 533fe6060f1SDimitry Andric } 534fe6060f1SDimitry Andric 535fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityDefineMaterializing( 536fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 537fe6060f1SDimitry Andric LLVMOrcCSymbolFlagsMapPairs Syms, size_t NumSyms) { 538fe6060f1SDimitry Andric SymbolFlagsMap SFM; 539fe6060f1SDimitry Andric for (size_t I = 0; I != NumSyms; ++I) 540*5f757f3fSDimitry Andric SFM[unwrap(Syms[I].Name).moveToSymbolStringPtr()] = 541fe6060f1SDimitry Andric toJITSymbolFlags(Syms[I].Flags); 542fe6060f1SDimitry Andric 543fe6060f1SDimitry Andric return wrap(unwrap(MR)->defineMaterializing(std::move(SFM))); 544fe6060f1SDimitry Andric } 545fe6060f1SDimitry Andric 546fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityReplace( 547fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 548fe6060f1SDimitry Andric LLVMOrcMaterializationUnitRef MU) { 549fe6060f1SDimitry Andric std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 550fe6060f1SDimitry Andric return wrap(unwrap(MR)->replace(std::move(TmpMU))); 551fe6060f1SDimitry Andric } 552fe6060f1SDimitry Andric 553fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityDelegate( 554fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 555fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef *Symbols, size_t NumSymbols, 556fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef *Result) { 557fe6060f1SDimitry Andric SymbolNameSet Syms; 558fe6060f1SDimitry Andric for (size_t I = 0; I != NumSymbols; I++) { 559*5f757f3fSDimitry Andric Syms.insert(unwrap(Symbols[I]).moveToSymbolStringPtr()); 560fe6060f1SDimitry Andric } 561fe6060f1SDimitry Andric auto OtherMR = unwrap(MR)->delegate(Syms); 562fe6060f1SDimitry Andric 563fe6060f1SDimitry Andric if (!OtherMR) { 564fe6060f1SDimitry Andric return wrap(OtherMR.takeError()); 565fe6060f1SDimitry Andric } 566fe6060f1SDimitry Andric *Result = wrap(OtherMR->release()); 567fe6060f1SDimitry Andric return LLVMErrorSuccess; 568fe6060f1SDimitry Andric } 569fe6060f1SDimitry Andric 570fe6060f1SDimitry Andric void LLVMOrcMaterializationResponsibilityAddDependencies( 571fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 572fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef Name, 573fe6060f1SDimitry Andric LLVMOrcCDependenceMapPairs Dependencies, size_t NumPairs) { 574fe6060f1SDimitry Andric 575fe6060f1SDimitry Andric SymbolDependenceMap SDM = toSymbolDependenceMap(Dependencies, NumPairs); 576*5f757f3fSDimitry Andric auto Sym = unwrap(Name).moveToSymbolStringPtr(); 577fe6060f1SDimitry Andric unwrap(MR)->addDependencies(Sym, SDM); 578fe6060f1SDimitry Andric } 579fe6060f1SDimitry Andric 580fe6060f1SDimitry Andric void LLVMOrcMaterializationResponsibilityAddDependenciesForAll( 581fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 582fe6060f1SDimitry Andric LLVMOrcCDependenceMapPairs Dependencies, size_t NumPairs) { 583fe6060f1SDimitry Andric 584fe6060f1SDimitry Andric SymbolDependenceMap SDM = toSymbolDependenceMap(Dependencies, NumPairs); 585fe6060f1SDimitry Andric unwrap(MR)->addDependenciesForAll(SDM); 586fe6060f1SDimitry Andric } 587fe6060f1SDimitry Andric 588fe6060f1SDimitry Andric void LLVMOrcMaterializationResponsibilityFailMaterialization( 589fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR) { 590fe6060f1SDimitry Andric unwrap(MR)->failMaterialization(); 591fe6060f1SDimitry Andric } 592fe6060f1SDimitry Andric 593fe6060f1SDimitry Andric void LLVMOrcIRTransformLayerEmit(LLVMOrcIRTransformLayerRef IRLayer, 594fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef MR, 595fe6060f1SDimitry Andric LLVMOrcThreadSafeModuleRef TSM) { 596fe6060f1SDimitry Andric std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 597fe6060f1SDimitry Andric unwrap(IRLayer)->emit( 598fe6060f1SDimitry Andric std::unique_ptr<MaterializationResponsibility>(unwrap(MR)), 599fe6060f1SDimitry Andric std::move(*TmpTSM)); 600fe6060f1SDimitry Andric } 601fe6060f1SDimitry Andric 602e8d8bef9SDimitry Andric LLVMOrcJITDylibRef 603e8d8bef9SDimitry Andric LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES, 604e8d8bef9SDimitry Andric const char *Name) { 605e8d8bef9SDimitry Andric return wrap(&unwrap(ES)->createBareJITDylib(Name)); 606e8d8bef9SDimitry Andric } 607e8d8bef9SDimitry Andric 608e8d8bef9SDimitry Andric LLVMErrorRef 609e8d8bef9SDimitry Andric LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES, 610e8d8bef9SDimitry Andric LLVMOrcJITDylibRef *Result, 611e8d8bef9SDimitry Andric const char *Name) { 612e8d8bef9SDimitry Andric auto JD = unwrap(ES)->createJITDylib(Name); 613e8d8bef9SDimitry Andric if (!JD) 614e8d8bef9SDimitry Andric return wrap(JD.takeError()); 615e8d8bef9SDimitry Andric *Result = wrap(&*JD); 616e8d8bef9SDimitry Andric return LLVMErrorSuccess; 617e8d8bef9SDimitry Andric } 618e8d8bef9SDimitry Andric 619e8d8bef9SDimitry Andric LLVMOrcJITDylibRef 620e8d8bef9SDimitry Andric LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES, 621e8d8bef9SDimitry Andric const char *Name) { 622e8d8bef9SDimitry Andric return wrap(unwrap(ES)->getJITDylibByName(Name)); 623e8d8bef9SDimitry Andric } 624e8d8bef9SDimitry Andric 625e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD, 626e8d8bef9SDimitry Andric LLVMOrcMaterializationUnitRef MU) { 627e8d8bef9SDimitry Andric std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 628e8d8bef9SDimitry Andric 629e8d8bef9SDimitry Andric if (auto Err = unwrap(JD)->define(TmpMU)) { 630e8d8bef9SDimitry Andric TmpMU.release(); 631e8d8bef9SDimitry Andric return wrap(std::move(Err)); 632e8d8bef9SDimitry Andric } 633e8d8bef9SDimitry Andric return LLVMErrorSuccess; 634e8d8bef9SDimitry Andric } 635e8d8bef9SDimitry Andric 636e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) { 637e8d8bef9SDimitry Andric return wrap(unwrap(JD)->clear()); 6385ffd83dbSDimitry Andric } 6395ffd83dbSDimitry Andric 6405ffd83dbSDimitry Andric void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD, 641e8d8bef9SDimitry Andric LLVMOrcDefinitionGeneratorRef DG) { 642e8d8bef9SDimitry Andric unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG))); 643e8d8bef9SDimitry Andric } 644e8d8bef9SDimitry Andric 645e8d8bef9SDimitry Andric LLVMOrcDefinitionGeneratorRef LLVMOrcCreateCustomCAPIDefinitionGenerator( 64681ad6265SDimitry Andric LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F, void *Ctx, 64781ad6265SDimitry Andric LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose) { 64881ad6265SDimitry Andric auto DG = std::make_unique<CAPIDefinitionGenerator>(Dispose, Ctx, F); 649e8d8bef9SDimitry Andric return wrap(DG.release()); 6505ffd83dbSDimitry Andric } 6515ffd83dbSDimitry Andric 65281ad6265SDimitry Andric void LLVMOrcLookupStateContinueLookup(LLVMOrcLookupStateRef S, 65381ad6265SDimitry Andric LLVMErrorRef Err) { 65481ad6265SDimitry Andric LookupState LS; 65581ad6265SDimitry Andric OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(S)); 65681ad6265SDimitry Andric LS.continueLookup(unwrap(Err)); 65781ad6265SDimitry Andric } 65881ad6265SDimitry Andric 6595ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess( 660e8d8bef9SDimitry Andric LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix, 6615ffd83dbSDimitry Andric LLVMOrcSymbolPredicate Filter, void *FilterCtx) { 6625ffd83dbSDimitry Andric assert(Result && "Result can not be null"); 6635ffd83dbSDimitry Andric assert((Filter || !FilterCtx) && 6645ffd83dbSDimitry Andric "if Filter is null then FilterCtx must also be null"); 6655ffd83dbSDimitry Andric 6665ffd83dbSDimitry Andric DynamicLibrarySearchGenerator::SymbolPredicate Pred; 6675ffd83dbSDimitry Andric if (Filter) 6685ffd83dbSDimitry Andric Pred = [=](const SymbolStringPtr &Name) -> bool { 669*5f757f3fSDimitry Andric return Filter(FilterCtx, wrap(SymbolStringPoolEntryUnsafe::from(Name))); 6705ffd83dbSDimitry Andric }; 6715ffd83dbSDimitry Andric 6725ffd83dbSDimitry Andric auto ProcessSymsGenerator = 6735ffd83dbSDimitry Andric DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred); 6745ffd83dbSDimitry Andric 6755ffd83dbSDimitry Andric if (!ProcessSymsGenerator) { 67604eeddc0SDimitry Andric *Result = nullptr; 6775ffd83dbSDimitry Andric return wrap(ProcessSymsGenerator.takeError()); 6785ffd83dbSDimitry Andric } 6795ffd83dbSDimitry Andric 6805ffd83dbSDimitry Andric *Result = wrap(ProcessSymsGenerator->release()); 6815ffd83dbSDimitry Andric return LLVMErrorSuccess; 6825ffd83dbSDimitry Andric } 6835ffd83dbSDimitry Andric 684349cc55cSDimitry Andric LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForPath( 685349cc55cSDimitry Andric LLVMOrcDefinitionGeneratorRef *Result, const char *FileName, 686349cc55cSDimitry Andric char GlobalPrefix, LLVMOrcSymbolPredicate Filter, void *FilterCtx) { 687349cc55cSDimitry Andric assert(Result && "Result can not be null"); 688349cc55cSDimitry Andric assert(FileName && "FileName can not be null"); 689349cc55cSDimitry Andric assert((Filter || !FilterCtx) && 690349cc55cSDimitry Andric "if Filter is null then FilterCtx must also be null"); 691349cc55cSDimitry Andric 692349cc55cSDimitry Andric DynamicLibrarySearchGenerator::SymbolPredicate Pred; 693349cc55cSDimitry Andric if (Filter) 694349cc55cSDimitry Andric Pred = [=](const SymbolStringPtr &Name) -> bool { 695*5f757f3fSDimitry Andric return Filter(FilterCtx, wrap(SymbolStringPoolEntryUnsafe::from(Name))); 696349cc55cSDimitry Andric }; 697349cc55cSDimitry Andric 698349cc55cSDimitry Andric auto LibrarySymsGenerator = 699349cc55cSDimitry Andric DynamicLibrarySearchGenerator::Load(FileName, GlobalPrefix, Pred); 700349cc55cSDimitry Andric 701349cc55cSDimitry Andric if (!LibrarySymsGenerator) { 70204eeddc0SDimitry Andric *Result = nullptr; 703349cc55cSDimitry Andric return wrap(LibrarySymsGenerator.takeError()); 704349cc55cSDimitry Andric } 705349cc55cSDimitry Andric 706349cc55cSDimitry Andric *Result = wrap(LibrarySymsGenerator->release()); 707349cc55cSDimitry Andric return LLVMErrorSuccess; 708349cc55cSDimitry Andric } 709349cc55cSDimitry Andric 710349cc55cSDimitry Andric LLVMErrorRef LLVMOrcCreateStaticLibrarySearchGeneratorForPath( 711349cc55cSDimitry Andric LLVMOrcDefinitionGeneratorRef *Result, LLVMOrcObjectLayerRef ObjLayer, 71206c3fb27SDimitry Andric const char *FileName) { 713349cc55cSDimitry Andric assert(Result && "Result can not be null"); 714349cc55cSDimitry Andric assert(FileName && "Filename can not be null"); 715349cc55cSDimitry Andric assert(ObjLayer && "ObjectLayer can not be null"); 716349cc55cSDimitry Andric 717349cc55cSDimitry Andric auto LibrarySymsGenerator = 718349cc55cSDimitry Andric StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer), FileName); 719349cc55cSDimitry Andric if (!LibrarySymsGenerator) { 72004eeddc0SDimitry Andric *Result = nullptr; 721349cc55cSDimitry Andric return wrap(LibrarySymsGenerator.takeError()); 722349cc55cSDimitry Andric } 723349cc55cSDimitry Andric *Result = wrap(LibrarySymsGenerator->release()); 724349cc55cSDimitry Andric return LLVMErrorSuccess; 725349cc55cSDimitry Andric } 726349cc55cSDimitry Andric 7275ffd83dbSDimitry Andric LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) { 7285ffd83dbSDimitry Andric return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>())); 7295ffd83dbSDimitry Andric } 7305ffd83dbSDimitry Andric 7315ffd83dbSDimitry Andric LLVMContextRef 7325ffd83dbSDimitry Andric LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) { 7335ffd83dbSDimitry Andric return wrap(unwrap(TSCtx)->getContext()); 7345ffd83dbSDimitry Andric } 7355ffd83dbSDimitry Andric 7365ffd83dbSDimitry Andric void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) { 7375ffd83dbSDimitry Andric delete unwrap(TSCtx); 7385ffd83dbSDimitry Andric } 7395ffd83dbSDimitry Andric 740fe6060f1SDimitry Andric LLVMErrorRef 741fe6060f1SDimitry Andric LLVMOrcThreadSafeModuleWithModuleDo(LLVMOrcThreadSafeModuleRef TSM, 742fe6060f1SDimitry Andric LLVMOrcGenericIRModuleOperationFunction F, 743fe6060f1SDimitry Andric void *Ctx) { 744fe6060f1SDimitry Andric return wrap(unwrap(TSM)->withModuleDo( 745fe6060f1SDimitry Andric [&](Module &M) { return unwrap(F(Ctx, wrap(&M))); })); 746fe6060f1SDimitry Andric } 747fe6060f1SDimitry Andric 7485ffd83dbSDimitry Andric LLVMOrcThreadSafeModuleRef 7495ffd83dbSDimitry Andric LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M, 7505ffd83dbSDimitry Andric LLVMOrcThreadSafeContextRef TSCtx) { 7515ffd83dbSDimitry Andric return wrap( 7525ffd83dbSDimitry Andric new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx))); 7535ffd83dbSDimitry Andric } 7545ffd83dbSDimitry Andric 7555ffd83dbSDimitry Andric void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) { 7565ffd83dbSDimitry Andric delete unwrap(TSM); 7575ffd83dbSDimitry Andric } 7585ffd83dbSDimitry Andric 7595ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost( 7605ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef *Result) { 7615ffd83dbSDimitry Andric assert(Result && "Result can not be null"); 7625ffd83dbSDimitry Andric 7635ffd83dbSDimitry Andric auto JTMB = JITTargetMachineBuilder::detectHost(); 7645ffd83dbSDimitry Andric if (!JTMB) { 76504eeddc0SDimitry Andric Result = nullptr; 7665ffd83dbSDimitry Andric return wrap(JTMB.takeError()); 7675ffd83dbSDimitry Andric } 7685ffd83dbSDimitry Andric 7695ffd83dbSDimitry Andric *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB))); 7705ffd83dbSDimitry Andric return LLVMErrorSuccess; 7715ffd83dbSDimitry Andric } 7725ffd83dbSDimitry Andric 7735ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef 774e8d8bef9SDimitry Andric LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM) { 7755ffd83dbSDimitry Andric auto *TemplateTM = unwrap(TM); 7765ffd83dbSDimitry Andric 7775ffd83dbSDimitry Andric auto JTMB = 7785ffd83dbSDimitry Andric std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple()); 7795ffd83dbSDimitry Andric 7805ffd83dbSDimitry Andric (*JTMB) 7815ffd83dbSDimitry Andric .setCPU(TemplateTM->getTargetCPU().str()) 7825ffd83dbSDimitry Andric .setRelocationModel(TemplateTM->getRelocationModel()) 7835ffd83dbSDimitry Andric .setCodeModel(TemplateTM->getCodeModel()) 7845ffd83dbSDimitry Andric .setCodeGenOptLevel(TemplateTM->getOptLevel()) 7855ffd83dbSDimitry Andric .setFeatures(TemplateTM->getTargetFeatureString()) 7865ffd83dbSDimitry Andric .setOptions(TemplateTM->Options); 7875ffd83dbSDimitry Andric 7885ffd83dbSDimitry Andric LLVMDisposeTargetMachine(TM); 7895ffd83dbSDimitry Andric 7905ffd83dbSDimitry Andric return wrap(JTMB.release()); 7915ffd83dbSDimitry Andric } 7925ffd83dbSDimitry Andric 7935ffd83dbSDimitry Andric void LLVMOrcDisposeJITTargetMachineBuilder( 7945ffd83dbSDimitry Andric LLVMOrcJITTargetMachineBuilderRef JTMB) { 7955ffd83dbSDimitry Andric delete unwrap(JTMB); 7965ffd83dbSDimitry Andric } 7975ffd83dbSDimitry Andric 798fe6060f1SDimitry Andric char *LLVMOrcJITTargetMachineBuilderGetTargetTriple( 799fe6060f1SDimitry Andric LLVMOrcJITTargetMachineBuilderRef JTMB) { 800fe6060f1SDimitry Andric auto Tmp = unwrap(JTMB)->getTargetTriple().str(); 801fe6060f1SDimitry Andric char *TargetTriple = (char *)malloc(Tmp.size() + 1); 802fe6060f1SDimitry Andric strcpy(TargetTriple, Tmp.c_str()); 803fe6060f1SDimitry Andric return TargetTriple; 804fe6060f1SDimitry Andric } 805fe6060f1SDimitry Andric 806fe6060f1SDimitry Andric void LLVMOrcJITTargetMachineBuilderSetTargetTriple( 807fe6060f1SDimitry Andric LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple) { 808fe6060f1SDimitry Andric unwrap(JTMB)->getTargetTriple() = Triple(TargetTriple); 809fe6060f1SDimitry Andric } 810fe6060f1SDimitry Andric 811fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcObjectLayerAddObjectFile(LLVMOrcObjectLayerRef ObjLayer, 812fe6060f1SDimitry Andric LLVMOrcJITDylibRef JD, 813fe6060f1SDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 814fe6060f1SDimitry Andric return wrap(unwrap(ObjLayer)->add( 815fe6060f1SDimitry Andric *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 816fe6060f1SDimitry Andric } 817fe6060f1SDimitry Andric 81806c3fb27SDimitry Andric LLVMErrorRef LLVMOrcObjectLayerAddObjectFileWithRT(LLVMOrcObjectLayerRef ObjLayer, 819fe6060f1SDimitry Andric LLVMOrcResourceTrackerRef RT, 820fe6060f1SDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 821fe6060f1SDimitry Andric return wrap( 822fe6060f1SDimitry Andric unwrap(ObjLayer)->add(ResourceTrackerSP(unwrap(RT)), 823fe6060f1SDimitry Andric std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 824fe6060f1SDimitry Andric } 825fe6060f1SDimitry Andric 826fe6060f1SDimitry Andric void LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer, 827fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityRef R, 828fe6060f1SDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 829fe6060f1SDimitry Andric unwrap(ObjLayer)->emit( 830fe6060f1SDimitry Andric std::unique_ptr<MaterializationResponsibility>(unwrap(R)), 831fe6060f1SDimitry Andric std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))); 832fe6060f1SDimitry Andric } 833fe6060f1SDimitry Andric 834d409305fSDimitry Andric void LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer) { 835e8d8bef9SDimitry Andric delete unwrap(ObjLayer); 836e8d8bef9SDimitry Andric } 837e8d8bef9SDimitry Andric 838fe6060f1SDimitry Andric void LLVMOrcIRTransformLayerSetTransform( 839fe6060f1SDimitry Andric LLVMOrcIRTransformLayerRef IRTransformLayer, 840fe6060f1SDimitry Andric LLVMOrcIRTransformLayerTransformFunction TransformFunction, void *Ctx) { 841fe6060f1SDimitry Andric unwrap(IRTransformLayer) 842fe6060f1SDimitry Andric ->setTransform( 843fe6060f1SDimitry Andric [=](ThreadSafeModule TSM, 844fe6060f1SDimitry Andric MaterializationResponsibility &R) -> Expected<ThreadSafeModule> { 845fe6060f1SDimitry Andric LLVMOrcThreadSafeModuleRef TSMRef = 846fe6060f1SDimitry Andric wrap(new ThreadSafeModule(std::move(TSM))); 847fe6060f1SDimitry Andric if (LLVMErrorRef Err = TransformFunction(Ctx, &TSMRef, wrap(&R))) { 848fe6060f1SDimitry Andric assert(!TSMRef && "TSMRef was not reset to null on error"); 849fe6060f1SDimitry Andric return unwrap(Err); 850fe6060f1SDimitry Andric } 851bdd1243dSDimitry Andric assert(TSMRef && "Transform succeeded, but TSMRef was set to null"); 852bdd1243dSDimitry Andric ThreadSafeModule Result = std::move(*unwrap(TSMRef)); 853bdd1243dSDimitry Andric LLVMOrcDisposeThreadSafeModule(TSMRef); 854bdd1243dSDimitry Andric return std::move(Result); 855fe6060f1SDimitry Andric }); 856fe6060f1SDimitry Andric } 857fe6060f1SDimitry Andric 858fe6060f1SDimitry Andric void LLVMOrcObjectTransformLayerSetTransform( 859fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerRef ObjTransformLayer, 860fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerTransformFunction TransformFunction, void *Ctx) { 861fe6060f1SDimitry Andric unwrap(ObjTransformLayer) 862fe6060f1SDimitry Andric ->setTransform([TransformFunction, Ctx](std::unique_ptr<MemoryBuffer> Obj) 863fe6060f1SDimitry Andric -> Expected<std::unique_ptr<MemoryBuffer>> { 864fe6060f1SDimitry Andric LLVMMemoryBufferRef ObjBuffer = wrap(Obj.release()); 865fe6060f1SDimitry Andric if (LLVMErrorRef Err = TransformFunction(Ctx, &ObjBuffer)) { 866fe6060f1SDimitry Andric assert(!ObjBuffer && "ObjBuffer was not reset to null on error"); 867fe6060f1SDimitry Andric return unwrap(Err); 868fe6060f1SDimitry Andric } 869fe6060f1SDimitry Andric return std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)); 870fe6060f1SDimitry Andric }); 871fe6060f1SDimitry Andric } 872fe6060f1SDimitry Andric 873fe6060f1SDimitry Andric LLVMOrcDumpObjectsRef LLVMOrcCreateDumpObjects(const char *DumpDir, 874fe6060f1SDimitry Andric const char *IdentifierOverride) { 875fe6060f1SDimitry Andric assert(DumpDir && "DumpDir should not be null"); 876fe6060f1SDimitry Andric assert(IdentifierOverride && "IdentifierOverride should not be null"); 877fe6060f1SDimitry Andric return wrap(new DumpObjects(DumpDir, IdentifierOverride)); 878fe6060f1SDimitry Andric } 879fe6060f1SDimitry Andric 880fe6060f1SDimitry Andric void LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects) { 881fe6060f1SDimitry Andric delete unwrap(DumpObjects); 882fe6060f1SDimitry Andric } 883fe6060f1SDimitry Andric 884fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcDumpObjects_CallOperator(LLVMOrcDumpObjectsRef DumpObjects, 885fe6060f1SDimitry Andric LLVMMemoryBufferRef *ObjBuffer) { 886fe6060f1SDimitry Andric std::unique_ptr<MemoryBuffer> OB(unwrap(*ObjBuffer)); 887fe6060f1SDimitry Andric if (auto Result = (*unwrap(DumpObjects))(std::move(OB))) { 888fe6060f1SDimitry Andric *ObjBuffer = wrap(Result->release()); 889fe6060f1SDimitry Andric return LLVMErrorSuccess; 890fe6060f1SDimitry Andric } else { 891fe6060f1SDimitry Andric *ObjBuffer = nullptr; 892fe6060f1SDimitry Andric return wrap(Result.takeError()); 893fe6060f1SDimitry Andric } 894fe6060f1SDimitry Andric } 895fe6060f1SDimitry Andric 8965ffd83dbSDimitry Andric LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) { 8975ffd83dbSDimitry Andric return wrap(new LLJITBuilder()); 8985ffd83dbSDimitry Andric } 8995ffd83dbSDimitry Andric 9005ffd83dbSDimitry Andric void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) { 9015ffd83dbSDimitry Andric delete unwrap(Builder); 9025ffd83dbSDimitry Andric } 9035ffd83dbSDimitry Andric 9045ffd83dbSDimitry Andric void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder( 9055ffd83dbSDimitry Andric LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) { 906fe6060f1SDimitry Andric unwrap(Builder)->setJITTargetMachineBuilder(std::move(*unwrap(JTMB))); 907fe6060f1SDimitry Andric LLVMOrcDisposeJITTargetMachineBuilder(JTMB); 9085ffd83dbSDimitry Andric } 9095ffd83dbSDimitry Andric 910e8d8bef9SDimitry Andric void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator( 911e8d8bef9SDimitry Andric LLVMOrcLLJITBuilderRef Builder, 912e8d8bef9SDimitry Andric LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx) { 913e8d8bef9SDimitry Andric unwrap(Builder)->setObjectLinkingLayerCreator( 914e8d8bef9SDimitry Andric [=](ExecutionSession &ES, const Triple &TT) { 915e8d8bef9SDimitry Andric auto TTStr = TT.str(); 916e8d8bef9SDimitry Andric return std::unique_ptr<ObjectLayer>( 917e8d8bef9SDimitry Andric unwrap(F(Ctx, wrap(&ES), TTStr.c_str()))); 918e8d8bef9SDimitry Andric }); 919e8d8bef9SDimitry Andric } 920e8d8bef9SDimitry Andric 9215ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result, 9225ffd83dbSDimitry Andric LLVMOrcLLJITBuilderRef Builder) { 9235ffd83dbSDimitry Andric assert(Result && "Result can not be null"); 9245ffd83dbSDimitry Andric 9255ffd83dbSDimitry Andric if (!Builder) 9265ffd83dbSDimitry Andric Builder = LLVMOrcCreateLLJITBuilder(); 9275ffd83dbSDimitry Andric 9285ffd83dbSDimitry Andric auto J = unwrap(Builder)->create(); 9295ffd83dbSDimitry Andric LLVMOrcDisposeLLJITBuilder(Builder); 9305ffd83dbSDimitry Andric 9315ffd83dbSDimitry Andric if (!J) { 93204eeddc0SDimitry Andric Result = nullptr; 9335ffd83dbSDimitry Andric return wrap(J.takeError()); 9345ffd83dbSDimitry Andric } 9355ffd83dbSDimitry Andric 9365ffd83dbSDimitry Andric *Result = wrap(J->release()); 9375ffd83dbSDimitry Andric return LLVMErrorSuccess; 9385ffd83dbSDimitry Andric } 9395ffd83dbSDimitry Andric 9405ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) { 9415ffd83dbSDimitry Andric delete unwrap(J); 9425ffd83dbSDimitry Andric return LLVMErrorSuccess; 9435ffd83dbSDimitry Andric } 9445ffd83dbSDimitry Andric 9455ffd83dbSDimitry Andric LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) { 9465ffd83dbSDimitry Andric return wrap(&unwrap(J)->getExecutionSession()); 9475ffd83dbSDimitry Andric } 9485ffd83dbSDimitry Andric 9495ffd83dbSDimitry Andric LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) { 9505ffd83dbSDimitry Andric return wrap(&unwrap(J)->getMainJITDylib()); 9515ffd83dbSDimitry Andric } 9525ffd83dbSDimitry Andric 9535ffd83dbSDimitry Andric const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) { 9545ffd83dbSDimitry Andric return unwrap(J)->getTargetTriple().str().c_str(); 9555ffd83dbSDimitry Andric } 9565ffd83dbSDimitry Andric 9575ffd83dbSDimitry Andric char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) { 9585ffd83dbSDimitry Andric return unwrap(J)->getDataLayout().getGlobalPrefix(); 9595ffd83dbSDimitry Andric } 9605ffd83dbSDimitry Andric 9615ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef 9625ffd83dbSDimitry Andric LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) { 963*5f757f3fSDimitry Andric return wrap(SymbolStringPoolEntryUnsafe::take( 9645ffd83dbSDimitry Andric unwrap(J)->mangleAndIntern(UnmangledName))); 9655ffd83dbSDimitry Andric } 9665ffd83dbSDimitry Andric 9675ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD, 9685ffd83dbSDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 9695ffd83dbSDimitry Andric return wrap(unwrap(J)->addObjectFile( 9705ffd83dbSDimitry Andric *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 9715ffd83dbSDimitry Andric } 9725ffd83dbSDimitry Andric 973e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J, 974e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef RT, 975e8d8bef9SDimitry Andric LLVMMemoryBufferRef ObjBuffer) { 976e8d8bef9SDimitry Andric return wrap(unwrap(J)->addObjectFile( 977e8d8bef9SDimitry Andric ResourceTrackerSP(unwrap(RT)), 978e8d8bef9SDimitry Andric std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 979e8d8bef9SDimitry Andric } 980e8d8bef9SDimitry Andric 9815ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J, 9825ffd83dbSDimitry Andric LLVMOrcJITDylibRef JD, 9835ffd83dbSDimitry Andric LLVMOrcThreadSafeModuleRef TSM) { 984e8d8bef9SDimitry Andric std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 985e8d8bef9SDimitry Andric return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM))); 986e8d8bef9SDimitry Andric } 987e8d8bef9SDimitry Andric 988e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J, 989e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef RT, 990e8d8bef9SDimitry Andric LLVMOrcThreadSafeModuleRef TSM) { 991e8d8bef9SDimitry Andric std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 992e8d8bef9SDimitry Andric return wrap(unwrap(J)->addIRModule(ResourceTrackerSP(unwrap(RT)), 993e8d8bef9SDimitry Andric std::move(*TmpTSM))); 9945ffd83dbSDimitry Andric } 9955ffd83dbSDimitry Andric 9965ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J, 9975ffd83dbSDimitry Andric LLVMOrcJITTargetAddress *Result, 9985ffd83dbSDimitry Andric const char *Name) { 9995ffd83dbSDimitry Andric assert(Result && "Result can not be null"); 10005ffd83dbSDimitry Andric 10015ffd83dbSDimitry Andric auto Sym = unwrap(J)->lookup(Name); 10025ffd83dbSDimitry Andric if (!Sym) { 10035ffd83dbSDimitry Andric *Result = 0; 10045ffd83dbSDimitry Andric return wrap(Sym.takeError()); 10055ffd83dbSDimitry Andric } 10065ffd83dbSDimitry Andric 100781ad6265SDimitry Andric *Result = Sym->getValue(); 10085ffd83dbSDimitry Andric return LLVMErrorSuccess; 10095ffd83dbSDimitry Andric } 1010e8d8bef9SDimitry Andric 1011fe6060f1SDimitry Andric LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J) { 1012fe6060f1SDimitry Andric return wrap(&unwrap(J)->getObjLinkingLayer()); 1013fe6060f1SDimitry Andric } 1014fe6060f1SDimitry Andric 1015fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerRef 1016fe6060f1SDimitry Andric LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J) { 1017fe6060f1SDimitry Andric return wrap(&unwrap(J)->getObjTransformLayer()); 1018fe6060f1SDimitry Andric } 1019fe6060f1SDimitry Andric 1020e8d8bef9SDimitry Andric LLVMOrcObjectLayerRef 1021e8d8bef9SDimitry Andric LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager( 1022e8d8bef9SDimitry Andric LLVMOrcExecutionSessionRef ES) { 1023e8d8bef9SDimitry Andric assert(ES && "ES must not be null"); 1024e8d8bef9SDimitry Andric return wrap(new RTDyldObjectLinkingLayer( 1025e8d8bef9SDimitry Andric *unwrap(ES), [] { return std::make_unique<SectionMemoryManager>(); })); 1026e8d8bef9SDimitry Andric } 1027e8d8bef9SDimitry Andric 1028bdd1243dSDimitry Andric LLVMOrcObjectLayerRef 1029bdd1243dSDimitry Andric LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks( 1030bdd1243dSDimitry Andric LLVMOrcExecutionSessionRef ES, void *CreateContextCtx, 1031bdd1243dSDimitry Andric LLVMMemoryManagerCreateContextCallback CreateContext, 1032bdd1243dSDimitry Andric LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating, 1033bdd1243dSDimitry Andric LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection, 1034bdd1243dSDimitry Andric LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection, 1035bdd1243dSDimitry Andric LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory, 1036bdd1243dSDimitry Andric LLVMMemoryManagerDestroyCallback Destroy) { 1037bdd1243dSDimitry Andric 1038bdd1243dSDimitry Andric struct MCJITMemoryManagerLikeCallbacks { 1039bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacks() = default; 1040bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacks( 1041bdd1243dSDimitry Andric void *CreateContextCtx, 1042bdd1243dSDimitry Andric LLVMMemoryManagerCreateContextCallback CreateContext, 1043bdd1243dSDimitry Andric LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating, 1044bdd1243dSDimitry Andric LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection, 1045bdd1243dSDimitry Andric LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection, 1046bdd1243dSDimitry Andric LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory, 1047bdd1243dSDimitry Andric LLVMMemoryManagerDestroyCallback Destroy) 1048bdd1243dSDimitry Andric : CreateContextCtx(CreateContextCtx), CreateContext(CreateContext), 1049bdd1243dSDimitry Andric NotifyTerminating(NotifyTerminating), 1050bdd1243dSDimitry Andric AllocateCodeSection(AllocateCodeSection), 1051bdd1243dSDimitry Andric AllocateDataSection(AllocateDataSection), 1052bdd1243dSDimitry Andric FinalizeMemory(FinalizeMemory), Destroy(Destroy) {} 1053bdd1243dSDimitry Andric 1054bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacks(MCJITMemoryManagerLikeCallbacks &&Other) { 1055bdd1243dSDimitry Andric std::swap(CreateContextCtx, Other.CreateContextCtx); 1056bdd1243dSDimitry Andric std::swap(CreateContext, Other.CreateContext); 1057bdd1243dSDimitry Andric std::swap(NotifyTerminating, Other.NotifyTerminating); 1058bdd1243dSDimitry Andric std::swap(AllocateCodeSection, Other.AllocateCodeSection); 1059bdd1243dSDimitry Andric std::swap(AllocateDataSection, Other.AllocateDataSection); 1060bdd1243dSDimitry Andric std::swap(FinalizeMemory, Other.FinalizeMemory); 1061bdd1243dSDimitry Andric std::swap(Destroy, Other.Destroy); 1062bdd1243dSDimitry Andric } 1063bdd1243dSDimitry Andric 1064bdd1243dSDimitry Andric ~MCJITMemoryManagerLikeCallbacks() { 1065bdd1243dSDimitry Andric if (NotifyTerminating) 1066bdd1243dSDimitry Andric NotifyTerminating(CreateContextCtx); 1067bdd1243dSDimitry Andric } 1068bdd1243dSDimitry Andric 1069bdd1243dSDimitry Andric void *CreateContextCtx = nullptr; 1070bdd1243dSDimitry Andric LLVMMemoryManagerCreateContextCallback CreateContext = nullptr; 1071bdd1243dSDimitry Andric LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating = nullptr; 1072bdd1243dSDimitry Andric LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection = nullptr; 1073bdd1243dSDimitry Andric LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection = nullptr; 1074bdd1243dSDimitry Andric LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory = nullptr; 1075bdd1243dSDimitry Andric LLVMMemoryManagerDestroyCallback Destroy = nullptr; 1076bdd1243dSDimitry Andric }; 1077bdd1243dSDimitry Andric 1078bdd1243dSDimitry Andric class MCJITMemoryManagerLikeCallbacksMemMgr : public RTDyldMemoryManager { 1079bdd1243dSDimitry Andric public: 1080bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacksMemMgr( 1081bdd1243dSDimitry Andric const MCJITMemoryManagerLikeCallbacks &CBs) 1082bdd1243dSDimitry Andric : CBs(CBs) { 1083bdd1243dSDimitry Andric Opaque = CBs.CreateContext(CBs.CreateContextCtx); 1084bdd1243dSDimitry Andric } 1085bdd1243dSDimitry Andric ~MCJITMemoryManagerLikeCallbacksMemMgr() override { CBs.Destroy(Opaque); } 1086bdd1243dSDimitry Andric 1087bdd1243dSDimitry Andric uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, 1088bdd1243dSDimitry Andric unsigned SectionID, 1089bdd1243dSDimitry Andric StringRef SectionName) override { 1090bdd1243dSDimitry Andric return CBs.AllocateCodeSection(Opaque, Size, Alignment, SectionID, 1091bdd1243dSDimitry Andric SectionName.str().c_str()); 1092bdd1243dSDimitry Andric } 1093bdd1243dSDimitry Andric 1094bdd1243dSDimitry Andric uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, 1095bdd1243dSDimitry Andric unsigned SectionID, StringRef SectionName, 1096bdd1243dSDimitry Andric bool isReadOnly) override { 1097bdd1243dSDimitry Andric return CBs.AllocateDataSection(Opaque, Size, Alignment, SectionID, 1098bdd1243dSDimitry Andric SectionName.str().c_str(), isReadOnly); 1099bdd1243dSDimitry Andric } 1100bdd1243dSDimitry Andric 1101bdd1243dSDimitry Andric bool finalizeMemory(std::string *ErrMsg) override { 1102bdd1243dSDimitry Andric char *ErrMsgCString = nullptr; 1103bdd1243dSDimitry Andric bool Result = CBs.FinalizeMemory(Opaque, &ErrMsgCString); 1104bdd1243dSDimitry Andric assert((Result || !ErrMsgCString) && 1105bdd1243dSDimitry Andric "Did not expect an error message if FinalizeMemory succeeded"); 1106bdd1243dSDimitry Andric if (ErrMsgCString) { 1107bdd1243dSDimitry Andric if (ErrMsg) 1108bdd1243dSDimitry Andric *ErrMsg = ErrMsgCString; 1109bdd1243dSDimitry Andric free(ErrMsgCString); 1110bdd1243dSDimitry Andric } 1111bdd1243dSDimitry Andric return Result; 1112bdd1243dSDimitry Andric } 1113bdd1243dSDimitry Andric 1114bdd1243dSDimitry Andric private: 1115bdd1243dSDimitry Andric const MCJITMemoryManagerLikeCallbacks &CBs; 1116bdd1243dSDimitry Andric void *Opaque = nullptr; 1117bdd1243dSDimitry Andric }; 1118bdd1243dSDimitry Andric 1119bdd1243dSDimitry Andric assert(ES && "ES must not be null"); 1120bdd1243dSDimitry Andric assert(CreateContext && "CreateContext must not be null"); 1121bdd1243dSDimitry Andric assert(NotifyTerminating && "NotifyTerminating must not be null"); 1122bdd1243dSDimitry Andric assert(AllocateCodeSection && "AllocateCodeSection must not be null"); 1123bdd1243dSDimitry Andric assert(AllocateDataSection && "AllocateDataSection must not be null"); 1124bdd1243dSDimitry Andric assert(FinalizeMemory && "FinalizeMemory must not be null"); 1125bdd1243dSDimitry Andric assert(Destroy && "Destroy must not be null"); 1126bdd1243dSDimitry Andric 1127bdd1243dSDimitry Andric MCJITMemoryManagerLikeCallbacks CBs( 1128bdd1243dSDimitry Andric CreateContextCtx, CreateContext, NotifyTerminating, AllocateCodeSection, 1129bdd1243dSDimitry Andric AllocateDataSection, FinalizeMemory, Destroy); 1130bdd1243dSDimitry Andric 1131bdd1243dSDimitry Andric return wrap(new RTDyldObjectLinkingLayer(*unwrap(ES), [CBs = std::move(CBs)] { 1132bdd1243dSDimitry Andric return std::make_unique<MCJITMemoryManagerLikeCallbacksMemMgr>(CBs); 1133bdd1243dSDimitry Andric })); 1134bdd1243dSDimitry Andric 1135bdd1243dSDimitry Andric return nullptr; 1136bdd1243dSDimitry Andric } 1137bdd1243dSDimitry Andric 1138e8d8bef9SDimitry Andric void LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener( 1139e8d8bef9SDimitry Andric LLVMOrcObjectLayerRef RTDyldObjLinkingLayer, 1140e8d8bef9SDimitry Andric LLVMJITEventListenerRef Listener) { 1141e8d8bef9SDimitry Andric assert(RTDyldObjLinkingLayer && "RTDyldObjLinkingLayer must not be null"); 1142e8d8bef9SDimitry Andric assert(Listener && "Listener must not be null"); 1143e8d8bef9SDimitry Andric reinterpret_cast<RTDyldObjectLinkingLayer *>(unwrap(RTDyldObjLinkingLayer)) 1144e8d8bef9SDimitry Andric ->registerJITEventListener(*unwrap(Listener)); 1145e8d8bef9SDimitry Andric } 1146fe6060f1SDimitry Andric 1147fe6060f1SDimitry Andric LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J) { 1148fe6060f1SDimitry Andric return wrap(&unwrap(J)->getIRTransformLayer()); 1149fe6060f1SDimitry Andric } 1150fe6060f1SDimitry Andric 1151fe6060f1SDimitry Andric const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J) { 1152fe6060f1SDimitry Andric return unwrap(J)->getDataLayout().getStringRepresentation().c_str(); 1153fe6060f1SDimitry Andric } 1154fe6060f1SDimitry Andric 1155fe6060f1SDimitry Andric LLVMOrcIndirectStubsManagerRef 1156fe6060f1SDimitry Andric LLVMOrcCreateLocalIndirectStubsManager(const char *TargetTriple) { 1157fe6060f1SDimitry Andric auto builder = createLocalIndirectStubsManagerBuilder(Triple(TargetTriple)); 1158fe6060f1SDimitry Andric return wrap(builder().release()); 1159fe6060f1SDimitry Andric } 1160fe6060f1SDimitry Andric 1161fe6060f1SDimitry Andric void LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM) { 1162fe6060f1SDimitry Andric std::unique_ptr<IndirectStubsManager> TmpISM(unwrap(ISM)); 1163fe6060f1SDimitry Andric } 1164fe6060f1SDimitry Andric 1165fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcCreateLocalLazyCallThroughManager( 1166fe6060f1SDimitry Andric const char *TargetTriple, LLVMOrcExecutionSessionRef ES, 1167fe6060f1SDimitry Andric LLVMOrcJITTargetAddress ErrorHandlerAddr, 1168fe6060f1SDimitry Andric LLVMOrcLazyCallThroughManagerRef *Result) { 116906c3fb27SDimitry Andric auto LCTM = createLocalLazyCallThroughManager( 117006c3fb27SDimitry Andric Triple(TargetTriple), *unwrap(ES), ExecutorAddr(ErrorHandlerAddr)); 1171fe6060f1SDimitry Andric 1172fe6060f1SDimitry Andric if (!LCTM) 1173fe6060f1SDimitry Andric return wrap(LCTM.takeError()); 1174fe6060f1SDimitry Andric *Result = wrap(LCTM->release()); 1175fe6060f1SDimitry Andric return LLVMErrorSuccess; 1176fe6060f1SDimitry Andric } 1177fe6060f1SDimitry Andric 1178fe6060f1SDimitry Andric void LLVMOrcDisposeLazyCallThroughManager( 1179fe6060f1SDimitry Andric LLVMOrcLazyCallThroughManagerRef LCM) { 1180fe6060f1SDimitry Andric std::unique_ptr<LazyCallThroughManager> TmpLCM(unwrap(LCM)); 1181fe6060f1SDimitry Andric } 1182