10b57cec5SDimitry Andric //===- DWARFDebugPubTable.cpp ---------------------------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h" 100b57cec5SDimitry Andric #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h" 110b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 120b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h" 130b57cec5SDimitry Andric #include "llvm/Support/DataExtractor.h" 140b57cec5SDimitry Andric #include "llvm/Support/Format.h" 150b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 160b57cec5SDimitry Andric #include <cstdint> 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric using namespace llvm; 190b57cec5SDimitry Andric using namespace dwarf; 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric DWARFDebugPubTable::DWARFDebugPubTable(const DWARFObject &Obj, 220b57cec5SDimitry Andric const DWARFSection &Sec, 230b57cec5SDimitry Andric bool LittleEndian, bool GnuStyle) 240b57cec5SDimitry Andric : GnuStyle(GnuStyle) { 250b57cec5SDimitry Andric DWARFDataExtractor PubNames(Obj, Sec, LittleEndian, 0); 26*8bcb0991SDimitry Andric uint64_t Offset = 0; 270b57cec5SDimitry Andric while (PubNames.isValidOffset(Offset)) { 280b57cec5SDimitry Andric Sets.push_back({}); 290b57cec5SDimitry Andric Set &SetData = Sets.back(); 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric SetData.Length = PubNames.getU32(&Offset); 320b57cec5SDimitry Andric SetData.Version = PubNames.getU16(&Offset); 330b57cec5SDimitry Andric SetData.Offset = PubNames.getRelocatedValue(4, &Offset); 340b57cec5SDimitry Andric SetData.Size = PubNames.getU32(&Offset); 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric while (Offset < Sec.Data.size()) { 370b57cec5SDimitry Andric uint32_t DieRef = PubNames.getU32(&Offset); 380b57cec5SDimitry Andric if (DieRef == 0) 390b57cec5SDimitry Andric break; 400b57cec5SDimitry Andric uint8_t IndexEntryValue = GnuStyle ? PubNames.getU8(&Offset) : 0; 410b57cec5SDimitry Andric StringRef Name = PubNames.getCStrRef(&Offset); 420b57cec5SDimitry Andric SetData.Entries.push_back( 430b57cec5SDimitry Andric {DieRef, PubIndexEntryDescriptor(IndexEntryValue), Name}); 440b57cec5SDimitry Andric } 450b57cec5SDimitry Andric } 460b57cec5SDimitry Andric } 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric void DWARFDebugPubTable::dump(raw_ostream &OS) const { 490b57cec5SDimitry Andric for (const Set &S : Sets) { 500b57cec5SDimitry Andric OS << "length = " << format("0x%08x", S.Length); 510b57cec5SDimitry Andric OS << " version = " << format("0x%04x", S.Version); 52*8bcb0991SDimitry Andric OS << " unit_offset = " << format("0x%08" PRIx64, S.Offset); 530b57cec5SDimitry Andric OS << " unit_size = " << format("0x%08x", S.Size) << '\n'; 540b57cec5SDimitry Andric OS << (GnuStyle ? "Offset Linkage Kind Name\n" 550b57cec5SDimitry Andric : "Offset Name\n"); 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric for (const Entry &E : S.Entries) { 58*8bcb0991SDimitry Andric OS << format("0x%8.8" PRIx64 " ", E.SecOffset); 590b57cec5SDimitry Andric if (GnuStyle) { 600b57cec5SDimitry Andric StringRef EntryLinkage = 610b57cec5SDimitry Andric GDBIndexEntryLinkageString(E.Descriptor.Linkage); 620b57cec5SDimitry Andric StringRef EntryKind = dwarf::GDBIndexEntryKindString(E.Descriptor.Kind); 630b57cec5SDimitry Andric OS << format("%-8s", EntryLinkage.data()) << ' ' 640b57cec5SDimitry Andric << format("%-8s", EntryKind.data()) << ' '; 650b57cec5SDimitry Andric } 660b57cec5SDimitry Andric OS << '\"' << E.Name << "\"\n"; 670b57cec5SDimitry Andric } 680b57cec5SDimitry Andric } 690b57cec5SDimitry Andric } 70