forked from OSchip/llvm-project
[codeview] Properly propagate the TypeLeafKind through the pipeline.
llvm-svn: 280388
This commit is contained in:
parent
507ba20907
commit
5c7c2307a8
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue