| //===- DWARFDebugPubTable.cpp ---------------------------------------------===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h" | |
| #include "llvm/ADT/StringRef.h" | |
| #include "llvm/BinaryFormat/Dwarf.h" | |
| #include "llvm/Support/DataExtractor.h" | |
| #include "llvm/Support/Format.h" | |
| #include "llvm/Support/raw_ostream.h" | |
| #include <cstdint> | |
| using namespace llvm; | |
| using namespace dwarf; | |
| DWARFDebugPubTable::DWARFDebugPubTable(StringRef Data, bool LittleEndian, | |
| bool GnuStyle) | |
| : GnuStyle(GnuStyle) { | |
| DataExtractor PubNames(Data, LittleEndian, 0); | |
| uint32_t Offset = 0; | |
| while (PubNames.isValidOffset(Offset)) { | |
| Sets.push_back({}); | |
| Set &SetData = Sets.back(); | |
| SetData.Length = PubNames.getU32(&Offset); | |
| SetData.Version = PubNames.getU16(&Offset); | |
| SetData.Offset = PubNames.getU32(&Offset); | |
| SetData.Size = PubNames.getU32(&Offset); | |
| while (Offset < Data.size()) { | |
| uint32_t DieRef = PubNames.getU32(&Offset); | |
| if (DieRef == 0) | |
| break; | |
| uint8_t IndexEntryValue = GnuStyle ? PubNames.getU8(&Offset) : 0; | |
| StringRef Name = PubNames.getCStrRef(&Offset); | |
| SetData.Entries.push_back( | |
| {DieRef, PubIndexEntryDescriptor(IndexEntryValue), Name}); | |
| } | |
| } | |
| } | |
| void DWARFDebugPubTable::dump(raw_ostream &OS) const { | |
| for (const Set &S : Sets) { | |
| OS << "length = " << format("0x%08x", S.Length); | |
| OS << " version = " << format("0x%04x", S.Version); | |
| OS << " unit_offset = " << format("0x%08x", S.Offset); | |
| OS << " unit_size = " << format("0x%08x", S.Size) << '\n'; | |
| OS << (GnuStyle ? "Offset Linkage Kind Name\n" | |
| : "Offset Name\n"); | |
| for (const Entry &E : S.Entries) { | |
| OS << format("0x%8.8x ", E.SecOffset); | |
| if (GnuStyle) { | |
| StringRef EntryLinkage = | |
| GDBIndexEntryLinkageString(E.Descriptor.Linkage); | |
| StringRef EntryKind = dwarf::GDBIndexEntryKindString(E.Descriptor.Kind); | |
| OS << format("%-8s", EntryLinkage.data()) << ' ' | |
| << format("%-8s", EntryKind.data()) << ' '; | |
| } | |
| OS << '\"' << E.Name << "\"\n"; | |
| } | |
| } | |
| } |