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 #include "llvm/BinaryFormat/Magic.h" 17 #include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX, LLVM_ENABLE_THREADS 18 #include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h" 19 #include "llvm/ExecutionEngine/Orc/COFFPlatform.h" 20 #include "llvm/ExecutionEngine/Orc/COFFVCRuntimeSupport.h" 21 #include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h" 22 #include "llvm/ExecutionEngine/Orc/Debugging/DebugInfoSupport.h" 23 #include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.h" 24 #include "llvm/ExecutionEngine/Orc/Debugging/PerfSupportPlugin.h" 25 #include "llvm/ExecutionEngine/Orc/Debugging/VTuneSupportPlugin.h" 26 #include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h" 27 #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h" 28 #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h" 29 #include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h" 30 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" 31 #include "llvm/ExecutionEngine/Orc/IndirectionUtils.h" 32 #include "llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h" 33 #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h" 34 #include "llvm/ExecutionEngine/Orc/LoadLinkableFile.h" 35 #include "llvm/ExecutionEngine/Orc/MachO.h" 36 #include "llvm/ExecutionEngine/Orc/MachOPlatform.h" 37 #include "llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h" 38 #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h" 39 #include "llvm/ExecutionEngine/Orc/SectCreate.h" 40 #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" 41 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" 42 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.h" 43 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderVTune.h" 44 #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h" 45 #include "llvm/MC/MCAsmInfo.h" 46 #include "llvm/MC/MCContext.h" 47 #include "llvm/MC/MCDisassembler/MCDisassembler.h" 48 #include "llvm/MC/MCInstPrinter.h" 49 #include "llvm/MC/MCInstrAnalysis.h" 50 #include "llvm/MC/MCInstrInfo.h" 51 #include "llvm/MC/MCRegisterInfo.h" 52 #include "llvm/MC/MCSubtargetInfo.h" 53 #include "llvm/MC/MCTargetOptions.h" 54 #include "llvm/MC/TargetRegistry.h" 55 #include "llvm/Object/COFF.h" 56 #include "llvm/Object/MachO.h" 57 #include "llvm/Object/ObjectFile.h" 58 #include "llvm/Support/CommandLine.h" 59 #include "llvm/Support/Debug.h" 60 #include "llvm/Support/InitLLVM.h" 61 #include "llvm/Support/MemoryBuffer.h" 62 #include "llvm/Support/Path.h" 63 #include "llvm/Support/Process.h" 64 #include "llvm/Support/TargetSelect.h" 65 #include "llvm/Support/Timer.h" 66 #include <cstring> 67 #include <deque> 68 #include <string> 69 70 #ifdef LLVM_ON_UNIX 71 #include <netdb.h> 72 #include <netinet/in.h> 73 #include <sys/socket.h> 74 #include <unistd.h> 75 #endif // LLVM_ON_UNIX 76 77 #define DEBUG_TYPE "llvm_jitlink" 78 79 using namespace llvm; 80 using namespace llvm::jitlink; 81 using namespace llvm::orc; 82 83 static cl::OptionCategory JITLinkCategory("JITLink Options"); 84 85 static cl::list<bool> LazyLink("lazy", 86 cl::desc("Link the following file lazily"), 87 cl::cat(JITLinkCategory)); 88 89 static cl::list<std::string> InputFiles(cl::Positional, cl::OneOrMore, 90 cl::desc("input files"), 91 cl::cat(JITLinkCategory)); 92 93 static cl::list<std::string> 94 LibrarySearchPaths("L", 95 cl::desc("Add dir to the list of library search paths"), 96 cl::Prefix, cl::cat(JITLinkCategory)); 97 98 static cl::list<std::string> 99 Libraries("l", 100 cl::desc("Link against library X in the library search paths"), 101 cl::Prefix, cl::cat(JITLinkCategory)); 102 103 static cl::list<std::string> 104 LibrariesHidden("hidden-l", 105 cl::desc("Link against library X in the library search " 106 "paths with hidden visibility"), 107 cl::Prefix, cl::cat(JITLinkCategory)); 108 109 static cl::list<std::string> 110 LoadHidden("load_hidden", 111 cl::desc("Link against library X with hidden visibility"), 112 cl::cat(JITLinkCategory)); 113 114 static cl::opt<bool> SearchSystemLibrary( 115 "search-sys-lib", 116 cl::desc("Add system library paths to library search paths"), 117 cl::init(false), cl::cat(JITLinkCategory)); 118 119 static cl::opt<bool> NoExec("noexec", cl::desc("Do not execute loaded code"), 120 cl::init(false), cl::cat(JITLinkCategory)); 121 122 static cl::list<std::string> 123 CheckFiles("check", cl::desc("File containing verifier checks"), 124 cl::cat(JITLinkCategory)); 125 126 static cl::opt<std::string> 127 CheckName("check-name", cl::desc("Name of checks to match against"), 128 cl::init("jitlink-check"), cl::cat(JITLinkCategory)); 129 130 static cl::opt<std::string> 131 EntryPointName("entry", cl::desc("Symbol to call as main entry point"), 132 cl::init(""), cl::cat(JITLinkCategory)); 133 134 static cl::list<std::string> JITDylibs( 135 "jd", 136 cl::desc("Specifies the JITDylib to be used for any subsequent " 137 "input file, -L<seacrh-path>, and -l<library> arguments"), 138 cl::cat(JITLinkCategory)); 139 140 static cl::list<std::string> 141 Dylibs("preload", 142 cl::desc("Pre-load dynamic libraries (e.g. language runtimes " 143 "required by the ORC runtime)"), 144 cl::cat(JITLinkCategory)); 145 146 static cl::list<std::string> InputArgv("args", cl::Positional, 147 cl::desc("<program arguments>..."), 148 cl::PositionalEatsArgs, 149 cl::cat(JITLinkCategory)); 150 151 static cl::opt<bool> 152 DebuggerSupport("debugger-support", 153 cl::desc("Enable debugger suppport (default = !-noexec)"), 154 cl::init(true), cl::Hidden, cl::cat(JITLinkCategory)); 155 156 static cl::opt<bool> PerfSupport("perf-support", 157 cl::desc("Enable perf profiling support"), 158 cl::init(false), cl::Hidden, 159 cl::cat(JITLinkCategory)); 160 161 static cl::opt<bool> VTuneSupport("vtune-support", 162 cl::desc("Enable vtune profiling support"), 163 cl::init(false), cl::Hidden, 164 cl::cat(JITLinkCategory)); 165 static cl::opt<bool> 166 NoProcessSymbols("no-process-syms", 167 cl::desc("Do not resolve to llvm-jitlink process symbols"), 168 cl::init(false), cl::cat(JITLinkCategory)); 169 170 static cl::list<std::string> AbsoluteDefs( 171 "abs", 172 cl::desc("Inject absolute symbol definitions (syntax: <name>=<addr>)"), 173 cl::cat(JITLinkCategory)); 174 175 static cl::list<std::string> 176 Aliases("alias", 177 cl::desc("Inject symbol aliases (syntax: <alias-name>=<aliasee>)"), 178 cl::cat(JITLinkCategory)); 179 180 static cl::list<std::string> 181 SectCreate("sectcreate", 182 cl::desc("given <sectname>,<filename>[@<sym>=<offset>,...] " 183 "add the content of <filename> to <sectname>"), 184 cl::cat(JITLinkCategory)); 185 186 static cl::list<std::string> TestHarnesses("harness", cl::Positional, 187 cl::desc("Test harness files"), 188 cl::PositionalEatsArgs, 189 cl::cat(JITLinkCategory)); 190 191 static cl::opt<bool> 192 ShowLinkedFiles("show-linked-files", 193 cl::desc("List each file/graph name if/when it is linked"), 194 cl::init(false), cl::cat(JITLinkCategory)); 195 196 static cl::opt<bool> ShowInitialExecutionSessionState( 197 "show-init-es", 198 cl::desc("Print ExecutionSession state before resolving entry point"), 199 cl::init(false), cl::cat(JITLinkCategory)); 200 201 static cl::opt<bool> ShowEntryExecutionSessionState( 202 "show-entry-es", 203 cl::desc("Print ExecutionSession state after resolving entry point"), 204 cl::init(false), cl::cat(JITLinkCategory)); 205 206 static cl::opt<bool> ShowAddrs( 207 "show-addrs", 208 cl::desc("Print registered symbol, section, got and stub addresses"), 209 cl::init(false), cl::cat(JITLinkCategory)); 210 211 static cl::opt<std::string> ShowLinkGraphs( 212 "show-graphs", 213 cl::desc("Takes a posix regex and prints the link graphs of all files " 214 "matching that regex after fixups have been applied"), 215 cl::Optional, cl::cat(JITLinkCategory)); 216 217 static cl::opt<bool> ShowTimes("show-times", 218 cl::desc("Show times for llvm-jitlink phases"), 219 cl::init(false), cl::cat(JITLinkCategory)); 220 221 static cl::opt<std::string> SlabAllocateSizeString( 222 "slab-allocate", 223 cl::desc("Allocate from a slab of the given size " 224 "(allowable suffixes: Kb, Mb, Gb. default = " 225 "Kb)"), 226 cl::init(""), cl::cat(JITLinkCategory)); 227 228 static cl::opt<uint64_t> SlabAddress( 229 "slab-address", 230 cl::desc("Set slab target address (requires -slab-allocate and -noexec)"), 231 cl::init(~0ULL), cl::cat(JITLinkCategory)); 232 233 static cl::opt<uint64_t> SlabPageSize( 234 "slab-page-size", 235 cl::desc("Set page size for slab (requires -slab-allocate and -noexec)"), 236 cl::init(0), cl::cat(JITLinkCategory)); 237 238 static cl::opt<bool> ShowRelocatedSectionContents( 239 "show-relocated-section-contents", 240 cl::desc("show section contents after fixups have been applied"), 241 cl::init(false), cl::cat(JITLinkCategory)); 242 243 static cl::opt<bool> PhonyExternals( 244 "phony-externals", 245 cl::desc("resolve all otherwise unresolved externals to null"), 246 cl::init(false), cl::cat(JITLinkCategory)); 247 248 static cl::opt<std::string> OutOfProcessExecutor( 249 "oop-executor", cl::desc("Launch an out-of-process executor to run code"), 250 cl::ValueOptional, cl::cat(JITLinkCategory)); 251 252 static cl::opt<std::string> OutOfProcessExecutorConnect( 253 "oop-executor-connect", 254 cl::desc("Connect to an out-of-process executor via TCP"), 255 cl::cat(JITLinkCategory)); 256 257 static cl::opt<std::string> 258 OrcRuntime("orc-runtime", cl::desc("Use ORC runtime from given path"), 259 cl::init(""), cl::cat(JITLinkCategory)); 260 261 static cl::opt<bool> AddSelfRelocations( 262 "add-self-relocations", 263 cl::desc("Add relocations to function pointers to the current function"), 264 cl::init(false), cl::cat(JITLinkCategory)); 265 266 static cl::opt<bool> 267 ShowErrFailedToMaterialize("show-err-failed-to-materialize", 268 cl::desc("Show FailedToMaterialize errors"), 269 cl::init(false), cl::cat(JITLinkCategory)); 270 271 static cl::opt<bool> UseSharedMemory( 272 "use-shared-memory", 273 cl::desc("Use shared memory to transfer generated code and data"), 274 cl::init(false), cl::cat(JITLinkCategory)); 275 276 static cl::opt<std::string> 277 OverrideTriple("triple", cl::desc("Override target triple detection"), 278 cl::init(""), cl::cat(JITLinkCategory)); 279 280 static cl::opt<bool> AllLoad("all_load", 281 cl::desc("Load all members of static archives"), 282 cl::init(false), cl::cat(JITLinkCategory)); 283 284 static cl::opt<bool> ForceLoadObjC( 285 "ObjC", 286 cl::desc("Load all members of static archives that implement " 287 "Objective-C classes or categories, or Swift structs, " 288 "classes or extensions"), 289 cl::init(false), cl::cat(JITLinkCategory)); 290 291 static ExitOnError ExitOnErr; 292 293 static LLVM_ATTRIBUTE_USED void linkComponents() { 294 errs() << "Linking in runtime functions\n" 295 << (void *)&llvm_orc_registerEHFrameSectionWrapper << '\n' 296 << (void *)&llvm_orc_deregisterEHFrameSectionWrapper << '\n' 297 << (void *)&llvm_orc_registerJITLoaderGDBWrapper << '\n' 298 << (void *)&llvm_orc_registerJITLoaderGDBAllocAction << '\n' 299 << (void *)&llvm_orc_registerJITLoaderPerfStart << '\n' 300 << (void *)&llvm_orc_registerJITLoaderPerfEnd << '\n' 301 << (void *)&llvm_orc_registerJITLoaderPerfImpl << '\n' 302 << (void *)&llvm_orc_registerVTuneImpl << '\n' 303 << (void *)&llvm_orc_unregisterVTuneImpl << '\n' 304 << (void *)&llvm_orc_test_registerVTuneImpl << '\n'; 305 } 306 307 static bool UseTestResultOverride = false; 308 static int64_t TestResultOverride = 0; 309 310 extern "C" LLVM_ATTRIBUTE_USED void 311 llvm_jitlink_setTestResultOverride(int64_t Value) { 312 TestResultOverride = Value; 313 UseTestResultOverride = true; 314 } 315 316 static Error addSelfRelocations(LinkGraph &G); 317 318 namespace { 319 320 template <typename ErrT> 321 322 class ConditionalPrintErr { 323 public: 324 ConditionalPrintErr(bool C) : C(C) {} 325 void operator()(ErrT &EI) { 326 if (C) { 327 errs() << "llvm-jitlink error: "; 328 EI.log(errs()); 329 errs() << "\n"; 330 } 331 } 332 333 private: 334 bool C; 335 }; 336 337 Expected<std::unique_ptr<MemoryBuffer>> getFile(const Twine &FileName) { 338 if (auto F = MemoryBuffer::getFile(FileName)) 339 return std::move(*F); 340 else 341 return createFileError(FileName, F.getError()); 342 } 343 344 void reportLLVMJITLinkError(Error Err) { 345 handleAllErrors( 346 std::move(Err), 347 ConditionalPrintErr<orc::FailedToMaterialize>(ShowErrFailedToMaterialize), 348 ConditionalPrintErr<ErrorInfoBase>(true)); 349 } 350 351 } // end anonymous namespace 352 353 namespace llvm { 354 355 static raw_ostream & 356 operator<<(raw_ostream &OS, const Session::MemoryRegionInfo &MRI) { 357 return OS << "target addr = " 358 << format("0x%016" PRIx64, MRI.getTargetAddress()) 359 << ", content: " << (const void *)MRI.getContent().data() << " -- " 360 << (const void *)(MRI.getContent().data() + MRI.getContent().size()) 361 << " (" << MRI.getContent().size() << " bytes)"; 362 } 363 364 static raw_ostream & 365 operator<<(raw_ostream &OS, const Session::SymbolInfoMap &SIM) { 366 OS << "Symbols:\n"; 367 for (auto &SKV : SIM) 368 OS << " \"" << SKV.first << "\" " << SKV.second << "\n"; 369 return OS; 370 } 371 372 static raw_ostream & 373 operator<<(raw_ostream &OS, const Session::FileInfo &FI) { 374 for (auto &SIKV : FI.SectionInfos) 375 OS << " Section \"" << SIKV.first() << "\": " << SIKV.second << "\n"; 376 for (auto &GOTKV : FI.GOTEntryInfos) 377 OS << " GOT \"" << GOTKV.first() << "\": " << GOTKV.second << "\n"; 378 for (auto &StubKVs : FI.StubInfos) { 379 OS << " Stubs \"" << StubKVs.first() << "\":"; 380 for (auto MemRegion : StubKVs.second) 381 OS << " " << MemRegion; 382 OS << "\n"; 383 } 384 return OS; 385 } 386 387 static raw_ostream & 388 operator<<(raw_ostream &OS, const Session::FileInfoMap &FIM) { 389 for (auto &FIKV : FIM) 390 OS << "File \"" << FIKV.first() << "\":\n" << FIKV.second; 391 return OS; 392 } 393 394 bool lazyLinkingRequested() { 395 for (auto LL : LazyLink) 396 if (LL) 397 return true; 398 return false; 399 } 400 401 static Error applyHarnessPromotions(Session &S, LinkGraph &G) { 402 403 // If this graph is part of the test harness there's nothing to do. 404 if (S.HarnessFiles.empty() || S.HarnessFiles.count(G.getName())) 405 return Error::success(); 406 407 LLVM_DEBUG(dbgs() << "Applying promotions to graph " << G.getName() << "\n"); 408 409 // If this graph is part of the test then promote any symbols referenced by 410 // the harness to default scope, remove all symbols that clash with harness 411 // definitions. 412 std::vector<Symbol *> DefinitionsToRemove; 413 for (auto *Sym : G.defined_symbols()) { 414 415 if (!Sym->hasName()) 416 continue; 417 418 if (Sym->getLinkage() == Linkage::Weak) { 419 if (!S.CanonicalWeakDefs.count(*Sym->getName()) || 420 S.CanonicalWeakDefs[*Sym->getName()] != G.getName()) { 421 LLVM_DEBUG({ 422 dbgs() << " Externalizing weak symbol " << Sym->getName() << "\n"; 423 }); 424 DefinitionsToRemove.push_back(Sym); 425 } else { 426 LLVM_DEBUG({ 427 dbgs() << " Making weak symbol " << Sym->getName() << " strong\n"; 428 }); 429 if (S.HarnessExternals.count(*Sym->getName())) 430 Sym->setScope(Scope::Default); 431 else 432 Sym->setScope(Scope::Hidden); 433 Sym->setLinkage(Linkage::Strong); 434 } 435 } else if (S.HarnessExternals.count(*Sym->getName())) { 436 LLVM_DEBUG(dbgs() << " Promoting " << Sym->getName() << "\n"); 437 Sym->setScope(Scope::Default); 438 Sym->setLive(true); 439 continue; 440 } else if (S.HarnessDefinitions.count(*Sym->getName())) { 441 LLVM_DEBUG(dbgs() << " Externalizing " << Sym->getName() << "\n"); 442 DefinitionsToRemove.push_back(Sym); 443 } 444 } 445 446 for (auto *Sym : DefinitionsToRemove) 447 G.makeExternal(*Sym); 448 449 return Error::success(); 450 } 451 452 static void dumpSectionContents(raw_ostream &OS, LinkGraph &G) { 453 constexpr orc::ExecutorAddrDiff DumpWidth = 16; 454 static_assert(isPowerOf2_64(DumpWidth), "DumpWidth must be a power of two"); 455 456 // Put sections in address order. 457 std::vector<Section *> Sections; 458 for (auto &S : G.sections()) 459 Sections.push_back(&S); 460 461 llvm::sort(Sections, [](const Section *LHS, const Section *RHS) { 462 if (LHS->symbols().empty() && RHS->symbols().empty()) 463 return false; 464 if (LHS->symbols().empty()) 465 return false; 466 if (RHS->symbols().empty()) 467 return true; 468 SectionRange LHSRange(*LHS); 469 SectionRange RHSRange(*RHS); 470 return LHSRange.getStart() < RHSRange.getStart(); 471 }); 472 473 for (auto *S : Sections) { 474 OS << S->getName() << " content:"; 475 if (S->symbols().empty()) { 476 OS << "\n section empty\n"; 477 continue; 478 } 479 480 // Sort symbols into order, then render. 481 std::vector<Symbol *> Syms(S->symbols().begin(), S->symbols().end()); 482 llvm::sort(Syms, [](const Symbol *LHS, const Symbol *RHS) { 483 return LHS->getAddress() < RHS->getAddress(); 484 }); 485 486 orc::ExecutorAddr NextAddr(Syms.front()->getAddress().getValue() & 487 ~(DumpWidth - 1)); 488 for (auto *Sym : Syms) { 489 bool IsZeroFill = Sym->getBlock().isZeroFill(); 490 auto SymStart = Sym->getAddress(); 491 auto SymSize = Sym->getSize(); 492 auto SymEnd = SymStart + SymSize; 493 const uint8_t *SymData = IsZeroFill ? nullptr 494 : reinterpret_cast<const uint8_t *>( 495 Sym->getSymbolContent().data()); 496 497 // Pad any space before the symbol starts. 498 while (NextAddr != SymStart) { 499 if (NextAddr % DumpWidth == 0) 500 OS << formatv("\n{0:x16}:", NextAddr); 501 OS << " "; 502 ++NextAddr; 503 } 504 505 // Render the symbol content. 506 while (NextAddr != SymEnd) { 507 if (NextAddr % DumpWidth == 0) 508 OS << formatv("\n{0:x16}:", NextAddr); 509 if (IsZeroFill) 510 OS << " 00"; 511 else 512 OS << formatv(" {0:x-2}", SymData[NextAddr - SymStart]); 513 ++NextAddr; 514 } 515 } 516 OS << "\n"; 517 } 518 } 519 520 // A memory mapper with a fake offset applied only used for -noexec testing 521 class InProcessDeltaMapper final : public InProcessMemoryMapper { 522 public: 523 InProcessDeltaMapper(size_t PageSize, uint64_t TargetAddr) 524 : InProcessMemoryMapper(PageSize), TargetMapAddr(TargetAddr), 525 DeltaAddr(0) {} 526 527 static Expected<std::unique_ptr<InProcessDeltaMapper>> Create() { 528 size_t PageSize = SlabPageSize; 529 if (!PageSize) { 530 if (auto PageSizeOrErr = sys::Process::getPageSize()) 531 PageSize = *PageSizeOrErr; 532 else 533 return PageSizeOrErr.takeError(); 534 } 535 536 if (PageSize == 0) 537 return make_error<StringError>("Page size is zero", 538 inconvertibleErrorCode()); 539 540 return std::make_unique<InProcessDeltaMapper>(PageSize, SlabAddress); 541 } 542 543 void reserve(size_t NumBytes, OnReservedFunction OnReserved) override { 544 InProcessMemoryMapper::reserve( 545 NumBytes, [this, OnReserved = std::move(OnReserved)]( 546 Expected<ExecutorAddrRange> Result) mutable { 547 if (!Result) 548 return OnReserved(Result.takeError()); 549 550 assert(DeltaAddr == 0 && "Overwriting previous offset"); 551 if (TargetMapAddr != ~0ULL) 552 DeltaAddr = TargetMapAddr - Result->Start.getValue(); 553 auto OffsetRange = ExecutorAddrRange(Result->Start + DeltaAddr, 554 Result->End + DeltaAddr); 555 556 OnReserved(OffsetRange); 557 }); 558 } 559 560 char *prepare(ExecutorAddr Addr, size_t ContentSize) override { 561 return InProcessMemoryMapper::prepare(Addr - DeltaAddr, ContentSize); 562 } 563 564 void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override { 565 // Slide mapping based on delta, make all segments read-writable, and 566 // discard allocation actions. 567 auto FixedAI = std::move(AI); 568 FixedAI.MappingBase -= DeltaAddr; 569 for (auto &Seg : FixedAI.Segments) 570 Seg.AG = {MemProt::Read | MemProt::Write, Seg.AG.getMemLifetime()}; 571 FixedAI.Actions.clear(); 572 InProcessMemoryMapper::initialize( 573 FixedAI, [this, OnInitialized = std::move(OnInitialized)]( 574 Expected<ExecutorAddr> Result) mutable { 575 if (!Result) 576 return OnInitialized(Result.takeError()); 577 578 OnInitialized(ExecutorAddr(Result->getValue() + DeltaAddr)); 579 }); 580 } 581 582 void deinitialize(ArrayRef<ExecutorAddr> Allocations, 583 OnDeinitializedFunction OnDeInitialized) override { 584 std::vector<ExecutorAddr> Addrs(Allocations.size()); 585 for (const auto Base : Allocations) { 586 Addrs.push_back(Base - DeltaAddr); 587 } 588 589 InProcessMemoryMapper::deinitialize(Addrs, std::move(OnDeInitialized)); 590 } 591 592 void release(ArrayRef<ExecutorAddr> Reservations, 593 OnReleasedFunction OnRelease) override { 594 std::vector<ExecutorAddr> Addrs(Reservations.size()); 595 for (const auto Base : Reservations) { 596 Addrs.push_back(Base - DeltaAddr); 597 } 598 InProcessMemoryMapper::release(Addrs, std::move(OnRelease)); 599 } 600 601 private: 602 uint64_t TargetMapAddr; 603 uint64_t DeltaAddr; 604 }; 605 606 Expected<uint64_t> getSlabAllocSize(StringRef SizeString) { 607 SizeString = SizeString.trim(); 608 609 uint64_t Units = 1024; 610 611 if (SizeString.ends_with_insensitive("kb")) 612 SizeString = SizeString.drop_back(2).rtrim(); 613 else if (SizeString.ends_with_insensitive("mb")) { 614 Units = 1024 * 1024; 615 SizeString = SizeString.drop_back(2).rtrim(); 616 } else if (SizeString.ends_with_insensitive("gb")) { 617 Units = 1024 * 1024 * 1024; 618 SizeString = SizeString.drop_back(2).rtrim(); 619 } 620 621 uint64_t SlabSize = 0; 622 if (SizeString.getAsInteger(10, SlabSize)) 623 return make_error<StringError>("Invalid numeric format for slab size", 624 inconvertibleErrorCode()); 625 626 return SlabSize * Units; 627 } 628 629 static std::unique_ptr<JITLinkMemoryManager> createInProcessMemoryManager() { 630 uint64_t SlabSize; 631 #ifdef _WIN32 632 SlabSize = 1024 * 1024; 633 #else 634 SlabSize = 1024 * 1024 * 1024; 635 #endif 636 637 if (!SlabAllocateSizeString.empty()) 638 SlabSize = ExitOnErr(getSlabAllocSize(SlabAllocateSizeString)); 639 640 // If this is a -no-exec case and we're tweaking the slab address or size then 641 // use the delta mapper. 642 if (NoExec && (SlabAddress || SlabPageSize)) 643 return ExitOnErr( 644 MapperJITLinkMemoryManager::CreateWithMapper<InProcessDeltaMapper>( 645 SlabSize)); 646 647 // Otherwise use the standard in-process mapper. 648 return ExitOnErr( 649 MapperJITLinkMemoryManager::CreateWithMapper<InProcessMemoryMapper>( 650 SlabSize)); 651 } 652 653 Expected<std::unique_ptr<jitlink::JITLinkMemoryManager>> 654 createSharedMemoryManager(SimpleRemoteEPC &SREPC) { 655 SharedMemoryMapper::SymbolAddrs SAs; 656 if (auto Err = SREPC.getBootstrapSymbols( 657 {{SAs.Instance, rt::ExecutorSharedMemoryMapperServiceInstanceName}, 658 {SAs.Reserve, 659 rt::ExecutorSharedMemoryMapperServiceReserveWrapperName}, 660 {SAs.Initialize, 661 rt::ExecutorSharedMemoryMapperServiceInitializeWrapperName}, 662 {SAs.Deinitialize, 663 rt::ExecutorSharedMemoryMapperServiceDeinitializeWrapperName}, 664 {SAs.Release, 665 rt::ExecutorSharedMemoryMapperServiceReleaseWrapperName}})) 666 return std::move(Err); 667 668 #ifdef _WIN32 669 size_t SlabSize = 1024 * 1024; 670 #else 671 size_t SlabSize = 1024 * 1024 * 1024; 672 #endif 673 674 if (!SlabAllocateSizeString.empty()) 675 SlabSize = ExitOnErr(getSlabAllocSize(SlabAllocateSizeString)); 676 677 return MapperJITLinkMemoryManager::CreateWithMapper<SharedMemoryMapper>( 678 SlabSize, SREPC, SAs); 679 } 680 681 682 static Expected<MaterializationUnit::Interface> 683 getTestObjectFileInterface(Session &S, MemoryBufferRef O) { 684 685 // Get the standard interface for this object, but ignore the symbols field. 686 // We'll handle that manually to include promotion. 687 auto I = getObjectFileInterface(S.ES, O); 688 if (!I) 689 return I.takeError(); 690 I->SymbolFlags.clear(); 691 692 // If creating an object file was going to fail it would have happened above, 693 // so we can 'cantFail' this. 694 auto Obj = cantFail(object::ObjectFile::createObjectFile(O)); 695 696 // The init symbol must be included in the SymbolFlags map if present. 697 if (I->InitSymbol) 698 I->SymbolFlags[I->InitSymbol] = 699 JITSymbolFlags::MaterializationSideEffectsOnly; 700 701 for (auto &Sym : Obj->symbols()) { 702 Expected<uint32_t> SymFlagsOrErr = Sym.getFlags(); 703 if (!SymFlagsOrErr) 704 // TODO: Test this error. 705 return SymFlagsOrErr.takeError(); 706 707 // Skip symbols not defined in this object file. 708 if ((*SymFlagsOrErr & object::BasicSymbolRef::SF_Undefined)) 709 continue; 710 711 auto Name = Sym.getName(); 712 if (!Name) 713 return Name.takeError(); 714 715 // Skip symbols that have type SF_File. 716 if (auto SymType = Sym.getType()) { 717 if (*SymType == object::SymbolRef::ST_File) 718 continue; 719 } else 720 return SymType.takeError(); 721 722 auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym); 723 if (!SymFlags) 724 return SymFlags.takeError(); 725 726 if (SymFlags->isWeak()) { 727 // If this is a weak symbol that's not defined in the harness then we 728 // need to either mark it as strong (if this is the first definition 729 // that we've seen) or discard it. 730 if (S.HarnessDefinitions.count(*Name) || S.CanonicalWeakDefs.count(*Name)) 731 continue; 732 S.CanonicalWeakDefs[*Name] = O.getBufferIdentifier(); 733 *SymFlags &= ~JITSymbolFlags::Weak; 734 if (!S.HarnessExternals.count(*Name)) 735 *SymFlags &= ~JITSymbolFlags::Exported; 736 } else if (S.HarnessExternals.count(*Name)) { 737 *SymFlags |= JITSymbolFlags::Exported; 738 } else if (S.HarnessDefinitions.count(*Name) || 739 !(*SymFlagsOrErr & object::BasicSymbolRef::SF_Global)) 740 continue; 741 742 auto InternedName = S.ES.intern(*Name); 743 I->SymbolFlags[InternedName] = std::move(*SymFlags); 744 } 745 746 return I; 747 } 748 749 static Error loadProcessSymbols(Session &S) { 750 S.ProcessSymsJD = &S.ES.createBareJITDylib("Process"); 751 auto FilterMainEntryPoint = 752 [EPName = S.ES.intern(EntryPointName)](SymbolStringPtr Name) { 753 return Name != EPName; 754 }; 755 S.ProcessSymsJD->addGenerator( 756 ExitOnErr(orc::EPCDynamicLibrarySearchGenerator::GetForTargetProcess( 757 S.ES, std::move(FilterMainEntryPoint)))); 758 759 return Error::success(); 760 } 761 762 static Error loadDylibs(Session &S) { 763 LLVM_DEBUG(dbgs() << "Loading dylibs...\n"); 764 for (const auto &Dylib : Dylibs) { 765 LLVM_DEBUG(dbgs() << " " << Dylib << "\n"); 766 auto DL = S.getOrLoadDynamicLibrary(Dylib); 767 if (!DL) 768 return DL.takeError(); 769 } 770 771 return Error::success(); 772 } 773 774 static Expected<std::unique_ptr<ExecutorProcessControl>> launchExecutor() { 775 #ifndef LLVM_ON_UNIX 776 // FIXME: Add support for Windows. 777 return make_error<StringError>("-" + OutOfProcessExecutor.ArgStr + 778 " not supported on non-unix platforms", 779 inconvertibleErrorCode()); 780 #elif !LLVM_ENABLE_THREADS 781 // Out of process mode using SimpleRemoteEPC depends on threads. 782 return make_error<StringError>( 783 "-" + OutOfProcessExecutor.ArgStr + 784 " requires threads, but LLVM was built with " 785 "LLVM_ENABLE_THREADS=Off", 786 inconvertibleErrorCode()); 787 #else 788 789 constexpr int ReadEnd = 0; 790 constexpr int WriteEnd = 1; 791 792 // Pipe FDs. 793 int ToExecutor[2]; 794 int FromExecutor[2]; 795 796 pid_t ChildPID; 797 798 // Create pipes to/from the executor.. 799 if (pipe(ToExecutor) != 0 || pipe(FromExecutor) != 0) 800 return make_error<StringError>("Unable to create pipe for executor", 801 inconvertibleErrorCode()); 802 803 ChildPID = fork(); 804 805 if (ChildPID == 0) { 806 // In the child... 807 808 // Close the parent ends of the pipes 809 close(ToExecutor[WriteEnd]); 810 close(FromExecutor[ReadEnd]); 811 812 // Execute the child process. 813 std::unique_ptr<char[]> ExecutorPath, FDSpecifier; 814 { 815 ExecutorPath = std::make_unique<char[]>(OutOfProcessExecutor.size() + 1); 816 strcpy(ExecutorPath.get(), OutOfProcessExecutor.data()); 817 818 std::string FDSpecifierStr("filedescs="); 819 FDSpecifierStr += utostr(ToExecutor[ReadEnd]); 820 FDSpecifierStr += ','; 821 FDSpecifierStr += utostr(FromExecutor[WriteEnd]); 822 FDSpecifier = std::make_unique<char[]>(FDSpecifierStr.size() + 1); 823 strcpy(FDSpecifier.get(), FDSpecifierStr.c_str()); 824 } 825 826 char *const Args[] = {ExecutorPath.get(), FDSpecifier.get(), nullptr}; 827 int RC = execvp(ExecutorPath.get(), Args); 828 if (RC != 0) { 829 errs() << "unable to launch out-of-process executor \"" 830 << ExecutorPath.get() << "\"\n"; 831 exit(1); 832 } 833 } 834 // else we're the parent... 835 836 // Close the child ends of the pipes 837 close(ToExecutor[ReadEnd]); 838 close(FromExecutor[WriteEnd]); 839 840 auto S = SimpleRemoteEPC::Setup(); 841 if (UseSharedMemory) 842 S.CreateMemoryManager = createSharedMemoryManager; 843 844 return SimpleRemoteEPC::Create<FDSimpleRemoteEPCTransport>( 845 std::make_unique<DynamicThreadPoolTaskDispatcher>(std::nullopt), 846 std::move(S), FromExecutor[ReadEnd], ToExecutor[WriteEnd]); 847 #endif 848 } 849 850 #if LLVM_ON_UNIX && LLVM_ENABLE_THREADS 851 static Error createTCPSocketError(Twine Details) { 852 return make_error<StringError>( 853 formatv("Failed to connect TCP socket '{0}': {1}", 854 OutOfProcessExecutorConnect, Details), 855 inconvertibleErrorCode()); 856 } 857 858 static Expected<int> connectTCPSocket(std::string Host, std::string PortStr) { 859 addrinfo *AI; 860 addrinfo Hints{}; 861 Hints.ai_family = AF_INET; 862 Hints.ai_socktype = SOCK_STREAM; 863 Hints.ai_flags = AI_NUMERICSERV; 864 865 if (int EC = getaddrinfo(Host.c_str(), PortStr.c_str(), &Hints, &AI)) 866 return createTCPSocketError("Address resolution failed (" + 867 StringRef(gai_strerror(EC)) + ")"); 868 869 // Cycle through the returned addrinfo structures and connect to the first 870 // reachable endpoint. 871 int SockFD; 872 addrinfo *Server; 873 for (Server = AI; Server != nullptr; Server = Server->ai_next) { 874 // socket might fail, e.g. if the address family is not supported. Skip to 875 // the next addrinfo structure in such a case. 876 if ((SockFD = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol)) < 0) 877 continue; 878 879 // If connect returns null, we exit the loop with a working socket. 880 if (connect(SockFD, Server->ai_addr, Server->ai_addrlen) == 0) 881 break; 882 883 close(SockFD); 884 } 885 freeaddrinfo(AI); 886 887 // If we reached the end of the loop without connecting to a valid endpoint, 888 // dump the last error that was logged in socket() or connect(). 889 if (Server == nullptr) 890 return createTCPSocketError(std::strerror(errno)); 891 892 return SockFD; 893 } 894 #endif 895 896 static Expected<std::unique_ptr<ExecutorProcessControl>> connectToExecutor() { 897 #ifndef LLVM_ON_UNIX 898 // FIXME: Add TCP support for Windows. 899 return make_error<StringError>("-" + OutOfProcessExecutorConnect.ArgStr + 900 " not supported on non-unix platforms", 901 inconvertibleErrorCode()); 902 #elif !LLVM_ENABLE_THREADS 903 // Out of process mode using SimpleRemoteEPC depends on threads. 904 return make_error<StringError>( 905 "-" + OutOfProcessExecutorConnect.ArgStr + 906 " requires threads, but LLVM was built with " 907 "LLVM_ENABLE_THREADS=Off", 908 inconvertibleErrorCode()); 909 #else 910 911 StringRef Host, PortStr; 912 std::tie(Host, PortStr) = StringRef(OutOfProcessExecutorConnect).split(':'); 913 if (Host.empty()) 914 return createTCPSocketError("Host name for -" + 915 OutOfProcessExecutorConnect.ArgStr + 916 " can not be empty"); 917 if (PortStr.empty()) 918 return createTCPSocketError("Port number in -" + 919 OutOfProcessExecutorConnect.ArgStr + 920 " can not be empty"); 921 int Port = 0; 922 if (PortStr.getAsInteger(10, Port)) 923 return createTCPSocketError("Port number '" + PortStr + 924 "' is not a valid integer"); 925 926 Expected<int> SockFD = connectTCPSocket(Host.str(), PortStr.str()); 927 if (!SockFD) 928 return SockFD.takeError(); 929 930 auto S = SimpleRemoteEPC::Setup(); 931 if (UseSharedMemory) 932 S.CreateMemoryManager = createSharedMemoryManager; 933 934 return SimpleRemoteEPC::Create<FDSimpleRemoteEPCTransport>( 935 std::make_unique<DynamicThreadPoolTaskDispatcher>(std::nullopt), 936 std::move(S), *SockFD, *SockFD); 937 #endif 938 } 939 940 class PhonyExternalsGenerator : public DefinitionGenerator { 941 public: 942 Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD, 943 JITDylibLookupFlags JDLookupFlags, 944 const SymbolLookupSet &LookupSet) override { 945 SymbolMap PhonySymbols; 946 for (auto &KV : LookupSet) 947 PhonySymbols[KV.first] = {ExecutorAddr(), JITSymbolFlags::Exported}; 948 return JD.define(absoluteSymbols(std::move(PhonySymbols))); 949 } 950 }; 951 952 static void handleLazyCallFailure() { 953 dbgs() << "ERROR: failure to materialize lazy call-through target.\n"; 954 exit(1); 955 } 956 957 static void *reenter(void *Ctx, void *TrampolineAddr) { 958 std::promise<void *> LandingAddressP; 959 auto LandingAddressF = LandingAddressP.get_future(); 960 961 auto *EPCIU = static_cast<EPCIndirectionUtils *>(Ctx); 962 EPCIU->getLazyCallThroughManager().resolveTrampolineLandingAddress( 963 ExecutorAddr::fromPtr(TrampolineAddr), [&](ExecutorAddr LandingAddress) { 964 LandingAddressP.set_value(LandingAddress.toPtr<void *>()); 965 }); 966 return LandingAddressF.get(); 967 } 968 969 Expected<std::unique_ptr<Session::LazyLinkingSupport>> 970 createLazyLinkingSupport(ObjectLinkingLayer &OLL) { 971 auto EPCIU = EPCIndirectionUtils::Create(OLL.getExecutionSession()); 972 if (!EPCIU) 973 return EPCIU.takeError(); 974 if (auto Err = (*EPCIU) 975 ->writeResolverBlock(ExecutorAddr::fromPtr(&reenter), 976 ExecutorAddr::fromPtr(EPCIU->get())) 977 .takeError()) 978 return Err; 979 (*EPCIU)->createLazyCallThroughManager( 980 OLL.getExecutionSession(), ExecutorAddr::fromPtr(handleLazyCallFailure)); 981 auto RSMgr = JITLinkRedirectableSymbolManager::Create(OLL); 982 if (!RSMgr) 983 return RSMgr.takeError(); 984 985 return std::make_unique<Session::LazyLinkingSupport>(std::move(*EPCIU), 986 std::move(*RSMgr), OLL); 987 } 988 989 Expected<std::unique_ptr<Session>> Session::Create(Triple TT, 990 SubtargetFeatures Features) { 991 992 std::unique_ptr<ExecutorProcessControl> EPC; 993 if (OutOfProcessExecutor.getNumOccurrences()) { 994 /// If -oop-executor is passed then launch the executor. 995 if (auto REPC = launchExecutor()) 996 EPC = std::move(*REPC); 997 else 998 return REPC.takeError(); 999 } else if (OutOfProcessExecutorConnect.getNumOccurrences()) { 1000 /// If -oop-executor-connect is passed then connect to the executor. 1001 if (auto REPC = connectToExecutor()) 1002 EPC = std::move(*REPC); 1003 else 1004 return REPC.takeError(); 1005 } else { 1006 /// Otherwise use SelfExecutorProcessControl to target the current process. 1007 auto PageSize = sys::Process::getPageSize(); 1008 if (!PageSize) 1009 return PageSize.takeError(); 1010 EPC = std::make_unique<SelfExecutorProcessControl>( 1011 std::make_shared<SymbolStringPool>(), 1012 std::make_unique<InPlaceTaskDispatcher>(), std::move(TT), *PageSize, 1013 createInProcessMemoryManager()); 1014 } 1015 1016 Error Err = Error::success(); 1017 std::unique_ptr<Session> S(new Session(std::move(EPC), Err)); 1018 if (Err) 1019 return std::move(Err); 1020 S->Features = std::move(Features); 1021 1022 if (lazyLinkingRequested()) { 1023 if (auto LazyLinking = createLazyLinkingSupport(S->ObjLayer)) 1024 S->LazyLinking = std::move(*LazyLinking); 1025 else 1026 return LazyLinking.takeError(); 1027 } 1028 1029 return std::move(S); 1030 } 1031 1032 Session::~Session() { 1033 if (auto Err = ES.endSession()) 1034 ES.reportError(std::move(Err)); 1035 } 1036 1037 Session::Session(std::unique_ptr<ExecutorProcessControl> EPC, Error &Err) 1038 : ES(std::move(EPC)), 1039 ObjLayer(ES, ES.getExecutorProcessControl().getMemMgr()) { 1040 1041 /// Local ObjectLinkingLayer::Plugin class to forward modifyPassConfig to the 1042 /// Session. 1043 class JITLinkSessionPlugin : public ObjectLinkingLayer::Plugin { 1044 public: 1045 JITLinkSessionPlugin(Session &S) : S(S) {} 1046 void modifyPassConfig(MaterializationResponsibility &MR, LinkGraph &G, 1047 PassConfiguration &PassConfig) override { 1048 S.modifyPassConfig(G, PassConfig); 1049 } 1050 1051 Error notifyFailed(MaterializationResponsibility &MR) override { 1052 return Error::success(); 1053 } 1054 Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override { 1055 return Error::success(); 1056 } 1057 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey, 1058 ResourceKey SrcKey) override {} 1059 1060 private: 1061 Session &S; 1062 }; 1063 1064 ErrorAsOutParameter _(&Err); 1065 1066 ES.setErrorReporter(reportLLVMJITLinkError); 1067 1068 if (!NoProcessSymbols) 1069 ExitOnErr(loadProcessSymbols(*this)); 1070 1071 ExitOnErr(loadDylibs(*this)); 1072 1073 auto &TT = ES.getTargetTriple(); 1074 1075 if (DebuggerSupport && TT.isOSBinFormatMachO()) { 1076 if (!ProcessSymsJD) { 1077 Err = make_error<StringError>("MachO debugging requires process symbols", 1078 inconvertibleErrorCode()); 1079 return; 1080 } 1081 ObjLayer.addPlugin(ExitOnErr(GDBJITDebugInfoRegistrationPlugin::Create( 1082 this->ES, *ProcessSymsJD, TT))); 1083 } 1084 1085 if (PerfSupport && TT.isOSBinFormatELF()) { 1086 if (!ProcessSymsJD) { 1087 Err = make_error<StringError>("MachO debugging requires process symbols", 1088 inconvertibleErrorCode()); 1089 return; 1090 } 1091 ObjLayer.addPlugin(ExitOnErr(DebugInfoPreservationPlugin::Create())); 1092 ObjLayer.addPlugin(ExitOnErr(PerfSupportPlugin::Create( 1093 this->ES.getExecutorProcessControl(), *ProcessSymsJD, true, true))); 1094 } 1095 1096 if (VTuneSupport && TT.isOSBinFormatELF()) { 1097 ObjLayer.addPlugin(ExitOnErr(DebugInfoPreservationPlugin::Create())); 1098 ObjLayer.addPlugin(ExitOnErr( 1099 VTuneSupportPlugin::Create(this->ES.getExecutorProcessControl(), 1100 *ProcessSymsJD, /*EmitDebugInfo=*/true, 1101 /*TestMode=*/true))); 1102 } 1103 1104 // Set up the platform. 1105 if (!OrcRuntime.empty()) { 1106 assert(ProcessSymsJD && "ProcessSymsJD should have been set"); 1107 PlatformJD = &ES.createBareJITDylib("Platform"); 1108 PlatformJD->addToLinkOrder(*ProcessSymsJD); 1109 1110 if (TT.isOSBinFormatMachO()) { 1111 if (auto P = 1112 MachOPlatform::Create(ObjLayer, *PlatformJD, OrcRuntime.c_str())) 1113 ES.setPlatform(std::move(*P)); 1114 else { 1115 Err = P.takeError(); 1116 return; 1117 } 1118 } else if (TT.isOSBinFormatELF()) { 1119 if (auto P = 1120 ELFNixPlatform::Create(ObjLayer, *PlatformJD, OrcRuntime.c_str())) 1121 ES.setPlatform(std::move(*P)); 1122 else { 1123 Err = P.takeError(); 1124 return; 1125 } 1126 } else if (TT.isOSBinFormatCOFF()) { 1127 auto LoadDynLibrary = [&, this](JITDylib &JD, 1128 StringRef DLLName) -> Error { 1129 if (!DLLName.ends_with_insensitive(".dll")) 1130 return make_error<StringError>("DLLName not ending with .dll", 1131 inconvertibleErrorCode()); 1132 return loadAndLinkDynamicLibrary(JD, DLLName); 1133 }; 1134 1135 if (auto P = 1136 COFFPlatform::Create(ObjLayer, *PlatformJD, OrcRuntime.c_str(), 1137 std::move(LoadDynLibrary))) 1138 ES.setPlatform(std::move(*P)); 1139 else { 1140 Err = P.takeError(); 1141 return; 1142 } 1143 } else { 1144 Err = make_error<StringError>( 1145 "-" + OrcRuntime.ArgStr + " specified, but format " + 1146 Triple::getObjectFormatTypeName(TT.getObjectFormat()) + 1147 " not supported", 1148 inconvertibleErrorCode()); 1149 return; 1150 } 1151 } else if (TT.isOSBinFormatELF()) { 1152 if (!NoExec) 1153 ObjLayer.addPlugin(std::make_unique<EHFrameRegistrationPlugin>( 1154 ES, ExitOnErr(EPCEHFrameRegistrar::Create(this->ES)))); 1155 if (DebuggerSupport) 1156 ObjLayer.addPlugin(std::make_unique<DebugObjectManagerPlugin>( 1157 ES, ExitOnErr(createJITLoaderGDBRegistrar(this->ES)), true, true)); 1158 } 1159 1160 if (auto MainJDOrErr = ES.createJITDylib("main")) 1161 MainJD = &*MainJDOrErr; 1162 else { 1163 Err = MainJDOrErr.takeError(); 1164 return; 1165 } 1166 1167 if (NoProcessSymbols) { 1168 // This symbol is used in testcases, but we're not reflecting process 1169 // symbols so we'll need to make it available some other way. 1170 auto &TestResultJD = ES.createBareJITDylib("<TestResultJD>"); 1171 ExitOnErr(TestResultJD.define(absoluteSymbols( 1172 {{ES.intern("llvm_jitlink_setTestResultOverride"), 1173 {ExecutorAddr::fromPtr(llvm_jitlink_setTestResultOverride), 1174 JITSymbolFlags::Exported}}}))); 1175 MainJD->addToLinkOrder(TestResultJD); 1176 } 1177 1178 ObjLayer.addPlugin(std::make_unique<JITLinkSessionPlugin>(*this)); 1179 1180 // Process any harness files. 1181 for (auto &HarnessFile : TestHarnesses) { 1182 HarnessFiles.insert(HarnessFile); 1183 1184 auto ObjBuffer = 1185 ExitOnErr(loadLinkableFile(HarnessFile, ES.getTargetTriple(), 1186 LoadArchives::Never)) 1187 .first; 1188 1189 auto ObjInterface = 1190 ExitOnErr(getObjectFileInterface(ES, ObjBuffer->getMemBufferRef())); 1191 1192 for (auto &KV : ObjInterface.SymbolFlags) 1193 HarnessDefinitions.insert(*KV.first); 1194 1195 auto Obj = ExitOnErr( 1196 object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef())); 1197 1198 for (auto &Sym : Obj->symbols()) { 1199 uint32_t SymFlags = ExitOnErr(Sym.getFlags()); 1200 auto Name = ExitOnErr(Sym.getName()); 1201 1202 if (Name.empty()) 1203 continue; 1204 1205 if (SymFlags & object::BasicSymbolRef::SF_Undefined) 1206 HarnessExternals.insert(Name); 1207 } 1208 } 1209 1210 // If a name is defined by some harness file then it's a definition, not an 1211 // external. 1212 for (auto &DefName : HarnessDefinitions) 1213 HarnessExternals.erase(DefName.getKey()); 1214 1215 if (!ShowLinkGraphs.empty()) 1216 ShowGraphsRegex = Regex(ShowLinkGraphs); 1217 } 1218 1219 void Session::dumpSessionInfo(raw_ostream &OS) { 1220 OS << "Registered addresses:\n" << SymbolInfos << FileInfos; 1221 } 1222 1223 void Session::modifyPassConfig(LinkGraph &G, PassConfiguration &PassConfig) { 1224 1225 if (ShowLinkedFiles) 1226 outs() << "Linking " << G.getName() << "\n"; 1227 1228 if (!CheckFiles.empty()) 1229 PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) { 1230 if (ES.getTargetTriple().getObjectFormat() == Triple::ELF) 1231 return registerELFGraphInfo(*this, G); 1232 1233 if (ES.getTargetTriple().getObjectFormat() == Triple::MachO) 1234 return registerMachOGraphInfo(*this, G); 1235 1236 if (ES.getTargetTriple().getObjectFormat() == Triple::COFF) 1237 return registerCOFFGraphInfo(*this, G); 1238 1239 return make_error<StringError>("Unsupported object format for GOT/stub " 1240 "registration", 1241 inconvertibleErrorCode()); 1242 }); 1243 1244 if (ShowGraphsRegex) 1245 PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) -> Error { 1246 // Print graph if ShowLinkGraphs is specified-but-empty, or if 1247 // it contains the given graph. 1248 if (ShowGraphsRegex->match(G.getName())) { 1249 outs() << "Link graph \"" << G.getName() << "\" post-fixup:\n"; 1250 G.dump(outs()); 1251 } 1252 return Error::success(); 1253 }); 1254 1255 PassConfig.PrePrunePasses.push_back( 1256 [this](LinkGraph &G) { return applyHarnessPromotions(*this, G); }); 1257 1258 if (ShowRelocatedSectionContents) 1259 PassConfig.PostFixupPasses.push_back([](LinkGraph &G) -> Error { 1260 outs() << "Relocated section contents for " << G.getName() << ":\n"; 1261 dumpSectionContents(outs(), G); 1262 return Error::success(); 1263 }); 1264 1265 if (AddSelfRelocations) 1266 PassConfig.PostPrunePasses.push_back(addSelfRelocations); 1267 } 1268 1269 Expected<JITDylib *> Session::getOrLoadDynamicLibrary(StringRef LibPath) { 1270 auto It = DynLibJDs.find(LibPath); 1271 if (It != DynLibJDs.end()) { 1272 return It->second; 1273 } 1274 auto G = EPCDynamicLibrarySearchGenerator::Load(ES, LibPath.data()); 1275 if (!G) 1276 return G.takeError(); 1277 auto JD = &ES.createBareJITDylib(LibPath.str()); 1278 1279 JD->addGenerator(std::move(*G)); 1280 DynLibJDs.emplace(LibPath.str(), JD); 1281 LLVM_DEBUG({ 1282 dbgs() << "Loaded dynamic library " << LibPath.data() << " for " << LibPath 1283 << "\n"; 1284 }); 1285 return JD; 1286 } 1287 1288 Error Session::loadAndLinkDynamicLibrary(JITDylib &JD, StringRef LibPath) { 1289 auto DL = getOrLoadDynamicLibrary(LibPath); 1290 if (!DL) 1291 return DL.takeError(); 1292 JD.addToLinkOrder(**DL); 1293 LLVM_DEBUG({ 1294 dbgs() << "Linking dynamic library " << LibPath << " to " << JD.getName() 1295 << "\n"; 1296 }); 1297 return Error::success(); 1298 } 1299 1300 Error Session::FileInfo::registerGOTEntry( 1301 LinkGraph &G, Symbol &Sym, GetSymbolTargetFunction GetSymbolTarget) { 1302 if (Sym.isSymbolZeroFill()) 1303 return make_error<StringError>("Unexpected zero-fill symbol in section " + 1304 Sym.getBlock().getSection().getName(), 1305 inconvertibleErrorCode()); 1306 auto TS = GetSymbolTarget(G, Sym.getBlock()); 1307 if (!TS) 1308 return TS.takeError(); 1309 GOTEntryInfos[*TS->getName()] = {Sym.getSymbolContent(), 1310 Sym.getAddress().getValue(), 1311 Sym.getTargetFlags()}; 1312 return Error::success(); 1313 } 1314 1315 Error Session::FileInfo::registerStubEntry( 1316 LinkGraph &G, Symbol &Sym, GetSymbolTargetFunction GetSymbolTarget) { 1317 if (Sym.isSymbolZeroFill()) 1318 return make_error<StringError>("Unexpected zero-fill symbol in section " + 1319 Sym.getBlock().getSection().getName(), 1320 inconvertibleErrorCode()); 1321 auto TS = GetSymbolTarget(G, Sym.getBlock()); 1322 if (!TS) 1323 return TS.takeError(); 1324 1325 SmallVectorImpl<MemoryRegionInfo> &Entry = StubInfos[*TS->getName()]; 1326 Entry.insert(Entry.begin(), 1327 {Sym.getSymbolContent(), Sym.getAddress().getValue(), 1328 Sym.getTargetFlags()}); 1329 return Error::success(); 1330 } 1331 1332 Error Session::FileInfo::registerMultiStubEntry( 1333 LinkGraph &G, Symbol &Sym, GetSymbolTargetFunction GetSymbolTarget) { 1334 if (Sym.isSymbolZeroFill()) 1335 return make_error<StringError>("Unexpected zero-fill symbol in section " + 1336 Sym.getBlock().getSection().getName(), 1337 inconvertibleErrorCode()); 1338 1339 auto Target = GetSymbolTarget(G, Sym.getBlock()); 1340 if (!Target) 1341 return Target.takeError(); 1342 1343 SmallVectorImpl<MemoryRegionInfo> &Entry = StubInfos[*Target->getName()]; 1344 Entry.emplace_back(Sym.getSymbolContent(), Sym.getAddress().getValue(), 1345 Sym.getTargetFlags()); 1346 1347 // Let's keep stubs ordered by ascending address. 1348 std::sort(Entry.begin(), Entry.end(), 1349 [](const MemoryRegionInfo &L, const MemoryRegionInfo &R) { 1350 return L.getTargetAddress() < R.getTargetAddress(); 1351 }); 1352 1353 return Error::success(); 1354 } 1355 1356 Expected<Session::FileInfo &> Session::findFileInfo(StringRef FileName) { 1357 auto FileInfoItr = FileInfos.find(FileName); 1358 if (FileInfoItr == FileInfos.end()) 1359 return make_error<StringError>("file \"" + FileName + "\" not recognized", 1360 inconvertibleErrorCode()); 1361 return FileInfoItr->second; 1362 } 1363 1364 Expected<Session::MemoryRegionInfo &> 1365 Session::findSectionInfo(StringRef FileName, StringRef SectionName) { 1366 auto FI = findFileInfo(FileName); 1367 if (!FI) 1368 return FI.takeError(); 1369 auto SecInfoItr = FI->SectionInfos.find(SectionName); 1370 if (SecInfoItr == FI->SectionInfos.end()) 1371 return make_error<StringError>("no section \"" + SectionName + 1372 "\" registered for file \"" + FileName + 1373 "\"", 1374 inconvertibleErrorCode()); 1375 return SecInfoItr->second; 1376 } 1377 1378 class MemoryMatcher { 1379 public: 1380 MemoryMatcher(ArrayRef<char> Content) 1381 : Pos(Content.data()), End(Pos + Content.size()) {} 1382 1383 template <typename MaskType> bool matchMask(MaskType Mask) { 1384 if (Mask == (Mask & *reinterpret_cast<const MaskType *>(Pos))) { 1385 Pos += sizeof(MaskType); 1386 return true; 1387 } 1388 return false; 1389 } 1390 1391 template <typename ValueType> bool matchEqual(ValueType Value) { 1392 if (Value == *reinterpret_cast<const ValueType *>(Pos)) { 1393 Pos += sizeof(ValueType); 1394 return true; 1395 } 1396 return false; 1397 } 1398 1399 bool done() const { return Pos == End; } 1400 1401 private: 1402 const char *Pos; 1403 const char *End; 1404 }; 1405 1406 static StringRef detectStubKind(const Session::MemoryRegionInfo &Stub) { 1407 using namespace support::endian; 1408 auto Armv7MovWTle = byte_swap<uint32_t, endianness::little>(0xe300c000); 1409 auto Armv7BxR12le = byte_swap<uint32_t, endianness::little>(0xe12fff1c); 1410 auto Thumbv7MovWTle = byte_swap<uint32_t, endianness::little>(0x0c00f240); 1411 auto Thumbv7BxR12le = byte_swap<uint16_t, endianness::little>(0x4760); 1412 1413 MemoryMatcher M(Stub.getContent()); 1414 if (M.matchMask(Thumbv7MovWTle)) { 1415 if (M.matchMask(Thumbv7MovWTle)) 1416 if (M.matchEqual(Thumbv7BxR12le)) 1417 if (M.done()) 1418 return "thumbv7_abs_le"; 1419 } else if (M.matchMask(Armv7MovWTle)) { 1420 if (M.matchMask(Armv7MovWTle)) 1421 if (M.matchEqual(Armv7BxR12le)) 1422 if (M.done()) 1423 return "armv7_abs_le"; 1424 } 1425 return ""; 1426 } 1427 1428 Expected<Session::MemoryRegionInfo &> 1429 Session::findStubInfo(StringRef FileName, StringRef TargetName, 1430 StringRef KindNameFilter) { 1431 auto FI = findFileInfo(FileName); 1432 if (!FI) 1433 return FI.takeError(); 1434 auto StubInfoItr = FI->StubInfos.find(TargetName); 1435 if (StubInfoItr == FI->StubInfos.end()) 1436 return make_error<StringError>("no stub for \"" + TargetName + 1437 "\" registered for file \"" + FileName + 1438 "\"", 1439 inconvertibleErrorCode()); 1440 auto &StubsForTarget = StubInfoItr->second; 1441 assert(!StubsForTarget.empty() && "At least 1 stub in each entry"); 1442 if (KindNameFilter.empty() && StubsForTarget.size() == 1) 1443 return StubsForTarget[0]; // Regular single-stub match 1444 1445 std::string KindsStr; 1446 SmallVector<MemoryRegionInfo *, 1> Matches; 1447 Regex KindNameMatcher(KindNameFilter.empty() ? ".*" : KindNameFilter); 1448 for (MemoryRegionInfo &Stub : StubsForTarget) { 1449 StringRef Kind = detectStubKind(Stub); 1450 if (KindNameMatcher.match(Kind)) 1451 Matches.push_back(&Stub); 1452 KindsStr += "\"" + (Kind.empty() ? "<unknown>" : Kind.str()) + "\", "; 1453 } 1454 if (Matches.empty()) 1455 return make_error<StringError>( 1456 "\"" + TargetName + "\" has " + Twine(StubsForTarget.size()) + 1457 " stubs in file \"" + FileName + 1458 "\", but none of them matches the stub-kind filter \"" + 1459 KindNameFilter + "\" (all encountered kinds are " + 1460 StringRef(KindsStr.data(), KindsStr.size() - 2) + ").", 1461 inconvertibleErrorCode()); 1462 if (Matches.size() > 1) 1463 return make_error<StringError>( 1464 "\"" + TargetName + "\" has " + Twine(Matches.size()) + 1465 " candidate stubs in file \"" + FileName + 1466 "\". Please refine stub-kind filter \"" + KindNameFilter + 1467 "\" for disambiguation (encountered kinds are " + 1468 StringRef(KindsStr.data(), KindsStr.size() - 2) + ").", 1469 inconvertibleErrorCode()); 1470 1471 return *Matches[0]; 1472 } 1473 1474 Expected<Session::MemoryRegionInfo &> 1475 Session::findGOTEntryInfo(StringRef FileName, StringRef TargetName) { 1476 auto FI = findFileInfo(FileName); 1477 if (!FI) 1478 return FI.takeError(); 1479 auto GOTInfoItr = FI->GOTEntryInfos.find(TargetName); 1480 if (GOTInfoItr == FI->GOTEntryInfos.end()) 1481 return make_error<StringError>("no GOT entry for \"" + TargetName + 1482 "\" registered for file \"" + FileName + 1483 "\"", 1484 inconvertibleErrorCode()); 1485 return GOTInfoItr->second; 1486 } 1487 1488 bool Session::isSymbolRegistered(const orc::SymbolStringPtr &SymbolName) { 1489 return SymbolInfos.count(SymbolName); 1490 } 1491 1492 Expected<Session::MemoryRegionInfo &> 1493 Session::findSymbolInfo(const orc::SymbolStringPtr &SymbolName, 1494 Twine ErrorMsgStem) { 1495 auto SymInfoItr = SymbolInfos.find(SymbolName); 1496 if (SymInfoItr == SymbolInfos.end()) 1497 return make_error<StringError>(ErrorMsgStem + ": symbol " + *SymbolName + 1498 " not found", 1499 inconvertibleErrorCode()); 1500 return SymInfoItr->second; 1501 } 1502 1503 } // end namespace llvm 1504 1505 static std::pair<Triple, SubtargetFeatures> getFirstFileTripleAndFeatures() { 1506 static std::pair<Triple, SubtargetFeatures> FirstTTAndFeatures = []() { 1507 assert(!InputFiles.empty() && "InputFiles can not be empty"); 1508 1509 if (!OverrideTriple.empty()) { 1510 LLVM_DEBUG({ 1511 dbgs() << "Triple from -triple override: " << OverrideTriple << "\n"; 1512 }); 1513 return std::make_pair(Triple(OverrideTriple), SubtargetFeatures()); 1514 } 1515 1516 for (auto InputFile : InputFiles) { 1517 auto ObjBuffer = ExitOnErr(getFile(InputFile)); 1518 file_magic Magic = identify_magic(ObjBuffer->getBuffer()); 1519 switch (Magic) { 1520 case file_magic::coff_object: 1521 case file_magic::elf_relocatable: 1522 case file_magic::macho_object: { 1523 auto Obj = ExitOnErr( 1524 object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef())); 1525 Triple TT = Obj->makeTriple(); 1526 if (Magic == file_magic::coff_object) { 1527 // TODO: Move this to makeTriple() if possible. 1528 TT.setObjectFormat(Triple::COFF); 1529 TT.setOS(Triple::OSType::Win32); 1530 } 1531 SubtargetFeatures Features; 1532 if (auto ObjFeatures = Obj->getFeatures()) 1533 Features = std::move(*ObjFeatures); 1534 1535 LLVM_DEBUG({ 1536 dbgs() << "Triple from " << InputFile << ": " << TT.str() << "\n"; 1537 }); 1538 return std::make_pair(TT, Features); 1539 } 1540 default: 1541 break; 1542 } 1543 } 1544 1545 // If no plain object file inputs exist to pin down the triple then detect 1546 // the host triple and default to that. 1547 auto JTMB = ExitOnErr(JITTargetMachineBuilder::detectHost()); 1548 LLVM_DEBUG({ 1549 dbgs() << "Triple from host-detection: " << JTMB.getTargetTriple().str() 1550 << "\n"; 1551 }); 1552 return std::make_pair(JTMB.getTargetTriple(), JTMB.getFeatures()); 1553 }(); 1554 1555 return FirstTTAndFeatures; 1556 } 1557 1558 static Error sanitizeArguments(const Triple &TT, const char *ArgV0) { 1559 1560 // -noexec and --args should not be used together. 1561 if (NoExec && !InputArgv.empty()) 1562 errs() << "Warning: --args passed to -noexec run will be ignored.\n"; 1563 1564 // Set the entry point name if not specified. 1565 if (EntryPointName.empty()) 1566 EntryPointName = TT.getObjectFormat() == Triple::MachO ? "_main" : "main"; 1567 1568 // Disable debugger support by default in noexec tests. 1569 if (DebuggerSupport.getNumOccurrences() == 0 && NoExec) 1570 DebuggerSupport = false; 1571 1572 if (!OrcRuntime.empty() && NoProcessSymbols) 1573 return make_error<StringError>("-orc-runtime requires process symbols", 1574 inconvertibleErrorCode()); 1575 1576 // If -slab-allocate is passed, check that we're not trying to use it in 1577 // -oop-executor or -oop-executor-connect mode. 1578 // 1579 // FIXME: Remove once we enable remote slab allocation. 1580 if (SlabAllocateSizeString != "") { 1581 if (OutOfProcessExecutor.getNumOccurrences() || 1582 OutOfProcessExecutorConnect.getNumOccurrences()) 1583 return make_error<StringError>( 1584 "-slab-allocate cannot be used with -oop-executor or " 1585 "-oop-executor-connect", 1586 inconvertibleErrorCode()); 1587 } 1588 1589 // If -slab-address is passed, require -slab-allocate and -noexec 1590 if (SlabAddress != ~0ULL) { 1591 if (SlabAllocateSizeString == "" || !NoExec) 1592 return make_error<StringError>( 1593 "-slab-address requires -slab-allocate and -noexec", 1594 inconvertibleErrorCode()); 1595 1596 if (SlabPageSize == 0) 1597 errs() << "Warning: -slab-address used without -slab-page-size.\n"; 1598 } 1599 1600 if (SlabPageSize != 0) { 1601 // -slab-page-size requires slab alloc. 1602 if (SlabAllocateSizeString == "") 1603 return make_error<StringError>("-slab-page-size requires -slab-allocate", 1604 inconvertibleErrorCode()); 1605 1606 // Check -slab-page-size / -noexec interactions. 1607 if (!NoExec) { 1608 if (auto RealPageSize = sys::Process::getPageSize()) { 1609 if (SlabPageSize % *RealPageSize) 1610 return make_error<StringError>( 1611 "-slab-page-size must be a multiple of real page size for exec " 1612 "tests (did you mean to use -noexec ?)\n", 1613 inconvertibleErrorCode()); 1614 } else { 1615 errs() << "Could not retrieve process page size:\n"; 1616 logAllUnhandledErrors(RealPageSize.takeError(), errs(), ""); 1617 errs() << "Executing with slab page size = " 1618 << formatv("{0:x}", SlabPageSize) << ".\n" 1619 << "Tool may crash if " << formatv("{0:x}", SlabPageSize) 1620 << " is not a multiple of the real process page size.\n" 1621 << "(did you mean to use -noexec ?)"; 1622 } 1623 } 1624 } 1625 1626 // Only one of -oop-executor and -oop-executor-connect can be used. 1627 if (!!OutOfProcessExecutor.getNumOccurrences() && 1628 !!OutOfProcessExecutorConnect.getNumOccurrences()) 1629 return make_error<StringError>( 1630 "Only one of -" + OutOfProcessExecutor.ArgStr + " and -" + 1631 OutOfProcessExecutorConnect.ArgStr + " can be specified", 1632 inconvertibleErrorCode()); 1633 1634 // If -oop-executor was used but no value was specified then use a sensible 1635 // default. 1636 if (!!OutOfProcessExecutor.getNumOccurrences() && 1637 OutOfProcessExecutor.empty()) { 1638 SmallString<256> OOPExecutorPath(sys::fs::getMainExecutable( 1639 ArgV0, reinterpret_cast<void *>(&sanitizeArguments))); 1640 sys::path::remove_filename(OOPExecutorPath); 1641 sys::path::append(OOPExecutorPath, "llvm-jitlink-executor"); 1642 OutOfProcessExecutor = OOPExecutorPath.str().str(); 1643 } 1644 1645 if (lazyLinkingRequested() && !TestHarnesses.empty()) 1646 return make_error<StringError>( 1647 "Lazy linking cannot be used with -harness mode", 1648 inconvertibleErrorCode()); 1649 1650 return Error::success(); 1651 } 1652 1653 static void addPhonyExternalsGenerator(Session &S) { 1654 S.MainJD->addGenerator(std::make_unique<PhonyExternalsGenerator>()); 1655 } 1656 1657 static Error createJITDylibs(Session &S, 1658 std::map<unsigned, JITDylib *> &IdxToJD) { 1659 // First, set up JITDylibs. 1660 LLVM_DEBUG(dbgs() << "Creating JITDylibs...\n"); 1661 { 1662 // Create a "main" JITLinkDylib. 1663 IdxToJD[0] = S.MainJD; 1664 S.JDSearchOrder.push_back({S.MainJD, JITDylibLookupFlags::MatchAllSymbols}); 1665 LLVM_DEBUG(dbgs() << " 0: " << S.MainJD->getName() << "\n"); 1666 1667 // Add any extra JITDylibs from the command line. 1668 for (auto JDItr = JITDylibs.begin(), JDEnd = JITDylibs.end(); 1669 JDItr != JDEnd; ++JDItr) { 1670 auto JD = S.ES.createJITDylib(*JDItr); 1671 if (!JD) 1672 return JD.takeError(); 1673 unsigned JDIdx = JITDylibs.getPosition(JDItr - JITDylibs.begin()); 1674 IdxToJD[JDIdx] = &*JD; 1675 S.JDSearchOrder.push_back({&*JD, JITDylibLookupFlags::MatchAllSymbols}); 1676 LLVM_DEBUG(dbgs() << " " << JDIdx << ": " << JD->getName() << "\n"); 1677 } 1678 } 1679 1680 if (S.PlatformJD) 1681 S.JDSearchOrder.push_back( 1682 {S.PlatformJD, JITDylibLookupFlags::MatchExportedSymbolsOnly}); 1683 if (S.ProcessSymsJD) 1684 S.JDSearchOrder.push_back( 1685 {S.ProcessSymsJD, JITDylibLookupFlags::MatchExportedSymbolsOnly}); 1686 1687 LLVM_DEBUG({ 1688 dbgs() << "Dylib search order is [ "; 1689 for (auto &KV : S.JDSearchOrder) 1690 dbgs() << KV.first->getName() << " "; 1691 dbgs() << "]\n"; 1692 }); 1693 1694 return Error::success(); 1695 } 1696 1697 static Error addAbsoluteSymbols(Session &S, 1698 const std::map<unsigned, JITDylib *> &IdxToJD) { 1699 // Define absolute symbols. 1700 LLVM_DEBUG(dbgs() << "Defining absolute symbols...\n"); 1701 for (auto AbsDefItr = AbsoluteDefs.begin(), AbsDefEnd = AbsoluteDefs.end(); 1702 AbsDefItr != AbsDefEnd; ++AbsDefItr) { 1703 unsigned AbsDefArgIdx = 1704 AbsoluteDefs.getPosition(AbsDefItr - AbsoluteDefs.begin()); 1705 auto &JD = *std::prev(IdxToJD.lower_bound(AbsDefArgIdx))->second; 1706 1707 StringRef AbsDefStmt = *AbsDefItr; 1708 size_t EqIdx = AbsDefStmt.find_first_of('='); 1709 if (EqIdx == StringRef::npos) 1710 return make_error<StringError>("Invalid absolute define \"" + AbsDefStmt + 1711 "\". Syntax: <name>=<addr>", 1712 inconvertibleErrorCode()); 1713 StringRef Name = AbsDefStmt.substr(0, EqIdx).trim(); 1714 StringRef AddrStr = AbsDefStmt.substr(EqIdx + 1).trim(); 1715 1716 uint64_t Addr; 1717 if (AddrStr.getAsInteger(0, Addr)) 1718 return make_error<StringError>("Invalid address expression \"" + AddrStr + 1719 "\" in absolute symbol definition \"" + 1720 AbsDefStmt + "\"", 1721 inconvertibleErrorCode()); 1722 ExecutorSymbolDef AbsDef(ExecutorAddr(Addr), JITSymbolFlags::Exported); 1723 auto InternedName = S.ES.intern(Name); 1724 if (auto Err = JD.define(absoluteSymbols({{InternedName, AbsDef}}))) 1725 return Err; 1726 1727 // Register the absolute symbol with the session symbol infos. 1728 S.SymbolInfos[InternedName] = {ArrayRef<char>(), Addr, 1729 AbsDef.getFlags().getTargetFlags()}; 1730 } 1731 1732 return Error::success(); 1733 } 1734 1735 static Error addAliases(Session &S, 1736 const std::map<unsigned, JITDylib *> &IdxToJD) { 1737 // Define absolute symbols. 1738 LLVM_DEBUG(dbgs() << "Defining aliases...\n"); 1739 1740 DenseMap<std::pair<JITDylib *, JITDylib *>, SymbolAliasMap> Reexports; 1741 for (auto AliasItr = Aliases.begin(), AliasEnd = Aliases.end(); 1742 AliasItr != AliasEnd; ++AliasItr) { 1743 1744 auto BadExpr = [&]() { 1745 return make_error<StringError>( 1746 "Invalid alias definition \"" + *AliasItr + 1747 "\". Syntax: [<dst-jd>:]<alias>=[<src-jd>:]<aliasee>", 1748 inconvertibleErrorCode()); 1749 }; 1750 1751 auto GetJD = [&](StringRef JDName) -> Expected<JITDylib *> { 1752 if (JDName.empty()) { 1753 unsigned AliasArgIdx = Aliases.getPosition(AliasItr - Aliases.begin()); 1754 return std::prev(IdxToJD.lower_bound(AliasArgIdx))->second; 1755 } 1756 1757 auto *JD = S.ES.getJITDylibByName(JDName); 1758 if (!JD) 1759 return make_error<StringError>(StringRef("In alias definition \"") + 1760 *AliasItr + "\" no dylib named " + 1761 JDName, 1762 inconvertibleErrorCode()); 1763 1764 return JD; 1765 }; 1766 1767 { 1768 // First split on '=' to get alias and aliasee. 1769 StringRef AliasStmt = *AliasItr; 1770 auto [AliasExpr, AliaseeExpr] = AliasStmt.split('='); 1771 if (AliaseeExpr.empty()) 1772 return BadExpr(); 1773 1774 auto [AliasJDName, Alias] = AliasExpr.split(':'); 1775 if (Alias.empty()) 1776 std::swap(AliasJDName, Alias); 1777 1778 auto AliasJD = GetJD(AliasJDName); 1779 if (!AliasJD) 1780 return AliasJD.takeError(); 1781 1782 auto [AliaseeJDName, Aliasee] = AliaseeExpr.split(':'); 1783 if (Aliasee.empty()) 1784 std::swap(AliaseeJDName, Aliasee); 1785 1786 if (AliaseeJDName.empty() && !AliasJDName.empty()) 1787 AliaseeJDName = AliasJDName; 1788 auto AliaseeJD = GetJD(AliaseeJDName); 1789 if (!AliaseeJD) 1790 return AliaseeJD.takeError(); 1791 1792 Reexports[{*AliasJD, *AliaseeJD}][S.ES.intern(Alias)] = { 1793 S.ES.intern(Aliasee), JITSymbolFlags::Exported}; 1794 } 1795 } 1796 1797 for (auto &[JDs, AliasMap] : Reexports) { 1798 auto [DstJD, SrcJD] = JDs; 1799 if (auto Err = DstJD->define(reexports(*SrcJD, std::move(AliasMap)))) 1800 return Err; 1801 } 1802 1803 return Error::success(); 1804 } 1805 1806 static Error addSectCreates(Session &S, 1807 const std::map<unsigned, JITDylib *> &IdxToJD) { 1808 for (auto SCItr = SectCreate.begin(), SCEnd = SectCreate.end(); 1809 SCItr != SCEnd; ++SCItr) { 1810 1811 unsigned SCArgIdx = SectCreate.getPosition(SCItr - SectCreate.begin()); 1812 auto &JD = *std::prev(IdxToJD.lower_bound(SCArgIdx))->second; 1813 1814 StringRef SCArg(*SCItr); 1815 1816 auto [SectAndFileName, ExtraSymbolsString] = SCArg.rsplit('@'); 1817 auto [SectName, FileName] = SectAndFileName.rsplit(','); 1818 if (SectName.empty()) 1819 return make_error<StringError>("In -sectcreate=" + SCArg + 1820 ", filename component cannot be empty", 1821 inconvertibleErrorCode()); 1822 if (FileName.empty()) 1823 return make_error<StringError>("In -sectcreate=" + SCArg + 1824 ", filename component cannot be empty", 1825 inconvertibleErrorCode()); 1826 1827 auto Content = getFile(FileName); 1828 if (!Content) 1829 return Content.takeError(); 1830 1831 SectCreateMaterializationUnit::ExtraSymbolsMap ExtraSymbols; 1832 while (!ExtraSymbolsString.empty()) { 1833 StringRef NextSymPair; 1834 std::tie(NextSymPair, ExtraSymbolsString) = ExtraSymbolsString.split(','); 1835 1836 auto [Sym, OffsetString] = NextSymPair.split('='); 1837 size_t Offset; 1838 1839 if (OffsetString.getAsInteger(0, Offset)) 1840 return make_error<StringError>("In -sectcreate=" + SCArg + ", " + 1841 OffsetString + 1842 " is not a valid integer", 1843 inconvertibleErrorCode()); 1844 1845 ExtraSymbols[S.ES.intern(Sym)] = {JITSymbolFlags::Exported, Offset}; 1846 } 1847 1848 if (auto Err = JD.define(std::make_unique<SectCreateMaterializationUnit>( 1849 S.ObjLayer, SectName.str(), MemProt::Read, 16, std::move(*Content), 1850 std::move(ExtraSymbols)))) 1851 return Err; 1852 } 1853 1854 return Error::success(); 1855 } 1856 1857 static Error addTestHarnesses(Session &S) { 1858 LLVM_DEBUG(dbgs() << "Adding test harness objects...\n"); 1859 for (auto HarnessFile : TestHarnesses) { 1860 LLVM_DEBUG(dbgs() << " " << HarnessFile << "\n"); 1861 auto Linkable = loadLinkableFile(HarnessFile, S.ES.getTargetTriple(), 1862 LoadArchives::Never); 1863 if (!Linkable) 1864 return Linkable.takeError(); 1865 if (auto Err = S.ObjLayer.add(*S.MainJD, std::move(Linkable->first))) 1866 return Err; 1867 } 1868 return Error::success(); 1869 } 1870 1871 static Error addObjects(Session &S, 1872 const std::map<unsigned, JITDylib *> &IdxToJD, 1873 const DenseSet<unsigned> &LazyLinkIdxs) { 1874 1875 // Load each object into the corresponding JITDylib.. 1876 LLVM_DEBUG(dbgs() << "Adding objects...\n"); 1877 for (auto InputFileItr = InputFiles.begin(), InputFileEnd = InputFiles.end(); 1878 InputFileItr != InputFileEnd; ++InputFileItr) { 1879 unsigned InputFileArgIdx = 1880 InputFiles.getPosition(InputFileItr - InputFiles.begin()); 1881 const std::string &InputFile = *InputFileItr; 1882 if (StringRef(InputFile).ends_with(".a") || 1883 StringRef(InputFile).ends_with(".lib")) 1884 continue; 1885 auto &JD = *std::prev(IdxToJD.lower_bound(InputFileArgIdx))->second; 1886 bool AddLazy = LazyLinkIdxs.count(InputFileArgIdx); 1887 LLVM_DEBUG(dbgs() << " " << InputFileArgIdx << ": \"" << InputFile << "\" " 1888 << (AddLazy ? " (lazy-linked)" : "") << " to " 1889 << JD.getName() << "\n";); 1890 auto ObjBuffer = loadLinkableFile(InputFile, S.ES.getTargetTriple(), 1891 LoadArchives::Never); 1892 if (!ObjBuffer) 1893 return ObjBuffer.takeError(); 1894 1895 if (S.HarnessFiles.empty()) { 1896 if (auto Err = 1897 S.getLinkLayer(AddLazy).add(JD, std::move(ObjBuffer->first))) 1898 return Err; 1899 } else { 1900 // We're in -harness mode. Use a custom interface for this 1901 // test object. 1902 auto ObjInterface = 1903 getTestObjectFileInterface(S, ObjBuffer->first->getMemBufferRef()); 1904 if (!ObjInterface) 1905 return ObjInterface.takeError(); 1906 1907 if (auto Err = S.ObjLayer.add(JD, std::move(ObjBuffer->first), 1908 std::move(*ObjInterface))) 1909 return Err; 1910 } 1911 } 1912 1913 return Error::success(); 1914 } 1915 1916 static Expected<MaterializationUnit::Interface> 1917 getObjectFileInterfaceHidden(ExecutionSession &ES, MemoryBufferRef ObjBuffer) { 1918 auto I = getObjectFileInterface(ES, ObjBuffer); 1919 if (I) { 1920 for (auto &KV : I->SymbolFlags) 1921 KV.second &= ~JITSymbolFlags::Exported; 1922 } 1923 return I; 1924 } 1925 1926 static SmallVector<StringRef, 5> getSearchPathsFromEnvVar(Session &S) { 1927 // FIXME: Handle EPC environment. 1928 SmallVector<StringRef, 5> PathVec; 1929 auto TT = S.ES.getTargetTriple(); 1930 if (TT.isOSBinFormatCOFF()) 1931 StringRef(getenv("PATH")).split(PathVec, ";"); 1932 else if (TT.isOSBinFormatELF()) 1933 StringRef(getenv("LD_LIBRARY_PATH")).split(PathVec, ":"); 1934 1935 return PathVec; 1936 } 1937 1938 static Error addLibraries(Session &S, 1939 const std::map<unsigned, JITDylib *> &IdxToJD, 1940 const DenseSet<unsigned> &LazyLinkIdxs) { 1941 1942 // 1. Collect search paths for each JITDylib. 1943 DenseMap<const JITDylib *, SmallVector<StringRef, 2>> JDSearchPaths; 1944 1945 for (auto LSPItr = LibrarySearchPaths.begin(), 1946 LSPEnd = LibrarySearchPaths.end(); 1947 LSPItr != LSPEnd; ++LSPItr) { 1948 unsigned LibrarySearchPathIdx = 1949 LibrarySearchPaths.getPosition(LSPItr - LibrarySearchPaths.begin()); 1950 auto &JD = *std::prev(IdxToJD.lower_bound(LibrarySearchPathIdx))->second; 1951 1952 StringRef LibrarySearchPath = *LSPItr; 1953 if (sys::fs::get_file_type(LibrarySearchPath) != 1954 sys::fs::file_type::directory_file) 1955 return make_error<StringError>("While linking " + JD.getName() + ", -L" + 1956 LibrarySearchPath + 1957 " does not point to a directory", 1958 inconvertibleErrorCode()); 1959 1960 JDSearchPaths[&JD].push_back(*LSPItr); 1961 } 1962 1963 LLVM_DEBUG({ 1964 if (!JDSearchPaths.empty()) 1965 dbgs() << "Search paths:\n"; 1966 for (auto &KV : JDSearchPaths) { 1967 dbgs() << " " << KV.first->getName() << ": ["; 1968 for (auto &LibSearchPath : KV.second) 1969 dbgs() << " \"" << LibSearchPath << "\""; 1970 dbgs() << " ]\n"; 1971 } 1972 }); 1973 1974 // 2. Collect library loads 1975 struct LibraryLoad { 1976 std::string LibName; 1977 bool IsPath = false; 1978 unsigned Position; 1979 StringRef *CandidateExtensions; 1980 enum { Standard, Hidden } Modifier; 1981 }; 1982 1983 // Queue to load library as in the order as it appears in the argument list. 1984 std::deque<LibraryLoad> LibraryLoadQueue; 1985 // Add archive files from the inputs to LibraryLoads. 1986 for (auto InputFileItr = InputFiles.begin(), InputFileEnd = InputFiles.end(); 1987 InputFileItr != InputFileEnd; ++InputFileItr) { 1988 StringRef InputFile = *InputFileItr; 1989 if (!InputFile.ends_with(".a") && !InputFile.ends_with(".lib")) 1990 continue; 1991 LibraryLoad LL; 1992 LL.LibName = InputFile.str(); 1993 LL.IsPath = true; 1994 LL.Position = InputFiles.getPosition(InputFileItr - InputFiles.begin()); 1995 LL.CandidateExtensions = nullptr; 1996 LL.Modifier = LibraryLoad::Standard; 1997 LibraryLoadQueue.push_back(std::move(LL)); 1998 } 1999 2000 // Add -load_hidden arguments to LibraryLoads. 2001 for (auto LibItr = LoadHidden.begin(), LibEnd = LoadHidden.end(); 2002 LibItr != LibEnd; ++LibItr) { 2003 LibraryLoad LL; 2004 LL.LibName = *LibItr; 2005 LL.IsPath = true; 2006 LL.Position = LoadHidden.getPosition(LibItr - LoadHidden.begin()); 2007 LL.CandidateExtensions = nullptr; 2008 LL.Modifier = LibraryLoad::Hidden; 2009 LibraryLoadQueue.push_back(std::move(LL)); 2010 } 2011 StringRef StandardExtensions[] = {".so", ".dylib", ".dll", ".a", ".lib"}; 2012 StringRef DynLibExtensionsOnly[] = {".so", ".dylib", ".dll"}; 2013 StringRef ArchiveExtensionsOnly[] = {".a", ".lib"}; 2014 2015 // Add -lx arguments to LibraryLoads. 2016 for (auto LibItr = Libraries.begin(), LibEnd = Libraries.end(); 2017 LibItr != LibEnd; ++LibItr) { 2018 LibraryLoad LL; 2019 LL.LibName = *LibItr; 2020 LL.Position = Libraries.getPosition(LibItr - Libraries.begin()); 2021 LL.CandidateExtensions = StandardExtensions; 2022 LL.Modifier = LibraryLoad::Standard; 2023 LibraryLoadQueue.push_back(std::move(LL)); 2024 } 2025 2026 // Add -hidden-lx arguments to LibraryLoads. 2027 for (auto LibHiddenItr = LibrariesHidden.begin(), 2028 LibHiddenEnd = LibrariesHidden.end(); 2029 LibHiddenItr != LibHiddenEnd; ++LibHiddenItr) { 2030 LibraryLoad LL; 2031 LL.LibName = *LibHiddenItr; 2032 LL.Position = 2033 LibrariesHidden.getPosition(LibHiddenItr - LibrariesHidden.begin()); 2034 LL.CandidateExtensions = ArchiveExtensionsOnly; 2035 LL.Modifier = LibraryLoad::Hidden; 2036 LibraryLoadQueue.push_back(std::move(LL)); 2037 } 2038 2039 // If there are any load-<modified> options then turn on flag overrides 2040 // to avoid flag mismatch errors. 2041 if (!LibrariesHidden.empty() || !LoadHidden.empty()) 2042 S.ObjLayer.setOverrideObjectFlagsWithResponsibilityFlags(true); 2043 2044 // Sort library loads by position in the argument list. 2045 llvm::sort(LibraryLoadQueue, 2046 [](const LibraryLoad &LHS, const LibraryLoad &RHS) { 2047 return LHS.Position < RHS.Position; 2048 }); 2049 2050 // 3. Process library loads. 2051 auto AddArchive = [&](JITDylib &JD, const char *Path, const LibraryLoad &LL) 2052 -> Expected<std::unique_ptr<StaticLibraryDefinitionGenerator>> { 2053 StaticLibraryDefinitionGenerator::GetObjectFileInterface 2054 GetObjFileInterface; 2055 switch (LL.Modifier) { 2056 case LibraryLoad::Standard: 2057 GetObjFileInterface = getObjectFileInterface; 2058 break; 2059 case LibraryLoad::Hidden: 2060 GetObjFileInterface = getObjectFileInterfaceHidden; 2061 break; 2062 } 2063 2064 auto &LinkLayer = S.getLinkLayer(LazyLinkIdxs.count(LL.Position)); 2065 2066 StaticLibraryDefinitionGenerator::VisitMembersFunction VisitMembers; 2067 if (AllLoad) 2068 VisitMembers = StaticLibraryDefinitionGenerator::loadAllObjectFileMembers( 2069 LinkLayer, JD); 2070 else if (S.ES.getTargetTriple().isOSBinFormatMachO() && ForceLoadObjC) 2071 VisitMembers = ForceLoadMachOArchiveMembers(LinkLayer, JD, true); 2072 2073 auto G = StaticLibraryDefinitionGenerator::Load( 2074 LinkLayer, Path, std::move(VisitMembers), 2075 std::move(GetObjFileInterface)); 2076 if (!G) 2077 return G.takeError(); 2078 2079 // Push additional dynamic libraries to search. 2080 // Note that this mechanism only happens in COFF. 2081 for (auto FileName : (*G)->getImportedDynamicLibraries()) { 2082 LibraryLoad NewLL; 2083 auto FileNameRef = StringRef(FileName); 2084 if (!FileNameRef.ends_with_insensitive(".dll")) 2085 return make_error<StringError>( 2086 "COFF Imported library not ending with dll extension?", 2087 inconvertibleErrorCode()); 2088 NewLL.LibName = FileNameRef.drop_back(strlen(".dll")).str(); 2089 NewLL.Position = LL.Position; 2090 NewLL.CandidateExtensions = DynLibExtensionsOnly; 2091 NewLL.Modifier = LibraryLoad::Standard; 2092 LibraryLoadQueue.push_front(std::move(NewLL)); 2093 } 2094 return G; 2095 }; 2096 2097 SmallVector<StringRef, 5> SystemSearchPaths; 2098 if (SearchSystemLibrary.getValue()) 2099 SystemSearchPaths = getSearchPathsFromEnvVar(S); 2100 while (!LibraryLoadQueue.empty()) { 2101 bool LibFound = false; 2102 auto LL = LibraryLoadQueue.front(); 2103 LibraryLoadQueue.pop_front(); 2104 auto &JD = *std::prev(IdxToJD.lower_bound(LL.Position))->second; 2105 2106 // If this is the name of a JITDylib then link against that. 2107 if (auto *LJD = S.ES.getJITDylibByName(LL.LibName)) { 2108 JD.addToLinkOrder(*LJD); 2109 continue; 2110 } 2111 2112 if (LL.IsPath) { 2113 auto G = AddArchive(JD, LL.LibName.c_str(), LL); 2114 if (!G) 2115 return createFileError(LL.LibName, G.takeError()); 2116 JD.addGenerator(std::move(*G)); 2117 LLVM_DEBUG({ 2118 dbgs() << "Adding generator for static library " << LL.LibName << " to " 2119 << JD.getName() << "\n"; 2120 }); 2121 continue; 2122 } 2123 2124 // Otherwise look through the search paths. 2125 auto CurJDSearchPaths = JDSearchPaths[&JD]; 2126 for (StringRef SearchPath : 2127 concat<StringRef>(CurJDSearchPaths, SystemSearchPaths)) { 2128 for (const char *LibExt : {".dylib", ".so", ".dll", ".a", ".lib"}) { 2129 SmallVector<char, 256> LibPath; 2130 LibPath.reserve(SearchPath.size() + strlen("lib") + LL.LibName.size() + 2131 strlen(LibExt) + 2); // +2 for pathsep, null term. 2132 llvm::copy(SearchPath, std::back_inserter(LibPath)); 2133 if (StringRef(LibExt) != ".lib" && StringRef(LibExt) != ".dll") 2134 sys::path::append(LibPath, "lib" + LL.LibName + LibExt); 2135 else 2136 sys::path::append(LibPath, LL.LibName + LibExt); 2137 LibPath.push_back('\0'); 2138 2139 // Skip missing or non-regular paths. 2140 if (sys::fs::get_file_type(LibPath.data()) != 2141 sys::fs::file_type::regular_file) { 2142 continue; 2143 } 2144 2145 file_magic Magic; 2146 if (auto EC = identify_magic(LibPath, Magic)) { 2147 // If there was an error loading the file then skip it. 2148 LLVM_DEBUG({ 2149 dbgs() << "Library search found \"" << LibPath 2150 << "\", but could not identify file type (" << EC.message() 2151 << "). Skipping.\n"; 2152 }); 2153 continue; 2154 } 2155 2156 // We identified the magic. Assume that we can load it -- we'll reset 2157 // in the default case. 2158 LibFound = true; 2159 switch (Magic) { 2160 case file_magic::pecoff_executable: 2161 case file_magic::elf_shared_object: 2162 case file_magic::macho_dynamically_linked_shared_lib: { 2163 if (auto Err = S.loadAndLinkDynamicLibrary(JD, LibPath.data())) 2164 return Err; 2165 break; 2166 } 2167 case file_magic::archive: 2168 case file_magic::macho_universal_binary: { 2169 auto G = AddArchive(JD, LibPath.data(), LL); 2170 if (!G) 2171 return G.takeError(); 2172 JD.addGenerator(std::move(*G)); 2173 LLVM_DEBUG({ 2174 dbgs() << "Adding generator for static library " << LibPath.data() 2175 << " to " << JD.getName() << "\n"; 2176 }); 2177 break; 2178 } 2179 default: 2180 // This file isn't a recognized library kind. 2181 LLVM_DEBUG({ 2182 dbgs() << "Library search found \"" << LibPath 2183 << "\", but file type is not supported. Skipping.\n"; 2184 }); 2185 LibFound = false; 2186 break; 2187 } 2188 if (LibFound) 2189 break; 2190 } 2191 if (LibFound) 2192 break; 2193 } 2194 2195 if (!LibFound) 2196 return make_error<StringError>("While linking " + JD.getName() + 2197 ", could not find library for -l" + 2198 LL.LibName, 2199 inconvertibleErrorCode()); 2200 } 2201 2202 // Add platform and process symbols if available. 2203 for (auto &[Idx, JD] : IdxToJD) { 2204 if (S.PlatformJD) 2205 JD->addToLinkOrder(*S.PlatformJD); 2206 if (S.ProcessSymsJD) 2207 JD->addToLinkOrder(*S.ProcessSymsJD); 2208 } 2209 2210 return Error::success(); 2211 } 2212 2213 static Error addSessionInputs(Session &S) { 2214 std::map<unsigned, JITDylib *> IdxToJD; 2215 DenseSet<unsigned> LazyLinkIdxs; 2216 2217 for (auto LLItr = LazyLink.begin(), LLEnd = LazyLink.end(); LLItr != LLEnd; 2218 ++LLItr) { 2219 if (*LLItr) 2220 LazyLinkIdxs.insert(LazyLink.getPosition(LLItr - LazyLink.begin()) + 1); 2221 } 2222 2223 if (auto Err = createJITDylibs(S, IdxToJD)) 2224 return Err; 2225 2226 if (auto Err = addAbsoluteSymbols(S, IdxToJD)) 2227 return Err; 2228 2229 if (auto Err = addAliases(S, IdxToJD)) 2230 return Err; 2231 2232 if (auto Err = addSectCreates(S, IdxToJD)) 2233 return Err; 2234 2235 if (!TestHarnesses.empty()) 2236 if (auto Err = addTestHarnesses(S)) 2237 return Err; 2238 2239 if (auto Err = addObjects(S, IdxToJD, LazyLinkIdxs)) 2240 return Err; 2241 2242 if (auto Err = addLibraries(S, IdxToJD, LazyLinkIdxs)) 2243 return Err; 2244 2245 return Error::success(); 2246 } 2247 2248 namespace { 2249 struct TargetInfo { 2250 const Target *TheTarget; 2251 std::unique_ptr<MCSubtargetInfo> STI; 2252 std::unique_ptr<MCRegisterInfo> MRI; 2253 std::unique_ptr<MCAsmInfo> MAI; 2254 std::unique_ptr<MCContext> Ctx; 2255 std::unique_ptr<MCDisassembler> Disassembler; 2256 std::unique_ptr<MCInstrInfo> MII; 2257 std::unique_ptr<MCInstrAnalysis> MIA; 2258 std::unique_ptr<MCInstPrinter> InstPrinter; 2259 }; 2260 } // anonymous namespace 2261 2262 static TargetInfo 2263 getTargetInfo(const Triple &TT, 2264 const SubtargetFeatures &TF = SubtargetFeatures()) { 2265 auto TripleName = TT.str(); 2266 std::string ErrorStr; 2267 const Target *TheTarget = TargetRegistry::lookupTarget(TripleName, ErrorStr); 2268 if (!TheTarget) 2269 ExitOnErr(make_error<StringError>("Error accessing target '" + TripleName + 2270 "': " + ErrorStr, 2271 inconvertibleErrorCode())); 2272 2273 std::unique_ptr<MCSubtargetInfo> STI( 2274 TheTarget->createMCSubtargetInfo(TripleName, "", TF.getString())); 2275 if (!STI) 2276 ExitOnErr( 2277 make_error<StringError>("Unable to create subtarget for " + TripleName, 2278 inconvertibleErrorCode())); 2279 2280 std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName)); 2281 if (!MRI) 2282 ExitOnErr(make_error<StringError>("Unable to create target register info " 2283 "for " + 2284 TripleName, 2285 inconvertibleErrorCode())); 2286 2287 MCTargetOptions MCOptions; 2288 std::unique_ptr<MCAsmInfo> MAI( 2289 TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions)); 2290 if (!MAI) 2291 ExitOnErr(make_error<StringError>("Unable to create target asm info " + 2292 TripleName, 2293 inconvertibleErrorCode())); 2294 2295 auto Ctx = std::make_unique<MCContext>(Triple(TripleName), MAI.get(), 2296 MRI.get(), STI.get()); 2297 2298 std::unique_ptr<MCDisassembler> Disassembler( 2299 TheTarget->createMCDisassembler(*STI, *Ctx)); 2300 if (!Disassembler) 2301 ExitOnErr(make_error<StringError>("Unable to create disassembler for " + 2302 TripleName, 2303 inconvertibleErrorCode())); 2304 2305 std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo()); 2306 if (!MII) 2307 ExitOnErr(make_error<StringError>("Unable to create instruction info for" + 2308 TripleName, 2309 inconvertibleErrorCode())); 2310 2311 std::unique_ptr<MCInstrAnalysis> MIA( 2312 TheTarget->createMCInstrAnalysis(MII.get())); 2313 if (!MIA) 2314 ExitOnErr(make_error<StringError>( 2315 "Unable to create instruction analysis for" + TripleName, 2316 inconvertibleErrorCode())); 2317 2318 std::unique_ptr<MCInstPrinter> InstPrinter( 2319 TheTarget->createMCInstPrinter(Triple(TripleName), 0, *MAI, *MII, *MRI)); 2320 if (!InstPrinter) 2321 ExitOnErr(make_error<StringError>( 2322 "Unable to create instruction printer for" + TripleName, 2323 inconvertibleErrorCode())); 2324 return {TheTarget, std::move(STI), std::move(MRI), 2325 std::move(MAI), std::move(Ctx), std::move(Disassembler), 2326 std::move(MII), std::move(MIA), std::move(InstPrinter)}; 2327 } 2328 static Error runChecks(Session &S, Triple TT, SubtargetFeatures Features) { 2329 if (CheckFiles.empty()) 2330 return Error::success(); 2331 2332 LLVM_DEBUG(dbgs() << "Running checks...\n"); 2333 2334 auto IsSymbolValid = [&S](StringRef Symbol) { 2335 auto InternedSymbol = S.ES.getSymbolStringPool()->intern(Symbol); 2336 return S.isSymbolRegistered(InternedSymbol); 2337 }; 2338 2339 auto GetSymbolInfo = [&S](StringRef Symbol) { 2340 auto InternedSymbol = S.ES.getSymbolStringPool()->intern(Symbol); 2341 return S.findSymbolInfo(InternedSymbol, "Can not get symbol info"); 2342 }; 2343 2344 auto GetSectionInfo = [&S](StringRef FileName, StringRef SectionName) { 2345 return S.findSectionInfo(FileName, SectionName); 2346 }; 2347 2348 auto GetStubInfo = [&S](StringRef FileName, StringRef SectionName, 2349 StringRef KindNameFilter) { 2350 return S.findStubInfo(FileName, SectionName, KindNameFilter); 2351 }; 2352 2353 auto GetGOTInfo = [&S](StringRef FileName, StringRef SectionName) { 2354 return S.findGOTEntryInfo(FileName, SectionName); 2355 }; 2356 2357 RuntimeDyldChecker Checker( 2358 IsSymbolValid, GetSymbolInfo, GetSectionInfo, GetStubInfo, GetGOTInfo, 2359 S.ES.getTargetTriple().isLittleEndian() ? llvm::endianness::little 2360 : llvm::endianness::big, 2361 TT, StringRef(), Features, dbgs()); 2362 2363 std::string CheckLineStart = "# " + CheckName + ":"; 2364 for (auto &CheckFile : CheckFiles) { 2365 auto CheckerFileBuf = ExitOnErr(getFile(CheckFile)); 2366 if (!Checker.checkAllRulesInBuffer(CheckLineStart, &*CheckerFileBuf)) 2367 ExitOnErr(make_error<StringError>( 2368 "Some checks in " + CheckFile + " failed", inconvertibleErrorCode())); 2369 } 2370 2371 return Error::success(); 2372 } 2373 2374 static Error addSelfRelocations(LinkGraph &G) { 2375 auto TI = getTargetInfo(G.getTargetTriple()); 2376 for (auto *Sym : G.defined_symbols()) 2377 if (Sym->isCallable()) 2378 if (auto Err = addFunctionPointerRelocationsToCurrentSymbol( 2379 *Sym, G, *TI.Disassembler, *TI.MIA)) 2380 return Err; 2381 return Error::success(); 2382 } 2383 2384 static Expected<ExecutorSymbolDef> getMainEntryPoint(Session &S) { 2385 return S.ES.lookup(S.JDSearchOrder, S.ES.intern(EntryPointName)); 2386 } 2387 2388 static Expected<ExecutorSymbolDef> getOrcRuntimeEntryPoint(Session &S) { 2389 std::string RuntimeEntryPoint = "__orc_rt_run_program_wrapper"; 2390 if (S.ES.getTargetTriple().getObjectFormat() == Triple::MachO) 2391 RuntimeEntryPoint = '_' + RuntimeEntryPoint; 2392 return S.ES.lookup(S.JDSearchOrder, S.ES.intern(RuntimeEntryPoint)); 2393 } 2394 2395 static Expected<ExecutorSymbolDef> getEntryPoint(Session &S) { 2396 ExecutorSymbolDef EntryPoint; 2397 2398 // Find the entry-point function unconditionally, since we want to force 2399 // it to be materialized to collect stats. 2400 if (auto EP = getMainEntryPoint(S)) 2401 EntryPoint = *EP; 2402 else 2403 return EP.takeError(); 2404 LLVM_DEBUG({ 2405 dbgs() << "Using entry point \"" << EntryPointName 2406 << "\": " << formatv("{0:x16}", EntryPoint.getAddress()) << "\n"; 2407 }); 2408 2409 // If we're running with the ORC runtime then replace the entry-point 2410 // with the __orc_rt_run_program symbol. 2411 if (!OrcRuntime.empty()) { 2412 if (auto EP = getOrcRuntimeEntryPoint(S)) 2413 EntryPoint = *EP; 2414 else 2415 return EP.takeError(); 2416 LLVM_DEBUG({ 2417 dbgs() << "(called via __orc_rt_run_program_wrapper at " 2418 << formatv("{0:x16}", EntryPoint.getAddress()) << ")\n"; 2419 }); 2420 } 2421 2422 return EntryPoint; 2423 } 2424 2425 static Expected<int> runWithRuntime(Session &S, ExecutorAddr EntryPointAddr) { 2426 StringRef DemangledEntryPoint = EntryPointName; 2427 if (S.ES.getTargetTriple().getObjectFormat() == Triple::MachO && 2428 DemangledEntryPoint.front() == '_') 2429 DemangledEntryPoint = DemangledEntryPoint.drop_front(); 2430 using llvm::orc::shared::SPSString; 2431 using SPSRunProgramSig = 2432 int64_t(SPSString, SPSString, shared::SPSSequence<SPSString>); 2433 int64_t Result; 2434 if (auto Err = S.ES.callSPSWrapper<SPSRunProgramSig>( 2435 EntryPointAddr, Result, S.MainJD->getName(), DemangledEntryPoint, 2436 static_cast<std::vector<std::string> &>(InputArgv))) 2437 return std::move(Err); 2438 return Result; 2439 } 2440 2441 static Expected<int> runWithoutRuntime(Session &S, 2442 ExecutorAddr EntryPointAddr) { 2443 return S.ES.getExecutorProcessControl().runAsMain(EntryPointAddr, InputArgv); 2444 } 2445 2446 namespace { 2447 struct JITLinkTimers { 2448 TimerGroup JITLinkTG{"llvm-jitlink timers", "timers for llvm-jitlink phases"}; 2449 Timer LoadObjectsTimer{"load", "time to load/add object files", JITLinkTG}; 2450 Timer LinkTimer{"link", "time to link object files", JITLinkTG}; 2451 Timer RunTimer{"run", "time to execute jitlink'd code", JITLinkTG}; 2452 }; 2453 } // namespace 2454 2455 int main(int argc, char *argv[]) { 2456 InitLLVM X(argc, argv); 2457 2458 InitializeAllTargetInfos(); 2459 InitializeAllTargetMCs(); 2460 InitializeAllDisassemblers(); 2461 2462 cl::HideUnrelatedOptions({&JITLinkCategory, &getColorCategory()}); 2463 cl::ParseCommandLineOptions(argc, argv, "llvm jitlink tool"); 2464 ExitOnErr.setBanner(std::string(argv[0]) + ": "); 2465 2466 /// If timers are enabled, create a JITLinkTimers instance. 2467 std::unique_ptr<JITLinkTimers> Timers = 2468 ShowTimes ? std::make_unique<JITLinkTimers>() : nullptr; 2469 2470 auto [TT, Features] = getFirstFileTripleAndFeatures(); 2471 ExitOnErr(sanitizeArguments(TT, argv[0])); 2472 2473 auto S = ExitOnErr(Session::Create(TT, Features)); 2474 2475 enableStatistics(*S, !OrcRuntime.empty()); 2476 2477 { 2478 TimeRegion TR(Timers ? &Timers->LoadObjectsTimer : nullptr); 2479 ExitOnErr(addSessionInputs(*S)); 2480 } 2481 2482 if (PhonyExternals) 2483 addPhonyExternalsGenerator(*S); 2484 2485 if (ShowInitialExecutionSessionState) 2486 S->ES.dump(outs()); 2487 2488 Expected<ExecutorSymbolDef> EntryPoint((ExecutorSymbolDef())); 2489 { 2490 ExpectedAsOutParameter<ExecutorSymbolDef> _(&EntryPoint); 2491 TimeRegion TR(Timers ? &Timers->LinkTimer : nullptr); 2492 EntryPoint = getEntryPoint(*S); 2493 } 2494 2495 // Print any reports regardless of whether we succeeded or failed. 2496 if (ShowEntryExecutionSessionState) 2497 S->ES.dump(outs()); 2498 2499 if (ShowAddrs) 2500 S->dumpSessionInfo(outs()); 2501 2502 if (!EntryPoint) { 2503 if (Timers) 2504 Timers->JITLinkTG.printAll(errs()); 2505 reportLLVMJITLinkError(EntryPoint.takeError()); 2506 exit(1); 2507 } 2508 2509 ExitOnErr(runChecks(*S, std::move(TT), std::move(Features))); 2510 2511 int Result = 0; 2512 if (!NoExec) { 2513 LLVM_DEBUG(dbgs() << "Running \"" << EntryPointName << "\"...\n"); 2514 TimeRegion TR(Timers ? &Timers->RunTimer : nullptr); 2515 if (!OrcRuntime.empty()) 2516 Result = 2517 ExitOnErr(runWithRuntime(*S, ExecutorAddr(EntryPoint->getAddress()))); 2518 else 2519 Result = ExitOnErr( 2520 runWithoutRuntime(*S, ExecutorAddr(EntryPoint->getAddress()))); 2521 } 2522 2523 // Destroy the session. 2524 ExitOnErr(S->ES.endSession()); 2525 S.reset(); 2526 2527 if (Timers) 2528 Timers->JITLinkTG.printAll(errs()); 2529 2530 // If the executing code set a test result override then use that. 2531 if (UseTestResultOverride) 2532 Result = TestResultOverride; 2533 2534 return Result; 2535 } 2536