summaryrefslogtreecommitdiff
path: root/tools/llvm-pdbdump
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-pdbdump')
-rw-r--r--tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp2
-rw-r--r--tools/llvm-pdbdump/Diff.cpp28
-rw-r--r--tools/llvm-pdbdump/LLVMOutputStyle.cpp26
-rw-r--r--tools/llvm-pdbdump/YAMLOutputStyle.cpp9
-rw-r--r--tools/llvm-pdbdump/llvm-pdbdump.cpp55
5 files changed, 58 insertions, 62 deletions
diff --git a/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp b/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp
index 7c680ebb94cfd..b38b36532a719 100644
--- a/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp
+++ b/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp
@@ -13,8 +13,8 @@
#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
#include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
+#include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
#include "llvm/DebugInfo/PDB/Native/RawError.h"
-#include "llvm/DebugInfo/PDB/Native/StringTable.h"
using namespace llvm;
using namespace llvm::codeview;
diff --git a/tools/llvm-pdbdump/Diff.cpp b/tools/llvm-pdbdump/Diff.cpp
index 8c02d36044d82..418c2361ac322 100644
--- a/tools/llvm-pdbdump/Diff.cpp
+++ b/tools/llvm-pdbdump/Diff.cpp
@@ -15,8 +15,8 @@
#include "llvm/DebugInfo/PDB/Native/Formatters.h"
#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
+#include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
-#include "llvm/DebugInfo/PDB/Native/StringTable.h"
#include "llvm/Support/FormatAdapters.h"
#include "llvm/Support/FormatProviders.h"
@@ -394,11 +394,17 @@ Error DiffStyle::diffStringTable() {
StringRef S1, S2;
if (I < IdList1.size()) {
Id1 = IdList1[I];
- S1 = ST1.getStringForID(*Id1);
+ if (auto Result = ST1.getStringForID(*Id1))
+ S1 = *Result;
+ else
+ return Result.takeError();
}
if (I < IdList2.size()) {
Id2 = IdList2[I];
- S2 = ST2.getStringForID(*Id2);
+ if (auto Result = ST2.getStringForID(*Id2))
+ S2 = *Result;
+ else
+ return Result.takeError();
}
if (Id1 == Id2 && S1 == S2)
continue;
@@ -418,10 +424,18 @@ Error DiffStyle::diffStringTable() {
std::vector<StringRef> Strings1, Strings2;
Strings1.reserve(IdList1.size());
Strings2.reserve(IdList2.size());
- for (auto ID : IdList1)
- Strings1.push_back(ST1.getStringForID(ID));
- for (auto ID : IdList2)
- Strings2.push_back(ST2.getStringForID(ID));
+ for (auto ID : IdList1) {
+ auto S = ST1.getStringForID(ID);
+ if (!S)
+ return S.takeError();
+ Strings1.push_back(*S);
+ }
+ for (auto ID : IdList2) {
+ auto S = ST2.getStringForID(ID);
+ if (!S)
+ return S.takeError();
+ Strings2.push_back(*S);
+ }
SmallVector<StringRef, 64> OnlyP;
SmallVector<StringRef, 64> OnlyQ;
diff --git a/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/tools/llvm-pdbdump/LLVMOutputStyle.cpp
index f3e28e0b08fc5..ec1325ff23356 100644
--- a/tools/llvm-pdbdump/LLVMOutputStyle.cpp
+++ b/tools/llvm-pdbdump/LLVMOutputStyle.cpp
@@ -525,14 +525,17 @@ Error LLVMOutputStyle::dumpStringTable() {
DictScope D(P, "String Table");
for (uint32_t I : IS->name_ids()) {
- StringRef S = IS->getStringForID(I);
- if (!S.empty()) {
- llvm::SmallString<32> Str;
- Str.append("'");
- Str.append(S);
- Str.append("'");
- P.printString(Str);
- }
+ auto ES = IS->getStringForID(I);
+ if (!ES)
+ return ES.takeError();
+
+ if (ES->empty())
+ continue;
+ llvm::SmallString<32> Str;
+ Str.append("'");
+ Str.append(*ES);
+ Str.append("'");
+ P.printString(Str);
}
return Error::success();
}
@@ -688,8 +691,11 @@ Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) {
const auto &ST = *ExpectedST;
for (const auto &E : Tpi->getHashAdjusters()) {
DictScope DHA(P);
- StringRef Name = ST.getStringForID(E.first);
- P.printString("Type", Name);
+ auto Name = ST.getStringForID(E.first);
+ if (!Name)
+ return Name.takeError();
+
+ P.printString("Type", *Name);
P.printHex("TI", E.second);
}
}
diff --git a/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/tools/llvm-pdbdump/YAMLOutputStyle.cpp
index 807d7f8b82e1e..b94b5a4abf37c 100644
--- a/tools/llvm-pdbdump/YAMLOutputStyle.cpp
+++ b/tools/llvm-pdbdump/YAMLOutputStyle.cpp
@@ -233,9 +233,12 @@ Error YAMLOutputStyle::dumpStringTable() {
const auto &ST = ExpectedST.get();
for (auto ID : ST.name_ids()) {
- StringRef S = ST.getStringForID(ID);
- if (!S.empty())
- Obj.StringTable->push_back(S);
+ auto S = ST.getStringForID(ID);
+ if (!S)
+ return S.takeError();
+ if (S->empty())
+ continue;
+ Obj.StringTable->push_back(*S);
}
return Error::success();
}
diff --git a/tools/llvm-pdbdump/llvm-pdbdump.cpp b/tools/llvm-pdbdump/llvm-pdbdump.cpp
index 642e169613ba7..4cdd87620c866 100644
--- a/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ b/tools/llvm-pdbdump/llvm-pdbdump.cpp
@@ -47,9 +47,9 @@
#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
#include "llvm/DebugInfo/PDB/Native/PDBFileBuilder.h"
+#include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h"
#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
#include "llvm/DebugInfo/PDB/Native/RawError.h"
-#include "llvm/DebugInfo/PDB/Native/StringTableBuilder.h"
#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
#include "llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h"
#include "llvm/DebugInfo/PDB/PDB.h"
@@ -424,21 +424,6 @@ cl::list<std::string> InputFilename(cl::Positional,
static ExitOnError ExitOnErr;
-static uint32_t
-getFileChecksumOffset(StringRef FileName,
- ModuleDebugFileChecksumFragment &Checksums,
- StringTableBuilder &Strings) {
- // The offset in the line info record is the offset of the checksum
- // entry for the corresponding file. That entry then contains an
- // offset into the global string table of the file name. So to
- // compute the proper offset to write into the line info record, we
- // must first get its offset in the global string table, then ask the
- // checksum builder to find the offset in its serialized buffer that
- // it mapped that filename string table offset to.
- uint32_t StringOffset = Strings.insert(FileName);
- return Checksums.mapChecksumOffset(StringOffset);
-}
-
static void yamlToPdb(StringRef Path) {
BumpPtrAllocator Allocator;
ErrorOr<std::unique_ptr<MemoryBuffer>> ErrorOrBuffer =
@@ -490,6 +475,8 @@ static void yamlToPdb(StringRef Path) {
for (auto F : Info.Features)
InfoBuilder.addFeature(F);
+ auto &Strings = Builder.getStringTableBuilder().getStrings();
+
const auto &Dbi = YamlObj.DbiStream.getValueOr(DefaultDbiStream);
auto &DbiBuilder = Builder.getDbiBuilder();
DbiBuilder.setAge(Dbi.Age);
@@ -516,35 +503,24 @@ static void yamlToPdb(StringRef Path) {
// File Checksums must be emitted before line information, because line
// info records use offsets into the checksum buffer to reference a file's
// source file name.
- auto Checksums = llvm::make_unique<ModuleDebugFileChecksumFragment>();
+ auto Checksums =
+ llvm::make_unique<ModuleDebugFileChecksumFragment>(Strings);
auto &ChecksumRef = *Checksums;
if (!FLI.FileChecksums.empty()) {
- auto &Strings = Builder.getStringTableBuilder();
- for (auto &FC : FLI.FileChecksums) {
- uint32_t STOffset = Strings.insert(FC.FileName);
- Checksums->addChecksum(STOffset, FC.Kind, FC.ChecksumBytes.Bytes);
- }
+ for (auto &FC : FLI.FileChecksums)
+ Checksums->addChecksum(FC.FileName, FC.Kind, FC.ChecksumBytes.Bytes);
}
ModiBuilder.setC13FileChecksums(std::move(Checksums));
- // FIXME: StringTable / StringTableBuilder should really be in
- // DebugInfoCodeView. This would allow us to construct the
- // ModuleDebugLineFragment with a reference to the string table,
- // and we could just pass strings around rather than having to
- // remember how to calculate the right offset.
- auto &Strings = Builder.getStringTableBuilder();
-
for (const auto &Fragment : FLI.LineFragments) {
- auto Lines = llvm::make_unique<ModuleDebugLineFragment>();
+ auto Lines =
+ llvm::make_unique<ModuleDebugLineFragment>(ChecksumRef, Strings);
Lines->setCodeSize(Fragment.CodeSize);
Lines->setRelocationAddress(Fragment.RelocSegment,
Fragment.RelocOffset);
Lines->setFlags(Fragment.Flags);
for (const auto &LC : Fragment.Blocks) {
- uint32_t ChecksumOffset =
- getFileChecksumOffset(LC.FileName, ChecksumRef, Strings);
-
- Lines->createBlock(ChecksumOffset);
+ Lines->createBlock(LC.FileName);
if (Lines->hasColumnInfo()) {
for (const auto &Item : zip(LC.Lines, LC.Columns)) {
auto &L = std::get<0>(Item);
@@ -567,18 +543,15 @@ static void yamlToPdb(StringRef Path) {
for (const auto &Inlinee : FLI.Inlinees) {
auto Inlinees = llvm::make_unique<ModuleDebugInlineeLineFragment>(
- Inlinee.HasExtraFiles);
+ ChecksumRef, Inlinee.HasExtraFiles);
for (const auto &Site : Inlinee.Sites) {
- uint32_t FileOff =
- getFileChecksumOffset(Site.FileName, ChecksumRef, Strings);
-
- Inlinees->addInlineSite(Site.Inlinee, FileOff, Site.SourceLineNum);
+ Inlinees->addInlineSite(Site.Inlinee, Site.FileName,
+ Site.SourceLineNum);
if (!Inlinee.HasExtraFiles)
continue;
for (auto EF : Site.ExtraFiles) {
- FileOff = getFileChecksumOffset(EF, ChecksumRef, Strings);
- Inlinees->addExtraFile(FileOff);
+ Inlinees->addExtraFile(EF);
}
}
ModiBuilder.addC13Fragment(std::move(Inlinees));