diff options
| author | Reid Kleckner <rnk@google.com> | 2019-04-04 00:28:48 +0000 | 
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2019-04-04 00:28:48 +0000 | 
| commit | e10d00419ab749170301ef6b902b86bb2fb56da1 (patch) | |
| tree | e301a26421fd35546acc13ecf0ec64e4a8954c9c /llvm/lib/DebugInfo/CodeView | |
| parent | 15f0057e66c58c390d5cd813fe98864d844f1e0d (diff) | |
| download | bcm5719-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')
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) {  | 

