Index: llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -65,22 +65,20 @@ 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 @@ 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 @@ } FixedStreamArray HashValues; + const CVRecord *RawRecord; uint32_t NumHashBuckets; - uint32_t Index = 0; + uint32_t Index = -1; }; }