diff options
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() { |