mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 19:59:57 +00:00
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:
parent
861b997813
commit
57b15082cd
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user