diff options
author | Zachary Turner <zturner@google.com> | 2016-06-16 18:00:28 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-06-16 18:00:28 +0000 |
commit | 1f6372c429ce6b85a572c213d53f0ed8d293ff38 (patch) | |
tree | a33b3e57a928e737d700244cb33760c425ccf2a6 /llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | |
parent | 41315f787374e8542faa18d423784bc6c3545790 (diff) | |
download | bcm5719-llvm-1f6372c429ce6b85a572c213d53f0ed8d293ff38.tar.gz bcm5719-llvm-1f6372c429ce6b85a572c213d53f0ed8d293ff38.zip |
[pdb] Change type visitor pattern to be dynamic.
This allows better catching of compiler errors since we can use
the override keyword to verify that methods are actually
overridden.
Also in this patch I've changed from storing a boolean Error
code everywhere to returning an llvm::Error, to propagate richer
error information up the call stack.
Reviewed By: ruiu, rnk
Differential Revision: http://reviews.llvm.org/D21410
llvm-svn: 272926
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp index 99e5037ad63..46717f23a63 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -84,39 +84,44 @@ template <typename T> static uint32_t getTpiHash(T &Rec) { } namespace { -class TpiHashVerifier : public CVTypeVisitor<TpiHashVerifier> { +class TpiHashVerifier : public TypeVisitorCallbacks { public: TpiHashVerifier(FixedStreamArray<support::ulittle32_t> &HashValues, uint32_t NumHashBuckets) : HashValues(HashValues), NumHashBuckets(NumHashBuckets) {} - void visitUdtSourceLine(UdtSourceLineRecord &Rec) { verifySourceLine(Rec); } + Error visitUdtSourceLine(UdtSourceLineRecord &Rec) override { + return verifySourceLine(Rec); + } - void visitUdtModSourceLine(UdtModSourceLineRecord &Rec) { - verifySourceLine(Rec); + Error visitUdtModSourceLine(UdtModSourceLineRecord &Rec) override { + return verifySourceLine(Rec); } - void visitClass(ClassRecord &Rec) { verify(Rec); } - void visitEnum(EnumRecord &Rec) { verify(Rec); } - void visitInterface(ClassRecord &Rec) { verify(Rec); } - void visitStruct(ClassRecord &Rec) { verify(Rec); } - void visitUnion(UnionRecord &Rec) { verify(Rec); } + Error visitClass(ClassRecord &Rec) override { return verify(Rec); } + Error visitEnum(EnumRecord &Rec) override { return verify(Rec); } + Error visitUnion(UnionRecord &Rec) override { return verify(Rec); } - void visitTypeEnd(const CVRecord<TypeLeafKind> &Record) { ++Index; } + Error visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override { + ++Index; + return Error::success(); + } private: - template <typename T> void verify(T &Rec) { + template <typename T> Error verify(T &Rec) { uint32_t Hash = getTpiHash(Rec); if (Hash && Hash % NumHashBuckets != HashValues[Index]) - parseError(); + return make_error<RawError>(raw_error_code::invalid_tpi_hash); + return Error::success(); } - template <typename T> void verifySourceLine(T &Rec) { + template <typename T> Error verifySourceLine(T &Rec) { char Buf[4]; support::endian::write32le(Buf, Rec.getUDT().getIndex()); uint32_t Hash = hashStringV1(StringRef(Buf, 4)); if (Hash % NumHashBuckets != HashValues[Index]) - parseError(); + return make_error<RawError>(raw_error_code::invalid_tpi_hash); + return Error::success(); } FixedStreamArray<support::ulittle32_t> HashValues; @@ -129,11 +134,8 @@ private: // Currently we only verify SRC_LINE records. Error TpiStream::verifyHashValues() { TpiHashVerifier Verifier(HashValues, Header->NumHashBuckets); - Verifier.visitTypeStream(TypeRecords); - if (Verifier.hadError()) - return make_error<RawError>(raw_error_code::corrupt_file, - "Corrupt TPI hash table."); - return Error::success(); + CVTypeVisitor Visitor(Verifier); + return Visitor.visitTypeStream(TypeRecords); } Error TpiStream::reload() { |