[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.

llvm-svn: 342295
This commit is contained in:
Zachary Turner 2018-09-14 22:29:19 +00:00
parent 7a41693898
commit a98ee586bf
9 changed files with 308 additions and 244 deletions

View File

@ -34,6 +34,7 @@ public:
FORWARD_SYMBOL_METHOD(hasNestedTypes) FORWARD_SYMBOL_METHOD(hasNestedTypes)
FORWARD_SYMBOL_METHOD(getLength) FORWARD_SYMBOL_METHOD(getLength)
FORWARD_SYMBOL_ID_METHOD(getLexicalParent) FORWARD_SYMBOL_ID_METHOD(getLexicalParent)
FORWARD_SYMBOL_ID_METHOD(getUnmodifiedType)
FORWARD_SYMBOL_METHOD(getName) FORWARD_SYMBOL_METHOD(getName)
FORWARD_SYMBOL_METHOD(getSrcLineOnTypeDefn) FORWARD_SYMBOL_METHOD(getSrcLineOnTypeDefn)
FORWARD_SYMBOL_METHOD(isNested) FORWARD_SYMBOL_METHOD(isNested)

View File

@ -4,10 +4,12 @@
void *__purecall = 0; void *__purecall = 0;
void __cdecl operator delete(void *,unsigned int) {} void __cdecl operator delete(void *,unsigned int) {}
void __cdecl operator delete(void *,unsigned __int64) {}
struct FooStruct { }; // LF_STRUCTURE struct FooStruct { }; // LF_STRUCTURE
class FooClass { // LF_CLASS class FooClass { // LF_CLASS
public:
// LF_FIELDLIST // LF_FIELDLIST
enum NestedEnum { // LF_ENUM enum NestedEnum { // LF_ENUM
// LF_NESTTYPE // LF_NESTTYPE
@ -50,6 +52,15 @@ union TheUnion {
int SomeArray[7] = {1, 2, 3, 4, 5, 6, 7}; // LF_ARRAY 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 int main(int argc, char **argv) { // LF_PROCEDURE
const int X = 7; // LF_MODIFIER const int X = 7; // LF_MODIFIER
@ -59,5 +70,9 @@ int main(int argc, char **argv) { // LF_PROCEDURE
VInherit VInheritInstance; VInherit VInheritInstance;
IVInherit IVInheritInstance; IVInherit IVInheritInstance;
TheUnion UnionInstance; 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]; return SomeArray[argc];
} }

View File

@ -222,7 +222,7 @@ TpiStream:
VBPtrType: 0x1001 # const int * VBPtrType: 0x1001 # const int *
VBPtrOffset: 0 VBPtrOffset: 0
VTableIndex: 1 VTableIndex: 1
# class Inherit : public FooClass {}; [Index: 0x1014] # struct Inherit : public FooClass {}; [Index: 0x1014]
- Kind: LF_STRUCTURE - Kind: LF_STRUCTURE
Class: Class:
MemberCount: 1 MemberCount: 1
@ -242,6 +242,26 @@ TpiStream:
DerivationList: 0x1012 DerivationList: 0x1012
VTableShape: 0 VTableShape: 0
Size: 4 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 # // Member type records. These are generally not length prefixed, and appear
# // inside of a field list record. # // inside of a field list record.

View File

@ -12,7 +12,7 @@ DUMP-NEXT: symIndexId: 2
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 DUMP-NEXT: lexicalParentId: 0
DUMP-NEXT: name: __vc_attributes::event_sourceAttribute::type_e DUMP-NEXT: name: FooClass::NestedEnum
DUMP-NEXT: typeId: 3 DUMP-NEXT: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0
@ -36,7 +36,7 @@ DUMP-NEXT: symIndexId: 4
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 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: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0
@ -60,7 +60,7 @@ DUMP-NEXT: symIndexId: 5
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 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: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0
@ -84,7 +84,7 @@ DUMP-NEXT: symIndexId: 6
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 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: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0
@ -108,7 +108,7 @@ DUMP-NEXT: symIndexId: 7
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 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: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0
@ -132,7 +132,7 @@ DUMP-NEXT: symIndexId: 8
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 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: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0
@ -156,7 +156,7 @@ DUMP-NEXT: symIndexId: 9
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 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: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0
@ -180,7 +180,7 @@ DUMP-NEXT: symIndexId: 10
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 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: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0
@ -204,7 +204,7 @@ DUMP-NEXT: symIndexId: 11
DUMP-NEXT: symTag: 12 DUMP-NEXT: symTag: 12
DUMP-NEXT: baseType: 6 DUMP-NEXT: baseType: 6
DUMP-NEXT: lexicalParentId: 0 DUMP-NEXT: lexicalParentId: 0
DUMP-NEXT: name: FooClass::NestedEnum DUMP-NEXT: name: __vc_attributes::moduleAttribute::type_e
DUMP-NEXT: typeId: 3 DUMP-NEXT: typeId: 3
DUMP-NEXT: length: 4 DUMP-NEXT: length: 4
DUMP-NEXT: constructor: 0 DUMP-NEXT: constructor: 0

View File

@ -8,254 +8,252 @@ we claim to understand. We then test this in two ways:
hasn't changed. 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: -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 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 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 RUN: -dependents %t.yaml.pdb | FileCheck --check-prefix=TYPES %s
TYPES: Types (TPI Stream) TYPES: Types (TPI Stream)
TYPES-NEXT: ============================================================ TYPES-NEXT: ============================================================
TYPES-NEXT: Showing 7 records and their dependents (73 records total) TYPES-NEXT: Showing 7 records and their dependents (72 records total)
TYPES-NEXT: 0x1005 | LF_MODIFIER [size = 12] TYPES-NEXT: 0x1007 | LF_MODIFIER [size = 12]
TYPES-NEXT: referent = 0x0074 (int), modifiers = const 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: unique name: `.?AVFooClass@@`
TYPES-NEXT: vtable: <no type>, base list: <no type>, field list: <no type> TYPES-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
TYPES-NEXT: options: forward ref | has unique name TYPES-NEXT: options: forward ref | has unique name, sizeof 0
TYPES-NEXT: 0x1007 | LF_VTSHAPE [size = 8] TYPES-NEXT: 0x1009 | 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: <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: 0x100A | LF_POINTER [size = 12]
TYPES-NEXT: referent = 0x1009, mode = pointer, opts = const, kind = ptr32 TYPES-NEXT: referent = 0x1009, mode = pointer, opts = None, kind = ptr64
TYPES-NEXT: 0x100B | LF_ARGLIST [size = 8] TYPES-NEXT: 0x100B | LF_CLASS [size = 44] `Inherit`
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: unique name: `.?AVInherit@@` 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: unique name: `.?AVVInherit@@`
TYPES-NEXT: vtable: <no type>, base list: <no type>, field list: <no type> TYPES-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
TYPES-NEXT: options: forward ref | has unique name TYPES-NEXT: options: forward ref | has unique name, sizeof 0
TYPES-NEXT: 0x101B | LF_POINTER [size = 12] TYPES-NEXT: 0x100C | LF_POINTER [size = 12]
TYPES-NEXT: referent = 0x101A, mode = pointer, opts = const, kind = ptr32 TYPES-NEXT: referent = 0x100B, mode = pointer, opts = const, kind = ptr64
TYPES-NEXT: 0x101C | LF_POINTER [size = 12] TYPES-NEXT: 0x100D | LF_ARGLIST [size = 8]
TYPES-NEXT: referent = 0x101A, mode = rvalue ref, opts = None, kind = ptr32 TYPES-NEXT: 0x100E | LF_MFUNCTION [size = 28]
TYPES-NEXT: 0x101D | LF_ARGLIST [size = 12] TYPES-NEXT: return type = 0x0003 (void), # args = 0, param list = 0x100D
TYPES-NEXT: 0x101C: `VInherit&&` TYPES-NEXT: class type = 0x100B, this type = 0x100C, this adjust = 0
TYPES-NEXT: 0x101E | LF_MFUNCTION [size = 28] TYPES-NEXT: calling conv = cdecl, options = None
TYPES-NEXT: return type = 0x0003 (void), # args = 1, param list = 0x101D TYPES-NEXT: 0x100F | LF_MODIFIER [size = 12]
TYPES-NEXT: class type = 0x101A, this type = 0x101B, this adjust = 0 TYPES-NEXT: referent = 0x100B, modifiers = const
TYPES-NEXT: calling conv = thiscall, options = constructor with virtual bases | constructor TYPES-NEXT: 0x1010 | LF_POINTER [size = 12]
TYPES-NEXT: 0x101F | LF_MODIFIER [size = 12] TYPES-NEXT: referent = 0x100F, mode = ref, opts = None, kind = ptr64
TYPES-NEXT: referent = 0x101A, modifiers = const TYPES-NEXT: 0x1011 | LF_ARGLIST [size = 12]
TYPES-NEXT: 0x1020 | LF_POINTER [size = 12] TYPES-NEXT: 0x1010: `const Inherit&`
TYPES-NEXT: referent = 0x101F, mode = ref, opts = None, kind = ptr32 TYPES-NEXT: 0x1012 | LF_MFUNCTION [size = 28]
TYPES-NEXT: 0x1021 | LF_ARGLIST [size = 12] TYPES-NEXT: return type = 0x0003 (void), # args = 1, param list = 0x1011
TYPES-NEXT: 0x1020: `const VInherit&` TYPES-NEXT: class type = 0x100B, this type = 0x100C, this adjust = 0
TYPES-NEXT: 0x1022 | LF_MFUNCTION [size = 28] TYPES-NEXT: calling conv = cdecl, options = constructor
TYPES-NEXT: return type = 0x0003 (void), # args = 1, param list = 0x1021 TYPES-NEXT: 0x1013 | LF_MFUNCTION [size = 28]
TYPES-NEXT: class type = 0x101A, this type = 0x101B, this adjust = 0 TYPES-NEXT: return type = 0x0003 (void), # args = 0, param list = 0x100D
TYPES-NEXT: calling conv = thiscall, options = constructor with virtual bases | constructor TYPES-NEXT: class type = 0x100B, this type = 0x100C, this adjust = 0
TYPES-NEXT: 0x1023 | LF_MFUNCTION [size = 28] TYPES-NEXT: calling conv = cdecl, options = constructor
TYPES-NEXT: return type = 0x0003 (void), # args = 0, param list = 0x100B TYPES-NEXT: 0x1014 | LF_METHODLIST [size = 20]
TYPES-NEXT: class type = 0x101A, this type = 0x101B, this adjust = 0 TYPES-NEXT: - Method [type = 0x1012, vftable offset = -1, attrs = public compiler-generated]
TYPES-NEXT: calling conv = thiscall, options = constructor with virtual bases | constructor TYPES-NEXT: - Method [type = 0x1013, vftable offset = -1, attrs = public compiler-generated]
TYPES-NEXT: 0x1024 | LF_METHODLIST [size = 28] TYPES-NEXT: 0x1015 | LF_POINTER [size = 12]
TYPES-NEXT: - Method [type = 0x101E, vftable offset = -1, attrs = public compiler-generated] TYPES-NEXT: referent = 0x100B, mode = ref, opts = None, kind = ptr64
TYPES-NEXT: - Method [type = 0x1022, vftable offset = -1, attrs = public compiler-generated] TYPES-NEXT: 0x1016 | LF_MFUNCTION [size = 28]
TYPES-NEXT: - Method [type = 0x1023, vftable offset = -1, attrs = public compiler-generated] TYPES-NEXT: return type = 0x1015, # args = 1, param list = 0x1011
TYPES-NEXT: 0x1025 | LF_POINTER [size = 12] TYPES-NEXT: class type = 0x100B, this type = 0x100C, this adjust = 0
TYPES-NEXT: referent = 0x101A, mode = ref, opts = None, kind = ptr32 TYPES-NEXT: calling conv = cdecl, options = None
TYPES-NEXT: 0x1026 | LF_MFUNCTION [size = 28] TYPES-NEXT: 0x1017 | LF_ARGLIST [size = 12]
TYPES-NEXT: return type = 0x1025, # args = 1, param list = 0x101D TYPES-NEXT: 0x0075 (unsigned): `unsigned`
TYPES-NEXT: class type = 0x101A, this type = 0x101B, this adjust = 0 TYPES-NEXT: 0x1018 | LF_MFUNCTION [size = 28]
TYPES-NEXT: calling conv = thiscall, options = None TYPES-NEXT: return type = 0x0603 (void*), # args = 1, param list = 0x1017
TYPES-NEXT: 0x1027 | LF_MFUNCTION [size = 28] TYPES-NEXT: class type = 0x100B, this type = 0x100C, this adjust = 0
TYPES-NEXT: return type = 0x1025, # args = 1, param list = 0x1021 TYPES-NEXT: calling conv = cdecl, options = None
TYPES-NEXT: class type = 0x101A, this type = 0x101B, this adjust = 0 TYPES-NEXT: 0x1019 | LF_FIELDLIST [size = 152]
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: <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: 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: - LF_BCLASS TYPES-NEXT: - LF_BCLASS
TYPES-NEXT: type = 0x101A, offset = 0, attrs = public TYPES-NEXT: type = 0x1008, offset = 8, attrs = public
TYPES-NEXT: - LF_IVBCLASS TYPES-NEXT: - LF_VFUNCTAB type = 0x100A
TYPES-NEXT: base = 0x1006, vbptr = 0x1019, vbptr offset = 0, vtable index = 1 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: <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, 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: attrs = public
TYPES-NEXT: - LF_METHOD [name = `IVInherit`, # overloads = 3, overload list = 0x1035] TYPES-NEXT: - LF_METHOD [name = `VInherit`, # overloads = 3, overload list = 0x1026]
TYPES-NEXT: - LF_METHOD [name = `operator=`, # overloads = 2, overload list = 0x1039] TYPES-NEXT: - LF_METHOD [name = `operator=`, # overloads = 2, overload list = 0x102A]
TYPES-NEXT: 0x103B | LF_CLASS [size = 48] `IVInherit` TYPES-NEXT: 0x102C | LF_CLASS [size = 48] `VInherit`
TYPES-NEXT: unique name: `.?AVVInherit@@`
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: unique name: `.?AVIVInherit@@`
TYPES-NEXT: vtable: <no type>, base list: <no type>, field list: 0x103A TYPES-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
TYPES-NEXT: options: has ctor / dtor | has unique name | overloaded operator | overloaded operator= TYPES-NEXT: options: forward ref | has unique name, sizeof 0
TYPES-NEXT: 0x1087 | LF_FIELDLIST [size = 28] 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: <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 [A = 0]
TYPES-NEXT: - LF_ENUMERATE [B = 1] TYPES-NEXT: - LF_ENUMERATE [B = 1]
TYPES-NEXT: - LF_ENUMERATE [C = 2] 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: 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: options: has unique name | is nested
TYPES-NEXT: 0x1089 | LF_POINTER [size = 12] TYPES-NEXT: 0x1043 | LF_POINTER [size = 12]
TYPES-NEXT: referent = 0x1006, mode = pointer, opts = const, kind = ptr32 TYPES-NEXT: referent = 0x1008, mode = pointer, opts = const, kind = ptr64
TYPES-NEXT: 0x108A | LF_MFUNCTION [size = 28] TYPES-NEXT: 0x1044 | LF_MFUNCTION [size = 28]
TYPES-NEXT: return type = 0x0003 (void), # args = 0, param list = 0x100B TYPES-NEXT: return type = 0x0003 (void), # args = 0, param list = 0x100D
TYPES-NEXT: class type = 0x1006, this type = 0x1089, this adjust = 0 TYPES-NEXT: class type = 0x1008, this type = 0x1043, 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: <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: 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: calling conv = cdecl, options = None
TYPES-NEXT: 0x1097 | LF_POINTER [size = 12] TYPES-NEXT: 0x1045 | LF_ARGLIST [size = 16]
TYPES-NEXT: referent = 0x1096, mode = pointer, opts = const, kind = ptr32 TYPES-NEXT: 0x0074 (int): `int`
TYPES-NEXT: 0x1098 | LF_ARRAY [size = 16] TYPES-NEXT: 0x0074 (int): `int`
TYPES-NEXT: size: 4, index type: 0x0022 (unsigned long), element type: 0x1097 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: <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: <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

View File

@ -51,6 +51,13 @@ void ClassDefinitionDumper::prettyPrintClassIntro(const ClassLayout &Layout) {
uint32_t Size = Layout.getSize(); uint32_t Size = Layout.getSize();
const PDBSymbolTypeUDT &Class = Layout.getClass(); 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::Keyword).get() << Class.getUdtKind() << " ";
WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName(); WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();
WithColor(Printer, PDB_ColorItem::Comment).get() << " [sizeof = " << Size WithColor(Printer, PDB_ColorItem::Comment).get() << " [sizeof = " << Size

View File

@ -23,6 +23,18 @@ using namespace llvm::pdb;
EnumDumper::EnumDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {} EnumDumper::EnumDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}
void EnumDumper::start(const PDBSymbolTypeEnum &Symbol) { 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::Keyword).get() << "enum ";
WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName(); WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
if (!opts::pretty::NoEnumDefs) { if (!opts::pretty::NoEnumDefs) {

View File

@ -196,12 +196,23 @@ void TypeDumper::start(const PDBSymbolExe &Exe) {
dumpClassLayout(*Class); dumpClassLayout(*Class);
} else { } else {
while (auto Class = Classes->getNext()) { while (auto Class = Classes->getNext()) {
if (Class->getUnmodifiedTypeId() != 0)
continue;
if (Printer.IsTypeExcluded(Class->getName(), Class->getLength())) if (Printer.IsTypeExcluded(Class->getName(), Class->getLength()))
continue; 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<ClassLayout>(std::move(Class)); auto Layout = llvm::make_unique<ClassLayout>(std::move(Class));
if (Layout->deepPaddingSize() < opts::pretty::PaddingThreshold) if (Layout->deepPaddingSize() < opts::pretty::PaddingThreshold)
continue; continue;
@ -244,9 +255,9 @@ void TypeDumper::dumpClassLayout(const ClassLayout &Class) {
assert(opts::pretty::Classes); assert(opts::pretty::Classes);
if (opts::pretty::ClassFormat == opts::pretty::ClassDefinitionFormat::None) { if (opts::pretty::ClassFormat == opts::pretty::ClassDefinitionFormat::None) {
Printer.NewLine(); WithColor(Printer, PDB_ColorItem::Keyword).get()
WithColor(Printer, PDB_ColorItem::Keyword).get() << "class "; << Class.getClass().getUdtKind() << " ";
WithColor(Printer, PDB_ColorItem::Identifier).get() << Class.getName(); WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();
} else { } else {
ClassDefinitionDumper Dumper(Printer); ClassDefinitionDumper Dumper(Printer);
Dumper.start(Class); Dumper.start(Class);