diff options
author | Zachary Turner <zturner@google.com> | 2016-06-03 05:52:57 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-06-03 05:52:57 +0000 |
commit | 3df1bfaaec1c70c6501f01868bcd81764c9582e9 (patch) | |
tree | b1451ece7ed3236beda44a10c3e9f514decd66dd /llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | |
parent | e7ae106147bfa93390e1b275829c93cc60712aa4 (diff) | |
download | bcm5719-llvm-3df1bfaaec1c70c6501f01868bcd81764c9582e9.tar.gz bcm5719-llvm-3df1bfaaec1c70c6501f01868bcd81764c9582e9.zip |
[pdb] Print out file names instead of file offsets.
When printing line information and file checksums, we were printing
the file offset field from the struct header. This teaches
llvm-pdbdump how to turn those numbers into the filename. In the
case of file checksums, this is done by looking in the global
string table. In the case of line contributions, this is done
by indexing into the file names buffer of the DBI stream. Why
they use a different technique I don't know.
llvm-svn: 271630
Diffstat (limited to 'llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp')
-rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index dcaf494ee5c..1a9d5583486 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -522,11 +522,19 @@ static Error dumpDbiStream(ScopedPrinter &P, PDBFile &File, // substream types types. class RecordVisitor : public codeview::IModuleSubstreamVisitor { public: - RecordVisitor(ScopedPrinter &P) : P(P) {} + RecordVisitor(ScopedPrinter &P, PDBFile &F) : P(P), F(F) {} Error visitUnknown(ModuleSubstreamKind Kind, - StreamRef Data) override { + StreamRef Stream) override { DictScope DD(P, "Unknown"); - return printBinaryData(Data); + ArrayRef<uint8_t> Data; + StreamReader R(Stream); + if (auto EC = R.readBytes(Data, R.bytesRemaining())) { + return make_error<RawError>( + raw_error_code::corrupt_file, + "DBI stream contained corrupt line info record"); + } + P.printBinaryBlock("Data", Data); + return Error::success(); } Error visitFileChecksums(StreamRef Data, @@ -534,7 +542,11 @@ static Error dumpDbiStream(ScopedPrinter &P, PDBFile &File, DictScope DD(P, "FileChecksums"); for (const auto &C : Checksums) { DictScope DDD(P, "Checksum"); - P.printNumber("FileNameOffset", C.FileNameOffset); + if (auto Result = getFileNameForOffset(C.FileNameOffset)) + P.printString("FileName", Result.get()); + else + return Result.takeError(); + P.flush(); P.printEnum("Kind", uint8_t(C.Kind), getFileChecksumNames()); P.printBinaryBlock("Checksum", C.Checksum); } @@ -545,7 +557,11 @@ static Error dumpDbiStream(ScopedPrinter &P, PDBFile &File, const LineInfoArray &Lines) override { DictScope DD(P, "Lines"); for (const auto &L : Lines) { - P.printNumber("FileOffset", L.Offset); + if (auto Result = getFileNameForOffset2(L.NameIndex)) + P.printString("FileName", Result.get()); + else + return Result.takeError(); + P.flush(); for (const auto &N : L.LineNumbers) { DictScope DDD(P, "Line"); LineInfo LI(N.Flags); @@ -569,21 +585,25 @@ static Error dumpDbiStream(ScopedPrinter &P, PDBFile &File, } private: - Error printBinaryData(StreamRef Stream) { - ArrayRef<uint8_t> Data; - StreamReader R(Stream); - if (auto EC = R.readBytes(Data, R.bytesRemaining())) { - return make_error<RawError>( - raw_error_code::corrupt_file, - "DBI stream contained corrupt line info record"); - } - P.printBinaryBlock("Data", Data); - P.flush(); - return Error::success(); + Expected<StringRef> getFileNameForOffset(uint32_t Offset) { + auto StringT = F.getStringTable(); + if (auto EC = StringT.takeError()) + return std::move(EC); + NameHashTable &ST = StringT.get(); + return ST.getStringForID(Offset); + } + Expected<StringRef> getFileNameForOffset2(uint32_t Offset) { + auto DbiS = F.getPDBDbiStream(); + if (auto EC = DbiS.takeError()) + return std::move(EC); + auto &DS = DbiS.get(); + return DS.getFileNameForIndex(Offset); } ScopedPrinter &P; + PDBFile &F; }; - RecordVisitor V(P); + + RecordVisitor V(P, File); for (const auto &L : ModS.lines(&HadError)) { if (auto EC = codeview::visitModuleSubstream(L, V)) return EC; |