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