[codeview] Properly propagate the TypeLeafKind through the pipeline.
authorZachary Turner <zturner@google.com>
Thu, 1 Sep 2016 18:08:19 +0000 (18:08 +0000)
committerZachary Turner <zturner@google.com>
Thu, 1 Sep 2016 18:08:19 +0000 (18:08 +0000)
llvm-svn: 280388

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

index d158f42..e604233 100644 (file)
@@ -42,14 +42,19 @@ public:
 
   virtual Expected<TypeLeafKind>
   visitTypeBegin(const CVRecord<TypeLeafKind> &Record) override {
-    TypeLeafKind Kind = Record.Type;
+    // An implementation can calculate of visitTypeBegin() can calculate the
+    // kind based on an arbitrary factor, including the Type that is already
+    // specified in the Record.  So, as we go through the pipeline invoking
+    // each visitor, update the state in a copy of the record so that each
+    // visitor in the pipeline sees the most recently value of the type.
+    CVRecord<TypeLeafKind> RecordCopy = Record;
     for (auto Visitor : Pipeline) {
-      if (auto ExpectedKind = Visitor->visitTypeBegin(Record))
-        Kind = *ExpectedKind;
-      else
+      if (auto ExpectedKind = Visitor->visitTypeBegin(RecordCopy)) {
+        RecordCopy.Type = *ExpectedKind;
+      else
         return ExpectedKind.takeError();
     }
-    return Kind;
+    return RecordCopy.Type;
   }
   virtual Error visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override {
     for (auto Visitor : Pipeline) {
index 7154b29..6214e63 100644 (file)
@@ -124,13 +124,13 @@ public:
   Expected<TypeLeafKind>
   visitTypeBegin(const CVRecord<TypeLeafKind> &Rec) override {
     ++Index;
-    RawRecord = &Rec;
+    RawRecord = Rec;
     return Rec.Type;
   }
 
 private:
   template <typename T> Error verify(T &Rec) {
-    uint32_t Hash = getTpiHash(Rec, *RawRecord);
+    uint32_t Hash = getTpiHash(Rec, RawRecord);
     if (Hash % NumHashBuckets != HashValues[Index])
       return errorInvalidHash();
     return Error::success();
@@ -152,7 +152,7 @@ private:
   }
 
   FixedStreamArray<support::ulittle32_t> HashValues;
-  const CVRecord<TypeLeafKind> *RawRecord;
+  CVRecord<TypeLeafKind> RawRecord;
   uint32_t NumHashBuckets;
   uint32_t Index = -1;
 };