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
This commit is contained in:
Rui Ueyama 2017-02-02 00:47:10 +00:00
parent 861b997813
commit 57b15082cd
3 changed files with 26 additions and 19 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}
}
}
}