1 //===--------------- OrcV2CBindings.cpp - C bindings OrcV2 APIs -----------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm-c/LLJIT.h" 10 #include "llvm-c/Orc.h" 11 #include "llvm-c/OrcEE.h" 12 #include "llvm-c/TargetMachine.h" 13 14 #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h" 15 #include "llvm/ExecutionEngine/Orc/LLJIT.h" 16 #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h" 17 #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" 18 #include "llvm/ExecutionEngine/SectionMemoryManager.h" 19 20 using namespace llvm; 21 using namespace llvm::orc; 22 23 namespace llvm { 24 namespace orc { 25 26 class InProgressLookupState; 27 28 class OrcV2CAPIHelper { 29 public: 30 using PoolEntry = SymbolStringPtr::PoolEntry; 31 using PoolEntryPtr = SymbolStringPtr::PoolEntryPtr; 32 33 // Move from SymbolStringPtr to PoolEntryPtr (no change in ref count). 34 static PoolEntryPtr moveFromSymbolStringPtr(SymbolStringPtr S) { 35 PoolEntryPtr Result = nullptr; 36 std::swap(Result, S.S); 37 return Result; 38 } 39 40 // Move from a PoolEntryPtr to a SymbolStringPtr (no change in ref count). 41 static SymbolStringPtr moveToSymbolStringPtr(PoolEntryPtr P) { 42 SymbolStringPtr S; 43 S.S = P; 44 return S; 45 } 46 47 // Copy a pool entry to a SymbolStringPtr (increments ref count). 48 static SymbolStringPtr copyToSymbolStringPtr(PoolEntryPtr P) { 49 return SymbolStringPtr(P); 50 } 51 52 static PoolEntryPtr getRawPoolEntryPtr(const SymbolStringPtr &S) { 53 return S.S; 54 } 55 56 static void retainPoolEntry(PoolEntryPtr P) { 57 SymbolStringPtr S(P); 58 S.S = nullptr; 59 } 60 61 static void releasePoolEntry(PoolEntryPtr P) { 62 SymbolStringPtr S; 63 S.S = P; 64 } 65 66 static InProgressLookupState *extractLookupState(LookupState &LS) { 67 return LS.IPLS.release(); 68 } 69 70 static void resetLookupState(LookupState &LS, InProgressLookupState *IPLS) { 71 return LS.reset(IPLS); 72 } 73 }; 74 75 } // namespace orc 76 } // namespace llvm 77 78 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ExecutionSession, LLVMOrcExecutionSessionRef) 79 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef) 80 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OrcV2CAPIHelper::PoolEntry, 81 LLVMOrcSymbolStringPoolEntryRef) 82 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationUnit, 83 LLVMOrcMaterializationUnitRef) 84 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MaterializationResponsibility, 85 LLVMOrcMaterializationResponsibilityRef) 86 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef) 87 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef) 88 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator, 89 LLVMOrcDefinitionGeneratorRef) 90 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(InProgressLookupState, LLVMOrcLookupStateRef) 91 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext, 92 LLVMOrcThreadSafeContextRef) 93 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef) 94 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITTargetMachineBuilder, 95 LLVMOrcJITTargetMachineBuilderRef) 96 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectLayer, LLVMOrcObjectLayerRef) 97 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRTransformLayer, LLVMOrcIRTransformLayerRef) 98 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ObjectTransformLayer, 99 LLVMOrcObjectTransformLayerRef) 100 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DumpObjects, LLVMOrcDumpObjectsRef) 101 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IndirectStubsManager, 102 LLVMOrcIndirectStubsManagerRef) 103 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LazyCallThroughManager, 104 LLVMOrcLazyCallThroughManagerRef) 105 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJITBuilder, LLVMOrcLLJITBuilderRef) 106 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef) 107 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef) 108 109 namespace { 110 111 class OrcCAPIMaterializationUnit : public llvm::orc::MaterializationUnit { 112 public: 113 OrcCAPIMaterializationUnit( 114 std::string Name, SymbolFlagsMap InitialSymbolFlags, 115 SymbolStringPtr InitSymbol, void *Ctx, 116 LLVMOrcMaterializationUnitMaterializeFunction Materialize, 117 LLVMOrcMaterializationUnitDiscardFunction Discard, 118 LLVMOrcMaterializationUnitDestroyFunction Destroy) 119 : llvm::orc::MaterializationUnit( 120 Interface(std::move(InitialSymbolFlags), std::move(InitSymbol))), 121 Name(std::move(Name)), Ctx(Ctx), Materialize(Materialize), 122 Discard(Discard), Destroy(Destroy) {} 123 124 ~OrcCAPIMaterializationUnit() { 125 if (Ctx) 126 Destroy(Ctx); 127 } 128 129 StringRef getName() const override { return Name; } 130 131 void materialize(std::unique_ptr<MaterializationResponsibility> R) override { 132 void *Tmp = Ctx; 133 Ctx = nullptr; 134 Materialize(Tmp, wrap(R.release())); 135 } 136 137 private: 138 void discard(const JITDylib &JD, const SymbolStringPtr &Name) override { 139 Discard(Ctx, wrap(&JD), wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name))); 140 } 141 142 std::string Name; 143 void *Ctx = nullptr; 144 LLVMOrcMaterializationUnitMaterializeFunction Materialize = nullptr; 145 LLVMOrcMaterializationUnitDiscardFunction Discard = nullptr; 146 LLVMOrcMaterializationUnitDestroyFunction Destroy = nullptr; 147 }; 148 149 static JITSymbolFlags toJITSymbolFlags(LLVMJITSymbolFlags F) { 150 151 JITSymbolFlags JSF; 152 153 if (F.GenericFlags & LLVMJITSymbolGenericFlagsExported) 154 JSF |= JITSymbolFlags::Exported; 155 if (F.GenericFlags & LLVMJITSymbolGenericFlagsWeak) 156 JSF |= JITSymbolFlags::Weak; 157 if (F.GenericFlags & LLVMJITSymbolGenericFlagsCallable) 158 JSF |= JITSymbolFlags::Callable; 159 if (F.GenericFlags & LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly) 160 JSF |= JITSymbolFlags::MaterializationSideEffectsOnly; 161 162 JSF.getTargetFlags() = F.TargetFlags; 163 164 return JSF; 165 } 166 167 static LLVMJITSymbolFlags fromJITSymbolFlags(JITSymbolFlags JSF) { 168 LLVMJITSymbolFlags F = {0, 0}; 169 if (JSF & JITSymbolFlags::Exported) 170 F.GenericFlags |= LLVMJITSymbolGenericFlagsExported; 171 if (JSF & JITSymbolFlags::Weak) 172 F.GenericFlags |= LLVMJITSymbolGenericFlagsWeak; 173 if (JSF & JITSymbolFlags::Callable) 174 F.GenericFlags |= LLVMJITSymbolGenericFlagsCallable; 175 if (JSF & JITSymbolFlags::MaterializationSideEffectsOnly) 176 F.GenericFlags |= LLVMJITSymbolGenericFlagsMaterializationSideEffectsOnly; 177 178 F.TargetFlags = JSF.getTargetFlags(); 179 180 return F; 181 } 182 183 static SymbolMap toSymbolMap(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) { 184 SymbolMap SM; 185 for (size_t I = 0; I != NumPairs; ++I) { 186 JITSymbolFlags Flags = toJITSymbolFlags(Syms[I].Sym.Flags); 187 SM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] = 188 JITEvaluatedSymbol(Syms[I].Sym.Address, Flags); 189 } 190 return SM; 191 } 192 193 static SymbolDependenceMap 194 toSymbolDependenceMap(LLVMOrcCDependenceMapPairs Pairs, size_t NumPairs) { 195 SymbolDependenceMap SDM; 196 for (size_t I = 0; I != NumPairs; ++I) { 197 JITDylib *JD = unwrap(Pairs[I].JD); 198 SymbolNameSet Names; 199 200 for (size_t J = 0; J != Pairs[I].Names.Length; ++J) { 201 auto Sym = Pairs[I].Names.Symbols[J]; 202 Names.insert(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Sym))); 203 } 204 SDM[JD] = Names; 205 } 206 return SDM; 207 } 208 209 static LookupKind toLookupKind(LLVMOrcLookupKind K) { 210 switch (K) { 211 case LLVMOrcLookupKindStatic: 212 return LookupKind::Static; 213 case LLVMOrcLookupKindDLSym: 214 return LookupKind::DLSym; 215 } 216 llvm_unreachable("unrecognized LLVMOrcLookupKind value"); 217 } 218 219 static LLVMOrcLookupKind fromLookupKind(LookupKind K) { 220 switch (K) { 221 case LookupKind::Static: 222 return LLVMOrcLookupKindStatic; 223 case LookupKind::DLSym: 224 return LLVMOrcLookupKindDLSym; 225 } 226 llvm_unreachable("unrecognized LookupKind value"); 227 } 228 229 static JITDylibLookupFlags 230 toJITDylibLookupFlags(LLVMOrcJITDylibLookupFlags LF) { 231 switch (LF) { 232 case LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly: 233 return JITDylibLookupFlags::MatchExportedSymbolsOnly; 234 case LLVMOrcJITDylibLookupFlagsMatchAllSymbols: 235 return JITDylibLookupFlags::MatchAllSymbols; 236 } 237 llvm_unreachable("unrecognized LLVMOrcJITDylibLookupFlags value"); 238 } 239 240 static LLVMOrcJITDylibLookupFlags 241 fromJITDylibLookupFlags(JITDylibLookupFlags LF) { 242 switch (LF) { 243 case JITDylibLookupFlags::MatchExportedSymbolsOnly: 244 return LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly; 245 case JITDylibLookupFlags::MatchAllSymbols: 246 return LLVMOrcJITDylibLookupFlagsMatchAllSymbols; 247 } 248 llvm_unreachable("unrecognized JITDylibLookupFlags value"); 249 } 250 251 static SymbolLookupFlags toSymbolLookupFlags(LLVMOrcSymbolLookupFlags SLF) { 252 switch (SLF) { 253 case LLVMOrcSymbolLookupFlagsRequiredSymbol: 254 return SymbolLookupFlags::RequiredSymbol; 255 case LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol: 256 return SymbolLookupFlags::WeaklyReferencedSymbol; 257 } 258 llvm_unreachable("unrecognized LLVMOrcSymbolLookupFlags value"); 259 } 260 261 static LLVMOrcSymbolLookupFlags fromSymbolLookupFlags(SymbolLookupFlags SLF) { 262 switch (SLF) { 263 case SymbolLookupFlags::RequiredSymbol: 264 return LLVMOrcSymbolLookupFlagsRequiredSymbol; 265 case SymbolLookupFlags::WeaklyReferencedSymbol: 266 return LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol; 267 } 268 llvm_unreachable("unrecognized SymbolLookupFlags value"); 269 } 270 271 static LLVMJITEvaluatedSymbol 272 fromJITEvaluatedSymbol(const JITEvaluatedSymbol &S) { 273 return {S.getAddress(), fromJITSymbolFlags(S.getFlags())}; 274 } 275 276 } // end anonymous namespace 277 278 namespace llvm { 279 namespace orc { 280 281 class CAPIDefinitionGenerator final : public DefinitionGenerator { 282 public: 283 CAPIDefinitionGenerator( 284 LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose, void *Ctx, 285 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate) 286 : Dispose(Dispose), Ctx(Ctx), TryToGenerate(TryToGenerate) {} 287 288 ~CAPIDefinitionGenerator() { 289 if (Dispose) 290 Dispose(Ctx); 291 } 292 293 Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD, 294 JITDylibLookupFlags JDLookupFlags, 295 const SymbolLookupSet &LookupSet) override { 296 297 // Take the lookup state. 298 LLVMOrcLookupStateRef LSR = ::wrap(OrcV2CAPIHelper::extractLookupState(LS)); 299 300 // Translate the lookup kind. 301 LLVMOrcLookupKind CLookupKind = fromLookupKind(K); 302 303 // Translate the JITDylibLookupFlags. 304 LLVMOrcJITDylibLookupFlags CJDLookupFlags = 305 fromJITDylibLookupFlags(JDLookupFlags); 306 307 // Translate the lookup set. 308 std::vector<LLVMOrcCLookupSetElement> CLookupSet; 309 CLookupSet.reserve(LookupSet.size()); 310 for (auto &KV : LookupSet) { 311 LLVMOrcSymbolStringPoolEntryRef Name = 312 ::wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV.first)); 313 LLVMOrcSymbolLookupFlags SLF = fromSymbolLookupFlags(KV.second); 314 CLookupSet.push_back({Name, SLF}); 315 } 316 317 // Run the C TryToGenerate function. 318 auto Err = unwrap(TryToGenerate(::wrap(this), Ctx, &LSR, CLookupKind, 319 ::wrap(&JD), CJDLookupFlags, 320 CLookupSet.data(), CLookupSet.size())); 321 322 // Restore the lookup state. 323 OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(LSR)); 324 325 return Err; 326 } 327 328 private: 329 LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose; 330 void *Ctx; 331 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate; 332 }; 333 334 } // end namespace orc 335 } // end namespace llvm 336 337 void LLVMOrcExecutionSessionSetErrorReporter( 338 LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError, 339 void *Ctx) { 340 unwrap(ES)->setErrorReporter( 341 [=](Error Err) { ReportError(Ctx, wrap(std::move(Err))); }); 342 } 343 344 LLVMOrcSymbolStringPoolRef 345 LLVMOrcExecutionSessionGetSymbolStringPool(LLVMOrcExecutionSessionRef ES) { 346 return wrap( 347 unwrap(ES)->getExecutorProcessControl().getSymbolStringPool().get()); 348 } 349 350 void LLVMOrcSymbolStringPoolClearDeadEntries(LLVMOrcSymbolStringPoolRef SSP) { 351 unwrap(SSP)->clearDeadEntries(); 352 } 353 354 LLVMOrcSymbolStringPoolEntryRef 355 LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) { 356 return wrap( 357 OrcV2CAPIHelper::moveFromSymbolStringPtr(unwrap(ES)->intern(Name))); 358 } 359 360 void LLVMOrcExecutionSessionLookup( 361 LLVMOrcExecutionSessionRef ES, LLVMOrcLookupKind K, 362 LLVMOrcCJITDylibSearchOrder SearchOrder, size_t SearchOrderSize, 363 LLVMOrcCLookupSet Symbols, size_t SymbolsSize, 364 LLVMOrcExecutionSessionLookupHandleResultFunction HandleResult, void *Ctx) { 365 assert(ES && "ES cannot be null"); 366 assert(SearchOrder && "SearchOrder cannot be null"); 367 assert(Symbols && "Symbols cannot be null"); 368 assert(HandleResult && "HandleResult cannot be null"); 369 370 JITDylibSearchOrder SO; 371 for (size_t I = 0; I != SearchOrderSize; ++I) 372 SO.push_back({unwrap(SearchOrder[I].JD), 373 toJITDylibLookupFlags(SearchOrder[I].JDLookupFlags)}); 374 375 SymbolLookupSet SLS; 376 for (size_t I = 0; I != SymbolsSize; ++I) 377 SLS.add(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Symbols[I].Name)), 378 toSymbolLookupFlags(Symbols[I].LookupFlags)); 379 380 unwrap(ES)->lookup( 381 toLookupKind(K), SO, std::move(SLS), SymbolState::Ready, 382 [HandleResult, Ctx](Expected<SymbolMap> Result) { 383 if (Result) { 384 SmallVector<LLVMOrcCSymbolMapPair> CResult; 385 for (auto &KV : *Result) 386 CResult.push_back(LLVMOrcCSymbolMapPair{ 387 wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(KV.first)), 388 fromJITEvaluatedSymbol(KV.second)}); 389 HandleResult(LLVMErrorSuccess, CResult.data(), CResult.size(), Ctx); 390 } else 391 HandleResult(wrap(Result.takeError()), nullptr, 0, Ctx); 392 }, 393 NoDependenciesToRegister); 394 } 395 396 void LLVMOrcRetainSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) { 397 OrcV2CAPIHelper::retainPoolEntry(unwrap(S)); 398 } 399 400 void LLVMOrcReleaseSymbolStringPoolEntry(LLVMOrcSymbolStringPoolEntryRef S) { 401 OrcV2CAPIHelper::releasePoolEntry(unwrap(S)); 402 } 403 404 const char *LLVMOrcSymbolStringPoolEntryStr(LLVMOrcSymbolStringPoolEntryRef S) { 405 return unwrap(S)->getKey().data(); 406 } 407 408 LLVMOrcResourceTrackerRef 409 LLVMOrcJITDylibCreateResourceTracker(LLVMOrcJITDylibRef JD) { 410 auto RT = unwrap(JD)->createResourceTracker(); 411 // Retain the pointer for the C API client. 412 RT->Retain(); 413 return wrap(RT.get()); 414 } 415 416 LLVMOrcResourceTrackerRef 417 LLVMOrcJITDylibGetDefaultResourceTracker(LLVMOrcJITDylibRef JD) { 418 auto RT = unwrap(JD)->getDefaultResourceTracker(); 419 // Retain the pointer for the C API client. 420 return wrap(RT.get()); 421 } 422 423 void LLVMOrcReleaseResourceTracker(LLVMOrcResourceTrackerRef RT) { 424 ResourceTrackerSP TmpRT(unwrap(RT)); 425 TmpRT->Release(); 426 } 427 428 void LLVMOrcResourceTrackerTransferTo(LLVMOrcResourceTrackerRef SrcRT, 429 LLVMOrcResourceTrackerRef DstRT) { 430 ResourceTrackerSP TmpRT(unwrap(SrcRT)); 431 TmpRT->transferTo(*unwrap(DstRT)); 432 } 433 434 LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) { 435 ResourceTrackerSP TmpRT(unwrap(RT)); 436 return wrap(TmpRT->remove()); 437 } 438 439 void LLVMOrcDisposeDefinitionGenerator(LLVMOrcDefinitionGeneratorRef DG) { 440 std::unique_ptr<DefinitionGenerator> TmpDG(unwrap(DG)); 441 } 442 443 void LLVMOrcDisposeMaterializationUnit(LLVMOrcMaterializationUnitRef MU) { 444 std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 445 } 446 447 LLVMOrcMaterializationUnitRef LLVMOrcCreateCustomMaterializationUnit( 448 const char *Name, void *Ctx, LLVMOrcCSymbolFlagsMapPairs Syms, 449 size_t NumSyms, LLVMOrcSymbolStringPoolEntryRef InitSym, 450 LLVMOrcMaterializationUnitMaterializeFunction Materialize, 451 LLVMOrcMaterializationUnitDiscardFunction Discard, 452 LLVMOrcMaterializationUnitDestroyFunction Destroy) { 453 SymbolFlagsMap SFM; 454 for (size_t I = 0; I != NumSyms; ++I) 455 SFM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] = 456 toJITSymbolFlags(Syms[I].Flags); 457 458 auto IS = OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(InitSym)); 459 460 return wrap(new OrcCAPIMaterializationUnit( 461 Name, std::move(SFM), std::move(IS), Ctx, Materialize, Discard, Destroy)); 462 } 463 464 LLVMOrcMaterializationUnitRef 465 LLVMOrcAbsoluteSymbols(LLVMOrcCSymbolMapPairs Syms, size_t NumPairs) { 466 SymbolMap SM = toSymbolMap(Syms, NumPairs); 467 return wrap(absoluteSymbols(std::move(SM)).release()); 468 } 469 470 LLVMOrcMaterializationUnitRef LLVMOrcLazyReexports( 471 LLVMOrcLazyCallThroughManagerRef LCTM, LLVMOrcIndirectStubsManagerRef ISM, 472 LLVMOrcJITDylibRef SourceJD, LLVMOrcCSymbolAliasMapPairs CallableAliases, 473 size_t NumPairs) { 474 475 SymbolAliasMap SAM; 476 for (size_t I = 0; I != NumPairs; ++I) { 477 auto pair = CallableAliases[I]; 478 JITSymbolFlags Flags = toJITSymbolFlags(pair.Entry.Flags); 479 SymbolStringPtr Name = 480 OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(pair.Entry.Name)); 481 SAM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(pair.Name))] = 482 SymbolAliasMapEntry(Name, Flags); 483 } 484 485 return wrap(lazyReexports(*unwrap(LCTM), *unwrap(ISM), *unwrap(SourceJD), 486 std::move(SAM)) 487 .release()); 488 } 489 490 void LLVMOrcDisposeMaterializationResponsibility( 491 LLVMOrcMaterializationResponsibilityRef MR) { 492 std::unique_ptr<MaterializationResponsibility> TmpMR(unwrap(MR)); 493 } 494 495 LLVMOrcJITDylibRef LLVMOrcMaterializationResponsibilityGetTargetDylib( 496 LLVMOrcMaterializationResponsibilityRef MR) { 497 return wrap(&unwrap(MR)->getTargetJITDylib()); 498 } 499 500 LLVMOrcExecutionSessionRef 501 LLVMOrcMaterializationResponsibilityGetExecutionSession( 502 LLVMOrcMaterializationResponsibilityRef MR) { 503 return wrap(&unwrap(MR)->getExecutionSession()); 504 } 505 506 LLVMOrcCSymbolFlagsMapPairs LLVMOrcMaterializationResponsibilityGetSymbols( 507 LLVMOrcMaterializationResponsibilityRef MR, size_t *NumPairs) { 508 509 auto Symbols = unwrap(MR)->getSymbols(); 510 LLVMOrcCSymbolFlagsMapPairs Result = static_cast<LLVMOrcCSymbolFlagsMapPairs>( 511 safe_malloc(Symbols.size() * sizeof(LLVMOrcCSymbolFlagsMapPair))); 512 size_t I = 0; 513 for (auto const &pair : Symbols) { 514 auto Name = wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(pair.first)); 515 auto Flags = pair.second; 516 Result[I] = {Name, fromJITSymbolFlags(Flags)}; 517 I++; 518 } 519 *NumPairs = Symbols.size(); 520 return Result; 521 } 522 523 void LLVMOrcDisposeCSymbolFlagsMap(LLVMOrcCSymbolFlagsMapPairs Pairs) { 524 free(Pairs); 525 } 526 527 LLVMOrcSymbolStringPoolEntryRef 528 LLVMOrcMaterializationResponsibilityGetInitializerSymbol( 529 LLVMOrcMaterializationResponsibilityRef MR) { 530 auto Sym = unwrap(MR)->getInitializerSymbol(); 531 return wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Sym)); 532 } 533 534 LLVMOrcSymbolStringPoolEntryRef * 535 LLVMOrcMaterializationResponsibilityGetRequestedSymbols( 536 LLVMOrcMaterializationResponsibilityRef MR, size_t *NumSymbols) { 537 538 auto Symbols = unwrap(MR)->getRequestedSymbols(); 539 LLVMOrcSymbolStringPoolEntryRef *Result = 540 static_cast<LLVMOrcSymbolStringPoolEntryRef *>(safe_malloc( 541 Symbols.size() * sizeof(LLVMOrcSymbolStringPoolEntryRef))); 542 size_t I = 0; 543 for (auto &Name : Symbols) { 544 Result[I] = wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name)); 545 I++; 546 } 547 *NumSymbols = Symbols.size(); 548 return Result; 549 } 550 551 void LLVMOrcDisposeSymbols(LLVMOrcSymbolStringPoolEntryRef *Symbols) { 552 free(Symbols); 553 } 554 555 LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyResolved( 556 LLVMOrcMaterializationResponsibilityRef MR, LLVMOrcCSymbolMapPairs Symbols, 557 size_t NumPairs) { 558 SymbolMap SM = toSymbolMap(Symbols, NumPairs); 559 return wrap(unwrap(MR)->notifyResolved(std::move(SM))); 560 } 561 562 LLVMErrorRef LLVMOrcMaterializationResponsibilityNotifyEmitted( 563 LLVMOrcMaterializationResponsibilityRef MR) { 564 return wrap(unwrap(MR)->notifyEmitted()); 565 } 566 567 LLVMErrorRef LLVMOrcMaterializationResponsibilityDefineMaterializing( 568 LLVMOrcMaterializationResponsibilityRef MR, 569 LLVMOrcCSymbolFlagsMapPairs Syms, size_t NumSyms) { 570 SymbolFlagsMap SFM; 571 for (size_t I = 0; I != NumSyms; ++I) 572 SFM[OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Syms[I].Name))] = 573 toJITSymbolFlags(Syms[I].Flags); 574 575 return wrap(unwrap(MR)->defineMaterializing(std::move(SFM))); 576 } 577 578 LLVMErrorRef LLVMOrcMaterializationResponsibilityReplace( 579 LLVMOrcMaterializationResponsibilityRef MR, 580 LLVMOrcMaterializationUnitRef MU) { 581 std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 582 return wrap(unwrap(MR)->replace(std::move(TmpMU))); 583 } 584 585 LLVMErrorRef LLVMOrcMaterializationResponsibilityDelegate( 586 LLVMOrcMaterializationResponsibilityRef MR, 587 LLVMOrcSymbolStringPoolEntryRef *Symbols, size_t NumSymbols, 588 LLVMOrcMaterializationResponsibilityRef *Result) { 589 SymbolNameSet Syms; 590 for (size_t I = 0; I != NumSymbols; I++) { 591 Syms.insert(OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Symbols[I]))); 592 } 593 auto OtherMR = unwrap(MR)->delegate(Syms); 594 595 if (!OtherMR) { 596 return wrap(OtherMR.takeError()); 597 } 598 *Result = wrap(OtherMR->release()); 599 return LLVMErrorSuccess; 600 } 601 602 void LLVMOrcMaterializationResponsibilityAddDependencies( 603 LLVMOrcMaterializationResponsibilityRef MR, 604 LLVMOrcSymbolStringPoolEntryRef Name, 605 LLVMOrcCDependenceMapPairs Dependencies, size_t NumPairs) { 606 607 SymbolDependenceMap SDM = toSymbolDependenceMap(Dependencies, NumPairs); 608 auto Sym = OrcV2CAPIHelper::moveToSymbolStringPtr(unwrap(Name)); 609 unwrap(MR)->addDependencies(Sym, SDM); 610 } 611 612 void LLVMOrcMaterializationResponsibilityAddDependenciesForAll( 613 LLVMOrcMaterializationResponsibilityRef MR, 614 LLVMOrcCDependenceMapPairs Dependencies, size_t NumPairs) { 615 616 SymbolDependenceMap SDM = toSymbolDependenceMap(Dependencies, NumPairs); 617 unwrap(MR)->addDependenciesForAll(SDM); 618 } 619 620 void LLVMOrcMaterializationResponsibilityFailMaterialization( 621 LLVMOrcMaterializationResponsibilityRef MR) { 622 unwrap(MR)->failMaterialization(); 623 } 624 625 void LLVMOrcIRTransformLayerEmit(LLVMOrcIRTransformLayerRef IRLayer, 626 LLVMOrcMaterializationResponsibilityRef MR, 627 LLVMOrcThreadSafeModuleRef TSM) { 628 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 629 unwrap(IRLayer)->emit( 630 std::unique_ptr<MaterializationResponsibility>(unwrap(MR)), 631 std::move(*TmpTSM)); 632 } 633 634 LLVMOrcJITDylibRef 635 LLVMOrcExecutionSessionCreateBareJITDylib(LLVMOrcExecutionSessionRef ES, 636 const char *Name) { 637 return wrap(&unwrap(ES)->createBareJITDylib(Name)); 638 } 639 640 LLVMErrorRef 641 LLVMOrcExecutionSessionCreateJITDylib(LLVMOrcExecutionSessionRef ES, 642 LLVMOrcJITDylibRef *Result, 643 const char *Name) { 644 auto JD = unwrap(ES)->createJITDylib(Name); 645 if (!JD) 646 return wrap(JD.takeError()); 647 *Result = wrap(&*JD); 648 return LLVMErrorSuccess; 649 } 650 651 LLVMOrcJITDylibRef 652 LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES, 653 const char *Name) { 654 return wrap(unwrap(ES)->getJITDylibByName(Name)); 655 } 656 657 LLVMErrorRef LLVMOrcJITDylibDefine(LLVMOrcJITDylibRef JD, 658 LLVMOrcMaterializationUnitRef MU) { 659 std::unique_ptr<MaterializationUnit> TmpMU(unwrap(MU)); 660 661 if (auto Err = unwrap(JD)->define(TmpMU)) { 662 TmpMU.release(); 663 return wrap(std::move(Err)); 664 } 665 return LLVMErrorSuccess; 666 } 667 668 LLVMErrorRef LLVMOrcJITDylibClear(LLVMOrcJITDylibRef JD) { 669 return wrap(unwrap(JD)->clear()); 670 } 671 672 void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD, 673 LLVMOrcDefinitionGeneratorRef DG) { 674 unwrap(JD)->addGenerator(std::unique_ptr<DefinitionGenerator>(unwrap(DG))); 675 } 676 677 LLVMOrcDefinitionGeneratorRef LLVMOrcCreateCustomCAPIDefinitionGenerator( 678 LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F, void *Ctx, 679 LLVMOrcDisposeCAPIDefinitionGeneratorFunction Dispose) { 680 auto DG = std::make_unique<CAPIDefinitionGenerator>(Dispose, Ctx, F); 681 return wrap(DG.release()); 682 } 683 684 void LLVMOrcLookupStateContinueLookup(LLVMOrcLookupStateRef S, 685 LLVMErrorRef Err) { 686 LookupState LS; 687 OrcV2CAPIHelper::resetLookupState(LS, ::unwrap(S)); 688 LS.continueLookup(unwrap(Err)); 689 } 690 691 LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess( 692 LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix, 693 LLVMOrcSymbolPredicate Filter, void *FilterCtx) { 694 assert(Result && "Result can not be null"); 695 assert((Filter || !FilterCtx) && 696 "if Filter is null then FilterCtx must also be null"); 697 698 DynamicLibrarySearchGenerator::SymbolPredicate Pred; 699 if (Filter) 700 Pred = [=](const SymbolStringPtr &Name) -> bool { 701 return Filter(FilterCtx, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name))); 702 }; 703 704 auto ProcessSymsGenerator = 705 DynamicLibrarySearchGenerator::GetForCurrentProcess(GlobalPrefix, Pred); 706 707 if (!ProcessSymsGenerator) { 708 *Result = nullptr; 709 return wrap(ProcessSymsGenerator.takeError()); 710 } 711 712 *Result = wrap(ProcessSymsGenerator->release()); 713 return LLVMErrorSuccess; 714 } 715 716 LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForPath( 717 LLVMOrcDefinitionGeneratorRef *Result, const char *FileName, 718 char GlobalPrefix, LLVMOrcSymbolPredicate Filter, void *FilterCtx) { 719 assert(Result && "Result can not be null"); 720 assert(FileName && "FileName can not be null"); 721 assert((Filter || !FilterCtx) && 722 "if Filter is null then FilterCtx must also be null"); 723 724 DynamicLibrarySearchGenerator::SymbolPredicate Pred; 725 if (Filter) 726 Pred = [=](const SymbolStringPtr &Name) -> bool { 727 return Filter(FilterCtx, wrap(OrcV2CAPIHelper::getRawPoolEntryPtr(Name))); 728 }; 729 730 auto LibrarySymsGenerator = 731 DynamicLibrarySearchGenerator::Load(FileName, GlobalPrefix, Pred); 732 733 if (!LibrarySymsGenerator) { 734 *Result = nullptr; 735 return wrap(LibrarySymsGenerator.takeError()); 736 } 737 738 *Result = wrap(LibrarySymsGenerator->release()); 739 return LLVMErrorSuccess; 740 } 741 742 LLVMErrorRef LLVMOrcCreateStaticLibrarySearchGeneratorForPath( 743 LLVMOrcDefinitionGeneratorRef *Result, LLVMOrcObjectLayerRef ObjLayer, 744 const char *FileName, const char *TargetTriple) { 745 assert(Result && "Result can not be null"); 746 assert(FileName && "Filename can not be null"); 747 assert(ObjLayer && "ObjectLayer can not be null"); 748 749 if (TargetTriple) { 750 auto TT = Triple(TargetTriple); 751 auto LibrarySymsGenerator = 752 StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer), FileName, TT); 753 if (!LibrarySymsGenerator) { 754 *Result = nullptr; 755 return wrap(LibrarySymsGenerator.takeError()); 756 } 757 *Result = wrap(LibrarySymsGenerator->release()); 758 return LLVMErrorSuccess; 759 } else { 760 auto LibrarySymsGenerator = 761 StaticLibraryDefinitionGenerator::Load(*unwrap(ObjLayer), FileName); 762 if (!LibrarySymsGenerator) { 763 *Result = nullptr; 764 return wrap(LibrarySymsGenerator.takeError()); 765 } 766 *Result = wrap(LibrarySymsGenerator->release()); 767 return LLVMErrorSuccess; 768 } 769 } 770 771 LLVMOrcThreadSafeContextRef LLVMOrcCreateNewThreadSafeContext(void) { 772 return wrap(new ThreadSafeContext(std::make_unique<LLVMContext>())); 773 } 774 775 LLVMContextRef 776 LLVMOrcThreadSafeContextGetContext(LLVMOrcThreadSafeContextRef TSCtx) { 777 return wrap(unwrap(TSCtx)->getContext()); 778 } 779 780 void LLVMOrcDisposeThreadSafeContext(LLVMOrcThreadSafeContextRef TSCtx) { 781 delete unwrap(TSCtx); 782 } 783 784 LLVMErrorRef 785 LLVMOrcThreadSafeModuleWithModuleDo(LLVMOrcThreadSafeModuleRef TSM, 786 LLVMOrcGenericIRModuleOperationFunction F, 787 void *Ctx) { 788 return wrap(unwrap(TSM)->withModuleDo( 789 [&](Module &M) { return unwrap(F(Ctx, wrap(&M))); })); 790 } 791 792 LLVMOrcThreadSafeModuleRef 793 LLVMOrcCreateNewThreadSafeModule(LLVMModuleRef M, 794 LLVMOrcThreadSafeContextRef TSCtx) { 795 return wrap( 796 new ThreadSafeModule(std::unique_ptr<Module>(unwrap(M)), *unwrap(TSCtx))); 797 } 798 799 void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM) { 800 delete unwrap(TSM); 801 } 802 803 LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost( 804 LLVMOrcJITTargetMachineBuilderRef *Result) { 805 assert(Result && "Result can not be null"); 806 807 auto JTMB = JITTargetMachineBuilder::detectHost(); 808 if (!JTMB) { 809 Result = nullptr; 810 return wrap(JTMB.takeError()); 811 } 812 813 *Result = wrap(new JITTargetMachineBuilder(std::move(*JTMB))); 814 return LLVMErrorSuccess; 815 } 816 817 LLVMOrcJITTargetMachineBuilderRef 818 LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM) { 819 auto *TemplateTM = unwrap(TM); 820 821 auto JTMB = 822 std::make_unique<JITTargetMachineBuilder>(TemplateTM->getTargetTriple()); 823 824 (*JTMB) 825 .setCPU(TemplateTM->getTargetCPU().str()) 826 .setRelocationModel(TemplateTM->getRelocationModel()) 827 .setCodeModel(TemplateTM->getCodeModel()) 828 .setCodeGenOptLevel(TemplateTM->getOptLevel()) 829 .setFeatures(TemplateTM->getTargetFeatureString()) 830 .setOptions(TemplateTM->Options); 831 832 LLVMDisposeTargetMachine(TM); 833 834 return wrap(JTMB.release()); 835 } 836 837 void LLVMOrcDisposeJITTargetMachineBuilder( 838 LLVMOrcJITTargetMachineBuilderRef JTMB) { 839 delete unwrap(JTMB); 840 } 841 842 char *LLVMOrcJITTargetMachineBuilderGetTargetTriple( 843 LLVMOrcJITTargetMachineBuilderRef JTMB) { 844 auto Tmp = unwrap(JTMB)->getTargetTriple().str(); 845 char *TargetTriple = (char *)malloc(Tmp.size() + 1); 846 strcpy(TargetTriple, Tmp.c_str()); 847 return TargetTriple; 848 } 849 850 void LLVMOrcJITTargetMachineBuilderSetTargetTriple( 851 LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple) { 852 unwrap(JTMB)->getTargetTriple() = Triple(TargetTriple); 853 } 854 855 LLVMErrorRef LLVMOrcObjectLayerAddObjectFile(LLVMOrcObjectLayerRef ObjLayer, 856 LLVMOrcJITDylibRef JD, 857 LLVMMemoryBufferRef ObjBuffer) { 858 return wrap(unwrap(ObjLayer)->add( 859 *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 860 } 861 862 LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcObjectLayerRef ObjLayer, 863 LLVMOrcResourceTrackerRef RT, 864 LLVMMemoryBufferRef ObjBuffer) { 865 return wrap( 866 unwrap(ObjLayer)->add(ResourceTrackerSP(unwrap(RT)), 867 std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 868 } 869 870 void LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer, 871 LLVMOrcMaterializationResponsibilityRef R, 872 LLVMMemoryBufferRef ObjBuffer) { 873 unwrap(ObjLayer)->emit( 874 std::unique_ptr<MaterializationResponsibility>(unwrap(R)), 875 std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer))); 876 } 877 878 void LLVMOrcDisposeObjectLayer(LLVMOrcObjectLayerRef ObjLayer) { 879 delete unwrap(ObjLayer); 880 } 881 882 void LLVMOrcIRTransformLayerSetTransform( 883 LLVMOrcIRTransformLayerRef IRTransformLayer, 884 LLVMOrcIRTransformLayerTransformFunction TransformFunction, void *Ctx) { 885 unwrap(IRTransformLayer) 886 ->setTransform( 887 [=](ThreadSafeModule TSM, 888 MaterializationResponsibility &R) -> Expected<ThreadSafeModule> { 889 LLVMOrcThreadSafeModuleRef TSMRef = 890 wrap(new ThreadSafeModule(std::move(TSM))); 891 if (LLVMErrorRef Err = TransformFunction(Ctx, &TSMRef, wrap(&R))) { 892 assert(!TSMRef && "TSMRef was not reset to null on error"); 893 return unwrap(Err); 894 } 895 return std::move(*unwrap(TSMRef)); 896 }); 897 } 898 899 void LLVMOrcObjectTransformLayerSetTransform( 900 LLVMOrcObjectTransformLayerRef ObjTransformLayer, 901 LLVMOrcObjectTransformLayerTransformFunction TransformFunction, void *Ctx) { 902 unwrap(ObjTransformLayer) 903 ->setTransform([TransformFunction, Ctx](std::unique_ptr<MemoryBuffer> Obj) 904 -> Expected<std::unique_ptr<MemoryBuffer>> { 905 LLVMMemoryBufferRef ObjBuffer = wrap(Obj.release()); 906 if (LLVMErrorRef Err = TransformFunction(Ctx, &ObjBuffer)) { 907 assert(!ObjBuffer && "ObjBuffer was not reset to null on error"); 908 return unwrap(Err); 909 } 910 return std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)); 911 }); 912 } 913 914 LLVMOrcDumpObjectsRef LLVMOrcCreateDumpObjects(const char *DumpDir, 915 const char *IdentifierOverride) { 916 assert(DumpDir && "DumpDir should not be null"); 917 assert(IdentifierOverride && "IdentifierOverride should not be null"); 918 return wrap(new DumpObjects(DumpDir, IdentifierOverride)); 919 } 920 921 void LLVMOrcDisposeDumpObjects(LLVMOrcDumpObjectsRef DumpObjects) { 922 delete unwrap(DumpObjects); 923 } 924 925 LLVMErrorRef LLVMOrcDumpObjects_CallOperator(LLVMOrcDumpObjectsRef DumpObjects, 926 LLVMMemoryBufferRef *ObjBuffer) { 927 std::unique_ptr<MemoryBuffer> OB(unwrap(*ObjBuffer)); 928 if (auto Result = (*unwrap(DumpObjects))(std::move(OB))) { 929 *ObjBuffer = wrap(Result->release()); 930 return LLVMErrorSuccess; 931 } else { 932 *ObjBuffer = nullptr; 933 return wrap(Result.takeError()); 934 } 935 } 936 937 LLVMOrcLLJITBuilderRef LLVMOrcCreateLLJITBuilder(void) { 938 return wrap(new LLJITBuilder()); 939 } 940 941 void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder) { 942 delete unwrap(Builder); 943 } 944 945 void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder( 946 LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB) { 947 unwrap(Builder)->setJITTargetMachineBuilder(std::move(*unwrap(JTMB))); 948 LLVMOrcDisposeJITTargetMachineBuilder(JTMB); 949 } 950 951 void LLVMOrcLLJITBuilderSetObjectLinkingLayerCreator( 952 LLVMOrcLLJITBuilderRef Builder, 953 LLVMOrcLLJITBuilderObjectLinkingLayerCreatorFunction F, void *Ctx) { 954 unwrap(Builder)->setObjectLinkingLayerCreator( 955 [=](ExecutionSession &ES, const Triple &TT) { 956 auto TTStr = TT.str(); 957 return std::unique_ptr<ObjectLayer>( 958 unwrap(F(Ctx, wrap(&ES), TTStr.c_str()))); 959 }); 960 } 961 962 LLVMErrorRef LLVMOrcCreateLLJIT(LLVMOrcLLJITRef *Result, 963 LLVMOrcLLJITBuilderRef Builder) { 964 assert(Result && "Result can not be null"); 965 966 if (!Builder) 967 Builder = LLVMOrcCreateLLJITBuilder(); 968 969 auto J = unwrap(Builder)->create(); 970 LLVMOrcDisposeLLJITBuilder(Builder); 971 972 if (!J) { 973 Result = nullptr; 974 return wrap(J.takeError()); 975 } 976 977 *Result = wrap(J->release()); 978 return LLVMErrorSuccess; 979 } 980 981 LLVMErrorRef LLVMOrcDisposeLLJIT(LLVMOrcLLJITRef J) { 982 delete unwrap(J); 983 return LLVMErrorSuccess; 984 } 985 986 LLVMOrcExecutionSessionRef LLVMOrcLLJITGetExecutionSession(LLVMOrcLLJITRef J) { 987 return wrap(&unwrap(J)->getExecutionSession()); 988 } 989 990 LLVMOrcJITDylibRef LLVMOrcLLJITGetMainJITDylib(LLVMOrcLLJITRef J) { 991 return wrap(&unwrap(J)->getMainJITDylib()); 992 } 993 994 const char *LLVMOrcLLJITGetTripleString(LLVMOrcLLJITRef J) { 995 return unwrap(J)->getTargetTriple().str().c_str(); 996 } 997 998 char LLVMOrcLLJITGetGlobalPrefix(LLVMOrcLLJITRef J) { 999 return unwrap(J)->getDataLayout().getGlobalPrefix(); 1000 } 1001 1002 LLVMOrcSymbolStringPoolEntryRef 1003 LLVMOrcLLJITMangleAndIntern(LLVMOrcLLJITRef J, const char *UnmangledName) { 1004 return wrap(OrcV2CAPIHelper::moveFromSymbolStringPtr( 1005 unwrap(J)->mangleAndIntern(UnmangledName))); 1006 } 1007 1008 LLVMErrorRef LLVMOrcLLJITAddObjectFile(LLVMOrcLLJITRef J, LLVMOrcJITDylibRef JD, 1009 LLVMMemoryBufferRef ObjBuffer) { 1010 return wrap(unwrap(J)->addObjectFile( 1011 *unwrap(JD), std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 1012 } 1013 1014 LLVMErrorRef LLVMOrcLLJITAddObjectFileWithRT(LLVMOrcLLJITRef J, 1015 LLVMOrcResourceTrackerRef RT, 1016 LLVMMemoryBufferRef ObjBuffer) { 1017 return wrap(unwrap(J)->addObjectFile( 1018 ResourceTrackerSP(unwrap(RT)), 1019 std::unique_ptr<MemoryBuffer>(unwrap(ObjBuffer)))); 1020 } 1021 1022 LLVMErrorRef LLVMOrcLLJITAddLLVMIRModule(LLVMOrcLLJITRef J, 1023 LLVMOrcJITDylibRef JD, 1024 LLVMOrcThreadSafeModuleRef TSM) { 1025 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 1026 return wrap(unwrap(J)->addIRModule(*unwrap(JD), std::move(*TmpTSM))); 1027 } 1028 1029 LLVMErrorRef LLVMOrcLLJITAddLLVMIRModuleWithRT(LLVMOrcLLJITRef J, 1030 LLVMOrcResourceTrackerRef RT, 1031 LLVMOrcThreadSafeModuleRef TSM) { 1032 std::unique_ptr<ThreadSafeModule> TmpTSM(unwrap(TSM)); 1033 return wrap(unwrap(J)->addIRModule(ResourceTrackerSP(unwrap(RT)), 1034 std::move(*TmpTSM))); 1035 } 1036 1037 LLVMErrorRef LLVMOrcLLJITLookup(LLVMOrcLLJITRef J, 1038 LLVMOrcJITTargetAddress *Result, 1039 const char *Name) { 1040 assert(Result && "Result can not be null"); 1041 1042 auto Sym = unwrap(J)->lookup(Name); 1043 if (!Sym) { 1044 *Result = 0; 1045 return wrap(Sym.takeError()); 1046 } 1047 1048 *Result = Sym->getValue(); 1049 return LLVMErrorSuccess; 1050 } 1051 1052 LLVMOrcObjectLayerRef LLVMOrcLLJITGetObjLinkingLayer(LLVMOrcLLJITRef J) { 1053 return wrap(&unwrap(J)->getObjLinkingLayer()); 1054 } 1055 1056 LLVMOrcObjectTransformLayerRef 1057 LLVMOrcLLJITGetObjTransformLayer(LLVMOrcLLJITRef J) { 1058 return wrap(&unwrap(J)->getObjTransformLayer()); 1059 } 1060 1061 LLVMOrcObjectLayerRef 1062 LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager( 1063 LLVMOrcExecutionSessionRef ES) { 1064 assert(ES && "ES must not be null"); 1065 return wrap(new RTDyldObjectLinkingLayer( 1066 *unwrap(ES), [] { return std::make_unique<SectionMemoryManager>(); })); 1067 } 1068 1069 void LLVMOrcRTDyldObjectLinkingLayerRegisterJITEventListener( 1070 LLVMOrcObjectLayerRef RTDyldObjLinkingLayer, 1071 LLVMJITEventListenerRef Listener) { 1072 assert(RTDyldObjLinkingLayer && "RTDyldObjLinkingLayer must not be null"); 1073 assert(Listener && "Listener must not be null"); 1074 reinterpret_cast<RTDyldObjectLinkingLayer *>(unwrap(RTDyldObjLinkingLayer)) 1075 ->registerJITEventListener(*unwrap(Listener)); 1076 } 1077 1078 LLVMOrcIRTransformLayerRef LLVMOrcLLJITGetIRTransformLayer(LLVMOrcLLJITRef J) { 1079 return wrap(&unwrap(J)->getIRTransformLayer()); 1080 } 1081 1082 const char *LLVMOrcLLJITGetDataLayoutStr(LLVMOrcLLJITRef J) { 1083 return unwrap(J)->getDataLayout().getStringRepresentation().c_str(); 1084 } 1085 1086 LLVMOrcIndirectStubsManagerRef 1087 LLVMOrcCreateLocalIndirectStubsManager(const char *TargetTriple) { 1088 auto builder = createLocalIndirectStubsManagerBuilder(Triple(TargetTriple)); 1089 return wrap(builder().release()); 1090 } 1091 1092 void LLVMOrcDisposeIndirectStubsManager(LLVMOrcIndirectStubsManagerRef ISM) { 1093 std::unique_ptr<IndirectStubsManager> TmpISM(unwrap(ISM)); 1094 } 1095 1096 LLVMErrorRef LLVMOrcCreateLocalLazyCallThroughManager( 1097 const char *TargetTriple, LLVMOrcExecutionSessionRef ES, 1098 LLVMOrcJITTargetAddress ErrorHandlerAddr, 1099 LLVMOrcLazyCallThroughManagerRef *Result) { 1100 auto LCTM = createLocalLazyCallThroughManager(Triple(TargetTriple), 1101 *unwrap(ES), ErrorHandlerAddr); 1102 1103 if (!LCTM) 1104 return wrap(LCTM.takeError()); 1105 *Result = wrap(LCTM->release()); 1106 return LLVMErrorSuccess; 1107 } 1108 1109 void LLVMOrcDisposeLazyCallThroughManager( 1110 LLVMOrcLazyCallThroughManagerRef LCM) { 1111 std::unique_ptr<LazyCallThroughManager> TmpLCM(unwrap(LCM)); 1112 } 1113