rnk updated this revision to Diff 193388.
rnk marked 4 inline comments as done.
rnk added a comment.
- Add RecordPrefix ctor, remove all dummy RecordLen assignments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D60018/new/
https://reviews.llvm.org/D60018
Files:
lld/COFF/PDB.cpp
lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
llvm/include/llvm/DebugInfo/CodeView/CVRecord.h
llvm/include/llvm/DebugInfo/CodeView/RecordSerialization.h
llvm/include/llvm/DebugInfo/CodeView/SymbolSerializer.h
llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp
llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp
llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp
llvm/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp
llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp
Index: llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp
===================================================================
--- llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp
+++ llvm/unittests/DebugInfo/CodeView/RandomAccessVisitorTest.cpp
@@ -42,8 +42,6 @@
}
inline bool operator==(const CVType &R1, const CVType &R2) {
- if (R1.Type != R2.Type)
- return false;
if (R1.RecordData != R2.RecordData)
return false;
return true;
@@ -107,7 +105,7 @@
GlobalState->Records.push_back(AR);
GlobalState->Indices.push_back(Builder.writeLeafType(AR));
- CVType Type(TypeLeafKind::LF_ARRAY, Builder.records().back());
+ CVType Type(Builder.records().back());
GlobalState->TypeVector.push_back(Type);
GlobalState->AllOffsets.push_back(
@@ -369,11 +367,10 @@
TypeIndex IndexOne = Builder.writeLeafType(Modifier);
// set up a type stream that refers to the above two serialized records.
- std::vector<CVType> TypeArray;
- TypeArray.push_back(
- CVType(static_cast<TypeLeafKind>(Class.Kind), Builder.records()[0]));
- TypeArray.push_back(
- CVType(static_cast<TypeLeafKind>(Modifier.Kind), Builder.records()[1]));
+ std::vector<CVType> TypeArray = {
+ {Builder.records()[0]},
+ {Builder.records()[1]},
+ };
BinaryItemStream<CVType> ItemStream(llvm::support::little);
ItemStream.setItems(TypeArray);
VarStreamArray<CVType> TypeStream(ItemStream);
Index: llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp
===================================================================
--- llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp
+++ llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp
@@ -224,7 +224,7 @@
// append to the existing line.
P.formatLine("{0} | {1} [size = {2}",
fmt_align(Index, AlignStyle::Right, Width),
- formatTypeLeafKind(Record.Type), Record.length());
+ formatTypeLeafKind(Record.kind()), Record.length());
if (Hashes) {
std::string H;
if (Index.toArrayIndex() >= HashValues.size()) {
Index: llvm/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
===================================================================
--- llvm/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
+++ llvm/tools/llvm-pdbutil/MinimalSymbolDumper.cpp
@@ -331,7 +331,7 @@
// append to the existing line.
P.formatLine("{0} | {1} [size = {2}]",
fmt_align(Offset, AlignStyle::Right, 6),
- formatSymbolKind(Record.Type), Record.length());
+ formatSymbolKind(Record.kind()), Record.length());
P.Indent();
return Error::success();
}
Index: llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp
===================================================================
--- llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp
+++ llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp
@@ -98,7 +98,7 @@
CVType toCodeViewRecord(AppendingTypeTableBuilder &TS) const override {
TS.writeLeafType(Record);
- return CVType(Kind, TS.records().back());
+ return CVType(TS.records().back());
}
mutable T Record;
@@ -496,7 +496,7 @@
Member.Member->writeTo(CRB);
}
TS.insertRecord(CRB);
- return CVType(Kind, TS.records().back());
+ return CVType(TS.records().back());
}
void MappingTraits<OneMethodRecord>::mapping(IO &io, OneMethodRecord &Record) {
Index: llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
===================================================================
--- llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
+++ llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
@@ -248,7 +248,7 @@
uint8_t *Buffer = Allocator.Allocate<uint8_t>(TotalLen);
::memcpy(Buffer, &Prefix, sizeof(RecordPrefix));
::memcpy(Buffer + sizeof(RecordPrefix), Data.data(), Data.size());
- return CVSymbol(Kind, ArrayRef<uint8_t>(Buffer, TotalLen));
+ return CVSymbol(ArrayRef<uint8_t>(Buffer, TotalLen));
}
Error fromCodeViewSymbol(CVSymbol CVS) override {
Index: llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp
===================================================================
--- llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp
+++ llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp
@@ -36,8 +36,8 @@
return Empty;
}
static inline CVSymbol getTombstoneKey() {
- static CVSymbol Tombstone(static_cast<SymbolKind>(-1),
- ArrayRef<uint8_t>());
+ static CVSymbol Tombstone(
+ ArrayRef<uint8_t>(DenseMapInfo<uint8_t *>::getTombstoneKey(), 0));
return Tombstone;
}
static unsigned getHashValue(const CVSymbol &Val) {
Index: llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp
+++ llvm/lib/DebugInfo/CodeView/TypeTableCollection.cpp
@@ -36,11 +36,7 @@
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) {
Index: llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
+++ llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
@@ -88,11 +88,11 @@
// 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, 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));
Index: llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
+++ llvm/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
@@ -171,11 +171,11 @@
}
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();
}
Index: llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
+++ llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
@@ -101,10 +101,10 @@
}
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();
}
Index: llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
+++ 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 @@
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 @@
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);
Index: llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
+++ llvm/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
@@ -52,11 +52,7 @@
}
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;
}
Index: llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
+++ llvm/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
@@ -52,14 +52,7 @@
}
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;
}
Index: llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
+++ llvm/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
@@ -66,14 +66,11 @@
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 @@
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 @@
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
Index: llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
+++ llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
@@ -22,7 +22,7 @@
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 @@
: Callbacks(Callbacks) {}
Error CVTypeVisitor::finishVisitation(CVType &Record) {
- switch (Record.Type) {
+ switch (Record.kind()) {
default:
if (auto EC = Callbacks.visitUnknownType(Record))
return EC;
Index: llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
+++ llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
@@ -20,7 +20,7 @@
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 finishVisitation(CVSymbol &Record,
SymbolVisitorCallbacks &Callbacks) {
- switch (Record.Type) {
+ switch (Record.kind()) {
default:
if (auto EC = Callbacks.visitUnknownSymbol(Record))
return EC;
Index: llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
===================================================================
--- llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
+++ llvm/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
@@ -49,13 +49,8 @@
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) {
Index: llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
===================================================================
--- llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
+++ llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
@@ -58,7 +58,7 @@
TypeRecordKind K =
static_cast<TypeRecordKind>(uint16_t(Prefix->RecordKind));
T Record(K);
- CVType CVT(static_cast<TypeLeafKind>(K), Data);
+ CVType CVT(Data);
if (auto EC = deserializeAs<T>(CVT, Record))
return std::move(EC);
return Record;
@@ -111,14 +111,18 @@
public:
explicit FieldListDeserializer(BinaryStreamReader &Reader) : Mapping(Reader) {
- CVType FieldList;
- FieldList.Type = TypeLeafKind::LF_FIELDLIST;
+ RecordPrefix Pre;
+ Pre.RecordLen = 2;
+ Pre.RecordKind = uint16_t(TypeLeafKind::LF_FIELDLIST);
+ CVType FieldList(&Pre, sizeof(Pre));
consumeError(Mapping.Mapping.visitTypeBegin(FieldList));
}
~FieldListDeserializer() override {
- CVType FieldList;
- FieldList.Type = TypeLeafKind::LF_FIELDLIST;
+ RecordPrefix Pre;
+ Pre.RecordLen = 2;
+ Pre.RecordKind = uint16_t(TypeLeafKind::LF_FIELDLIST);
+ CVType FieldList(&Pre, sizeof(Pre));
consumeError(Mapping.Mapping.visitTypeEnd(FieldList));
}
Index: llvm/include/llvm/DebugInfo/CodeView/SymbolSerializer.h
===================================================================
--- llvm/include/llvm/DebugInfo/CodeView/SymbolSerializer.h
+++ llvm/include/llvm/DebugInfo/CodeView/SymbolSerializer.h
@@ -51,8 +51,8 @@
template <typename SymType>
static CVSymbol writeOneSymbol(SymType &Sym, BumpPtrAllocator &Storage,
CodeViewContainer Container) {
- CVSymbol Result;
- Result.Type = static_cast<SymbolKind>(Sym.Kind);
+ RecordPrefix Prefix{uint16_t(Sym.Kind)};
+ CVSymbol Result(&Prefix, sizeof(Prefix));
SymbolSerializer Serializer(Storage, Container);
consumeError(Serializer.visitSymbolBegin(Result));
consumeError(Serializer.visitKnownRecord(Result, Sym));
Index: llvm/include/llvm/DebugInfo/CodeView/RecordSerialization.h
===================================================================
--- llvm/include/llvm/DebugInfo/CodeView/RecordSerialization.h
+++ llvm/include/llvm/DebugInfo/CodeView/RecordSerialization.h
@@ -31,6 +31,9 @@
enum : unsigned { MaxRecordLength = 0xFF00 };
struct RecordPrefix {
+ RecordPrefix() = default;
+ explicit RecordPrefix(uint16_t Kind) : RecordLen(2), RecordKind(Kind) {}
+
ulittle16_t RecordLen; // Record length, starting from &RecordKind.
ulittle16_t RecordKind; // Record kind enum (SymRecordKind or TypeRecordKind)
};
Index: llvm/include/llvm/DebugInfo/CodeView/CVRecord.h
===================================================================
--- llvm/include/llvm/DebugInfo/CodeView/CVRecord.h
+++ llvm/include/llvm/DebugInfo/CodeView/CVRecord.h
@@ -24,17 +24,31 @@
namespace codeview {
+/// CVRecord is a fat pointer (base + size pair) to a symbol or type record.
+/// Carrying the size separately instead of trusting the size stored in the
+/// record prefix provides some extra safety and flexibility.
template <typename Kind> class CVRecord {
public:
- CVRecord() : Type(static_cast<Kind>(0)) {}
+ CVRecord() = default;
- CVRecord(Kind K, ArrayRef<uint8_t> Data) : Type(K), RecordData(Data) {}
+ CVRecord(ArrayRef<uint8_t> Data) : RecordData(Data) {}
- bool valid() const { return Type != static_cast<Kind>(0); }
+ CVRecord(const RecordPrefix *P, size_t Size)
+ : RecordData(reinterpret_cast<const uint8_t *>(P), Size) {}
+
+ bool valid() const { return kind() != Kind(0); }
uint32_t length() const { return RecordData.size(); }
- Kind kind() const { return Type; }
+
+ Kind kind() const {
+ if (RecordData.size() < sizeof(RecordPrefix))
+ return Kind(0);
+ return static_cast<Kind>(static_cast<uint16_t>(
+ reinterpret_cast<const RecordPrefix *>(RecordData.data())->RecordKind));
+ }
+
ArrayRef<uint8_t> data() const { return RecordData; }
+
StringRef str_data() const {
return StringRef(reinterpret_cast<const char *>(RecordData.data()),
RecordData.size());
@@ -44,7 +58,6 @@
return RecordData.drop_front(sizeof(RecordPrefix));
}
- Kind Type;
ArrayRef<uint8_t> RecordData;
};
@@ -71,8 +84,7 @@
ArrayRef<uint8_t> Data = StreamBuffer.take_front(RealLen);
StreamBuffer = StreamBuffer.drop_front(RealLen);
- Record R(static_cast<decltype(Record::Type)>((uint16_t)Prefix->RecordKind),
- Data);
+ Record R(Data);
if (auto EC = F(R))
return EC;
}
@@ -91,13 +103,12 @@
return std::move(EC);
if (Prefix->RecordLen < 2)
return make_error<CodeViewError>(cv_error_code::corrupt_record);
- Kind K = static_cast<Kind>(uint16_t(Prefix->RecordKind));
Reader.setOffset(Offset);
ArrayRef<uint8_t> RawData;
if (auto EC = Reader.readBytes(RawData, Prefix->RecordLen + sizeof(uint16_t)))
return std::move(EC);
- return codeview::CVRecord<Kind>(K, RawData);
+ return codeview::CVRecord<Kind>(RawData);
}
} // end namespace codeview
Index: lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
+++ lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
@@ -188,7 +188,7 @@
TypeIndex method_list_idx = overloaded.MethodList;
CVType method_list_type = m_tpi.getType(method_list_idx);
- assert(method_list_type.Type == LF_METHODLIST);
+ assert(method_list_type.kind() == LF_METHODLIST);
MethodOverloadListRecord method_list;
llvm::cantFail(TypeDeserializer::deserializeAs<MethodOverloadListRecord>(
Index: lld/COFF/PDB.cpp
===================================================================
--- lld/COFF/PDB.cpp
+++ lld/COFF/PDB.cpp
@@ -759,7 +759,7 @@
if (Kind == SymbolKind::S_GPROC32_ID || Kind == SymbolKind::S_LPROC32_ID) {
SmallVector<TiReference, 1> Refs;
auto Content = RecordData.drop_front(sizeof(RecordPrefix));
- CVSymbol Sym(Kind, RecordData);
+ CVSymbol Sym(RecordData);
discoverTypeIndicesInSymbol(Sym, Refs);
assert(Refs.size() == 1);
assert(Refs.front().Count == 1);
@@ -959,7 +959,7 @@
MutableArrayRef<uint8_t> RecordBytes;
if (NeedsRealignment) {
RecordBytes = copyAndAlignSymbol(Sym, AlignedSymbolMem);
- Sym = CVSymbol(Sym.kind(), RecordBytes);
+ Sym = CVSymbol(RecordBytes);
} else {
// Otherwise, we can actually mutate the symbol directly, since we
// copied it to apply relocations.
@@ -983,7 +983,7 @@
// An object file may have S_xxx_ID symbols, but these get converted to
// "real" symbols in a PDB.
translateIdSymbols(RecordBytes, TMerger.getIDTable());
- Sym = CVSymbol(symbolKind(RecordBytes), RecordBytes);
+ Sym = CVSymbol(RecordBytes);
// If this record refers to an offset in the object file's string table,
// add that item to the global PDB string table and re-write the index.
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits