mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-16 17:38:14 +00:00
[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:
parent
70154cb57e
commit
43c7bd0b82
@ -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())
|
||||||
|
@ -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) {
|
||||||
|
@ -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));
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user