bool AppleAcceleratorTable::dumpName(ScopedPrinter &W, SmallVectorImpl<DWARFFormValue> &AtomForms, uint32_t *DataOffset) const { DWARFFormParams FormParams = {Hdr.Version, 0, dwarf::DwarfFormat::DWARF32}; uint32_t NameOffset = *DataOffset; if (!AccelSection.isValidOffsetForDataOfSize(*DataOffset, 4)) { W.printString("Incorrectly terminated list."); return false; } unsigned StringOffset = AccelSection.getRelocatedValue(4, DataOffset); if (!StringOffset) return false; // End of list DictScope NameScope(W, ("Name@0x" + Twine::utohexstr(NameOffset)).str()); W.startLine() << format("String: 0x%08x", StringOffset); W.getOStream() << " \"" << StringSection.getCStr(&StringOffset) << "\"\n"; unsigned NumData = AccelSection.getU32(DataOffset); for (unsigned Data = 0; Data < NumData; ++Data) { ListScope DataScope(W, ("Data " + Twine(Data)).str()); unsigned i = 0; for (auto &Atom : AtomForms) { W.startLine() << format("Atom[%d]: ", i++); if (Atom.extractValue(AccelSection, DataOffset, FormParams)) Atom.dump(W.getOStream()); else W.getOStream() << "Error extracting the value"; W.getOStream() << "\n"; } } return true; // more entries follow }
void DWARFDebugNames::Abbrev::dump(ScopedPrinter &W) const { DictScope AbbrevScope(W, ("Abbreviation 0x" + Twine::utohexstr(Code)).str()); W.startLine() << formatv("Tag: {0}\n", Tag); for (const auto &Attr : Attributes) W.startLine() << formatv("{0}: {1}\n", Attr.Index, Attr.Form); }
void DWARFDebugNames::Abbrev::dump(ScopedPrinter &W) const { DictScope AbbrevScope(W, ("Abbreviation 0x" + Twine::utohexstr(Code)).str()); W.startLine() << "Tag: " << formatTag(Tag) << '\n'; for (const auto &Attr : Attributes) { W.startLine() << formatIndex(Attr.Index) << ": " << formatForm(Attr.Form) << '\n'; } }
void DWARFDebugNames::Entry::dump(ScopedPrinter &W) const { W.printHex("Abbrev", Abbr->Code); W.startLine() << formatv("Tag: {0}\n", Abbr->Tag); assert(Abbr->Attributes.size() == Values.size()); for (const auto &Tuple : zip_first(Abbr->Attributes, Values)) { W.startLine() << formatv("{0}: ", std::get<0>(Tuple).Index); std::get<1>(Tuple).dump(W.getOStream()); W.getOStream() << '\n'; } }
void DWARFDebugNames::NameIndex::dumpLocalTUs(ScopedPrinter &W) const { if (Hdr.LocalTypeUnitCount == 0) return; ListScope TUScope(W, "Local Type Unit offsets"); for (uint32_t TU = 0; TU < Hdr.LocalTypeUnitCount; ++TU) W.startLine() << format("LocalTU[%u]: 0x%08x\n", TU, getLocalTUOffset(TU)); }
void DWARFDebugNames::NameIndex::dumpForeignTUs(ScopedPrinter &W) const { if (Hdr.ForeignTypeUnitCount == 0) return; ListScope TUScope(W, "Foreign Type Unit signatures"); for (uint32_t TU = 0; TU < Hdr.ForeignTypeUnitCount; ++TU) { W.startLine() << format("ForeignTU[%u]: 0x%016" PRIx64 "\n", TU, getForeignTUSignature(TU)); } }
void DWARFDebugNames::Header::dump(ScopedPrinter &W) const { DictScope HeaderScope(W, "Header"); W.printHex("Length", UnitLength); W.printNumber("Version", Version); W.printHex("Padding", Padding); W.printNumber("CU count", CompUnitCount); W.printNumber("Local TU count", LocalTypeUnitCount); W.printNumber("Foreign TU count", ForeignTypeUnitCount); W.printNumber("Bucket count", BucketCount); W.printNumber("Name count", NameCount); W.printHex("Abbreviations table size", AbbrevTableSize); W.startLine() << "Augmentation: '" << AugmentationString << "'\n"; }
// Returns true if we should continue scanning for entries, false if this is the // last (sentinel) entry). In case of a parsing error we also return false, as // it's not possible to recover this entry list (but the other lists may still // parse OK). bool DWARFDebugNames::NameIndex::dumpEntry(ScopedPrinter &W, uint32_t *Offset) const { uint32_t EntryId = *Offset; auto EntryOr = getEntry(Offset); if (!EntryOr) { handleAllErrors(EntryOr.takeError(), [](const SentinelError &) {}, [&W](const ErrorInfoBase &EI) { EI.log(W.startLine()); }); return false; } DictScope EntryScope(W, ("Entry @ 0x" + Twine::utohexstr(EntryId)).str()); EntryOr->dump(W); return true; }
void DWARFDebugNames::NameIndex::dumpName(ScopedPrinter &W, const NameTableEntry &NTE, Optional<uint32_t> Hash) const { DictScope NameScope(W, ("Name " + Twine(NTE.getIndex())).str()); if (Hash) W.printHex("Hash", *Hash); W.startLine() << format("String: 0x%08x", NTE.getStringOffset()); W.getOStream() << " \"" << NTE.getString() << "\"\n"; uint32_t EntryOffset = NTE.getEntryOffset(); while (dumpEntry(W, &EntryOffset)) /*empty*/; }
void DWARFDebugNames::NameIndex::dumpName(ScopedPrinter &W, uint32_t Index, Optional<uint32_t> Hash) const { const DataExtractor &SS = Section.StringSection; NameTableEntry NTE = getNameTableEntry(Index); DictScope NameScope(W, ("Name " + Twine(Index)).str()); if (Hash) W.printHex("Hash", *Hash); W.startLine() << format("String: 0x%08x", NTE.StringOffset); W.getOStream() << " \"" << SS.getCStr(&NTE.StringOffset) << "\"\n"; while (dumpEntry(W, &NTE.EntryOffset)) /*empty*/; }
LLVM_DUMP_METHOD void DWARFDebugNames::NameIndex::dump(ScopedPrinter &W) const { DictScope UnitScope(W, ("Name Index @ 0x" + Twine::utohexstr(Base)).str()); Hdr.dump(W); dumpCUs(W); dumpLocalTUs(W); dumpForeignTUs(W); dumpAbbreviations(W); if (Hdr.BucketCount > 0) { for (uint32_t Bucket = 0; Bucket < Hdr.BucketCount; ++Bucket) dumpBucket(W, Bucket); return; } W.startLine() << "Hash table not present\n"; for (uint32_t Index = 1; Index <= Hdr.NameCount; ++Index) dumpName(W, Index, None); }
void DWARFDebugNames::NameIndex::dumpCUs(ScopedPrinter &W) const { ListScope CUScope(W, "Compilation Unit offsets"); for (uint32_t CU = 0; CU < Hdr.CompUnitCount; ++CU) W.startLine() << format("CU[%u]: 0x%08x\n", CU, getCUOffset(CU)); }
/// Dumps the specified object file. static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer) { std::unique_ptr<ObjDumper> Dumper; if (std::error_code EC = createDumper(Obj, Writer, Dumper)) reportError(Obj->getFileName(), EC); if (opts::Output == opts::LLVM) { Writer.startLine() << "\n"; Writer.printString("File", Obj->getFileName()); Writer.printString("Format", Obj->getFileFormatName()); Writer.printString("Arch", Triple::getArchTypeName( (llvm::Triple::ArchType)Obj->getArch())); Writer.printString("AddressSize", formatv("{0}bit", 8 * Obj->getBytesInAddress())); Dumper->printLoadName(); } if (opts::FileHeaders) Dumper->printFileHeaders(); if (opts::SectionHeaders) Dumper->printSectionHeaders(); if (opts::Relocations) Dumper->printRelocations(); if (opts::DynRelocs) Dumper->printDynamicRelocations(); if (opts::Symbols || opts::DynamicSymbols) Dumper->printSymbols(opts::Symbols, opts::DynamicSymbols); if (opts::HashSymbols) Dumper->printHashSymbols(); if (opts::UnwindInfo) Dumper->printUnwindInfo(); if (opts::DynamicTable) Dumper->printDynamicTable(); if (opts::NeededLibraries) Dumper->printNeededLibraries(); if (opts::ProgramHeaders || opts::SectionMapping == cl::BOU_TRUE) Dumper->printProgramHeaders(opts::ProgramHeaders, opts::SectionMapping); if (!opts::StringDump.empty()) llvm::for_each(opts::StringDump, [&Dumper, Obj](StringRef SectionName) { Dumper->printSectionAsString(Obj, SectionName); }); if (!opts::HexDump.empty()) llvm::for_each(opts::HexDump, [&Dumper, Obj](StringRef SectionName) { Dumper->printSectionAsHex(Obj, SectionName); }); if (opts::HashTable) Dumper->printHashTable(); if (opts::GnuHashTable) Dumper->printGnuHashTable(); if (opts::VersionInfo) Dumper->printVersionInfo(); if (Obj->isELF()) { if (opts::ELFLinkerOptions) Dumper->printELFLinkerOptions(); if (Obj->getArch() == llvm::Triple::arm) if (opts::ARMAttributes) Dumper->printAttributes(); if (isMipsArch(Obj->getArch())) { if (opts::MipsPLTGOT) Dumper->printMipsPLTGOT(); if (opts::MipsABIFlags) Dumper->printMipsABIFlags(); if (opts::MipsReginfo) Dumper->printMipsReginfo(); if (opts::MipsOptions) Dumper->printMipsOptions(); } if (opts::SectionGroups) Dumper->printGroupSections(); if (opts::HashHistogram) Dumper->printHashHistogram(); if (opts::CGProfile) Dumper->printCGProfile(); if (opts::Addrsig) Dumper->printAddrsig(); if (opts::Notes) Dumper->printNotes(); } if (Obj->isCOFF()) { if (opts::COFFImports) Dumper->printCOFFImports(); if (opts::COFFExports) Dumper->printCOFFExports(); if (opts::COFFDirectives) Dumper->printCOFFDirectives(); if (opts::COFFBaseRelocs) Dumper->printCOFFBaseReloc(); if (opts::COFFDebugDirectory) Dumper->printCOFFDebugDirectory(); if (opts::COFFResources) Dumper->printCOFFResources(); if (opts::COFFLoadConfig) Dumper->printCOFFLoadConfig(); if (opts::Addrsig) Dumper->printAddrsig(); if (opts::CodeView) Dumper->printCodeViewDebugInfo(); if (opts::CodeViewMergedTypes) Dumper->mergeCodeViewTypes(CVTypes.IDTable, CVTypes.TypeTable, CVTypes.GlobalIDTable, CVTypes.GlobalTypeTable, opts::CodeViewEnableGHash); } if (Obj->isMachO()) { if (opts::MachODataInCode) Dumper->printMachODataInCode(); if (opts::MachOIndirectSymbols) Dumper->printMachOIndirectSymbols(); if (opts::MachOLinkerOptions) Dumper->printMachOLinkerOptions(); if (opts::MachOSegment) Dumper->printMachOSegment(); if (opts::MachOVersionMin) Dumper->printMachOVersionMin(); if (opts::MachODysymtab) Dumper->printMachODysymtab(); } if (opts::PrintStackMap) Dumper->printStackMap(); }