diff --git a/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h b/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h index d8afba6069c2..f463047bb5b5 100644 --- a/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h +++ b/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h @@ -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) diff --git a/llvm/test/DebugInfo/PDB/Inputs/every-type.cpp b/llvm/test/DebugInfo/PDB/Inputs/every-type.cpp index ed715b034300..338f8ea0c674 100644 --- a/llvm/test/DebugInfo/PDB/Inputs/every-type.cpp +++ b/llvm/test/DebugInfo/PDB/Inputs/every-type.cpp @@ -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 +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) { // LF_PROCEDURE 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]; } diff --git a/llvm/test/DebugInfo/PDB/Inputs/every-type.pdb b/llvm/test/DebugInfo/PDB/Inputs/every-type.pdb index 64996d61d3e7..e70f0d74847a 100644 Binary files a/llvm/test/DebugInfo/PDB/Inputs/every-type.pdb and b/llvm/test/DebugInfo/PDB/Inputs/every-type.pdb differ diff --git a/llvm/test/DebugInfo/PDB/Inputs/every-type.yaml b/llvm/test/DebugInfo/PDB/Inputs/every-type.yaml index 8f23e8ad5e89..191c49042be6 100644 --- a/llvm/test/DebugInfo/PDB/Inputs/every-type.yaml +++ b/llvm/test/DebugInfo/PDB/Inputs/every-type.yaml @@ -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. diff --git a/llvm/test/DebugInfo/PDB/Native/pdb-native-enums.test b/llvm/test/DebugInfo/PDB/Native/pdb-native-enums.test index f175a87d38a7..ed2eb6901905 100644 --- a/llvm/test/DebugInfo/PDB/Native/pdb-native-enums.test +++ b/llvm/test/DebugInfo/PDB/Native/pdb-native-enums.test @@ -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 diff --git a/llvm/test/DebugInfo/PDB/every-type.test b/llvm/test/DebugInfo/PDB/every-type.test index e6b9c15815d0..f188c746e60e 100644 --- a/llvm/test/DebugInfo/PDB/every-type.test +++ b/llvm/test/DebugInfo/PDB/every-type.test @@ -8,254 +8,252 @@ we claim to understand. We then test this in two ways: 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: , base list: , field list: -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: unique name: `.?AVInherit@@` -TYPES-NEXT: vtable: , base list: , field list: -TYPES-NEXT: options: forward ref | has unique name +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 = 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: 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: - LF_BCLASS -TYPES-NEXT: type = 0x1006, offset = 4, attrs = public -TYPES-NEXT: - LF_VFUNCTAB type = 0x1008 -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: - LF_ONEMETHOD [name = `operator=`] -TYPES-NEXT: type = 0x1014, 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: - 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: referent = 0x1009, mode = pointer, opts = None, kind = ptr64 +TYPES-NEXT: 0x100B | LF_CLASS [size = 44] `Inherit` TYPES-NEXT: unique name: `.?AVInherit@@` -TYPES-NEXT: vtable: 0x1007, base list: , 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: unique name: `.?AVVInherit@@` TYPES-NEXT: vtable: , base list: , field list: -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: - LF_VBCLASS -TYPES-NEXT: base = 0x1006, vbptr = 0x1019, 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: unique name: `.?AVVInherit@@` -TYPES-NEXT: vtable: , base list: , 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: unique name: `.?AVIVInherit@@` -TYPES-NEXT: vtable: , base list: , field list: -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: 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 = 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 = 0x101A, offset = 0, attrs = public -TYPES-NEXT: - LF_IVBCLASS -TYPES-NEXT: base = 0x1006, vbptr = 0x1019, vbptr offset = 0, vtable index = 1 +TYPES-NEXT: type = 0x1008, offset = 8, attrs = public +TYPES-NEXT: - LF_VFUNCTAB type = 0x100A +TYPES-NEXT: - LF_ONEMETHOD [name = `~Inherit`] +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 = 0x1016, vftable offset = -1, attrs = public compiler-generated +TYPES-NEXT: - LF_ONEMETHOD [name = `__local_vftable_ctor_closure`] +TYPES-NEXT: type = 0x100E, vftable offset = -1, attrs = public compiler-generated +TYPES-NEXT: - LF_ONEMETHOD [name = `__vecDelDtor`] +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: 0x1009, base list: , 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: , base list: , field list: +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 = 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 = `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: , base list: , 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: , base list: , 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: , base list: , field list: +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 = 0x101C, offset = 0, attrs = public +TYPES-NEXT: - LF_IVBCLASS +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 = 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: , base list: , 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@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: 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: 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: type = 0x0074 (int), bit offset = 0, # bits = 4 -TYPES-NEXT: 0x1091 | 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: - 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: unique name: `.?AVFooClass@@` -TYPES-NEXT: vtable: , base list: , 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: 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: 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: 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: 0x1045 | LF_ARGLIST [size = 16] +TYPES-NEXT: 0x0074 (int): `int` +TYPES-NEXT: 0x0074 (int): `int` +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: 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: 0x104B | LF_BITFIELD [size = 12] +TYPES-NEXT: type = 0x0074 (int), bit offset = 4, # bits = 4 +TYPES-NEXT: 0x104C | LF_FIELDLIST [size = 164] +TYPES-NEXT: - LF_NESTTYPE [name = `NestedEnum`, parent = 0x1042] +TYPES-NEXT: - LF_ONEMETHOD [name = `RegularMethod`] +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: , base list: , 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: +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 diff --git a/llvm/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp b/llvm/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp index 651cb8b7649e..f009f53a3932 100644 --- a/llvm/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp +++ b/llvm/tools/llvm-pdbutil/PrettyClassDefinitionDumper.cpp @@ -51,6 +51,13 @@ void ClassDefinitionDumper::prettyPrintClassIntro(const ClassLayout &Layout) { 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 diff --git a/llvm/tools/llvm-pdbutil/PrettyEnumDumper.cpp b/llvm/tools/llvm-pdbutil/PrettyEnumDumper.cpp index bf22e75e3949..f4cbd3f8fa14 100644 --- a/llvm/tools/llvm-pdbutil/PrettyEnumDumper.cpp +++ b/llvm/tools/llvm-pdbutil/PrettyEnumDumper.cpp @@ -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) { diff --git a/llvm/tools/llvm-pdbutil/PrettyTypeDumper.cpp b/llvm/tools/llvm-pdbutil/PrettyTypeDumper.cpp index 663a608fe429..8eea4c2fb207 100644 --- a/llvm/tools/llvm-pdbutil/PrettyTypeDumper.cpp +++ b/llvm/tools/llvm-pdbutil/PrettyTypeDumper.cpp @@ -196,12 +196,23 @@ void TypeDumper::start(const PDBSymbolExe &Exe) { dumpClassLayout(*Class); } else { while (auto Class = Classes->getNext()) { - if (Class->getUnmodifiedTypeId() != 0) - continue; - if (Printer.IsTypeExcluded(Class->getName(), Class->getLength())) continue; + 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(std::move(Class)); if (Layout->deepPaddingSize() < opts::pretty::PaddingThreshold) continue; @@ -244,9 +255,9 @@ void TypeDumper::dumpClassLayout(const ClassLayout &Class) { 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);