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 11 #include "llvm/Analysis/TargetLibraryInfo.h" 12 #include "llvm/Config/llvm-config.h" // for LLVM_ENABLE_THREADS 13 #include "llvm/ExecutionEngine/Orc/COFFPlatform.h" 14 #include "llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h" 15 #include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h" 16 #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h" 17 #include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h" 18 #include "llvm/ExecutionEngine/Orc/MachOPlatform.h" 19 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" 20 #include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h" 21 #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" 22 #include "llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h" 23 #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" 24 #include "llvm/ExecutionEngine/Orc/UnwindInfoRegistrationPlugin.h" 25 #include "llvm/ExecutionEngine/SectionMemoryManager.h" 26 #include "llvm/IR/GlobalVariable.h" 27 #include "llvm/IR/IRBuilder.h" 28 #include "llvm/IR/Mangler.h" 29 #include "llvm/IR/Module.h" 30 #include "llvm/Support/DynamicLibrary.h" 31 32 #define DEBUG_TYPE "orc" 33 34 using namespace llvm; 35 using namespace llvm::orc; 36 37 namespace { 38 39 /// Adds helper function decls and wrapper functions that call the helper with 40 /// some additional prefix arguments. 41 /// 42 /// E.g. For wrapper "foo" with type i8(i8, i64), helper "bar", and prefix 43 /// args i32 4 and i16 12345, this function will add: 44 /// 45 /// declare i8 @bar(i32, i16, i8, i64) 46 /// 47 /// define i8 @foo(i8, i64) { 48 /// entry: 49 /// %2 = call i8 @bar(i32 4, i16 12345, i8 %0, i64 %1) 50 /// ret i8 %2 51 /// } 52 /// 53 Function *addHelperAndWrapper(Module &M, StringRef WrapperName, 54 FunctionType *WrapperFnType, 55 GlobalValue::VisibilityTypes WrapperVisibility, 56 StringRef HelperName, 57 ArrayRef<Value *> HelperPrefixArgs) { 58 std::vector<Type *> HelperArgTypes; 59 for (auto *Arg : HelperPrefixArgs) 60 HelperArgTypes.push_back(Arg->getType()); 61 llvm::append_range(HelperArgTypes, WrapperFnType->params()); 62 auto *HelperFnType = 63 FunctionType::get(WrapperFnType->getReturnType(), HelperArgTypes, false); 64 auto *HelperFn = Function::Create(HelperFnType, GlobalValue::ExternalLinkage, 65 HelperName, M); 66 67 auto *WrapperFn = Function::Create( 68 WrapperFnType, GlobalValue::ExternalLinkage, WrapperName, M); 69 WrapperFn->setVisibility(WrapperVisibility); 70 71 auto *EntryBlock = BasicBlock::Create(M.getContext(), "entry", WrapperFn); 72 IRBuilder<> IB(EntryBlock); 73 74 std::vector<Value *> HelperArgs; 75 llvm::append_range(HelperArgs, HelperPrefixArgs); 76 for (auto &Arg : WrapperFn->args()) 77 HelperArgs.push_back(&Arg); 78 auto *HelperResult = IB.CreateCall(HelperFn, HelperArgs); 79 if (HelperFn->getReturnType()->isVoidTy()) 80 IB.CreateRetVoid(); 81 else 82 IB.CreateRet(HelperResult); 83 84 return WrapperFn; 85 } 86 87 class GenericLLVMIRPlatformSupport; 88 89 /// orc::Platform component of Generic LLVM IR Platform support. 90 /// Just forwards calls to the GenericLLVMIRPlatformSupport class below. 91 class GenericLLVMIRPlatform : public Platform { 92 public: 93 GenericLLVMIRPlatform(GenericLLVMIRPlatformSupport &S) : S(S) {} 94 Error setupJITDylib(JITDylib &JD) override; 95 Error teardownJITDylib(JITDylib &JD) override; 96 Error notifyAdding(ResourceTracker &RT, 97 const MaterializationUnit &MU) override; 98 Error notifyRemoving(ResourceTracker &RT) override { 99 // Noop -- Nothing to do (yet). 100 return Error::success(); 101 } 102 103 private: 104 GenericLLVMIRPlatformSupport &S; 105 }; 106 107 /// This transform parses llvm.global_ctors to produce a single initialization 108 /// function for the module, records the function, then deletes 109 /// llvm.global_ctors. 110 class GlobalCtorDtorScraper { 111 public: 112 GlobalCtorDtorScraper(GenericLLVMIRPlatformSupport &PS, 113 StringRef InitFunctionPrefix, 114 StringRef DeInitFunctionPrefix) 115 : PS(PS), InitFunctionPrefix(InitFunctionPrefix), 116 DeInitFunctionPrefix(DeInitFunctionPrefix) {} 117 Expected<ThreadSafeModule> operator()(ThreadSafeModule TSM, 118 MaterializationResponsibility &R); 119 120 private: 121 GenericLLVMIRPlatformSupport &PS; 122 StringRef InitFunctionPrefix; 123 StringRef DeInitFunctionPrefix; 124 }; 125 126 /// Generic IR Platform Support 127 /// 128 /// Scrapes llvm.global_ctors and llvm.global_dtors and replaces them with 129 /// specially named 'init' and 'deinit'. Injects definitions / interposes for 130 /// some runtime API, including __cxa_atexit, dlopen, and dlclose. 131 class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport { 132 public: 133 GenericLLVMIRPlatformSupport(LLJIT &J, JITDylib &PlatformJD) 134 : J(J), InitFunctionPrefix(J.mangle("__orc_init_func.")), 135 DeInitFunctionPrefix(J.mangle("__orc_deinit_func.")) { 136 137 getExecutionSession().setPlatform( 138 std::make_unique<GenericLLVMIRPlatform>(*this)); 139 140 setInitTransform(J, GlobalCtorDtorScraper(*this, InitFunctionPrefix, 141 DeInitFunctionPrefix)); 142 143 SymbolMap StdInterposes; 144 145 StdInterposes[J.mangleAndIntern("__lljit.platform_support_instance")] = { 146 ExecutorAddr::fromPtr(this), JITSymbolFlags::Exported}; 147 StdInterposes[J.mangleAndIntern("__lljit.cxa_atexit_helper")] = { 148 ExecutorAddr::fromPtr(registerCxaAtExitHelper), JITSymbolFlags()}; 149 150 cantFail(PlatformJD.define(absoluteSymbols(std::move(StdInterposes)))); 151 cantFail(setupJITDylib(PlatformJD)); 152 cantFail(J.addIRModule(PlatformJD, createPlatformRuntimeModule())); 153 } 154 155 ExecutionSession &getExecutionSession() { return J.getExecutionSession(); } 156 157 /// Adds a module that defines the __dso_handle global. 158 Error setupJITDylib(JITDylib &JD) { 159 160 // Add per-jitdylib standard interposes. 161 SymbolMap PerJDInterposes; 162 PerJDInterposes[J.mangleAndIntern("__lljit.run_atexits_helper")] = { 163 ExecutorAddr::fromPtr(runAtExitsHelper), JITSymbolFlags()}; 164 PerJDInterposes[J.mangleAndIntern("__lljit.atexit_helper")] = { 165 ExecutorAddr::fromPtr(registerAtExitHelper), JITSymbolFlags()}; 166 cantFail(JD.define(absoluteSymbols(std::move(PerJDInterposes)))); 167 168 auto Ctx = std::make_unique<LLVMContext>(); 169 auto M = std::make_unique<Module>("__standard_lib", *Ctx); 170 M->setDataLayout(J.getDataLayout()); 171 172 auto *Int64Ty = Type::getInt64Ty(*Ctx); 173 auto *DSOHandle = new GlobalVariable( 174 *M, Int64Ty, true, GlobalValue::ExternalLinkage, 175 ConstantInt::get(Int64Ty, reinterpret_cast<uintptr_t>(&JD)), 176 "__dso_handle"); 177 DSOHandle->setVisibility(GlobalValue::DefaultVisibility); 178 DSOHandle->setInitializer( 179 ConstantInt::get(Int64Ty, ExecutorAddr::fromPtr(&JD).getValue())); 180 181 auto *GenericIRPlatformSupportTy = 182 StructType::create(*Ctx, "lljit.GenericLLJITIRPlatformSupport"); 183 184 auto *PlatformInstanceDecl = new GlobalVariable( 185 *M, GenericIRPlatformSupportTy, true, GlobalValue::ExternalLinkage, 186 nullptr, "__lljit.platform_support_instance"); 187 188 auto *VoidTy = Type::getVoidTy(*Ctx); 189 addHelperAndWrapper( 190 *M, "__lljit_run_atexits", FunctionType::get(VoidTy, {}, false), 191 GlobalValue::HiddenVisibility, "__lljit.run_atexits_helper", 192 {PlatformInstanceDecl, DSOHandle}); 193 194 auto *IntTy = Type::getIntNTy(*Ctx, sizeof(int) * CHAR_BIT); 195 auto *AtExitCallbackPtrTy = PointerType::getUnqual(*Ctx); 196 auto *AtExit = addHelperAndWrapper( 197 *M, "atexit", FunctionType::get(IntTy, {AtExitCallbackPtrTy}, false), 198 GlobalValue::HiddenVisibility, "__lljit.atexit_helper", 199 {PlatformInstanceDecl, DSOHandle}); 200 Attribute::AttrKind AtExitExtAttr = 201 TargetLibraryInfo::getExtAttrForI32Return(J.getTargetTriple()); 202 if (AtExitExtAttr != Attribute::None) 203 AtExit->addRetAttr(AtExitExtAttr); 204 205 return J.addIRModule(JD, ThreadSafeModule(std::move(M), std::move(Ctx))); 206 } 207 208 Error notifyAdding(ResourceTracker &RT, const MaterializationUnit &MU) { 209 auto &JD = RT.getJITDylib(); 210 if (auto &InitSym = MU.getInitializerSymbol()) 211 InitSymbols[&JD].add(InitSym, SymbolLookupFlags::WeaklyReferencedSymbol); 212 else { 213 // If there's no identified init symbol attached, but there is a symbol 214 // with the GenericIRPlatform::InitFunctionPrefix, then treat that as 215 // an init function. Add the symbol to both the InitSymbols map (which 216 // will trigger a lookup to materialize the module) and the InitFunctions 217 // map (which holds the names of the symbols to execute). 218 for (auto &KV : MU.getSymbols()) 219 if ((*KV.first).starts_with(InitFunctionPrefix)) { 220 InitSymbols[&JD].add(KV.first, 221 SymbolLookupFlags::WeaklyReferencedSymbol); 222 InitFunctions[&JD].add(KV.first); 223 } else if ((*KV.first).starts_with(DeInitFunctionPrefix)) { 224 DeInitFunctions[&JD].add(KV.first); 225 } 226 } 227 return Error::success(); 228 } 229 230 Error initialize(JITDylib &JD) override { 231 LLVM_DEBUG({ 232 dbgs() << "GenericLLVMIRPlatformSupport getting initializers to run\n"; 233 }); 234 if (auto Initializers = getInitializers(JD)) { 235 LLVM_DEBUG( 236 { dbgs() << "GenericLLVMIRPlatformSupport running initializers\n"; }); 237 for (auto InitFnAddr : *Initializers) { 238 LLVM_DEBUG({ 239 dbgs() << " Running init " << formatv("{0:x16}", InitFnAddr) 240 << "...\n"; 241 }); 242 auto *InitFn = InitFnAddr.toPtr<void (*)()>(); 243 InitFn(); 244 } 245 } else 246 return Initializers.takeError(); 247 return Error::success(); 248 } 249 250 Error deinitialize(JITDylib &JD) override { 251 LLVM_DEBUG({ 252 dbgs() << "GenericLLVMIRPlatformSupport getting deinitializers to run\n"; 253 }); 254 if (auto Deinitializers = getDeinitializers(JD)) { 255 LLVM_DEBUG({ 256 dbgs() << "GenericLLVMIRPlatformSupport running deinitializers\n"; 257 }); 258 for (auto DeinitFnAddr : *Deinitializers) { 259 LLVM_DEBUG({ 260 dbgs() << " Running deinit " << formatv("{0:x16}", DeinitFnAddr) 261 << "...\n"; 262 }); 263 auto *DeinitFn = DeinitFnAddr.toPtr<void (*)()>(); 264 DeinitFn(); 265 } 266 } else 267 return Deinitializers.takeError(); 268 269 return Error::success(); 270 } 271 272 void registerInitFunc(JITDylib &JD, SymbolStringPtr InitName) { 273 getExecutionSession().runSessionLocked( 274 [&]() { InitFunctions[&JD].add(InitName); }); 275 } 276 277 void registerDeInitFunc(JITDylib &JD, SymbolStringPtr DeInitName) { 278 getExecutionSession().runSessionLocked( 279 [&]() { DeInitFunctions[&JD].add(DeInitName); }); 280 } 281 282 private: 283 Expected<std::vector<ExecutorAddr>> getInitializers(JITDylib &JD) { 284 if (auto Err = issueInitLookups(JD)) 285 return std::move(Err); 286 287 DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols; 288 std::vector<JITDylibSP> DFSLinkOrder; 289 290 if (auto Err = getExecutionSession().runSessionLocked([&]() -> Error { 291 if (auto DFSLinkOrderOrErr = JD.getDFSLinkOrder()) 292 DFSLinkOrder = std::move(*DFSLinkOrderOrErr); 293 else 294 return DFSLinkOrderOrErr.takeError(); 295 296 for (auto &NextJD : DFSLinkOrder) { 297 auto IFItr = InitFunctions.find(NextJD.get()); 298 if (IFItr != InitFunctions.end()) { 299 LookupSymbols[NextJD.get()] = std::move(IFItr->second); 300 InitFunctions.erase(IFItr); 301 } 302 } 303 return Error::success(); 304 })) 305 return std::move(Err); 306 307 LLVM_DEBUG({ 308 dbgs() << "JITDylib init order is [ "; 309 for (auto &JD : llvm::reverse(DFSLinkOrder)) 310 dbgs() << "\"" << JD->getName() << "\" "; 311 dbgs() << "]\n"; 312 dbgs() << "Looking up init functions:\n"; 313 for (auto &KV : LookupSymbols) 314 dbgs() << " \"" << KV.first->getName() << "\": " << KV.second << "\n"; 315 }); 316 317 auto &ES = getExecutionSession(); 318 auto LookupResult = Platform::lookupInitSymbols(ES, LookupSymbols); 319 320 if (!LookupResult) 321 return LookupResult.takeError(); 322 323 std::vector<ExecutorAddr> Initializers; 324 while (!DFSLinkOrder.empty()) { 325 auto &NextJD = *DFSLinkOrder.back(); 326 DFSLinkOrder.pop_back(); 327 auto InitsItr = LookupResult->find(&NextJD); 328 if (InitsItr == LookupResult->end()) 329 continue; 330 for (auto &KV : InitsItr->second) 331 Initializers.push_back(KV.second.getAddress()); 332 } 333 334 return Initializers; 335 } 336 337 Expected<std::vector<ExecutorAddr>> getDeinitializers(JITDylib &JD) { 338 auto &ES = getExecutionSession(); 339 340 auto LLJITRunAtExits = J.mangleAndIntern("__lljit_run_atexits"); 341 342 DenseMap<JITDylib *, SymbolLookupSet> LookupSymbols; 343 std::vector<JITDylibSP> DFSLinkOrder; 344 345 if (auto Err = ES.runSessionLocked([&]() -> Error { 346 if (auto DFSLinkOrderOrErr = JD.getDFSLinkOrder()) 347 DFSLinkOrder = std::move(*DFSLinkOrderOrErr); 348 else 349 return DFSLinkOrderOrErr.takeError(); 350 351 for (auto &NextJD : DFSLinkOrder) { 352 auto &JDLookupSymbols = LookupSymbols[NextJD.get()]; 353 auto DIFItr = DeInitFunctions.find(NextJD.get()); 354 if (DIFItr != DeInitFunctions.end()) { 355 LookupSymbols[NextJD.get()] = std::move(DIFItr->second); 356 DeInitFunctions.erase(DIFItr); 357 } 358 JDLookupSymbols.add(LLJITRunAtExits, 359 SymbolLookupFlags::WeaklyReferencedSymbol); 360 } 361 return Error::success(); 362 })) 363 return std::move(Err); 364 365 LLVM_DEBUG({ 366 dbgs() << "JITDylib deinit order is [ "; 367 for (auto &JD : DFSLinkOrder) 368 dbgs() << "\"" << JD->getName() << "\" "; 369 dbgs() << "]\n"; 370 dbgs() << "Looking up deinit functions:\n"; 371 for (auto &KV : LookupSymbols) 372 dbgs() << " \"" << KV.first->getName() << "\": " << KV.second << "\n"; 373 }); 374 375 auto LookupResult = Platform::lookupInitSymbols(ES, LookupSymbols); 376 377 if (!LookupResult) 378 return LookupResult.takeError(); 379 380 std::vector<ExecutorAddr> DeInitializers; 381 for (auto &NextJD : DFSLinkOrder) { 382 auto DeInitsItr = LookupResult->find(NextJD.get()); 383 assert(DeInitsItr != LookupResult->end() && 384 "Every JD should have at least __lljit_run_atexits"); 385 386 auto RunAtExitsItr = DeInitsItr->second.find(LLJITRunAtExits); 387 if (RunAtExitsItr != DeInitsItr->second.end()) 388 DeInitializers.push_back(RunAtExitsItr->second.getAddress()); 389 390 for (auto &KV : DeInitsItr->second) 391 if (KV.first != LLJITRunAtExits) 392 DeInitializers.push_back(KV.second.getAddress()); 393 } 394 395 return DeInitializers; 396 } 397 398 /// Issue lookups for all init symbols required to initialize JD (and any 399 /// JITDylibs that it depends on). 400 Error issueInitLookups(JITDylib &JD) { 401 DenseMap<JITDylib *, SymbolLookupSet> RequiredInitSymbols; 402 std::vector<JITDylibSP> DFSLinkOrder; 403 404 if (auto Err = getExecutionSession().runSessionLocked([&]() -> Error { 405 if (auto DFSLinkOrderOrErr = JD.getDFSLinkOrder()) 406 DFSLinkOrder = std::move(*DFSLinkOrderOrErr); 407 else 408 return DFSLinkOrderOrErr.takeError(); 409 410 for (auto &NextJD : DFSLinkOrder) { 411 auto ISItr = InitSymbols.find(NextJD.get()); 412 if (ISItr != InitSymbols.end()) { 413 RequiredInitSymbols[NextJD.get()] = std::move(ISItr->second); 414 InitSymbols.erase(ISItr); 415 } 416 } 417 return Error::success(); 418 })) 419 return Err; 420 421 return Platform::lookupInitSymbols(getExecutionSession(), 422 RequiredInitSymbols) 423 .takeError(); 424 } 425 426 static void registerCxaAtExitHelper(void *Self, void (*F)(void *), void *Ctx, 427 void *DSOHandle) { 428 LLVM_DEBUG({ 429 dbgs() << "Registering cxa atexit function " << (void *)F << " for JD " 430 << (*static_cast<JITDylib **>(DSOHandle))->getName() << "\n"; 431 }); 432 static_cast<GenericLLVMIRPlatformSupport *>(Self)->AtExitMgr.registerAtExit( 433 F, Ctx, DSOHandle); 434 } 435 436 static void registerAtExitHelper(void *Self, void *DSOHandle, void (*F)()) { 437 LLVM_DEBUG({ 438 dbgs() << "Registering atexit function " << (void *)F << " for JD " 439 << (*static_cast<JITDylib **>(DSOHandle))->getName() << "\n"; 440 }); 441 static_cast<GenericLLVMIRPlatformSupport *>(Self)->AtExitMgr.registerAtExit( 442 reinterpret_cast<void (*)(void *)>(F), nullptr, DSOHandle); 443 } 444 445 static void runAtExitsHelper(void *Self, void *DSOHandle) { 446 LLVM_DEBUG({ 447 dbgs() << "Running atexit functions for JD " 448 << (*static_cast<JITDylib **>(DSOHandle))->getName() << "\n"; 449 }); 450 static_cast<GenericLLVMIRPlatformSupport *>(Self)->AtExitMgr.runAtExits( 451 DSOHandle); 452 } 453 454 // Constructs an LLVM IR module containing platform runtime globals, 455 // functions, and interposes. 456 ThreadSafeModule createPlatformRuntimeModule() { 457 auto Ctx = std::make_unique<LLVMContext>(); 458 auto M = std::make_unique<Module>("__standard_lib", *Ctx); 459 M->setDataLayout(J.getDataLayout()); 460 461 auto *GenericIRPlatformSupportTy = 462 StructType::create(*Ctx, "lljit.GenericLLJITIRPlatformSupport"); 463 464 auto *PlatformInstanceDecl = new GlobalVariable( 465 *M, GenericIRPlatformSupportTy, true, GlobalValue::ExternalLinkage, 466 nullptr, "__lljit.platform_support_instance"); 467 468 auto *IntTy = Type::getIntNTy(*Ctx, sizeof(int) * CHAR_BIT); 469 auto *BytePtrTy = PointerType::getUnqual(*Ctx); 470 auto *CxaAtExitCallbackPtrTy = PointerType::getUnqual(*Ctx); 471 472 auto *CxaAtExit = addHelperAndWrapper( 473 *M, "__cxa_atexit", 474 FunctionType::get(IntTy, {CxaAtExitCallbackPtrTy, BytePtrTy, BytePtrTy}, 475 false), 476 GlobalValue::DefaultVisibility, "__lljit.cxa_atexit_helper", 477 {PlatformInstanceDecl}); 478 Attribute::AttrKind CxaAtExitExtAttr = 479 TargetLibraryInfo::getExtAttrForI32Return(J.getTargetTriple()); 480 if (CxaAtExitExtAttr != Attribute::None) 481 CxaAtExit->addRetAttr(CxaAtExitExtAttr); 482 483 return ThreadSafeModule(std::move(M), std::move(Ctx)); 484 } 485 486 LLJIT &J; 487 std::string InitFunctionPrefix; 488 std::string DeInitFunctionPrefix; 489 DenseMap<JITDylib *, SymbolLookupSet> InitSymbols; 490 DenseMap<JITDylib *, SymbolLookupSet> InitFunctions; 491 DenseMap<JITDylib *, SymbolLookupSet> DeInitFunctions; 492 ItaniumCXAAtExitSupport AtExitMgr; 493 }; 494 495 Error GenericLLVMIRPlatform::setupJITDylib(JITDylib &JD) { 496 return S.setupJITDylib(JD); 497 } 498 499 Error GenericLLVMIRPlatform::teardownJITDylib(JITDylib &JD) { 500 return Error::success(); 501 } 502 503 Error GenericLLVMIRPlatform::notifyAdding(ResourceTracker &RT, 504 const MaterializationUnit &MU) { 505 return S.notifyAdding(RT, MU); 506 } 507 508 Expected<ThreadSafeModule> 509 GlobalCtorDtorScraper::operator()(ThreadSafeModule TSM, 510 MaterializationResponsibility &R) { 511 auto Err = TSM.withModuleDo([&](Module &M) -> Error { 512 auto &Ctx = M.getContext(); 513 auto *GlobalCtors = M.getNamedGlobal("llvm.global_ctors"); 514 auto *GlobalDtors = M.getNamedGlobal("llvm.global_dtors"); 515 516 auto RegisterCOrDtors = [&](GlobalVariable *GlobalCOrDtors, 517 bool isCtor) -> Error { 518 // If there's no llvm.global_c/dtor or it's just a decl then skip. 519 if (!GlobalCOrDtors || GlobalCOrDtors->isDeclaration()) 520 return Error::success(); 521 std::string InitOrDeInitFunctionName; 522 if (isCtor) 523 raw_string_ostream(InitOrDeInitFunctionName) 524 << InitFunctionPrefix << M.getModuleIdentifier(); 525 else 526 raw_string_ostream(InitOrDeInitFunctionName) 527 << DeInitFunctionPrefix << M.getModuleIdentifier(); 528 529 MangleAndInterner Mangle(PS.getExecutionSession(), M.getDataLayout()); 530 auto InternedInitOrDeInitName = Mangle(InitOrDeInitFunctionName); 531 if (auto Err = R.defineMaterializing( 532 {{InternedInitOrDeInitName, JITSymbolFlags::Callable}})) 533 return Err; 534 535 auto *InitOrDeInitFunc = Function::Create( 536 FunctionType::get(Type::getVoidTy(Ctx), {}, false), 537 GlobalValue::ExternalLinkage, InitOrDeInitFunctionName, &M); 538 InitOrDeInitFunc->setVisibility(GlobalValue::HiddenVisibility); 539 std::vector<std::pair<Function *, unsigned>> InitsOrDeInits; 540 auto COrDtors = isCtor ? getConstructors(M) : getDestructors(M); 541 542 for (auto E : COrDtors) 543 InitsOrDeInits.push_back(std::make_pair(E.Func, E.Priority)); 544 llvm::stable_sort(InitsOrDeInits, llvm::less_second()); 545 546 auto *InitOrDeInitFuncEntryBlock = 547 BasicBlock::Create(Ctx, "entry", InitOrDeInitFunc); 548 IRBuilder<> IB(InitOrDeInitFuncEntryBlock); 549 for (auto &KV : InitsOrDeInits) 550 IB.CreateCall(KV.first); 551 IB.CreateRetVoid(); 552 553 if (isCtor) 554 PS.registerInitFunc(R.getTargetJITDylib(), InternedInitOrDeInitName); 555 else 556 PS.registerDeInitFunc(R.getTargetJITDylib(), InternedInitOrDeInitName); 557 558 GlobalCOrDtors->eraseFromParent(); 559 return Error::success(); 560 }; 561 562 if (auto Err = RegisterCOrDtors(GlobalCtors, true)) 563 return Err; 564 if (auto Err = RegisterCOrDtors(GlobalDtors, false)) 565 return Err; 566 567 return Error::success(); 568 }); 569 570 if (Err) 571 return std::move(Err); 572 573 return std::move(TSM); 574 } 575 576 /// Inactive Platform Support 577 /// 578 /// Explicitly disables platform support. JITDylibs are not scanned for special 579 /// init/deinit symbols. No runtime API interposes are injected. 580 class InactivePlatformSupport : public LLJIT::PlatformSupport { 581 public: 582 InactivePlatformSupport() = default; 583 584 Error initialize(JITDylib &JD) override { 585 LLVM_DEBUG(dbgs() << "InactivePlatformSupport: no initializers running for " 586 << JD.getName() << "\n"); 587 return Error::success(); 588 } 589 590 Error deinitialize(JITDylib &JD) override { 591 LLVM_DEBUG( 592 dbgs() << "InactivePlatformSupport: no deinitializers running for " 593 << JD.getName() << "\n"); 594 return Error::success(); 595 } 596 }; 597 598 } // end anonymous namespace 599 600 namespace llvm { 601 namespace orc { 602 603 Error ORCPlatformSupport::initialize(orc::JITDylib &JD) { 604 using llvm::orc::shared::SPSExecutorAddr; 605 using llvm::orc::shared::SPSString; 606 using SPSDLOpenSig = SPSExecutorAddr(SPSString, int32_t); 607 using SPSDLUpdateSig = int32_t(SPSExecutorAddr); 608 enum dlopen_mode : int32_t { 609 ORC_RT_RTLD_LAZY = 0x1, 610 ORC_RT_RTLD_NOW = 0x2, 611 ORC_RT_RTLD_LOCAL = 0x4, 612 ORC_RT_RTLD_GLOBAL = 0x8 613 }; 614 615 auto &ES = J.getExecutionSession(); 616 auto MainSearchOrder = J.getMainJITDylib().withLinkOrderDo( 617 [](const JITDylibSearchOrder &SO) { return SO; }); 618 StringRef WrapperToCall = "__orc_rt_jit_dlopen_wrapper"; 619 bool dlupdate = false; 620 const Triple &TT = ES.getTargetTriple(); 621 if (TT.isOSBinFormatMachO() || TT.isOSBinFormatELF()) { 622 if (InitializedDylib.contains(&JD)) { 623 WrapperToCall = "__orc_rt_jit_dlupdate_wrapper"; 624 dlupdate = true; 625 } else 626 InitializedDylib.insert(&JD); 627 } 628 629 if (auto WrapperAddr = 630 ES.lookup(MainSearchOrder, J.mangleAndIntern(WrapperToCall))) { 631 if (dlupdate) { 632 int32_t result; 633 auto E = ES.callSPSWrapper<SPSDLUpdateSig>(WrapperAddr->getAddress(), 634 result, DSOHandles[&JD]); 635 if (E) 636 return E; 637 else if (result) 638 return make_error<StringError>("dlupdate failed", 639 inconvertibleErrorCode()); 640 } else 641 return ES.callSPSWrapper<SPSDLOpenSig>(WrapperAddr->getAddress(), 642 DSOHandles[&JD], JD.getName(), 643 int32_t(ORC_RT_RTLD_LAZY)); 644 } else 645 return WrapperAddr.takeError(); 646 647 return Error::success(); 648 } 649 650 Error ORCPlatformSupport::deinitialize(orc::JITDylib &JD) { 651 using llvm::orc::shared::SPSExecutorAddr; 652 using SPSDLCloseSig = int32_t(SPSExecutorAddr); 653 654 auto &ES = J.getExecutionSession(); 655 auto MainSearchOrder = J.getMainJITDylib().withLinkOrderDo( 656 [](const JITDylibSearchOrder &SO) { return SO; }); 657 658 if (auto WrapperAddr = ES.lookup( 659 MainSearchOrder, J.mangleAndIntern("__orc_rt_jit_dlclose_wrapper"))) { 660 int32_t result; 661 auto E = J.getExecutionSession().callSPSWrapper<SPSDLCloseSig>( 662 WrapperAddr->getAddress(), result, DSOHandles[&JD]); 663 if (E) 664 return E; 665 else if (result) 666 return make_error<StringError>("dlclose failed", 667 inconvertibleErrorCode()); 668 DSOHandles.erase(&JD); 669 InitializedDylib.erase(&JD); 670 } else 671 return WrapperAddr.takeError(); 672 return Error::success(); 673 } 674 675 void LLJIT::PlatformSupport::setInitTransform( 676 LLJIT &J, IRTransformLayer::TransformFunction T) { 677 J.InitHelperTransformLayer->setTransform(std::move(T)); 678 } 679 680 LLJIT::PlatformSupport::~PlatformSupport() = default; 681 682 Error LLJITBuilderState::prepareForConstruction() { 683 684 LLVM_DEBUG(dbgs() << "Preparing to create LLJIT instance...\n"); 685 686 if (!JTMB) { 687 LLVM_DEBUG({ 688 dbgs() << " No explicitly set JITTargetMachineBuilder. " 689 "Detecting host...\n"; 690 }); 691 if (auto JTMBOrErr = JITTargetMachineBuilder::detectHost()) 692 JTMB = std::move(*JTMBOrErr); 693 else 694 return JTMBOrErr.takeError(); 695 } 696 697 if ((ES || EPC) && NumCompileThreads) 698 return make_error<StringError>( 699 "NumCompileThreads cannot be used with a custom ExecutionSession or " 700 "ExecutorProcessControl", 701 inconvertibleErrorCode()); 702 703 #if !LLVM_ENABLE_THREADS 704 if (NumCompileThreads) 705 return make_error<StringError>( 706 "LLJIT num-compile-threads is " + Twine(NumCompileThreads) + 707 " but LLVM was compiled with LLVM_ENABLE_THREADS=Off", 708 inconvertibleErrorCode()); 709 #endif // !LLVM_ENABLE_THREADS 710 711 // Only used in debug builds. 712 [[maybe_unused]] bool ConcurrentCompilationSettingDefaulted = 713 !SupportConcurrentCompilation; 714 715 if (!SupportConcurrentCompilation) { 716 #if LLVM_ENABLE_THREADS 717 SupportConcurrentCompilation = NumCompileThreads || ES || EPC; 718 #else 719 SupportConcurrentCompilation = false; 720 #endif // LLVM_ENABLE_THREADS 721 } else { 722 #if !LLVM_ENABLE_THREADS 723 if (*SupportConcurrentCompilation) 724 return make_error<StringError>( 725 "LLJIT concurrent compilation support requested, but LLVM was built " 726 "with LLVM_ENABLE_THREADS=Off", 727 inconvertibleErrorCode()); 728 #endif // !LLVM_ENABLE_THREADS 729 } 730 731 LLVM_DEBUG({ 732 dbgs() << " JITTargetMachineBuilder is " 733 << JITTargetMachineBuilderPrinter(*JTMB, " ") 734 << " Pre-constructed ExecutionSession: " << (ES ? "Yes" : "No") 735 << "\n" 736 << " DataLayout: "; 737 if (DL) 738 dbgs() << DL->getStringRepresentation() << "\n"; 739 else 740 dbgs() << "None (will be created by JITTargetMachineBuilder)\n"; 741 742 dbgs() << " Custom object-linking-layer creator: " 743 << (CreateObjectLinkingLayer ? "Yes" : "No") << "\n" 744 << " Custom compile-function creator: " 745 << (CreateCompileFunction ? "Yes" : "No") << "\n" 746 << " Custom platform-setup function: " 747 << (SetUpPlatform ? "Yes" : "No") << "\n" 748 << " Support concurrent compilation: " 749 << (*SupportConcurrentCompilation ? "Yes" : "No"); 750 if (ConcurrentCompilationSettingDefaulted) 751 dbgs() << " (defaulted based on ES / EPC / NumCompileThreads)\n"; 752 else 753 dbgs() << "\n"; 754 dbgs() << " Number of compile threads: " << NumCompileThreads << "\n"; 755 }); 756 757 // Create DL if not specified. 758 if (!DL) { 759 if (auto DLOrErr = JTMB->getDefaultDataLayoutForTarget()) 760 DL = std::move(*DLOrErr); 761 else 762 return DLOrErr.takeError(); 763 } 764 765 // If neither ES nor EPC has been set then create an EPC instance. 766 if (!ES && !EPC) { 767 LLVM_DEBUG({ 768 dbgs() << "ExecutorProcessControl not specified, " 769 "Creating SelfExecutorProcessControl instance\n"; 770 }); 771 772 std::unique_ptr<TaskDispatcher> D = nullptr; 773 #if LLVM_ENABLE_THREADS 774 if (*SupportConcurrentCompilation) { 775 std::optional<size_t> NumThreads = std ::nullopt; 776 if (NumCompileThreads) 777 NumThreads = NumCompileThreads; 778 D = std::make_unique<DynamicThreadPoolTaskDispatcher>(NumThreads); 779 } else 780 D = std::make_unique<InPlaceTaskDispatcher>(); 781 #endif // LLVM_ENABLE_THREADS 782 if (auto EPCOrErr = 783 SelfExecutorProcessControl::Create(nullptr, std::move(D), nullptr)) 784 EPC = std::move(*EPCOrErr); 785 else 786 return EPCOrErr.takeError(); 787 } else if (EPC) { 788 LLVM_DEBUG({ 789 dbgs() << "Using explicitly specified ExecutorProcessControl instance " 790 << EPC.get() << "\n"; 791 }); 792 } else { 793 LLVM_DEBUG({ 794 dbgs() << "Using explicitly specified ExecutionSession instance " 795 << ES.get() << "\n"; 796 }); 797 } 798 799 // If the client didn't configure any linker options then auto-configure the 800 // JIT linker. 801 if (!CreateObjectLinkingLayer) { 802 auto &TT = JTMB->getTargetTriple(); 803 bool UseJITLink = false; 804 switch (TT.getArch()) { 805 case Triple::riscv64: 806 case Triple::loongarch64: 807 UseJITLink = true; 808 break; 809 case Triple::aarch64: 810 UseJITLink = !TT.isOSBinFormatCOFF(); 811 break; 812 case Triple::arm: 813 case Triple::armeb: 814 case Triple::thumb: 815 case Triple::thumbeb: 816 UseJITLink = TT.isOSBinFormatELF(); 817 break; 818 case Triple::x86_64: 819 UseJITLink = !TT.isOSBinFormatCOFF(); 820 break; 821 case Triple::ppc64: 822 UseJITLink = TT.isPPC64ELFv2ABI(); 823 break; 824 case Triple::ppc64le: 825 UseJITLink = TT.isOSBinFormatELF(); 826 break; 827 default: 828 break; 829 } 830 if (UseJITLink) { 831 if (!JTMB->getCodeModel()) 832 JTMB->setCodeModel(CodeModel::Small); 833 JTMB->setRelocationModel(Reloc::PIC_); 834 CreateObjectLinkingLayer = 835 [](ExecutionSession &ES) -> Expected<std::unique_ptr<ObjectLayer>> { 836 return std::make_unique<ObjectLinkingLayer>(ES); 837 }; 838 } 839 } 840 841 // If we need a process JITDylib but no setup function has been given then 842 // create a default one. 843 if (!SetupProcessSymbolsJITDylib && LinkProcessSymbolsByDefault) { 844 LLVM_DEBUG(dbgs() << "Creating default Process JD setup function\n"); 845 SetupProcessSymbolsJITDylib = [](LLJIT &J) -> Expected<JITDylibSP> { 846 auto &JD = 847 J.getExecutionSession().createBareJITDylib("<Process Symbols>"); 848 auto G = EPCDynamicLibrarySearchGenerator::GetForTargetProcess( 849 J.getExecutionSession()); 850 if (!G) 851 return G.takeError(); 852 JD.addGenerator(std::move(*G)); 853 return &JD; 854 }; 855 } 856 857 return Error::success(); 858 } 859 860 LLJIT::~LLJIT() { 861 if (auto Err = ES->endSession()) 862 ES->reportError(std::move(Err)); 863 } 864 865 JITDylibSP LLJIT::getProcessSymbolsJITDylib() { return ProcessSymbols; } 866 867 JITDylibSP LLJIT::getPlatformJITDylib() { return Platform; } 868 869 Expected<JITDylib &> LLJIT::createJITDylib(std::string Name) { 870 auto JD = ES->createJITDylib(std::move(Name)); 871 if (!JD) 872 return JD.takeError(); 873 874 JD->addToLinkOrder(DefaultLinks); 875 return JD; 876 } 877 878 Expected<JITDylib &> LLJIT::loadPlatformDynamicLibrary(const char *Path) { 879 auto G = EPCDynamicLibrarySearchGenerator::Load(*ES, Path); 880 if (!G) 881 return G.takeError(); 882 883 if (auto *ExistingJD = ES->getJITDylibByName(Path)) 884 return *ExistingJD; 885 886 auto &JD = ES->createBareJITDylib(Path); 887 JD.addGenerator(std::move(*G)); 888 return JD; 889 } 890 891 Error LLJIT::linkStaticLibraryInto(JITDylib &JD, 892 std::unique_ptr<MemoryBuffer> LibBuffer) { 893 auto G = StaticLibraryDefinitionGenerator::Create(*ObjLinkingLayer, 894 std::move(LibBuffer)); 895 if (!G) 896 return G.takeError(); 897 898 JD.addGenerator(std::move(*G)); 899 900 return Error::success(); 901 } 902 903 Error LLJIT::linkStaticLibraryInto(JITDylib &JD, const char *Path) { 904 auto G = StaticLibraryDefinitionGenerator::Load(*ObjLinkingLayer, Path); 905 if (!G) 906 return G.takeError(); 907 908 JD.addGenerator(std::move(*G)); 909 910 return Error::success(); 911 } 912 913 Error LLJIT::addIRModule(ResourceTrackerSP RT, ThreadSafeModule TSM) { 914 assert(TSM && "Can not add null module"); 915 916 if (auto Err = 917 TSM.withModuleDo([&](Module &M) { return applyDataLayout(M); })) 918 return Err; 919 920 return InitHelperTransformLayer->add(std::move(RT), std::move(TSM)); 921 } 922 923 Error LLJIT::addIRModule(JITDylib &JD, ThreadSafeModule TSM) { 924 return addIRModule(JD.getDefaultResourceTracker(), std::move(TSM)); 925 } 926 927 Error LLJIT::addObjectFile(ResourceTrackerSP RT, 928 std::unique_ptr<MemoryBuffer> Obj) { 929 assert(Obj && "Can not add null object"); 930 931 return ObjTransformLayer->add(std::move(RT), std::move(Obj)); 932 } 933 934 Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) { 935 return addObjectFile(JD.getDefaultResourceTracker(), std::move(Obj)); 936 } 937 938 Expected<ExecutorAddr> LLJIT::lookupLinkerMangled(JITDylib &JD, 939 SymbolStringPtr Name) { 940 if (auto Sym = ES->lookup( 941 makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols), 942 Name)) 943 return Sym->getAddress(); 944 else 945 return Sym.takeError(); 946 } 947 948 Expected<std::unique_ptr<ObjectLayer>> 949 LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) { 950 951 // If the config state provided an ObjectLinkingLayer factory then use it. 952 if (S.CreateObjectLinkingLayer) 953 return S.CreateObjectLinkingLayer(ES); 954 955 // Otherwise default to creating an RTDyldObjectLinkingLayer that constructs 956 // a new SectionMemoryManager for each object. 957 auto GetMemMgr = [](const MemoryBuffer &) { 958 return std::make_unique<SectionMemoryManager>(); 959 }; 960 auto Layer = 961 std::make_unique<RTDyldObjectLinkingLayer>(ES, std::move(GetMemMgr)); 962 963 if (S.JTMB->getTargetTriple().isOSBinFormatCOFF()) { 964 Layer->setOverrideObjectFlagsWithResponsibilityFlags(true); 965 Layer->setAutoClaimResponsibilityForObjectSymbols(true); 966 } 967 968 if (S.JTMB->getTargetTriple().isOSBinFormatELF() && 969 (S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64 || 970 S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64le)) 971 Layer->setAutoClaimResponsibilityForObjectSymbols(true); 972 973 // FIXME: Explicit conversion to std::unique_ptr<ObjectLayer> added to silence 974 // errors from some GCC / libstdc++ bots. Remove this conversion (i.e. 975 // just return ObjLinkingLayer) once those bots are upgraded. 976 return std::unique_ptr<ObjectLayer>(std::move(Layer)); 977 } 978 979 Expected<std::unique_ptr<IRCompileLayer::IRCompiler>> 980 LLJIT::createCompileFunction(LLJITBuilderState &S, 981 JITTargetMachineBuilder JTMB) { 982 983 /// If there is a custom compile function creator set then use it. 984 if (S.CreateCompileFunction) 985 return S.CreateCompileFunction(std::move(JTMB)); 986 987 // If using a custom EPC then use a ConcurrentIRCompiler by default. 988 if (*S.SupportConcurrentCompilation) 989 return std::make_unique<ConcurrentIRCompiler>(std::move(JTMB)); 990 991 auto TM = JTMB.createTargetMachine(); 992 if (!TM) 993 return TM.takeError(); 994 995 return std::make_unique<TMOwningSimpleCompiler>(std::move(*TM)); 996 } 997 998 LLJIT::LLJIT(LLJITBuilderState &S, Error &Err) 999 : DL(std::move(*S.DL)), TT(S.JTMB->getTargetTriple()) { 1000 1001 ErrorAsOutParameter _(Err); 1002 1003 assert(!(S.EPC && S.ES) && "EPC and ES should not both be set"); 1004 1005 if (S.EPC) { 1006 ES = std::make_unique<ExecutionSession>(std::move(S.EPC)); 1007 } else if (S.ES) 1008 ES = std::move(S.ES); 1009 else { 1010 if (auto EPC = SelfExecutorProcessControl::Create()) { 1011 ES = std::make_unique<ExecutionSession>(std::move(*EPC)); 1012 } else { 1013 Err = EPC.takeError(); 1014 return; 1015 } 1016 } 1017 1018 auto ObjLayer = createObjectLinkingLayer(S, *ES); 1019 if (!ObjLayer) { 1020 Err = ObjLayer.takeError(); 1021 return; 1022 } 1023 ObjLinkingLayer = std::move(*ObjLayer); 1024 ObjTransformLayer = 1025 std::make_unique<ObjectTransformLayer>(*ES, *ObjLinkingLayer); 1026 1027 { 1028 auto CompileFunction = createCompileFunction(S, std::move(*S.JTMB)); 1029 if (!CompileFunction) { 1030 Err = CompileFunction.takeError(); 1031 return; 1032 } 1033 CompileLayer = std::make_unique<IRCompileLayer>( 1034 *ES, *ObjTransformLayer, std::move(*CompileFunction)); 1035 TransformLayer = std::make_unique<IRTransformLayer>(*ES, *CompileLayer); 1036 InitHelperTransformLayer = 1037 std::make_unique<IRTransformLayer>(*ES, *TransformLayer); 1038 } 1039 1040 if (*S.SupportConcurrentCompilation) 1041 InitHelperTransformLayer->setCloneToNewContextOnEmit(true); 1042 1043 if (S.SetupProcessSymbolsJITDylib) { 1044 if (auto ProcSymsJD = S.SetupProcessSymbolsJITDylib(*this)) { 1045 ProcessSymbols = ProcSymsJD->get(); 1046 } else { 1047 Err = ProcSymsJD.takeError(); 1048 return; 1049 } 1050 } 1051 1052 if (S.PrePlatformSetup) 1053 if ((Err = S.PrePlatformSetup(*this))) 1054 return; 1055 1056 if (!S.SetUpPlatform) 1057 S.SetUpPlatform = setUpGenericLLVMIRPlatform; 1058 1059 if (auto PlatformJDOrErr = S.SetUpPlatform(*this)) { 1060 Platform = PlatformJDOrErr->get(); 1061 if (Platform) 1062 DefaultLinks.push_back( 1063 {Platform, JITDylibLookupFlags::MatchExportedSymbolsOnly}); 1064 } else { 1065 Err = PlatformJDOrErr.takeError(); 1066 return; 1067 } 1068 1069 if (S.LinkProcessSymbolsByDefault) 1070 DefaultLinks.push_back( 1071 {ProcessSymbols, JITDylibLookupFlags::MatchExportedSymbolsOnly}); 1072 1073 if (auto MainOrErr = createJITDylib("main")) 1074 Main = &*MainOrErr; 1075 else { 1076 Err = MainOrErr.takeError(); 1077 return; 1078 } 1079 } 1080 1081 std::string LLJIT::mangle(StringRef UnmangledName) const { 1082 std::string MangledName; 1083 { 1084 raw_string_ostream MangledNameStream(MangledName); 1085 Mangler::getNameWithPrefix(MangledNameStream, UnmangledName, DL); 1086 } 1087 return MangledName; 1088 } 1089 1090 Error LLJIT::applyDataLayout(Module &M) { 1091 if (M.getDataLayout().isDefault()) 1092 M.setDataLayout(DL); 1093 1094 if (M.getDataLayout() != DL) 1095 return make_error<StringError>( 1096 "Added modules have incompatible data layouts: " + 1097 M.getDataLayout().getStringRepresentation() + " (module) vs " + 1098 DL.getStringRepresentation() + " (jit)", 1099 inconvertibleErrorCode()); 1100 1101 return Error::success(); 1102 } 1103 1104 Error setUpOrcPlatformManually(LLJIT &J) { 1105 LLVM_DEBUG({ dbgs() << "Setting up orc platform support for LLJIT\n"; }); 1106 J.setPlatformSupport(std::make_unique<ORCPlatformSupport>(J)); 1107 return Error::success(); 1108 } 1109 1110 class LoadAndLinkDynLibrary { 1111 public: 1112 LoadAndLinkDynLibrary(LLJIT &J) : J(J) {} 1113 Error operator()(JITDylib &JD, StringRef DLLName) { 1114 if (!DLLName.ends_with_insensitive(".dll")) 1115 return make_error<StringError>("DLLName not ending with .dll", 1116 inconvertibleErrorCode()); 1117 auto DLLNameStr = DLLName.str(); // Guarantees null-termination. 1118 auto DLLJD = J.loadPlatformDynamicLibrary(DLLNameStr.c_str()); 1119 if (!DLLJD) 1120 return DLLJD.takeError(); 1121 JD.addToLinkOrder(*DLLJD); 1122 return Error::success(); 1123 } 1124 1125 private: 1126 LLJIT &J; 1127 }; 1128 1129 Expected<JITDylibSP> ExecutorNativePlatform::operator()(LLJIT &J) { 1130 auto ProcessSymbolsJD = J.getProcessSymbolsJITDylib(); 1131 if (!ProcessSymbolsJD) 1132 return make_error<StringError>( 1133 "Native platforms require a process symbols JITDylib", 1134 inconvertibleErrorCode()); 1135 1136 const Triple &TT = J.getTargetTriple(); 1137 ObjectLinkingLayer *ObjLinkingLayer = 1138 dyn_cast<ObjectLinkingLayer>(&J.getObjLinkingLayer()); 1139 1140 if (!ObjLinkingLayer) 1141 return make_error<StringError>( 1142 "ExecutorNativePlatform requires ObjectLinkingLayer", 1143 inconvertibleErrorCode()); 1144 1145 std::unique_ptr<MemoryBuffer> RuntimeArchiveBuffer; 1146 if (OrcRuntime.index() == 0) { 1147 auto A = errorOrToExpected(MemoryBuffer::getFile(std::get<0>(OrcRuntime))); 1148 if (!A) 1149 return A.takeError(); 1150 RuntimeArchiveBuffer = std::move(*A); 1151 } else 1152 RuntimeArchiveBuffer = std::move(std::get<1>(OrcRuntime)); 1153 1154 auto &ES = J.getExecutionSession(); 1155 auto &PlatformJD = ES.createBareJITDylib("<Platform>"); 1156 PlatformJD.addToLinkOrder(*ProcessSymbolsJD); 1157 1158 J.setPlatformSupport(std::make_unique<ORCPlatformSupport>(J)); 1159 1160 switch (TT.getObjectFormat()) { 1161 case Triple::COFF: { 1162 const char *VCRuntimePath = nullptr; 1163 bool StaticVCRuntime = false; 1164 if (VCRuntime) { 1165 VCRuntimePath = VCRuntime->first.c_str(); 1166 StaticVCRuntime = VCRuntime->second; 1167 } 1168 if (auto P = COFFPlatform::Create( 1169 *ObjLinkingLayer, PlatformJD, std::move(RuntimeArchiveBuffer), 1170 LoadAndLinkDynLibrary(J), StaticVCRuntime, VCRuntimePath)) 1171 J.getExecutionSession().setPlatform(std::move(*P)); 1172 else 1173 return P.takeError(); 1174 break; 1175 } 1176 case Triple::ELF: { 1177 auto G = StaticLibraryDefinitionGenerator::Create( 1178 *ObjLinkingLayer, std::move(RuntimeArchiveBuffer)); 1179 if (!G) 1180 return G.takeError(); 1181 1182 if (auto P = 1183 ELFNixPlatform::Create(*ObjLinkingLayer, PlatformJD, std::move(*G))) 1184 J.getExecutionSession().setPlatform(std::move(*P)); 1185 else 1186 return P.takeError(); 1187 break; 1188 } 1189 case Triple::MachO: { 1190 auto G = StaticLibraryDefinitionGenerator::Create( 1191 *ObjLinkingLayer, std::move(RuntimeArchiveBuffer)); 1192 if (!G) 1193 return G.takeError(); 1194 1195 if (auto P = 1196 MachOPlatform::Create(*ObjLinkingLayer, PlatformJD, std::move(*G))) 1197 ES.setPlatform(std::move(*P)); 1198 else 1199 return P.takeError(); 1200 break; 1201 } 1202 default: 1203 return make_error<StringError>("Unsupported object format in triple " + 1204 TT.str(), 1205 inconvertibleErrorCode()); 1206 } 1207 1208 return &PlatformJD; 1209 } 1210 1211 Expected<JITDylibSP> setUpGenericLLVMIRPlatform(LLJIT &J) { 1212 LLVM_DEBUG( 1213 { dbgs() << "Setting up GenericLLVMIRPlatform support for LLJIT\n"; }); 1214 auto ProcessSymbolsJD = J.getProcessSymbolsJITDylib(); 1215 if (!ProcessSymbolsJD) 1216 return make_error<StringError>( 1217 "Native platforms require a process symbols JITDylib", 1218 inconvertibleErrorCode()); 1219 1220 auto &PlatformJD = J.getExecutionSession().createBareJITDylib("<Platform>"); 1221 PlatformJD.addToLinkOrder(*ProcessSymbolsJD); 1222 1223 if (auto *OLL = dyn_cast<ObjectLinkingLayer>(&J.getObjLinkingLayer())) { 1224 1225 bool UseEHFrames = true; 1226 1227 // Enable compact-unwind support if possible. 1228 if (J.getTargetTriple().isOSDarwin() || 1229 J.getTargetTriple().isOSBinFormatMachO()) { 1230 1231 // Check if the bootstrap map says that we should force eh-frames: 1232 // Older libunwinds require this as they don't have a dynamic 1233 // registration API for compact-unwind. 1234 std::optional<bool> ForceEHFrames; 1235 if (auto Err = J.getExecutionSession().getBootstrapMapValue<bool, bool>( 1236 "darwin-use-ehframes-only", ForceEHFrames)) 1237 return Err; 1238 if (ForceEHFrames.has_value()) 1239 UseEHFrames = *ForceEHFrames; 1240 else 1241 UseEHFrames = false; 1242 1243 // If UseEHFrames hasn't been set then we're good to use compact-unwind. 1244 if (!UseEHFrames) { 1245 if (auto UIRP = 1246 UnwindInfoRegistrationPlugin::Create(J.getExecutionSession())) { 1247 OLL->addPlugin(std::move(*UIRP)); 1248 LLVM_DEBUG(dbgs() << "Enabled compact-unwind support.\n"); 1249 } else 1250 return UIRP.takeError(); 1251 } 1252 } 1253 1254 // Otherwise fall back to standard unwind registration. 1255 if (UseEHFrames) { 1256 auto &ES = J.getExecutionSession(); 1257 if (auto EHFP = EHFrameRegistrationPlugin::Create(ES)) { 1258 OLL->addPlugin(std::move(*EHFP)); 1259 LLVM_DEBUG(dbgs() << "Enabled eh-frame support.\n"); 1260 } else 1261 return EHFP.takeError(); 1262 } 1263 } 1264 1265 J.setPlatformSupport( 1266 std::make_unique<GenericLLVMIRPlatformSupport>(J, PlatformJD)); 1267 1268 return &PlatformJD; 1269 } 1270 1271 Expected<JITDylibSP> setUpInactivePlatform(LLJIT &J) { 1272 LLVM_DEBUG( 1273 { dbgs() << "Explicitly deactivated platform support for LLJIT\n"; }); 1274 J.setPlatformSupport(std::make_unique<InactivePlatformSupport>()); 1275 return nullptr; 1276 } 1277 1278 Error LLLazyJITBuilderState::prepareForConstruction() { 1279 if (auto Err = LLJITBuilderState::prepareForConstruction()) 1280 return Err; 1281 TT = JTMB->getTargetTriple(); 1282 return Error::success(); 1283 } 1284 1285 Error LLLazyJIT::addLazyIRModule(JITDylib &JD, ThreadSafeModule TSM) { 1286 assert(TSM && "Can not add null module"); 1287 1288 if (auto Err = TSM.withModuleDo( 1289 [&](Module &M) -> Error { return applyDataLayout(M); })) 1290 return Err; 1291 1292 return CODLayer->add(JD, std::move(TSM)); 1293 } 1294 1295 LLLazyJIT::LLLazyJIT(LLLazyJITBuilderState &S, Error &Err) : LLJIT(S, Err) { 1296 1297 // If LLJIT construction failed then bail out. 1298 if (Err) 1299 return; 1300 1301 ErrorAsOutParameter _(&Err); 1302 1303 /// Take/Create the lazy-compile callthrough manager. 1304 if (S.LCTMgr) 1305 LCTMgr = std::move(S.LCTMgr); 1306 else { 1307 if (auto LCTMgrOrErr = createLocalLazyCallThroughManager( 1308 S.TT, *ES, S.LazyCompileFailureAddr)) 1309 LCTMgr = std::move(*LCTMgrOrErr); 1310 else { 1311 Err = LCTMgrOrErr.takeError(); 1312 return; 1313 } 1314 } 1315 1316 // Take/Create the indirect stubs manager builder. 1317 auto ISMBuilder = std::move(S.ISMBuilder); 1318 1319 // If none was provided, try to build one. 1320 if (!ISMBuilder) 1321 ISMBuilder = createLocalIndirectStubsManagerBuilder(S.TT); 1322 1323 // No luck. Bail out. 1324 if (!ISMBuilder) { 1325 Err = make_error<StringError>("Could not construct " 1326 "IndirectStubsManagerBuilder for target " + 1327 S.TT.str(), 1328 inconvertibleErrorCode()); 1329 return; 1330 } 1331 1332 // Create the IP Layer. 1333 IPLayer = std::make_unique<IRPartitionLayer>(*ES, *InitHelperTransformLayer); 1334 1335 // Create the COD layer. 1336 CODLayer = std::make_unique<CompileOnDemandLayer>(*ES, *IPLayer, *LCTMgr, 1337 std::move(ISMBuilder)); 1338 1339 if (*S.SupportConcurrentCompilation) 1340 CODLayer->setCloneToNewContextOnEmit(true); 1341 } 1342 1343 // In-process LLJIT uses eh-frame section wrappers via EPC, so we need to force 1344 // them to be linked in. 1345 LLVM_ATTRIBUTE_USED void linkComponents() { 1346 errs() << (void *)&llvm_orc_registerEHFrameSectionAllocAction 1347 << (void *)&llvm_orc_deregisterEHFrameSectionAllocAction; 1348 } 1349 1350 } // End namespace orc. 1351 } // End namespace llvm. 1352