summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/CodeView
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2019-04-04 00:28:48 +0000
committerReid Kleckner <rnk@google.com>2019-04-04 00:28:48 +0000
commite10d00419ab749170301ef6b902b86bb2fb56da1 (patch)
treee301a26421fd35546acc13ecf0ec64e4a8954c9c /llvm/lib/DebugInfo/CodeView
parent15f0057e66c58c390d5cd813fe98864d844f1e0d (diff)
downloadbcm5719-llvm-e10d00419ab749170301ef6b902b86bb2fb56da1.tar.gz
bcm5719-llvm-e10d00419ab749170301ef6b902b86bb2fb56da1.zip
[codeview] Remove Type member from CVRecord
Summary: Now CVType and CVSymbol are effectively type-safe wrappers around ArrayRef<uint8_t>. Make the kind() accessor load it from the RecordPrefix, which is the same for types and symbols. Reviewers: zturner, aganea Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60018 llvm-svn: 357658
Diffstat (limited to 'llvm/lib/DebugInfo/CodeView')
-rw-r--r--llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp9
-rw-r--r--llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp4
-rw-r--r--llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp4
-rw-r--r--llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp20
-rw-r--r--llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp9
-rw-r--r--llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp6
-rw-r--r--llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp18
-rw-r--r--llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp4
-rw-r--r--llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp4
-rw-r--r--llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp12
-rw-r--r--llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp6
11 files changed, 31 insertions, 65 deletions
diff --git a/llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp b/llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
index 32334986915..86a6f9eebfa 100644
--- a/llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
+++ b/llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
@@ -49,13 +49,8 @@ Optional<TypeIndex> AppendingTypeTableBuilder::getNext(TypeIndex Prev) {
return Prev;
}
-CVType AppendingTypeTableBuilder::getType(TypeIndex Index) {
- CVType Type;
- Type.RecordData = SeenRecords[Index.toArrayIndex()];
- const RecordPrefix *P =
- reinterpret_cast<const RecordPrefix *>(Type.RecordData.data());
- Type.Type = static_cast<TypeLeafKind>(uint16_t(P->RecordKind));
- return Type;
+CVType AppendingTypeTableBuilder::getType(TypeIndex Index){
+ return CVType(SeenRecords[Index.toArrayIndex()]);
}
StringRef AppendingTypeTableBuilder::getTypeName(TypeIndex Index) {
diff --git a/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp b/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
index 7d163f9f50f..48b9b0496ff 100644
--- a/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
+++ b/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
@@ -20,7 +20,7 @@ CVSymbolVisitor::CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
template <typename T>
static Error visitKnownRecord(CVSymbol &Record,
SymbolVisitorCallbacks &Callbacks) {
- SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.Type);
+ SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.kind());
T KnownRecord(RK);
if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
return EC;
@@ -29,7 +29,7 @@ static Error visitKnownRecord(CVSymbol &Record,
static Error finishVisitation(CVSymbol &Record,
SymbolVisitorCallbacks &Callbacks) {
- switch (Record.Type) {
+ switch (Record.kind()) {
default:
if (auto EC = Callbacks.visitUnknownSymbol(Record))
return EC;
diff --git a/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp b/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
index 1a6f0c3e2af..dd6f75f97a4 100644
--- a/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
+++ b/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
@@ -22,7 +22,7 @@ using namespace llvm::codeview;
template <typename T>
static Error visitKnownRecord(CVType &Record, TypeVisitorCallbacks &Callbacks) {
- TypeRecordKind RK = static_cast<TypeRecordKind>(Record.Type);
+ TypeRecordKind RK = static_cast<TypeRecordKind>(Record.kind());
T KnownRecord(RK);
if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
return EC;
@@ -96,7 +96,7 @@ CVTypeVisitor::CVTypeVisitor(TypeVisitorCallbacks &Callbacks)
: Callbacks(Callbacks) {}
Error CVTypeVisitor::finishVisitation(CVType &Record) {
- switch (Record.Type) {
+ switch (Record.kind()) {
default:
if (auto EC = Callbacks.visitUnknownType(Record))
return EC;
diff --git a/llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp b/llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
index f180fc6990f..799cffb7116 100644
--- a/llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
+++ b/llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
@@ -66,14 +66,11 @@ void ContinuationRecordBuilder::begin(ContinuationRecordKind RecordKind) {
InjectedSegmentBytes =
ArrayRef<uint8_t>(FLIB, FLIB + sizeof(SegmentInjection));
- CVType Type;
- Type.Type = getTypeLeafKind(RecordKind);
+ // Seed the first record with an appropriate record prefix.
+ RecordPrefix Prefix(getTypeLeafKind(RecordKind));
+ CVType Type(&Prefix, sizeof(Prefix));
cantFail(Mapping.visitTypeBegin(Type));
- // Seed the first trecord with an appropriate record prefix.
- RecordPrefix Prefix;
- Prefix.RecordLen = 0;
- Prefix.RecordKind = Type.Type;
cantFail(SegmentWriter.writeObject(Prefix));
}
@@ -156,14 +153,9 @@ CVType ContinuationRecordBuilder::createSegmentRecord(
MutableArrayRef<uint8_t> Data = Buffer.data();
Data = Data.slice(OffBegin, OffEnd - OffBegin);
- CVType Type;
- Type.Type = getTypeLeafKind(*Kind);
- Type.RecordData = Data;
-
// Write the length to the RecordPrefix, making sure it does not include
// sizeof(RecordPrefix.Length)
RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(Data.data());
- assert(Prefix->RecordKind == Type.Type);
Prefix->RecordLen = Data.size() - sizeof(RecordPrefix::RecordLen);
if (RefersTo.hasValue()) {
@@ -175,12 +167,12 @@ CVType ContinuationRecordBuilder::createSegmentRecord(
CR->IndexRef = RefersTo->getIndex();
}
- return Type;
+ return CVType(Data);
}
std::vector<CVType> ContinuationRecordBuilder::end(TypeIndex Index) {
- CVType Type;
- Type.Type = getTypeLeafKind(*Kind);
+ RecordPrefix Prefix(getTypeLeafKind(*Kind));
+ CVType Type(&Prefix, sizeof(Prefix));
cantFail(Mapping.visitTypeEnd(Type));
// We're now done, and we have a series of segments each beginning at an
diff --git a/llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp b/llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
index b0438bfa004..a7ad1d045f0 100644
--- a/llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
+++ b/llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
@@ -52,14 +52,7 @@ Optional<TypeIndex> GlobalTypeTableBuilder::getNext(TypeIndex Prev) {
}
CVType GlobalTypeTableBuilder::getType(TypeIndex Index) {
- CVType Type;
- Type.RecordData = SeenRecords[Index.toArrayIndex()];
- if (!Type.RecordData.empty()) {
- assert(Type.RecordData.size() >= sizeof(RecordPrefix));
- const RecordPrefix *P =
- reinterpret_cast<const RecordPrefix *>(Type.RecordData.data());
- Type.Type = static_cast<TypeLeafKind>(uint16_t(P->RecordKind));
- }
+ CVType Type(SeenRecords[Index.toArrayIndex()]);
return Type;
}
diff --git a/llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp b/llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
index c3a17b8f35e..4d7cd468f3e 100644
--- a/llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
+++ b/llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
@@ -52,11 +52,7 @@ Optional<TypeIndex> MergingTypeTableBuilder::getNext(TypeIndex Prev) {
}
CVType MergingTypeTableBuilder::getType(TypeIndex Index) {
- CVType Type;
- Type.RecordData = SeenRecords[Index.toArrayIndex()];
- const RecordPrefix *P =
- reinterpret_cast<const RecordPrefix *>(Type.RecordData.data());
- Type.Type = static_cast<TypeLeafKind>(uint16_t(P->RecordKind));
+ CVType Type(SeenRecords[Index.toArrayIndex()]);
return Type;
}
diff --git a/llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp b/llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
index d28b7c3c2d8..654c40a7470 100644
--- a/llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
+++ b/llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
@@ -3,13 +3,6 @@
using namespace llvm;
using namespace llvm::codeview;
-static void writeRecordPrefix(BinaryStreamWriter &Writer, TypeLeafKind Kind) {
- RecordPrefix Prefix;
- Prefix.RecordKind = Kind;
- Prefix.RecordLen = 0;
- cantFail(Writer.writeObject(Prefix));
-}
-
static void addPadding(BinaryStreamWriter &Writer) {
uint32_t Align = Writer.getOffset() % 4;
if (Align == 0)
@@ -32,10 +25,12 @@ ArrayRef<uint8_t> SimpleTypeSerializer::serialize(T &Record) {
BinaryStreamWriter Writer(ScratchBuffer, support::little);
TypeRecordMapping Mapping(Writer);
- CVType CVT;
- CVT.Type = static_cast<TypeLeafKind>(Record.getKind());
+ // Write the record prefix first with a dummy length but real kind.
+ RecordPrefix DummyPrefix(uint16_t(Record.getKind()));
+ cantFail(Writer.writeObject(DummyPrefix));
- writeRecordPrefix(Writer, CVT.Type);
+ RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(ScratchBuffer.data());
+ CVType CVT(Prefix, sizeof(RecordPrefix));
cantFail(Mapping.visitTypeBegin(CVT));
cantFail(Mapping.visitKnownRecord(CVT, Record));
@@ -43,8 +38,7 @@ ArrayRef<uint8_t> SimpleTypeSerializer::serialize(T &Record) {
addPadding(Writer);
- RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(ScratchBuffer.data());
-
+ // Update the size and kind after serialization.
Prefix->RecordKind = CVT.kind();
Prefix->RecordLen = Writer.getOffset() - sizeof(uint16_t);
diff --git a/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp b/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
index 39cc18a1917..783b85409f7 100644
--- a/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
+++ b/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
@@ -101,10 +101,10 @@ void CVSymbolDumperImpl::printTypeIndex(StringRef FieldName, TypeIndex TI) {
}
Error CVSymbolDumperImpl::visitSymbolBegin(CVSymbol &CVR) {
- W.startLine() << getSymbolKindName(CVR.Type);
+ W.startLine() << getSymbolKindName(CVR.kind());
W.getOStream() << " {\n";
W.indent();
- W.printEnum("Kind", unsigned(CVR.Type), getSymbolTypeNames());
+ W.printEnum("Kind", unsigned(CVR.kind()), getSymbolTypeNames());
return Error::success();
}
diff --git a/llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp b/llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
index 56406bfec09..d5fea5ee5e2 100644
--- a/llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
+++ b/llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
@@ -171,11 +171,11 @@ Error TypeDumpVisitor::visitTypeBegin(CVType &Record) {
}
Error TypeDumpVisitor::visitTypeBegin(CVType &Record, TypeIndex Index) {
- W->startLine() << getLeafTypeName(Record.Type);
+ W->startLine() << getLeafTypeName(Record.kind());
W->getOStream() << " (" << HexNumber(Index.getIndex()) << ")";
W->getOStream() << " {\n";
W->indent();
- W->printEnum("TypeLeafKind", unsigned(Record.Type),
+ W->printEnum("TypeLeafKind", unsigned(Record.kind()),
makeArrayRef(LeafTypeNames));
return Error::success();
}
diff --git a/llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp b/llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
index 5a9f6c616ac..12fb50d6ddc 100644
--- a/llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
+++ b/llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
@@ -88,11 +88,11 @@ Error TypeRecordMapping::visitTypeBegin(CVType &CVR) {
// split with continuation records. All other record types cannot be
// longer than the maximum record length.
Optional<uint32_t> MaxLen;
- if (CVR.Type != TypeLeafKind::LF_FIELDLIST &&
- CVR.Type != TypeLeafKind::LF_METHODLIST)
+ if (CVR.kind() != TypeLeafKind::LF_FIELDLIST &&
+ CVR.kind() != TypeLeafKind::LF_METHODLIST)
MaxLen = MaxRecordLength - sizeof(RecordPrefix);
error(IO.beginRecord(MaxLen));
- TypeKind = CVR.Type;
+ TypeKind = CVR.kind();
return Error::success();
}
@@ -211,9 +211,9 @@ Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ArrayRecord &Record) {
}
Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ClassRecord &Record) {
- assert((CVR.Type == TypeLeafKind::LF_STRUCTURE) ||
- (CVR.Type == TypeLeafKind::LF_CLASS) ||
- (CVR.Type == TypeLeafKind::LF_INTERFACE));
+ assert((CVR.kind() == TypeLeafKind::LF_STRUCTURE) ||
+ (CVR.kind() == TypeLeafKind::LF_CLASS) ||
+ (CVR.kind() == TypeLeafKind::LF_INTERFACE));
error(IO.mapInteger(Record.MemberCount));
error(IO.mapEnum(Record.Options));
diff --git a/llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp b/llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp
index 3434012eb6f..e13068b5b1e 100644
--- a/llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp
+++ b/llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp
@@ -36,11 +36,7 @@ Optional<TypeIndex> TypeTableCollection::getNext(TypeIndex Prev) {
CVType TypeTableCollection::getType(TypeIndex Index) {
assert(Index.toArrayIndex() < Records.size());
- ArrayRef<uint8_t> Bytes = Records[Index.toArrayIndex()];
- const RecordPrefix *Prefix =
- reinterpret_cast<const RecordPrefix *>(Bytes.data());
- TypeLeafKind Kind = static_cast<TypeLeafKind>(uint16_t(Prefix->RecordKind));
- return CVType(Kind, Bytes);
+ return CVType(Records[Index.toArrayIndex()]);
}
StringRef TypeTableCollection::getTypeName(TypeIndex Index) {
OpenPOWER on IntegriCloud