summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/PDB.cpp4
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h3
-rw-r--r--llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp38
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp4
4 files changed, 28 insertions, 21 deletions
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index b62b3fb968f..37c48ffc25c 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -96,8 +96,8 @@ static std::vector<uint8_t> mergeDebugT(SymbolTable *Symtab) {
msf::StreamReader Reader(Stream);
if (auto EC = Reader.readArray(Types, Reader.getLength()))
fatal(EC, "Reader::readArray failed");
- if (!codeview::mergeTypeStreams(Builder, Types))
- fatal("codeview::mergeTypeStreams failed");
+ if (auto Err = codeview::mergeTypeStreams(Builder, Types))
+ fatal(Err, "codeview::mergeTypeStreams failed");
}
// Construct section contents.
diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h b/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
index af396c79d07..3c915af1657 100644
--- a/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
+++ b/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
@@ -13,12 +13,13 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
+#include "llvm/Support/Error.h"
namespace llvm {
namespace codeview {
/// Merges one type stream into another. Returns true on success.
-bool mergeTypeStreams(TypeTableBuilder &DestStream, const CVTypeArray &Types);
+Error mergeTypeStreams(TypeTableBuilder &DestStream, const CVTypeArray &Types);
} // end namespace codeview
} // end namespace llvm
diff --git a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
index ed6cf5743a1..07984ad2fe3 100644
--- a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
+++ b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
@@ -55,9 +55,7 @@ namespace {
class TypeStreamMerger : public TypeVisitorCallbacks {
public:
TypeStreamMerger(TypeTableBuilder &DestStream)
- : DestStream(DestStream), FieldListBuilder(DestStream) {
- assert(!hadError());
- }
+ : DestStream(DestStream), FieldListBuilder(DestStream) {}
/// TypeVisitorCallbacks overrides.
#define TYPE_RECORD(EnumName, EnumVal, Name) \
@@ -74,12 +72,15 @@ public:
Error visitTypeEnd(CVType &Record) override;
Error visitMemberEnd(CVMemberRecord &Record) override;
- bool mergeStream(const CVTypeArray &Types);
+ Error mergeStream(const CVTypeArray &Types);
private:
template <typename RecordType>
Error visitKnownRecordImpl(RecordType &Record) {
- FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);
+ if (!Record.remapTypeIndices(IndexMap))
+ LastError = joinErrors(
+ std::move(*LastError),
+ llvm::make_error<CodeViewError>(cv_error_code::corrupt_record));
IndexMap.push_back(DestStream.writeKnownType(Record));
return Error::success();
}
@@ -94,14 +95,15 @@ private:
template <typename RecordType>
Error visitKnownMemberRecordImpl(RecordType &Record) {
- FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);
+ if (!Record.remapTypeIndices(IndexMap))
+ LastError = joinErrors(
+ std::move(*LastError),
+ llvm::make_error<CodeViewError>(cv_error_code::corrupt_record));
FieldListBuilder.writeMemberType(Record);
return Error::success();
}
- bool hadError() { return FoundBadTypeIndex; }
-
- bool FoundBadTypeIndex = false;
+ Optional<Error> LastError;
BumpPtrAllocator Allocator;
@@ -163,9 +165,10 @@ Error TypeStreamMerger::visitUnknownType(CVType &Rec) {
return llvm::make_error<CodeViewError>(cv_error_code::corrupt_record);
}
-bool TypeStreamMerger::mergeStream(const CVTypeArray &Types) {
+Error TypeStreamMerger::mergeStream(const CVTypeArray &Types) {
assert(IndexMap.empty());
TypeVisitorCallbackPipeline Pipeline;
+ LastError = Error::success();
TypeDeserializer Deserializer;
Pipeline.addCallbackToPipeline(Deserializer);
@@ -173,15 +176,16 @@ bool TypeStreamMerger::mergeStream(const CVTypeArray &Types) {
CVTypeVisitor Visitor(Pipeline);
- if (auto EC = Visitor.visitTypeStream(Types)) {
- consumeError(std::move(EC));
- return false;
- }
+ if (auto EC = Visitor.visitTypeStream(Types))
+ return EC;
IndexMap.clear();
- return !hadError();
+
+ Error Ret = std::move(*LastError);
+ LastError.reset();
+ return Ret;
}
-bool llvm::codeview::mergeTypeStreams(TypeTableBuilder &DestStream,
- const CVTypeArray &Types) {
+Error llvm::codeview::mergeTypeStreams(TypeTableBuilder &DestStream,
+ const CVTypeArray &Types) {
return TypeStreamMerger(DestStream).mergeStream(Types);
}
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp
index c83655fe4d2..3d4ebc8a735 100644
--- a/llvm/tools/llvm-readobj/COFFDumper.cpp
+++ b/llvm/tools/llvm-readobj/COFFDumper.cpp
@@ -1086,8 +1086,10 @@ void COFFDumper::mergeCodeViewTypes(TypeTableBuilder &CVTypes) {
error(object_error::parse_failed);
}
- if (!mergeTypeStreams(CVTypes, Types))
+ if (auto EC = mergeTypeStreams(CVTypes, Types)) {
+ consumeError(std::move(EC));
return error(object_error::parse_failed);
+ }
}
}
}
OpenPOWER on IntegriCloud