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