1 //===--------- LLJIT.cpp - An ORC-based JIT for compiling LLVM IR ---------===// 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/ExecutionEngine/Orc/LLJIT.h" 10 #include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h" 11 #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h" 12 #include "llvm/ExecutionEngine/Orc/MachOPlatform.h" 13 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" 14 #include "llvm/ExecutionEngine/Orc/OrcError.h" 15 #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" 16 #include "llvm/ExecutionEngine/SectionMemoryManager.h" 17 #include "llvm/IR/GlobalVariable.h" 18 #include "llvm/IR/IRBuilder.h" 19 #include "llvm/IR/Mangler.h" 20 #include "llvm/IR/Module.h" 21 #include "llvm/Support/DynamicLibrary.h" 22 23 #include <map> 24 25 #define DEBUG_TYPE "orc" 26 27 using namespace llvm; 28 using namespace llvm::orc; 29 30 namespace { 31 32 /// Add a reference to the __dso_handle global to the given module. 33 /// Returns a reference to the __dso_handle IR decl. 34 GlobalVariable *addDSOHandleDecl(Module &M) { 35 auto DSOHandleTy = StructType::create(M.getContext(), "lljit.dso_handle"); 36 return new GlobalVariable(M, DSOHandleTy, true, GlobalValue::ExternalLinkage, 37 nullptr, "__dso_handle"); 38 } 39 40 /// Adds helper function decls and wrapper functions that call the helper with 41 /// some additional prefix arguments. 42 /// 43 /// E.g. For wrapper "foo" with type i8(i8, i64), helper "bar", and prefix 44 /// args i32 4 and i16 12345, this function will add: 45 /// 46 /// declare i8 @bar(i32, i16, i8, i64) 47 /// 48 /// define i8 @foo(i8, i64) { 49 /// entry: 50 /// %2 = call i8 @bar(i32 4, i16 12345, i8 %0, i64 %1) 51 /// ret i8 %2 52 /// } 53 /// 54 Function *addHelperAndWrapper(Module &M, StringRef WrapperName, 55 FunctionType *WrapperFnType, 56 GlobalValue::VisibilityTypes WrapperVisibility, 57 StringRef HelperName, 58 ArrayRef<Value *> HelperPrefixArgs) { 59 std::vector<Type *> HelperArgTypes; 60 for (auto *Arg : HelperPrefixArgs) 61 HelperArgTypes.push_back(Arg->getType()); 62 for (auto *T : WrapperFnType->params()) 63 HelperArgTypes.push_back(T); 64 auto *HelperFnType = 65 FunctionType::get(WrapperFnType->getReturnType(), HelperArgTypes, false); 66 auto *HelperFn = Function::Create(HelperFnType, GlobalValue::ExternalLinkage, 67 HelperName, M); 68 69 auto *WrapperFn = Function::Create( 70 WrapperFnType, GlobalValue::ExternalLinkage, WrapperName, M); 71 WrapperFn->setVisibility(WrapperVisibility); 72 73 auto *EntryBlock = BasicBlock::Create(M.getContext(), "entry", WrapperFn); 74 IRBuilder<> IB(EntryBlock); 75 76 std::vector<Value *> HelperArgs; 77 for (auto *Arg : HelperPrefixArgs) 78 HelperArgs.push_back(Arg); 79 for (auto &Arg : WrapperFn->args()) 80 HelperArgs.push_back(&Arg); 81 auto *HelperResult = IB.CreateCall(HelperFn, HelperArgs); 82 if (HelperFn->getReturnType()->isVoidTy()) 83 IB.CreateRetVoid(); 84 else 85 IB.CreateRet(HelperResult); 86 87 return WrapperFn; 88 } 89 90 class GenericLLVMIRPlatformSupport; 91 92 /// orc::Platform component of Generic LLVM IR Platform support. 93 /// Just forwards calls to the GenericLLVMIRPlatformSupport class below. 94 class GenericLLVMIRPlatform : public Platform { 95 public: 96 GenericLLVMIRPlatform(GenericLLVMIRPlatformSupport &S) : S(S) {} 97 Error setupJITDylib(JITDylib &JD) override; 98 Error notifyAdding(JITDylib &JD, const MaterializationUnit &MU) override; 99 Error notifyRemoving(JITDylib &JD, VModuleKey K) override { 100 // Noop -- Nothing to do (yet). 101 return Error::success(); 102 } 103 104 private: 105 GenericLLVMIRPlatformSupport &S; 106 }; 107 108 /// This transform parses llvm.global_ctors to produce a single initialization 109 /// function for the module, records the function, then deletes 110 /// llvm.global_ctors. 111 class GlobalCtorDtorScraper { 112 public: 113 114 GlobalCtorDtorScraper(GenericLLVMIRPlatformSupport &PS, 115 StringRef InitFunctionPrefix) 116 : PS(PS), InitFunctionPrefix(InitFunctionPrefix) {} 117 Expected<ThreadSafeModule> operator()(ThreadSafeModule TSM, 118 MaterializationResponsibility &R); 119 120 private: 121 GenericLLVMIRPlatformSupport &PS; 122 StringRef InitFunctionPrefix; 123 }; 124 125 /// Generic IR Platform Support 126 /// 127 /// Scrapes llvm.global_ctors and llvm.global_dtors and replaces them with 128 /// specially named 'init' and 'deinit'. Injects definitions / interposes for 129 /// some runtime API, including __cxa_atexit, dlopen, and dlclose. 130 class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport { 131 public: 132 // GenericLLVMIRPlatform &P) : P(P) { 133 GenericLLVMIRPlatformSupport(LLJIT &J) : J(J) { 134 135 MangleAndInterner Mangle(getExecutionSession(), J.getDataLayout()); 136 InitFunctionPrefix = Mangle("__orc_init_func."); 137 138 getExecutionSession().setPlatform( 139 std::make_unique<GenericLLVMIRPlatform>(*this)); 140 141 setInitTransform(J, GlobalCtorDtorScraper(*this, *InitFunctionPrefix)); 142 143 SymbolMap StdInterposes; 144 145 StdInterposes[Mangle("__lljit.platform_support_instance")] = 146 JITEvaluatedSymbol(pointerToJITTargetAddress(this), JITSymbolFlags()); 147 StdInterposes[Mangle("__lljit.cxa_atexit_helper")] = JITEvaluatedSymbol( 148 pointerToJITTargetAddress(registerAtExitHelper), JITSymbolFlags()); 149 StdInterposes[Mangle("__lljit.run_atexits_helper")] = JITEvaluatedSymbol( 150 pointerToJITTargetAddress(runAtExitsHelper), JITSymbolFlags()); 151 152 cantFail( 153 J.getMainJITDylib().define(absoluteSymbols(std::move(StdInterposes)))); 154 cantFail(setupJITDylib(J.getMainJITDylib())); 155 cantFail(J.addIRModule(J.getMainJITDylib(), createPlatformRuntimeModule())); 156 } 157 158 ExecutionSession &getExecutionSession() { return J.getExecutionSession(); } 159 160 /// Adds a module that defines the __dso_handle global. 161 Error setupJITDylib(JITDylib &JD) { 162 auto Ctx = std::make_unique<LLVMContext>(); 163 auto M = std::make_unique<Module>("__standard_lib", *Ctx); 164 M->setDataLayout(J.getDataLayout()); 165 166 auto *Int64Ty = Type::getInt64Ty(*Ctx); 167 auto *DSOHandle = new GlobalVariable( 168 *M, Int64Ty, true, GlobalValue::ExternalLinkage, 169 ConstantInt::get(Int64Ty, reinterpret_cast<uintptr_t>(&JD)), 170 "__dso_handle"); 171 DSOHandle->setVisibility(GlobalValue::HiddenVisibility); 172 DSOHandle->setInitializer( 173 ConstantInt::get(Int64Ty, pointerToJITTargetAddress(&JD))); 174 return J.addIRModule(JD, ThreadSafeModule(std::move(M), std::move(Ctx))); 175 } 176 177 Error notifyAdding(JITDylib &JD, const MaterializationUnit &MU) { 178 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 179 if (auto &InitSym = MU.getInitializerSymbol()) 180 InitSymbols[&JD].add(InitSym); 181 else { 182 // If there's no identified init symbol attached, but there is a symbol 183 // with the GenericIRPlatform::InitFunctionPrefix, then treat that as 184 // an init function. Add the symbol to both the InitSymbols map (which 185 // will trigger a lookup to materialize the module) and the InitFunctions 186 // map (which holds the names of the symbols to execute). 187 for (auto &KV : MU.getSymbols()) 188 if ((*KV.first).startswith(*InitFunctionPrefix)) { 189 InitSymbols[&JD].add(KV.first); 190 InitFunctions[&JD].add(KV.first); 191 } 192 } 193 return Error::success(); 194 } 195 196 Error initialize(JITDylib &JD) override { 197 LLVM_DEBUG({ 198 dbgs() << "GenericLLVMIRPlatformSupport getting initializers to run\n"; 199 }); 200 if (auto Initializers = getInitializers(JD)) { 201 LLVM_DEBUG( 202 { dbgs() << "GenericLLVMIRPlatformSupport running initializers\n"; }); 203 for (auto InitFnAddr : *Initializers) { 204 LLVM_DEBUG({ 205 dbgs() << " Running init " << formatv("{0:x16}", InitFnAddr) 206 << "...\n"; 207 }); 208 auto *InitFn = jitTargetAddressToFunction<void (*)()>(InitFnAddr); 209 InitFn(); 210 } 211 } else 212 return Initializers.takeError(); 213 return Error::success(); 214 } 215 216 Error deinitialize(JITDylib &JD) override { 217 LLVM_DEBUG({ 218 dbgs() << "GenericLLVMIRPlatformSupport getting deinitializers to run\n"; 219 }); 220 if (auto Deinitializers = getDeinitializers(JD)) { 221 LLVM_DEBUG({ 222 dbgs() << "GenericLLVMIRPlatformSupport running deinitializers\n"; 223 }); 224 for (auto DeinitFnAddr : *Deinitializers) { 225 LLVM_DEBUG({ 226 dbgs() << " Running init " << formatv("{0:x16}", DeinitFnAddr) 227 << "...\n"; 228 }); 229 auto *DeinitFn = jitTargetAddressToFunction<void (*)()>(DeinitFnAddr); 230 DeinitFn(); 231 } 232 } else 233 return Deinitializers.takeError(); 234 235 return Error::success(); 236 } 237 238 void registerInitFunc(JITDylib &JD, SymbolStringPtr InitName) { 239 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 240 InitFunctions[&JD].add(InitName); 241 } 242 243 private: 244 Expected<std::vector<JITTargetAddress>> getInitializers(JITDylib &JD) { 245 if (auto Err = issueInitLookups(JD)) 246 return std::move(Err); 247 248 DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols; 249 std::vector<JITDylib *> DFSLinkOrder; 250 251 { 252 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 253 DFSLinkOrder = getDFSLinkOrder(JD); 254 255 for (auto *NextJD : DFSLinkOrder) { 256 auto IFItr = InitFunctions.find(NextJD); 257 if (IFItr != InitFunctions.end()) { 258 LookupSymbols[NextJD] = std::move(IFItr->second); 259 InitFunctions.erase(IFItr); 260 } 261 } 262 } 263 264 LLVM_DEBUG({ 265 dbgs() << "JITDylib init order is [ "; 266 for (auto *JD : llvm::reverse(DFSLinkOrder)) 267 dbgs() << "\"" << JD->getName() << "\" "; 268 dbgs() << "]\n"; 269 dbgs() << "Looking up init functions:\n"; 270 for (auto &KV : LookupSymbols) 271 dbgs() << " \"" << KV.first->getName() << "\": " << KV.second << "\n"; 272 }); 273 274 auto &ES = getExecutionSession(); 275 auto LookupResult = Platform::lookupInitSymbols(ES, LookupSymbols); 276 277 if (!LookupResult) 278 return LookupResult.takeError(); 279 280 std::vector<JITTargetAddress> Initializers; 281 while (!DFSLinkOrder.empty()) { 282 auto &NextJD = *DFSLinkOrder.back(); 283 DFSLinkOrder.pop_back(); 284 auto InitsItr = LookupResult->find(&NextJD); 285 if (InitsItr == LookupResult->end()) 286 continue; 287 for (auto &KV : InitsItr->second) 288 Initializers.push_back(KV.second.getAddress()); 289 } 290 291 return Initializers; 292 } 293 294 Expected<std::vector<JITTargetAddress>> getDeinitializers(JITDylib &JD) { 295 auto &ES = getExecutionSession(); 296 297 MangleAndInterner Mangle(getExecutionSession(), J.getDataLayout()); 298 auto LLJITRunAtExits = Mangle("__lljit_run_atexits"); 299 300 DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols; 301 std::vector<JITDylib *> DFSLinkOrder; 302 303 { 304 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 305 DFSLinkOrder = getDFSLinkOrder(JD); 306 307 for (auto *NextJD : DFSLinkOrder) { 308 auto &JDLookupSymbols = LookupSymbols[NextJD]; 309 auto DIFItr = DeInitFunctions.find(NextJD); 310 if (DIFItr != DeInitFunctions.end()) { 311 LookupSymbols[NextJD] = std::move(DIFItr->second); 312 DeInitFunctions.erase(DIFItr); 313 } 314 JDLookupSymbols.add(LLJITRunAtExits, 315 SymbolLookupFlags::WeaklyReferencedSymbol); 316 } 317 } 318 319 auto LookupResult = Platform::lookupInitSymbols(ES, LookupSymbols); 320 321 if (!LookupResult) 322 return LookupResult.takeError(); 323 324 std::vector<JITTargetAddress> DeInitializers; 325 for (auto *NextJD : DFSLinkOrder) { 326 auto DeInitsItr = LookupResult->find(NextJD); 327 assert(DeInitsItr != LookupResult->end() && 328 "Every JD should have at least __lljit_run_atexits"); 329 330 auto RunAtExitsItr = DeInitsItr->second.find(LLJITRunAtExits); 331 if (RunAtExitsItr != DeInitsItr->second.end()) 332 DeInitializers.push_back(RunAtExitsItr->second.getAddress()); 333 334 for (auto &KV : DeInitsItr->second) 335 if (KV.first != LLJITRunAtExits) 336 DeInitializers.push_back(KV.second.getAddress()); 337 } 338 339 return DeInitializers; 340 } 341 342 // Returns a DFS traversal order of the JITDylibs reachable (via 343 // links-against edges) from JD, starting with JD itself. 344 static std::vector<JITDylib *> getDFSLinkOrder(JITDylib &JD) { 345 std::vector<JITDylib *> DFSLinkOrder; 346 std::vector<JITDylib *> WorkStack({&JD}); 347 DenseSet<JITDylib *> Visited; 348 349 while (!WorkStack.empty()) { 350 auto &NextJD = *WorkStack.back(); 351 WorkStack.pop_back(); 352 if (Visited.count(&NextJD)) 353 continue; 354 Visited.insert(&NextJD); 355 DFSLinkOrder.push_back(&NextJD); 356 NextJD.withSearchOrderDo([&](const JITDylibSearchOrder &SearchOrder) { 357 for (auto &KV : SearchOrder) 358 WorkStack.push_back(KV.first); 359 }); 360 } 361 362 return DFSLinkOrder; 363 } 364 365 /// Issue lookups for all init symbols required to initialize JD (and any 366 /// JITDylibs that it depends on). 367 Error issueInitLookups(JITDylib &JD) { 368 DenseMap<JITDylib *, SymbolLookupSet> RequiredInitSymbols; 369 370 { 371 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 372 373 auto DFSLinkOrder = getDFSLinkOrder(JD); 374 375 for (auto *NextJD : DFSLinkOrder) { 376 auto ISItr = InitSymbols.find(NextJD); 377 if (ISItr != InitSymbols.end()) { 378 RequiredInitSymbols[NextJD] = std::move(ISItr->second); 379 InitSymbols.erase(ISItr); 380 } 381 } 382 } 383 384 return Platform::lookupInitSymbols(getExecutionSession(), 385 RequiredInitSymbols) 386 .takeError(); 387 } 388 389 static void registerAtExitHelper(void *Self, void (*F)(void *), void *Ctx, 390 void *DSOHandle) { 391 static_cast<GenericLLVMIRPlatformSupport *>(Self)->AtExitMgr.registerAtExit( 392 F, Ctx, DSOHandle); 393 } 394 395 static void runAtExitsHelper(void *Self, void *DSOHandle) { 396 static_cast<GenericLLVMIRPlatformSupport *>(Self)->AtExitMgr.runAtExits( 397 DSOHandle); 398 } 399 400 // Constructs an LLVM IR module containing platform runtime globals, 401 // functions, and interposes. 402 ThreadSafeModule createPlatformRuntimeModule() { 403 auto Ctx = std::make_unique<LLVMContext>(); 404 auto M = std::make_unique<Module>("__standard_lib", *Ctx); 405 M->setDataLayout(J.getDataLayout()); 406 407 auto *GenericIRPlatformSupportTy = 408 StructType::create(*Ctx, "lljit.GenericLLJITIRPlatformSupport"); 409 410 auto *PlatformInstanceDecl = new GlobalVariable( 411 *M, GenericIRPlatformSupportTy, true, GlobalValue::ExternalLinkage, 412 nullptr, "__lljit.platform_support_instance"); 413 414 auto *DSOHandleDecl = addDSOHandleDecl(*M); 415 416 auto *Int8Ty = Type::getInt8Ty(*Ctx); 417 auto *IntTy = Type::getIntNTy(*Ctx, sizeof(int) * CHAR_BIT); 418 auto *VoidTy = Type::getVoidTy(*Ctx); 419 auto *BytePtrTy = PointerType::getUnqual(Int8Ty); 420 auto *AtExitCallbackTy = FunctionType::get(VoidTy, {BytePtrTy}, false); 421 auto *AtExitCallbackPtrTy = PointerType::getUnqual(AtExitCallbackTy); 422 423 addHelperAndWrapper( 424 *M, "__cxa_atexit", 425 FunctionType::get(IntTy, {AtExitCallbackPtrTy, BytePtrTy, BytePtrTy}, 426 false), 427 GlobalValue::HiddenVisibility, "__lljit.cxa_atexit_helper", 428 {PlatformInstanceDecl}); 429 430 addHelperAndWrapper( 431 *M, "__lljit_run_atexits", FunctionType::get(VoidTy, {}, false), 432 GlobalValue::HiddenVisibility, "__lljit.run_atexits_helper", 433 {PlatformInstanceDecl, DSOHandleDecl}); 434 435 return ThreadSafeModule(std::move(M), std::move(Ctx)); 436 } 437 438 std::mutex PlatformSupportMutex; 439 LLJIT &J; 440 SymbolStringPtr InitFunctionPrefix; 441 DenseMap<JITDylib *, SymbolLookupSet> InitSymbols; 442 DenseMap<JITDylib *, SymbolLookupSet> InitFunctions; 443 DenseMap<JITDylib *, SymbolLookupSet> DeInitFunctions; 444 ItaniumCXAAtExitSupport AtExitMgr; 445 }; 446 447 Error GenericLLVMIRPlatform::setupJITDylib(JITDylib &JD) { 448 return S.setupJITDylib(JD); 449 } 450 451 Error GenericLLVMIRPlatform::notifyAdding(JITDylib &JD, 452 const MaterializationUnit &MU) { 453 return S.notifyAdding(JD, MU); 454 } 455 456 Expected<ThreadSafeModule> 457 GlobalCtorDtorScraper::operator()(ThreadSafeModule TSM, 458 MaterializationResponsibility &R) { 459 auto Err = TSM.withModuleDo([&](Module &M) -> Error { 460 auto &Ctx = M.getContext(); 461 auto *GlobalCtors = M.getNamedGlobal("llvm.global_ctors"); 462 463 // If there's no llvm.global_ctors or it's just a decl then skip. 464 if (!GlobalCtors || GlobalCtors->isDeclaration()) 465 return Error::success(); 466 467 std::string InitFunctionName; 468 raw_string_ostream(InitFunctionName) 469 << InitFunctionPrefix << M.getModuleIdentifier(); 470 471 MangleAndInterner Mangle(PS.getExecutionSession(), M.getDataLayout()); 472 auto InternedName = Mangle(InitFunctionName); 473 if (auto Err = 474 R.defineMaterializing({{InternedName, JITSymbolFlags::Callable}})) 475 return Err; 476 477 auto *InitFunc = 478 Function::Create(FunctionType::get(Type::getVoidTy(Ctx), {}, false), 479 GlobalValue::ExternalLinkage, InitFunctionName, &M); 480 InitFunc->setVisibility(GlobalValue::HiddenVisibility); 481 std::vector<std::pair<Function *, unsigned>> Inits; 482 for (auto E : getConstructors(M)) 483 Inits.push_back(std::make_pair(E.Func, E.Priority)); 484 llvm::sort(Inits, [](const std::pair<Function *, unsigned> &LHS, 485 const std::pair<Function *, unsigned> &RHS) { 486 return LHS.first < RHS.first; 487 }); 488 auto *EntryBlock = BasicBlock::Create(Ctx, "entry", InitFunc); 489 IRBuilder<> IB(EntryBlock); 490 for (auto &KV : Inits) 491 IB.CreateCall(KV.first); 492 IB.CreateRetVoid(); 493 494 PS.registerInitFunc(R.getTargetJITDylib(), InternedName); 495 GlobalCtors->eraseFromParent(); 496 return Error::success(); 497 }); 498 499 if (Err) 500 return std::move(Err); 501 502 return std::move(TSM); 503 } 504 505 class MachOPlatformSupport : public LLJIT::PlatformSupport { 506 public: 507 using DLOpenType = void *(*)(const char *Name, int Mode); 508 using DLCloseType = int (*)(void *Handle); 509 using DLSymType = void *(*)(void *Handle, const char *Name); 510 using DLErrorType = const char *(*)(); 511 512 struct DlFcnValues { 513 Optional<void *> RTLDDefault; 514 DLOpenType dlopen = nullptr; 515 DLCloseType dlclose = nullptr; 516 DLSymType dlsym = nullptr; 517 DLErrorType dlerror = nullptr; 518 }; 519 520 static Expected<std::unique_ptr<MachOPlatformSupport>> 521 Create(LLJIT &J, JITDylib &PlatformJITDylib) { 522 523 // Make process symbols visible. 524 { 525 std::string ErrMsg; 526 auto Lib = sys::DynamicLibrary::getPermanentLibrary(nullptr, &ErrMsg); 527 if (!Lib.isValid()) 528 return make_error<StringError>(std::move(ErrMsg), 529 inconvertibleErrorCode()); 530 } 531 532 DlFcnValues DlFcn; 533 534 // Add support for RTLDDefault on known platforms. 535 #ifdef __APPLE__ 536 DlFcn.RTLDDefault = reinterpret_cast<void *>(-2); 537 #endif // __APPLE__ 538 539 if (auto Err = hookUpFunction(DlFcn.dlopen, "dlopen")) 540 return std::move(Err); 541 if (auto Err = hookUpFunction(DlFcn.dlclose, "dlclose")) 542 return std::move(Err); 543 if (auto Err = hookUpFunction(DlFcn.dlsym, "dlsym")) 544 return std::move(Err); 545 if (auto Err = hookUpFunction(DlFcn.dlerror, "dlerror")) 546 return std::move(Err); 547 548 std::unique_ptr<MachOPlatformSupport> MP( 549 new MachOPlatformSupport(J, PlatformJITDylib, DlFcn)); 550 return std::move(MP); 551 } 552 553 Error initialize(JITDylib &JD) override { 554 LLVM_DEBUG({ 555 dbgs() << "MachOPlatformSupport initializing \"" << JD.getName() 556 << "\"\n"; 557 }); 558 559 auto InitSeq = MP.getInitializerSequence(JD); 560 if (!InitSeq) 561 return InitSeq.takeError(); 562 563 // If ObjC is not enabled but there are JIT'd ObjC inits then return 564 // an error. 565 if (!objCRegistrationEnabled()) 566 for (auto &KV : *InitSeq) { 567 if (!KV.second.getObjCSelRefsSections().empty() || 568 !KV.second.getObjCClassListSections().empty()) 569 return make_error<StringError>("JITDylib " + KV.first->getName() + 570 " contains objc metadata but objc" 571 " is not enabled", 572 inconvertibleErrorCode()); 573 } 574 575 // Run the initializers. 576 for (auto &KV : *InitSeq) { 577 if (objCRegistrationEnabled()) { 578 KV.second.registerObjCSelectors(); 579 if (auto Err = KV.second.registerObjCClasses()) { 580 // FIXME: Roll back registrations on error? 581 return Err; 582 } 583 } 584 KV.second.runModInits(); 585 } 586 587 return Error::success(); 588 } 589 590 Error deinitialize(JITDylib &JD) override { 591 auto &ES = J.getExecutionSession(); 592 if (auto DeinitSeq = MP.getDeinitializerSequence(JD)) { 593 for (auto &KV : *DeinitSeq) { 594 auto DSOHandleName = ES.intern("___dso_handle"); 595 596 // FIXME: Run DeInits here. 597 auto Result = ES.lookup( 598 {{KV.first, JITDylibLookupFlags::MatchAllSymbols}}, 599 SymbolLookupSet(DSOHandleName, 600 SymbolLookupFlags::WeaklyReferencedSymbol)); 601 if (!Result) 602 return Result.takeError(); 603 if (Result->empty()) 604 continue; 605 assert(Result->count(DSOHandleName) && 606 "Result does not contain __dso_handle"); 607 auto *DSOHandle = jitTargetAddressToPointer<void *>( 608 Result->begin()->second.getAddress()); 609 AtExitMgr.runAtExits(DSOHandle); 610 } 611 } else 612 return DeinitSeq.takeError(); 613 return Error::success(); 614 } 615 616 private: 617 template <typename FunctionPtrTy> 618 static Error hookUpFunction(FunctionPtrTy &Fn, const char *Name) { 619 if (auto *FnAddr = sys::DynamicLibrary::SearchForAddressOfSymbol(Name)) { 620 Fn = reinterpret_cast<FunctionPtrTy>(Fn); 621 return Error::success(); 622 } 623 624 return make_error<StringError>((Twine("Can not enable MachO JIT Platform: " 625 "missing function: ") + 626 Name) 627 .str(), 628 inconvertibleErrorCode()); 629 } 630 631 MachOPlatformSupport(LLJIT &J, JITDylib &PlatformJITDylib, DlFcnValues DlFcn) 632 : J(J), MP(setupPlatform(J)), DlFcn(std::move(DlFcn)) { 633 634 MangleAndInterner Mangle(J.getExecutionSession(), J.getDataLayout()); 635 SymbolMap HelperSymbols; 636 637 // platform and atexit helpers. 638 HelperSymbols[Mangle("__lljit.platform_support_instance")] = 639 JITEvaluatedSymbol(pointerToJITTargetAddress(this), JITSymbolFlags()); 640 HelperSymbols[Mangle("__lljit.cxa_atexit_helper")] = JITEvaluatedSymbol( 641 pointerToJITTargetAddress(registerAtExitHelper), JITSymbolFlags()); 642 HelperSymbols[Mangle("__lljit.run_atexits_helper")] = JITEvaluatedSymbol( 643 pointerToJITTargetAddress(runAtExitsHelper), JITSymbolFlags()); 644 645 // dlfcn helpers. 646 HelperSymbols[Mangle("__lljit.dlopen_helper")] = JITEvaluatedSymbol( 647 pointerToJITTargetAddress(dlopenHelper), JITSymbolFlags()); 648 HelperSymbols[Mangle("__lljit.dlclose_helper")] = JITEvaluatedSymbol( 649 pointerToJITTargetAddress(dlcloseHelper), JITSymbolFlags()); 650 HelperSymbols[Mangle("__lljit.dlsym_helper")] = JITEvaluatedSymbol( 651 pointerToJITTargetAddress(dlsymHelper), JITSymbolFlags()); 652 HelperSymbols[Mangle("__lljit.dlerror_helper")] = JITEvaluatedSymbol( 653 pointerToJITTargetAddress(dlerrorHelper), JITSymbolFlags()); 654 655 cantFail( 656 PlatformJITDylib.define(absoluteSymbols(std::move(HelperSymbols)))); 657 cantFail(MP.setupJITDylib(J.getMainJITDylib())); 658 cantFail(J.addIRModule(PlatformJITDylib, createPlatformRuntimeModule())); 659 } 660 661 static MachOPlatform &setupPlatform(LLJIT &J) { 662 auto Tmp = std::make_unique<MachOPlatform>( 663 J.getExecutionSession(), 664 static_cast<ObjectLinkingLayer &>(J.getObjLinkingLayer()), 665 createStandardSymbolsObject(J)); 666 auto &MP = *Tmp; 667 J.getExecutionSession().setPlatform(std::move(Tmp)); 668 return MP; 669 } 670 671 static std::unique_ptr<MemoryBuffer> createStandardSymbolsObject(LLJIT &J) { 672 LLVMContext Ctx; 673 Module M("__standard_symbols", Ctx); 674 M.setDataLayout(J.getDataLayout()); 675 676 auto *Int64Ty = Type::getInt64Ty(Ctx); 677 678 auto *DSOHandle = 679 new GlobalVariable(M, Int64Ty, true, GlobalValue::ExternalLinkage, 680 ConstantInt::get(Int64Ty, 0), "__dso_handle"); 681 DSOHandle->setVisibility(GlobalValue::HiddenVisibility); 682 683 return cantFail(J.getIRCompileLayer().getCompiler()(M)); 684 } 685 686 ThreadSafeModule createPlatformRuntimeModule() { 687 auto Ctx = std::make_unique<LLVMContext>(); 688 auto M = std::make_unique<Module>("__standard_lib", *Ctx); 689 M->setDataLayout(J.getDataLayout()); 690 691 auto *MachOPlatformSupportTy = 692 StructType::create(*Ctx, "lljit.MachOPlatformSupport"); 693 694 auto *PlatformInstanceDecl = new GlobalVariable( 695 *M, MachOPlatformSupportTy, true, GlobalValue::ExternalLinkage, nullptr, 696 "__lljit.platform_support_instance"); 697 698 auto *Int8Ty = Type::getInt8Ty(*Ctx); 699 auto *IntTy = Type::getIntNTy(*Ctx, sizeof(int) * CHAR_BIT); 700 auto *VoidTy = Type::getVoidTy(*Ctx); 701 auto *BytePtrTy = PointerType::getUnqual(Int8Ty); 702 auto *AtExitCallbackTy = FunctionType::get(VoidTy, {BytePtrTy}, false); 703 auto *AtExitCallbackPtrTy = PointerType::getUnqual(AtExitCallbackTy); 704 705 addHelperAndWrapper( 706 *M, "__cxa_atexit", 707 FunctionType::get(IntTy, {AtExitCallbackPtrTy, BytePtrTy, BytePtrTy}, 708 false), 709 GlobalValue::DefaultVisibility, "__lljit.cxa_atexit_helper", 710 {PlatformInstanceDecl}); 711 712 addHelperAndWrapper(*M, "dlopen", 713 FunctionType::get(BytePtrTy, {BytePtrTy, IntTy}, false), 714 GlobalValue::DefaultVisibility, "__lljit.dlopen_helper", 715 {PlatformInstanceDecl}); 716 717 addHelperAndWrapper(*M, "dlclose", 718 FunctionType::get(IntTy, {BytePtrTy}, false), 719 GlobalValue::DefaultVisibility, 720 "__lljit.dlclose_helper", {PlatformInstanceDecl}); 721 722 addHelperAndWrapper( 723 *M, "dlsym", 724 FunctionType::get(BytePtrTy, {BytePtrTy, BytePtrTy}, false), 725 GlobalValue::DefaultVisibility, "__lljit.dlsym_helper", 726 {PlatformInstanceDecl}); 727 728 addHelperAndWrapper(*M, "dlerror", FunctionType::get(BytePtrTy, {}, false), 729 GlobalValue::DefaultVisibility, 730 "__lljit.dlerror_helper", {PlatformInstanceDecl}); 731 732 return ThreadSafeModule(std::move(M), std::move(Ctx)); 733 } 734 735 static void registerAtExitHelper(void *Self, void (*F)(void *), void *Ctx, 736 void *DSOHandle) { 737 static_cast<MachOPlatformSupport *>(Self)->AtExitMgr.registerAtExit( 738 F, Ctx, DSOHandle); 739 } 740 741 static void runAtExitsHelper(void *Self, void *DSOHandle) { 742 static_cast<MachOPlatformSupport *>(Self)->AtExitMgr.runAtExits(DSOHandle); 743 } 744 745 void *jit_dlopen(const char *Path, int Mode) { 746 JITDylib *JDToOpen = nullptr; 747 // FIXME: Do the right thing with Mode flags. 748 { 749 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 750 751 // Clear any existing error messages. 752 dlErrorMsgs.erase(std::this_thread::get_id()); 753 754 if (auto *JD = J.getExecutionSession().getJITDylibByName(Path)) { 755 auto I = JDRefCounts.find(JD); 756 if (I != JDRefCounts.end()) { 757 ++I->second; 758 return JD; 759 } 760 761 JDRefCounts[JD] = 1; 762 JDToOpen = JD; 763 } 764 } 765 766 if (JDToOpen) { 767 if (auto Err = initialize(*JDToOpen)) { 768 recordError(std::move(Err)); 769 return 0; 770 } 771 } 772 773 // Fall through to dlopen if no JITDylib found for Path. 774 return DlFcn.dlopen(Path, Mode); 775 } 776 777 static void *dlopenHelper(void *Self, const char *Path, int Mode) { 778 return static_cast<MachOPlatformSupport *>(Self)->jit_dlopen(Path, Mode); 779 } 780 781 int jit_dlclose(void *Handle) { 782 JITDylib *JDToClose = nullptr; 783 784 { 785 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 786 787 // Clear any existing error messages. 788 dlErrorMsgs.erase(std::this_thread::get_id()); 789 790 auto I = JDRefCounts.find(Handle); 791 if (I != JDRefCounts.end()) { 792 --I->second; 793 if (I->second == 0) { 794 JDRefCounts.erase(I); 795 JDToClose = static_cast<JITDylib *>(Handle); 796 } else 797 return 0; 798 } 799 } 800 801 if (JDToClose) { 802 if (auto Err = deinitialize(*JDToClose)) { 803 recordError(std::move(Err)); 804 return -1; 805 } 806 return 0; 807 } 808 809 // Fall through to dlclose if no JITDylib found for Path. 810 return DlFcn.dlclose(Handle); 811 } 812 813 static int dlcloseHelper(void *Self, void *Handle) { 814 return static_cast<MachOPlatformSupport *>(Self)->jit_dlclose(Handle); 815 } 816 817 void *jit_dlsym(void *Handle, const char *Name) { 818 JITDylibSearchOrder JITSymSearchOrder; 819 820 // FIXME: RTLD_NEXT, RTLD_SELF not supported. 821 { 822 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 823 824 // Clear any existing error messages. 825 dlErrorMsgs.erase(std::this_thread::get_id()); 826 827 if (JDRefCounts.count(Handle)) { 828 JITSymSearchOrder.push_back( 829 {static_cast<JITDylib *>(Handle), 830 JITDylibLookupFlags::MatchExportedSymbolsOnly}); 831 } else if (Handle == DlFcn.RTLDDefault) { 832 for (auto &KV : JDRefCounts) 833 JITSymSearchOrder.push_back( 834 {static_cast<JITDylib *>(KV.first), 835 JITDylibLookupFlags::MatchExportedSymbolsOnly}); 836 } 837 } 838 839 if (!JITSymSearchOrder.empty()) { 840 MangleAndInterner Mangle(J.getExecutionSession(), J.getDataLayout()); 841 auto MangledName = Mangle(Name); 842 SymbolLookupSet Syms(MangledName, 843 SymbolLookupFlags::WeaklyReferencedSymbol); 844 if (auto Result = J.getExecutionSession().lookup(JITSymSearchOrder, Syms, 845 LookupKind::DLSym)) { 846 auto I = Result->find(MangledName); 847 if (I != Result->end()) 848 return jitTargetAddressToPointer<void *>(I->second.getAddress()); 849 } else { 850 recordError(Result.takeError()); 851 return 0; 852 } 853 } 854 855 // Fall through to dlsym. 856 return DlFcn.dlsym(Handle, Name); 857 } 858 859 static void *dlsymHelper(void *Self, void *Handle, const char *Name) { 860 return static_cast<MachOPlatformSupport *>(Self)->jit_dlsym(Handle, Name); 861 } 862 863 const char *jit_dlerror() { 864 { 865 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 866 auto I = dlErrorMsgs.find(std::this_thread::get_id()); 867 if (I != dlErrorMsgs.end()) 868 return I->second->c_str(); 869 } 870 return DlFcn.dlerror(); 871 } 872 873 static const char *dlerrorHelper(void *Self) { 874 return static_cast<MachOPlatformSupport *>(Self)->jit_dlerror(); 875 } 876 877 void recordError(Error Err) { 878 std::lock_guard<std::mutex> Lock(PlatformSupportMutex); 879 dlErrorMsgs[std::this_thread::get_id()] = 880 std::make_unique<std::string>(toString(std::move(Err))); 881 } 882 883 std::mutex PlatformSupportMutex; 884 LLJIT &J; 885 MachOPlatform &MP; 886 DlFcnValues DlFcn; 887 ItaniumCXAAtExitSupport AtExitMgr; 888 DenseMap<void *, unsigned> JDRefCounts; 889 std::map<std::thread::id, std::unique_ptr<std::string>> dlErrorMsgs; 890 }; 891 892 } // end anonymous namespace 893 894 namespace llvm { 895 namespace orc { 896 897 void LLJIT::PlatformSupport::setInitTransform( 898 LLJIT &J, IRTransformLayer::TransformFunction T) { 899 J.InitHelperTransformLayer->setTransform(std::move(T)); 900 } 901 902 LLJIT::PlatformSupport::~PlatformSupport() {} 903 904 Error LLJITBuilderState::prepareForConstruction() { 905 906 if (!JTMB) { 907 if (auto JTMBOrErr = JITTargetMachineBuilder::detectHost()) 908 JTMB = std::move(*JTMBOrErr); 909 else 910 return JTMBOrErr.takeError(); 911 } 912 913 // If the client didn't configure any linker options then auto-configure the 914 // JIT linker. 915 if (!CreateObjectLinkingLayer && JTMB->getCodeModel() == None && 916 JTMB->getRelocationModel() == None) { 917 918 auto &TT = JTMB->getTargetTriple(); 919 if (TT.isOSBinFormatMachO() && 920 (TT.getArch() == Triple::aarch64 || TT.getArch() == Triple::x86_64)) { 921 922 JTMB->setRelocationModel(Reloc::PIC_); 923 JTMB->setCodeModel(CodeModel::Small); 924 CreateObjectLinkingLayer = 925 [](ExecutionSession &ES, 926 const Triple &) -> std::unique_ptr<ObjectLayer> { 927 auto ObjLinkingLayer = std::make_unique<ObjectLinkingLayer>( 928 ES, std::make_unique<jitlink::InProcessMemoryManager>()); 929 ObjLinkingLayer->addPlugin(std::make_unique<EHFrameRegistrationPlugin>( 930 jitlink::InProcessEHFrameRegistrar::getInstance())); 931 return std::move(ObjLinkingLayer); 932 }; 933 } 934 } 935 936 return Error::success(); 937 } 938 939 LLJIT::~LLJIT() { 940 if (CompileThreads) 941 CompileThreads->wait(); 942 } 943 944 Error LLJIT::defineAbsolute(StringRef Name, JITEvaluatedSymbol Sym) { 945 auto InternedName = ES->intern(Name); 946 SymbolMap Symbols({{InternedName, Sym}}); 947 return Main->define(absoluteSymbols(std::move(Symbols))); 948 } 949 950 Error LLJIT::addIRModule(JITDylib &JD, ThreadSafeModule TSM) { 951 assert(TSM && "Can not add null module"); 952 953 if (auto Err = 954 TSM.withModuleDo([&](Module &M) { return applyDataLayout(M); })) 955 return Err; 956 957 return InitHelperTransformLayer->add(JD, std::move(TSM), 958 ES->allocateVModule()); 959 } 960 961 Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) { 962 assert(Obj && "Can not add null object"); 963 964 return ObjTransformLayer.add(JD, std::move(Obj), ES->allocateVModule()); 965 } 966 967 Expected<JITEvaluatedSymbol> LLJIT::lookupLinkerMangled(JITDylib &JD, 968 StringRef Name) { 969 return ES->lookup( 970 makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols), 971 ES->intern(Name)); 972 } 973 974 std::unique_ptr<ObjectLayer> 975 LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) { 976 977 // If the config state provided an ObjectLinkingLayer factory then use it. 978 if (S.CreateObjectLinkingLayer) 979 return S.CreateObjectLinkingLayer(ES, S.JTMB->getTargetTriple()); 980 981 // Otherwise default to creating an RTDyldObjectLinkingLayer that constructs 982 // a new SectionMemoryManager for each object. 983 auto GetMemMgr = []() { return std::make_unique<SectionMemoryManager>(); }; 984 auto ObjLinkingLayer = 985 std::make_unique<RTDyldObjectLinkingLayer>(ES, std::move(GetMemMgr)); 986 987 if (S.JTMB->getTargetTriple().isOSBinFormatCOFF()) { 988 ObjLinkingLayer->setOverrideObjectFlagsWithResponsibilityFlags(true); 989 ObjLinkingLayer->setAutoClaimResponsibilityForObjectSymbols(true); 990 } 991 992 // FIXME: Explicit conversion to std::unique_ptr<ObjectLayer> added to silence 993 // errors from some GCC / libstdc++ bots. Remove this conversion (i.e. 994 // just return ObjLinkingLayer) once those bots are upgraded. 995 return std::unique_ptr<ObjectLayer>(std::move(ObjLinkingLayer)); 996 } 997 998 Expected<std::unique_ptr<IRCompileLayer::IRCompiler>> 999 LLJIT::createCompileFunction(LLJITBuilderState &S, 1000 JITTargetMachineBuilder JTMB) { 1001 1002 /// If there is a custom compile function creator set then use it. 1003 if (S.CreateCompileFunction) 1004 return S.CreateCompileFunction(std::move(JTMB)); 1005 1006 // Otherwise default to creating a SimpleCompiler, or ConcurrentIRCompiler, 1007 // depending on the number of threads requested. 1008 if (S.NumCompileThreads > 0) 1009 return std::make_unique<ConcurrentIRCompiler>(std::move(JTMB)); 1010 1011 auto TM = JTMB.createTargetMachine(); 1012 if (!TM) 1013 return TM.takeError(); 1014 1015 return std::make_unique<TMOwningSimpleCompiler>(std::move(*TM)); 1016 } 1017 1018 LLJIT::LLJIT(LLJITBuilderState &S, Error &Err) 1019 : ES(S.ES ? std::move(S.ES) : std::make_unique<ExecutionSession>()), Main(), 1020 DL(""), TT(S.JTMB->getTargetTriple()), 1021 ObjLinkingLayer(createObjectLinkingLayer(S, *ES)), 1022 ObjTransformLayer(*this->ES, *ObjLinkingLayer) { 1023 1024 ErrorAsOutParameter _(&Err); 1025 1026 if (auto MainOrErr = this->ES->createJITDylib("main")) 1027 Main = &*MainOrErr; 1028 else { 1029 Err = MainOrErr.takeError(); 1030 return; 1031 } 1032 1033 if (S.DL) 1034 DL = std::move(*S.DL); 1035 else if (auto DLOrErr = S.JTMB->getDefaultDataLayoutForTarget()) 1036 DL = std::move(*DLOrErr); 1037 else { 1038 Err = DLOrErr.takeError(); 1039 return; 1040 } 1041 1042 { 1043 auto CompileFunction = createCompileFunction(S, std::move(*S.JTMB)); 1044 if (!CompileFunction) { 1045 Err = CompileFunction.takeError(); 1046 return; 1047 } 1048 CompileLayer = std::make_unique<IRCompileLayer>( 1049 *ES, ObjTransformLayer, std::move(*CompileFunction)); 1050 TransformLayer = std::make_unique<IRTransformLayer>(*ES, *CompileLayer); 1051 InitHelperTransformLayer = 1052 std::make_unique<IRTransformLayer>(*ES, *TransformLayer); 1053 } 1054 1055 if (S.NumCompileThreads > 0) { 1056 InitHelperTransformLayer->setCloneToNewContextOnEmit(true); 1057 CompileThreads = 1058 std::make_unique<ThreadPool>(hardware_concurrency(S.NumCompileThreads)); 1059 ES->setDispatchMaterialization( 1060 [this](JITDylib &JD, std::unique_ptr<MaterializationUnit> MU) { 1061 // FIXME: Switch to move capture once we have c++14. 1062 auto SharedMU = std::shared_ptr<MaterializationUnit>(std::move(MU)); 1063 auto Work = [SharedMU, &JD]() { SharedMU->doMaterialize(JD); }; 1064 CompileThreads->async(std::move(Work)); 1065 }); 1066 } 1067 1068 if (S.SetUpPlatform) 1069 Err = S.SetUpPlatform(*this); 1070 else 1071 setUpGenericLLVMIRPlatform(*this); 1072 } 1073 1074 std::string LLJIT::mangle(StringRef UnmangledName) { 1075 std::string MangledName; 1076 { 1077 raw_string_ostream MangledNameStream(MangledName); 1078 Mangler::getNameWithPrefix(MangledNameStream, UnmangledName, DL); 1079 } 1080 return MangledName; 1081 } 1082 1083 Error LLJIT::applyDataLayout(Module &M) { 1084 if (M.getDataLayout().isDefault()) 1085 M.setDataLayout(DL); 1086 1087 if (M.getDataLayout() != DL) 1088 return make_error<StringError>( 1089 "Added modules have incompatible data layouts: " + 1090 M.getDataLayout().getStringRepresentation() + " (module) vs " + 1091 DL.getStringRepresentation() + " (jit)", 1092 inconvertibleErrorCode()); 1093 1094 return Error::success(); 1095 } 1096 1097 void setUpGenericLLVMIRPlatform(LLJIT &J) { 1098 LLVM_DEBUG( 1099 { dbgs() << "Setting up GenericLLVMIRPlatform support for LLJIT\n"; }); 1100 J.setPlatformSupport(std::make_unique<GenericLLVMIRPlatformSupport>(J)); 1101 } 1102 1103 Error setUpMachOPlatform(LLJIT &J) { 1104 LLVM_DEBUG({ dbgs() << "Setting up MachOPlatform support for LLJIT\n"; }); 1105 auto MP = MachOPlatformSupport::Create(J, J.getMainJITDylib()); 1106 if (!MP) 1107 return MP.takeError(); 1108 J.setPlatformSupport(std::move(*MP)); 1109 return Error::success(); 1110 } 1111 1112 Error LLLazyJITBuilderState::prepareForConstruction() { 1113 if (auto Err = LLJITBuilderState::prepareForConstruction()) 1114 return Err; 1115 TT = JTMB->getTargetTriple(); 1116 return Error::success(); 1117 } 1118 1119 Error LLLazyJIT::addLazyIRModule(JITDylib &JD, ThreadSafeModule TSM) { 1120 assert(TSM && "Can not add null module"); 1121 1122 if (auto Err = TSM.withModuleDo( 1123 [&](Module &M) -> Error { return applyDataLayout(M); })) 1124 return Err; 1125 1126 return CODLayer->add(JD, std::move(TSM), ES->allocateVModule()); 1127 } 1128 1129 LLLazyJIT::LLLazyJIT(LLLazyJITBuilderState &S, Error &Err) : LLJIT(S, Err) { 1130 1131 // If LLJIT construction failed then bail out. 1132 if (Err) 1133 return; 1134 1135 ErrorAsOutParameter _(&Err); 1136 1137 /// Take/Create the lazy-compile callthrough manager. 1138 if (S.LCTMgr) 1139 LCTMgr = std::move(S.LCTMgr); 1140 else { 1141 if (auto LCTMgrOrErr = createLocalLazyCallThroughManager( 1142 S.TT, *ES, S.LazyCompileFailureAddr)) 1143 LCTMgr = std::move(*LCTMgrOrErr); 1144 else { 1145 Err = LCTMgrOrErr.takeError(); 1146 return; 1147 } 1148 } 1149 1150 // Take/Create the indirect stubs manager builder. 1151 auto ISMBuilder = std::move(S.ISMBuilder); 1152 1153 // If none was provided, try to build one. 1154 if (!ISMBuilder) 1155 ISMBuilder = createLocalIndirectStubsManagerBuilder(S.TT); 1156 1157 // No luck. Bail out. 1158 if (!ISMBuilder) { 1159 Err = make_error<StringError>("Could not construct " 1160 "IndirectStubsManagerBuilder for target " + 1161 S.TT.str(), 1162 inconvertibleErrorCode()); 1163 return; 1164 } 1165 1166 // Create the COD layer. 1167 CODLayer = std::make_unique<CompileOnDemandLayer>( 1168 *ES, *InitHelperTransformLayer, *LCTMgr, std::move(ISMBuilder)); 1169 1170 if (S.NumCompileThreads > 0) 1171 CODLayer->setCloneToNewContextOnEmit(true); 1172 } 1173 1174 } // End namespace orc. 1175 } // End namespace llvm. 1176