summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2016-06-03 05:52:57 +0000
committerZachary Turner <zturner@google.com>2016-06-03 05:52:57 +0000
commit3df1bfaaec1c70c6501f01868bcd81764c9582e9 (patch)
treeb1451ece7ed3236beda44a10c3e9f514decd66dd /llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
parente7ae106147bfa93390e1b275829c93cc60712aa4 (diff)
downloadbcm5719-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.cpp54
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;
OpenPOWER on IntegriCloud