diff options
Diffstat (limited to 'llvm/lib')
14 files changed, 36 insertions, 70 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) { diff --git a/llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp b/llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp index a52b7e0c4e4..69e831570e3 100644 --- a/llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/GSIStreamBuilder.cpp @@ -36,8 +36,8 @@ struct llvm::pdb::GSIHashStreamBuilder { return Empty; } static inline CVSymbol getTombstoneKey() { - static CVSymbol Tombstone(static_cast<SymbolKind>(-1), - ArrayRef<uint8_t>()); + static CVSymbol Tombstone( + DenseMapInfo<ArrayRef<uint8_t>>::getTombstoneKey()); return Tombstone; } static unsigned getHashValue(const CVSymbol &Val) { diff --git a/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp b/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp index d6c9f10de01..301ef4c2334 100644 --- a/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp +++ b/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp @@ -248,7 +248,7 @@ struct UnknownSymbolRecord : public SymbolRecordBase { 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 { diff --git a/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp b/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp index 4d37cbb8455..a5e3ce1e71e 100644 --- a/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp +++ b/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp @@ -98,7 +98,7 @@ template <typename T> struct LeafRecordImpl : public LeafRecordBase { 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 @@ CVType LeafRecordImpl<FieldListRecord>::toCodeViewRecord( 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) { |