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