From 57b15082cd48988eb829ddd23a0308ed71796b73 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 2 Feb 2017 00:47:10 +0000 Subject: [PATCH] Re-submit r293820: Return Error instead of bool from mergeTypeStreams(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293847 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../DebugInfo/CodeView/TypeStreamMerger.h | 3 +- lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 38 ++++++++++--------- tools/llvm-readobj/COFFDumper.cpp | 4 +- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h b/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h index af396c79d07..3c915af1657 100644 --- a/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h +++ b/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/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/lib/DebugInfo/CodeView/TypeStreamMerger.cpp index ed6cf5743a1..07984ad2fe3 100644 --- a/lib/DebugInfo/CodeView/TypeStreamMerger.cpp +++ b/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 Error visitKnownRecordImpl(RecordType &Record) { - FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap); + if (!Record.remapTypeIndices(IndexMap)) + LastError = joinErrors( + std::move(*LastError), + llvm::make_error(cv_error_code::corrupt_record)); IndexMap.push_back(DestStream.writeKnownType(Record)); return Error::success(); } @@ -94,14 +95,15 @@ private: template Error visitKnownMemberRecordImpl(RecordType &Record) { - FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap); + if (!Record.remapTypeIndices(IndexMap)) + LastError = joinErrors( + std::move(*LastError), + llvm::make_error(cv_error_code::corrupt_record)); FieldListBuilder.writeMemberType(Record); return Error::success(); } - bool hadError() { return FoundBadTypeIndex; } - - bool FoundBadTypeIndex = false; + Optional LastError; BumpPtrAllocator Allocator; @@ -163,9 +165,10 @@ Error TypeStreamMerger::visitUnknownType(CVType &Rec) { return llvm::make_error(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/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp index c83655fe4d2..3d4ebc8a735 100644 --- a/tools/llvm-readobj/COFFDumper.cpp +++ b/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); + } } } } -- 2.50.1