diff options
-rw-r--r-- | lld/COFF/PDB.cpp | 4 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h | 3 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 38 |
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); } |