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
3 files changed, 20 insertions, 25 deletions
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index 37c48ffc25c..b62b3fb968f 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 (auto Err = codeview::mergeTypeStreams(Builder, Types))
- fatal(Err, "codeview::mergeTypeStreams failed");
+ if (!codeview::mergeTypeStreams(Builder, Types))
+ fatal("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 3c915af1657..af396c79d07 100644
--- a/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
+++ b/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
@@ -13,13 +13,12 @@
#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.
-Error mergeTypeStreams(TypeTableBuilder &DestStream, const CVTypeArray &Types);
+bool 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 07984ad2fe3..ed6cf5743a1 100644
--- a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
+++ b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
@@ -55,7 +55,9 @@ namespace {
class TypeStreamMerger : public TypeVisitorCallbacks {
public:
TypeStreamMerger(TypeTableBuilder &DestStream)
- : DestStream(DestStream), FieldListBuilder(DestStream) {}
+ : DestStream(DestStream), FieldListBuilder(DestStream) {
+ assert(!hadError());
+ }
/// TypeVisitorCallbacks overrides.
#define TYPE_RECORD(EnumName, EnumVal, Name) \
@@ -72,15 +74,12 @@ public:
Error visitTypeEnd(CVType &Record) override;
Error visitMemberEnd(CVMemberRecord &Record) override;
- Error mergeStream(const CVTypeArray &Types);
+ bool mergeStream(const CVTypeArray &Types);
private:
template <typename RecordType>
Error visitKnownRecordImpl(RecordType &Record) {
- if (!Record.remapTypeIndices(IndexMap))
- LastError = joinErrors(
- std::move(*LastError),
- llvm::make_error<CodeViewError>(cv_error_code::corrupt_record));
+ FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);
IndexMap.push_back(DestStream.writeKnownType(Record));
return Error::success();
}
@@ -95,15 +94,14 @@ private:
template <typename RecordType>
Error visitKnownMemberRecordImpl(RecordType &Record) {
- if (!Record.remapTypeIndices(IndexMap))
- LastError = joinErrors(
- std::move(*LastError),
- llvm::make_error<CodeViewError>(cv_error_code::corrupt_record));
+ FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);
FieldListBuilder.writeMemberType(Record);
return Error::success();
}
- Optional<Error> LastError;
+ bool hadError() { return FoundBadTypeIndex; }
+
+ bool FoundBadTypeIndex = false;
BumpPtrAllocator Allocator;
@@ -165,10 +163,9 @@ Error TypeStreamMerger::visitUnknownType(CVType &Rec) {
return llvm::make_error<CodeViewError>(cv_error_code::corrupt_record);
}
-Error TypeStreamMerger::mergeStream(const CVTypeArray &Types) {
+bool TypeStreamMerger::mergeStream(const CVTypeArray &Types) {
assert(IndexMap.empty());
TypeVisitorCallbackPipeline Pipeline;
- LastError = Error::success();
TypeDeserializer Deserializer;
Pipeline.addCallbackToPipeline(Deserializer);
@@ -176,16 +173,15 @@ Error TypeStreamMerger::mergeStream(const CVTypeArray &Types) {
CVTypeVisitor Visitor(Pipeline);
- if (auto EC = Visitor.visitTypeStream(Types))
- return EC;
+ if (auto EC = Visitor.visitTypeStream(Types)) {
+ consumeError(std::move(EC));
+ return false;
+ }
IndexMap.clear();
-
- Error Ret = std::move(*LastError);
- LastError.reset();
- return Ret;
+ return !hadError();
}
-Error llvm::codeview::mergeTypeStreams(TypeTableBuilder &DestStream,
- const CVTypeArray &Types) {
+bool llvm::codeview::mergeTypeStreams(TypeTableBuilder &DestStream,
+ const CVTypeArray &Types) {
return TypeStreamMerger(DestStream).mergeStream(Types);
}
OpenPOWER on IntegriCloud