]> granicus.if.org Git - llvm/commitdiff
Re-enable TPI hash verification for enum records.
authorRui Ueyama <ruiu@google.com>
Tue, 12 Jul 2016 03:25:03 +0000 (03:25 +0000)
committerRui Ueyama <ruiu@google.com>
Tue, 12 Jul 2016 03:25:03 +0000 (03:25 +0000)
We didn't read unique names correctly. As a result, we computed
hashes on (non-)unique names instead of unique names.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275150 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/CodeView/TypeRecord.h
lib/DebugInfo/CodeView/TypeRecord.cpp
lib/DebugInfo/PDB/Raw/TpiStream.cpp

index 1a6f82fdcd2433da2f084f0d1428f4467a82dbf3..42751fbd4af116262b92bdefe767777def5b6c44 100644 (file)
@@ -575,6 +575,10 @@ private:
     TypeIndex UnderlyingType;
     TypeIndex FieldListType;
     // Name: The null-terminated name follows.
+
+    bool hasUniqueName() const {
+      return Properties & uint16_t(ClassOptions::HasUniqueName);
+    }
   };
 
   TypeIndex UnderlyingType;
index 40f963fe25a845eb196b3b5507a590682dabdd08..f63371e8c14fe64cd6f0674b8d965529292bb67b 100644 (file)
@@ -166,12 +166,14 @@ ErrorOr<EnumRecord> EnumRecord::deserialize(TypeRecordKind Kind,
                                             ArrayRef<uint8_t> &Data) {
   const Layout *L = nullptr;
   StringRef Name;
-  CV_DESERIALIZE(Data, L, Name);
+  StringRef UniqueName;
+  CV_DESERIALIZE(Data, L, Name,
+                 CV_CONDITIONAL_FIELD(UniqueName, L->hasUniqueName()));
 
   uint16_t P = L->Properties;
   ClassOptions Options = static_cast<ClassOptions>(P);
-  return EnumRecord(L->NumEnumerators, Options, L->FieldListType, Name, Name,
-                    L->UnderlyingType);
+  return EnumRecord(L->NumEnumerators, Options, L->FieldListType, Name,
+                    UniqueName, L->UnderlyingType);
 }
 
 ErrorOr<BitFieldRecord> BitFieldRecord::deserialize(TypeRecordKind Kind,
index 8b44ec1b35e44d21a9c4aa720669631518a87342..5617e57ccf67cfbbe57d308dd252229360bf2016 100644 (file)
@@ -105,7 +105,7 @@ public:
   }
 
   Error visitClass(ClassRecord &Rec) override { return verify(Rec); }
-  Error visitEnum(EnumRecord &Rec) override { return Error::success(); }
+  Error visitEnum(EnumRecord &Rec) override { return verify(Rec); }
   Error visitUnion(UnionRecord &Rec) override { return verify(Rec); }
 
   Error visitTypeBegin(const CVRecord<TypeLeafKind> &Rec) override {