Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp
35266 views
//===--------------- OrcV2CBindings.cpp - C bindings OrcV2 APIs -----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm-c/LLJIT.h"9#include "llvm-c/Orc.h"10#include "llvm-c/OrcEE.h"11#include "llvm-c/TargetMachine.h"1213#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"14#include "llvm/ExecutionEngine/Orc/LLJIT.h"15#include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"16#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"17#include "llvm/ExecutionEngine/SectionMemoryManager.h"1819using namespace llvm;20using namespace llvm::orc;2122namespace llvm {23namespace orc {2425class InProgressLookupState;2627class OrcV2CAPIHelper {28public:29static InProgressLookupState *extractLookupState(LookupState &LS) {30return LS.IPLS.release();31}3233static void resetLookupState(LookupState &LS, InProgressLookupState *IPLS) {34return LS.reset(IPLS);35}36};3738} // namespace orc39} // namespace llvm4041inline LLVMOrcSymbolStringPoolEntryRef wrap(SymbolStringPoolEntryUnsafe E) {42return reinterpret_cast<LLVMOrcSymbolStringPoolEntryRef>(E.rawPtr());43}4445inline SymbolStringPoolEntryUnsafe unwrap(LLVMOrcSymbolStringPoolEntryRef E) {46return reinterpret_cast<SymbolStringPoolEntryUnsafe::PoolEntry *>(E);47}4849DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef)50DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef)51DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationUnit,52LLVMOrcMaterializationUnitRef)53DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationResponsibility,54LLVMOrcMaterializationResponsibilityRef)55DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)56DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef)57DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator,58LLVMOrcDefinitionGeneratorRef)59DEFINE_SIMPLE_CONVERSION_FUNCTIONS(InProgressLookupState, LLVMOrcLookupStateRef)60DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext,61LLVMOrcThreadSafeContextRef)62DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef)63DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder,64LLVMOrcJITTargetMachineBuilderRef)65DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectLayer, LLVMOrcObjectLayerRef)66DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRTransformLayer, LLVMOrcIRTransformLayerRef)67DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectTransformLayer,68LLVMOrcObjectTransformLayerRef)69DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DumpObjects, LLVMOrcDumpObjectsRef)70DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IndirectStubsManager,71LLVMOrcIndirectStubsManagerRef)72DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LazyCallThroughManager,73LLVMOrcLazyCallThroughManagerRef)74DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef)75DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef)76DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)7778namespace {7980class OrcCAPIMaterializationUnit : public llvm::orc::MaterializationUnit {81public:82OrcCAPIMaterializationUnit(83std::string Name, SymbolFlagsMap InitialSymbolFlags,84SymbolStringPtr InitSymbol, void *Ctx,85LLVMOrcMaterializationUnitMaterializeFunction Materialize,86LLVMOrcMaterializationUnitDiscardFunction Discard,87LLVMOrcMaterializationUnitDestroyFunction Destroy)88: llvm::orc::MaterializationUnit(89Interface(std::move(InitialSymbolFlags), std::move(InitSymbol))),90Name(std::move(Name)), Ctx(Ctx), Materialize(Materialize),91Discard(Discard), Destroy(Destroy) {}9293~OrcCAPIMaterializationUnit() {94if (Ctx)95Destroy(Ctx);96}9798StringRef getName() const override { return Name; }99100void materialize(std::unique_ptr<MaterializationResponsibility> R) override {101void *Tmp = Ctx;102Ctx = nullptr;103Materialize(Tmp, wrap(R.release()));104}105106private:107void discard(const JITDylib &JD, const SymbolStringPtr &Name) override {108Discard(Ctx, wrap(&JD), wrap(SymbolStringPoolEntryUnsafe::from(Name)));109}110111std::string Name;112void *Ctx = nullptr;113LLVMOrcMaterializationUnitMaterializeFunction Materialize = nullptr;114LLVMOrcMaterializationUnitDiscardFunction Discard = nullptr;115LLVMOrcMaterializationUnitDestroyFunction Destroy = nullptr;116};117118static JITSymbolFlags toJITSymbolFlags(LLVMJITSymbolFlags F) {119120JITSymbolFlags JSF;121122if (F.GenericFlags & LLVMJITSymbolGenericFlagsExported)123JSF |= JITSymbolFlags::Exported;124if (F.GenericFlags & LLVMJITSymbolGenericFlagsWeak)125JSF |= JITSymbolFlags::Weak;126if (F.GenericFlags & LLVMJITSymbolGenericFlagsCallable)127JSF |= JITSymbolFlags::Callable;128if (F.GenericFlags & LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly)129JSF |= JITSymbolFlags::MaterializationSideEffectsOnly;130131JSF.getTargetFlags() = F.TargetFlags;132133return JSF;134}135136static LLVMJITSymbolFlags fromJITSymbolFlags(JITSymbolFlags JSF) {137LLVMJITSymbolFlags F = {0, 0};138if (JSF & JITSymbolFlags::Exported)139F.GenericFlags |= LLVMJITSymbolGenericFlagsExported;140if (JSF & JITSymbolFlags::Weak)141F.GenericFlags |= LLVMJITSymbolGenericFlagsWeak;142if (JSF & JITSymbolFlags::Callable)143F.GenericFlags |= LLVMJITSymbolGenericFlagsCallable;144if (JSF & JITSymbolFlags::MaterializationSideEffectsOnly)145F.GenericFlags |= LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly;146147F.TargetFlags = JSF.getTargetFlags();148149return F;150}151152static SymbolNameSet toSymbolNameSet(LLVMOrcCSymbolsList Symbols) {153SymbolNameSet Result;154Result.reserve(Symbols.Length);155for (size_t I = 0; I != Symbols.Length; ++I)156Result.insert(unwrap(Symbols.Symbols[I]).moveToSymbolStringPtr());157return Result;158}159160static SymbolMap toSymbolMap(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) {161SymbolMap SM;162for (size_t I = 0; I != NumPairs; ++I) {163JITSymbolFlags Flags = toJITSymbolFlags(Syms[I].Sym.Flags);164SM[unwrap(Syms[I].Name).moveToSymbolStringPtr()] = {165ExecutorAddr(Syms[I].Sym.Address), Flags};166}167return SM;168}169170static SymbolDependenceMap171toSymbolDependenceMap(LLVMOrcCDependenceMapPairs Pairs, size_t NumPairs) {172SymbolDependenceMap SDM;173for (size_t I = 0; I != NumPairs; ++I) {174JITDylib *JD = unwrap(Pairs[I].JD);175SymbolNameSet Names;176177for (size_t J = 0; J != Pairs[I].Names.Length; ++J) {178auto Sym = Pairs[I].Names.Symbols[J];179Names.insert(unwrap(Sym).moveToSymbolStringPtr());180}181SDM[JD] = Names;182}183return SDM;184}185186static LookupKind toLookupKind(LLVMOrcLookupKind K) {187switch (K) {188case LLVMOrcLookupKindStatic:189return LookupKind::Static;190case LLVMOrcLookupKindDLSym:191return LookupKind::DLSym;192}193llvm_unreachable("unrecognized LLVMOrcLookupKind value");194}195196static LLVMOrcLookupKind fromLookupKind(LookupKind K) {197switch (K) {198case LookupKind::Static:199return LLVMOrcLookupKindStatic;200case LookupKind::DLSym:201return LLVMOrcLookupKindDLSym;202}203llvm_unreachable("unrecognized LookupKind value");204}205206static JITDylibLookupFlags207toJITDylibLookupFlags(LLVMOrcJITDylibLookupFlags LF) {208switch (LF) {209case LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly:210return JITDylibLookupFlags::MatchExportedSymbolsOnly;211case LLVMOrcJITDylibLookupFlagsMatchAllSymbols:212return JITDylibLookupFlags::MatchAllSymbols;213}214llvm_unreachable("unrecognized LLVMOrcJITDylibLookupFlags value");215}216217static LLVMOrcJITDylibLookupFlags218fromJITDylibLookupFlags(JITDylibLookupFlags LF) {219switch (LF) {220case JITDylibLookupFlags::MatchExportedSymbolsOnly:221return LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly;222case JITDylibLookupFlags::MatchAllSymbols:223return LLVMOrcJITDylibLookupFlagsMatchAllSymbols;224}225llvm_unreachable("unrecognized JITDylibLookupFlags value");226}227228static SymbolLookupFlags toSymbolLookupFlags(LLVMOrcSymbolLookupFlags SLF) {229switch (SLF) {230case LLVMOrcSymbolLookupFlagsRequiredSymbol:231return SymbolLookupFlags::RequiredSymbol;232case LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol:233return SymbolLookupFlags::WeaklyReferencedSymbol;234}235llvm_unreachable("unrecognized LLVMOrcSymbolLookupFlags value");236}237238static LLVMOrcSymbolLookupFlags fromSymbolLookupFlags(SymbolLookupFlags SLF) {239switch (SLF) {240case SymbolLookupFlags::RequiredSymbol:241return LLVMOrcSymbolLookupFlagsRequiredSymbol;242case SymbolLookupFlags::WeaklyReferencedSymbol:243return LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol;244}245llvm_unreachable("unrecognized SymbolLookupFlags value");246}247248static LLVMJITEvaluatedSymbol249fromExecutorSymbolDef(const ExecutorSymbolDef &S) {250return {S.getAddress().getValue(), fromJITSymbolFlags(S.getFlags())};251}252253} // end anonymous namespace254255namespace llvm {256namespace orc {257258class CAPIDefinitionGenerator final : public DefinitionGenerator {259public:260CAPIDefinitionGenerator(261LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose, void *Ctx,262LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)263: Dispose(Dispose), Ctx(Ctx), TryToGenerate(TryToGenerate) {}264265~CAPIDefinitionGenerator() {266if (Dispose)267Dispose(Ctx);268}269270Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,271JITDylibLookupFlags JDLookupFlags,272const SymbolLookupSet &LookupSet) override {273274// Take the lookup state.275LLVMOrcLookupStateRef LSR = ::wrap(OrcV2CAPIHelper::extractLookupState(LS));276277// Translate the lookup kind.278LLVMOrcLookupKind CLookupKind = fromLookupKind(K);279280// Translate the JITDylibLookupFlags.281LLVMOrcJITDylibLookupFlags CJDLookupFlags =282fromJITDylibLookupFlags(JDLookupFlags);283284// Translate the lookup set.285std::vector<LLVMOrcCLookupSetElement> CLookupSet;286CLookupSet.reserve(LookupSet.size());287for (auto &KV : LookupSet) {288LLVMOrcSymbolStringPoolEntryRef Name =289::wrap(SymbolStringPoolEntryUnsafe::from(KV.first));290LLVMOrcSymbolLookupFlags SLF = fromSymbolLookupFlags(KV.second);291CLookupSet.push_back({Name, SLF});292}293294// Run the C TryToGenerate function.295auto Err = unwrap(TryToGenerate(::wrap(this), Ctx, &LSR, CLookupKind,296::wrap(&JD), CJDLookupFlags,297CLookupSet.data(), CLookupSet.size()));298299// Restore the lookup state.300OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(LSR));301302return Err;303}304305private:306LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose;307void *Ctx;308LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate;309};310311} // end namespace orc312} // end namespace llvm313314void LLVMOrcExecutionSessionSetErrorReporter(315LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError,316void *Ctx) {317unwrap(ES)->setErrorReporter(318[=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); });319}320321LLVMOrcSymbolStringPoolRef322LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) {323return wrap(324unwrap(ES)->getExecutorProcessControl().getSymbolStringPool().get());325}326327void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) {328unwrap(SSP)->clearDeadEntries();329}330331LLVMOrcSymbolStringPoolEntryRef332LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {333return wrap(SymbolStringPoolEntryUnsafe::take(unwrap(ES)->intern(Name)));334}335336void LLVMOrcExecutionSessionLookup(337LLVMOrcExecutionSessionRef ES, LLVMOrcLookupKind K,338LLVMOrcCJITDylibSearchOrder SearchOrder, size_t SearchOrderSize,339LLVMOrcCLookupSet Symbols, size_t SymbolsSize,340LLVMOrcExecutionSessionLookupHandleResultFunction HandleResult, void *Ctx) {341assert(ES && "ES cannot be null");342assert(SearchOrder && "SearchOrder cannot be null");343assert(Symbols && "Symbols cannot be null");344assert(HandleResult && "HandleResult cannot be null");345346JITDylibSearchOrder SO;347for (size_t I = 0; I != SearchOrderSize; ++I)348SO.push_back({unwrap(SearchOrder[I].JD),349toJITDylibLookupFlags(SearchOrder[I].JDLookupFlags)});350351SymbolLookupSet SLS;352for (size_t I = 0; I != SymbolsSize; ++I)353SLS.add(unwrap(Symbols[I].Name).moveToSymbolStringPtr(),354toSymbolLookupFlags(Symbols[I].LookupFlags));355356unwrap(ES)->lookup(357toLookupKind(K), SO, std::move(SLS), SymbolState::Ready,358[HandleResult, Ctx](Expected<SymbolMap> Result) {359if (Result) {360SmallVector<LLVMOrcCSymbolMapPair> CResult;361for (auto &KV : *Result)362CResult.push_back(LLVMOrcCSymbolMapPair{363wrap(SymbolStringPoolEntryUnsafe::from(KV.first)),364fromExecutorSymbolDef(KV.second)});365HandleResult(LLVMErrorSuccess, CResult.data(), CResult.size(), Ctx);366} else367HandleResult(wrap(Result.takeError()), nullptr, 0, Ctx);368},369NoDependenciesToRegister);370}371372void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {373unwrap(S).retain();374}375376void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {377unwrap(S).release();378}379380const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S) {381return unwrap(S).rawPtr()->getKey().data();382}383384LLVMOrcResourceTrackerRef385LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD) {386auto RT = unwrap(JD)->createResourceTracker();387// Retain the pointer for the C API client.388RT->Retain();389return wrap(RT.get());390}391392LLVMOrcResourceTrackerRef393LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD) {394auto RT = unwrap(JD)->getDefaultResourceTracker();395// Retain the pointer for the C API client.396return wrap(RT.get());397}398399void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) {400ResourceTrackerSP TmpRT(unwrap(RT));401TmpRT->Release();402}403404void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT,405LLVMOrcResourceTrackerRef DstRT) {406ResourceTrackerSP TmpRT(unwrap(SrcRT));407TmpRT->transferTo(*unwrap(DstRT));408}409410LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) {411ResourceTrackerSP TmpRT(unwrap(RT));412return wrap(TmpRT->remove());413}414415void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) {416std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG));417}418419void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) {420std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));421}422423LLVMOrcMaterializationUnitRef LLVMOrcCreateCustomMaterializationUnit(424const char *Name, void *Ctx, LLVMOrcCSymbolFlagsMapPairs Syms,425size_t NumSyms, LLVMOrcSymbolStringPoolEntryRef InitSym,426LLVMOrcMaterializationUnitMaterializeFunction Materialize,427LLVMOrcMaterializationUnitDiscardFunction Discard,428LLVMOrcMaterializationUnitDestroyFunction Destroy) {429SymbolFlagsMap SFM;430for (size_t I = 0; I != NumSyms; ++I)431SFM[unwrap(Syms[I].Name).moveToSymbolStringPtr()] =432toJITSymbolFlags(Syms[I].Flags);433434auto IS = unwrap(InitSym).moveToSymbolStringPtr();435436return wrap(new OrcCAPIMaterializationUnit(437Name, std::move(SFM), std::move(IS), Ctx, Materialize, Discard, Destroy));438}439440LLVMOrcMaterializationUnitRef441LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) {442SymbolMap SM = toSymbolMap(Syms, NumPairs);443return wrap(absoluteSymbols(std::move(SM)).release());444}445446LLVMOrcMaterializationUnitRef LLVMOrcLazyReexports(447LLVMOrcLazyCallThroughManagerRef LCTM, LLVMOrcIndirectStubsManagerRef ISM,448LLVMOrcJITDylibRef SourceJD, LLVMOrcCSymbolAliasMapPairs CallableAliases,449size_t NumPairs) {450451SymbolAliasMap SAM;452for (size_t I = 0; I != NumPairs; ++I) {453auto pair = CallableAliases[I];454JITSymbolFlags Flags = toJITSymbolFlags(pair.Entry.Flags);455SymbolStringPtr Name = unwrap(pair.Entry.Name).moveToSymbolStringPtr();456SAM[unwrap(pair.Name).moveToSymbolStringPtr()] =457SymbolAliasMapEntry(Name, Flags);458}459460return wrap(lazyReexports(*unwrap(LCTM), *unwrap(ISM), *unwrap(SourceJD),461std::move(SAM))462.release());463}464465void LLVMOrcDisposeMaterializationResponsibility(466LLVMOrcMaterializationResponsibilityRef MR) {467std::unique_ptr<MaterializationResponsibility> TmpMR(unwrap(MR));468}469470LLVMOrcJITDylibRef LLVMOrcMaterializationResponsibilityGetTargetDylib(471LLVMOrcMaterializationResponsibilityRef MR) {472return wrap(&unwrap(MR)->getTargetJITDylib());473}474475LLVMOrcExecutionSessionRef476LLVMOrcMaterializationResponsibilityGetExecutionSession(477LLVMOrcMaterializationResponsibilityRef MR) {478return wrap(&unwrap(MR)->getExecutionSession());479}480481LLVMOrcCSymbolFlagsMapPairs LLVMOrcMaterializationResponsibilityGetSymbols(482LLVMOrcMaterializationResponsibilityRef MR, size_t *NumPairs) {483484auto Symbols = unwrap(MR)->getSymbols();485LLVMOrcCSymbolFlagsMapPairs Result = static_cast<LLVMOrcCSymbolFlagsMapPairs>(486safe_malloc(Symbols.size() * sizeof(LLVMOrcCSymbolFlagsMapPair)));487size_t I = 0;488for (auto const &pair : Symbols) {489auto Name = wrap(SymbolStringPoolEntryUnsafe::from(pair.first));490auto Flags = pair.second;491Result[I] = {Name, fromJITSymbolFlags(Flags)};492I++;493}494*NumPairs = Symbols.size();495return Result;496}497498void LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs) {499free(Pairs);500}501502LLVMOrcSymbolStringPoolEntryRef503LLVMOrcMaterializationResponsibilityGetInitializerSymbol(504LLVMOrcMaterializationResponsibilityRef MR) {505auto Sym = unwrap(MR)->getInitializerSymbol();506return wrap(SymbolStringPoolEntryUnsafe::from(Sym));507}508509LLVMOrcSymbolStringPoolEntryRef *510LLVMOrcMaterializationResponsibilityGetRequestedSymbols(511LLVMOrcMaterializationResponsibilityRef MR, size_t *NumSymbols) {512513auto Symbols = unwrap(MR)->getRequestedSymbols();514LLVMOrcSymbolStringPoolEntryRef *Result =515static_cast<LLVMOrcSymbolStringPoolEntryRef *>(safe_malloc(516Symbols.size() * sizeof(LLVMOrcSymbolStringPoolEntryRef)));517size_t I = 0;518for (auto &Name : Symbols) {519Result[I] = wrap(SymbolStringPoolEntryUnsafe::from(Name));520I++;521}522*NumSymbols = Symbols.size();523return Result;524}525526void LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef *Symbols) {527free(Symbols);528}529530LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyResolved(531LLVMOrcMaterializationResponsibilityRef MR, LLVMOrcCSymbolMapPairs Symbols,532size_t NumSymbols) {533SymbolMap SM = toSymbolMap(Symbols, NumSymbols);534return wrap(unwrap(MR)->notifyResolved(std::move(SM)));535}536537LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyEmitted(538LLVMOrcMaterializationResponsibilityRef MR,539LLVMOrcCSymbolDependenceGroup *SymbolDepGroups, size_t NumSymbolDepGroups) {540std::vector<SymbolDependenceGroup> SDGs;541SDGs.reserve(NumSymbolDepGroups);542for (size_t I = 0; I != NumSymbolDepGroups; ++I) {543SDGs.push_back(SymbolDependenceGroup());544auto &SDG = SDGs.back();545SDG.Symbols = toSymbolNameSet(SymbolDepGroups[I].Symbols);546SDG.Dependencies = toSymbolDependenceMap(547SymbolDepGroups[I].Dependencies, SymbolDepGroups[I].NumDependencies);548}549return wrap(unwrap(MR)->notifyEmitted(SDGs));550}551552LLVMErrorRef LLVMOrcMaterializationResponsibilityDefineMaterializing(553LLVMOrcMaterializationResponsibilityRef MR,554LLVMOrcCSymbolFlagsMapPairs Syms, size_t NumSyms) {555SymbolFlagsMap SFM;556for (size_t I = 0; I != NumSyms; ++I)557SFM[unwrap(Syms[I].Name).moveToSymbolStringPtr()] =558toJITSymbolFlags(Syms[I].Flags);559560return wrap(unwrap(MR)->defineMaterializing(std::move(SFM)));561}562563LLVMErrorRef LLVMOrcMaterializationResponsibilityReplace(564LLVMOrcMaterializationResponsibilityRef MR,565LLVMOrcMaterializationUnitRef MU) {566std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));567return wrap(unwrap(MR)->replace(std::move(TmpMU)));568}569570LLVMErrorRef LLVMOrcMaterializationResponsibilityDelegate(571LLVMOrcMaterializationResponsibilityRef MR,572LLVMOrcSymbolStringPoolEntryRef *Symbols, size_t NumSymbols,573LLVMOrcMaterializationResponsibilityRef *Result) {574SymbolNameSet Syms;575for (size_t I = 0; I != NumSymbols; I++) {576Syms.insert(unwrap(Symbols[I]).moveToSymbolStringPtr());577}578auto OtherMR = unwrap(MR)->delegate(Syms);579580if (!OtherMR) {581return wrap(OtherMR.takeError());582}583*Result = wrap(OtherMR->release());584return LLVMErrorSuccess;585}586587void LLVMOrcMaterializationResponsibilityFailMaterialization(588LLVMOrcMaterializationResponsibilityRef MR) {589unwrap(MR)->failMaterialization();590}591592void LLVMOrcIRTransformLayerEmit(LLVMOrcIRTransformLayerRef IRLayer,593LLVMOrcMaterializationResponsibilityRef MR,594LLVMOrcThreadSafeModuleRef TSM) {595std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));596unwrap(IRLayer)->emit(597std::unique_ptr<MaterializationResponsibility>(unwrap(MR)),598std::move(*TmpTSM));599}600601LLVMOrcJITDylibRef602LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,603const char *Name) {604return wrap(&unwrap(ES)->createBareJITDylib(Name));605}606607LLVMErrorRef608LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,609LLVMOrcJITDylibRef *Result,610const char *Name) {611auto JD = unwrap(ES)->createJITDylib(Name);612if (!JD)613return wrap(JD.takeError());614*Result = wrap(&*JD);615return LLVMErrorSuccess;616}617618LLVMOrcJITDylibRef619LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,620const char *Name) {621return wrap(unwrap(ES)->getJITDylibByName(Name));622}623624LLVMErrorRef LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD,625LLVMOrcMaterializationUnitRef MU) {626std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));627628if (auto Err = unwrap(JD)->define(TmpMU)) {629TmpMU.release();630return wrap(std::move(Err));631}632return LLVMErrorSuccess;633}634635LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) {636return wrap(unwrap(JD)->clear());637}638639void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,640LLVMOrcDefinitionGeneratorRef DG) {641unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG)));642}643644LLVMOrcDefinitionGeneratorRef LLVMOrcCreateCustomCAPIDefinitionGenerator(645LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F, void *Ctx,646LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose) {647auto DG = std::make_unique<CAPIDefinitionGenerator>(Dispose, Ctx, F);648return wrap(DG.release());649}650651void LLVMOrcLookupStateContinueLookup(LLVMOrcLookupStateRef S,652LLVMErrorRef Err) {653LookupState LS;654OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(S));655LS.continueLookup(unwrap(Err));656}657658LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(659LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix,660LLVMOrcSymbolPredicate Filter, void *FilterCtx) {661assert(Result && "Result can not be null");662assert((Filter || !FilterCtx) &&663"if Filter is null then FilterCtx must also be null");664665DynamicLibrarySearchGenerator::SymbolPredicate Pred;666if (Filter)667Pred = [=](const SymbolStringPtr &Name) -> bool {668return Filter(FilterCtx, wrap(SymbolStringPoolEntryUnsafe::from(Name)));669};670671auto ProcessSymsGenerator =672DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred);673674if (!ProcessSymsGenerator) {675*Result = nullptr;676return wrap(ProcessSymsGenerator.takeError());677}678679*Result = wrap(ProcessSymsGenerator->release());680return LLVMErrorSuccess;681}682683LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForPath(684LLVMOrcDefinitionGeneratorRef *Result, const char *FileName,685char GlobalPrefix, LLVMOrcSymbolPredicate Filter, void *FilterCtx) {686assert(Result && "Result can not be null");687assert(FileName && "FileName can not be null");688assert((Filter || !FilterCtx) &&689"if Filter is null then FilterCtx must also be null");690691DynamicLibrarySearchGenerator::SymbolPredicate Pred;692if (Filter)693Pred = [=](const SymbolStringPtr &Name) -> bool {694return Filter(FilterCtx, wrap(SymbolStringPoolEntryUnsafe::from(Name)));695};696697auto LibrarySymsGenerator =698DynamicLibrarySearchGenerator::Load(FileName, GlobalPrefix, Pred);699700if (!LibrarySymsGenerator) {701*Result = nullptr;702return wrap(LibrarySymsGenerator.takeError());703}704705*Result = wrap(LibrarySymsGenerator->release());706return LLVMErrorSuccess;707}708709LLVMErrorRef LLVMOrcCreateStaticLibrarySearchGeneratorForPath(710LLVMOrcDefinitionGeneratorRef *Result, LLVMOrcObjectLayerRef ObjLayer,711const char *FileName) {712assert(Result && "Result can not be null");713assert(FileName && "Filename can not be null");714assert(ObjLayer && "ObjectLayer can not be null");715716auto LibrarySymsGenerator =717StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer), FileName);718if (!LibrarySymsGenerator) {719*Result = nullptr;720return wrap(LibrarySymsGenerator.takeError());721}722*Result = wrap(LibrarySymsGenerator->release());723return LLVMErrorSuccess;724}725726LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {727return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));728}729730LLVMContextRef731LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {732return wrap(unwrap(TSCtx)->getContext());733}734735void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {736delete unwrap(TSCtx);737}738739LLVMErrorRef740LLVMOrcThreadSafeModuleWithModuleDo(LLVMOrcThreadSafeModuleRef TSM,741LLVMOrcGenericIRModuleOperationFunction F,742void *Ctx) {743return wrap(unwrap(TSM)->withModuleDo(744[&](Module &M) { return unwrap(F(Ctx, wrap(&M))); }));745}746747LLVMOrcThreadSafeModuleRef748LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,749LLVMOrcThreadSafeContextRef TSCtx) {750return wrap(751new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx)));752}753754void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {755delete unwrap(TSM);756}757758LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(759LLVMOrcJITTargetMachineBuilderRef *Result) {760assert(Result && "Result can not be null");761762auto JTMB = JITTargetMachineBuilder::detectHost();763if (!JTMB) {764Result = nullptr;765return wrap(JTMB.takeError());766}767768*Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB)));769return LLVMErrorSuccess;770}771772LLVMOrcJITTargetMachineBuilderRef773LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM) {774auto *TemplateTM = unwrap(TM);775776auto JTMB =777std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple());778779(*JTMB)780.setCPU(TemplateTM->getTargetCPU().str())781.setRelocationModel(TemplateTM->getRelocationModel())782.setCodeModel(TemplateTM->getCodeModel())783.setCodeGenOptLevel(TemplateTM->getOptLevel())784.setFeatures(TemplateTM->getTargetFeatureString())785.setOptions(TemplateTM->Options);786787LLVMDisposeTargetMachine(TM);788789return wrap(JTMB.release());790}791792void LLVMOrcDisposeJITTargetMachineBuilder(793LLVMOrcJITTargetMachineBuilderRef JTMB) {794delete unwrap(JTMB);795}796797char *LLVMOrcJITTargetMachineBuilderGetTargetTriple(798LLVMOrcJITTargetMachineBuilderRef JTMB) {799auto Tmp = unwrap(JTMB)->getTargetTriple().str();800char *TargetTriple = (char *)malloc(Tmp.size() + 1);801strcpy(TargetTriple, Tmp.c_str());802return TargetTriple;803}804805void LLVMOrcJITTargetMachineBuilderSetTargetTriple(806LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple) {807unwrap(JTMB)->getTargetTriple() = Triple(TargetTriple);808}809810LLVMErrorRef LLVMOrcObjectLayerAddObjectFile(LLVMOrcObjectLayerRef ObjLayer,811LLVMOrcJITDylibRef JD,812LLVMMemoryBufferRef ObjBuffer) {813return wrap(unwrap(ObjLayer)->add(814*unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));815}816817LLVMErrorRef LLVMOrcObjectLayerAddObjectFileWithRT(LLVMOrcObjectLayerRef ObjLayer,818LLVMOrcResourceTrackerRef RT,819LLVMMemoryBufferRef ObjBuffer) {820return wrap(821unwrap(ObjLayer)->add(ResourceTrackerSP(unwrap(RT)),822std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));823}824825void LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer,826LLVMOrcMaterializationResponsibilityRef R,827LLVMMemoryBufferRef ObjBuffer) {828unwrap(ObjLayer)->emit(829std::unique_ptr<MaterializationResponsibility>(unwrap(R)),830std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)));831}832833void LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer) {834delete unwrap(ObjLayer);835}836837void LLVMOrcIRTransformLayerSetTransform(838LLVMOrcIRTransformLayerRef IRTransformLayer,839LLVMOrcIRTransformLayerTransformFunction TransformFunction, void *Ctx) {840unwrap(IRTransformLayer)841->setTransform(842[=](ThreadSafeModule TSM,843MaterializationResponsibility &R) -> Expected<ThreadSafeModule> {844LLVMOrcThreadSafeModuleRef TSMRef =845wrap(new ThreadSafeModule(std::move(TSM)));846if (LLVMErrorRef Err = TransformFunction(Ctx, &TSMRef, wrap(&R))) {847assert(!TSMRef && "TSMRef was not reset to null on error");848return unwrap(Err);849}850assert(TSMRef && "Transform succeeded, but TSMRef was set to null");851ThreadSafeModule Result = std::move(*unwrap(TSMRef));852LLVMOrcDisposeThreadSafeModule(TSMRef);853return std::move(Result);854});855}856857void LLVMOrcObjectTransformLayerSetTransform(858LLVMOrcObjectTransformLayerRef ObjTransformLayer,859LLVMOrcObjectTransformLayerTransformFunction TransformFunction, void *Ctx) {860unwrap(ObjTransformLayer)861->setTransform([TransformFunction, Ctx](std::unique_ptr<MemoryBuffer> Obj)862-> Expected<std::unique_ptr<MemoryBuffer>> {863LLVMMemoryBufferRef ObjBuffer = wrap(Obj.release());864if (LLVMErrorRef Err = TransformFunction(Ctx, &ObjBuffer)) {865assert(!ObjBuffer && "ObjBuffer was not reset to null on error");866return unwrap(Err);867}868return std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer));869});870}871872LLVMOrcDumpObjectsRef LLVMOrcCreateDumpObjects(const char *DumpDir,873const char *IdentifierOverride) {874assert(DumpDir && "DumpDir should not be null");875assert(IdentifierOverride && "IdentifierOverride should not be null");876return wrap(new DumpObjects(DumpDir, IdentifierOverride));877}878879void LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects) {880delete unwrap(DumpObjects);881}882883LLVMErrorRef LLVMOrcDumpObjects_CallOperator(LLVMOrcDumpObjectsRef DumpObjects,884LLVMMemoryBufferRef *ObjBuffer) {885std::unique_ptr<MemoryBuffer> OB(unwrap(*ObjBuffer));886if (auto Result = (*unwrap(DumpObjects))(std::move(OB))) {887*ObjBuffer = wrap(Result->release());888return LLVMErrorSuccess;889} else {890*ObjBuffer = nullptr;891return wrap(Result.takeError());892}893}894895LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {896return wrap(new LLJITBuilder());897}898899void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {900delete unwrap(Builder);901}902903void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(904LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) {905unwrap(Builder)->setJITTargetMachineBuilder(std::move(*unwrap(JTMB)));906LLVMOrcDisposeJITTargetMachineBuilder(JTMB);907}908909void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(910LLVMOrcLLJITBuilderRef Builder,911LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx) {912unwrap(Builder)->setObjectLinkingLayerCreator(913[=](ExecutionSession &ES, const Triple &TT) {914auto TTStr = TT.str();915return std::unique_ptr<ObjectLayer>(916unwrap(F(Ctx, wrap(&ES), TTStr.c_str())));917});918}919920LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result,921LLVMOrcLLJITBuilderRef Builder) {922assert(Result && "Result can not be null");923924if (!Builder)925Builder = LLVMOrcCreateLLJITBuilder();926927auto J = unwrap(Builder)->create();928LLVMOrcDisposeLLJITBuilder(Builder);929930if (!J) {931Result = nullptr;932return wrap(J.takeError());933}934935*Result = wrap(J->release());936return LLVMErrorSuccess;937}938939LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {940delete unwrap(J);941return LLVMErrorSuccess;942}943944LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {945return wrap(&unwrap(J)->getExecutionSession());946}947948LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {949return wrap(&unwrap(J)->getMainJITDylib());950}951952const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {953return unwrap(J)->getTargetTriple().str().c_str();954}955956char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {957return unwrap(J)->getDataLayout().getGlobalPrefix();958}959960LLVMOrcSymbolStringPoolEntryRef961LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) {962return wrap(SymbolStringPoolEntryUnsafe::take(963unwrap(J)->mangleAndIntern(UnmangledName)));964}965966LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD,967LLVMMemoryBufferRef ObjBuffer) {968return wrap(unwrap(J)->addObjectFile(969*unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));970}971972LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J,973LLVMOrcResourceTrackerRef RT,974LLVMMemoryBufferRef ObjBuffer) {975return wrap(unwrap(J)->addObjectFile(976ResourceTrackerSP(unwrap(RT)),977std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))));978}979980LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,981LLVMOrcJITDylibRef JD,982LLVMOrcThreadSafeModuleRef TSM) {983std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));984return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM)));985}986987LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J,988LLVMOrcResourceTrackerRef RT,989LLVMOrcThreadSafeModuleRef TSM) {990std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM));991return wrap(unwrap(J)->addIRModule(ResourceTrackerSP(unwrap(RT)),992std::move(*TmpTSM)));993}994995LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,996LLVMOrcJITTargetAddress *Result,997const char *Name) {998assert(Result && "Result can not be null");9991000auto Sym = unwrap(J)->lookup(Name);1001if (!Sym) {1002*Result = 0;1003return wrap(Sym.takeError());1004}10051006*Result = Sym->getValue();1007return LLVMErrorSuccess;1008}10091010LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J) {1011return wrap(&unwrap(J)->getObjLinkingLayer());1012}10131014LLVMOrcObjectTransformLayerRef1015LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J) {1016return wrap(&unwrap(J)->getObjTransformLayer());1017}10181019LLVMOrcObjectLayerRef1020LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(1021LLVMOrcExecutionSessionRef ES) {1022assert(ES && "ES must not be null");1023return wrap(new RTDyldObjectLinkingLayer(1024*unwrap(ES), [] { return std::make_unique<SectionMemoryManager>(); }));1025}10261027LLVMOrcObjectLayerRef1028LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks(1029LLVMOrcExecutionSessionRef ES, void *CreateContextCtx,1030LLVMMemoryManagerCreateContextCallback CreateContext,1031LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating,1032LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,1033LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,1034LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,1035LLVMMemoryManagerDestroyCallback Destroy) {10361037struct MCJITMemoryManagerLikeCallbacks {1038MCJITMemoryManagerLikeCallbacks() = default;1039MCJITMemoryManagerLikeCallbacks(1040void *CreateContextCtx,1041LLVMMemoryManagerCreateContextCallback CreateContext,1042LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating,1043LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,1044LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,1045LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,1046LLVMMemoryManagerDestroyCallback Destroy)1047: CreateContextCtx(CreateContextCtx), CreateContext(CreateContext),1048NotifyTerminating(NotifyTerminating),1049AllocateCodeSection(AllocateCodeSection),1050AllocateDataSection(AllocateDataSection),1051FinalizeMemory(FinalizeMemory), Destroy(Destroy) {}10521053MCJITMemoryManagerLikeCallbacks(MCJITMemoryManagerLikeCallbacks &&Other) {1054std::swap(CreateContextCtx, Other.CreateContextCtx);1055std::swap(CreateContext, Other.CreateContext);1056std::swap(NotifyTerminating, Other.NotifyTerminating);1057std::swap(AllocateCodeSection, Other.AllocateCodeSection);1058std::swap(AllocateDataSection, Other.AllocateDataSection);1059std::swap(FinalizeMemory, Other.FinalizeMemory);1060std::swap(Destroy, Other.Destroy);1061}10621063~MCJITMemoryManagerLikeCallbacks() {1064if (NotifyTerminating)1065NotifyTerminating(CreateContextCtx);1066}10671068void *CreateContextCtx = nullptr;1069LLVMMemoryManagerCreateContextCallback CreateContext = nullptr;1070LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating = nullptr;1071LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection = nullptr;1072LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection = nullptr;1073LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory = nullptr;1074LLVMMemoryManagerDestroyCallback Destroy = nullptr;1075};10761077class MCJITMemoryManagerLikeCallbacksMemMgr : public RTDyldMemoryManager {1078public:1079MCJITMemoryManagerLikeCallbacksMemMgr(1080const MCJITMemoryManagerLikeCallbacks &CBs)1081: CBs(CBs) {1082Opaque = CBs.CreateContext(CBs.CreateContextCtx);1083}1084~MCJITMemoryManagerLikeCallbacksMemMgr() override { CBs.Destroy(Opaque); }10851086uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,1087unsigned SectionID,1088StringRef SectionName) override {1089return CBs.AllocateCodeSection(Opaque, Size, Alignment, SectionID,1090SectionName.str().c_str());1091}10921093uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,1094unsigned SectionID, StringRef SectionName,1095bool isReadOnly) override {1096return CBs.AllocateDataSection(Opaque, Size, Alignment, SectionID,1097SectionName.str().c_str(), isReadOnly);1098}10991100bool finalizeMemory(std::string *ErrMsg) override {1101char *ErrMsgCString = nullptr;1102bool Result = CBs.FinalizeMemory(Opaque, &ErrMsgCString);1103assert((Result || !ErrMsgCString) &&1104"Did not expect an error message if FinalizeMemory succeeded");1105if (ErrMsgCString) {1106if (ErrMsg)1107*ErrMsg = ErrMsgCString;1108free(ErrMsgCString);1109}1110return Result;1111}11121113private:1114const MCJITMemoryManagerLikeCallbacks &CBs;1115void *Opaque = nullptr;1116};11171118assert(ES && "ES must not be null");1119assert(CreateContext && "CreateContext must not be null");1120assert(NotifyTerminating && "NotifyTerminating must not be null");1121assert(AllocateCodeSection && "AllocateCodeSection must not be null");1122assert(AllocateDataSection && "AllocateDataSection must not be null");1123assert(FinalizeMemory && "FinalizeMemory must not be null");1124assert(Destroy && "Destroy must not be null");11251126MCJITMemoryManagerLikeCallbacks CBs(1127CreateContextCtx, CreateContext, NotifyTerminating, AllocateCodeSection,1128AllocateDataSection, FinalizeMemory, Destroy);11291130return wrap(new RTDyldObjectLinkingLayer(*unwrap(ES), [CBs = std::move(CBs)] {1131return std::make_unique<MCJITMemoryManagerLikeCallbacksMemMgr>(CBs);1132}));11331134return nullptr;1135}11361137void LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(1138LLVMOrcObjectLayerRef RTDyldObjLinkingLayer,1139LLVMJITEventListenerRef Listener) {1140assert(RTDyldObjLinkingLayer && "RTDyldObjLinkingLayer must not be null");1141assert(Listener && "Listener must not be null");1142reinterpret_cast<RTDyldObjectLinkingLayer *>(unwrap(RTDyldObjLinkingLayer))1143->registerJITEventListener(*unwrap(Listener));1144}11451146LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J) {1147return wrap(&unwrap(J)->getIRTransformLayer());1148}11491150const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J) {1151return unwrap(J)->getDataLayout().getStringRepresentation().c_str();1152}11531154LLVMOrcIndirectStubsManagerRef1155LLVMOrcCreateLocalIndirectStubsManager(const char *TargetTriple) {1156auto builder = createLocalIndirectStubsManagerBuilder(Triple(TargetTriple));1157return wrap(builder().release());1158}11591160void LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM) {1161std::unique_ptr<IndirectStubsManager> TmpISM(unwrap(ISM));1162}11631164LLVMErrorRef LLVMOrcCreateLocalLazyCallThroughManager(1165const char *TargetTriple, LLVMOrcExecutionSessionRef ES,1166LLVMOrcJITTargetAddress ErrorHandlerAddr,1167LLVMOrcLazyCallThroughManagerRef *Result) {1168auto LCTM = createLocalLazyCallThroughManager(1169Triple(TargetTriple), *unwrap(ES), ExecutorAddr(ErrorHandlerAddr));11701171if (!LCTM)1172return wrap(LCTM.takeError());1173*Result = wrap(LCTM->release());1174return LLVMErrorSuccess;1175}11761177void LLVMOrcDisposeLazyCallThroughManager(1178LLVMOrcLazyCallThroughManagerRef LCM) {1179std::unique_ptr<LazyCallThroughManager> TmpLCM(unwrap(LCM));1180}118111821183