[codeview] Pass CVRecord to visitTypeBegin callback.

Both parameters to visitTypeBegin are actually members of CVRecord,
so we can just pass CVRecord instead of destructuring it.

Differential Revision: http://reviews.llvm.org/D21435

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272899 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rui Ueyama 2016-06-16 14:47:23 +00:00
parent 70154cb57e
commit 43c7bd0b82
4 changed files with 24 additions and 34 deletions

View File

@ -52,12 +52,11 @@ public:
void visitTypeRecord(const CVRecord<TypeLeafKind> &Record) { void visitTypeRecord(const CVRecord<TypeLeafKind> &Record) {
ArrayRef<uint8_t> LeafData = Record.Data; ArrayRef<uint8_t> LeafData = Record.Data;
ArrayRef<uint8_t> RecordData = LeafData;
auto *DerivedThis = static_cast<Derived *>(this); auto *DerivedThis = static_cast<Derived *>(this);
DerivedThis->visitTypeBegin(Record.Type, RecordData); DerivedThis->visitTypeBegin(Record);
switch (Record.Type) { switch (Record.Type) {
default: default:
DerivedThis->visitUnknownType(Record.Type, RecordData); DerivedThis->visitUnknownType(Record);
break; break;
case LF_FIELDLIST: case LF_FIELDLIST:
DerivedThis->visitFieldList(Record.Type, LeafData); DerivedThis->visitFieldList(Record.Type, LeafData);
@ -76,7 +75,7 @@ public:
#define MEMBER_RECORD(EnumName, EnumVal, Name) #define MEMBER_RECORD(EnumName, EnumVal, Name)
#include "TypeRecords.def" #include "TypeRecords.def"
} }
DerivedThis->visitTypeEnd(Record.Type, RecordData); DerivedThis->visitTypeEnd(Record);
} }
/// Visits the type records in Data. Sets the error flag on parse failures. /// Visits the type records in Data. Sets the error flag on parse failures.
@ -89,12 +88,12 @@ public:
} }
/// Action to take on unknown types. By default, they are ignored. /// Action to take on unknown types. By default, they are ignored.
void visitUnknownType(TypeLeafKind Leaf, ArrayRef<uint8_t> RecordData) {} void visitUnknownType(const CVRecord<TypeLeafKind> &Record) {}
/// Paired begin/end actions for all types. Receives all record data, /// Paired begin/end actions for all types. Receives all record data,
/// including the fixed-length record prefix. /// including the fixed-length record prefix.
void visitTypeBegin(TypeLeafKind Leaf, ArrayRef<uint8_t> RecordData) {} void visitTypeBegin(const CVRecord<TypeLeafKind> &Record) {}
void visitTypeEnd(TypeLeafKind Leaf, ArrayRef<uint8_t> RecordData) {} void visitTypeEnd(const CVRecord<TypeLeafKind> &Record) {}
ArrayRef<uint8_t> skipPadding(ArrayRef<uint8_t> Data) { ArrayRef<uint8_t> skipPadding(ArrayRef<uint8_t> Data) {
if (Data.empty()) if (Data.empty())

View File

@ -209,10 +209,10 @@ public:
#include "llvm/DebugInfo/CodeView/TypeRecords.def" #include "llvm/DebugInfo/CodeView/TypeRecords.def"
void visitUnknownMember(TypeLeafKind Leaf); void visitUnknownMember(TypeLeafKind Leaf);
void visitUnknownType(TypeLeafKind Leaf, ArrayRef<uint8_t> LeafData); void visitUnknownType(const CVRecord<TypeLeafKind> &Record);
void visitTypeBegin(TypeLeafKind Leaf, ArrayRef<uint8_t> LeafData); void visitTypeBegin(const CVRecord<TypeLeafKind> &Record);
void visitTypeEnd(TypeLeafKind Leaf, ArrayRef<uint8_t> LeafData); void visitTypeEnd(const CVRecord<TypeLeafKind> &Record);
void printMemberAttributes(MemberAttributes Attrs); void printMemberAttributes(MemberAttributes Attrs);
void printMemberAttributes(MemberAccess Access, MethodKind Kind, void printMemberAttributes(MemberAccess Access, MethodKind Kind,
@ -250,25 +250,22 @@ static StringRef getLeafTypeName(TypeLeafKind LT) {
return "UnknownLeaf"; return "UnknownLeaf";
} }
void CVTypeDumperImpl::visitTypeBegin(TypeLeafKind Leaf, void CVTypeDumperImpl::visitTypeBegin(const CVRecord<TypeLeafKind> &Rec) {
ArrayRef<uint8_t> LeafData) {
// Reset Name to the empty string. If the visitor sets it, we know it. // Reset Name to the empty string. If the visitor sets it, we know it.
Name = ""; Name = "";
W.startLine() << getLeafTypeName(Leaf) << " (" W.startLine() << getLeafTypeName(Rec.Type) << " ("
<< HexNumber(CVTD.getNextTypeIndex()) << ") {\n"; << HexNumber(CVTD.getNextTypeIndex()) << ") {\n";
W.indent(); W.indent();
W.printEnum("TypeLeafKind", unsigned(Leaf), makeArrayRef(LeafTypeNames)); W.printEnum("TypeLeafKind", unsigned(Rec.Type), makeArrayRef(LeafTypeNames));
} }
void CVTypeDumperImpl::visitTypeEnd(TypeLeafKind Leaf, void CVTypeDumperImpl::visitTypeEnd(const CVRecord<TypeLeafKind> &Rec) {
ArrayRef<uint8_t> LeafData) {
// Always record some name for every type, even if Name is empty. CVUDTNames // Always record some name for every type, even if Name is empty. CVUDTNames
// is indexed by type index, and must have one entry for every type. // is indexed by type index, and must have one entry for every type.
CVTD.recordType(Name); CVTD.recordType(Name);
if (PrintRecordBytes) if (PrintRecordBytes)
W.printBinaryBlock("LeafData", getBytesAsCharacters(LeafData)); W.printBinaryBlock("LeafData", getBytesAsCharacters(Rec.Data));
W.unindent(); W.unindent();
W.startLine() << "}\n"; W.startLine() << "}\n";
@ -545,11 +542,10 @@ void CVTypeDumperImpl::visitUnknownMember(TypeLeafKind Leaf) {
W.printHex("UnknownMember", unsigned(Leaf)); W.printHex("UnknownMember", unsigned(Leaf));
} }
void CVTypeDumperImpl::visitUnknownType(TypeLeafKind Leaf, void CVTypeDumperImpl::visitUnknownType(const CVRecord<TypeLeafKind> &Rec) {
ArrayRef<uint8_t> RecordData) {
DictScope S(W, "UnknownType"); DictScope S(W, "UnknownType");
W.printEnum("Kind", uint16_t(Leaf), makeArrayRef(LeafTypeNames)); W.printEnum("Kind", uint16_t(Rec.Type), makeArrayRef(LeafTypeNames));
W.printNumber("Length", uint32_t(RecordData.size())); W.printNumber("Length", uint32_t(Rec.Data.size()));
} }
void CVTypeDumperImpl::visitNestedType(NestedTypeRecord &Nested) { void CVTypeDumperImpl::visitNestedType(NestedTypeRecord &Nested) {

View File

@ -64,10 +64,10 @@ public:
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
#include "llvm/DebugInfo/CodeView/TypeRecords.def" #include "llvm/DebugInfo/CodeView/TypeRecords.def"
void visitUnknownType(TypeLeafKind Leaf, ArrayRef<uint8_t> RecordData); void visitUnknownType(const CVRecord<TypeLeafKind> &Record);
void visitTypeBegin(TypeLeafKind Leaf, ArrayRef<uint8_t> RecordData); void visitTypeBegin(const CVRecord<TypeLeafKind> &Record);
void visitTypeEnd(TypeLeafKind Leaf, ArrayRef<uint8_t> RecordData); void visitTypeEnd(const CVRecord<TypeLeafKind> &Record);
void visitFieldList(TypeLeafKind Leaf, ArrayRef<uint8_t> FieldData); void visitFieldList(TypeLeafKind Leaf, ArrayRef<uint8_t> FieldData);
@ -91,13 +91,11 @@ private:
} // end anonymous namespace } // end anonymous namespace
void TypeStreamMerger::visitTypeBegin(TypeLeafKind Leaf, void TypeStreamMerger::visitTypeBegin(const CVRecord<TypeLeafKind> &Rec) {
ArrayRef<uint8_t> RecordData) {
BeginIndexMapSize = IndexMap.size(); BeginIndexMapSize = IndexMap.size();
} }
void TypeStreamMerger::visitTypeEnd(TypeLeafKind Leaf, void TypeStreamMerger::visitTypeEnd(const CVRecord<TypeLeafKind> &Rec) {
ArrayRef<uint8_t> RecordData) {
assert(IndexMap.size() == BeginIndexMapSize + 1); assert(IndexMap.size() == BeginIndexMapSize + 1);
} }
@ -122,8 +120,7 @@ void TypeStreamMerger::visitFieldList(TypeLeafKind Leaf,
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
#include "llvm/DebugInfo/CodeView/TypeRecords.def" #include "llvm/DebugInfo/CodeView/TypeRecords.def"
void TypeStreamMerger::visitUnknownType(TypeLeafKind Leaf, void TypeStreamMerger::visitUnknownType(const CVRecord<TypeLeafKind> &Rec) {
ArrayRef<uint8_t> RecordData) {
// We failed to translate a type. Translate this index as "not translated". // We failed to translate a type. Translate this index as "not translated".
IndexMap.push_back( IndexMap.push_back(
TypeIndex(SimpleTypeKind::NotTranslated, SimpleTypeMode::Direct)); TypeIndex(SimpleTypeKind::NotTranslated, SimpleTypeMode::Direct));

View File

@ -102,9 +102,7 @@ public:
void visitStruct(ClassRecord &Rec) { verify(Rec); } void visitStruct(ClassRecord &Rec) { verify(Rec); }
void visitUnion(UnionRecord &Rec) { verify(Rec); } void visitUnion(UnionRecord &Rec) { verify(Rec); }
void visitTypeEnd(TypeLeafKind Leaf, ArrayRef<uint8_t> RecordData) { void visitTypeEnd(const CVRecord<TypeLeafKind> &Record) { ++Index; }
++Index;
}
private: private:
template <typename T> void verify(T &Rec) { template <typename T> void verify(T &Rec) {