1 //===- DWARFDebugPubTable.cpp ---------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
10 #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
11 #include "llvm/ADT/StringRef.h"
12 #include "llvm/BinaryFormat/Dwarf.h"
13 #include "llvm/Support/DataExtractor.h"
14 #include "llvm/Support/Format.h"
15 #include "llvm/Support/raw_ostream.h"
19 using namespace dwarf
;
21 DWARFDebugPubTable::DWARFDebugPubTable(const DWARFObject
&Obj
,
22 const DWARFSection
&Sec
,
23 bool LittleEndian
, bool GnuStyle
)
24 : GnuStyle(GnuStyle
) {
25 DWARFDataExtractor
PubNames(Obj
, Sec
, LittleEndian
, 0);
27 while (PubNames
.isValidOffset(Offset
)) {
29 Set
&SetData
= Sets
.back();
31 SetData
.Length
= PubNames
.getU32(&Offset
);
32 SetData
.Version
= PubNames
.getU16(&Offset
);
33 SetData
.Offset
= PubNames
.getRelocatedValue(4, &Offset
);
34 SetData
.Size
= PubNames
.getU32(&Offset
);
36 while (Offset
< Sec
.Data
.size()) {
37 uint32_t DieRef
= PubNames
.getU32(&Offset
);
40 uint8_t IndexEntryValue
= GnuStyle
? PubNames
.getU8(&Offset
) : 0;
41 StringRef Name
= PubNames
.getCStrRef(&Offset
);
42 SetData
.Entries
.push_back(
43 {DieRef
, PubIndexEntryDescriptor(IndexEntryValue
), Name
});
48 void DWARFDebugPubTable::dump(raw_ostream
&OS
) const {
49 for (const Set
&S
: Sets
) {
50 OS
<< "length = " << format("0x%08x", S
.Length
);
51 OS
<< " version = " << format("0x%04x", S
.Version
);
52 OS
<< " unit_offset = " << format("0x%08" PRIx64
, S
.Offset
);
53 OS
<< " unit_size = " << format("0x%08x", S
.Size
) << '\n';
54 OS
<< (GnuStyle
? "Offset Linkage Kind Name\n"
57 for (const Entry
&E
: S
.Entries
) {
58 OS
<< format("0x%8.8" PRIx64
" ", E
.SecOffset
);
60 StringRef EntryLinkage
=
61 GDBIndexEntryLinkageString(E
.Descriptor
.Linkage
);
62 StringRef EntryKind
= dwarf::GDBIndexEntryKindString(E
.Descriptor
.Kind
);
63 OS
<< format("%-8s", EntryLinkage
.data()) << ' '
64 << format("%-8s", EntryKind
.data()) << ' ';
66 OS
<< '\"' << E
.Name
<< "\"\n";