1 //===- llvm-jitlink.cpp -- Command line interface/tester for llvm-jitlink -===// 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 // This utility provides a simple command line interface to the llvm jitlink 10 // library, which makes relocatable object files executable in memory. Its 11 // primary function is as a testing utility for the jitlink library. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm-jitlink.h" 16 17 #include "llvm/BinaryFormat/Magic.h" 18 #include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h" 19 #include "llvm/ExecutionEngine/Orc/DebuggerSupportPlugin.h" 20 #include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h" 21 #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h" 22 #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h" 23 #include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h" 24 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" 25 #include "llvm/ExecutionEngine/Orc/IndirectionUtils.h" 26 #include "llvm/ExecutionEngine/Orc/MachOPlatform.h" 27 #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h" 28 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" 29 #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" 30 #include "llvm/MC/MCAsmInfo.h" 31 #include "llvm/MC/MCContext.h" 32 #include "llvm/MC/MCDisassembler/MCDisassembler.h" 33 #include "llvm/MC/MCInstPrinter.h" 34 #include "llvm/MC/MCInstrAnalysis.h" 35 #include "llvm/MC/MCInstrInfo.h" 36 #include "llvm/MC/MCRegisterInfo.h" 37 #include "llvm/MC/MCSubtargetInfo.h" 38 #include "llvm/MC/MCTargetOptions.h" 39 #include "llvm/MC/TargetRegistry.h" 40 #include "llvm/Object/COFF.h" 41 #include "llvm/Object/MachO.h" 42 #include "llvm/Object/ObjectFile.h" 43 #include "llvm/Support/CommandLine.h" 44 #include "llvm/Support/Debug.h" 45 #include "llvm/Support/InitLLVM.h" 46 #include "llvm/Support/MemoryBuffer.h" 47 #include "llvm/Support/Path.h" 48 #include "llvm/Support/Process.h" 49 #include "llvm/Support/TargetSelect.h" 50 #include "llvm/Support/Timer.h" 51 52 #include <cstring> 53 #include <list> 54 #include <string> 55 56 #ifdef LLVM_ON_UNIX 57 #include <netdb.h> 58 #include <netinet/in.h> 59 #include <sys/socket.h> 60 #include <unistd.h> 61 #endif // LLVM_ON_UNIX 62 63 #define DEBUG_TYPE "llvm_jitlink" 64 65 using namespace llvm; 66 using namespace llvm::jitlink; 67 using namespace llvm::orc; 68 69 static cl::OptionCategory JITLinkCategory("JITLink Options"); 70 71 static cl::list<std::string> InputFiles(cl::Positional, cl::OneOrMore, 72 cl::desc("input files"), 73 cl::cat(JITLinkCategory)); 74 75 static cl::list<std::string> 76 LibrarySearchPaths("L", 77 cl::desc("Add dir to the list of library search paths"), 78 cl::Prefix, cl::cat(JITLinkCategory)); 79 80 static cl::list<std::string> 81 Libraries("l", 82 cl::desc("Link against library X in the library search paths"), 83 cl::Prefix, cl::cat(JITLinkCategory)); 84 85 static cl::list<std::string> 86 LibrariesHidden("hidden-l", 87 cl::desc("Link against library X in the library search " 88 "paths with hidden visibility"), 89 cl::Prefix, cl::cat(JITLinkCategory)); 90 91 static cl::list<std::string> 92 LoadHidden("load_hidden", 93 cl::desc("Link against library X with hidden visibility"), 94 cl::cat(JITLinkCategory)); 95 96 static cl::opt<bool> NoExec("noexec", cl::desc("Do not execute loaded code"), 97 cl::init(false), cl::cat(JITLinkCategory)); 98 99 static cl::list<std::string> 100 CheckFiles("check", cl::desc("File containing verifier checks"), 101 cl::cat(JITLinkCategory)); 102 103 static cl::opt<std::string> 104 CheckName("check-name", cl::desc("Name of checks to match against"), 105 cl::init("jitlink-check"), cl::cat(JITLinkCategory)); 106 107 static cl::opt<std::string> 108 EntryPointName("entry", cl::desc("Symbol to call as main entry point"), 109 cl::init(""), cl::cat(JITLinkCategory)); 110 111 static cl::list<std::string> JITDylibs( 112 "jd", 113 cl::desc("Specifies the JITDylib to be used for any subsequent " 114 "input file, -L<seacrh-path>, and -l<library> arguments"), 115 cl::cat(JITLinkCategory)); 116 117 static cl::list<std::string> 118 Dylibs("preload", 119 cl::desc("Pre-load dynamic libraries (e.g. language runtimes " 120 "required by the ORC runtime)"), 121 cl::cat(JITLinkCategory)); 122 123 static cl::list<std::string> InputArgv("args", cl::Positional, 124 cl::desc("<program arguments>..."), 125 cl::PositionalEatsArgs, 126 cl::cat(JITLinkCategory)); 127 128 static cl::opt<bool> 129 DebuggerSupport("debugger-support", 130 cl::desc("Enable debugger suppport (default = !-noexec)"), 131 cl::init(true), cl::Hidden, cl::cat(JITLinkCategory)); 132 133 static cl::opt<bool> 134 NoProcessSymbols("no-process-syms", 135 cl::desc("Do not resolve to llvm-jitlink process symbols"), 136 cl::init(false), cl::cat(JITLinkCategory)); 137 138 static cl::list<std::string> AbsoluteDefs( 139 "abs", 140 cl::desc("Inject absolute symbol definitions (syntax: <name>=<addr>)"), 141 cl::cat(JITLinkCategory)); 142 143 static cl::list<std::string> 144 Aliases("alias", cl::desc("Inject symbol aliases (syntax: <name>=<addr>)"), 145 cl::cat(JITLinkCategory)); 146 147 static cl::list<std::string> TestHarnesses("harness", cl::Positional, 148 cl::desc("Test harness files"), 149 cl::PositionalEatsArgs, 150 cl::cat(JITLinkCategory)); 151 152 static cl::opt<bool> ShowInitialExecutionSessionState( 153 "show-init-es", 154 cl::desc("Print ExecutionSession state before resolving entry point"), 155 cl::init(false), cl::cat(JITLinkCategory)); 156 157 static cl::opt<bool> ShowEntryExecutionSessionState( 158 "show-entry-es", 159 cl::desc("Print ExecutionSession state after resolving entry point"), 160 cl::init(false), cl::cat(JITLinkCategory)); 161 162 static cl::opt<bool> ShowAddrs( 163 "show-addrs", 164 cl::desc("Print registered symbol, section, got and stub addresses"), 165 cl::init(false), cl::cat(JITLinkCategory)); 166 167 static cl::opt<bool> ShowLinkGraph( 168 "show-graph", 169 cl::desc("Print the link graph after fixups have been applied"), 170 cl::init(false), cl::cat(JITLinkCategory)); 171 172 static cl::opt<bool> ShowSizes( 173 "show-sizes", 174 cl::desc("Show sizes pre- and post-dead stripping, and allocations"), 175 cl::init(false), cl::cat(JITLinkCategory)); 176 177 static cl::opt<bool> ShowTimes("show-times", 178 cl::desc("Show times for llvm-jitlink phases"), 179 cl::init(false), cl::cat(JITLinkCategory)); 180 181 static cl::opt<std::string> SlabAllocateSizeString( 182 "slab-allocate", 183 cl::desc("Allocate from a slab of the given size " 184 "(allowable suffixes: Kb, Mb, Gb. default = " 185 "Kb)"), 186 cl::init(""), cl::cat(JITLinkCategory)); 187 188 static cl::opt<uint64_t> SlabAddress( 189 "slab-address", 190 cl::desc("Set slab target address (requires -slab-allocate and -noexec)"), 191 cl::init(~0ULL), cl::cat(JITLinkCategory)); 192 193 static cl::opt<uint64_t> SlabPageSize( 194 "slab-page-size", 195 cl::desc("Set page size for slab (requires -slab-allocate and -noexec)"), 196 cl::init(0), cl::cat(JITLinkCategory)); 197 198 static cl::opt<bool> ShowRelocatedSectionContents( 199 "show-relocated-section-contents", 200 cl::desc("show section contents after fixups have been applied"), 201 cl::init(false), cl::cat(JITLinkCategory)); 202 203 static cl::opt<bool> PhonyExternals( 204 "phony-externals", 205 cl::desc("resolve all otherwise unresolved externals to null"), 206 cl::init(false), cl::cat(JITLinkCategory)); 207 208 static cl::opt<std::string> OutOfProcessExecutor( 209 "oop-executor", cl::desc("Launch an out-of-process executor to run code"), 210 cl::ValueOptional, cl::cat(JITLinkCategory)); 211 212 static cl::opt<std::string> OutOfProcessExecutorConnect( 213 "oop-executor-connect", 214 cl::desc("Connect to an out-of-process executor via TCP"), 215 cl::cat(JITLinkCategory)); 216 217 static cl::opt<std::string> 218 OrcRuntime("orc-runtime", cl::desc("Use ORC runtime from given path"), 219 cl::init(""), cl::cat(JITLinkCategory)); 220 221 static cl::opt<bool> AddSelfRelocations( 222 "add-self-relocations", 223 cl::desc("Add relocations to function pointers to the current function"), 224 cl::init(false), cl::cat(JITLinkCategory)); 225 226 static cl::opt<bool> 227 ShowErrFailedToMaterialize("show-err-failed-to-materialize", 228 cl::desc("Show FailedToMaterialize errors"), 229 cl::init(false), cl::cat(JITLinkCategory)); 230 231 static ExitOnError ExitOnErr; 232 233 static LLVM_ATTRIBUTE_USED void linkComponents() { 234 errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper 235 << (void *)&llvm_orc_deregisterEHFrameSectionWrapper 236 << (void *)&llvm_orc_registerJITLoaderGDBWrapper 237 << (void *)&llvm_orc_registerJITLoaderGDBAllocAction; 238 } 239 240 static bool UseTestResultOverride = false; 241 static int64_t TestResultOverride = 0; 242 243 extern "C" LLVM_ATTRIBUTE_USED void 244 llvm_jitlink_setTestResultOverride(int64_t Value) { 245 TestResultOverride = Value; 246 UseTestResultOverride = true; 247 } 248 249 static Error addSelfRelocations(LinkGraph &G); 250 251 namespace { 252 253 template <typename ErrT> 254 255 class ConditionalPrintErr { 256 public: 257 ConditionalPrintErr(bool C) : C(C) {} 258 void operator()(ErrT &EI) { 259 if (C) { 260 errs() << "llvm-jitlink error: "; 261 EI.log(errs()); 262 errs() << "\n"; 263 } 264 } 265 266 private: 267 bool C; 268 }; 269 270 Expected<std::unique_ptr<MemoryBuffer>> getFile(const Twine &FileName) { 271 if (auto F = MemoryBuffer::getFile(FileName)) 272 return std::move(*F); 273 else 274 return createFileError(FileName, F.getError()); 275 } 276 277 void reportLLVMJITLinkError(Error Err) { 278 handleAllErrors( 279 std::move(Err), 280 ConditionalPrintErr<orc::FailedToMaterialize>(ShowErrFailedToMaterialize), 281 ConditionalPrintErr<ErrorInfoBase>(true)); 282 } 283 284 } // end anonymous namespace 285 286 namespace llvm { 287 288 static raw_ostream & 289 operator<<(raw_ostream &OS, const Session::MemoryRegionInfo &MRI) { 290 return OS << "target addr = " 291 << format("0x%016" PRIx64, MRI.getTargetAddress()) 292 << ", content: " << (const void *)MRI.getContent().data() << " -- " 293 << (const void *)(MRI.getContent().data() + MRI.getContent().size()) 294 << " (" << MRI.getContent().size() << " bytes)"; 295 } 296 297 static raw_ostream & 298 operator<<(raw_ostream &OS, const Session::SymbolInfoMap &SIM) { 299 OS << "Symbols:\n"; 300 for (auto &SKV : SIM) 301 OS << " \"" << SKV.first() << "\" " << SKV.second << "\n"; 302 return OS; 303 } 304 305 static raw_ostream & 306 operator<<(raw_ostream &OS, const Session::FileInfo &FI) { 307 for (auto &SIKV : FI.SectionInfos) 308 OS << " Section \"" << SIKV.first() << "\": " << SIKV.second << "\n"; 309 for (auto &GOTKV : FI.GOTEntryInfos) 310 OS << " GOT \"" << GOTKV.first() << "\": " << GOTKV.second << "\n"; 311 for (auto &StubKV : FI.StubInfos) 312 OS << " Stub \"" << StubKV.first() << "\": " << StubKV.second << "\n"; 313 return OS; 314 } 315 316 static raw_ostream & 317 operator<<(raw_ostream &OS, const Session::FileInfoMap &FIM) { 318 for (auto &FIKV : FIM) 319 OS << "File \"" << FIKV.first() << "\":\n" << FIKV.second; 320 return OS; 321 } 322 323 static Error applyHarnessPromotions(Session &S, LinkGraph &G) { 324 325 // If this graph is part of the test harness there's nothing to do. 326 if (S.HarnessFiles.empty() || S.HarnessFiles.count(G.getName())) 327 return Error::success(); 328 329 LLVM_DEBUG(dbgs() << "Applying promotions to graph " << G.getName() << "\n"); 330 331 // If this graph is part of the test then promote any symbols referenced by 332 // the harness to default scope, remove all symbols that clash with harness 333 // definitions. 334 std::vector<Symbol *> DefinitionsToRemove; 335 for (auto *Sym : G.defined_symbols()) { 336 337 if (!Sym->hasName()) 338 continue; 339 340 if (Sym->getLinkage() == Linkage::Weak) { 341 if (!S.CanonicalWeakDefs.count(Sym->getName()) || 342 S.CanonicalWeakDefs[Sym->getName()] != G.getName()) { 343 LLVM_DEBUG({ 344 dbgs() << " Externalizing weak symbol " << Sym->getName() << "\n"; 345 }); 346 DefinitionsToRemove.push_back(Sym); 347 } else { 348 LLVM_DEBUG({ 349 dbgs() << " Making weak symbol " << Sym->getName() << " strong\n"; 350 }); 351 if (S.HarnessExternals.count(Sym->getName())) 352 Sym->setScope(Scope::Default); 353 else 354 Sym->setScope(Scope::Hidden); 355 Sym->setLinkage(Linkage::Strong); 356 } 357 } else if (S.HarnessExternals.count(Sym->getName())) { 358 LLVM_DEBUG(dbgs() << " Promoting " << Sym->getName() << "\n"); 359 Sym->setScope(Scope::Default); 360 Sym->setLive(true); 361 continue; 362 } else if (S.HarnessDefinitions.count(Sym->getName())) { 363 LLVM_DEBUG(dbgs() << " Externalizing " << Sym->getName() << "\n"); 364 DefinitionsToRemove.push_back(Sym); 365 } 366 } 367 368 for (auto *Sym : DefinitionsToRemove) 369 G.makeExternal(*Sym); 370 371 return Error::success(); 372 } 373 374 static uint64_t computeTotalBlockSizes(LinkGraph &G) { 375 uint64_t TotalSize = 0; 376 for (auto *B : G.blocks()) 377 TotalSize += B->getSize(); 378 return TotalSize; 379 } 380 381 static void dumpSectionContents(raw_ostream &OS, LinkGraph &G) { 382 constexpr orc::ExecutorAddrDiff DumpWidth = 16; 383 static_assert(isPowerOf2_64(DumpWidth), "DumpWidth must be a power of two"); 384 385 // Put sections in address order. 386 std::vector<Section *> Sections; 387 for (auto &S : G.sections()) 388 Sections.push_back(&S); 389 390 llvm::sort(Sections, [](const Section *LHS, const Section *RHS) { 391 if (llvm::empty(LHS->symbols()) && llvm::empty(RHS->symbols())) 392 return false; 393 if (llvm::empty(LHS->symbols())) 394 return false; 395 if (llvm::empty(RHS->symbols())) 396 return true; 397 SectionRange LHSRange(*LHS); 398 SectionRange RHSRange(*RHS); 399 return LHSRange.getStart() < RHSRange.getStart(); 400 }); 401 402 for (auto *S : Sections) { 403 OS << S->getName() << " content:"; 404 if (llvm::empty(S->symbols())) { 405 OS << "\n section empty\n"; 406 continue; 407 } 408 409 // Sort symbols into order, then render. 410 std::vector<Symbol *> Syms(S->symbols().begin(), S->symbols().end()); 411 llvm::sort(Syms, [](const Symbol *LHS, const Symbol *RHS) { 412 return LHS->getAddress() < RHS->getAddress(); 413 }); 414 415 orc::ExecutorAddr NextAddr(Syms.front()->getAddress().getValue() & 416 ~(DumpWidth - 1)); 417 for (auto *Sym : Syms) { 418 bool IsZeroFill = Sym->getBlock().isZeroFill(); 419 auto SymStart = Sym->getAddress(); 420 auto SymSize = Sym->getSize(); 421 auto SymEnd = SymStart + SymSize; 422 const uint8_t *SymData = IsZeroFill ? nullptr 423 : reinterpret_cast<const uint8_t *>( 424 Sym->getSymbolContent().data()); 425 426 // Pad any space before the symbol starts. 427 while (NextAddr != SymStart) { 428 if (NextAddr % DumpWidth == 0) 429 OS << formatv("\n{0:x16}:", NextAddr); 430 OS << " "; 431 ++NextAddr; 432 } 433 434 // Render the symbol content. 435 while (NextAddr != SymEnd) { 436 if (NextAddr % DumpWidth == 0) 437 OS << formatv("\n{0:x16}:", NextAddr); 438 if (IsZeroFill) 439 OS << " 00"; 440 else 441 OS << formatv(" {0:x-2}", SymData[NextAddr - SymStart]); 442 ++NextAddr; 443 } 444 } 445 OS << "\n"; 446 } 447 } 448 449 class JITLinkSlabAllocator final : public JITLinkMemoryManager { 450 private: 451 struct FinalizedAllocInfo { 452 FinalizedAllocInfo(sys::MemoryBlock Mem, 453 std::vector<shared::WrapperFunctionCall> DeallocActions) 454 : Mem(Mem), DeallocActions(std::move(DeallocActions)) {} 455 sys::MemoryBlock Mem; 456 std::vector<shared::WrapperFunctionCall> DeallocActions; 457 }; 458 459 public: 460 static Expected<std::unique_ptr<JITLinkSlabAllocator>> 461 Create(uint64_t SlabSize) { 462 Error Err = Error::success(); 463 std::unique_ptr<JITLinkSlabAllocator> Allocator( 464 new JITLinkSlabAllocator(SlabSize, Err)); 465 if (Err) 466 return std::move(Err); 467 return std::move(Allocator); 468 } 469 470 void allocate(const JITLinkDylib *JD, LinkGraph &G, 471 OnAllocatedFunction OnAllocated) override { 472 473 // Local class for allocation. 474 class IPMMAlloc : public InFlightAlloc { 475 public: 476 IPMMAlloc(JITLinkSlabAllocator &Parent, BasicLayout BL, 477 sys::MemoryBlock StandardSegs, sys::MemoryBlock FinalizeSegs) 478 : Parent(Parent), BL(std::move(BL)), 479 StandardSegs(std::move(StandardSegs)), 480 FinalizeSegs(std::move(FinalizeSegs)) {} 481 482 void finalize(OnFinalizedFunction OnFinalized) override { 483 if (auto Err = applyProtections()) { 484 OnFinalized(std::move(Err)); 485 return; 486 } 487 488 auto DeallocActions = runFinalizeActions(BL.graphAllocActions()); 489 if (!DeallocActions) { 490 OnFinalized(DeallocActions.takeError()); 491 return; 492 } 493 494 if (auto Err = Parent.freeBlock(FinalizeSegs)) { 495 OnFinalized( 496 joinErrors(std::move(Err), runDeallocActions(*DeallocActions))); 497 return; 498 } 499 500 OnFinalized(FinalizedAlloc(ExecutorAddr::fromPtr( 501 new FinalizedAllocInfo(StandardSegs, std::move(*DeallocActions))))); 502 } 503 504 void abandon(OnAbandonedFunction OnAbandoned) override { 505 OnAbandoned(joinErrors(Parent.freeBlock(StandardSegs), 506 Parent.freeBlock(FinalizeSegs))); 507 } 508 509 private: 510 Error applyProtections() { 511 for (auto &KV : BL.segments()) { 512 const auto &Group = KV.first; 513 auto &Seg = KV.second; 514 515 auto Prot = toSysMemoryProtectionFlags(Group.getMemProt()); 516 517 uint64_t SegSize = 518 alignTo(Seg.ContentSize + Seg.ZeroFillSize, Parent.PageSize); 519 sys::MemoryBlock MB(Seg.WorkingMem, SegSize); 520 if (auto EC = sys::Memory::protectMappedMemory(MB, Prot)) 521 return errorCodeToError(EC); 522 if (Prot & sys::Memory::MF_EXEC) 523 sys::Memory::InvalidateInstructionCache(MB.base(), 524 MB.allocatedSize()); 525 } 526 return Error::success(); 527 } 528 529 JITLinkSlabAllocator &Parent; 530 BasicLayout BL; 531 sys::MemoryBlock StandardSegs; 532 sys::MemoryBlock FinalizeSegs; 533 }; 534 535 BasicLayout BL(G); 536 auto SegsSizes = BL.getContiguousPageBasedLayoutSizes(PageSize); 537 538 if (!SegsSizes) { 539 OnAllocated(SegsSizes.takeError()); 540 return; 541 } 542 543 char *AllocBase = nullptr; 544 { 545 std::lock_guard<std::mutex> Lock(SlabMutex); 546 547 if (SegsSizes->total() > SlabRemaining.allocatedSize()) { 548 OnAllocated(make_error<StringError>( 549 "Slab allocator out of memory: request for " + 550 formatv("{0:x}", SegsSizes->total()) + 551 " bytes exceeds remaining capacity of " + 552 formatv("{0:x}", SlabRemaining.allocatedSize()) + " bytes", 553 inconvertibleErrorCode())); 554 return; 555 } 556 557 AllocBase = reinterpret_cast<char *>(SlabRemaining.base()); 558 SlabRemaining = 559 sys::MemoryBlock(AllocBase + SegsSizes->total(), 560 SlabRemaining.allocatedSize() - SegsSizes->total()); 561 } 562 563 sys::MemoryBlock StandardSegs(AllocBase, SegsSizes->StandardSegs); 564 sys::MemoryBlock FinalizeSegs(AllocBase + SegsSizes->StandardSegs, 565 SegsSizes->FinalizeSegs); 566 567 auto NextStandardSegAddr = ExecutorAddr::fromPtr(StandardSegs.base()); 568 auto NextFinalizeSegAddr = ExecutorAddr::fromPtr(FinalizeSegs.base()); 569 570 LLVM_DEBUG({ 571 dbgs() << "JITLinkSlabAllocator allocated:\n"; 572 if (SegsSizes->StandardSegs) 573 dbgs() << formatv(" [ {0:x16} -- {1:x16} ]", NextStandardSegAddr, 574 NextStandardSegAddr + StandardSegs.allocatedSize()) 575 << " to stardard segs\n"; 576 else 577 dbgs() << " no standard segs\n"; 578 if (SegsSizes->FinalizeSegs) 579 dbgs() << formatv(" [ {0:x16} -- {1:x16} ]", NextFinalizeSegAddr, 580 NextFinalizeSegAddr + FinalizeSegs.allocatedSize()) 581 << " to finalize segs\n"; 582 else 583 dbgs() << " no finalize segs\n"; 584 }); 585 586 for (auto &KV : BL.segments()) { 587 auto &Group = KV.first; 588 auto &Seg = KV.second; 589 590 auto &SegAddr = 591 (Group.getMemDeallocPolicy() == MemDeallocPolicy::Standard) 592 ? NextStandardSegAddr 593 : NextFinalizeSegAddr; 594 595 LLVM_DEBUG({ 596 dbgs() << " " << Group << " -> " << formatv("{0:x16}", SegAddr) 597 << "\n"; 598 }); 599 Seg.WorkingMem = SegAddr.toPtr<char *>(); 600 Seg.Addr = SegAddr + SlabDelta; 601 602 SegAddr += alignTo(Seg.ContentSize + Seg.ZeroFillSize, PageSize); 603 604 // Zero out the zero-fill memory. 605 if (Seg.ZeroFillSize != 0) 606 memset(Seg.WorkingMem + Seg.ContentSize, 0, Seg.ZeroFillSize); 607 } 608 609 if (auto Err = BL.apply()) { 610 OnAllocated(std::move(Err)); 611 return; 612 } 613 614 OnAllocated(std::unique_ptr<InProcessMemoryManager::InFlightAlloc>( 615 new IPMMAlloc(*this, std::move(BL), std::move(StandardSegs), 616 std::move(FinalizeSegs)))); 617 } 618 619 void deallocate(std::vector<FinalizedAlloc> FinalizedAllocs, 620 OnDeallocatedFunction OnDeallocated) override { 621 Error Err = Error::success(); 622 for (auto &FA : FinalizedAllocs) { 623 std::unique_ptr<FinalizedAllocInfo> FAI( 624 FA.release().toPtr<FinalizedAllocInfo *>()); 625 626 // FIXME: Run dealloc actions. 627 628 Err = joinErrors(std::move(Err), freeBlock(FAI->Mem)); 629 } 630 OnDeallocated(std::move(Err)); 631 } 632 633 private: 634 JITLinkSlabAllocator(uint64_t SlabSize, Error &Err) { 635 ErrorAsOutParameter _(&Err); 636 637 if (!SlabPageSize) { 638 if (auto PageSizeOrErr = sys::Process::getPageSize()) 639 PageSize = *PageSizeOrErr; 640 else { 641 Err = PageSizeOrErr.takeError(); 642 return; 643 } 644 645 if (PageSize == 0) { 646 Err = make_error<StringError>("Page size is zero", 647 inconvertibleErrorCode()); 648 return; 649 } 650 } else 651 PageSize = SlabPageSize; 652 653 if (!isPowerOf2_64(PageSize)) { 654 Err = make_error<StringError>("Page size is not a power of 2", 655 inconvertibleErrorCode()); 656 return; 657 } 658 659 // Round slab request up to page size. 660 SlabSize = (SlabSize + PageSize - 1) & ~(PageSize - 1); 661 662 const sys::Memory::ProtectionFlags ReadWrite = 663 static_cast<sys::Memory::ProtectionFlags>(sys::Memory::MF_READ | 664 sys::Memory::MF_WRITE); 665 666 std::error_code EC; 667 SlabRemaining = 668 sys::Memory::allocateMappedMemory(SlabSize, nullptr, ReadWrite, EC); 669 670 if (EC) { 671 Err = errorCodeToError(EC); 672 return; 673 } 674 675 // Calculate the target address delta to link as-if slab were at 676 // SlabAddress. 677 if (SlabAddress != ~0ULL) 678 SlabDelta = ExecutorAddr(SlabAddress) - 679 ExecutorAddr::fromPtr(SlabRemaining.base()); 680 } 681 682 Error freeBlock(sys::MemoryBlock MB) { 683 // FIXME: Return memory to slab. 684 return Error::success(); 685 } 686 687 std::mutex SlabMutex; 688 sys::MemoryBlock SlabRemaining; 689 uint64_t PageSize = 0; 690 int64_t SlabDelta = 0; 691 }; 692 693 Expected<uint64_t> getSlabAllocSize(StringRef SizeString) { 694 SizeString = SizeString.trim(); 695 696 uint64_t Units = 1024; 697 698 if (SizeString.endswith_insensitive("kb")) 699 SizeString = SizeString.drop_back(2).rtrim(); 700 else if (SizeString.endswith_insensitive("mb")) { 701 Units = 1024 * 1024; 702 SizeString = SizeString.drop_back(2).rtrim(); 703 } else if (SizeString.endswith_insensitive("gb")) { 704 Units = 1024 * 1024 * 1024; 705 SizeString = SizeString.drop_back(2).rtrim(); 706 } 707 708 uint64_t SlabSize = 0; 709 if (SizeString.getAsInteger(10, SlabSize)) 710 return make_error<StringError>("Invalid numeric format for slab size", 711 inconvertibleErrorCode()); 712 713 return SlabSize * Units; 714 } 715 716 static std::unique_ptr<JITLinkMemoryManager> createMemoryManager() { 717 if (!SlabAllocateSizeString.empty()) { 718 auto SlabSize = ExitOnErr(getSlabAllocSize(SlabAllocateSizeString)); 719 return ExitOnErr(JITLinkSlabAllocator::Create(SlabSize)); 720 } 721 return ExitOnErr(InProcessMemoryManager::Create()); 722 } 723 724 static Expected<MaterializationUnit::Interface> 725 getTestObjectFileInterface(Session &S, MemoryBufferRef O) { 726 727 // Get the standard interface for this object, but ignore the symbols field. 728 // We'll handle that manually to include promotion. 729 auto I = getObjectFileInterface(S.ES, O); 730 if (!I) 731 return I.takeError(); 732 I->SymbolFlags.clear(); 733 734 // If creating an object file was going to fail it would have happened above, 735 // so we can 'cantFail' this. 736 auto Obj = cantFail(object::ObjectFile::createObjectFile(O)); 737 738 // The init symbol must be included in the SymbolFlags map if present. 739 if (I->InitSymbol) 740 I->SymbolFlags[I->InitSymbol] = 741 JITSymbolFlags::MaterializationSideEffectsOnly; 742 743 for (auto &Sym : Obj->symbols()) { 744 Expected<uint32_t> SymFlagsOrErr = Sym.getFlags(); 745 if (!SymFlagsOrErr) 746 // TODO: Test this error. 747 return SymFlagsOrErr.takeError(); 748 749 // Skip symbols not defined in this object file. 750 if ((*SymFlagsOrErr & object::BasicSymbolRef::SF_Undefined)) 751 continue; 752 753 auto Name = Sym.getName(); 754 if (!Name) 755 return Name.takeError(); 756 757 // Skip symbols that have type SF_File. 758 if (auto SymType = Sym.getType()) { 759 if (*SymType == object::SymbolRef::ST_File) 760 continue; 761 } else 762 return SymType.takeError(); 763 764 auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym); 765 if (!SymFlags) 766 return SymFlags.takeError(); 767 768 if (SymFlags->isWeak()) { 769 // If this is a weak symbol that's not defined in the harness then we 770 // need to either mark it as strong (if this is the first definition 771 // that we've seen) or discard it. 772 if (S.HarnessDefinitions.count(*Name) || S.CanonicalWeakDefs.count(*Name)) 773 continue; 774 S.CanonicalWeakDefs[*Name] = O.getBufferIdentifier(); 775 *SymFlags &= ~JITSymbolFlags::Weak; 776 if (!S.HarnessExternals.count(*Name)) 777 *SymFlags &= ~JITSymbolFlags::Exported; 778 } else if (S.HarnessExternals.count(*Name)) { 779 *SymFlags |= JITSymbolFlags::Exported; 780 } else if (S.HarnessDefinitions.count(*Name) || 781 !(*SymFlagsOrErr & object::BasicSymbolRef::SF_Global)) 782 continue; 783 784 auto InternedName = S.ES.intern(*Name); 785 I->SymbolFlags[InternedName] = std::move(*SymFlags); 786 } 787 788 return I; 789 } 790 791 static Error loadProcessSymbols(Session &S) { 792 auto FilterMainEntryPoint = 793 [EPName = S.ES.intern(EntryPointName)](SymbolStringPtr Name) { 794 return Name != EPName; 795 }; 796 S.MainJD->addGenerator( 797 ExitOnErr(orc::EPCDynamicLibrarySearchGenerator::GetForTargetProcess( 798 S.ES, std::move(FilterMainEntryPoint)))); 799 800 return Error::success(); 801 } 802 803 static Error loadDylibs(Session &S) { 804 LLVM_DEBUG(dbgs() << "Loading dylibs...\n"); 805 for (const auto &Dylib : Dylibs) { 806 LLVM_DEBUG(dbgs() << " " << Dylib << "\n"); 807 auto G = orc::EPCDynamicLibrarySearchGenerator::Load(S.ES, Dylib.c_str()); 808 if (!G) 809 return G.takeError(); 810 S.MainJD->addGenerator(std::move(*G)); 811 } 812 813 return Error::success(); 814 } 815 816 static Expected<std::unique_ptr<ExecutorProcessControl>> launchExecutor() { 817 #ifndef LLVM_ON_UNIX 818 // FIXME: Add support for Windows. 819 return make_error<StringError>("-" + OutOfProcessExecutor.ArgStr + 820 " not supported on non-unix platforms", 821 inconvertibleErrorCode()); 822 #elif !LLVM_ENABLE_THREADS 823 // Out of process mode using SimpleRemoteEPC depends on threads. 824 return make_error<StringError>( 825 "-" + OutOfProcessExecutor.ArgStr + 826 " requires threads, but LLVM was built with " 827 "LLVM_ENABLE_THREADS=Off", 828 inconvertibleErrorCode()); 829 #else 830 831 constexpr int ReadEnd = 0; 832 constexpr int WriteEnd = 1; 833 834 // Pipe FDs. 835 int ToExecutor[2]; 836 int FromExecutor[2]; 837 838 pid_t ChildPID; 839 840 // Create pipes to/from the executor.. 841 if (pipe(ToExecutor) != 0 || pipe(FromExecutor) != 0) 842 return make_error<StringError>("Unable to create pipe for executor", 843 inconvertibleErrorCode()); 844 845 ChildPID = fork(); 846 847 if (ChildPID == 0) { 848 // In the child... 849 850 // Close the parent ends of the pipes 851 close(ToExecutor[WriteEnd]); 852 close(FromExecutor[ReadEnd]); 853 854 // Execute the child process. 855 std::unique_ptr<char[]> ExecutorPath, FDSpecifier; 856 { 857 ExecutorPath = std::make_unique<char[]>(OutOfProcessExecutor.size() + 1); 858 strcpy(ExecutorPath.get(), OutOfProcessExecutor.data()); 859 860 std::string FDSpecifierStr("filedescs="); 861 FDSpecifierStr += utostr(ToExecutor[ReadEnd]); 862 FDSpecifierStr += ','; 863 FDSpecifierStr += utostr(FromExecutor[WriteEnd]); 864 FDSpecifier = std::make_unique<char[]>(FDSpecifierStr.size() + 1); 865 strcpy(FDSpecifier.get(), FDSpecifierStr.c_str()); 866 } 867 868 char *const Args[] = {ExecutorPath.get(), FDSpecifier.get(), nullptr}; 869 int RC = execvp(ExecutorPath.get(), Args); 870 if (RC != 0) { 871 errs() << "unable to launch out-of-process executor \"" 872 << ExecutorPath.get() << "\"\n"; 873 exit(1); 874 } 875 } 876 // else we're the parent... 877 878 // Close the child ends of the pipes 879 close(ToExecutor[ReadEnd]); 880 close(FromExecutor[WriteEnd]); 881 882 return SimpleRemoteEPC::Create<FDSimpleRemoteEPCTransport>( 883 std::make_unique<DynamicThreadPoolTaskDispatcher>(), 884 SimpleRemoteEPC::Setup(), FromExecutor[ReadEnd], ToExecutor[WriteEnd]); 885 #endif 886 } 887 888 #if LLVM_ON_UNIX && LLVM_ENABLE_THREADS 889 static Error createTCPSocketError(Twine Details) { 890 return make_error<StringError>( 891 formatv("Failed to connect TCP socket '{0}': {1}", 892 OutOfProcessExecutorConnect, Details), 893 inconvertibleErrorCode()); 894 } 895 896 static Expected<int> connectTCPSocket(std::string Host, std::string PortStr) { 897 addrinfo *AI; 898 addrinfo Hints{}; 899 Hints.ai_family = AF_INET; 900 Hints.ai_socktype = SOCK_STREAM; 901 Hints.ai_flags = AI_NUMERICSERV; 902 903 if (int EC = getaddrinfo(Host.c_str(), PortStr.c_str(), &Hints, &AI)) 904 return createTCPSocketError("Address resolution failed (" + 905 StringRef(gai_strerror(EC)) + ")"); 906 907 // Cycle through the returned addrinfo structures and connect to the first 908 // reachable endpoint. 909 int SockFD; 910 addrinfo *Server; 911 for (Server = AI; Server != nullptr; Server = Server->ai_next) { 912 // socket might fail, e.g. if the address family is not supported. Skip to 913 // the next addrinfo structure in such a case. 914 if ((SockFD = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol)) < 0) 915 continue; 916 917 // If connect returns null, we exit the loop with a working socket. 918 if (connect(SockFD, Server->ai_addr, Server->ai_addrlen) == 0) 919 break; 920 921 close(SockFD); 922 } 923 freeaddrinfo(AI); 924 925 // If we reached the end of the loop without connecting to a valid endpoint, 926 // dump the last error that was logged in socket() or connect(). 927 if (Server == nullptr) 928 return createTCPSocketError(std::strerror(errno)); 929 930 return SockFD; 931 } 932 #endif 933 934 static Expected<std::unique_ptr<ExecutorProcessControl>> connectToExecutor() { 935 #ifndef LLVM_ON_UNIX 936 // FIXME: Add TCP support for Windows. 937 return make_error<StringError>("-" + OutOfProcessExecutorConnect.ArgStr + 938 " not supported on non-unix platforms", 939 inconvertibleErrorCode()); 940 #elif !LLVM_ENABLE_THREADS 941 // Out of process mode using SimpleRemoteEPC depends on threads. 942 return make_error<StringError>( 943 "-" + OutOfProcessExecutorConnect.ArgStr + 944 " requires threads, but LLVM was built with " 945 "LLVM_ENABLE_THREADS=Off", 946 inconvertibleErrorCode()); 947 #else 948 949 StringRef Host, PortStr; 950 std::tie(Host, PortStr) = StringRef(OutOfProcessExecutorConnect).split(':'); 951 if (Host.empty()) 952 return createTCPSocketError("Host name for -" + 953 OutOfProcessExecutorConnect.ArgStr + 954 " can not be empty"); 955 if (PortStr.empty()) 956 return createTCPSocketError("Port number in -" + 957 OutOfProcessExecutorConnect.ArgStr + 958 " can not be empty"); 959 int Port = 0; 960 if (PortStr.getAsInteger(10, Port)) 961 return createTCPSocketError("Port number '" + PortStr + 962 "' is not a valid integer"); 963 964 Expected<int> SockFD = connectTCPSocket(Host.str(), PortStr.str()); 965 if (!SockFD) 966 return SockFD.takeError(); 967 968 return SimpleRemoteEPC::Create<FDSimpleRemoteEPCTransport>( 969 std::make_unique<DynamicThreadPoolTaskDispatcher>(), 970 SimpleRemoteEPC::Setup(), *SockFD, *SockFD); 971 #endif 972 } 973 974 class PhonyExternalsGenerator : public DefinitionGenerator { 975 public: 976 Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD, 977 JITDylibLookupFlags JDLookupFlags, 978 const SymbolLookupSet &LookupSet) override { 979 SymbolMap PhonySymbols; 980 for (auto &KV : LookupSet) 981 PhonySymbols[KV.first] = JITEvaluatedSymbol(0, JITSymbolFlags::Exported); 982 return JD.define(absoluteSymbols(std::move(PhonySymbols))); 983 } 984 }; 985 986 Expected<std::unique_ptr<Session>> Session::Create(Triple TT) { 987 988 std::unique_ptr<ExecutorProcessControl> EPC; 989 if (OutOfProcessExecutor.getNumOccurrences()) { 990 /// If -oop-executor is passed then launch the executor. 991 if (auto REPC = launchExecutor()) 992 EPC = std::move(*REPC); 993 else 994 return REPC.takeError(); 995 } else if (OutOfProcessExecutorConnect.getNumOccurrences()) { 996 /// If -oop-executor-connect is passed then connect to the executor. 997 if (auto REPC = connectToExecutor()) 998 EPC = std::move(*REPC); 999 else 1000 return REPC.takeError(); 1001 } else { 1002 /// Otherwise use SelfExecutorProcessControl to target the current process. 1003 auto PageSize = sys::Process::getPageSize(); 1004 if (!PageSize) 1005 return PageSize.takeError(); 1006 EPC = std::make_unique<SelfExecutorProcessControl>( 1007 std::make_shared<SymbolStringPool>(), 1008 std::make_unique<InPlaceTaskDispatcher>(), std::move(TT), *PageSize, 1009 createMemoryManager()); 1010 } 1011 1012 Error Err = Error::success(); 1013 std::unique_ptr<Session> S(new Session(std::move(EPC), Err)); 1014 if (Err) 1015 return std::move(Err); 1016 return std::move(S); 1017 } 1018 1019 Session::~Session() { 1020 if (auto Err = ES.endSession()) 1021 ES.reportError(std::move(Err)); 1022 } 1023 1024 Session::Session(std::unique_ptr<ExecutorProcessControl> EPC, Error &Err) 1025 : ES(std::move(EPC)), 1026 ObjLayer(ES, ES.getExecutorProcessControl().getMemMgr()) { 1027 1028 /// Local ObjectLinkingLayer::Plugin class to forward modifyPassConfig to the 1029 /// Session. 1030 class JITLinkSessionPlugin : public ObjectLinkingLayer::Plugin { 1031 public: 1032 JITLinkSessionPlugin(Session &S) : S(S) {} 1033 void modifyPassConfig(MaterializationResponsibility &MR, LinkGraph &G, 1034 PassConfiguration &PassConfig) override { 1035 S.modifyPassConfig(G.getTargetTriple(), PassConfig); 1036 } 1037 1038 Error notifyFailed(MaterializationResponsibility &MR) override { 1039 return Error::success(); 1040 } 1041 Error notifyRemovingResources(ResourceKey K) override { 1042 return Error::success(); 1043 } 1044 void notifyTransferringResources(ResourceKey DstKey, 1045 ResourceKey SrcKey) override {} 1046 1047 private: 1048 Session &S; 1049 }; 1050 1051 ErrorAsOutParameter _(&Err); 1052 1053 ES.setErrorReporter(reportLLVMJITLinkError); 1054 1055 if (auto MainJDOrErr = ES.createJITDylib("main")) 1056 MainJD = &*MainJDOrErr; 1057 else { 1058 Err = MainJDOrErr.takeError(); 1059 return; 1060 } 1061 1062 if (!NoProcessSymbols) 1063 ExitOnErr(loadProcessSymbols(*this)); 1064 ExitOnErr(loadDylibs(*this)); 1065 1066 auto &TT = ES.getExecutorProcessControl().getTargetTriple(); 1067 1068 if (DebuggerSupport && TT.isOSBinFormatMachO()) 1069 ObjLayer.addPlugin(ExitOnErr( 1070 GDBJITDebugInfoRegistrationPlugin::Create(this->ES, *MainJD, TT))); 1071 1072 // Set up the platform. 1073 if (TT.isOSBinFormatMachO() && !OrcRuntime.empty()) { 1074 if (auto P = 1075 MachOPlatform::Create(ES, ObjLayer, *MainJD, OrcRuntime.c_str())) 1076 ES.setPlatform(std::move(*P)); 1077 else { 1078 Err = P.takeError(); 1079 return; 1080 } 1081 } else if (TT.isOSBinFormatELF() && !OrcRuntime.empty()) { 1082 if (auto P = 1083 ELFNixPlatform::Create(ES, ObjLayer, *MainJD, OrcRuntime.c_str())) 1084 ES.setPlatform(std::move(*P)); 1085 else { 1086 Err = P.takeError(); 1087 return; 1088 } 1089 } else if (TT.isOSBinFormatELF()) { 1090 if (!NoExec) 1091 ObjLayer.addPlugin(std::make_unique<EHFrameRegistrationPlugin>( 1092 ES, ExitOnErr(EPCEHFrameRegistrar::Create(this->ES)))); 1093 if (DebuggerSupport) 1094 ObjLayer.addPlugin(std::make_unique<DebugObjectManagerPlugin>( 1095 ES, ExitOnErr(createJITLoaderGDBRegistrar(this->ES)))); 1096 } 1097 1098 ObjLayer.addPlugin(std::make_unique<JITLinkSessionPlugin>(*this)); 1099 1100 // Process any harness files. 1101 for (auto &HarnessFile : TestHarnesses) { 1102 HarnessFiles.insert(HarnessFile); 1103 1104 auto ObjBuffer = ExitOnErr(getFile(HarnessFile)); 1105 1106 auto ObjInterface = 1107 ExitOnErr(getObjectFileInterface(ES, ObjBuffer->getMemBufferRef())); 1108 1109 for (auto &KV : ObjInterface.SymbolFlags) 1110 HarnessDefinitions.insert(*KV.first); 1111 1112 auto Obj = ExitOnErr( 1113 object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef())); 1114 1115 for (auto &Sym : Obj->symbols()) { 1116 uint32_t SymFlags = ExitOnErr(Sym.getFlags()); 1117 auto Name = ExitOnErr(Sym.getName()); 1118 1119 if (Name.empty()) 1120 continue; 1121 1122 if (SymFlags & object::BasicSymbolRef::SF_Undefined) 1123 HarnessExternals.insert(Name); 1124 } 1125 } 1126 1127 // If a name is defined by some harness file then it's a definition, not an 1128 // external. 1129 for (auto &DefName : HarnessDefinitions) 1130 HarnessExternals.erase(DefName.getKey()); 1131 } 1132 1133 void Session::dumpSessionInfo(raw_ostream &OS) { 1134 OS << "Registered addresses:\n" << SymbolInfos << FileInfos; 1135 } 1136 1137 void Session::modifyPassConfig(const Triple &TT, 1138 PassConfiguration &PassConfig) { 1139 if (!CheckFiles.empty()) 1140 PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) { 1141 auto &EPC = ES.getExecutorProcessControl(); 1142 if (EPC.getTargetTriple().getObjectFormat() == Triple::ELF) 1143 return registerELFGraphInfo(*this, G); 1144 1145 if (EPC.getTargetTriple().getObjectFormat() == Triple::MachO) 1146 return registerMachOGraphInfo(*this, G); 1147 1148 if (EPC.getTargetTriple().isOSWindows()) 1149 return registerCOFFGraphInfo(*this, G); 1150 1151 return make_error<StringError>("Unsupported object format for GOT/stub " 1152 "registration", 1153 inconvertibleErrorCode()); 1154 }); 1155 1156 if (ShowLinkGraph) 1157 PassConfig.PostFixupPasses.push_back([](LinkGraph &G) -> Error { 1158 outs() << "Link graph \"" << G.getName() << "\" post-fixup:\n"; 1159 G.dump(outs()); 1160 return Error::success(); 1161 }); 1162 1163 PassConfig.PrePrunePasses.push_back( 1164 [this](LinkGraph &G) { return applyHarnessPromotions(*this, G); }); 1165 1166 if (ShowSizes) { 1167 PassConfig.PrePrunePasses.push_back([this](LinkGraph &G) -> Error { 1168 SizeBeforePruning += computeTotalBlockSizes(G); 1169 return Error::success(); 1170 }); 1171 PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) -> Error { 1172 SizeAfterFixups += computeTotalBlockSizes(G); 1173 return Error::success(); 1174 }); 1175 } 1176 1177 if (ShowRelocatedSectionContents) 1178 PassConfig.PostFixupPasses.push_back([](LinkGraph &G) -> Error { 1179 outs() << "Relocated section contents for " << G.getName() << ":\n"; 1180 dumpSectionContents(outs(), G); 1181 return Error::success(); 1182 }); 1183 1184 if (AddSelfRelocations) 1185 PassConfig.PostPrunePasses.push_back(addSelfRelocations); 1186 } 1187 1188 Expected<Session::FileInfo &> Session::findFileInfo(StringRef FileName) { 1189 auto FileInfoItr = FileInfos.find(FileName); 1190 if (FileInfoItr == FileInfos.end()) 1191 return make_error<StringError>("file \"" + FileName + "\" not recognized", 1192 inconvertibleErrorCode()); 1193 return FileInfoItr->second; 1194 } 1195 1196 Expected<Session::MemoryRegionInfo &> 1197 Session::findSectionInfo(StringRef FileName, StringRef SectionName) { 1198 auto FI = findFileInfo(FileName); 1199 if (!FI) 1200 return FI.takeError(); 1201 auto SecInfoItr = FI->SectionInfos.find(SectionName); 1202 if (SecInfoItr == FI->SectionInfos.end()) 1203 return make_error<StringError>("no section \"" + SectionName + 1204 "\" registered for file \"" + FileName + 1205 "\"", 1206 inconvertibleErrorCode()); 1207 return SecInfoItr->second; 1208 } 1209 1210 Expected<Session::MemoryRegionInfo &> 1211 Session::findStubInfo(StringRef FileName, StringRef TargetName) { 1212 auto FI = findFileInfo(FileName); 1213 if (!FI) 1214 return FI.takeError(); 1215 auto StubInfoItr = FI->StubInfos.find(TargetName); 1216 if (StubInfoItr == FI->StubInfos.end()) 1217 return make_error<StringError>("no stub for \"" + TargetName + 1218 "\" registered for file \"" + FileName + 1219 "\"", 1220 inconvertibleErrorCode()); 1221 return StubInfoItr->second; 1222 } 1223 1224 Expected<Session::MemoryRegionInfo &> 1225 Session::findGOTEntryInfo(StringRef FileName, StringRef TargetName) { 1226 auto FI = findFileInfo(FileName); 1227 if (!FI) 1228 return FI.takeError(); 1229 auto GOTInfoItr = FI->GOTEntryInfos.find(TargetName); 1230 if (GOTInfoItr == FI->GOTEntryInfos.end()) 1231 return make_error<StringError>("no GOT entry for \"" + TargetName + 1232 "\" registered for file \"" + FileName + 1233 "\"", 1234 inconvertibleErrorCode()); 1235 return GOTInfoItr->second; 1236 } 1237 1238 bool Session::isSymbolRegistered(StringRef SymbolName) { 1239 return SymbolInfos.count(SymbolName); 1240 } 1241 1242 Expected<Session::MemoryRegionInfo &> 1243 Session::findSymbolInfo(StringRef SymbolName, Twine ErrorMsgStem) { 1244 auto SymInfoItr = SymbolInfos.find(SymbolName); 1245 if (SymInfoItr == SymbolInfos.end()) 1246 return make_error<StringError>(ErrorMsgStem + ": symbol " + SymbolName + 1247 " not found", 1248 inconvertibleErrorCode()); 1249 return SymInfoItr->second; 1250 } 1251 1252 } // end namespace llvm 1253 1254 static Triple getFirstFileTriple() { 1255 static Triple FirstTT = []() { 1256 assert(!InputFiles.empty() && "InputFiles can not be empty"); 1257 for (auto InputFile : InputFiles) { 1258 auto ObjBuffer = ExitOnErr(getFile(InputFile)); 1259 file_magic Magic = identify_magic(ObjBuffer->getBuffer()); 1260 switch (Magic) { 1261 case file_magic::coff_object: 1262 case file_magic::elf_relocatable: 1263 case file_magic::macho_object: { 1264 auto Obj = ExitOnErr( 1265 object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef())); 1266 Triple TT = Obj->makeTriple(); 1267 if (Magic == file_magic::coff_object) 1268 TT.setOS(Triple::OSType::Win32); 1269 return TT; 1270 } 1271 default: 1272 break; 1273 } 1274 } 1275 return Triple(); 1276 }(); 1277 1278 return FirstTT; 1279 } 1280 1281 static Error sanitizeArguments(const Triple &TT, const char *ArgV0) { 1282 1283 // -noexec and --args should not be used together. 1284 if (NoExec && !InputArgv.empty()) 1285 errs() << "Warning: --args passed to -noexec run will be ignored.\n"; 1286 1287 // Set the entry point name if not specified. 1288 if (EntryPointName.empty()) 1289 EntryPointName = TT.getObjectFormat() == Triple::MachO ? "_main" : "main"; 1290 1291 // Disable debugger support by default in noexec tests. 1292 if (DebuggerSupport.getNumOccurrences() == 0 && NoExec) 1293 DebuggerSupport = false; 1294 1295 // If -slab-allocate is passed, check that we're not trying to use it in 1296 // -oop-executor or -oop-executor-connect mode. 1297 // 1298 // FIXME: Remove once we enable remote slab allocation. 1299 if (SlabAllocateSizeString != "") { 1300 if (OutOfProcessExecutor.getNumOccurrences() || 1301 OutOfProcessExecutorConnect.getNumOccurrences()) 1302 return make_error<StringError>( 1303 "-slab-allocate cannot be used with -oop-executor or " 1304 "-oop-executor-connect", 1305 inconvertibleErrorCode()); 1306 } 1307 1308 // If -slab-address is passed, require -slab-allocate and -noexec 1309 if (SlabAddress != ~0ULL) { 1310 if (SlabAllocateSizeString == "" || !NoExec) 1311 return make_error<StringError>( 1312 "-slab-address requires -slab-allocate and -noexec", 1313 inconvertibleErrorCode()); 1314 1315 if (SlabPageSize == 0) 1316 errs() << "Warning: -slab-address used without -slab-page-size.\n"; 1317 } 1318 1319 if (SlabPageSize != 0) { 1320 // -slab-page-size requires slab alloc. 1321 if (SlabAllocateSizeString == "") 1322 return make_error<StringError>("-slab-page-size requires -slab-allocate", 1323 inconvertibleErrorCode()); 1324 1325 // Check -slab-page-size / -noexec interactions. 1326 if (!NoExec) { 1327 if (auto RealPageSize = sys::Process::getPageSize()) { 1328 if (SlabPageSize % *RealPageSize) 1329 return make_error<StringError>( 1330 "-slab-page-size must be a multiple of real page size for exec " 1331 "tests (did you mean to use -noexec ?)\n", 1332 inconvertibleErrorCode()); 1333 } else { 1334 errs() << "Could not retrieve process page size:\n"; 1335 logAllUnhandledErrors(RealPageSize.takeError(), errs(), ""); 1336 errs() << "Executing with slab page size = " 1337 << formatv("{0:x}", SlabPageSize) << ".\n" 1338 << "Tool may crash if " << formatv("{0:x}", SlabPageSize) 1339 << " is not a multiple of the real process page size.\n" 1340 << "(did you mean to use -noexec ?)"; 1341 } 1342 } 1343 } 1344 1345 // Only one of -oop-executor and -oop-executor-connect can be used. 1346 if (!!OutOfProcessExecutor.getNumOccurrences() && 1347 !!OutOfProcessExecutorConnect.getNumOccurrences()) 1348 return make_error<StringError>( 1349 "Only one of -" + OutOfProcessExecutor.ArgStr + " and -" + 1350 OutOfProcessExecutorConnect.ArgStr + " can be specified", 1351 inconvertibleErrorCode()); 1352 1353 // If -oop-executor was used but no value was specified then use a sensible 1354 // default. 1355 if (!!OutOfProcessExecutor.getNumOccurrences() && 1356 OutOfProcessExecutor.empty()) { 1357 SmallString<256> OOPExecutorPath(sys::fs::getMainExecutable( 1358 ArgV0, reinterpret_cast<void *>(&sanitizeArguments))); 1359 sys::path::remove_filename(OOPExecutorPath); 1360 sys::path::append(OOPExecutorPath, "llvm-jitlink-executor"); 1361 OutOfProcessExecutor = OOPExecutorPath.str().str(); 1362 } 1363 1364 return Error::success(); 1365 } 1366 1367 static void addPhonyExternalsGenerator(Session &S) { 1368 S.MainJD->addGenerator(std::make_unique<PhonyExternalsGenerator>()); 1369 } 1370 1371 static Error createJITDylibs(Session &S, 1372 std::map<unsigned, JITDylib *> &IdxToJD) { 1373 // First, set up JITDylibs. 1374 LLVM_DEBUG(dbgs() << "Creating JITDylibs...\n"); 1375 { 1376 // Create a "main" JITLinkDylib. 1377 IdxToJD[0] = S.MainJD; 1378 S.JDSearchOrder.push_back({S.MainJD, JITDylibLookupFlags::MatchAllSymbols}); 1379 LLVM_DEBUG(dbgs() << " 0: " << S.MainJD->getName() << "\n"); 1380 1381 // Add any extra JITDylibs from the command line. 1382 for (auto JDItr = JITDylibs.begin(), JDEnd = JITDylibs.end(); 1383 JDItr != JDEnd; ++JDItr) { 1384 auto JD = S.ES.createJITDylib(*JDItr); 1385 if (!JD) 1386 return JD.takeError(); 1387 unsigned JDIdx = JITDylibs.getPosition(JDItr - JITDylibs.begin()); 1388 IdxToJD[JDIdx] = &*JD; 1389 S.JDSearchOrder.push_back({&*JD, JITDylibLookupFlags::MatchAllSymbols}); 1390 LLVM_DEBUG(dbgs() << " " << JDIdx << ": " << JD->getName() << "\n"); 1391 } 1392 } 1393 1394 LLVM_DEBUG({ 1395 dbgs() << "Dylib search order is [ "; 1396 for (auto &KV : S.JDSearchOrder) 1397 dbgs() << KV.first->getName() << " "; 1398 dbgs() << "]\n"; 1399 }); 1400 1401 return Error::success(); 1402 } 1403 1404 static Error addAbsoluteSymbols(Session &S, 1405 const std::map<unsigned, JITDylib *> &IdxToJD) { 1406 // Define absolute symbols. 1407 LLVM_DEBUG(dbgs() << "Defining absolute symbols...\n"); 1408 for (auto AbsDefItr = AbsoluteDefs.begin(), AbsDefEnd = AbsoluteDefs.end(); 1409 AbsDefItr != AbsDefEnd; ++AbsDefItr) { 1410 unsigned AbsDefArgIdx = 1411 AbsoluteDefs.getPosition(AbsDefItr - AbsoluteDefs.begin()); 1412 auto &JD = *std::prev(IdxToJD.lower_bound(AbsDefArgIdx))->second; 1413 1414 StringRef AbsDefStmt = *AbsDefItr; 1415 size_t EqIdx = AbsDefStmt.find_first_of('='); 1416 if (EqIdx == StringRef::npos) 1417 return make_error<StringError>("Invalid absolute define \"" + AbsDefStmt + 1418 "\". Syntax: <name>=<addr>", 1419 inconvertibleErrorCode()); 1420 StringRef Name = AbsDefStmt.substr(0, EqIdx).trim(); 1421 StringRef AddrStr = AbsDefStmt.substr(EqIdx + 1).trim(); 1422 1423 uint64_t Addr; 1424 if (AddrStr.getAsInteger(0, Addr)) 1425 return make_error<StringError>("Invalid address expression \"" + AddrStr + 1426 "\" in absolute symbol definition \"" + 1427 AbsDefStmt + "\"", 1428 inconvertibleErrorCode()); 1429 JITEvaluatedSymbol AbsDef(Addr, JITSymbolFlags::Exported); 1430 if (auto Err = JD.define(absoluteSymbols({{S.ES.intern(Name), AbsDef}}))) 1431 return Err; 1432 1433 // Register the absolute symbol with the session symbol infos. 1434 S.SymbolInfos[Name] = {ArrayRef<char>(), Addr}; 1435 } 1436 1437 return Error::success(); 1438 } 1439 1440 static Error addAliases(Session &S, 1441 const std::map<unsigned, JITDylib *> &IdxToJD) { 1442 // Define absolute symbols. 1443 LLVM_DEBUG(dbgs() << "Defining aliases...\n"); 1444 for (auto AliasItr = Aliases.begin(), AliasEnd = Aliases.end(); 1445 AliasItr != AliasEnd; ++AliasItr) { 1446 unsigned AliasArgIdx = Aliases.getPosition(AliasItr - Aliases.begin()); 1447 auto &JD = *std::prev(IdxToJD.lower_bound(AliasArgIdx))->second; 1448 1449 StringRef AliasStmt = *AliasItr; 1450 size_t EqIdx = AliasStmt.find_first_of('='); 1451 if (EqIdx == StringRef::npos) 1452 return make_error<StringError>("Invalid alias definition \"" + AliasStmt + 1453 "\". Syntax: <name>=<addr>", 1454 inconvertibleErrorCode()); 1455 StringRef Alias = AliasStmt.substr(0, EqIdx).trim(); 1456 StringRef Aliasee = AliasStmt.substr(EqIdx + 1).trim(); 1457 1458 SymbolAliasMap SAM; 1459 SAM[S.ES.intern(Alias)] = {S.ES.intern(Aliasee), JITSymbolFlags::Exported}; 1460 if (auto Err = JD.define(symbolAliases(std::move(SAM)))) 1461 return Err; 1462 } 1463 1464 return Error::success(); 1465 } 1466 1467 static Error addTestHarnesses(Session &S) { 1468 LLVM_DEBUG(dbgs() << "Adding test harness objects...\n"); 1469 for (auto HarnessFile : TestHarnesses) { 1470 LLVM_DEBUG(dbgs() << " " << HarnessFile << "\n"); 1471 auto ObjBuffer = getFile(HarnessFile); 1472 if (!ObjBuffer) 1473 return ObjBuffer.takeError(); 1474 if (auto Err = S.ObjLayer.add(*S.MainJD, std::move(*ObjBuffer))) 1475 return Err; 1476 } 1477 return Error::success(); 1478 } 1479 1480 static Error addObjects(Session &S, 1481 const std::map<unsigned, JITDylib *> &IdxToJD) { 1482 1483 // Load each object into the corresponding JITDylib.. 1484 LLVM_DEBUG(dbgs() << "Adding objects...\n"); 1485 for (auto InputFileItr = InputFiles.begin(), InputFileEnd = InputFiles.end(); 1486 InputFileItr != InputFileEnd; ++InputFileItr) { 1487 unsigned InputFileArgIdx = 1488 InputFiles.getPosition(InputFileItr - InputFiles.begin()); 1489 const std::string &InputFile = *InputFileItr; 1490 if (StringRef(InputFile).endswith(".a") || 1491 StringRef(InputFile).endswith(".lib")) 1492 continue; 1493 auto &JD = *std::prev(IdxToJD.lower_bound(InputFileArgIdx))->second; 1494 LLVM_DEBUG(dbgs() << " " << InputFileArgIdx << ": \"" << InputFile 1495 << "\" to " << JD.getName() << "\n";); 1496 auto ObjBuffer = getFile(InputFile); 1497 if (!ObjBuffer) 1498 return ObjBuffer.takeError(); 1499 1500 if (S.HarnessFiles.empty()) { 1501 if (auto Err = S.ObjLayer.add(JD, std::move(*ObjBuffer))) 1502 return Err; 1503 } else { 1504 // We're in -harness mode. Use a custom interface for this 1505 // test object. 1506 auto ObjInterface = 1507 getTestObjectFileInterface(S, (*ObjBuffer)->getMemBufferRef()); 1508 if (!ObjInterface) 1509 return ObjInterface.takeError(); 1510 if (auto Err = S.ObjLayer.add(JD, std::move(*ObjBuffer), 1511 std::move(*ObjInterface))) 1512 return Err; 1513 } 1514 } 1515 1516 return Error::success(); 1517 } 1518 1519 static Expected<MaterializationUnit::Interface> 1520 getObjectFileInterfaceHidden(ExecutionSession &ES, MemoryBufferRef ObjBuffer) { 1521 auto I = getObjectFileInterface(ES, ObjBuffer); 1522 if (I) { 1523 for (auto &KV : I->SymbolFlags) 1524 KV.second &= ~JITSymbolFlags::Exported; 1525 } 1526 return I; 1527 } 1528 1529 static Error addLibraries(Session &S, 1530 const std::map<unsigned, JITDylib *> &IdxToJD) { 1531 1532 // 1. Collect search paths for each JITDylib. 1533 DenseMap<const JITDylib *, SmallVector<StringRef, 2>> JDSearchPaths; 1534 1535 for (auto LSPItr = LibrarySearchPaths.begin(), 1536 LSPEnd = LibrarySearchPaths.end(); 1537 LSPItr != LSPEnd; ++LSPItr) { 1538 unsigned LibrarySearchPathIdx = 1539 LibrarySearchPaths.getPosition(LSPItr - LibrarySearchPaths.begin()); 1540 auto &JD = *std::prev(IdxToJD.lower_bound(LibrarySearchPathIdx))->second; 1541 1542 StringRef LibrarySearchPath = *LSPItr; 1543 if (sys::fs::get_file_type(LibrarySearchPath) != 1544 sys::fs::file_type::directory_file) 1545 return make_error<StringError>("While linking " + JD.getName() + ", -L" + 1546 LibrarySearchPath + 1547 " does not point to a directory", 1548 inconvertibleErrorCode()); 1549 1550 JDSearchPaths[&JD].push_back(*LSPItr); 1551 } 1552 1553 LLVM_DEBUG({ 1554 if (!JDSearchPaths.empty()) 1555 dbgs() << "Search paths:\n"; 1556 for (auto &KV : JDSearchPaths) { 1557 dbgs() << " " << KV.first->getName() << ": ["; 1558 for (auto &LibSearchPath : KV.second) 1559 dbgs() << " \"" << LibSearchPath << "\""; 1560 dbgs() << " ]\n"; 1561 } 1562 }); 1563 1564 // 2. Collect library loads 1565 struct LibraryLoad { 1566 StringRef LibName; 1567 bool IsPath = false; 1568 unsigned Position; 1569 StringRef *CandidateExtensions; 1570 enum { Standard, Hidden } Modifier; 1571 }; 1572 std::vector<LibraryLoad> LibraryLoads; 1573 // Add archive files from the inputs to LibraryLoads. 1574 for (auto InputFileItr = InputFiles.begin(), InputFileEnd = InputFiles.end(); 1575 InputFileItr != InputFileEnd; ++InputFileItr) { 1576 StringRef InputFile = *InputFileItr; 1577 if (!InputFile.endswith(".a") && !InputFile.endswith(".lib")) 1578 continue; 1579 LibraryLoad LL; 1580 LL.LibName = InputFile; 1581 LL.IsPath = true; 1582 LL.Position = InputFiles.getPosition(InputFileItr - InputFiles.begin()); 1583 LL.CandidateExtensions = nullptr; 1584 LL.Modifier = LibraryLoad::Standard; 1585 LibraryLoads.push_back(std::move(LL)); 1586 } 1587 1588 // Add -load_hidden arguments to LibraryLoads. 1589 for (auto LibItr = LoadHidden.begin(), LibEnd = LoadHidden.end(); 1590 LibItr != LibEnd; ++LibItr) { 1591 LibraryLoad LL; 1592 LL.LibName = *LibItr; 1593 LL.IsPath = true; 1594 LL.Position = LoadHidden.getPosition(LibItr - LoadHidden.begin()); 1595 LL.CandidateExtensions = nullptr; 1596 LL.Modifier = LibraryLoad::Hidden; 1597 LibraryLoads.push_back(std::move(LL)); 1598 } 1599 StringRef StandardExtensions[] = {".so", ".dylib", ".dll", ".a", ".lib"}; 1600 StringRef ArchiveExtensionsOnly[] = {".a", ".lib"}; 1601 1602 // Add -lx arguments to LibraryLoads. 1603 for (auto LibItr = Libraries.begin(), LibEnd = Libraries.end(); 1604 LibItr != LibEnd; ++LibItr) { 1605 LibraryLoad LL; 1606 LL.LibName = *LibItr; 1607 LL.Position = Libraries.getPosition(LibItr - Libraries.begin()); 1608 LL.CandidateExtensions = StandardExtensions; 1609 LL.Modifier = LibraryLoad::Standard; 1610 LibraryLoads.push_back(std::move(LL)); 1611 } 1612 1613 // Add -hidden-lx arguments to LibraryLoads. 1614 for (auto LibHiddenItr = LibrariesHidden.begin(), 1615 LibHiddenEnd = LibrariesHidden.end(); 1616 LibHiddenItr != LibHiddenEnd; ++LibHiddenItr) { 1617 LibraryLoad LL; 1618 LL.LibName = *LibHiddenItr; 1619 LL.Position = 1620 LibrariesHidden.getPosition(LibHiddenItr - LibrariesHidden.begin()); 1621 LL.CandidateExtensions = ArchiveExtensionsOnly; 1622 LL.Modifier = LibraryLoad::Hidden; 1623 LibraryLoads.push_back(std::move(LL)); 1624 } 1625 1626 // If there are any load-<modified> options then turn on flag overrides 1627 // to avoid flag mismatch errors. 1628 if (!LibrariesHidden.empty() || !LoadHidden.empty()) 1629 S.ObjLayer.setOverrideObjectFlagsWithResponsibilityFlags(true); 1630 1631 // Sort library loads by position in the argument list. 1632 llvm::sort(LibraryLoads, [](const LibraryLoad &LHS, const LibraryLoad &RHS) { 1633 return LHS.Position < RHS.Position; 1634 }); 1635 1636 // 3. Process library loads. 1637 auto AddArchive = [&](const char *Path, const LibraryLoad &LL) 1638 -> Expected<std::unique_ptr<StaticLibraryDefinitionGenerator>> { 1639 unique_function<Expected<MaterializationUnit::Interface>( 1640 ExecutionSession & ES, MemoryBufferRef ObjBuffer)> 1641 GetObjFileInterface; 1642 switch (LL.Modifier) { 1643 case LibraryLoad::Standard: 1644 GetObjFileInterface = getObjectFileInterface; 1645 break; 1646 case LibraryLoad::Hidden: 1647 GetObjFileInterface = getObjectFileInterfaceHidden; 1648 break; 1649 } 1650 return StaticLibraryDefinitionGenerator::Load( 1651 S.ObjLayer, Path, S.ES.getExecutorProcessControl().getTargetTriple(), 1652 std::move(GetObjFileInterface)); 1653 }; 1654 1655 for (auto &LL : LibraryLoads) { 1656 bool LibFound = false; 1657 auto &JD = *std::prev(IdxToJD.lower_bound(LL.Position))->second; 1658 1659 // If this is the name of a JITDylib then link against that. 1660 if (auto *LJD = S.ES.getJITDylibByName(LL.LibName)) { 1661 JD.addToLinkOrder(*LJD); 1662 continue; 1663 } 1664 1665 if (LL.IsPath) { 1666 auto G = AddArchive(LL.LibName.str().c_str(), LL); 1667 if (!G) 1668 return createFileError(LL.LibName, G.takeError()); 1669 JD.addGenerator(std::move(*G)); 1670 LLVM_DEBUG({ 1671 dbgs() << "Adding generator for static library " << LL.LibName << " to " 1672 << JD.getName() << "\n"; 1673 }); 1674 continue; 1675 } 1676 1677 // Otherwise look through the search paths. 1678 auto JDSearchPathsItr = JDSearchPaths.find(&JD); 1679 if (JDSearchPathsItr != JDSearchPaths.end()) { 1680 for (StringRef SearchPath : JDSearchPathsItr->second) { 1681 for (const char *LibExt : {".dylib", ".so", ".dll", ".a", ".lib"}) { 1682 SmallVector<char, 256> LibPath; 1683 LibPath.reserve(SearchPath.size() + strlen("lib") + 1684 LL.LibName.size() + strlen(LibExt) + 1685 2); // +2 for pathsep, null term. 1686 llvm::copy(SearchPath, std::back_inserter(LibPath)); 1687 if (StringRef(LibExt) != ".lib" && StringRef(LibExt) != ".dll") 1688 sys::path::append(LibPath, "lib" + LL.LibName + LibExt); 1689 else 1690 sys::path::append(LibPath, LL.LibName + LibExt); 1691 LibPath.push_back('\0'); 1692 1693 // Skip missing or non-regular paths. 1694 if (sys::fs::get_file_type(LibPath.data()) != 1695 sys::fs::file_type::regular_file) { 1696 continue; 1697 } 1698 1699 file_magic Magic; 1700 if (auto EC = identify_magic(LibPath, Magic)) { 1701 // If there was an error loading the file then skip it. 1702 LLVM_DEBUG({ 1703 dbgs() << "Library search found \"" << LibPath 1704 << "\", but could not identify file type (" << EC.message() 1705 << "). Skipping.\n"; 1706 }); 1707 continue; 1708 } 1709 1710 // We identified the magic. Assume that we can load it -- we'll reset 1711 // in the default case. 1712 LibFound = true; 1713 switch (Magic) { 1714 case file_magic::elf_shared_object: 1715 case file_magic::macho_dynamically_linked_shared_lib: { 1716 // TODO: On first reference to LibPath this should create a JITDylib 1717 // with a generator and add it to JD's links-against list. Subsquent 1718 // references should use the JITDylib created on the first 1719 // reference. 1720 auto G = 1721 EPCDynamicLibrarySearchGenerator::Load(S.ES, LibPath.data()); 1722 if (!G) 1723 return G.takeError(); 1724 LLVM_DEBUG({ 1725 dbgs() << "Adding generator for dynamic library " 1726 << LibPath.data() << " to " << JD.getName() << "\n"; 1727 }); 1728 JD.addGenerator(std::move(*G)); 1729 break; 1730 } 1731 case file_magic::archive: 1732 case file_magic::macho_universal_binary: { 1733 auto G = AddArchive(LibPath.data(), LL); 1734 if (!G) 1735 return G.takeError(); 1736 JD.addGenerator(std::move(*G)); 1737 LLVM_DEBUG({ 1738 dbgs() << "Adding generator for static library " << LibPath.data() 1739 << " to " << JD.getName() << "\n"; 1740 }); 1741 break; 1742 } 1743 default: 1744 // This file isn't a recognized library kind. 1745 LLVM_DEBUG({ 1746 dbgs() << "Library search found \"" << LibPath 1747 << "\", but file type is not supported. Skipping.\n"; 1748 }); 1749 LibFound = false; 1750 break; 1751 } 1752 if (LibFound) 1753 break; 1754 } 1755 if (LibFound) 1756 break; 1757 } 1758 } 1759 1760 if (!LibFound) 1761 return make_error<StringError>("While linking " + JD.getName() + 1762 ", could not find library for -l" + 1763 LL.LibName, 1764 inconvertibleErrorCode()); 1765 } 1766 1767 return Error::success(); 1768 } 1769 1770 static Error addSessionInputs(Session &S) { 1771 std::map<unsigned, JITDylib *> IdxToJD; 1772 1773 if (auto Err = createJITDylibs(S, IdxToJD)) 1774 return Err; 1775 1776 if (auto Err = addAbsoluteSymbols(S, IdxToJD)) 1777 return Err; 1778 1779 if (auto Err = addAliases(S, IdxToJD)) 1780 return Err; 1781 1782 if (!TestHarnesses.empty()) 1783 if (auto Err = addTestHarnesses(S)) 1784 return Err; 1785 1786 if (auto Err = addObjects(S, IdxToJD)) 1787 return Err; 1788 1789 if (auto Err = addLibraries(S, IdxToJD)) 1790 return Err; 1791 1792 return Error::success(); 1793 } 1794 1795 namespace { 1796 struct TargetInfo { 1797 const Target *TheTarget; 1798 std::unique_ptr<MCSubtargetInfo> STI; 1799 std::unique_ptr<MCRegisterInfo> MRI; 1800 std::unique_ptr<MCAsmInfo> MAI; 1801 std::unique_ptr<MCContext> Ctx; 1802 std::unique_ptr<MCDisassembler> Disassembler; 1803 std::unique_ptr<MCInstrInfo> MII; 1804 std::unique_ptr<MCInstrAnalysis> MIA; 1805 std::unique_ptr<MCInstPrinter> InstPrinter; 1806 }; 1807 } // anonymous namespace 1808 1809 static TargetInfo getTargetInfo(const Triple &TT) { 1810 auto TripleName = TT.str(); 1811 std::string ErrorStr; 1812 const Target *TheTarget = TargetRegistry::lookupTarget(TripleName, ErrorStr); 1813 if (!TheTarget) 1814 ExitOnErr(make_error<StringError>("Error accessing target '" + TripleName + 1815 "': " + ErrorStr, 1816 inconvertibleErrorCode())); 1817 1818 std::unique_ptr<MCSubtargetInfo> STI( 1819 TheTarget->createMCSubtargetInfo(TripleName, "", "")); 1820 if (!STI) 1821 ExitOnErr( 1822 make_error<StringError>("Unable to create subtarget for " + TripleName, 1823 inconvertibleErrorCode())); 1824 1825 std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName)); 1826 if (!MRI) 1827 ExitOnErr(make_error<StringError>("Unable to create target register info " 1828 "for " + 1829 TripleName, 1830 inconvertibleErrorCode())); 1831 1832 MCTargetOptions MCOptions; 1833 std::unique_ptr<MCAsmInfo> MAI( 1834 TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); 1835 if (!MAI) 1836 ExitOnErr(make_error<StringError>("Unable to create target asm info " + 1837 TripleName, 1838 inconvertibleErrorCode())); 1839 1840 auto Ctx = std::make_unique<MCContext>(Triple(TripleName), MAI.get(), 1841 MRI.get(), STI.get()); 1842 1843 std::unique_ptr<MCDisassembler> Disassembler( 1844 TheTarget->createMCDisassembler(*STI, *Ctx)); 1845 if (!Disassembler) 1846 ExitOnErr(make_error<StringError>("Unable to create disassembler for " + 1847 TripleName, 1848 inconvertibleErrorCode())); 1849 1850 std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo()); 1851 if (!MII) 1852 ExitOnErr(make_error<StringError>("Unable to create instruction info for" + 1853 TripleName, 1854 inconvertibleErrorCode())); 1855 1856 std::unique_ptr<MCInstrAnalysis> MIA( 1857 TheTarget->createMCInstrAnalysis(MII.get())); 1858 if (!MIA) 1859 ExitOnErr(make_error<StringError>( 1860 "Unable to create instruction analysis for" + TripleName, 1861 inconvertibleErrorCode())); 1862 1863 std::unique_ptr<MCInstPrinter> InstPrinter( 1864 TheTarget->createMCInstPrinter(Triple(TripleName), 0, *MAI, *MII, *MRI)); 1865 if (!InstPrinter) 1866 ExitOnErr(make_error<StringError>( 1867 "Unable to create instruction printer for" + TripleName, 1868 inconvertibleErrorCode())); 1869 return {TheTarget, std::move(STI), std::move(MRI), 1870 std::move(MAI), std::move(Ctx), std::move(Disassembler), 1871 std::move(MII), std::move(MIA), std::move(InstPrinter)}; 1872 } 1873 1874 static Error runChecks(Session &S) { 1875 const auto &TT = S.ES.getExecutorProcessControl().getTargetTriple(); 1876 1877 if (CheckFiles.empty()) 1878 return Error::success(); 1879 1880 LLVM_DEBUG(dbgs() << "Running checks...\n"); 1881 1882 auto TI = getTargetInfo(TT); 1883 1884 auto IsSymbolValid = [&S](StringRef Symbol) { 1885 return S.isSymbolRegistered(Symbol); 1886 }; 1887 1888 auto GetSymbolInfo = [&S](StringRef Symbol) { 1889 return S.findSymbolInfo(Symbol, "Can not get symbol info"); 1890 }; 1891 1892 auto GetSectionInfo = [&S](StringRef FileName, StringRef SectionName) { 1893 return S.findSectionInfo(FileName, SectionName); 1894 }; 1895 1896 auto GetStubInfo = [&S](StringRef FileName, StringRef SectionName) { 1897 return S.findStubInfo(FileName, SectionName); 1898 }; 1899 1900 auto GetGOTInfo = [&S](StringRef FileName, StringRef SectionName) { 1901 return S.findGOTEntryInfo(FileName, SectionName); 1902 }; 1903 1904 RuntimeDyldChecker Checker( 1905 IsSymbolValid, GetSymbolInfo, GetSectionInfo, GetStubInfo, GetGOTInfo, 1906 TT.isLittleEndian() ? support::little : support::big, 1907 TI.Disassembler.get(), TI.InstPrinter.get(), dbgs()); 1908 1909 std::string CheckLineStart = "# " + CheckName + ":"; 1910 for (auto &CheckFile : CheckFiles) { 1911 auto CheckerFileBuf = ExitOnErr(getFile(CheckFile)); 1912 if (!Checker.checkAllRulesInBuffer(CheckLineStart, &*CheckerFileBuf)) 1913 ExitOnErr(make_error<StringError>( 1914 "Some checks in " + CheckFile + " failed", inconvertibleErrorCode())); 1915 } 1916 1917 return Error::success(); 1918 } 1919 1920 static Error addSelfRelocations(LinkGraph &G) { 1921 auto TI = getTargetInfo(G.getTargetTriple()); 1922 for (auto *Sym : G.defined_symbols()) 1923 if (Sym->isCallable()) 1924 if (auto Err = addFunctionPointerRelocationsToCurrentSymbol( 1925 *Sym, G, *TI.Disassembler, *TI.MIA)) 1926 return Err; 1927 return Error::success(); 1928 } 1929 1930 static void dumpSessionStats(Session &S) { 1931 if (!ShowSizes) 1932 return; 1933 if (!OrcRuntime.empty()) 1934 outs() << "Note: Session stats include runtime and entry point lookup, but " 1935 "not JITDylib initialization/deinitialization.\n"; 1936 if (ShowSizes) 1937 outs() << " Total size of all blocks before pruning: " 1938 << S.SizeBeforePruning 1939 << "\n Total size of all blocks after fixups: " << S.SizeAfterFixups 1940 << "\n"; 1941 } 1942 1943 static Expected<JITEvaluatedSymbol> getMainEntryPoint(Session &S) { 1944 return S.ES.lookup(S.JDSearchOrder, S.ES.intern(EntryPointName)); 1945 } 1946 1947 static Expected<JITEvaluatedSymbol> getOrcRuntimeEntryPoint(Session &S) { 1948 std::string RuntimeEntryPoint = "__orc_rt_run_program_wrapper"; 1949 const auto &TT = S.ES.getExecutorProcessControl().getTargetTriple(); 1950 if (TT.getObjectFormat() == Triple::MachO) 1951 RuntimeEntryPoint = '_' + RuntimeEntryPoint; 1952 return S.ES.lookup(S.JDSearchOrder, S.ES.intern(RuntimeEntryPoint)); 1953 } 1954 1955 static Expected<JITEvaluatedSymbol> getEntryPoint(Session &S) { 1956 JITEvaluatedSymbol EntryPoint; 1957 1958 // Find the entry-point function unconditionally, since we want to force 1959 // it to be materialized to collect stats. 1960 if (auto EP = getMainEntryPoint(S)) 1961 EntryPoint = *EP; 1962 else 1963 return EP.takeError(); 1964 LLVM_DEBUG({ 1965 dbgs() << "Using entry point \"" << EntryPointName 1966 << "\": " << formatv("{0:x16}", EntryPoint.getAddress()) << "\n"; 1967 }); 1968 1969 // If we're running with the ORC runtime then replace the entry-point 1970 // with the __orc_rt_run_program symbol. 1971 if (!OrcRuntime.empty()) { 1972 if (auto EP = getOrcRuntimeEntryPoint(S)) 1973 EntryPoint = *EP; 1974 else 1975 return EP.takeError(); 1976 LLVM_DEBUG({ 1977 dbgs() << "(called via __orc_rt_run_program_wrapper at " 1978 << formatv("{0:x16}", EntryPoint.getAddress()) << ")\n"; 1979 }); 1980 } 1981 1982 return EntryPoint; 1983 } 1984 1985 static Expected<int> runWithRuntime(Session &S, ExecutorAddr EntryPointAddr) { 1986 StringRef DemangledEntryPoint = EntryPointName; 1987 const auto &TT = S.ES.getExecutorProcessControl().getTargetTriple(); 1988 if (TT.getObjectFormat() == Triple::MachO && 1989 DemangledEntryPoint.front() == '_') 1990 DemangledEntryPoint = DemangledEntryPoint.drop_front(); 1991 using llvm::orc::shared::SPSString; 1992 using SPSRunProgramSig = 1993 int64_t(SPSString, SPSString, shared::SPSSequence<SPSString>); 1994 int64_t Result; 1995 if (auto Err = S.ES.callSPSWrapper<SPSRunProgramSig>( 1996 EntryPointAddr, Result, S.MainJD->getName(), DemangledEntryPoint, 1997 static_cast<std::vector<std::string> &>(InputArgv))) 1998 return std::move(Err); 1999 return Result; 2000 } 2001 2002 static Expected<int> runWithoutRuntime(Session &S, 2003 ExecutorAddr EntryPointAddr) { 2004 return S.ES.getExecutorProcessControl().runAsMain(EntryPointAddr, InputArgv); 2005 } 2006 2007 namespace { 2008 struct JITLinkTimers { 2009 TimerGroup JITLinkTG{"llvm-jitlink timers", "timers for llvm-jitlink phases"}; 2010 Timer LoadObjectsTimer{"load", "time to load/add object files", JITLinkTG}; 2011 Timer LinkTimer{"link", "time to link object files", JITLinkTG}; 2012 Timer RunTimer{"run", "time to execute jitlink'd code", JITLinkTG}; 2013 }; 2014 } // namespace 2015 2016 int main(int argc, char *argv[]) { 2017 InitLLVM X(argc, argv); 2018 2019 InitializeAllTargetInfos(); 2020 InitializeAllTargetMCs(); 2021 InitializeAllDisassemblers(); 2022 2023 cl::HideUnrelatedOptions({&JITLinkCategory, &getColorCategory()}); 2024 cl::ParseCommandLineOptions(argc, argv, "llvm jitlink tool"); 2025 ExitOnErr.setBanner(std::string(argv[0]) + ": "); 2026 2027 /// If timers are enabled, create a JITLinkTimers instance. 2028 std::unique_ptr<JITLinkTimers> Timers = 2029 ShowTimes ? std::make_unique<JITLinkTimers>() : nullptr; 2030 2031 ExitOnErr(sanitizeArguments(getFirstFileTriple(), argv[0])); 2032 2033 auto S = ExitOnErr(Session::Create(getFirstFileTriple())); 2034 2035 { 2036 TimeRegion TR(Timers ? &Timers->LoadObjectsTimer : nullptr); 2037 ExitOnErr(addSessionInputs(*S)); 2038 } 2039 2040 if (PhonyExternals) 2041 addPhonyExternalsGenerator(*S); 2042 2043 if (ShowInitialExecutionSessionState) 2044 S->ES.dump(outs()); 2045 2046 Expected<JITEvaluatedSymbol> EntryPoint(nullptr); 2047 { 2048 ExpectedAsOutParameter<JITEvaluatedSymbol> _(&EntryPoint); 2049 TimeRegion TR(Timers ? &Timers->LinkTimer : nullptr); 2050 EntryPoint = getEntryPoint(*S); 2051 } 2052 2053 // Print any reports regardless of whether we succeeded or failed. 2054 if (ShowEntryExecutionSessionState) 2055 S->ES.dump(outs()); 2056 2057 if (ShowAddrs) 2058 S->dumpSessionInfo(outs()); 2059 2060 dumpSessionStats(*S); 2061 2062 if (!EntryPoint) { 2063 if (Timers) 2064 Timers->JITLinkTG.printAll(errs()); 2065 reportLLVMJITLinkError(EntryPoint.takeError()); 2066 exit(1); 2067 } 2068 2069 ExitOnErr(runChecks(*S)); 2070 2071 if (NoExec) 2072 return 0; 2073 2074 int Result = 0; 2075 { 2076 LLVM_DEBUG(dbgs() << "Running \"" << EntryPointName << "\"...\n"); 2077 TimeRegion TR(Timers ? &Timers->RunTimer : nullptr); 2078 if (!OrcRuntime.empty()) 2079 Result = 2080 ExitOnErr(runWithRuntime(*S, ExecutorAddr(EntryPoint->getAddress()))); 2081 else 2082 Result = ExitOnErr( 2083 runWithoutRuntime(*S, ExecutorAddr(EntryPoint->getAddress()))); 2084 } 2085 2086 // Destroy the session. 2087 ExitOnErr(S->ES.endSession()); 2088 S.reset(); 2089 2090 if (Timers) 2091 Timers->JITLinkTG.printAll(errs()); 2092 2093 // If the executing code set a test result override then use that. 2094 if (UseTestResultOverride) 2095 Result = TestResultOverride; 2096 2097 return Result; 2098 } 2099