summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2016-09-01 18:08:19 +0000
committerZachary Turner <zturner@google.com>2016-09-01 18:08:19 +0000
commit5c7c2307a83665c4861e173a8f4ec4f514c0bbd6 (patch)
treefce88347a8d829a7af20b2cb833d5212d592267c
parent507ba209077b1376980cde8eea0d5bced4d86c52 (diff)
downloadbcm5719-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.h15
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp6
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;
};
OpenPOWER on IntegriCloud