OSDN Git Service

[pdb] Fix reading of llvm-generated PDBs by cvdump.
authorZachary Turner <zturner@google.com>
Sun, 25 Jun 2017 03:51:42 +0000 (03:51 +0000)
committerZachary Turner <zturner@google.com>
Sun, 25 Jun 2017 03:51:42 +0000 (03:51 +0000)
commite7f7e6d72a6ad3dc16813f468b346761b256f2a4
treec96f3c7e61ee85b0f7d91e70f7f1813f3db8f419
parent0a14fbb39c767b907ec615e08618e807de612051
[pdb] Fix reading of llvm-generated PDBs by cvdump.

If you dump a pdb to yaml, and then round-trip it back to a pdb,
and run cvdump -l <file> on the new pdb, cvdump will generate
output such as this.

*** LINES

** Module: "d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj"

Error: Line number corrupted: invalid file id 0
  <Unknown> (MD5), 0001:00000010-0000001A, line/addr pairs = 3

        5 00000010      6 00000013      7 00000018

Note the error message about the corrupted line number.

It turns out that the problem is that cvdump cannot find the
/names stream (e.g. the global string table), and the reason it
can't find the /names stream is because it doesn't understand
the NameMap that we serialize which tells pdb consumers which
stream has the string table.

Some experimentation shows that if we add items to the hash
table in a specific order before serializing it, cvdump can read
it. This suggests that either we're using the wrong hash function,
or we're serializing something incorrectly, but it will take some
deeper investigation to figure out how / why.  For now, this at
least allows cvdump to read our line information (and incidentally,
produces an identical byte sequence to what Microsoft tools
produce when writing the named stream map).

Differential Revision: https://reviews.llvm.org/D34491

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306233 91177308-0d34-0410-b5e6-96231b3b80d8
lib/DebugInfo/PDB/Native/NamedStreamMap.cpp