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