[llvm] r273294 - [codeview] Add support for splitting field list records over 64KB

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 21 21:02:24 PDT 2016


What about updating the visitor to support dumping this?

On Tue, Jun 21, 2016 at 11:39 AM Reid Kleckner via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: rnk
> Date: Tue Jun 21 13:33:01 2016
> New Revision: 273294
>
> URL: http://llvm.org/viewvc/llvm-project?rev=273294&view=rev
> Log:
> [codeview] Add support for splitting field list records over 64KB
>
> The basic structure is that once a list record goes over 64K, the last
> subrecord of the list is an LF_INDEX record that refers to the next
> record. Because the type record graph must be toplogically sorted, this
> means we have to emit them in reverse order. We build the type record in
> order of declaration, so this means that if we don't want extra copies,
> we need to detect when we were about to split a record, and leave space
> for a continuation subrecord that will point to the eventual split
> top-level record.
>
> Also adds dumping support for these records.
>
> Next we should make sure that large method overload lists work properly.
>
> Modified:
>     llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h
>     llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h
>     llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h
>     llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h
>     llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def
>     llvm/trunk/lib/DebugInfo/CodeView/ListRecordBuilder.cpp
>     llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp
>     llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp
>     llvm/trunk/lib/DebugInfo/CodeView/TypeTableBuilder.cpp
>     llvm/trunk/test/DebugInfo/COFF/enum.ll
>     llvm/trunk/test/DebugInfo/COFF/types-data-members.ll
>     llvm/trunk/test/DebugInfo/COFF/types-non-virtual-methods.ll
>     llvm/trunk/test/DebugInfo/COFF/types-recursive-struct.ll
>     llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
>
> Modified:
> llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h
> (original)
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h
> Tue Jun 21 13:33:01 2016
> @@ -47,7 +47,7 @@ private:
>  public:
>    FieldListRecordBuilder();
>
> -  void reset() { ListRecordBuilder::reset(TypeRecordKind::FieldList); }
> +  void reset() { ListRecordBuilder::reset(); }
>
>    void writeBaseClass(const BaseClassRecord &Record);
>    void writeEnumerator(const EnumeratorRecord &Record);
>
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h
> (original)
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h Tue Jun
> 21 13:33:01 2016
> @@ -14,6 +14,7 @@
>
>  namespace llvm {
>  namespace codeview {
> +class TypeTableBuilder;
>
>  class ListRecordBuilder {
>  private:
> @@ -28,13 +29,16 @@ protected:
>  public:
>    llvm::StringRef str() { return Builder.str(); }
>
> -  void reset(TypeRecordKind K) {
> -    Builder.reset(K);
> +  void reset() {
> +    Builder.reset(Kind);
>      ContinuationOffsets.clear();
> -    SubrecordCount = 0;
> +    SubrecordStart = 0;
>    }
>
> -  unsigned getSubrecordCount() { return SubrecordCount; }
> +  void writeListContinuation(const ListContinuationRecord &R);
> +
> +  /// Writes this list record as a possible sequence of records.
> +  TypeIndex writeListRecord(TypeTableBuilder &Table);
>
>  protected:
>    void finishSubRecord();
> @@ -42,9 +46,18 @@ protected:
>    TypeRecordBuilder &getBuilder() { return Builder; }
>
>  private:
> +  size_t getLastContinuationStart() const {
> +    return ContinuationOffsets.empty() ? 0 : ContinuationOffsets.back();
> +  }
> +  size_t getLastContinuationEnd() const { return Builder.size(); }
> +  unsigned getLastContinuationSize() const {
> +    return getLastContinuationEnd() - getLastContinuationStart();
> +  }
> +
> +  TypeRecordKind Kind;
>    TypeRecordBuilder Builder;
>    SmallVector<size_t, 4> ContinuationOffsets;
> -  unsigned SubrecordCount = 0;
> +  size_t SubrecordStart = 0;
>  };
>  }
>  }
>
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h (original)
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h Tue Jun 21
> 13:33:01 2016
> @@ -1169,6 +1169,29 @@ private:
>    uint64_t VTableIndex;
>  };
>
> +/// LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST
> records
> +/// together. The first will end in an LF_INDEX record that points to the
> next.
> +class ListContinuationRecord : public TypeRecord {
> +public:
> +  ListContinuationRecord(TypeIndex ContinuationIndex)
> +      : TypeRecord(TypeRecordKind::ListContinuation),
> +        ContinuationIndex(ContinuationIndex) {}
> +
> +  TypeIndex getContinuationIndex() const { return ContinuationIndex; }
> +
> +  bool remapTypeIndices(ArrayRef<TypeIndex> IndexMap);
> +
> +  static ErrorOr<ListContinuationRecord> deserialize(TypeRecordKind Kind,
> +                                                     ArrayRef<uint8_t>
> &Data);
> +
> +private:
> +  struct Layout {
> +    ulittle16_t Pad0;
> +    TypeIndex ContinuationIndex;
> +  };
> +  TypeIndex ContinuationIndex;
> +};
> +
>  typedef CVRecord<TypeLeafKind> CVType;
>  typedef VarStreamArray<CVType> CVTypeArray;
>  }
>
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h
> (original)
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h Tue Jun
> 21 13:33:01 2016
> @@ -43,11 +43,18 @@ public:
>    void writeNullTerminatedString(const char *Value);
>    void writeNullTerminatedString(StringRef Value);
>    void writeGuid(StringRef Guid);
> +  void writeBytes(StringRef Value) { Stream << Value; }
>
>    llvm::StringRef str();
>
>    uint64_t size() const { return Stream.tell(); }
>
> +  void truncate(uint64_t Size) {
> +    // This works because raw_svector_ostream is not buffered.
> +    assert(Size < Buffer.size());
> +    Buffer.resize(Size);
> +  }
> +
>    void reset(TypeRecordKind K) {
>      Buffer.clear();
>      writeTypeRecordKind(K);
>
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def (original)
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def Tue Jun 21
> 13:33:01 2016
> @@ -71,6 +71,7 @@ MEMBER_RECORD(LF_MEMBER, 0x150d, DataMem
>  MEMBER_RECORD(LF_NESTTYPE, 0x1510, NestedType)
>  MEMBER_RECORD(LF_ONEMETHOD, 0x1511, OneMethod)
>  MEMBER_RECORD(LF_ENUMERATE, 0x1502, Enumerator)
> +MEMBER_RECORD(LF_INDEX, 0x1404, ListContinuation)
>
>  // ID leaf records. Subsequent leaf types may be referenced from .debug$S.
>  TYPE_RECORD(LF_FUNC_ID, 0x1601, FuncId)
> @@ -168,7 +169,6 @@ CV_TYPE(LF_DIMVARLU, 0x120a)
>  // Member type records. These are generally not length prefixed, and
> appear
>  // inside of a field list record.
>  CV_TYPE(LF_FRIENDFCN_ST, 0x1403)
> -CV_TYPE(LF_INDEX, 0x1404)
>  CV_TYPE(LF_MEMBER_ST, 0x1405)
>  CV_TYPE(LF_STMEMBER_ST, 0x1406)
>  CV_TYPE(LF_METHOD_ST, 0x1407)
>
> Modified: llvm/trunk/lib/DebugInfo/CodeView/ListRecordBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ListRecordBuilder.cpp?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/CodeView/ListRecordBuilder.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/CodeView/ListRecordBuilder.cpp Tue Jun 21
> 13:33:01 2016
> @@ -7,27 +7,92 @@
>  //
>
>  //===----------------------------------------------------------------------===//
>
> +#include "llvm/ADT/SmallString.h"
>  #include "llvm/DebugInfo/CodeView/ListRecordBuilder.h"
> +#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
>
>  using namespace llvm;
>  using namespace codeview;
>
> -ListRecordBuilder::ListRecordBuilder(TypeRecordKind Kind) : Builder(Kind)
> {}
> +ListRecordBuilder::ListRecordBuilder(TypeRecordKind Kind)
> +    : Kind(Kind), Builder(Kind) {}
>
> -void ListRecordBuilder::finishSubRecord() {
> -  SubrecordCount++;
> +void ListRecordBuilder::writeListContinuation(const
> ListContinuationRecord &R) {
> +  TypeRecordBuilder &Builder = getBuilder();
> +
> +  assert(getLastContinuationSize() < 65535 - 8 && "continuation won't
> fit");
> +
> +  Builder.writeTypeRecordKind(TypeRecordKind::ListContinuation);
> +  Builder.writeUInt16(0);
> +  Builder.writeTypeIndex(R.getContinuationIndex());
> +
> +  // End the current segment manually so that nothing comes after the
> +  // continuation.
> +  ContinuationOffsets.push_back(Builder.size());
> +  SubrecordStart = Builder.size();
> +}
>
> +void ListRecordBuilder::finishSubRecord() {
>    // The builder starts at offset 2 in the actual CodeView buffer, so add
> an
>    // additional offset of 2 before computing the alignment.
>    uint32_t Remainder = (Builder.size() + 2) % 4;
>    if (Remainder != 0) {
>      for (int32_t PaddingBytesLeft = 4 - Remainder; PaddingBytesLeft > 0;
>           --PaddingBytesLeft) {
> -      Builder.writeUInt8(0xf0 + PaddingBytesLeft);
> +      Builder.writeUInt8(LF_PAD0 + PaddingBytesLeft);
>      }
>    }
>
> -  // TODO: Split the list into multiple records if it's longer than 64KB,
> using
> -  // a subrecord of TypeRecordKind::Index to chain the records together.
> -  assert(Builder.size() < 65536);
> +  // Check if this subrecord makes the current segment not fit in 64K
> minus the
> +  // space for a continuation record (8 bytes). If the segment does not
> fit,
> +  // back up and insert a continuation record, sliding the current
> subrecord
> +  // down.
> +  if (getLastContinuationSize() > 65535 - 8) {
> +    SmallString<128> SubrecordCopy(Builder.str().slice(SubrecordStart,
> Builder.size()));
> +    Builder.truncate(SubrecordStart);
> +
> +    // Write a placeholder continuation record.
> +    Builder.writeTypeRecordKind(TypeRecordKind::ListContinuation);
> +    Builder.writeUInt16(0);
> +    Builder.writeUInt32(0);
> +    ContinuationOffsets.push_back(Builder.size());
> +    assert(Builder.size() == SubrecordStart + 8 && "wrong continuation
> size");
> +    assert(getLastContinuationSize() < 65535 && "segment too big");
> +
> +    // Start a new list record of the appropriate kind, and copy the
> previous
> +    // subrecord into place.
> +    Builder.writeTypeRecordKind(Kind);
> +    Builder.writeBytes(SubrecordCopy);
> +  }
> +
> +  SubrecordStart = Builder.size();
> +}
> +
> +TypeIndex ListRecordBuilder::writeListRecord(TypeTableBuilder &Table) {
> +  // Get the continuation segments as a reversed vector of StringRefs for
> +  // convenience.
> +  SmallVector<StringRef, 1> Segments;
> +  StringRef Data = str();
> +  size_t LastEnd = 0;
> +  for (size_t SegEnd : ContinuationOffsets) {
> +    Segments.push_back(Data.slice(LastEnd, SegEnd));
> +    LastEnd = SegEnd;
> +  }
> +  Segments.push_back(Data.slice(LastEnd, Builder.size()));
> +
> +  // Pop the last record off and emit it directly.
> +  StringRef LastRec = Segments.pop_back_val();
> +  TypeIndex ContinuationIndex = Table.writeRecord(LastRec);
> +
> +  // Emit each record with a continuation in reverse order, so that each
> one
> +  // references the previous record.
> +  for (StringRef Rec : reverse(Segments)) {
> +    assert(*reinterpret_cast<const ulittle16_t *>(Rec.data()) ==
> +           unsigned(Kind));
> +    ulittle32_t *ContinuationPtr =
> +        reinterpret_cast<ulittle32_t *>(const_cast<char *>(Rec.end())) -
> 1;
> +    *ContinuationPtr = ContinuationIndex.getIndex();
> +    ContinuationIndex = Table.writeRecord(Rec);
> +  }
> +  return ContinuationIndex;
>  }
>
> Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp Tue Jun 21 13:33:01
> 2016
> @@ -195,6 +195,8 @@ static StringRef getLeafTypeName(TypeLea
>    case ename:
>       \
>      return #name;
>  #include "llvm/DebugInfo/CodeView/TypeRecords.def"
> +  case LF_FIELDLIST:
> +    return "FieldList";
>    default:
>      break;
>    }
> @@ -214,6 +216,9 @@ Error CVTypeDumper::visitTypeBegin(const
>  }
>
>  Error CVTypeDumper::visitTypeEnd(const CVRecord<TypeLeafKind> &Record) {
> +  if (Record.Type == LF_FIELDLIST)
> +    Name = "<field list>";
> +
>    // 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.
>    recordType(Name);
> @@ -612,6 +617,12 @@ Error CVTypeDumper::visitVirtualBaseClas
>    return Error::success();
>  }
>
> +Error CVTypeDumper::visitListContinuation(ListContinuationRecord &Cont) {
> +  DictScope S(*W, "ListContinuation");
> +  printTypeIndex("ContinuationIndex", Cont.getContinuationIndex());
> +  return Error::success();
> +}
> +
>  StringRef CVTypeDumper::getTypeName(TypeIndex TI) {
>    if (TI.isNoneType())
>      return "<no type>";
>
> Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp Tue Jun 21 13:33:01
> 2016
> @@ -365,6 +365,14 @@ VirtualBaseClassRecord::deserialize(Type
>                                  Offset, Index);
>  }
>
> +ErrorOr<ListContinuationRecord>
> +ListContinuationRecord::deserialize(TypeRecordKind Kind,
> +                                    ArrayRef<uint8_t> &Data) {
> +  const Layout *L = nullptr;
> +  CV_DESERIALIZE(Data, L);
> +  return ListContinuationRecord(L->ContinuationIndex);
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // Type index remapping
>
>  //===----------------------------------------------------------------------===//
> @@ -556,3 +564,7 @@ bool VirtualBaseClassRecord::remapTypeIn
>    Success &= remapIndex(IndexMap, VBPtrType);
>    return Success;
>  }
> +
> +bool ListContinuationRecord::remapTypeIndices(ArrayRef<TypeIndex>
> IndexMap) {
> +  return remapIndex(IndexMap, ContinuationIndex);
> +}
>
> Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeTableBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeTableBuilder.cpp?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/DebugInfo/CodeView/TypeTableBuilder.cpp (original)
> +++ llvm/trunk/lib/DebugInfo/CodeView/TypeTableBuilder.cpp Tue Jun 21
> 13:33:01 2016
> @@ -267,9 +267,7 @@ TypeIndex TypeTableBuilder::writeRecord(
>  }
>
>  TypeIndex TypeTableBuilder::writeFieldList(FieldListRecordBuilder
> &FieldList) {
> -  // TODO: Split the list into multiple records if it's longer than 64KB,
> using
> -  // a subrecord of TypeRecordKind::Index to chain the records together.
> -  return writeRecord(FieldList.str());
> +  return FieldList.writeListRecord(*this);
>  }
>
>  TypeIndex TypeTableBuilder::writeMethodOverloadList(
>
> Modified: llvm/trunk/test/DebugInfo/COFF/enum.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/enum.ll?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/enum.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/enum.ll Tue Jun 21 13:33:01 2016
> @@ -5,7 +5,7 @@
>  ; E e;
>
>  ; CHECK:     CodeViewTypes [
> -; CHECK:       UnknownLeaf (0x1000) {
> +; CHECK:       FieldList (0x1000) {
>  ; CHECK-NEXT:    TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK-NEXT:    Enumerator {
>  ; CHECK-NEXT:      AccessSpecifier: Public (0x3)
> @@ -19,7 +19,7 @@
>  ; CHECK-NEXT:    Properties [ (0x0)
>  ; CHECK-NEXT:    ]
>  ; CHECK-NEXT:    UnderlyingType: int (0x74)
> -; CHECK-NEXT:    FieldListType: BLAH (0x1000)
> +; CHECK-NEXT:    FieldListType: <field list> (0x1000)
>  ; CHECK-NEXT:    Name: E
>  ; CHECK-NEXT:  }
>
>
> Modified: llvm/trunk/test/DebugInfo/COFF/types-data-members.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/types-data-members.ll?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/types-data-members.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/types-data-members.ll Tue Jun 21
> 13:33:01 2016
> @@ -81,7 +81,7 @@
>  ; CHECK:       Const (0x1)
>  ; CHECK:     ]
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x1005) {
> +; CHECK:   FieldList (0x1005) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     DataMember {
>  ; CHECK:       AccessSpecifier: Public (0x3)
> @@ -113,7 +113,7 @@
>  ; CHECK:     Properties [ (0x200)
>  ; CHECK:       HasUniqueName (0x200)
>  ; CHECK:     ]
> -; CHECK:     FieldList: sdm (0x1005)
> +; CHECK:     FieldList: <field list> (0x1005)
>  ; CHECK:     DerivedFrom: 0x0
>  ; CHECK:     VShape: 0x0
>  ; CHECK:     SizeOf: 12
> @@ -132,7 +132,7 @@
>  ; CHECK:     Name: Union
>  ; CHECK:     LinkageName: .?ATUnion@@
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x1008) {
> +; CHECK:   FieldList (0x1008) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     DataMember {
>  ; CHECK:       AccessSpecifier: Public (0x3)
> @@ -153,7 +153,7 @@
>  ; CHECK:     Properties [ (0x200)
>  ; CHECK:       HasUniqueName (0x200)
>  ; CHECK:     ]
> -; CHECK:     FieldList: b (0x1008)
> +; CHECK:     FieldList: <field list> (0x1008)
>  ; CHECK:     SizeOf: 4
>  ; CHECK:     Name: Union
>  ; CHECK:     LinkageName: .?ATUnion@@
> @@ -171,7 +171,7 @@
>  ; CHECK:     SizeOf: 0
>  ; CHECK:     Name: Class
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x100B) {
> +; CHECK:   FieldList (0x100B) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     DataMember {
>  ; CHECK:       AccessSpecifier: Public (0x3)
> @@ -198,7 +198,7 @@
>  ; CHECK:     Properties [ (0x200)
>  ; CHECK:       HasUniqueName (0x200)
>  ; CHECK:     ]
> -; CHECK:     FieldList: prot (0x100B)
> +; CHECK:     FieldList: <field list> (0x100B)
>  ; CHECK:     DerivedFrom: 0x0
>  ; CHECK:     VShape: 0x0
>  ; CHECK:     SizeOf: 12
> @@ -249,7 +249,7 @@
>  ; CHECK:     IsVolatile: 0
>  ; CHECK:     IsUnaligned: 0
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x1011) {
> +; CHECK:   FieldList (0x1011) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     DataMember {
>  ; CHECK:       AccessSpecifier: Public (0x3)
> @@ -270,7 +270,7 @@
>  ; CHECK:     Properties [ (0x200)
>  ; CHECK:       HasUniqueName (0x200)
>  ; CHECK:     ]
> -; CHECK:     FieldList: d (0x1011)
> +; CHECK:     FieldList: <field list> (0x1011)
>  ; CHECK:     DerivedFrom: 0x0
>  ; CHECK:     VShape: 0x0
>  ; CHECK:     SizeOf: 48
> @@ -291,7 +291,7 @@
>  ; CHECK:     Name: Nested
>  ; CHECK:     LinkageName: .?AUNested at Class@@
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x1014) {
> +; CHECK:   FieldList (0x1014) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     DataMember {
>  ; CHECK:       AccessSpecifier: Public (0x3)
> @@ -306,7 +306,7 @@
>  ; CHECK:     Properties [ (0x200)
>  ; CHECK:       HasUniqueName (0x200)
>  ; CHECK:     ]
> -; CHECK:     FieldList: n (0x1014)
> +; CHECK:     FieldList: <field list> (0x1014)
>  ; CHECK:     DerivedFrom: 0x0
>  ; CHECK:     VShape: 0x0
>  ; CHECK:     SizeOf: 4
>
> Modified: llvm/trunk/test/DebugInfo/COFF/types-non-virtual-methods.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/types-non-virtual-methods.ll?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/types-non-virtual-methods.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/types-non-virtual-methods.ll Tue Jun 21
> 13:33:01 2016
> @@ -84,7 +84,7 @@
>  ; CHECK:     ArgListType: () (0x1000)
>  ; CHECK:     ThisAdjustment: 0
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x1006) {
> +; CHECK:   FieldList (0x1006) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     OneMethod {
>  ; CHECK:       AccessSpecifier: Public (0x3)
> @@ -112,7 +112,7 @@
>  ; CHECK:     MemberCount: 4
>  ; CHECK:     Properties [ (0x0)
>  ; CHECK:     ]
> -; CHECK:     FieldList: A::f_public (0x1006)
> +; CHECK:     FieldList: <field list> (0x1006)
>  ; CHECK:     DerivedFrom: 0x0
>  ; CHECK:     VShape: 0x0
>  ; CHECK:     SizeOf: 1
> @@ -202,7 +202,7 @@
>  ; CHECK:       Type: void B::(int) (0x100E)
>  ; CHECK:     ]
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x1010) {
> +; CHECK:   FieldList (0x1010) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     OneMethod {
>  ; CHECK:       AccessSpecifier: Private (0x1)
> @@ -220,7 +220,7 @@
>  ; CHECK:     MemberCount: 3
>  ; CHECK:     Properties [ (0x0)
>  ; CHECK:     ]
> -; CHECK:     FieldList: B::f (0x1010)
> +; CHECK:     FieldList: <field list> (0x1010)
>  ; CHECK:     DerivedFrom: 0x0
>  ; CHECK:     VShape: 0x0
>  ; CHECK:     SizeOf: 1
>
> Modified: llvm/trunk/test/DebugInfo/COFF/types-recursive-struct.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/types-recursive-struct.ll?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/types-recursive-struct.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/types-recursive-struct.ll Tue Jun 21
> 13:33:01 2016
> @@ -77,7 +77,7 @@
>  ; CHECK:     IsVolatile: 0
>  ; CHECK:     IsUnaligned: 0
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x1006) {
> +; CHECK:   FieldList (0x1006) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     DataMember {
>  ; CHECK:       AccessSpecifier: Public (0x3)
> @@ -91,13 +91,13 @@
>  ; CHECK:     MemberCount: 1
>  ; CHECK:     Properties [ (0x0)
>  ; CHECK:     ]
> -; CHECK:     FieldList: b (0x1006)
> +; CHECK:     FieldList: <field list> (0x1006)
>  ; CHECK:     DerivedFrom: 0x0
>  ; CHECK:     VShape: 0x0
>  ; CHECK:     SizeOf: 8
>  ; CHECK:     Name: A
>  ; CHECK:   }
> -; CHECK:   UnknownLeaf (0x1008) {
> +; CHECK:   FieldList (0x1008) {
>  ; CHECK:     TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; CHECK:     DataMember {
>  ; CHECK:       AccessSpecifier: Public (0x3)
> @@ -111,7 +111,7 @@
>  ; CHECK:     MemberCount: 1
>  ; CHECK:     Properties [ (0x0)
>  ; CHECK:     ]
> -; CHECK:     FieldList: a (0x1008)
> +; CHECK:     FieldList: <field list> (0x1008)
>  ; CHECK:     DerivedFrom: 0x0
>  ; CHECK:     VShape: 0x0
>  ; CHECK:     SizeOf: 8
>
> Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test?rev=273294&r1=273293&r2=273294&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test (original)
> +++ llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test Tue Jun 21 13:33:01
> 2016
> @@ -105,7 +105,7 @@
>  ; EMPTY-NEXT:       )
>  ; EMPTY-NEXT:     }
>  ; EMPTY-NEXT:     {
> -; EMPTY-NEXT:       UnknownLeaf (0x1002) {
> +; EMPTY-NEXT:       FieldList (0x1002) {
>  ; EMPTY-NEXT:         TypeLeafKind: LF_FIELDLIST (0x1203)
>  ; EMPTY-NEXT:         Enumerator {
>  ; EMPTY-NEXT:           AccessSpecifier: Public (0x3)
> @@ -1112,7 +1112,7 @@
>  ; ALL:     {
>  ; ALL:       StringId (0x1058) {
>  ; ALL:         TypeLeafKind: LF_STRING_ID (0x1605)
> -; ALL:         Id: managed (0x100C)
> +; ALL:         Id: <field list> (0x100C)
>  ; ALL:         StringData:  Kits\8.1\include\um" -I"C:\Program Files
> (x86)\Windows Kits\8.1\include\winrt" -TP -X
>  ; ALL:       }
>  ; ALL:     }
> @@ -1124,7 +1124,7 @@
>  ; ALL:           ArgType: void
> __vc_attributes::threadingAttribute::(__vc_attributes::threadingAttribute::threading_e)
> (0x1007)
>  ; ALL:           ArgType: void __vc_attributes::threadingAttribute::()
> (0x1008)
>  ; ALL:           ArgType: 0x1009
> -; ALL:           ArgType: value (0x100A)
> +; ALL:           ArgType: <field list> (0x100A)
>  ; ALL:           ArgType:
> __vc_attributes::event_receiverAttribute::type_e (0x100D)
>  ; ALL:         ]
>  ; ALL:       }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160622/b92caed3/attachment-0001.html>


More information about the llvm-commits mailing list