From 6b7e0cc92cd09a5e62c255dfe624c92f182fe1a1 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 16 Jun 2016 18:39:17 +0000 Subject: [PATCH] [codeview] Use hashBufferV8 to verify all type records. Differential Revision: http://reviews.llvm.org/D21393 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272930 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/PDB/Raw/TpiStream.cpp | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/lib/DebugInfo/PDB/Raw/TpiStream.cpp index 46717f23a63..00ff6e445f7 100644 --- a/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -65,22 +65,20 @@ TpiStream::TpiStream(const PDBFile &File, TpiStream::~TpiStream() {} // Computes a hash for a given TPI record. -template static uint32_t getTpiHash(T &Rec) { +template +static uint32_t getTpiHash(T &Rec, const CVRecord &RawRec) { auto Opts = static_cast(Rec.getOptions()); - // We don't know how to calculate a hash value for this yet. - // Currently we just skip it. - if (Opts & static_cast(ClassOptions::ForwardReference)) - return 0; + bool ForwardRef = + Opts & static_cast(ClassOptions::ForwardReference); + bool Scoped = Opts & static_cast(ClassOptions::Scoped); + bool UniqueName = Opts & static_cast(ClassOptions::HasUniqueName); - if (!(Opts & static_cast(ClassOptions::Scoped))) + if (!ForwardRef && !Scoped) return hashStringV1(Rec.getName()); - - if (Opts & static_cast(ClassOptions::HasUniqueName)) + if (!ForwardRef && UniqueName) return hashStringV1(Rec.getUniqueName()); - - // This case is not implemented yet. - return 0; + return hashBufferV8(RawRec.RawData); } namespace { @@ -102,15 +100,16 @@ public: Error visitEnum(EnumRecord &Rec) override { return verify(Rec); } Error visitUnion(UnionRecord &Rec) override { return verify(Rec); } - Error visitTypeEnd(const CVRecord &Record) override { + Error visitTypeBegin(const CVRecord &Rec) override { ++Index; + RawRecord = &Rec; return Error::success(); } private: template Error verify(T &Rec) { - uint32_t Hash = getTpiHash(Rec); - if (Hash && Hash % NumHashBuckets != HashValues[Index]) + uint32_t Hash = getTpiHash(Rec, *RawRecord); + if (Hash % NumHashBuckets != HashValues[Index]) return make_error(raw_error_code::invalid_tpi_hash); return Error::success(); } @@ -125,8 +124,9 @@ private: } FixedStreamArray HashValues; + const CVRecord *RawRecord; uint32_t NumHashBuckets; - uint32_t Index = 0; + uint32_t Index = -1; }; } -- 2.50.1