From: Reid Kleckner Date: Fri, 21 Jul 2017 18:28:55 +0000 (+0000) Subject: [PDB] Dump extra info about the publics stream X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cf6f650daf8a9777bfcb73fb70185e7a367ac1c8;p=llvm [PDB] Dump extra info about the publics stream This includes the hash table, the address map, and the thunk table and section offset table. The last two are only used for incremental linking, which LLD doesn't support, so they are less interesting. The hash table is particularly important to get right, since this is the one of the streams that debuggers use to translate addresses to symbols. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308764 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/DebugInfo/PDB/Native/PublicsStream.h b/include/llvm/DebugInfo/PDB/Native/PublicsStream.h index 9ace826bd8f..bf1950c9005 100644 --- a/include/llvm/DebugInfo/PDB/Native/PublicsStream.h +++ b/include/llvm/DebugInfo/PDB/Native/PublicsStream.h @@ -36,6 +36,8 @@ public: Expected getSymbolArray() const; iterator_range getSymbols(bool *HadError) const; + FixedStreamArray getHashRecords() const { return HashRecords; } + FixedStreamArray getHashBitmap() const { return HashBitmap; } FixedStreamArray getHashBuckets() const { return HashBuckets; } @@ -56,8 +58,8 @@ private: std::unique_ptr Stream; uint32_t NumBuckets = 0; - ArrayRef Bitmap; FixedStreamArray HashRecords; + ArrayRef HashBitmap; FixedStreamArray HashBuckets; FixedStreamArray AddressMap; FixedStreamArray ThunkMap; diff --git a/lib/DebugInfo/PDB/Native/GSI.cpp b/lib/DebugInfo/PDB/Native/GSI.cpp index b219fe275f7..d77676dbd1c 100644 --- a/lib/DebugInfo/PDB/Native/GSI.cpp +++ b/lib/DebugInfo/PDB/Native/GSI.cpp @@ -29,6 +29,7 @@ static Error checkHashHdrVersion(const GSIHashHeader *HashHdr) { } Error readGSIHashBuckets(FixedStreamArray &HashBuckets, + ArrayRef &HashBitmap, const GSIHashHeader *HashHdr, BinaryStreamReader &Reader) { if (auto EC = checkHashHdrVersion(HashHdr)) @@ -36,15 +37,14 @@ Error readGSIHashBuckets(FixedStreamArray &HashBuckets, // Before the actual hash buckets, there is a bitmap of length determined by // IPHR_HASH. - ArrayRef Bitmap; size_t BitmapSizeInBits = alignTo(IPHR_HASH + 1, 32); uint32_t NumBitmapEntries = BitmapSizeInBits / 8; - if (auto EC = Reader.readBytes(Bitmap, NumBitmapEntries)) + if (auto EC = Reader.readBytes(HashBitmap, NumBitmapEntries)) return joinErrors(std::move(EC), make_error(raw_error_code::corrupt_file, "Could not read a bitmap.")); uint32_t NumBuckets = 0; - for (uint8_t B : Bitmap) + for (uint8_t B : HashBitmap) NumBuckets += countPopulation(B); // Hash buckets follow. diff --git a/lib/DebugInfo/PDB/Native/GSI.h b/lib/DebugInfo/PDB/Native/GSI.h index 9e63bc83548..ce2b301b3cc 100644 --- a/lib/DebugInfo/PDB/Native/GSI.h +++ b/lib/DebugInfo/PDB/Native/GSI.h @@ -41,7 +41,7 @@ namespace pdb { static const unsigned IPHR_HASH = 4096; /// Header of the hash tables found in the globals and publics sections. -/// Based on GSIHashHeader in +/// Based on GSIHashHdr in /// https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h struct GSIHashHeader { enum : unsigned { diff --git a/lib/DebugInfo/PDB/Native/PublicsStream.cpp b/lib/DebugInfo/PDB/Native/PublicsStream.cpp index 9c3e654f808..3b4e18de8f9 100644 --- a/lib/DebugInfo/PDB/Native/PublicsStream.cpp +++ b/lib/DebugInfo/PDB/Native/PublicsStream.cpp @@ -75,7 +75,7 @@ Error PublicsStream::reload() { if (auto EC = readGSIHashRecords(HashRecords, HashHdr, Reader)) return EC; - if (auto EC = readGSIHashBuckets(HashBuckets, HashHdr, Reader)) + if (auto EC = readGSIHashBuckets(HashBuckets, HashBitmap, HashHdr, Reader)) return EC; NumBuckets = HashBuckets.size(); diff --git a/tools/llvm-pdbutil/DumpOutputStyle.cpp b/tools/llvm-pdbutil/DumpOutputStyle.cpp index 01c7481c308..07fc38d4406 100644 --- a/tools/llvm-pdbutil/DumpOutputStyle.cpp +++ b/tools/llvm-pdbutil/DumpOutputStyle.cpp @@ -882,6 +882,52 @@ Error DumpOutputStyle::dumpPublics() { P.formatLine("Error while processing public symbol records. {0}", toString(std::move(EC))); + // Return early if we aren't dumping public hash table and address map info. + if (!opts::dump::DumpPublicExtras) + return Error::success(); + + P.formatLine("Hash Records"); + { + AutoIndent Indent2(P); + for (const PSHashRecord &HR : Publics.getHashRecords()) + P.formatLine("off = {0}, refcnt = {1}", uint32_t(HR.Off), + uint32_t(HR.CRef)); + } + + // FIXME: Dump the bitmap. + + P.formatLine("Hash Buckets"); + { + AutoIndent Indent2(P); + for (uint32_t Hash : Publics.getHashBuckets()) + P.formatLine("{0:x8}", Hash); + } + + P.formatLine("Address Map"); + { + // These are offsets into the publics stream sorted by secidx:secrel. + AutoIndent Indent2(P); + for (uint32_t Addr : Publics.getAddressMap()) + P.formatLine("off = {0}", Addr); + } + + // The thunk map is optional debug info used for ILT thunks. + if (!Publics.getThunkMap().empty()) { + P.formatLine("Thunk Map"); + AutoIndent Indent2(P); + for (uint32_t Addr : Publics.getThunkMap()) + P.formatLine("{0:x8}", Addr); + } + + // The section offsets table appears to be empty when incremental linking + // isn't in use. + if (!Publics.getSectionOffsets().empty()) { + P.formatLine("Section Offsets"); + AutoIndent Indent2(P); + for (const SectionOffset &SO : Publics.getSectionOffsets()) + P.formatLine("{0:x4}:{1:x8}", uint16_t(SO.Isect), uint32_t(SO.Off)); + } + return Error::success(); } diff --git a/tools/llvm-pdbutil/llvm-pdbutil.cpp b/tools/llvm-pdbutil/llvm-pdbutil.cpp index f2bd194622e..338e4ee9250 100644 --- a/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -452,6 +452,9 @@ cl::opt DumpTypeDependents( // SYMBOL OPTIONS cl::opt DumpPublics("publics", cl::desc("dump Publics stream data"), cl::cat(SymbolOptions), cl::sub(DumpSubcommand)); +cl::opt DumpPublicExtras("public-extras", + cl::desc("dump Publics hashes and address maps"), + cl::cat(SymbolOptions), cl::sub(DumpSubcommand)); cl::opt DumpSymbols("symbols", cl::desc("dump module symbols"), cl::cat(SymbolOptions), cl::sub(DumpSubcommand)); diff --git a/tools/llvm-pdbutil/llvm-pdbutil.h b/tools/llvm-pdbutil/llvm-pdbutil.h index 4e92e639a12..4aeff99d6c7 100644 --- a/tools/llvm-pdbutil/llvm-pdbutil.h +++ b/tools/llvm-pdbutil/llvm-pdbutil.h @@ -144,6 +144,7 @@ extern llvm::cl::list DumpIdIndex; extern llvm::cl::opt DumpSymbols; extern llvm::cl::opt DumpSymRecordBytes; extern llvm::cl::opt DumpPublics; +extern llvm::cl::opt DumpPublicExtras; extern llvm::cl::opt DumpSectionContribs; extern llvm::cl::opt DumpSectionMap; extern llvm::cl::opt DumpModules;