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