[llvm] r342295 - [PDB] Make the pretty dumper output modified types.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 14 15:29:20 PDT 2018


Author: zturner
Date: Fri Sep 14 15:29:19 2018
New Revision: 342295

URL: http://llvm.org/viewvc/llvm-project?rev=342295&view=rev
Log:
[PDB] Make the pretty dumper output modified types.

Currently if we got something like `const Foo` we'd ignore it and
just rely on printing the unmodified `Foo` later on.  However,
for testing the native reading code we really would like to be able
to see these so that we can verify that the native reader can
actually handle them.  Instead of printing out the full type though,
just print out the header.

Modified:
    llvm/trunk/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h
    llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.cpp
    llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.pdb
    llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.yaml
    llvm/trunk/test/DebugInfo/PDB/Native/pdb-native-enums.test
    llvm/trunk/test/DebugInfo/PDB/every-type.test
    llvm/trunk/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp
    llvm/trunk/tools/llvm-pdbutil/PrettyEnumDumper.cpp
    llvm/trunk/tools/llvm-pdbutil/PrettyTypeDumper.cpp

Modified: llvm/trunk/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h Fri Sep 14 15:29:19 2018
@@ -34,6 +34,7 @@ public:
   FORWARD_SYMBOL_METHOD(hasNestedTypes)
   FORWARD_SYMBOL_METHOD(getLength)
   FORWARD_SYMBOL_ID_METHOD(getLexicalParent)
+  FORWARD_SYMBOL_ID_METHOD(getUnmodifiedType)
   FORWARD_SYMBOL_METHOD(getName)
   FORWARD_SYMBOL_METHOD(getSrcLineOnTypeDefn)
   FORWARD_SYMBOL_METHOD(isNested)

Modified: llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.cpp?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.cpp (original)
+++ llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.cpp Fri Sep 14 15:29:19 2018
@@ -4,10 +4,12 @@
 void *__purecall = 0;
 
 void __cdecl operator delete(void *,unsigned int) {}
+void __cdecl operator delete(void *,unsigned __int64) {}
 
 struct FooStruct { };                      // LF_STRUCTURE
 
 class FooClass {                           // LF_CLASS
+public:
                                            // LF_FIELDLIST
   enum NestedEnum {                        // LF_ENUM
                                            // LF_NESTTYPE
@@ -50,6 +52,15 @@ union TheUnion {
 
 int SomeArray[7] = {1, 2, 3, 4, 5, 6, 7};   // LF_ARRAY
 
+template<typename T>
+void Reference(T &t) { }
+
+const volatile FooStruct FS;             // LF_MODIFIER with struct
+const volatile FooClass FC;              // LF_MODIFIER with class
+const volatile TheUnion TU;              // LF_MODIFIER with union
+const volatile FooClass::NestedEnum FCNE = FooClass::A;  // LF_MODIFIER with enum
+
+
 int main(int argc, char **argv) {           // LF_PROCEDURE
   const int X = 7;                          // LF_MODIFIER
 
@@ -59,5 +70,9 @@ int main(int argc, char **argv) {
   VInherit VInheritInstance;
   IVInherit IVInheritInstance;
   TheUnion UnionInstance;
+  Reference(FS);             // LF_MODIFIER with struct
+  Reference(FC);              // LF_MODIFIER with class
+  Reference(TU);              // LF_MODIFIER with union
+  Reference(FCNE);  // LF_MODIFIER with enum
   return SomeArray[argc];
 }

Modified: llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.pdb
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.pdb?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
Binary files - no diff available.

Modified: llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.yaml?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.yaml (original)
+++ llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.yaml Fri Sep 14 15:29:19 2018
@@ -222,7 +222,7 @@ TpiStream:
         VBPtrType:       0x1001      # const int *
         VBPtrOffset:     0
         VTableIndex:     1
-  # class Inherit : public FooClass {};             [Index: 0x1014]
+  # struct Inherit : public FooClass {};             [Index: 0x1014]
   - Kind:            LF_STRUCTURE
     Class:
       MemberCount:     1
@@ -242,6 +242,26 @@ TpiStream:
       DerivationList:  0x1012
       VTableShape:     0
       Size:            4
+  # const volatile enum FooClass::Enum : uint32_t {          [Index: 0x1016]
+  - Kind:            LF_MODIFIER
+    Modifier:
+      ModifiedType:  0x100D
+      Modifiers:     [ Const, Volatile ]
+  # const volatile struct Inherit : public FooClass {} {     [Index: 0x1017]
+  - Kind:            LF_MODIFIER
+    Modifier:
+      ModifiedType:  0x1014
+      Modifiers:     [ Const, Volatile ]
+  # const volatile class FooClass {                          [Index: 0x1018]
+  - Kind:            LF_MODIFIER
+    Modifier:
+      ModifiedType:  0x100F
+      Modifiers:     [ Const, Volatile ]
+  # const volatile interface FooInterface {                  [Index: 0x1019]
+  - Kind:            LF_MODIFIER
+    Modifier:
+      ModifiedType:  0x1011
+      Modifiers:     [ Const, Volatile ]
 
 # // Member type records. These are generally not length prefixed, and appear
 # // inside of a field list record.

Modified: llvm/trunk/test/DebugInfo/PDB/Native/pdb-native-enums.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/Native/pdb-native-enums.test?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/Native/pdb-native-enums.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/Native/pdb-native-enums.test Fri Sep 14 15:29:19 2018
@@ -12,7 +12,7 @@ DUMP-NEXT:   symIndexId: 2
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: __vc_attributes::event_sourceAttribute::type_e
+DUMP-NEXT:   name: FooClass::NestedEnum
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0
@@ -36,7 +36,7 @@ DUMP-NEXT:   symIndexId: 4
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: __vc_attributes::event_sourceAttribute::optimize_e
+DUMP-NEXT:   name: __vc_attributes::event_sourceAttribute::type_e
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0
@@ -60,7 +60,7 @@ DUMP-NEXT:   symIndexId: 5
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: __vc_attributes::helper_attributes::v1_alttypeAttribute::type_e
+DUMP-NEXT:   name: __vc_attributes::event_sourceAttribute::optimize_e
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0
@@ -84,7 +84,7 @@ DUMP-NEXT:   symIndexId: 6
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: __vc_attributes::helper_attributes::usageAttribute::usage_e
+DUMP-NEXT:   name: __vc_attributes::helper_attributes::v1_alttypeAttribute::type_e
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0
@@ -108,7 +108,7 @@ DUMP-NEXT:   symIndexId: 7
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: __vc_attributes::threadingAttribute::threading_e
+DUMP-NEXT:   name: __vc_attributes::helper_attributes::usageAttribute::usage_e
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0
@@ -132,7 +132,7 @@ DUMP-NEXT:   symIndexId: 8
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: __vc_attributes::aggregatableAttribute::type_e
+DUMP-NEXT:   name: __vc_attributes::threadingAttribute::threading_e
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0
@@ -156,7 +156,7 @@ DUMP-NEXT:   symIndexId: 9
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: __vc_attributes::event_receiverAttribute::type_e
+DUMP-NEXT:   name: __vc_attributes::aggregatableAttribute::type_e
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0
@@ -180,7 +180,7 @@ DUMP-NEXT:   symIndexId: 10
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: __vc_attributes::moduleAttribute::type_e
+DUMP-NEXT:   name: __vc_attributes::event_receiverAttribute::type_e
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0
@@ -204,7 +204,7 @@ DUMP-NEXT:   symIndexId: 11
 DUMP-NEXT:   symTag: 12
 DUMP-NEXT:   baseType: 6
 DUMP-NEXT:   lexicalParentId: 0
-DUMP-NEXT:   name: FooClass::NestedEnum
+DUMP-NEXT:   name: __vc_attributes::moduleAttribute::type_e
 DUMP-NEXT:   typeId: 3
 DUMP-NEXT:   length: 4
 DUMP-NEXT:   constructor: 0

Modified: llvm/trunk/test/DebugInfo/PDB/every-type.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/every-type.test?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/every-type.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/every-type.test Fri Sep 14 15:29:19 2018
@@ -8,254 +8,252 @@ we claim to understand.  We then test th
      hasn't changed.
 
 
-RUN: llvm-pdbutil dump -type-index=0x1018,0x102A,0x103B,0x1093,0x1095,0x1096,0x1098 \
+RUN: llvm-pdbutil dump -type-index=0x101A,0x102C,0x103D,0x104D,0x1098,0x10AA,0x10AC \
 RUN:   -dependents %p/Inputs/every-type.pdb | FileCheck --check-prefix=TYPES %s
 
 RUN: llvm-pdbutil pdb2yaml -tpi-stream -ipi-stream %p/Inputs/every-type.pdb > %t.pdb.yaml
 RUN: llvm-pdbutil yaml2pdb -pdb=%t.yaml.pdb %t.pdb.yaml
-RUN: llvm-pdbutil dump -type-index=0x1018,0x102A,0x103B,0x1093,0x1095,0x1096,0x1098 \
+RUN: llvm-pdbutil dump -type-index=0x101A,0x102C,0x103D,0x104D,0x1098,0x10AA,0x10AC \
 RUN:   -dependents %t.yaml.pdb | FileCheck --check-prefix=TYPES %s
 
 TYPES:                           Types (TPI Stream)
 TYPES-NEXT: ============================================================
-TYPES-NEXT:   Showing 7 records and their dependents (73 records total)
-TYPES-NEXT:   0x1005 | LF_MODIFIER [size = 12]
+TYPES-NEXT:   Showing 7 records and their dependents (72 records total)
+TYPES-NEXT:   0x1007 | LF_MODIFIER [size = 12]
 TYPES-NEXT:            referent = 0x0074 (int), modifiers = const
-TYPES-NEXT:   0x1006 | LF_CLASS [size = 48] `FooClass`
+TYPES-NEXT:   0x1008 | LF_CLASS [size = 48] `FooClass`
 TYPES-NEXT:            unique name: `.?AVFooClass@@`
 TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
-TYPES-NEXT:            options: forward ref | has unique name
-TYPES-NEXT:   0x1007 | LF_VTSHAPE [size = 8]
-TYPES-NEXT:   0x1008 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x1007, mode = pointer, opts = None, kind = ptr32
-TYPES-NEXT:   0x1009 | LF_CLASS [size = 44] `Inherit`
+TYPES-NEXT:            options: forward ref | has unique name, sizeof 0
+TYPES-NEXT:   0x1009 | LF_VTSHAPE [size = 8]
+TYPES-NEXT:   0x100A | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x1009, mode = pointer, opts = None, kind = ptr64
+TYPES-NEXT:   0x100B | LF_CLASS [size = 44] `Inherit`
 TYPES-NEXT:            unique name: `.?AVInherit@@`
 TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
-TYPES-NEXT:            options: forward ref | has unique name
-TYPES-NEXT:   0x100A | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x1009, mode = pointer, opts = const, kind = ptr32
-TYPES-NEXT:   0x100B | LF_ARGLIST [size = 8]
-TYPES-NEXT:   0x100C | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100B
-TYPES-NEXT:            class type = 0x1009, this type = 0x100A, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x100D | LF_MODIFIER [size = 12]
-TYPES-NEXT:            referent = 0x1009, modifiers = const
-TYPES-NEXT:   0x100E | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x100D, mode = ref, opts = None, kind = ptr32
-TYPES-NEXT:   0x100F | LF_ARGLIST [size = 12]
-TYPES-NEXT:            0x100E: `const Inherit&`
-TYPES-NEXT:   0x1010 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x100F
-TYPES-NEXT:            class type = 0x1009, this type = 0x100A, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = constructor
-TYPES-NEXT:   0x1011 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100B
-TYPES-NEXT:            class type = 0x1009, this type = 0x100A, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = constructor
-TYPES-NEXT:   0x1012 | LF_METHODLIST [size = 20]
-TYPES-NEXT:            - Method [type = 0x1010, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:            - Method [type = 0x1011, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:   0x1013 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x1009, mode = ref, opts = None, kind = ptr32
-TYPES-NEXT:   0x1014 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x1013, # args = 1, param list = 0x100F
-TYPES-NEXT:            class type = 0x1009, this type = 0x100A, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x1015 | LF_ARGLIST [size = 12]
-TYPES-NEXT:            0x0075 (unsigned): `unsigned`
+TYPES-NEXT:            options: forward ref | has unique name, sizeof 0
+TYPES-NEXT:   0x100C | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x100B, mode = pointer, opts = const, kind = ptr64
+TYPES-NEXT:   0x100D | LF_ARGLIST [size = 8]
+TYPES-NEXT:   0x100E | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100D
+TYPES-NEXT:            class type = 0x100B, this type = 0x100C, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x100F | LF_MODIFIER [size = 12]
+TYPES-NEXT:            referent = 0x100B, modifiers = const
+TYPES-NEXT:   0x1010 | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x100F, mode = ref, opts = None, kind = ptr64
+TYPES-NEXT:   0x1011 | LF_ARGLIST [size = 12]
+TYPES-NEXT:            0x1010: `const Inherit&`
+TYPES-NEXT:   0x1012 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x1011
+TYPES-NEXT:            class type = 0x100B, this type = 0x100C, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = constructor
+TYPES-NEXT:   0x1013 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100D
+TYPES-NEXT:            class type = 0x100B, this type = 0x100C, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = constructor
+TYPES-NEXT:   0x1014 | LF_METHODLIST [size = 20]
+TYPES-NEXT:            - Method [type = 0x1012, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:            - Method [type = 0x1013, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:   0x1015 | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x100B, mode = ref, opts = None, kind = ptr64
 TYPES-NEXT:   0x1016 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0403 (void*), # args = 1, param list = 0x1015
-TYPES-NEXT:            class type = 0x1009, this type = 0x100A, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x1017 | LF_FIELDLIST [size = 152]
+TYPES-NEXT:            return type = 0x1015, # args = 1, param list = 0x1011
+TYPES-NEXT:            class type = 0x100B, this type = 0x100C, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x1017 | LF_ARGLIST [size = 12]
+TYPES-NEXT:            0x0075 (unsigned): `unsigned`
+TYPES-NEXT:   0x1018 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0603 (void*), # args = 1, param list = 0x1017
+TYPES-NEXT:            class type = 0x100B, this type = 0x100C, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x1019 | LF_FIELDLIST [size = 152]
 TYPES-NEXT:            - LF_BCLASS
-TYPES-NEXT:              type = 0x1006, offset = 4, attrs = public
-TYPES-NEXT:            - LF_VFUNCTAB type = 0x1008
+TYPES-NEXT:              type = 0x1008, offset = 8, attrs = public
+TYPES-NEXT:            - LF_VFUNCTAB type = 0x100A
 TYPES-NEXT:            - LF_ONEMETHOD [name = `~Inherit`]
-TYPES-NEXT:              type = 0x100C, vftable offset = 0, attrs = public intro virtual
-TYPES-NEXT:            - LF_METHOD [name = `Inherit`, # overloads = 2, overload list = 0x1012]
+TYPES-NEXT:              type = 0x100E, vftable offset = 0, attrs = public intro virtual
+TYPES-NEXT:            - LF_METHOD [name = `Inherit`, # overloads = 2, overload list = 0x1014]
 TYPES-NEXT:            - LF_ONEMETHOD [name = `operator=`]
-TYPES-NEXT:              type = 0x1014, vftable offset = -1, attrs = public compiler-generated
+TYPES-NEXT:              type = 0x1016, vftable offset = -1, attrs = public compiler-generated
 TYPES-NEXT:            - LF_ONEMETHOD [name = `__local_vftable_ctor_closure`]
-TYPES-NEXT:              type = 0x100C, vftable offset = -1, attrs = public compiler-generated
+TYPES-NEXT:              type = 0x100E, vftable offset = -1, attrs = public compiler-generated
 TYPES-NEXT:            - LF_ONEMETHOD [name = `__vecDelDtor`]
-TYPES-NEXT:              type = 0x1016, vftable offset = 0, attrs = public intro virtual compiler-generated
-TYPES-NEXT:   0x1018 | LF_CLASS [size = 44] `Inherit`
+TYPES-NEXT:              type = 0x1018, vftable offset = 0, attrs = public intro virtual compiler-generated
+TYPES-NEXT:   0x101A | LF_CLASS [size = 44] `Inherit`
 TYPES-NEXT:            unique name: `.?AVInherit@@`
-TYPES-NEXT:            vtable: 0x1007, base list: <no type>, field list: 0x1017
-TYPES-NEXT:            options: has ctor / dtor | has unique name | overloaded operator | overloaded operator=
-TYPES-NEXT:   0x1019 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x1005, mode = pointer, opts = None, kind = ptr32
-TYPES-NEXT:   0x101A | LF_CLASS [size = 48] `VInherit`
+TYPES-NEXT:            vtable: 0x1009, base list: <no type>, field list: 0x1019
+TYPES-NEXT:            options: has ctor / dtor | has unique name | overloaded operator | overloaded operator=, sizeof 16
+TYPES-NEXT:   0x101B | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x1007, mode = pointer, opts = None, kind = ptr64
+TYPES-NEXT:   0x101C | LF_CLASS [size = 48] `VInherit`
 TYPES-NEXT:            unique name: `.?AVVInherit@@`
 TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
-TYPES-NEXT:            options: forward ref | has unique name
-TYPES-NEXT:   0x101B | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x101A, mode = pointer, opts = const, kind = ptr32
-TYPES-NEXT:   0x101C | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x101A, mode = rvalue ref, opts = None, kind = ptr32
-TYPES-NEXT:   0x101D | LF_ARGLIST [size = 12]
-TYPES-NEXT:            0x101C: `VInherit&&`
-TYPES-NEXT:   0x101E | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x101D
-TYPES-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = constructor with virtual bases | constructor
-TYPES-NEXT:   0x101F | LF_MODIFIER [size = 12]
-TYPES-NEXT:            referent = 0x101A, modifiers = const
-TYPES-NEXT:   0x1020 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x101F, mode = ref, opts = None, kind = ptr32
-TYPES-NEXT:   0x1021 | LF_ARGLIST [size = 12]
-TYPES-NEXT:            0x1020: `const VInherit&`
-TYPES-NEXT:   0x1022 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x1021
-TYPES-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = constructor with virtual bases | constructor
-TYPES-NEXT:   0x1023 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100B
-TYPES-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = constructor with virtual bases | constructor
-TYPES-NEXT:   0x1024 | LF_METHODLIST [size = 28]
-TYPES-NEXT:            - Method [type = 0x101E, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:            - Method [type = 0x1022, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:            - Method [type = 0x1023, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:   0x1025 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x101A, mode = ref, opts = None, kind = ptr32
-TYPES-NEXT:   0x1026 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x1025, # args = 1, param list = 0x101D
-TYPES-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x1027 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x1025, # args = 1, param list = 0x1021
-TYPES-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x1028 | LF_METHODLIST [size = 20]
-TYPES-NEXT:            - Method [type = 0x1026, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:            - Method [type = 0x1027, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:   0x1029 | LF_FIELDLIST [size = 60]
+TYPES-NEXT:            options: forward ref | has unique name, sizeof 0
+TYPES-NEXT:   0x101D | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x101C, mode = pointer, opts = const, kind = ptr64
+TYPES-NEXT:   0x101E | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x101C, mode = rvalue ref, opts = None, kind = ptr64
+TYPES-NEXT:   0x101F | LF_ARGLIST [size = 12]
+TYPES-NEXT:            0x101E: `VInherit&&`
+TYPES-NEXT:   0x1020 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x101F
+TYPES-NEXT:            class type = 0x101C, this type = 0x101D, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = constructor with virtual bases | constructor
+TYPES-NEXT:   0x1021 | LF_MODIFIER [size = 12]
+TYPES-NEXT:            referent = 0x101C, modifiers = const
+TYPES-NEXT:   0x1022 | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x1021, mode = ref, opts = None, kind = ptr64
+TYPES-NEXT:   0x1023 | LF_ARGLIST [size = 12]
+TYPES-NEXT:            0x1022: `const VInherit&`
+TYPES-NEXT:   0x1024 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x1023
+TYPES-NEXT:            class type = 0x101C, this type = 0x101D, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = constructor with virtual bases | constructor
+TYPES-NEXT:   0x1025 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100D
+TYPES-NEXT:            class type = 0x101C, this type = 0x101D, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = constructor with virtual bases | constructor
+TYPES-NEXT:   0x1026 | LF_METHODLIST [size = 28]
+TYPES-NEXT:            - Method [type = 0x1020, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:            - Method [type = 0x1024, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:            - Method [type = 0x1025, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:   0x1027 | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x101C, mode = ref, opts = None, kind = ptr64
+TYPES-NEXT:   0x1028 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x1027, # args = 1, param list = 0x101F
+TYPES-NEXT:            class type = 0x101C, this type = 0x101D, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x1029 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x1027, # args = 1, param list = 0x1023
+TYPES-NEXT:            class type = 0x101C, this type = 0x101D, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x102A | LF_METHODLIST [size = 20]
+TYPES-NEXT:            - Method [type = 0x1028, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:            - Method [type = 0x1029, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:   0x102B | LF_FIELDLIST [size = 60]
 TYPES-NEXT:            - LF_VBCLASS
-TYPES-NEXT:              base = 0x1006, vbptr = 0x1019, vbptr offset = 0, vtable index = 1
+TYPES-NEXT:              base = 0x1008, vbptr = 0x101B, vbptr offset = 0, vtable index = 1
 TYPES-NEXT:              attrs = public
-TYPES-NEXT:            - LF_METHOD [name = `VInherit`, # overloads = 3, overload list = 0x1024]
-TYPES-NEXT:            - LF_METHOD [name = `operator=`, # overloads = 2, overload list = 0x1028]
-TYPES-NEXT:   0x102A | LF_CLASS [size = 48] `VInherit`
+TYPES-NEXT:            - LF_METHOD [name = `VInherit`, # overloads = 3, overload list = 0x1026]
+TYPES-NEXT:            - LF_METHOD [name = `operator=`, # overloads = 2, overload list = 0x102A]
+TYPES-NEXT:   0x102C | LF_CLASS [size = 48] `VInherit`
 TYPES-NEXT:            unique name: `.?AVVInherit@@`
-TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x1029
-TYPES-NEXT:            options: has ctor / dtor | has unique name | overloaded operator | overloaded operator=
-TYPES-NEXT:   0x102B | LF_CLASS [size = 48] `IVInherit`
+TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x102B
+TYPES-NEXT:            options: has ctor / dtor | has unique name | overloaded operator | overloaded operator=, sizeof 16
+TYPES-NEXT:   0x102D | LF_CLASS [size = 48] `IVInherit`
 TYPES-NEXT:            unique name: `.?AVIVInherit@@`
 TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>
-TYPES-NEXT:            options: forward ref | has unique name
-TYPES-NEXT:   0x102C | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x102B, mode = pointer, opts = const, kind = ptr32
-TYPES-NEXT:   0x102D | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x102B, mode = rvalue ref, opts = None, kind = ptr32
-TYPES-NEXT:   0x102E | LF_ARGLIST [size = 12]
-TYPES-NEXT:            0x102D: `IVInherit&&`
-TYPES-NEXT:   0x102F | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x102E
-TYPES-NEXT:            class type = 0x102B, this type = 0x102C, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = constructor with virtual bases | constructor
-TYPES-NEXT:   0x1030 | LF_MODIFIER [size = 12]
-TYPES-NEXT:            referent = 0x102B, modifiers = const
-TYPES-NEXT:   0x1031 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x1030, mode = ref, opts = None, kind = ptr32
-TYPES-NEXT:   0x1032 | LF_ARGLIST [size = 12]
-TYPES-NEXT:            0x1031: `const IVInherit&`
-TYPES-NEXT:   0x1033 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x1032
-TYPES-NEXT:            class type = 0x102B, this type = 0x102C, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = constructor with virtual bases | constructor
-TYPES-NEXT:   0x1034 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100B
-TYPES-NEXT:            class type = 0x102B, this type = 0x102C, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = constructor with virtual bases | constructor
-TYPES-NEXT:   0x1035 | LF_METHODLIST [size = 28]
-TYPES-NEXT:            - Method [type = 0x102F, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:            - Method [type = 0x1033, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:            - Method [type = 0x1034, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:   0x1036 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x102B, mode = ref, opts = None, kind = ptr32
-TYPES-NEXT:   0x1037 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x1036, # args = 1, param list = 0x102E
-TYPES-NEXT:            class type = 0x102B, this type = 0x102C, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x1038 | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x1036, # args = 1, param list = 0x1032
-TYPES-NEXT:            class type = 0x102B, this type = 0x102C, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x1039 | LF_METHODLIST [size = 20]
-TYPES-NEXT:            - Method [type = 0x1037, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:            - Method [type = 0x1038, vftable offset = -1, attrs = public compiler-generated]
-TYPES-NEXT:   0x103A | LF_FIELDLIST [size = 72]
+TYPES-NEXT:            options: forward ref | has unique name, sizeof 0
+TYPES-NEXT:   0x102E | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x102D, mode = pointer, opts = const, kind = ptr64
+TYPES-NEXT:   0x102F | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x102D, mode = rvalue ref, opts = None, kind = ptr64
+TYPES-NEXT:   0x1030 | LF_ARGLIST [size = 12]
+TYPES-NEXT:            0x102F: `IVInherit&&`
+TYPES-NEXT:   0x1031 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x1030
+TYPES-NEXT:            class type = 0x102D, this type = 0x102E, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = constructor with virtual bases | constructor
+TYPES-NEXT:   0x1032 | LF_MODIFIER [size = 12]
+TYPES-NEXT:            referent = 0x102D, modifiers = const
+TYPES-NEXT:   0x1033 | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x1032, mode = ref, opts = None, kind = ptr64
+TYPES-NEXT:   0x1034 | LF_ARGLIST [size = 12]
+TYPES-NEXT:            0x1033: `const IVInherit&`
+TYPES-NEXT:   0x1035 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x1034
+TYPES-NEXT:            class type = 0x102D, this type = 0x102E, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = constructor with virtual bases | constructor
+TYPES-NEXT:   0x1036 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100D
+TYPES-NEXT:            class type = 0x102D, this type = 0x102E, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = constructor with virtual bases | constructor
+TYPES-NEXT:   0x1037 | LF_METHODLIST [size = 28]
+TYPES-NEXT:            - Method [type = 0x1031, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:            - Method [type = 0x1035, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:            - Method [type = 0x1036, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:   0x1038 | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x102D, mode = ref, opts = None, kind = ptr64
+TYPES-NEXT:   0x1039 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x1038, # args = 1, param list = 0x1030
+TYPES-NEXT:            class type = 0x102D, this type = 0x102E, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x103A | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x1038, # args = 1, param list = 0x1034
+TYPES-NEXT:            class type = 0x102D, this type = 0x102E, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x103B | LF_METHODLIST [size = 20]
+TYPES-NEXT:            - Method [type = 0x1039, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:            - Method [type = 0x103A, vftable offset = -1, attrs = public compiler-generated]
+TYPES-NEXT:   0x103C | LF_FIELDLIST [size = 72]
 TYPES-NEXT:            - LF_BCLASS
-TYPES-NEXT:              type = 0x101A, offset = 0, attrs = public
+TYPES-NEXT:              type = 0x101C, offset = 0, attrs = public
 TYPES-NEXT:            - LF_IVBCLASS
-TYPES-NEXT:              base = 0x1006, vbptr = 0x1019, vbptr offset = 0, vtable index = 1
+TYPES-NEXT:              base = 0x1008, vbptr = 0x101B, vbptr offset = 0, vtable index = 1
 TYPES-NEXT:              attrs = public
-TYPES-NEXT:            - LF_METHOD [name = `IVInherit`, # overloads = 3, overload list = 0x1035]
-TYPES-NEXT:            - LF_METHOD [name = `operator=`, # overloads = 2, overload list = 0x1039]
-TYPES-NEXT:   0x103B | LF_CLASS [size = 48] `IVInherit`
+TYPES-NEXT:            - LF_METHOD [name = `IVInherit`, # overloads = 3, overload list = 0x1037]
+TYPES-NEXT:            - LF_METHOD [name = `operator=`, # overloads = 2, overload list = 0x103B]
+TYPES-NEXT:   0x103D | LF_CLASS [size = 48] `IVInherit`
 TYPES-NEXT:            unique name: `.?AVIVInherit@@`
-TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x103A
-TYPES-NEXT:            options: has ctor / dtor | has unique name | overloaded operator | overloaded operator=
-TYPES-NEXT:   0x1087 | LF_FIELDLIST [size = 28]
+TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x103C
+TYPES-NEXT:            options: has ctor / dtor | has unique name | overloaded operator | overloaded operator=, sizeof 16
+TYPES-NEXT:   0x1041 | LF_FIELDLIST [size = 28]
 TYPES-NEXT:            - LF_ENUMERATE [A = 0]
 TYPES-NEXT:            - LF_ENUMERATE [B = 1]
 TYPES-NEXT:            - LF_ENUMERATE [C = 2]
-TYPES-NEXT:   0x1088 | LF_ENUM [size = 64] `FooClass::NestedEnum`
+TYPES-NEXT:   0x1042 | LF_ENUM [size = 64] `FooClass::NestedEnum`
 TYPES-NEXT:            unique name: `.?AW4NestedEnum at FooClass@@`
-TYPES-NEXT:            field list: 0x1087, underlying type: 0x0074 (int)
+TYPES-NEXT:            field list: 0x1041, underlying type: 0x0074 (int)
 TYPES-NEXT:            options: has unique name | is nested
-TYPES-NEXT:   0x1089 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x1006, mode = pointer, opts = const, kind = ptr32
-TYPES-NEXT:   0x108A | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100B
-TYPES-NEXT:            class type = 0x1006, this type = 0x1089, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x108B | LF_ARGLIST [size = 16]
+TYPES-NEXT:   0x1043 | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x1008, mode = pointer, opts = const, kind = ptr64
+TYPES-NEXT:   0x1044 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100D
+TYPES-NEXT:            class type = 0x1008, this type = 0x1043, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x1045 | LF_ARGLIST [size = 16]
 TYPES-NEXT:            0x0074 (int): `int`
 TYPES-NEXT:            0x0074 (int): `int`
-TYPES-NEXT:   0x108C | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 2, param list = 0x108B
-TYPES-NEXT:            class type = 0x1006, this type = 0x1089, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x108D | LF_ARGLIST [size = 12]
+TYPES-NEXT:   0x1046 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 2, param list = 0x1045
+TYPES-NEXT:            class type = 0x1008, this type = 0x1043, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x1047 | LF_ARGLIST [size = 12]
 TYPES-NEXT:            0x0074 (int): `int`
-TYPES-NEXT:   0x108E | LF_MFUNCTION [size = 28]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x108D
-TYPES-NEXT:            class type = 0x1006, this type = 0x1089, this adjust = 0
-TYPES-NEXT:            calling conv = thiscall, options = None
-TYPES-NEXT:   0x108F | LF_METHODLIST [size = 20]
-TYPES-NEXT:            - Method [type = 0x108C, vftable offset = -1, attrs = private]
-TYPES-NEXT:            - Method [type = 0x108E, vftable offset = -1, attrs = private]
-TYPES-NEXT:   0x1090 | LF_BITFIELD [size = 12]
+TYPES-NEXT:   0x1048 | LF_MFUNCTION [size = 28]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 1, param list = 0x1047
+TYPES-NEXT:            class type = 0x1008, this type = 0x1043, this adjust = 0
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x1049 | LF_METHODLIST [size = 20]
+TYPES-NEXT:            - Method [type = 0x1046, vftable offset = -1, attrs = public]
+TYPES-NEXT:            - Method [type = 0x1048, vftable offset = -1, attrs = public]
+TYPES-NEXT:   0x104A | LF_BITFIELD [size = 12]
 TYPES-NEXT:            type = 0x0074 (int), bit offset = 0, # bits = 4
-TYPES-NEXT:   0x1091 | LF_BITFIELD [size = 12]
+TYPES-NEXT:   0x104B | LF_BITFIELD [size = 12]
 TYPES-NEXT:            type = 0x0074 (int), bit offset = 4, # bits = 4
-TYPES-NEXT:   0x1092 | LF_FIELDLIST [size = 164]
-TYPES-NEXT:            - LF_NESTTYPE [name = `NestedEnum`, parent = 0x1088]
+TYPES-NEXT:   0x104C | LF_FIELDLIST [size = 164]
+TYPES-NEXT:            - LF_NESTTYPE [name = `NestedEnum`, parent = 0x1042]
 TYPES-NEXT:            - LF_ONEMETHOD [name = `RegularMethod`]
-TYPES-NEXT:              type = 0x108A, vftable offset = -1, attrs = private
-TYPES-NEXT:            - LF_METHOD [name = `OverloadedMethod`, # overloads = 2, overload list = 0x108F]
-TYPES-NEXT:            - LF_MEMBER [name = `HiNibble`, Type = 0x1090, offset = 0, attrs = private]
-TYPES-NEXT:            - LF_MEMBER [name = `LoNibble`, Type = 0x1091, offset = 0, attrs = private]
-TYPES-NEXT:            - LF_MEMBER [name = `EnumVariable`, Type = 0x1088, offset = 4, attrs = private]
-TYPES-NEXT:            - LF_STMEMBER [name = `StaticMember`, type = 0x0403 (void*), attrs = private]
-TYPES-NEXT:   0x1093 | LF_CLASS [size = 48] `FooClass`
+TYPES-NEXT:              type = 0x1044, vftable offset = -1, attrs = public
+TYPES-NEXT:            - LF_METHOD [name = `OverloadedMethod`, # overloads = 2, overload list = 0x1049]
+TYPES-NEXT:            - LF_MEMBER [name = `HiNibble`, Type = 0x104A, offset = 0, attrs = public]
+TYPES-NEXT:            - LF_MEMBER [name = `LoNibble`, Type = 0x104B, offset = 0, attrs = public]
+TYPES-NEXT:            - LF_MEMBER [name = `EnumVariable`, Type = 0x1042, offset = 4, attrs = public]
+TYPES-NEXT:            - LF_STMEMBER [name = `StaticMember`, type = 0x0603 (void*), attrs = public]
+TYPES-NEXT:   0x104D | LF_CLASS [size = 48] `FooClass`
 TYPES-NEXT:            unique name: `.?AVFooClass@@`
-TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x1092
-TYPES-NEXT:            options: contains nested class | has unique name
-TYPES-NEXT:   0x1094 | LF_FIELDLIST [size = 16]
-TYPES-NEXT:            - LF_MEMBER [name = `X`, Type = 0x0074 (int), offset = 0, attrs = public]
-TYPES-NEXT:   0x1095 | LF_UNION [size = 40] `TheUnion`
+TYPES-NEXT:            vtable: <no type>, base list: <no type>, field list: 0x104C
+TYPES-NEXT:            options: contains nested class | has unique name, sizeof 8
+TYPES-NEXT:   0x1098 | LF_UNION [size = 40] `TheUnion`
 TYPES-NEXT:            unique name: `.?ATTheUnion@@`
-TYPES-NEXT:            field list: 0x1094
-TYPES-NEXT:            options: has unique name | sealed
-TYPES-NEXT:   0x1096 | LF_PROCEDURE [size = 16]
-TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100B
-TYPES-NEXT:            calling conv = cdecl, options = None
-TYPES-NEXT:   0x1097 | LF_POINTER [size = 12]
-TYPES-NEXT:            referent = 0x1096, mode = pointer, opts = const, kind = ptr32
-TYPES-NEXT:   0x1098 | LF_ARRAY [size = 16]
-TYPES-NEXT:            size: 4, index type: 0x0022 (unsigned long), element type: 0x1097
+TYPES-NEXT:            field list: <no type>
+TYPES-NEXT:            options: forward ref | has unique name, sizeof 0
+TYPES-NEXT:   0x10AA | LF_PROCEDURE [size = 16]
+TYPES-NEXT:            return type = 0x0003 (void), # args = 0, param list = 0x100D
+TYPES-NEXT:            calling conv = cdecl, options = None
+TYPES-NEXT:   0x10AB | LF_POINTER [size = 12]
+TYPES-NEXT:            referent = 0x10AA, mode = pointer, opts = const, kind = ptr64
+TYPES-NEXT:   0x10AC | LF_ARRAY [size = 16]
+TYPES-NEXT:            size: 8, index type: 0x0023 (unsigned __int64), element type: 0x10AB

Modified: llvm/trunk/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp Fri Sep 14 15:29:19 2018
@@ -51,6 +51,13 @@ void ClassDefinitionDumper::prettyPrintC
   uint32_t Size = Layout.getSize();
   const PDBSymbolTypeUDT &Class = Layout.getClass();
 
+  if (Layout.getClass().isConstType())
+    WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
+  if (Layout.getClass().isVolatileType())
+    WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
+  if (Layout.getClass().isUnalignedType())
+    WithColor(Printer, PDB_ColorItem::Keyword).get() << "unaligned ";
+
   WithColor(Printer, PDB_ColorItem::Keyword).get() << Class.getUdtKind() << " ";
   WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();
   WithColor(Printer, PDB_ColorItem::Comment).get() << " [sizeof = " << Size

Modified: llvm/trunk/tools/llvm-pdbutil/PrettyEnumDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/PrettyEnumDumper.cpp?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/PrettyEnumDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/PrettyEnumDumper.cpp Fri Sep 14 15:29:19 2018
@@ -23,6 +23,18 @@ using namespace llvm::pdb;
 EnumDumper::EnumDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}
 
 void EnumDumper::start(const PDBSymbolTypeEnum &Symbol) {
+  if (Symbol.getUnmodifiedTypeId() != 0) {
+    if (Symbol.isConstType())
+      WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
+    if (Symbol.isVolatileType())
+      WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
+    if (Symbol.isUnalignedType())
+      WithColor(Printer, PDB_ColorItem::Keyword).get() << "unaligned ";
+    WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
+    WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
+    return;
+  }
+
   WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
   WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
   if (!opts::pretty::NoEnumDefs) {

Modified: llvm/trunk/tools/llvm-pdbutil/PrettyTypeDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/PrettyTypeDumper.cpp?rev=342295&r1=342294&r2=342295&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/PrettyTypeDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/PrettyTypeDumper.cpp Fri Sep 14 15:29:19 2018
@@ -196,11 +196,22 @@ void TypeDumper::start(const PDBSymbolEx
           dumpClassLayout(*Class);
       } else {
         while (auto Class = Classes->getNext()) {
-          if (Class->getUnmodifiedTypeId() != 0)
+          if (Printer.IsTypeExcluded(Class->getName(), Class->getLength()))
             continue;
 
-          if (Printer.IsTypeExcluded(Class->getName(), Class->getLength()))
+          if (Class->getUnmodifiedTypeId() != 0) {
+            Printer.NewLine();
+            if (Class->isConstType())
+              WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
+            if (Class->isVolatileType())
+              WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
+            if (Class->isUnalignedType())
+              WithColor(Printer, PDB_ColorItem::Keyword).get() << "unaligned ";
+            WithColor(Printer, PDB_ColorItem::Keyword).get()
+                << Class->getUdtKind() << " ";
+            WithColor(Printer, PDB_ColorItem::Type).get() << Class->getName();
             continue;
+          }
 
           auto Layout = llvm::make_unique<ClassLayout>(std::move(Class));
           if (Layout->deepPaddingSize() < opts::pretty::PaddingThreshold)
@@ -244,9 +255,9 @@ void TypeDumper::dumpClassLayout(const C
   assert(opts::pretty::Classes);
 
   if (opts::pretty::ClassFormat == opts::pretty::ClassDefinitionFormat::None) {
-    Printer.NewLine();
-    WithColor(Printer, PDB_ColorItem::Keyword).get() << "class ";
-    WithColor(Printer, PDB_ColorItem::Identifier).get() << Class.getName();
+    WithColor(Printer, PDB_ColorItem::Keyword).get()
+        << Class.getClass().getUdtKind() << " ";
+    WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();
   } else {
     ClassDefinitionDumper Dumper(Printer);
     Dumper.start(Class);




More information about the llvm-commits mailing list