summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/CodeView
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2017-02-02 00:47:10 +0000
committerRui Ueyama <ruiu@google.com>2017-02-02 00:47:10 +0000
commita9b29615fb01dff81231e7f8ff5df3bffd790b2d (patch)
tree59ac179e38a646e8e5388a5cc14362cd1ae49653 /llvm/lib/DebugInfo/CodeView
parentcb68f371845e8eda1a3f06570fa7604d123b5820 (diff)
downloadbcm5719-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.cpp38
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);
}
OpenPOWER on IntegriCloud