diff options
| author | Pavel Labath <labath@google.com> | 2018-06-01 10:33:11 +0000 |
|---|---|---|
| committer | Pavel Labath <labath@google.com> | 2018-06-01 10:33:11 +0000 |
| commit | d6ca063907988beee6fbbd99aa436996a2d621ca (patch) | |
| tree | 05f8ae2c718cc28c78793feb676243d2934add9d /llvm/lib/DebugInfo | |
| parent | 823b056f583f24961be8a1ca65dcc1aeb2fff096 (diff) | |
| download | bcm5719-llvm-d6ca063907988beee6fbbd99aa436996a2d621ca.tar.gz bcm5719-llvm-d6ca063907988beee6fbbd99aa436996a2d621ca.zip | |
DWARFAcceleratorTable: Add an iterator-based api for accessing names in the index
Summary:
Back when we were introducing the DWARF v5 name index, there was a
short discussion whether we shouldn't have a nicer api for iterating
over the index. At that time, I did not find it necessary since the
iteration over names was done only from within the index itself (and I
figured the internal implementation can deal with a slightly rough
interface).
However, now I ran into a use for this kind of API in LLDB (for finding
all names matching a regular expression), so it looked like a nice
opportunity to introduce one. To make the API more useful, I've made the
NameTableEntry class a bit smarter: it now stores the string section
reference (so it can return its name) and its position in the name index
(mainly useful for dumping/logging).
I also convert the internal users to use the new API, which also gives
test coverage for the added code.
Reviewers: JDevlieghere, aprantl, dblaikie
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D47590
llvm-svn: 333738
Diffstat (limited to 'llvm/lib/DebugInfo')
| -rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp | 34 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 37 |
2 files changed, 34 insertions, 37 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp index 852536b8b11..c2ba9e6027b 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp @@ -635,7 +635,7 @@ DWARFDebugNames::NameIndex::getNameTableEntry(uint32_t Index) const { uint32_t StringOffset = AS.getRelocatedValue(4, &StringOffsetOffset); uint32_t EntryOffset = AS.getU32(&EntryOffsetOffset); EntryOffset += EntriesBase; - return {StringOffset, EntryOffset}; + return {Section.StringSection, Index, StringOffset, EntryOffset}; } uint32_t @@ -670,19 +670,18 @@ bool DWARFDebugNames::NameIndex::dumpEntry(ScopedPrinter &W, return true; } -void DWARFDebugNames::NameIndex::dumpName(ScopedPrinter &W, uint32_t Index, +void DWARFDebugNames::NameIndex::dumpName(ScopedPrinter &W, + const NameTableEntry &NTE, Optional<uint32_t> Hash) const { - const DataExtractor &SS = Section.StringSection; - NameTableEntry NTE = getNameTableEntry(Index); - - DictScope NameScope(W, ("Name " + Twine(Index)).str()); + DictScope NameScope(W, ("Name " + Twine(NTE.getIndex())).str()); if (Hash) W.printHex("Hash", *Hash); - W.startLine() << format("String: 0x%08x", NTE.StringOffset); - W.getOStream() << " \"" << SS.getCStr(&NTE.StringOffset) << "\"\n"; + W.startLine() << format("String: 0x%08x", NTE.getStringOffset()); + W.getOStream() << " \"" << NTE.getString() << "\"\n"; - while (dumpEntry(W, &NTE.EntryOffset)) + uint32_t EntryOffset = NTE.getEntryOffset(); + while (dumpEntry(W, &EntryOffset)) /*empty*/; } @@ -736,7 +735,7 @@ void DWARFDebugNames::NameIndex::dumpBucket(ScopedPrinter &W, if (Hash % Hdr.BucketCount != Bucket) break; - dumpName(W, Index, Hash); + dumpName(W, getNameTableEntry(Index), Hash); } } @@ -755,8 +754,8 @@ LLVM_DUMP_METHOD void DWARFDebugNames::NameIndex::dump(ScopedPrinter &W) const { } W.startLine() << "Hash table not present\n"; - for (uint32_t Index = 1; Index <= Hdr.NameCount; ++Index) - dumpName(W, Index, None); + for (NameTableEntry NTE : *this) + dumpName(W, NTE, None); } llvm::Error DWARFDebugNames::extract() { @@ -787,10 +786,9 @@ DWARFDebugNames::ValueIterator::findEntryOffsetInCurrentIndex() { const Header &Hdr = CurrentIndex->Hdr; if (Hdr.BucketCount == 0) { // No Hash Table, We need to search through all names in the Name Index. - for (uint32_t Index = 1; Index <= Hdr.NameCount; ++Index) { - NameTableEntry NTE = CurrentIndex->getNameTableEntry(Index); - if (CurrentIndex->Section.StringSection.getCStr(&NTE.StringOffset) == Key) - return NTE.EntryOffset; + for (NameTableEntry NTE : *CurrentIndex) { + if (NTE.getString() == Key) + return NTE.getEntryOffset(); } return None; } @@ -810,8 +808,8 @@ DWARFDebugNames::ValueIterator::findEntryOffsetInCurrentIndex() { return None; // End of bucket NameTableEntry NTE = CurrentIndex->getNameTableEntry(Index); - if (CurrentIndex->Section.StringSection.getCStr(&NTE.StringOffset) == Key) - return NTE.EntryOffset; + if (NTE.getString() == Key) + return NTE.getEntryOffset(); } return None; } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index 67da9ccaefd..fe44071d9a2 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -920,8 +920,7 @@ DWARFVerifier::verifyNameIndexBuckets(const DWARFDebugNames::NameIndex &NI, if (Hash % NI.getBucketCount() != B.Bucket) break; - auto NTE = NI.getNameTableEntry(Idx); - const char *Str = StrData.getCStr(&NTE.StringOffset); + const char *Str = NI.getNameTableEntry(Idx).getString(); if (caseFoldingDjbHash(Str) != Hash) { error() << formatv("Name Index @ {0:x}: String ({1}) at index {2} " "hashes to {3:x}, but " @@ -1057,30 +1056,29 @@ static SmallVector<StringRef, 2> getNames(const DWARFDie &DIE) { return Result; } -unsigned -DWARFVerifier::verifyNameIndexEntries(const DWARFDebugNames::NameIndex &NI, - uint32_t Name, - const DataExtractor &StrData) { +unsigned DWARFVerifier::verifyNameIndexEntries( + const DWARFDebugNames::NameIndex &NI, + const DWARFDebugNames::NameTableEntry &NTE) { // Verifying type unit indexes not supported. if (NI.getLocalTUCount() + NI.getForeignTUCount() > 0) return 0; - DWARFDebugNames::NameTableEntry NTE = NI.getNameTableEntry(Name); - const char *CStr = StrData.getCStr(&NTE.StringOffset); + const char *CStr = NTE.getString(); if (!CStr) { error() << formatv( "Name Index @ {0:x}: Unable to get string associated with name {1}.\n", - NI.getUnitOffset(), Name); + NI.getUnitOffset(), NTE.getIndex()); return 1; } StringRef Str(CStr); unsigned NumErrors = 0; unsigned NumEntries = 0; - uint32_t EntryID = NTE.EntryOffset; - Expected<DWARFDebugNames::Entry> EntryOr = NI.getEntry(&NTE.EntryOffset); - for (; EntryOr; ++NumEntries, EntryID = NTE.EntryOffset, - EntryOr = NI.getEntry(&NTE.EntryOffset)) { + uint32_t EntryID = NTE.getEntryOffset(); + uint32_t NextEntryID = EntryID; + Expected<DWARFDebugNames::Entry> EntryOr = NI.getEntry(&NextEntryID); + for (; EntryOr; ++NumEntries, EntryID = NextEntryID, + EntryOr = NI.getEntry(&NextEntryID)) { uint32_t CUIndex = *EntryOr->getCUIndex(); if (CUIndex > NI.getCUCount()) { error() << formatv("Name Index @ {0:x}: Entry @ {1:x} contains an " @@ -1129,13 +1127,14 @@ DWARFVerifier::verifyNameIndexEntries(const DWARFDebugNames::NameIndex &NI, return; error() << formatv("Name Index @ {0:x}: Name {1} ({2}) is " "not associated with any entries.\n", - NI.getUnitOffset(), Name, Str); + NI.getUnitOffset(), NTE.getIndex(), Str); ++NumErrors; }, [&](const ErrorInfoBase &Info) { - error() << formatv( - "Name Index @ {0:x}: Name {1} ({2}): {3}\n", - NI.getUnitOffset(), Name, Str, Info.message()); + error() + << formatv("Name Index @ {0:x}: Name {1} ({2}): {3}\n", + NI.getUnitOffset(), NTE.getIndex(), Str, + Info.message()); ++NumErrors; }); return NumErrors; @@ -1302,8 +1301,8 @@ unsigned DWARFVerifier::verifyDebugNames(const DWARFSection &AccelSection, if (NumErrors > 0) return NumErrors; for (const auto &NI : AccelTable) - for (uint64_t Name = 1; Name <= NI.getNameCount(); ++Name) - NumErrors += verifyNameIndexEntries(NI, Name, StrData); + for (DWARFDebugNames::NameTableEntry NTE : NI) + NumErrors += verifyNameIndexEntries(NI, NTE); if (NumErrors > 0) return NumErrors; |

