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