diff options
author | Zachary Turner <zturner@google.com> | 2016-06-16 18:09:04 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-06-16 18:09:04 +0000 |
commit | 73b0b2f55503e6b72e6525a115965a184e1a1dd7 (patch) | |
tree | 8496dfc19ffd91b805c68a4f0c32d193bab454aa /llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | |
parent | 1f6372c429ce6b85a572c213d53f0ed8d293ff38 (diff) | |
download | bcm5719-llvm-73b0b2f55503e6b72e6525a115965a184e1a1dd7.tar.gz bcm5719-llvm-73b0b2f55503e6b72e6525a115965a184e1a1dd7.zip |
Revert "[pdb] Change type visitor pattern to be dynamic."
This reverts commit fb0dd311e1ad945827b8ffd5354f4810e2be1579.
This breaks some llvm-readobj tests.
llvm-svn: 272927
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp index 46717f23a63..99e5037ad63 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -84,44 +84,39 @@ template <typename T> static uint32_t getTpiHash(T &Rec) { } namespace { -class TpiHashVerifier : public TypeVisitorCallbacks { +class TpiHashVerifier : public CVTypeVisitor<TpiHashVerifier> { public: TpiHashVerifier(FixedStreamArray<support::ulittle32_t> &HashValues, uint32_t NumHashBuckets) : HashValues(HashValues), NumHashBuckets(NumHashBuckets) {} - Error visitUdtSourceLine(UdtSourceLineRecord &Rec) override { - return verifySourceLine(Rec); - } + void visitUdtSourceLine(UdtSourceLineRecord &Rec) { verifySourceLine(Rec); } - Error visitUdtModSourceLine(UdtModSourceLineRecord &Rec) override { - return verifySourceLine(Rec); + void visitUdtModSourceLine(UdtModSourceLineRecord &Rec) { + verifySourceLine(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 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 visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override { - ++Index; - return Error::success(); - } + void visitTypeEnd(const CVRecord<TypeLeafKind> &Record) { ++Index; } private: - template <typename T> Error verify(T &Rec) { + template <typename T> void verify(T &Rec) { uint32_t Hash = getTpiHash(Rec); if (Hash && Hash % NumHashBuckets != HashValues[Index]) - return make_error<RawError>(raw_error_code::invalid_tpi_hash); - return Error::success(); + parseError(); } - template <typename T> Error verifySourceLine(T &Rec) { + template <typename T> void 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]) - return make_error<RawError>(raw_error_code::invalid_tpi_hash); - return Error::success(); + parseError(); } FixedStreamArray<support::ulittle32_t> HashValues; @@ -134,8 +129,11 @@ private: // Currently we only verify SRC_LINE records. Error TpiStream::verifyHashValues() { TpiHashVerifier Verifier(HashValues, Header->NumHashBuckets); - CVTypeVisitor Visitor(Verifier); - return Visitor.visitTypeStream(TypeRecords); + Verifier.visitTypeStream(TypeRecords); + if (Verifier.hadError()) + return make_error<RawError>(raw_error_code::corrupt_file, + "Corrupt TPI hash table."); + return Error::success(); } Error TpiStream::reload() { |