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.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 42 using namespace llvm; 43 using namespace llvm::object; 44 45 static cl::list<std::string> 46 InputFileList(cl::Positional, cl::ZeroOrMore, 47 cl::desc("<input file>")); 48 49 enum ActionType { 50 AC_Execute, 51 AC_PrintObjectLineInfo, 52 AC_PrintLineInfo, 53 AC_PrintDebugLineInfo, 54 AC_Verify 55 }; 56 57 static cl::opt<ActionType> 58 Action(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 72 static cl::opt<std::string> 73 EntryPoint("entry", 74 cl::desc("Function to call as entry point."), 75 cl::init("_main")); 76 77 static cl::list<std::string> 78 Dylibs("dylib", 79 cl::desc("Add library."), 80 cl::ZeroOrMore); 81 82 static cl::opt<std::string> 83 TripleName("triple", cl::desc("Target triple for disassembler")); 84 85 static cl::opt<std::string> 86 MCPU("mcpu", 87 cl::desc("Target a specific cpu type (-mcpu=help for details)"), 88 cl::value_desc("cpu-name"), 89 cl::init("")); 90 91 static cl::list<std::string> 92 CheckFiles("check", 93 cl::desc("File containing RuntimeDyld verifier checks."), 94 cl::ZeroOrMore); 95 96 static cl::opt<uint64_t> 97 PreallocMemory("preallocate", 98 cl::desc("Allocate memory upfront rather than on-demand"), 99 cl::init(0)); 100 101 static cl::opt<uint64_t> 102 TargetAddrStart("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 108 static cl::opt<uint64_t> 109 TargetAddrEnd("target-addr-end", 110 cl::desc("For -verify only: end of phony target address range."), 111 cl::init(~0ULL), 112 cl::Hidden); 113 114 static cl::opt<uint64_t> 115 TargetSectionSep("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 121 static cl::list<std::string> 122 SpecificSectionMappings("map-section", 123 cl::desc("For -verify only: Map a section to a " 124 "specific address."), 125 cl::ZeroOrMore, 126 cl::Hidden); 127 128 static cl::list<std::string> 129 DummySymbolMappings("dummy-extern", 130 cl::desc("For -verify only: Inject a symbol into the extern " 131 "symbol table."), 132 cl::ZeroOrMore, 133 cl::Hidden); 134 135 static cl::opt<bool> 136 PrintAllocationRequests("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. 145 class TrivialMemoryManager : public RTDyldMemoryManager { 146 public: 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 = RoundUpToAlignment(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 208 private: 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 216 uint8_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 235 uint8_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 255 static const char *ProgramName; 256 257 static int Error(const Twine &Msg) { 258 errs() << ProgramName << ": error: " << Msg << "\n"; 259 return 1; 260 } 261 262 static 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 274 static 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 return Error("unable to read input: '" + EC.message() + "'"); 294 295 ErrorOr<std::unique_ptr<ObjectFile>> MaybeObj( 296 ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef())); 297 298 if (std::error_code EC = MaybeObj.getError()) 299 return Error("unable to create object file: '" + EC.message() + "'"); 300 301 ObjectFile &Obj = **MaybeObj; 302 303 OwningBinary<ObjectFile> DebugObj; 304 std::unique_ptr<RuntimeDyld::LoadedObjectInfo> LoadedObjInfo = nullptr; 305 ObjectFile *SymbolObj = &Obj; 306 if (LoadObjects) { 307 // Load the object file 308 LoadedObjInfo = 309 Dyld.loadObject(Obj); 310 311 if (Dyld.hasError()) 312 return Error(Dyld.getErrorString()); 313 314 // Resolve all the relocations we can. 315 Dyld.resolveRelocations(); 316 317 if (UseDebugObj) { 318 DebugObj = LoadedObjInfo->getObjectForDebug(Obj); 319 SymbolObj = DebugObj.getBinary(); 320 LoadedObjInfo.reset(); 321 } 322 } 323 324 std::unique_ptr<DIContext> Context( 325 new DWARFContextInMemory(*SymbolObj,LoadedObjInfo.get())); 326 327 std::vector<std::pair<SymbolRef, uint64_t>> SymAddr = 328 object::computeSymbolSizes(*SymbolObj); 329 330 // Use symbol info to iterate functions in the object. 331 for (const auto &P : SymAddr) { 332 object::SymbolRef Sym = P.first; 333 if (Sym.getType() == object::SymbolRef::ST_Function) { 334 ErrorOr<StringRef> Name = Sym.getName(); 335 if (!Name) 336 continue; 337 ErrorOr<uint64_t> AddrOrErr = Sym.getAddress(); 338 if (!AddrOrErr) 339 continue; 340 uint64_t Addr = *AddrOrErr; 341 342 uint64_t Size = P.second; 343 // If we're not using the debug object, compute the address of the 344 // symbol in memory (rather than that in the unrelocated object file) 345 // and use that to query the DWARFContext. 346 if (!UseDebugObj && LoadObjects) { 347 object::section_iterator Sec = *Sym.getSection(); 348 StringRef SecName; 349 Sec->getName(SecName); 350 uint64_t SectionLoadAddress = 351 LoadedObjInfo->getSectionLoadAddress(*Sec); 352 if (SectionLoadAddress != 0) 353 Addr += SectionLoadAddress - Sec->getAddress(); 354 } 355 356 outs() << "Function: " << *Name << ", Size = " << Size 357 << ", Addr = " << Addr << "\n"; 358 359 DILineInfoTable Lines = Context->getLineInfoForAddressRange(Addr, Size); 360 for (auto &D : Lines) { 361 outs() << " Line info @ " << D.first - Addr << ": " 362 << D.second.FileName << ", line:" << D.second.Line << "\n"; 363 } 364 } 365 } 366 } 367 368 return 0; 369 } 370 371 static void doPreallocation(TrivialMemoryManager &MemMgr) { 372 // Allocate a slab of memory upfront, if required. This is used if 373 // we want to test small code models. 374 if (static_cast<intptr_t>(PreallocMemory) < 0) 375 report_fatal_error("Pre-allocated bytes of memory must be a positive integer."); 376 377 // FIXME: Limit the amount of memory that can be preallocated? 378 if (PreallocMemory != 0) 379 MemMgr.preallocateSlab(PreallocMemory); 380 } 381 382 static int executeInput() { 383 // Load any dylibs requested on the command line. 384 loadDylibs(); 385 386 // Instantiate a dynamic linker. 387 TrivialMemoryManager MemMgr; 388 doPreallocation(MemMgr); 389 RuntimeDyld Dyld(MemMgr, MemMgr); 390 391 // If we don't have any input files, read from stdin. 392 if (!InputFileList.size()) 393 InputFileList.push_back("-"); 394 for (auto &File : InputFileList) { 395 // Load the input memory buffer. 396 ErrorOr<std::unique_ptr<MemoryBuffer>> InputBuffer = 397 MemoryBuffer::getFileOrSTDIN(File); 398 if (std::error_code EC = InputBuffer.getError()) 399 return Error("unable to read input: '" + EC.message() + "'"); 400 ErrorOr<std::unique_ptr<ObjectFile>> MaybeObj( 401 ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef())); 402 403 if (std::error_code EC = MaybeObj.getError()) 404 return Error("unable to create object file: '" + EC.message() + "'"); 405 406 ObjectFile &Obj = **MaybeObj; 407 408 // Load the object file 409 Dyld.loadObject(Obj); 410 if (Dyld.hasError()) { 411 return Error(Dyld.getErrorString()); 412 } 413 } 414 415 // Resove all the relocations we can. 416 // FIXME: Error out if there are unresolved relocations. 417 Dyld.resolveRelocations(); 418 419 // Get the address of the entry point (_main by default). 420 void *MainAddress = Dyld.getSymbolLocalAddress(EntryPoint); 421 if (!MainAddress) 422 return Error("no definition for '" + EntryPoint + "'"); 423 424 // Invalidate the instruction cache for each loaded function. 425 for (auto &FM : MemMgr.FunctionMemory) { 426 427 // Make sure the memory is executable. 428 // setExecutable will call InvalidateInstructionCache. 429 std::string ErrorStr; 430 if (!sys::Memory::setExecutable(FM, &ErrorStr)) 431 return Error("unable to mark function executable: '" + ErrorStr + "'"); 432 } 433 434 // Dispatch to _main(). 435 errs() << "loaded '" << EntryPoint << "' at: " << (void*)MainAddress << "\n"; 436 437 int (*Main)(int, const char**) = 438 (int(*)(int,const char**)) uintptr_t(MainAddress); 439 const char **Argv = new const char*[2]; 440 // Use the name of the first input object module as argv[0] for the target. 441 Argv[0] = InputFileList[0].c_str(); 442 Argv[1] = nullptr; 443 return Main(1, Argv); 444 } 445 446 static int checkAllExpressions(RuntimeDyldChecker &Checker) { 447 for (const auto& CheckerFileName : CheckFiles) { 448 ErrorOr<std::unique_ptr<MemoryBuffer>> CheckerFileBuf = 449 MemoryBuffer::getFileOrSTDIN(CheckerFileName); 450 if (std::error_code EC = CheckerFileBuf.getError()) 451 return Error("unable to read input '" + CheckerFileName + "': " + 452 EC.message()); 453 454 if (!Checker.checkAllRulesInBuffer("# rtdyld-check:", 455 CheckerFileBuf.get().get())) 456 return Error("some checks in '" + CheckerFileName + "' failed"); 457 } 458 return 0; 459 } 460 461 static std::map<void *, uint64_t> 462 applySpecificSectionMappings(RuntimeDyldChecker &Checker) { 463 464 std::map<void*, uint64_t> SpecificMappings; 465 466 for (StringRef Mapping : SpecificSectionMappings) { 467 468 size_t EqualsIdx = Mapping.find_first_of("="); 469 std::string SectionIDStr = Mapping.substr(0, EqualsIdx); 470 size_t ComaIdx = Mapping.find_first_of(","); 471 472 if (ComaIdx == StringRef::npos) 473 report_fatal_error("Invalid section specification '" + Mapping + 474 "'. Should be '<file name>,<section name>=<addr>'"); 475 476 std::string FileName = SectionIDStr.substr(0, ComaIdx); 477 std::string SectionName = SectionIDStr.substr(ComaIdx + 1); 478 479 uint64_t OldAddrInt; 480 std::string ErrorMsg; 481 std::tie(OldAddrInt, ErrorMsg) = 482 Checker.getSectionAddr(FileName, SectionName, true); 483 484 if (ErrorMsg != "") 485 report_fatal_error(ErrorMsg); 486 487 void* OldAddr = reinterpret_cast<void*>(static_cast<uintptr_t>(OldAddrInt)); 488 489 std::string NewAddrStr = Mapping.substr(EqualsIdx + 1); 490 uint64_t NewAddr; 491 492 if (StringRef(NewAddrStr).getAsInteger(0, NewAddr)) 493 report_fatal_error("Invalid section address in mapping '" + Mapping + 494 "'."); 495 496 Checker.getRTDyld().mapSectionAddress(OldAddr, NewAddr); 497 SpecificMappings[OldAddr] = NewAddr; 498 } 499 500 return SpecificMappings; 501 } 502 503 // Scatter sections in all directions! 504 // Remaps section addresses for -verify mode. The following command line options 505 // can be used to customize the layout of the memory within the phony target's 506 // address space: 507 // -target-addr-start <s> -- Specify where the phony target addres range starts. 508 // -target-addr-end <e> -- Specify where the phony target address range ends. 509 // -target-section-sep <d> -- Specify how big a gap should be left between the 510 // end of one section and the start of the next. 511 // Defaults to zero. Set to something big 512 // (e.g. 1 << 32) to stress-test stubs, GOTs, etc. 513 // 514 static void remapSectionsAndSymbols(const llvm::Triple &TargetTriple, 515 TrivialMemoryManager &MemMgr, 516 RuntimeDyldChecker &Checker) { 517 518 // Set up a work list (section addr/size pairs). 519 typedef std::list<std::pair<void*, uint64_t>> WorklistT; 520 WorklistT Worklist; 521 522 for (const auto& CodeSection : MemMgr.FunctionMemory) 523 Worklist.push_back(std::make_pair(CodeSection.base(), CodeSection.size())); 524 for (const auto& DataSection : MemMgr.DataMemory) 525 Worklist.push_back(std::make_pair(DataSection.base(), DataSection.size())); 526 527 // Apply any section-specific mappings that were requested on the command 528 // line. 529 typedef std::map<void*, uint64_t> AppliedMappingsT; 530 AppliedMappingsT AppliedMappings = applySpecificSectionMappings(Checker); 531 532 // Keep an "already allocated" mapping of section target addresses to sizes. 533 // Sections whose address mappings aren't specified on the command line will 534 // allocated around the explicitly mapped sections while maintaining the 535 // minimum separation. 536 std::map<uint64_t, uint64_t> AlreadyAllocated; 537 538 // Move the previously applied mappings into the already-allocated map. 539 for (WorklistT::iterator I = Worklist.begin(), E = Worklist.end(); 540 I != E;) { 541 WorklistT::iterator Tmp = I; 542 ++I; 543 AppliedMappingsT::iterator AI = AppliedMappings.find(Tmp->first); 544 545 if (AI != AppliedMappings.end()) { 546 AlreadyAllocated[AI->second] = Tmp->second; 547 Worklist.erase(Tmp); 548 } 549 } 550 551 // If the -target-addr-end option wasn't explicitly passed, then set it to a 552 // sensible default based on the target triple. 553 if (TargetAddrEnd.getNumOccurrences() == 0) { 554 if (TargetTriple.isArch16Bit()) 555 TargetAddrEnd = (1ULL << 16) - 1; 556 else if (TargetTriple.isArch32Bit()) 557 TargetAddrEnd = (1ULL << 32) - 1; 558 // TargetAddrEnd already has a sensible default for 64-bit systems, so 559 // there's nothing to do in the 64-bit case. 560 } 561 562 // Process any elements remaining in the worklist. 563 while (!Worklist.empty()) { 564 std::pair<void*, uint64_t> CurEntry = Worklist.front(); 565 Worklist.pop_front(); 566 567 uint64_t NextSectionAddr = TargetAddrStart; 568 569 for (const auto &Alloc : AlreadyAllocated) 570 if (NextSectionAddr + CurEntry.second + TargetSectionSep <= Alloc.first) 571 break; 572 else 573 NextSectionAddr = Alloc.first + Alloc.second + TargetSectionSep; 574 575 AlreadyAllocated[NextSectionAddr] = CurEntry.second; 576 Checker.getRTDyld().mapSectionAddress(CurEntry.first, NextSectionAddr); 577 } 578 579 // Add dummy symbols to the memory manager. 580 for (const auto &Mapping : DummySymbolMappings) { 581 size_t EqualsIdx = Mapping.find_first_of("="); 582 583 if (EqualsIdx == StringRef::npos) 584 report_fatal_error("Invalid dummy symbol specification '" + Mapping + 585 "'. Should be '<symbol name>=<addr>'"); 586 587 std::string Symbol = Mapping.substr(0, EqualsIdx); 588 std::string AddrStr = Mapping.substr(EqualsIdx + 1); 589 590 uint64_t Addr; 591 if (StringRef(AddrStr).getAsInteger(0, Addr)) 592 report_fatal_error("Invalid symbol mapping '" + Mapping + "'."); 593 594 MemMgr.addDummySymbol(Symbol, Addr); 595 } 596 } 597 598 // Load and link the objects specified on the command line, but do not execute 599 // anything. Instead, attach a RuntimeDyldChecker instance and call it to 600 // verify the correctness of the linked memory. 601 static int linkAndVerify() { 602 603 // Check for missing triple. 604 if (TripleName == "") 605 return Error("-triple required when running in -verify mode."); 606 607 // Look up the target and build the disassembler. 608 Triple TheTriple(Triple::normalize(TripleName)); 609 std::string ErrorStr; 610 const Target *TheTarget = 611 TargetRegistry::lookupTarget("", TheTriple, ErrorStr); 612 if (!TheTarget) 613 return Error("Error accessing target '" + TripleName + "': " + ErrorStr); 614 615 TripleName = TheTriple.getTriple(); 616 617 std::unique_ptr<MCSubtargetInfo> STI( 618 TheTarget->createMCSubtargetInfo(TripleName, MCPU, "")); 619 if (!STI) 620 return Error("Unable to create subtarget info!"); 621 622 std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName)); 623 if (!MRI) 624 return Error("Unable to create target register info!"); 625 626 std::unique_ptr<MCAsmInfo> MAI(TheTarget->createMCAsmInfo(*MRI, TripleName)); 627 if (!MAI) 628 return Error("Unable to create target asm info!"); 629 630 MCContext Ctx(MAI.get(), MRI.get(), nullptr); 631 632 std::unique_ptr<MCDisassembler> Disassembler( 633 TheTarget->createMCDisassembler(*STI, Ctx)); 634 if (!Disassembler) 635 return Error("Unable to create disassembler!"); 636 637 std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo()); 638 639 std::unique_ptr<MCInstPrinter> InstPrinter( 640 TheTarget->createMCInstPrinter(Triple(TripleName), 0, *MAI, *MII, *MRI)); 641 642 // Load any dylibs requested on the command line. 643 loadDylibs(); 644 645 // Instantiate a dynamic linker. 646 TrivialMemoryManager MemMgr; 647 doPreallocation(MemMgr); 648 RuntimeDyld Dyld(MemMgr, MemMgr); 649 Dyld.setProcessAllSections(true); 650 RuntimeDyldChecker Checker(Dyld, Disassembler.get(), InstPrinter.get(), 651 llvm::dbgs()); 652 653 // If we don't have any input files, read from stdin. 654 if (!InputFileList.size()) 655 InputFileList.push_back("-"); 656 for (auto &Filename : InputFileList) { 657 // Load the input memory buffer. 658 ErrorOr<std::unique_ptr<MemoryBuffer>> InputBuffer = 659 MemoryBuffer::getFileOrSTDIN(Filename); 660 661 if (std::error_code EC = InputBuffer.getError()) 662 return Error("unable to read input: '" + EC.message() + "'"); 663 664 ErrorOr<std::unique_ptr<ObjectFile>> MaybeObj( 665 ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef())); 666 667 if (std::error_code EC = MaybeObj.getError()) 668 return Error("unable to create object file: '" + EC.message() + "'"); 669 670 ObjectFile &Obj = **MaybeObj; 671 672 // Load the object file 673 Dyld.loadObject(Obj); 674 if (Dyld.hasError()) { 675 return Error(Dyld.getErrorString()); 676 } 677 } 678 679 // Re-map the section addresses into the phony target address space and add 680 // dummy symbols. 681 remapSectionsAndSymbols(TheTriple, MemMgr, Checker); 682 683 // Resolve all the relocations we can. 684 Dyld.resolveRelocations(); 685 686 // Register EH frames. 687 Dyld.registerEHFrames(); 688 689 int ErrorCode = checkAllExpressions(Checker); 690 if (Dyld.hasError()) 691 return Error("RTDyld reported an error applying relocations:\n " + 692 Dyld.getErrorString()); 693 694 return ErrorCode; 695 } 696 697 int main(int argc, char **argv) { 698 sys::PrintStackTraceOnErrorSignal(); 699 PrettyStackTraceProgram X(argc, argv); 700 701 ProgramName = argv[0]; 702 llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 703 704 llvm::InitializeAllTargetInfos(); 705 llvm::InitializeAllTargetMCs(); 706 llvm::InitializeAllDisassemblers(); 707 708 cl::ParseCommandLineOptions(argc, argv, "llvm MC-JIT tool\n"); 709 710 switch (Action) { 711 case AC_Execute: 712 return executeInput(); 713 case AC_PrintDebugLineInfo: 714 return printLineInfoForInput(/* LoadObjects */ true,/* UseDebugObj */ true); 715 case AC_PrintLineInfo: 716 return printLineInfoForInput(/* LoadObjects */ true,/* UseDebugObj */false); 717 case AC_PrintObjectLineInfo: 718 return printLineInfoForInput(/* LoadObjects */false,/* UseDebugObj */false); 719 case AC_Verify: 720 return linkAndVerify(); 721 } 722 } 723