[codeview] Properly propagate the TypeLeafKind through the pipeline.

llvm-svn: 280388
This commit is contained in:
Zachary Turner 2016-09-01 18:08:19 +00:00
parent 507ba20907
commit 5c7c2307a8
2 changed files with 13 additions and 8 deletions

View File

@ -42,14 +42,19 @@ public:
virtual Expected<TypeLeafKind> virtual Expected<TypeLeafKind>
visitTypeBegin(const CVRecord<TypeLeafKind> &Record) override { 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) { for (auto Visitor : Pipeline) {
if (auto ExpectedKind = Visitor->visitTypeBegin(Record)) if (auto ExpectedKind = Visitor->visitTypeBegin(RecordCopy)) {
Kind = *ExpectedKind; RecordCopy.Type = *ExpectedKind;
else } else
return ExpectedKind.takeError(); return ExpectedKind.takeError();
} }
return Kind; return RecordCopy.Type;
} }
virtual Error visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override { virtual Error visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override {
for (auto Visitor : Pipeline) { for (auto Visitor : Pipeline) {

View File

@ -124,13 +124,13 @@ public:
Expected<TypeLeafKind> Expected<TypeLeafKind>
visitTypeBegin(const CVRecord<TypeLeafKind> &Rec) override { visitTypeBegin(const CVRecord<TypeLeafKind> &Rec) override {
++Index; ++Index;
RawRecord = &Rec; RawRecord = Rec;
return Rec.Type; return Rec.Type;
} }
private: private:
template <typename T> Error verify(T &Rec) { template <typename T> Error verify(T &Rec) {
uint32_t Hash = getTpiHash(Rec, *RawRecord); uint32_t Hash = getTpiHash(Rec, RawRecord);
if (Hash % NumHashBuckets != HashValues[Index]) if (Hash % NumHashBuckets != HashValues[Index])
return errorInvalidHash(); return errorInvalidHash();
return Error::success(); return Error::success();
@ -152,7 +152,7 @@ private:
} }
FixedStreamArray<support::ulittle32_t> HashValues; FixedStreamArray<support::ulittle32_t> HashValues;
const CVRecord<TypeLeafKind> *RawRecord; CVRecord<TypeLeafKind> RawRecord;
uint32_t NumHashBuckets; uint32_t NumHashBuckets;
uint32_t Index = -1; uint32_t Index = -1;
}; };