diff options
author | Zachary Turner <zturner@google.com> | 2016-09-01 18:08:19 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-09-01 18:08:19 +0000 |
commit | 5c7c2307a83665c4861e173a8f4ec4f514c0bbd6 (patch) | |
tree | fce88347a8d829a7af20b2cb833d5212d592267c | |
parent | 507ba209077b1376980cde8eea0d5bced4d86c52 (diff) | |
download | bcm5719-llvm-5c7c2307a83665c4861e173a8f4ec4f514c0bbd6.tar.gz bcm5719-llvm-5c7c2307a83665c4861e173a8f4ec4f514c0bbd6.zip |
[codeview] Properly propagate the TypeLeafKind through the pipeline.
llvm-svn: 280388
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h | 15 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | 6 |
2 files changed, 13 insertions, 8 deletions
diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h b/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h index d158f42947c..e6042336069 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h @@ -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) { diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp index 7154b297b12..6214e633b74 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -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; }; |