Return Error instead of bool from mergeTypeStreams().

Previously, mergeTypeStreams returns only true or false, so it was
impossible to know the reason if it failed. This patch changes the
function signature so that it returns an Error object.

Differential Revision: https://reviews.llvm.org/D29362

llvm-svn: 293820
This commit is contained in:
Rui Ueyama 2017-02-01 22:09:34 +00:00
parent a380e613f1
commit 00d4f49717
3 changed files with 25 additions and 20 deletions

View File

@ -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 (!codeview::mergeTypeStreams(Builder, Types))
fatal("codeview::mergeTypeStreams failed");
if (auto Err = codeview::mergeTypeStreams(Builder, Types))
fatal(Err, "codeview::mergeTypeStreams failed");
}
// Construct section contents.

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