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:
extractLookupState(LookupState & LS)30e8d8bef9SDimitry Andric   static InProgressLookupState *extractLookupState(LookupState &LS) {
31e8d8bef9SDimitry Andric     return LS.IPLS.release();
32e8d8bef9SDimitry Andric   }
33e8d8bef9SDimitry Andric 
resetLookupState(LookupState & LS,InProgressLookupState * IPLS)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 
wrap(SymbolStringPoolEntryUnsafe E)42*5f757f3fSDimitry Andric inline LLVMOrcSymbolStringPoolEntryRef wrap(SymbolStringPoolEntryUnsafe E) {
43*5f757f3fSDimitry Andric   return reinterpret_cast<LLVMOrcSymbolStringPoolEntryRef>(E.rawPtr());
44*5f757f3fSDimitry Andric }
45*5f757f3fSDimitry Andric 
unwrap(LLVMOrcSymbolStringPoolEntryRef E)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:
OrcCAPIMaterializationUnit(std::string Name,SymbolFlagsMap InitialSymbolFlags,SymbolStringPtr InitSymbol,void * Ctx,LLVMOrcMaterializationUnitMaterializeFunction Materialize,LLVMOrcMaterializationUnitDiscardFunction Discard,LLVMOrcMaterializationUnitDestroyFunction Destroy)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 
~OrcCAPIMaterializationUnit()94fe6060f1SDimitry Andric   ~OrcCAPIMaterializationUnit() {
95fe6060f1SDimitry Andric     if (Ctx)
96fe6060f1SDimitry Andric       Destroy(Ctx);
97fe6060f1SDimitry Andric   }
98fe6060f1SDimitry Andric 
getName() const99fe6060f1SDimitry Andric   StringRef getName() const override { return Name; }
100fe6060f1SDimitry Andric 
materialize(std::unique_ptr<MaterializationResponsibility> R)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:
discard(const JITDylib & JD,const SymbolStringPtr & Name)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 
toJITSymbolFlags(LLVMJITSymbolFlags F)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 
fromJITSymbolFlags(JITSymbolFlags JSF)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 
toSymbolMap(LLVMOrcCSymbolMapPairs Syms,size_t NumPairs)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
toSymbolDependenceMap(LLVMOrcCDependenceMapPairs Pairs,size_t NumPairs)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 
toLookupKind(LLVMOrcLookupKind K)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 
fromLookupKind(LookupKind K)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
toJITDylibLookupFlags(LLVMOrcJITDylibLookupFlags LF)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
fromJITDylibLookupFlags(JITDylibLookupFlags LF)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 
toSymbolLookupFlags(LLVMOrcSymbolLookupFlags SLF)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 
fromSymbolLookupFlags(SymbolLookupFlags SLF)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
fromExecutorSymbolDef(const ExecutorSymbolDef & S)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:
CAPIDefinitionGenerator(LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose,void * Ctx,LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)25381ad6265SDimitry Andric   CAPIDefinitionGenerator(
25481ad6265SDimitry Andric       LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose, void *Ctx,
25581ad6265SDimitry Andric       LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)
25681ad6265SDimitry Andric       : Dispose(Dispose), Ctx(Ctx), TryToGenerate(TryToGenerate) {}
25781ad6265SDimitry Andric 
~CAPIDefinitionGenerator()25881ad6265SDimitry Andric   ~CAPIDefinitionGenerator() {
25981ad6265SDimitry Andric     if (Dispose)
26081ad6265SDimitry Andric       Dispose(Ctx);
26181ad6265SDimitry Andric   }
26281ad6265SDimitry Andric 
tryToGenerate(LookupState & LS,LookupKind K,JITDylib & JD,JITDylibLookupFlags JDLookupFlags,const SymbolLookupSet & LookupSet)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 
LLVMOrcExecutionSessionSetErrorReporter(LLVMOrcExecutionSessionRef ES,LLVMOrcErrorReporterFunction ReportError,void * Ctx)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
LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES)315e8d8bef9SDimitry Andric LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) {
316fe6060f1SDimitry Andric   return wrap(
317fe6060f1SDimitry Andric       unwrap(ES)->getExecutorProcessControl().getSymbolStringPool().get());
318e8d8bef9SDimitry Andric }
319e8d8bef9SDimitry Andric 
LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP)320e8d8bef9SDimitry Andric void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) {
321e8d8bef9SDimitry Andric   unwrap(SSP)->clearDeadEntries();
322e8d8bef9SDimitry Andric }
323e8d8bef9SDimitry Andric 
3245ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef
LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES,const char * Name)3255ffd83dbSDimitry Andric LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
326*5f757f3fSDimitry Andric   return wrap(SymbolStringPoolEntryUnsafe::take(unwrap(ES)->intern(Name)));
3275ffd83dbSDimitry Andric }
3285ffd83dbSDimitry Andric 
LLVMOrcExecutionSessionLookup(LLVMOrcExecutionSessionRef ES,LLVMOrcLookupKind K,LLVMOrcCJITDylibSearchOrder SearchOrder,size_t SearchOrderSize,LLVMOrcCLookupSet Symbols,size_t SymbolsSize,LLVMOrcExecutionSessionLookupHandleResultFunction HandleResult,void * Ctx)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 
LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S)365e8d8bef9SDimitry Andric void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
366*5f757f3fSDimitry Andric   unwrap(S).retain();
367e8d8bef9SDimitry Andric }
368e8d8bef9SDimitry Andric 
LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S)3695ffd83dbSDimitry Andric void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) {
370*5f757f3fSDimitry Andric   unwrap(S).release();
3715ffd83dbSDimitry Andric }
3725ffd83dbSDimitry Andric 
LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S)373e8d8bef9SDimitry Andric const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S) {
374*5f757f3fSDimitry Andric   return unwrap(S).rawPtr()->getKey().data();
375e8d8bef9SDimitry Andric }
376e8d8bef9SDimitry Andric 
377e8d8bef9SDimitry Andric LLVMOrcResourceTrackerRef
LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD)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
LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD)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 
LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT)392e8d8bef9SDimitry Andric void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) {
393e8d8bef9SDimitry Andric   ResourceTrackerSP TmpRT(unwrap(RT));
394e8d8bef9SDimitry Andric   TmpRT->Release();
395e8d8bef9SDimitry Andric }
396e8d8bef9SDimitry Andric 
LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT,LLVMOrcResourceTrackerRef DstRT)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 
LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT)403e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) {
404e8d8bef9SDimitry Andric   ResourceTrackerSP TmpRT(unwrap(RT));
405e8d8bef9SDimitry Andric   return wrap(TmpRT->remove());
406e8d8bef9SDimitry Andric }
407e8d8bef9SDimitry Andric 
LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG)408e8d8bef9SDimitry Andric void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) {
409e8d8bef9SDimitry Andric   std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG));
410e8d8bef9SDimitry Andric }
411e8d8bef9SDimitry Andric 
LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU)412e8d8bef9SDimitry Andric void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) {
413e8d8bef9SDimitry Andric   std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU));
414e8d8bef9SDimitry Andric }
415e8d8bef9SDimitry Andric 
LLVMOrcCreateCustomMaterializationUnit(const char * Name,void * Ctx,LLVMOrcCSymbolFlagsMapPairs Syms,size_t NumSyms,LLVMOrcSymbolStringPoolEntryRef InitSym,LLVMOrcMaterializationUnitMaterializeFunction Materialize,LLVMOrcMaterializationUnitDiscardFunction Discard,LLVMOrcMaterializationUnitDestroyFunction Destroy)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
LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms,size_t NumPairs)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 
LLVMOrcLazyReexports(LLVMOrcLazyCallThroughManagerRef LCTM,LLVMOrcIndirectStubsManagerRef ISM,LLVMOrcJITDylibRef SourceJD,LLVMOrcCSymbolAliasMapPairs CallableAliases,size_t NumPairs)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 
LLVMOrcDisposeMaterializationResponsibility(LLVMOrcMaterializationResponsibilityRef MR)458fe6060f1SDimitry Andric void LLVMOrcDisposeMaterializationResponsibility(
459fe6060f1SDimitry Andric     LLVMOrcMaterializationResponsibilityRef MR) {
460fe6060f1SDimitry Andric   std::unique_ptr<MaterializationResponsibility> TmpMR(unwrap(MR));
461fe6060f1SDimitry Andric }
462fe6060f1SDimitry Andric 
LLVMOrcMaterializationResponsibilityGetTargetDylib(LLVMOrcMaterializationResponsibilityRef MR)463fe6060f1SDimitry Andric LLVMOrcJITDylibRef LLVMOrcMaterializationResponsibilityGetTargetDylib(
464fe6060f1SDimitry Andric     LLVMOrcMaterializationResponsibilityRef MR) {
465fe6060f1SDimitry Andric   return wrap(&unwrap(MR)->getTargetJITDylib());
466fe6060f1SDimitry Andric }
467fe6060f1SDimitry Andric 
468fe6060f1SDimitry Andric LLVMOrcExecutionSessionRef
LLVMOrcMaterializationResponsibilityGetExecutionSession(LLVMOrcMaterializationResponsibilityRef MR)469fe6060f1SDimitry Andric LLVMOrcMaterializationResponsibilityGetExecutionSession(
470fe6060f1SDimitry Andric     LLVMOrcMaterializationResponsibilityRef MR) {
471fe6060f1SDimitry Andric   return wrap(&unwrap(MR)->getExecutionSession());
472fe6060f1SDimitry Andric }
473fe6060f1SDimitry Andric 
LLVMOrcMaterializationResponsibilityGetSymbols(LLVMOrcMaterializationResponsibilityRef MR,size_t * NumPairs)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 
LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs)491fe6060f1SDimitry Andric void LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs) {
492fe6060f1SDimitry Andric   free(Pairs);
493fe6060f1SDimitry Andric }
494fe6060f1SDimitry Andric 
495fe6060f1SDimitry Andric LLVMOrcSymbolStringPoolEntryRef
LLVMOrcMaterializationResponsibilityGetInitializerSymbol(LLVMOrcMaterializationResponsibilityRef MR)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 *
LLVMOrcMaterializationResponsibilityGetRequestedSymbols(LLVMOrcMaterializationResponsibilityRef MR,size_t * NumSymbols)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 
LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef * Symbols)519fe6060f1SDimitry Andric void LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef *Symbols) {
520fe6060f1SDimitry Andric   free(Symbols);
521fe6060f1SDimitry Andric }
522fe6060f1SDimitry Andric 
LLVMOrcMaterializationResponsibilityNotifyResolved(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcCSymbolMapPairs Symbols,size_t NumPairs)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 
LLVMOrcMaterializationResponsibilityNotifyEmitted(LLVMOrcMaterializationResponsibilityRef MR)530fe6060f1SDimitry Andric LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyEmitted(
531fe6060f1SDimitry Andric     LLVMOrcMaterializationResponsibilityRef MR) {
532fe6060f1SDimitry Andric   return wrap(unwrap(MR)->notifyEmitted());
533fe6060f1SDimitry Andric }
534fe6060f1SDimitry Andric 
LLVMOrcMaterializationResponsibilityDefineMaterializing(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcCSymbolFlagsMapPairs Syms,size_t NumSyms)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 
LLVMOrcMaterializationResponsibilityReplace(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcMaterializationUnitRef MU)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 
LLVMOrcMaterializationResponsibilityDelegate(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcSymbolStringPoolEntryRef * Symbols,size_t NumSymbols,LLVMOrcMaterializationResponsibilityRef * Result)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 
LLVMOrcMaterializationResponsibilityAddDependencies(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcSymbolStringPoolEntryRef Name,LLVMOrcCDependenceMapPairs Dependencies,size_t NumPairs)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 
LLVMOrcMaterializationResponsibilityAddDependenciesForAll(LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcCDependenceMapPairs Dependencies,size_t NumPairs)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 
LLVMOrcMaterializationResponsibilityFailMaterialization(LLVMOrcMaterializationResponsibilityRef MR)588fe6060f1SDimitry Andric void LLVMOrcMaterializationResponsibilityFailMaterialization(
589fe6060f1SDimitry Andric     LLVMOrcMaterializationResponsibilityRef MR) {
590fe6060f1SDimitry Andric   unwrap(MR)->failMaterialization();
591fe6060f1SDimitry Andric }
592fe6060f1SDimitry Andric 
LLVMOrcIRTransformLayerEmit(LLVMOrcIRTransformLayerRef IRLayer,LLVMOrcMaterializationResponsibilityRef MR,LLVMOrcThreadSafeModuleRef TSM)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
LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES,const char * Name)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
LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES,LLVMOrcJITDylibRef * Result,const char * Name)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
LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,const char * Name)620e8d8bef9SDimitry Andric LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
621e8d8bef9SDimitry Andric                                          const char *Name) {
622e8d8bef9SDimitry Andric   return wrap(unwrap(ES)->getJITDylibByName(Name));
623e8d8bef9SDimitry Andric }
624e8d8bef9SDimitry Andric 
LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD,LLVMOrcMaterializationUnitRef MU)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 
LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD)636e8d8bef9SDimitry Andric LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) {
637e8d8bef9SDimitry Andric   return wrap(unwrap(JD)->clear());
6385ffd83dbSDimitry Andric }
6395ffd83dbSDimitry Andric 
LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,LLVMOrcDefinitionGeneratorRef DG)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 
LLVMOrcCreateCustomCAPIDefinitionGenerator(LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F,void * Ctx,LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose)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 
LLVMOrcLookupStateContinueLookup(LLVMOrcLookupStateRef S,LLVMErrorRef Err)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 
LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess(LLVMOrcDefinitionGeneratorRef * Result,char GlobalPrefix,LLVMOrcSymbolPredicate Filter,void * FilterCtx)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 
LLVMOrcCreateDynamicLibrarySearchGeneratorForPath(LLVMOrcDefinitionGeneratorRef * Result,const char * FileName,char GlobalPrefix,LLVMOrcSymbolPredicate Filter,void * FilterCtx)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 
LLVMOrcCreateStaticLibrarySearchGeneratorForPath(LLVMOrcDefinitionGeneratorRef * Result,LLVMOrcObjectLayerRef ObjLayer,const char * FileName)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 
LLVMOrcCreateNewThreadSafeContext(void)7275ffd83dbSDimitry Andric LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) {
7285ffd83dbSDimitry Andric   return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>()));
7295ffd83dbSDimitry Andric }
7305ffd83dbSDimitry Andric 
7315ffd83dbSDimitry Andric LLVMContextRef
LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx)7325ffd83dbSDimitry Andric LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) {
7335ffd83dbSDimitry Andric   return wrap(unwrap(TSCtx)->getContext());
7345ffd83dbSDimitry Andric }
7355ffd83dbSDimitry Andric 
LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx)7365ffd83dbSDimitry Andric void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) {
7375ffd83dbSDimitry Andric   delete unwrap(TSCtx);
7385ffd83dbSDimitry Andric }
7395ffd83dbSDimitry Andric 
740fe6060f1SDimitry Andric LLVMErrorRef
LLVMOrcThreadSafeModuleWithModuleDo(LLVMOrcThreadSafeModuleRef TSM,LLVMOrcGenericIRModuleOperationFunction F,void * Ctx)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
LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M,LLVMOrcThreadSafeContextRef TSCtx)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 
LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM)7555ffd83dbSDimitry Andric void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) {
7565ffd83dbSDimitry Andric   delete unwrap(TSM);
7575ffd83dbSDimitry Andric }
7585ffd83dbSDimitry Andric 
LLVMOrcJITTargetMachineBuilderDetectHost(LLVMOrcJITTargetMachineBuilderRef * Result)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
LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM)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 
LLVMOrcDisposeJITTargetMachineBuilder(LLVMOrcJITTargetMachineBuilderRef JTMB)7935ffd83dbSDimitry Andric void LLVMOrcDisposeJITTargetMachineBuilder(
7945ffd83dbSDimitry Andric     LLVMOrcJITTargetMachineBuilderRef JTMB) {
7955ffd83dbSDimitry Andric   delete unwrap(JTMB);
7965ffd83dbSDimitry Andric }
7975ffd83dbSDimitry Andric 
LLVMOrcJITTargetMachineBuilderGetTargetTriple(LLVMOrcJITTargetMachineBuilderRef JTMB)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 
LLVMOrcJITTargetMachineBuilderSetTargetTriple(LLVMOrcJITTargetMachineBuilderRef JTMB,const char * TargetTriple)806fe6060f1SDimitry Andric void LLVMOrcJITTargetMachineBuilderSetTargetTriple(
807fe6060f1SDimitry Andric     LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple) {
808fe6060f1SDimitry Andric   unwrap(JTMB)->getTargetTriple() = Triple(TargetTriple);
809fe6060f1SDimitry Andric }
810fe6060f1SDimitry Andric 
LLVMOrcObjectLayerAddObjectFile(LLVMOrcObjectLayerRef ObjLayer,LLVMOrcJITDylibRef JD,LLVMMemoryBufferRef ObjBuffer)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 
LLVMOrcObjectLayerAddObjectFileWithRT(LLVMOrcObjectLayerRef ObjLayer,LLVMOrcResourceTrackerRef RT,LLVMMemoryBufferRef ObjBuffer)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 
LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer,LLVMOrcMaterializationResponsibilityRef R,LLVMMemoryBufferRef ObjBuffer)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 
LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer)834d409305fSDimitry Andric void LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer) {
835e8d8bef9SDimitry Andric   delete unwrap(ObjLayer);
836e8d8bef9SDimitry Andric }
837e8d8bef9SDimitry Andric 
LLVMOrcIRTransformLayerSetTransform(LLVMOrcIRTransformLayerRef IRTransformLayer,LLVMOrcIRTransformLayerTransformFunction TransformFunction,void * Ctx)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 
LLVMOrcObjectTransformLayerSetTransform(LLVMOrcObjectTransformLayerRef ObjTransformLayer,LLVMOrcObjectTransformLayerTransformFunction TransformFunction,void * Ctx)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 
LLVMOrcCreateDumpObjects(const char * DumpDir,const char * IdentifierOverride)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 
LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects)880fe6060f1SDimitry Andric void LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects) {
881fe6060f1SDimitry Andric   delete unwrap(DumpObjects);
882fe6060f1SDimitry Andric }
883fe6060f1SDimitry Andric 
LLVMOrcDumpObjects_CallOperator(LLVMOrcDumpObjectsRef DumpObjects,LLVMMemoryBufferRef * ObjBuffer)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 
LLVMOrcCreateLLJITBuilder(void)8965ffd83dbSDimitry Andric LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) {
8975ffd83dbSDimitry Andric   return wrap(new LLJITBuilder());
8985ffd83dbSDimitry Andric }
8995ffd83dbSDimitry Andric 
LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder)9005ffd83dbSDimitry Andric void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) {
9015ffd83dbSDimitry Andric   delete unwrap(Builder);
9025ffd83dbSDimitry Andric }
9035ffd83dbSDimitry Andric 
LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(LLVMOrcLLJITBuilderRef Builder,LLVMOrcJITTargetMachineBuilderRef JTMB)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 
LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator(LLVMOrcLLJITBuilderRef Builder,LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F,void * Ctx)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 
LLVMOrcCreateLLJIT(LLVMOrcLLJITRef * Result,LLVMOrcLLJITBuilderRef Builder)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 
LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J)9405ffd83dbSDimitry Andric LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) {
9415ffd83dbSDimitry Andric   delete unwrap(J);
9425ffd83dbSDimitry Andric   return LLVMErrorSuccess;
9435ffd83dbSDimitry Andric }
9445ffd83dbSDimitry Andric 
LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J)9455ffd83dbSDimitry Andric LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) {
9465ffd83dbSDimitry Andric   return wrap(&unwrap(J)->getExecutionSession());
9475ffd83dbSDimitry Andric }
9485ffd83dbSDimitry Andric 
LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J)9495ffd83dbSDimitry Andric LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) {
9505ffd83dbSDimitry Andric   return wrap(&unwrap(J)->getMainJITDylib());
9515ffd83dbSDimitry Andric }
9525ffd83dbSDimitry Andric 
LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J)9535ffd83dbSDimitry Andric const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) {
9545ffd83dbSDimitry Andric   return unwrap(J)->getTargetTriple().str().c_str();
9555ffd83dbSDimitry Andric }
9565ffd83dbSDimitry Andric 
LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J)9575ffd83dbSDimitry Andric char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) {
9585ffd83dbSDimitry Andric   return unwrap(J)->getDataLayout().getGlobalPrefix();
9595ffd83dbSDimitry Andric }
9605ffd83dbSDimitry Andric 
9615ffd83dbSDimitry Andric LLVMOrcSymbolStringPoolEntryRef
LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J,const char * UnmangledName)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 
LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J,LLVMOrcJITDylibRef JD,LLVMMemoryBufferRef ObjBuffer)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 
LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J,LLVMOrcResourceTrackerRef RT,LLVMMemoryBufferRef ObjBuffer)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 
LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J,LLVMOrcJITDylibRef JD,LLVMOrcThreadSafeModuleRef TSM)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 
LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J,LLVMOrcResourceTrackerRef RT,LLVMOrcThreadSafeModuleRef TSM)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 
LLVMOrcLLJITLookup(LLVMOrcLLJITRef J,LLVMOrcJITTargetAddress * Result,const char * Name)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 
LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J)1011fe6060f1SDimitry Andric LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J) {
1012fe6060f1SDimitry Andric   return wrap(&unwrap(J)->getObjLinkingLayer());
1013fe6060f1SDimitry Andric }
1014fe6060f1SDimitry Andric 
1015fe6060f1SDimitry Andric LLVMOrcObjectTransformLayerRef
LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J)1016fe6060f1SDimitry Andric LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J) {
1017fe6060f1SDimitry Andric   return wrap(&unwrap(J)->getObjTransformLayer());
1018fe6060f1SDimitry Andric }
1019fe6060f1SDimitry Andric 
1020e8d8bef9SDimitry Andric LLVMOrcObjectLayerRef
LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(LLVMOrcExecutionSessionRef ES)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
LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks(LLVMOrcExecutionSessionRef ES,void * CreateContextCtx,LLVMMemoryManagerCreateContextCallback CreateContext,LLVMMemoryManagerNotifyTerminatingCallback NotifyTerminating,LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,LLVMMemoryManagerDestroyCallback Destroy)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 
LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener(LLVMOrcObjectLayerRef RTDyldObjLinkingLayer,LLVMJITEventListenerRef Listener)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 
LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J)1147fe6060f1SDimitry Andric LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J) {
1148fe6060f1SDimitry Andric   return wrap(&unwrap(J)->getIRTransformLayer());
1149fe6060f1SDimitry Andric }
1150fe6060f1SDimitry Andric 
LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J)1151fe6060f1SDimitry Andric const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J) {
1152fe6060f1SDimitry Andric   return unwrap(J)->getDataLayout().getStringRepresentation().c_str();
1153fe6060f1SDimitry Andric }
1154fe6060f1SDimitry Andric 
1155fe6060f1SDimitry Andric LLVMOrcIndirectStubsManagerRef
LLVMOrcCreateLocalIndirectStubsManager(const char * TargetTriple)1156fe6060f1SDimitry Andric LLVMOrcCreateLocalIndirectStubsManager(const char *TargetTriple) {
1157fe6060f1SDimitry Andric   auto builder = createLocalIndirectStubsManagerBuilder(Triple(TargetTriple));
1158fe6060f1SDimitry Andric   return wrap(builder().release());
1159fe6060f1SDimitry Andric }
1160fe6060f1SDimitry Andric 
LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM)1161fe6060f1SDimitry Andric void LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM) {
1162fe6060f1SDimitry Andric   std::unique_ptr<IndirectStubsManager> TmpISM(unwrap(ISM));
1163fe6060f1SDimitry Andric }
1164fe6060f1SDimitry Andric 
LLVMOrcCreateLocalLazyCallThroughManager(const char * TargetTriple,LLVMOrcExecutionSessionRef ES,LLVMOrcJITTargetAddress ErrorHandlerAddr,LLVMOrcLazyCallThroughManagerRef * Result)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 
LLVMOrcDisposeLazyCallThroughManager(LLVMOrcLazyCallThroughManagerRef LCM)1178fe6060f1SDimitry Andric void LLVMOrcDisposeLazyCallThroughManager(
1179fe6060f1SDimitry Andric     LLVMOrcLazyCallThroughManagerRef LCM) {
1180fe6060f1SDimitry Andric   std::unique_ptr<LazyCallThroughManager> TmpLCM(unwrap(LCM));
1181fe6060f1SDimitry Andric }
1182