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:
parent
a380e613f1
commit
00d4f49717
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue