summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-pdbdump/Diff.cpp26
-rw-r--r--llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp26
-rw-r--r--llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp9
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp80
-rw-r--r--llvm/tools/llvm-readobj/llvm-readobj.h5
5 files changed, 86 insertions, 60 deletions
diff --git a/llvm/tools/llvm-pdbdump/Diff.cpp b/llvm/tools/llvm-pdbdump/Diff.cpp
index ddae9b708b6..418c2361ac3 100644
--- a/llvm/tools/llvm-pdbdump/Diff.cpp
+++ b/llvm/tools/llvm-pdbdump/Diff.cpp
@@ -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/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
index f3e28e0b08f..ec1325ff233 100644
--- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
+++ b/llvm/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/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
index 807d7f8b82e..b94b5a4abf3 100644
--- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
+++ b/llvm/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/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp
index a7088c1c741..04386875b95 100644
--- a/llvm/tools/llvm-readobj/COFFDumper.cpp
+++ b/llvm/tools/llvm-readobj/COFFDumper.cpp
@@ -29,6 +29,7 @@
#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
#include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
+#include "llvm/DebugInfo/CodeView/StringTable.h"
#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
#include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
@@ -124,7 +125,7 @@ private:
StringRef SectionContents, StringRef Block);
/// Given a .debug$S section, find the string table and file checksum table.
- void initializeFileAndStringTables(StringRef Data);
+ void initializeFileAndStringTables(BinaryStreamReader &Reader);
void cacheRelocations();
@@ -145,8 +146,12 @@ private:
const llvm::object::COFFObjectFile *Obj;
bool RelocCached = false;
RelocMapTy RelocMap;
- StringRef CVFileChecksumTable;
- StringRef CVStringTable;
+
+ BinaryByteStream ChecksumContents;
+ VarStreamArray<FileChecksumEntry> CVFileChecksumTable;
+
+ BinaryByteStream StringTableContents;
+ StringTableRef CVStringTable;
ScopedPrinter &Writer;
TypeDatabase TypeDB;
@@ -186,7 +191,7 @@ public:
return CD.getFileNameForFileOffset(FileOffset);
}
- StringRef getStringTable() override { return CD.CVStringTable; }
+ StringTableRef getStringTable() override { return CD.CVStringTable; }
private:
COFFDumper &CD;
@@ -725,30 +730,35 @@ void COFFDumper::printCodeViewDebugInfo() {
}
}
-void COFFDumper::initializeFileAndStringTables(StringRef Data) {
- while (!Data.empty() && (CVFileChecksumTable.data() == nullptr ||
- CVStringTable.data() == nullptr)) {
+void COFFDumper::initializeFileAndStringTables(BinaryStreamReader &Reader) {
+ while (Reader.bytesRemaining() > 0 &&
+ (!CVFileChecksumTable.valid() || !CVStringTable.valid())) {
// The section consists of a number of subsection in the following format:
// |SubSectionType|SubSectionSize|Contents...|
uint32_t SubType, SubSectionSize;
- error(consume(Data, SubType));
- error(consume(Data, SubSectionSize));
- if (SubSectionSize > Data.size())
- return error(object_error::parse_failed);
+ error(Reader.readInteger(SubType));
+ error(Reader.readInteger(SubSectionSize));
+
+ StringRef Contents;
+ error(Reader.readFixedString(Contents, SubSectionSize));
+
switch (ModuleDebugFragmentKind(SubType)) {
- case ModuleDebugFragmentKind::FileChecksums:
- CVFileChecksumTable = Data.substr(0, SubSectionSize);
- break;
- case ModuleDebugFragmentKind::StringTable:
- CVStringTable = Data.substr(0, SubSectionSize);
+ case ModuleDebugFragmentKind::FileChecksums: {
+ ChecksumContents = BinaryByteStream(Contents, support::little);
+ BinaryStreamReader CSR(ChecksumContents);
+ error(CSR.readArray(CVFileChecksumTable, CSR.getLength()));
break;
+ }
+ case ModuleDebugFragmentKind::StringTable: {
+ StringTableContents = BinaryByteStream(Contents, support::little);
+ error(CVStringTable.initialize(StringTableContents));
+ } break;
default:
break;
}
+
uint32_t PaddedSize = alignTo(SubSectionSize, 4);
- if (PaddedSize > Data.size())
- error(object_error::parse_failed);
- Data = Data.drop_front(PaddedSize);
+ error(Reader.skip(PaddedSize - SubSectionSize));
}
}
@@ -771,7 +781,9 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName,
if (Magic != COFF::DEBUG_SECTION_MAGIC)
return error(object_error::parse_failed);
- initializeFileAndStringTables(Data);
+ BinaryByteStream FileAndStrings(Data, support::little);
+ BinaryStreamReader FSReader(FileAndStrings);
+ initializeFileAndStringTables(FSReader);
// TODO: Convert this over to using ModuleSubstreamVisitor.
while (!Data.empty()) {
@@ -861,11 +873,7 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName,
const FrameData *FD;
error(SR.readObject(FD));
- if (FD->FrameFunc >= CVStringTable.size())
- error(object_error::parse_failed);
-
- StringRef FrameFunc =
- CVStringTable.drop_front(FD->FrameFunc).split('\0').first;
+ StringRef FrameFunc = error(CVStringTable.getString(FD->FrameFunc));
DictScope S(W, "FrameData");
W.printHex("RvaStart", FD->RvaStart);
@@ -971,10 +979,7 @@ void COFFDumper::printCodeViewFileChecksums(StringRef Subsection) {
for (auto &FC : Checksums) {
DictScope S(W, "FileChecksum");
- if (FC.FileNameOffset >= CVStringTable.size())
- error(object_error::parse_failed);
- StringRef Filename =
- CVStringTable.drop_front(FC.FileNameOffset).split('\0').first;
+ StringRef Filename = error(CVStringTable.getString(FC.FileNameOffset));
W.printHex("Filename", Filename, FC.FileNameOffset);
W.printHex("ChecksumSize", FC.Checksum.size());
W.printEnum("ChecksumKind", uint8_t(FC.Kind),
@@ -1008,23 +1013,16 @@ void COFFDumper::printCodeViewInlineeLines(StringRef Subsection) {
StringRef COFFDumper::getFileNameForFileOffset(uint32_t FileOffset) {
// The file checksum subsection should precede all references to it.
- if (!CVFileChecksumTable.data() || !CVStringTable.data())
- error(object_error::parse_failed);
- // Check if the file checksum table offset is valid.
- if (FileOffset >= CVFileChecksumTable.size())
+ if (!CVFileChecksumTable.valid() || !CVStringTable.valid())
error(object_error::parse_failed);
- // The string table offset comes first before the file checksum.
- StringRef Data = CVFileChecksumTable.drop_front(FileOffset);
- uint32_t StringOffset;
- error(consume(Data, StringOffset));
+ auto Iter = CVFileChecksumTable.at(FileOffset);
- // Check if the string table offset is valid.
- if (StringOffset >= CVStringTable.size())
+ // Check if the file checksum table offset is valid.
+ if (Iter == CVFileChecksumTable.end())
error(object_error::parse_failed);
- // Return the null-terminated string.
- return CVStringTable.drop_front(StringOffset).split('\0').first;
+ return error(CVStringTable.getString(Iter->FileNameOffset));
}
void COFFDumper::printFileNameForOffset(StringRef Label, uint32_t FileOffset) {
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.h b/llvm/tools/llvm-readobj/llvm-readobj.h
index 015692085e5..840ddbabdc5 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.h
+++ b/llvm/tools/llvm-readobj/llvm-readobj.h
@@ -25,6 +25,11 @@ namespace llvm {
LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg);
void error(std::error_code EC);
void error(llvm::Error EC);
+ template <typename T> T error(llvm::Expected<T> &&E) {
+ error(E.takeError());
+ return std::move(*E);
+ }
+
template <class T> T unwrapOrError(ErrorOr<T> EO) {
if (EO)
return *EO;
OpenPOWER on IntegriCloud