llvm-rtdyld.cpp revision de2d8694e25a814696358e95141f4b1aa4d8847e
1//===-- llvm-rtdyld.cpp - MCJIT Testing Tool ------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This is a testing tool for use with the MC-JIT LLVM components. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/ADT/StringMap.h" 15#include "llvm/DebugInfo/DIContext.h" 16#include "llvm/DebugInfo/DWARF/DWARFContext.h" 17#include "llvm/ExecutionEngine/RTDyldMemoryManager.h" 18#include "llvm/ExecutionEngine/RuntimeDyld.h" 19#include "llvm/ExecutionEngine/RuntimeDyldChecker.h" 20#include "llvm/MC/MCAsmInfo.h" 21#include "llvm/MC/MCContext.h" 22#include "llvm/MC/MCDisassembler/MCDisassembler.h" 23#include "llvm/MC/MCInstPrinter.h" 24#include "llvm/MC/MCInstrInfo.h" 25#include "llvm/MC/MCRegisterInfo.h" 26#include "llvm/MC/MCSubtargetInfo.h" 27#include "llvm/Object/MachO.h" 28#include "llvm/Object/SymbolSize.h" 29#include "llvm/Support/CommandLine.h" 30#include "llvm/Support/DynamicLibrary.h" 31#include "llvm/Support/ManagedStatic.h" 32#include "llvm/Support/Memory.h" 33#include "llvm/Support/MemoryBuffer.h" 34#include "llvm/Support/PrettyStackTrace.h" 35#include "llvm/Support/Signals.h" 36#include "llvm/Support/TargetRegistry.h" 37#include "llvm/Support/TargetSelect.h" 38#include "llvm/Support/raw_ostream.h" 39#include <list> 40#include <system_error> 41 42using namespace llvm; 43using namespace llvm::object; 44 45static cl::list<std::string> 46InputFileList(cl::Positional, cl::ZeroOrMore, 47 cl::desc("<input file>")); 48 49enum ActionType { 50 AC_Execute, 51 AC_PrintObjectLineInfo, 52 AC_PrintLineInfo, 53 AC_PrintDebugLineInfo, 54 AC_Verify 55}; 56 57static cl::opt<ActionType> 58Action(cl::desc("Action to perform:"), 59 cl::init(AC_Execute), 60 cl::values(clEnumValN(AC_Execute, "execute", 61 "Load, link, and execute the inputs."), 62 clEnumValN(AC_PrintLineInfo, "printline", 63 "Load, link, and print line information for each function."), 64 clEnumValN(AC_PrintDebugLineInfo, "printdebugline", 65 "Load, link, and print line information for each function using the debug object"), 66 clEnumValN(AC_PrintObjectLineInfo, "printobjline", 67 "Like -printlineinfo but does not load the object first"), 68 clEnumValN(AC_Verify, "verify", 69 "Load, link and verify the resulting memory image."), 70 clEnumValEnd)); 71 72static cl::opt<std::string> 73EntryPoint("entry", 74 cl::desc("Function to call as entry point."), 75 cl::init("_main")); 76 77static cl::list<std::string> 78Dylibs("dylib", 79 cl::desc("Add library."), 80 cl::ZeroOrMore); 81 82static cl::opt<std::string> 83TripleName("triple", cl::desc("Target triple for disassembler")); 84 85static cl::opt<std::string> 86MCPU("mcpu", 87 cl::desc("Target a specific cpu type (-mcpu=help for details)"), 88 cl::value_desc("cpu-name"), 89 cl::init("")); 90 91static cl::list<std::string> 92CheckFiles("check", 93 cl::desc("File containing RuntimeDyld verifier checks."), 94 cl::ZeroOrMore); 95 96static cl::opt<uint64_t> 97PreallocMemory("preallocate", 98 cl::desc("Allocate memory upfront rather than on-demand"), 99 cl::init(0)); 100 101static cl::opt<uint64_t> 102TargetAddrStart("target-addr-start", 103 cl::desc("For -verify only: start of phony target address " 104 "range."), 105 cl::init(4096), // Start at "page 1" - no allocating at "null". 106 cl::Hidden); 107 108static cl::opt<uint64_t> 109TargetAddrEnd("target-addr-end", 110 cl::desc("For -verify only: end of phony target address range."), 111 cl::init(~0ULL), 112 cl::Hidden); 113 114static cl::opt<uint64_t> 115TargetSectionSep("target-section-sep", 116 cl::desc("For -verify only: Separation between sections in " 117 "phony target address space."), 118 cl::init(0), 119 cl::Hidden); 120 121static cl::list<std::string> 122SpecificSectionMappings("map-section", 123 cl::desc("For -verify only: Map a section to a " 124 "specific address."), 125 cl::ZeroOrMore, 126 cl::Hidden); 127 128static cl::list<std::string> 129DummySymbolMappings("dummy-extern", 130 cl::desc("For -verify only: Inject a symbol into the extern " 131 "symbol table."), 132 cl::ZeroOrMore, 133 cl::Hidden); 134 135static cl::opt<bool> 136PrintAllocationRequests("print-alloc-requests", 137 cl::desc("Print allocation requests made to the memory " 138 "manager by RuntimeDyld"), 139 cl::Hidden); 140 141/* *** */ 142 143// A trivial memory manager that doesn't do anything fancy, just uses the 144// support library allocation routines directly. 145class TrivialMemoryManager : public RTDyldMemoryManager { 146public: 147 SmallVector<sys::MemoryBlock, 16> FunctionMemory; 148 SmallVector<sys::MemoryBlock, 16> DataMemory; 149 150 uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, 151 unsigned SectionID, 152 StringRef SectionName) override; 153 uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, 154 unsigned SectionID, StringRef SectionName, 155 bool IsReadOnly) override; 156 157 void *getPointerToNamedFunction(const std::string &Name, 158 bool AbortOnFailure = true) override { 159 return nullptr; 160 } 161 162 bool finalizeMemory(std::string *ErrMsg) override { return false; } 163 164 void addDummySymbol(const std::string &Name, uint64_t Addr) { 165 DummyExterns[Name] = Addr; 166 } 167 168 RuntimeDyld::SymbolInfo findSymbol(const std::string &Name) override { 169 auto I = DummyExterns.find(Name); 170 171 if (I != DummyExterns.end()) 172 return RuntimeDyld::SymbolInfo(I->second, JITSymbolFlags::Exported); 173 174 return RTDyldMemoryManager::findSymbol(Name); 175 } 176 177 void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, 178 size_t Size) override {} 179 void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr, 180 size_t Size) override {} 181 182 void preallocateSlab(uint64_t Size) { 183 std::string Err; 184 sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err); 185 if (!MB.base()) 186 report_fatal_error("Can't allocate enough memory: " + Err); 187 188 PreallocSlab = MB; 189 UsePreallocation = true; 190 SlabSize = Size; 191 } 192 193 uint8_t *allocateFromSlab(uintptr_t Size, unsigned Alignment, bool isCode) { 194 Size = alignTo(Size, Alignment); 195 if (CurrentSlabOffset + Size > SlabSize) 196 report_fatal_error("Can't allocate enough memory. Tune --preallocate"); 197 198 uintptr_t OldSlabOffset = CurrentSlabOffset; 199 sys::MemoryBlock MB((void *)OldSlabOffset, Size); 200 if (isCode) 201 FunctionMemory.push_back(MB); 202 else 203 DataMemory.push_back(MB); 204 CurrentSlabOffset += Size; 205 return (uint8_t*)OldSlabOffset; 206 } 207 208private: 209 std::map<std::string, uint64_t> DummyExterns; 210 sys::MemoryBlock PreallocSlab; 211 bool UsePreallocation = false; 212 uintptr_t SlabSize = 0; 213 uintptr_t CurrentSlabOffset = 0; 214}; 215 216uint8_t *TrivialMemoryManager::allocateCodeSection(uintptr_t Size, 217 unsigned Alignment, 218 unsigned SectionID, 219 StringRef SectionName) { 220 if (PrintAllocationRequests) 221 outs() << "allocateCodeSection(Size = " << Size << ", Alignment = " 222 << Alignment << ", SectionName = " << SectionName << ")\n"; 223 224 if (UsePreallocation) 225 return allocateFromSlab(Size, Alignment, true /* isCode */); 226 227 std::string Err; 228 sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err); 229 if (!MB.base()) 230 report_fatal_error("MemoryManager allocation failed: " + Err); 231 FunctionMemory.push_back(MB); 232 return (uint8_t*)MB.base(); 233} 234 235uint8_t *TrivialMemoryManager::allocateDataSection(uintptr_t Size, 236 unsigned Alignment, 237 unsigned SectionID, 238 StringRef SectionName, 239 bool IsReadOnly) { 240 if (PrintAllocationRequests) 241 outs() << "allocateDataSection(Size = " << Size << ", Alignment = " 242 << Alignment << ", SectionName = " << SectionName << ")\n"; 243 244 if (UsePreallocation) 245 return allocateFromSlab(Size, Alignment, false /* isCode */); 246 247 std::string Err; 248 sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err); 249 if (!MB.base()) 250 report_fatal_error("MemoryManager allocation failed: " + Err); 251 DataMemory.push_back(MB); 252 return (uint8_t*)MB.base(); 253} 254 255static const char *ProgramName; 256 257static void ErrorAndExit(const Twine &Msg) { 258 errs() << ProgramName << ": error: " << Msg << "\n"; 259 exit(1); 260} 261 262static void loadDylibs() { 263 for (const std::string &Dylib : Dylibs) { 264 if (!sys::fs::is_regular_file(Dylib)) 265 report_fatal_error("Dylib not found: '" + Dylib + "'."); 266 std::string ErrMsg; 267 if (sys::DynamicLibrary::LoadLibraryPermanently(Dylib.c_str(), &ErrMsg)) 268 report_fatal_error("Error loading '" + Dylib + "': " + ErrMsg); 269 } 270} 271 272/* *** */ 273 274static int printLineInfoForInput(bool LoadObjects, bool UseDebugObj) { 275 assert(LoadObjects || !UseDebugObj); 276 277 // Load any dylibs requested on the command line. 278 loadDylibs(); 279 280 // If we don't have any input files, read from stdin. 281 if (!InputFileList.size()) 282 InputFileList.push_back("-"); 283 for (auto &File : InputFileList) { 284 // Instantiate a dynamic linker. 285 TrivialMemoryManager MemMgr; 286 RuntimeDyld Dyld(MemMgr, MemMgr); 287 288 // Load the input memory buffer. 289 290 ErrorOr<std::unique_ptr<MemoryBuffer>> InputBuffer = 291 MemoryBuffer::getFileOrSTDIN(File); 292 if (std::error_code EC = InputBuffer.getError()) 293 ErrorAndExit("unable to read input: '" + EC.message() + "'"); 294 295 Expected<std::unique_ptr<ObjectFile>> MaybeObj( 296 ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef())); 297 298 if (!MaybeObj) { 299 std::string Buf; 300 raw_string_ostream OS(Buf); 301 logAllUnhandledErrors(MaybeObj.takeError(), OS, ""); 302 OS.flush(); 303 ErrorAndExit("unable to create object file: '" + Buf + "'"); 304 } 305 306 ObjectFile &Obj = **MaybeObj; 307 308 OwningBinary<ObjectFile> DebugObj; 309 std::unique_ptr<RuntimeDyld::LoadedObjectInfo> LoadedObjInfo = nullptr; 310 ObjectFile *SymbolObj = &Obj; 311 if (LoadObjects) { 312 // Load the object file 313 LoadedObjInfo = 314 Dyld.loadObject(Obj); 315 316 if (Dyld.hasError()) 317 ErrorAndExit(Dyld.getErrorString()); 318 319 // Resolve all the relocations we can. 320 Dyld.resolveRelocations(); 321 322 if (UseDebugObj) { 323 DebugObj = LoadedObjInfo->getObjectForDebug(Obj); 324 SymbolObj = DebugObj.getBinary(); 325 LoadedObjInfo.reset(); 326 } 327 } 328 329 std::unique_ptr<DIContext> Context( 330 new DWARFContextInMemory(*SymbolObj,LoadedObjInfo.get())); 331 332 std::vector<std::pair<SymbolRef, uint64_t>> SymAddr = 333 object::computeSymbolSizes(*SymbolObj); 334 335 // Use symbol info to iterate functions in the object. 336 for (const auto &P : SymAddr) { 337 object::SymbolRef Sym = P.first; 338 Expected<SymbolRef::Type> TypeOrErr = Sym.getType(); 339 if (!TypeOrErr) { 340 // TODO: Actually report errors helpfully. 341 consumeError(TypeOrErr.takeError()); 342 continue; 343 } 344 SymbolRef::Type Type = *TypeOrErr; 345 if (Type == object::SymbolRef::ST_Function) { 346 Expected<StringRef> Name = Sym.getName(); 347 if (!Name) { 348 // TODO: Actually report errors helpfully. 349 consumeError(Name.takeError()); 350 continue; 351 } 352 Expected<uint64_t> AddrOrErr = Sym.getAddress(); 353 if (!AddrOrErr) { 354 // TODO: Actually report errors helpfully. 355 consumeError(AddrOrErr.takeError()); 356 continue; 357 } 358 uint64_t Addr = *AddrOrErr; 359 360 uint64_t Size = P.second; 361 // If we're not using the debug object, compute the address of the 362 // symbol in memory (rather than that in the unrelocated object file) 363 // and use that to query the DWARFContext. 364 if (!UseDebugObj && LoadObjects) { 365 auto SecOrErr = Sym.getSection(); 366 if (!SecOrErr) { 367 // TODO: Actually report errors helpfully. 368 consumeError(SecOrErr.takeError()); 369 continue; 370 } 371 object::section_iterator Sec = *SecOrErr; 372 StringRef SecName; 373 Sec->getName(SecName); 374 uint64_t SectionLoadAddress = 375 LoadedObjInfo->getSectionLoadAddress(*Sec); 376 if (SectionLoadAddress != 0) 377 Addr += SectionLoadAddress - Sec->getAddress(); 378 } 379 380 outs() << "Function: " << *Name << ", Size = " << Size 381 << ", Addr = " << Addr << "\n"; 382 383 DILineInfoTable Lines = Context->getLineInfoForAddressRange(Addr, Size); 384 for (auto &D : Lines) { 385 outs() << " Line info @ " << D.first - Addr << ": " 386 << D.second.FileName << ", line:" << D.second.Line << "\n"; 387 } 388 } 389 } 390 } 391 392 return 0; 393} 394 395static void doPreallocation(TrivialMemoryManager &MemMgr) { 396 // Allocate a slab of memory upfront, if required. This is used if 397 // we want to test small code models. 398 if (static_cast<intptr_t>(PreallocMemory) < 0) 399 report_fatal_error("Pre-allocated bytes of memory must be a positive integer."); 400 401 // FIXME: Limit the amount of memory that can be preallocated? 402 if (PreallocMemory != 0) 403 MemMgr.preallocateSlab(PreallocMemory); 404} 405 406static int executeInput() { 407 // Load any dylibs requested on the command line. 408 loadDylibs(); 409 410 // Instantiate a dynamic linker. 411 TrivialMemoryManager MemMgr; 412 doPreallocation(MemMgr); 413 RuntimeDyld Dyld(MemMgr, MemMgr); 414 415 // If we don't have any input files, read from stdin. 416 if (!InputFileList.size()) 417 InputFileList.push_back("-"); 418 for (auto &File : InputFileList) { 419 // Load the input memory buffer. 420 ErrorOr<std::unique_ptr<MemoryBuffer>> InputBuffer = 421 MemoryBuffer::getFileOrSTDIN(File); 422 if (std::error_code EC = InputBuffer.getError()) 423 ErrorAndExit("unable to read input: '" + EC.message() + "'"); 424 Expected<std::unique_ptr<ObjectFile>> MaybeObj( 425 ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef())); 426 427 if (!MaybeObj) { 428 std::string Buf; 429 raw_string_ostream OS(Buf); 430 logAllUnhandledErrors(MaybeObj.takeError(), OS, ""); 431 OS.flush(); 432 ErrorAndExit("unable to create object file: '" + Buf + "'"); 433 } 434 435 ObjectFile &Obj = **MaybeObj; 436 437 // Load the object file 438 Dyld.loadObject(Obj); 439 if (Dyld.hasError()) { 440 ErrorAndExit(Dyld.getErrorString()); 441 } 442 } 443 444 // Resove all the relocations we can. 445 // FIXME: Error out if there are unresolved relocations. 446 Dyld.resolveRelocations(); 447 448 // Get the address of the entry point (_main by default). 449 void *MainAddress = Dyld.getSymbolLocalAddress(EntryPoint); 450 if (!MainAddress) 451 ErrorAndExit("no definition for '" + EntryPoint + "'"); 452 453 // Invalidate the instruction cache for each loaded function. 454 for (auto &FM : MemMgr.FunctionMemory) { 455 456 // Make sure the memory is executable. 457 // setExecutable will call InvalidateInstructionCache. 458 std::string ErrorStr; 459 if (!sys::Memory::setExecutable(FM, &ErrorStr)) 460 ErrorAndExit("unable to mark function executable: '" + ErrorStr + "'"); 461 } 462 463 // Dispatch to _main(). 464 errs() << "loaded '" << EntryPoint << "' at: " << (void*)MainAddress << "\n"; 465 466 int (*Main)(int, const char**) = 467 (int(*)(int,const char**)) uintptr_t(MainAddress); 468 const char **Argv = new const char*[2]; 469 // Use the name of the first input object module as argv[0] for the target. 470 Argv[0] = InputFileList[0].c_str(); 471 Argv[1] = nullptr; 472 return Main(1, Argv); 473} 474 475static int checkAllExpressions(RuntimeDyldChecker &Checker) { 476 for (const auto& CheckerFileName : CheckFiles) { 477 ErrorOr<std::unique_ptr<MemoryBuffer>> CheckerFileBuf = 478 MemoryBuffer::getFileOrSTDIN(CheckerFileName); 479 if (std::error_code EC = CheckerFileBuf.getError()) 480 ErrorAndExit("unable to read input '" + CheckerFileName + "': " + 481 EC.message()); 482 483 if (!Checker.checkAllRulesInBuffer("# rtdyld-check:", 484 CheckerFileBuf.get().get())) 485 ErrorAndExit("some checks in '" + CheckerFileName + "' failed"); 486 } 487 return 0; 488} 489 490static std::map<void *, uint64_t> 491applySpecificSectionMappings(RuntimeDyldChecker &Checker) { 492 493 std::map<void*, uint64_t> SpecificMappings; 494 495 for (StringRef Mapping : SpecificSectionMappings) { 496 497 size_t EqualsIdx = Mapping.find_first_of("="); 498 std::string SectionIDStr = Mapping.substr(0, EqualsIdx); 499 size_t ComaIdx = Mapping.find_first_of(","); 500 501 if (ComaIdx == StringRef::npos) 502 report_fatal_error("Invalid section specification '" + Mapping + 503 "'. Should be '<file name>,<section name>=<addr>'"); 504 505 std::string FileName = SectionIDStr.substr(0, ComaIdx); 506 std::string SectionName = SectionIDStr.substr(ComaIdx + 1); 507 508 uint64_t OldAddrInt; 509 std::string ErrorMsg; 510 std::tie(OldAddrInt, ErrorMsg) = 511 Checker.getSectionAddr(FileName, SectionName, true); 512 513 if (ErrorMsg != "") 514 report_fatal_error(ErrorMsg); 515 516 void* OldAddr = reinterpret_cast<void*>(static_cast<uintptr_t>(OldAddrInt)); 517 518 std::string NewAddrStr = Mapping.substr(EqualsIdx + 1); 519 uint64_t NewAddr; 520 521 if (StringRef(NewAddrStr).getAsInteger(0, NewAddr)) 522 report_fatal_error("Invalid section address in mapping '" + Mapping + 523 "'."); 524 525 Checker.getRTDyld().mapSectionAddress(OldAddr, NewAddr); 526 SpecificMappings[OldAddr] = NewAddr; 527 } 528 529 return SpecificMappings; 530} 531 532// Scatter sections in all directions! 533// Remaps section addresses for -verify mode. The following command line options 534// can be used to customize the layout of the memory within the phony target's 535// address space: 536// -target-addr-start <s> -- Specify where the phony target addres range starts. 537// -target-addr-end <e> -- Specify where the phony target address range ends. 538// -target-section-sep <d> -- Specify how big a gap should be left between the 539// end of one section and the start of the next. 540// Defaults to zero. Set to something big 541// (e.g. 1 << 32) to stress-test stubs, GOTs, etc. 542// 543static void remapSectionsAndSymbols(const llvm::Triple &TargetTriple, 544 TrivialMemoryManager &MemMgr, 545 RuntimeDyldChecker &Checker) { 546 547 // Set up a work list (section addr/size pairs). 548 typedef std::list<std::pair<void*, uint64_t>> WorklistT; 549 WorklistT Worklist; 550 551 for (const auto& CodeSection : MemMgr.FunctionMemory) 552 Worklist.push_back(std::make_pair(CodeSection.base(), CodeSection.size())); 553 for (const auto& DataSection : MemMgr.DataMemory) 554 Worklist.push_back(std::make_pair(DataSection.base(), DataSection.size())); 555 556 // Apply any section-specific mappings that were requested on the command 557 // line. 558 typedef std::map<void*, uint64_t> AppliedMappingsT; 559 AppliedMappingsT AppliedMappings = applySpecificSectionMappings(Checker); 560 561 // Keep an "already allocated" mapping of section target addresses to sizes. 562 // Sections whose address mappings aren't specified on the command line will 563 // allocated around the explicitly mapped sections while maintaining the 564 // minimum separation. 565 std::map<uint64_t, uint64_t> AlreadyAllocated; 566 567 // Move the previously applied mappings into the already-allocated map. 568 for (WorklistT::iterator I = Worklist.begin(), E = Worklist.end(); 569 I != E;) { 570 WorklistT::iterator Tmp = I; 571 ++I; 572 AppliedMappingsT::iterator AI = AppliedMappings.find(Tmp->first); 573 574 if (AI != AppliedMappings.end()) { 575 AlreadyAllocated[AI->second] = Tmp->second; 576 Worklist.erase(Tmp); 577 } 578 } 579 580 // If the -target-addr-end option wasn't explicitly passed, then set it to a 581 // sensible default based on the target triple. 582 if (TargetAddrEnd.getNumOccurrences() == 0) { 583 if (TargetTriple.isArch16Bit()) 584 TargetAddrEnd = (1ULL << 16) - 1; 585 else if (TargetTriple.isArch32Bit()) 586 TargetAddrEnd = (1ULL << 32) - 1; 587 // TargetAddrEnd already has a sensible default for 64-bit systems, so 588 // there's nothing to do in the 64-bit case. 589 } 590 591 // Process any elements remaining in the worklist. 592 while (!Worklist.empty()) { 593 std::pair<void*, uint64_t> CurEntry = Worklist.front(); 594 Worklist.pop_front(); 595 596 uint64_t NextSectionAddr = TargetAddrStart; 597 598 for (const auto &Alloc : AlreadyAllocated) 599 if (NextSectionAddr + CurEntry.second + TargetSectionSep <= Alloc.first) 600 break; 601 else 602 NextSectionAddr = Alloc.first + Alloc.second + TargetSectionSep; 603 604 AlreadyAllocated[NextSectionAddr] = CurEntry.second; 605 Checker.getRTDyld().mapSectionAddress(CurEntry.first, NextSectionAddr); 606 } 607 608 // Add dummy symbols to the memory manager. 609 for (const auto &Mapping : DummySymbolMappings) { 610 size_t EqualsIdx = Mapping.find_first_of("="); 611 612 if (EqualsIdx == StringRef::npos) 613 report_fatal_error("Invalid dummy symbol specification '" + Mapping + 614 "'. Should be '<symbol name>=<addr>'"); 615 616 std::string Symbol = Mapping.substr(0, EqualsIdx); 617 std::string AddrStr = Mapping.substr(EqualsIdx + 1); 618 619 uint64_t Addr; 620 if (StringRef(AddrStr).getAsInteger(0, Addr)) 621 report_fatal_error("Invalid symbol mapping '" + Mapping + "'."); 622 623 MemMgr.addDummySymbol(Symbol, Addr); 624 } 625} 626 627// Load and link the objects specified on the command line, but do not execute 628// anything. Instead, attach a RuntimeDyldChecker instance and call it to 629// verify the correctness of the linked memory. 630static int linkAndVerify() { 631 632 // Check for missing triple. 633 if (TripleName == "") 634 ErrorAndExit("-triple required when running in -verify mode."); 635 636 // Look up the target and build the disassembler. 637 Triple TheTriple(Triple::normalize(TripleName)); 638 std::string ErrorStr; 639 const Target *TheTarget = 640 TargetRegistry::lookupTarget("", TheTriple, ErrorStr); 641 if (!TheTarget) 642 ErrorAndExit("Error accessing target '" + TripleName + "': " + ErrorStr); 643 644 TripleName = TheTriple.getTriple(); 645 646 std::unique_ptr<MCSubtargetInfo> STI( 647 TheTarget->createMCSubtargetInfo(TripleName, MCPU, "")); 648 if (!STI) 649 ErrorAndExit("Unable to create subtarget info!"); 650 651 std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName)); 652 if (!MRI) 653 ErrorAndExit("Unable to create target register info!"); 654 655 std::unique_ptr<MCAsmInfo> MAI(TheTarget->createMCAsmInfo(*MRI, TripleName)); 656 if (!MAI) 657 ErrorAndExit("Unable to create target asm info!"); 658 659 MCContext Ctx(MAI.get(), MRI.get(), nullptr); 660 661 std::unique_ptr<MCDisassembler> Disassembler( 662 TheTarget->createMCDisassembler(*STI, Ctx)); 663 if (!Disassembler) 664 ErrorAndExit("Unable to create disassembler!"); 665 666 std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo()); 667 668 std::unique_ptr<MCInstPrinter> InstPrinter( 669 TheTarget->createMCInstPrinter(Triple(TripleName), 0, *MAI, *MII, *MRI)); 670 671 // Load any dylibs requested on the command line. 672 loadDylibs(); 673 674 // Instantiate a dynamic linker. 675 TrivialMemoryManager MemMgr; 676 doPreallocation(MemMgr); 677 RuntimeDyld Dyld(MemMgr, MemMgr); 678 Dyld.setProcessAllSections(true); 679 RuntimeDyldChecker Checker(Dyld, Disassembler.get(), InstPrinter.get(), 680 llvm::dbgs()); 681 682 // If we don't have any input files, read from stdin. 683 if (!InputFileList.size()) 684 InputFileList.push_back("-"); 685 for (auto &Filename : InputFileList) { 686 // Load the input memory buffer. 687 ErrorOr<std::unique_ptr<MemoryBuffer>> InputBuffer = 688 MemoryBuffer::getFileOrSTDIN(Filename); 689 690 if (std::error_code EC = InputBuffer.getError()) 691 ErrorAndExit("unable to read input: '" + EC.message() + "'"); 692 693 Expected<std::unique_ptr<ObjectFile>> MaybeObj( 694 ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef())); 695 696 if (!MaybeObj) { 697 std::string Buf; 698 raw_string_ostream OS(Buf); 699 logAllUnhandledErrors(MaybeObj.takeError(), OS, ""); 700 OS.flush(); 701 ErrorAndExit("unable to create object file: '" + Buf + "'"); 702 } 703 704 ObjectFile &Obj = **MaybeObj; 705 706 // Load the object file 707 Dyld.loadObject(Obj); 708 if (Dyld.hasError()) { 709 ErrorAndExit(Dyld.getErrorString()); 710 } 711 } 712 713 // Re-map the section addresses into the phony target address space and add 714 // dummy symbols. 715 remapSectionsAndSymbols(TheTriple, MemMgr, Checker); 716 717 // Resolve all the relocations we can. 718 Dyld.resolveRelocations(); 719 720 // Register EH frames. 721 Dyld.registerEHFrames(); 722 723 int ErrorCode = checkAllExpressions(Checker); 724 if (Dyld.hasError()) 725 ErrorAndExit("RTDyld reported an error applying relocations:\n " + 726 Dyld.getErrorString()); 727 728 return ErrorCode; 729} 730 731int main(int argc, char **argv) { 732 sys::PrintStackTraceOnErrorSignal(argv[0]); 733 PrettyStackTraceProgram X(argc, argv); 734 735 ProgramName = argv[0]; 736 llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 737 738 llvm::InitializeAllTargetInfos(); 739 llvm::InitializeAllTargetMCs(); 740 llvm::InitializeAllDisassemblers(); 741 742 cl::ParseCommandLineOptions(argc, argv, "llvm MC-JIT tool\n"); 743 744 switch (Action) { 745 case AC_Execute: 746 return executeInput(); 747 case AC_PrintDebugLineInfo: 748 return printLineInfoForInput(/* LoadObjects */ true,/* UseDebugObj */ true); 749 case AC_PrintLineInfo: 750 return printLineInfoForInput(/* LoadObjects */ true,/* UseDebugObj */false); 751 case AC_PrintObjectLineInfo: 752 return printLineInfoForInput(/* LoadObjects */false,/* UseDebugObj */false); 753 case AC_Verify: 754 return linkAndVerify(); 755 } 756} 757