diff options
author | Rui Ueyama <ruiu@google.com> | 2017-02-02 00:47:10 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2017-02-02 00:47:10 +0000 |
commit | a9b29615fb01dff81231e7f8ff5df3bffd790b2d (patch) | |
tree | 59ac179e38a646e8e5388a5cc14362cd1ae49653 /llvm/lib/DebugInfo/CodeView | |
parent | cb68f371845e8eda1a3f06570fa7604d123b5820 (diff) | |
download | bcm5719-llvm-a9b29615fb01dff81231e7f8ff5df3bffd790b2d.tar.gz bcm5719-llvm-a9b29615fb01dff81231e7f8ff5df3bffd790b2d.zip |
Re-submit r293820: Return Error instead of bool from mergeTypeStreams().
llvm-svn: 293847
Diffstat (limited to 'llvm/lib/DebugInfo/CodeView')
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 38 |
1 files changed, 21 insertions, 17 deletions
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); } |