[llvm] r307187 - [PDB] Add a test that verifies every known type record.
Zachary Turner via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 5 11:43:26 PDT 2017
Author: zturner
Date: Wed Jul 5 11:43:25 2017
New Revision: 307187
URL: http://llvm.org/viewvc/llvm-project?rev=307187&view=rev
Log:
[PDB] Add a test that verifies every known type record.
We had a lot of one-off tests for this type and that type,
or "every type that happens to be generated by this program
I built". Eventually I got a bug report filed where we were
crashing on a type that was not covered by any of these tests.
So this test carefully constructs a minimal C++ program that
will cause every type we support to be emitted. This ensures
full coverage for type records.
Differential Revision: https://reviews.llvm.org/D34915
Added:
llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.cpp
llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.pdb (with props)
llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.yaml
llvm/trunk/test/DebugInfo/PDB/every-type.test
Modified:
llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
llvm/trunk/test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test
llvm/trunk/test/DebugInfo/PDB/pdbdump-mergetypes.test
llvm/trunk/test/tools/llvm-pdbdump/partial-type-stream.test
llvm/trunk/tools/llvm-pdbutil/MinimalTypeDumper.cpp
llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp
Added: 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=307187&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.cpp (added)
+++ llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.cpp Wed Jul 5 11:43:25 2017
@@ -0,0 +1,63 @@
+// Build with "cl.exe /Zi /GR- /GX- every-type.cpp /link /debug /nodefaultlib /entry:main"
+
+// clang-format off
+void *__purecall = 0;
+
+void __cdecl operator delete(void *,unsigned int) {}
+
+struct FooStruct { }; // LF_STRUCTURE
+
+class FooClass { // LF_CLASS
+ // LF_FIELDLIST
+ enum NestedEnum { // LF_ENUM
+ // LF_NESTTYPE
+ A, B, C // LF_ENUMERATE
+ };
+
+ void RegularMethod() {} // LF_ARGLIST
+ // LF_ONEMETHOD
+ // LF_MFUNCTION
+
+ void OverloadedMethod(int) {} // LF_METHODLIST
+ // LF_METHOD
+ void OverloadedMethod(int, int) {}
+
+ int HiNibble : 4; // LF_BITFIELD
+ int LoNibble : 4;
+ NestedEnum EnumVariable; // LF_MEMBER
+ static void *StaticMember; // LF_POINTER
+ // LF_STMEMBER
+};
+
+void *FooClass::StaticMember = nullptr;
+
+class Inherit : public FooClass { // LF_BCLASS
+public:
+ virtual ~Inherit() {} // LF_VTSHAPE
+ // LF_VFUNCTAB
+};
+
+class VInherit : public virtual FooClass { // LF_VBCLASS
+
+};
+
+class IVInherit : public VInherit { // LF_IVBCLASS
+};
+
+union TheUnion {
+ int X; // LF_UNION
+};
+
+int SomeArray[7] = {1, 2, 3, 4, 5, 6, 7}; // LF_ARRAY
+
+int main(int argc, char **argv) { // LF_PROCEDURE
+ const int X = 7; // LF_MODIFIER
+
+ FooStruct FooStructInstance;
+ FooClass FooClassInstance;
+ Inherit InheritInstance;
+ VInherit VInheritInstance;
+ IVInherit IVInheritInstance;
+ TheUnion UnionInstance;
+ return SomeArray[argc];
+}
Added: 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=307187&view=auto
==============================================================================
Binary file - no diff available.
Propchange: llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.pdb
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: 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=307187&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.yaml (added)
+++ llvm/trunk/test/DebugInfo/PDB/Inputs/every-type.yaml Wed Jul 5 11:43:25 2017
@@ -0,0 +1,272 @@
+---
+TpiStream:
+ Records:
+ # int* [Index: 0x1000]
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 116 # int
+ Attrs: 32778
+ # const int* [Index: 0x1001]
+ - Kind: LF_MODIFIER
+ Modifier:
+ ModifiedType: 0x1000
+ Modifiers: [ Const ]
+ # char* [Index: 0x1002]
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 1136 # char*
+ Attrs: 32778
+ # (int, char **) [Index: 0x1003]
+ - Kind: LF_ARGLIST
+ ArgList:
+ ArgIndicies: [ 116, 0x1002 ]
+ # (int, double) [Index: 0x1004]
+ - Kind: LF_ARGLIST
+ ArgList:
+ ArgIndicies: [ 116, 65 ] # (int, double)
+ # int main(int argc, char **argv) [Index: 0x1005]
+ - Kind: LF_PROCEDURE
+ Procedure:
+ ReturnType: 117 # int
+ CallConv: NearC # __cdecl
+ Options: [ None ]
+ ParameterCount: 2
+ ArgumentList: 0x1003 # (int, char**)
+ # <label> [Index: 0x1006]
+ - Kind: LF_LABEL
+ Label:
+ Mode: Near
+ # <forward decl>
+ # class FooClass; [Index: 0x1007]
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 0
+ Options: [ None, ForwardReference ]
+ FieldList: 0
+ Name: 'FooClass'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 0
+ # char* [Index: 0x1008]
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 0x1007 # FooClass
+ Attrs: 33802 # const
+ # int (FooClass::)(int, char **) [Index: 0x1009]
+ - Kind: LF_MFUNCTION
+ MemberFunction:
+ ReturnType: 116 # int
+ ClassType: 0x1007 # FooClass
+ ThisType: 0x1008 # const FooClass*
+ CallConv: ThisCall
+ Options: [ None ]
+ ParameterCount: 2
+ ArgumentList: 0x1003 # (int, char**)
+ ThisPointerAdjustment: 0
+ # int (FooClass::)(int, double) [Index: 0x100A]
+ - Kind: LF_MFUNCTION
+ MemberFunction:
+ ReturnType: 116 # int
+ ClassType: 0x1007 # FooClass
+ ThisType: 0x1008 # const FooClass*
+ CallConv: ThisCall
+ Options: [ None ]
+ ParameterCount: 2
+ ArgumentList: 0x1004 # (int, double)
+ ThisPointerAdjustment: 0
+ # <method overload list>
+ # int (FooClass::)(int, char **)
+ # int (FooClass::)(int, double) [Index: 0x100B]
+ - Kind: LF_METHODLIST
+ MethodOverloadList:
+ Methods:
+ - Type: 0x1009 # int (FooClass::)(int, char **)
+ Attrs: 3 # public
+ VFTableOffset: -1
+ Name: ''
+ - Type: 0x100A # int (FooClass::)(int, double)
+ Attrs: 3 # public
+ VFTableOffset: -1
+ Name: ''
+ # <Field List>
+ # A, B, C [Index: 0x100C]
+ - Kind: LF_FIELDLIST
+ FieldList:
+ - Kind: LF_ENUMERATE
+ Enumerator:
+ Attrs: 3
+ Value: 0
+ Name: A
+ - Kind: LF_ENUMERATE
+ Enumerator:
+ Attrs: 3
+ Value: 1
+ Name: B
+ - Kind: LF_ENUMERATE
+ Enumerator:
+ Attrs: 3
+ Value: 2
+ Name: C
+ # enum FooClass::Enum : uint32_t {
+ # A, B, C
+ # }; [Index: 0x100D]
+ - Kind: LF_ENUM
+ Enum:
+ NumEnumerators: 3
+ Options: [ None, Nested ]
+ FieldList: 0x100C
+ Name: 'FooClass::Enum'
+ UnderlyingType: 117
+ # <Field List>
+ # public:
+ # enum FooEnum : uint32_t {
+ # A, B, C
+ # };
+ # FooEnum EnumMember;
+ # static int StaticInt;
+ # int FooClass::OverloadedMethod(int, char **);
+ # int FooClass::OverloadedMethod(int, double);
+ # int FooClass::RegularMethod(int, double);
+ # [Index: 0x100E]
+ - Kind: LF_FIELDLIST
+ FieldList:
+ # enum FooEnum : uint32_t {
+ # A, B, C
+ # };
+ - Kind: LF_NESTTYPE
+ NestedType:
+ Type: 0x100D
+ Name: FooEnum
+ # FooEnum EnumMember;
+ - Kind: LF_MEMBER
+ DataMember:
+ Attrs: 3 # public
+ Type: 0x100D # void*
+ FieldOffset: 0
+ Name: EnumMember
+ # static int StaticInt;
+ - Kind: LF_STMEMBER
+ StaticDataMember:
+ Attrs: 3 # public
+ Type: 116 # int
+ Name: StaticInt
+ # int FooClass::OverloadedMethod(int, char **);
+ # int FooClass::OverloadedMethod(int, double);
+ - Kind: LF_METHOD
+ OverloadedMethod:
+ NumOverloads: 2
+ MethodList: 0x100B
+ Name: OverloadedMethod
+ # int FooClass::RegularMethod(int, double);
+ - Kind: LF_ONEMETHOD
+ OneMethod:
+ Type: 0x100A
+ Attrs: 3 # public
+ VFTableOffset: -1
+ Name: RegularMethod
+ # class FooClass {
+ # public:
+ # enum FooEnum : uint32_t {
+ # A, B, C
+ # };
+ # FooEnum EnumMember;
+ # static int StaticInt;
+ # int FooClass::OverloadedMethod(int, char **);
+ # int FooClass::OverloadedMethod(int, double);
+ # int FooClass::RegularMethod(int, double);
+ # }; [Index: 0x100F]
+ - Kind: LF_CLASS
+ Class:
+ MemberCount: 6
+ Options: [ None ]
+ FieldList: 0x100E
+ Name: 'FooClass'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 4
+ # struct FooStructure; [Index: 0x1010]
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 6
+ Options: [ None ]
+ FieldList: 0x100E
+ Name: 'FooStructure'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 4
+ # interface FooInterface; [Index: 0x1011]
+ - Kind: LF_INTERFACE
+ Class:
+ MemberCount: 6
+ Options: [ None ]
+ FieldList: 0x100E
+ Name: 'FooInterface'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 4
+ # <field list>
+ # : public FooClass [Index: 0x1012]
+ - Kind: LF_FIELDLIST
+ FieldList:
+ - Kind: LF_BCLASS
+ Attrs: 3 # public
+ Type: 0x100F # FooClass
+ Offset: 0
+ # <field list>
+ # : public virtual FooClass [Index: 0x1013]
+ - Kind: LF_FIELDLIST
+ FieldList:
+ - Kind: LF_VBCLASS
+ Attrs: 3 # public
+ BaseType: 0x100F # FooClass
+ VBPtrType: 0x1001 # const int *
+ VBPtrOffset: 0
+ VTableIndex: 1
+ # class Inherit : public FooClass {}; [Index: 0x1014]
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 1
+ Options: [ None ]
+ FieldList: 0x100E
+ Name: 'Inherit'
+ DerivationList: 0x1012
+ VTableShape: 0
+ Size: 4
+ # class VInherit : public virtual FooClass {}; [Index: 0x1015]
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 1
+ Options: [ None ]
+ FieldList: 0x100E
+ Name: 'Inherit'
+ DerivationList: 0x1012
+ VTableShape: 0
+ Size: 4
+
+# // Member type records. These are generally not length prefixed, and appear
+# // inside of a field list record.
+# MEMBER_RECORD(LF_VFUNCTAB, 0x1409, VFPtr)
+
+# MEMBER_RECORD_ALIAS(LF_BINTERFACE, 0x151a, BaseInterface, BaseClass)
+
+# MEMBER_RECORD_ALIAS(LF_IVBCLASS, 0x1402, IndirectVirtualBaseClass,
+# VirtualBaseClass)
+
+
+# TYPE_RECORD(LF_ARRAY, 0x1503, Array)
+# TYPE_RECORD(LF_UNION, 0x1506, Union)
+# TYPE_RECORD(LF_TYPESERVER2, 0x1515, TypeServer2)
+# TYPE_RECORD(LF_VFTABLE, 0x151d, VFTable)
+# TYPE_RECORD(LF_VTSHAPE, 0x000a, VFTableShape)
+
+# TYPE_RECORD(LF_BITFIELD, 0x1205, BitField)
+
+
+# // ID leaf records. Subsequent leaf types may be referenced from .debug$S.
+# TYPE_RECORD(LF_FUNC_ID, 0x1601, FuncId)
+# TYPE_RECORD(LF_MFUNC_ID, 0x1602, MemberFuncId)
+# TYPE_RECORD(LF_BUILDINFO, 0x1603, BuildInfo)
+# TYPE_RECORD(LF_SUBSTR_LIST, 0x1604, StringList)
+# TYPE_RECORD(LF_STRING_ID, 0x1605, StringId)
+# TYPE_RECORD(LF_UDT_SRC_LINE, 0x1606, UdtSourceLine)
+# TYPE_RECORD(LF_UDT_MOD_SRC_LINE, 0x1607, UdtModSourceLine)
Added: llvm/trunk/test/DebugInfo/PDB/every-type.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/every-type.test?rev=307187&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/every-type.test (added)
+++ llvm/trunk/test/DebugInfo/PDB/every-type.test Wed Jul 5 11:43:25 2017
@@ -0,0 +1,261 @@
+The test input (every-type.pdb) is generated from some short and trivial C++ code
+that exercises the entire type system to generate every possible type record that
+we claim to understand. We then test this in two ways:
+ 1) We just dump the output for the purposes of readability. This tests that we
+ we can dump every possible type record.
+ 2) We dump the output to yaml, and then re-generate a PDB with the same type
+ stream, and then run test 1 on the new PDB. This verifies that the PDB
+ hasn't changed.
+
+
+RUN: llvm-pdbutil dump -type-index=0x1018,0x102A,0x103B,0x1093,0x1095,0x1096,0x1098 \
+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: -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: referent = 0x0074 (int), modifiers = const
+TYPES-NEXT: 0x1006 | 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: 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: 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: 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: 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: <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: type = 0x101A, offset = 0, attrs = public
+TYPES-NEXT: - LF_IVBCLASS
+TYPES-NEXT: base = 0x1006, vbptr = 0x1019, 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: 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: - 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: unique name: `.?AW4NestedEnum at FooClass@@`
+TYPES-NEXT: field list: 0x1087, 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: <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: 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
Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test?rev=307187&r1=307186&r2=307187&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test Wed Jul 5 11:43:25 2017
@@ -99,13 +99,11 @@ ALL-NEXT: - LF_ENUMERATE [sin
ALL-NEXT: - LF_ENUMERATE [free = 3]
ALL-NEXT: - LF_ENUMERATE [neutral = 4]
ALL-NEXT: - LF_ENUMERATE [both = 5]
-ALL-NEXT: 0x1003 | LF_ENUM [size = 120, hash = 208239]
-ALL-NEXT: name: `__vc_attributes::threadingAttribute::threading_e`
+ALL-NEXT: 0x1003 | LF_ENUM [size = 120, hash = 208239] `__vc_attributes::threadingAttribute::threading_e`
ALL-NEXT: unique name: `.?AW4threading_e at threadingAttribute@__vc_attributes@@`
ALL-NEXT: field list: 0x1002, underlying type: 0x0074 (int)
ALL-NEXT: options: has unique name | is nested
-ALL-NEXT: 0x1004 | LF_STRUCTURE [size = 100, hash = 16377]
-ALL-NEXT: class name: `__vc_attributes::threadingAttribute`
+ALL-NEXT: 0x1004 | LF_STRUCTURE [size = 100, hash = 16377] `__vc_attributes::threadingAttribute`
ALL-NEXT: unique name: `.?AUthreadingAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
ALL-NEXT: options: forward ref | has unique name
@@ -128,8 +126,7 @@ ALL-NEXT: 0x100A | LF_FIELDLIST [size
ALL-NEXT: - LF_NESTTYPE [name = `threading_e`, parent = 0x1003]
ALL-NEXT: - LF_METHOD [name = `threadingAttribute`, # overloads = 2, overload list = 0x1009]
ALL-NEXT: - LF_MEMBER [name = `value`, Type = 0x1003, offset = 0, attrs = public]
-ALL-NEXT: 0x100B | LF_STRUCTURE [size = 100, hash = 119540]
-ALL-NEXT: class name: `__vc_attributes::threadingAttribute`
+ALL-NEXT: 0x100B | LF_STRUCTURE [size = 100, hash = 119540] `__vc_attributes::threadingAttribute`
ALL-NEXT: unique name: `.?AUthreadingAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: 0x100A
ALL-NEXT: options: has ctor / dtor | contains nested class | has unique name
@@ -137,13 +134,11 @@ ALL-NEXT: 0x100C | LF_FIELDLIST [size
ALL-NEXT: - LF_ENUMERATE [native = 0]
ALL-NEXT: - LF_ENUMERATE [com = 1]
ALL-NEXT: - LF_ENUMERATE [managed = 2]
-ALL-NEXT: 0x100D | LF_ENUM [size = 120, hash = 198119]
-ALL-NEXT: name: `__vc_attributes::event_receiverAttribute::type_e`
+ALL-NEXT: 0x100D | LF_ENUM [size = 120, hash = 198119] `__vc_attributes::event_receiverAttribute::type_e`
ALL-NEXT: unique name: `.?AW4type_e at event_receiverAttribute@__vc_attributes@@`
ALL-NEXT: field list: 0x100C, underlying type: 0x0074 (int)
ALL-NEXT: options: has unique name | is nested
-ALL-NEXT: 0x100E | LF_STRUCTURE [size = 112, hash = 48056]
-ALL-NEXT: class name: `__vc_attributes::event_receiverAttribute`
+ALL-NEXT: 0x100E | LF_STRUCTURE [size = 112, hash = 48056] `__vc_attributes::event_receiverAttribute`
ALL-NEXT: unique name: `.?AUevent_receiverAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
ALL-NEXT: options: forward ref | has unique name
@@ -175,8 +170,7 @@ ALL-NEXT: - LF_NESTTYPE [name
ALL-NEXT: - LF_METHOD [name = `event_receiverAttribute`, # overloads = 3, overload list = 0x1015]
ALL-NEXT: - LF_MEMBER [name = `type`, Type = 0x100D, offset = 0, attrs = public]
ALL-NEXT: - LF_MEMBER [name = `layout_dependent`, Type = 0x0030 (bool), offset = 4, attrs = public]
-ALL-NEXT: 0x1017 | LF_STRUCTURE [size = 112, hash = 148734]
-ALL-NEXT: class name: `__vc_attributes::event_receiverAttribute`
+ALL-NEXT: 0x1017 | LF_STRUCTURE [size = 112, hash = 148734] `__vc_attributes::event_receiverAttribute`
ALL-NEXT: unique name: `.?AUevent_receiverAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: 0x1016
ALL-NEXT: options: has ctor / dtor | contains nested class | has unique name
@@ -184,13 +178,11 @@ ALL-NEXT: 0x1018 | LF_FIELDLIST [size
ALL-NEXT: - LF_ENUMERATE [never = 0]
ALL-NEXT: - LF_ENUMERATE [allowed = 1]
ALL-NEXT: - LF_ENUMERATE [always = 2]
-ALL-NEXT: 0x1019 | LF_ENUM [size = 116, hash = 60158]
-ALL-NEXT: name: `__vc_attributes::aggregatableAttribute::type_e`
+ALL-NEXT: 0x1019 | LF_ENUM [size = 116, hash = 60158] `__vc_attributes::aggregatableAttribute::type_e`
ALL-NEXT: unique name: `.?AW4type_e at aggregatableAttribute@__vc_attributes@@`
ALL-NEXT: field list: 0x1018, underlying type: 0x0074 (int)
ALL-NEXT: options: has unique name | is nested
-ALL-NEXT: 0x101A | LF_STRUCTURE [size = 108, hash = 217249]
-ALL-NEXT: class name: `__vc_attributes::aggregatableAttribute`
+ALL-NEXT: 0x101A | LF_STRUCTURE [size = 108, hash = 217249] `__vc_attributes::aggregatableAttribute`
ALL-NEXT: unique name: `.?AUaggregatableAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
ALL-NEXT: options: forward ref | has unique name
@@ -213,26 +205,22 @@ ALL-NEXT: 0x1020 | LF_FIELDLIST [size
ALL-NEXT: - LF_NESTTYPE [name = `type_e`, parent = 0x1019]
ALL-NEXT: - LF_METHOD [name = `aggregatableAttribute`, # overloads = 2, overload list = 0x101F]
ALL-NEXT: - LF_MEMBER [name = `type`, Type = 0x1019, offset = 0, attrs = public]
-ALL-NEXT: 0x1021 | LF_STRUCTURE [size = 108, hash = 94935]
-ALL-NEXT: class name: `__vc_attributes::aggregatableAttribute`
+ALL-NEXT: 0x1021 | LF_STRUCTURE [size = 108, hash = 94935] `__vc_attributes::aggregatableAttribute`
ALL-NEXT: unique name: `.?AUaggregatableAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: 0x1020
ALL-NEXT: options: has ctor / dtor | contains nested class | has unique name
-ALL-NEXT: 0x1022 | LF_ENUM [size = 116, hash = 151449]
-ALL-NEXT: name: `__vc_attributes::event_sourceAttribute::type_e`
+ALL-NEXT: 0x1022 | LF_ENUM [size = 116, hash = 151449] `__vc_attributes::event_sourceAttribute::type_e`
ALL-NEXT: unique name: `.?AW4type_e at event_sourceAttribute@__vc_attributes@@`
ALL-NEXT: field list: 0x100C, underlying type: 0x0074 (int)
ALL-NEXT: options: has unique name | is nested
ALL-NEXT: 0x1023 | LF_FIELDLIST [size = 28, hash = 135589]
ALL-NEXT: - LF_ENUMERATE [speed = 0]
ALL-NEXT: - LF_ENUMERATE [size = 1]
-ALL-NEXT: 0x1024 | LF_ENUM [size = 124, hash = 73373]
-ALL-NEXT: name: `__vc_attributes::event_sourceAttribute::optimize_e`
+ALL-NEXT: 0x1024 | LF_ENUM [size = 124, hash = 73373] `__vc_attributes::event_sourceAttribute::optimize_e`
ALL-NEXT: unique name: `.?AW4optimize_e at event_sourceAttribute@__vc_attributes@@`
ALL-NEXT: field list: 0x1023, underlying type: 0x0074 (int)
ALL-NEXT: options: has unique name | is nested
-ALL-NEXT: 0x1025 | LF_STRUCTURE [size = 108, hash = 96512]
-ALL-NEXT: class name: `__vc_attributes::event_sourceAttribute`
+ALL-NEXT: 0x1025 | LF_STRUCTURE [size = 108, hash = 96512] `__vc_attributes::event_sourceAttribute`
ALL-NEXT: unique name: `.?AUevent_sourceAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
ALL-NEXT: options: forward ref | has unique name
@@ -258,8 +246,7 @@ ALL-NEXT: - LF_METHOD [name =
ALL-NEXT: - LF_MEMBER [name = `type`, Type = 0x1022, offset = 0, attrs = public]
ALL-NEXT: - LF_MEMBER [name = `optimize`, Type = 0x1024, offset = 4, attrs = public]
ALL-NEXT: - LF_MEMBER [name = `decorate`, Type = 0x0030 (bool), offset = 8, attrs = public]
-ALL-NEXT: 0x102C | LF_STRUCTURE [size = 108, hash = 238560]
-ALL-NEXT: class name: `__vc_attributes::event_sourceAttribute`
+ALL-NEXT: 0x102C | LF_STRUCTURE [size = 108, hash = 238560] `__vc_attributes::event_sourceAttribute`
ALL-NEXT: unique name: `.?AUevent_sourceAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: 0x102B
ALL-NEXT: options: has ctor / dtor | contains nested class | has unique name
@@ -270,13 +257,11 @@ ALL-NEXT: - LF_ENUMERATE [ser
ALL-NEXT: - LF_ENUMERATE [unspecified = 4]
ALL-NEXT: - LF_ENUMERATE [EXE = 2]
ALL-NEXT: - LF_ENUMERATE [SERVICE = 3]
-ALL-NEXT: 0x102E | LF_ENUM [size = 104, hash = 115151]
-ALL-NEXT: name: `__vc_attributes::moduleAttribute::type_e`
+ALL-NEXT: 0x102E | LF_ENUM [size = 104, hash = 115151] `__vc_attributes::moduleAttribute::type_e`
ALL-NEXT: unique name: `.?AW4type_e at moduleAttribute@__vc_attributes@@`
ALL-NEXT: field list: 0x102D, underlying type: 0x0074 (int)
ALL-NEXT: options: has unique name | is nested
-ALL-NEXT: 0x102F | LF_STRUCTURE [size = 96, hash = 197306]
-ALL-NEXT: class name: `__vc_attributes::moduleAttribute`
+ALL-NEXT: 0x102F | LF_STRUCTURE [size = 96, hash = 197306] `__vc_attributes::moduleAttribute`
ALL-NEXT: unique name: `.?AUmoduleAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
ALL-NEXT: options: forward ref | has unique name
@@ -338,8 +323,7 @@ ALL-NEXT: - LF_MEMBER [name =
ALL-NEXT: - LF_MEMBER [name = `restricted`, Type = 0x0030 (bool), offset = 45, attrs = public]
ALL-NEXT: - LF_MEMBER [name = `custom`, Type = 0x1032, offset = 48, attrs = public]
ALL-NEXT: - LF_MEMBER [name = `resource_name`, Type = 0x1032, offset = 52, attrs = public]
-ALL-NEXT: 0x103A | LF_STRUCTURE [size = 96, hash = 98548]
-ALL-NEXT: class name: `__vc_attributes::moduleAttribute`
+ALL-NEXT: 0x103A | LF_STRUCTURE [size = 96, hash = 98548] `__vc_attributes::moduleAttribute`
ALL-NEXT: unique name: `.?AUmoduleAttribute at __vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: 0x1039
ALL-NEXT: options: has ctor / dtor | contains nested class | has unique name
@@ -374,13 +358,11 @@ ALL-NEXT: - LF_ENUMERATE [eMo
ALL-NEXT: - LF_ENUMERATE [eIllegalUsage = 33554432]
ALL-NEXT: - LF_ENUMERATE [eAsynchronousUsage = 67108864]
ALL-NEXT: - LF_ENUMERATE [eAnyIDLUsage = 4161535]
-ALL-NEXT: 0x103C | LF_ENUM [size = 140, hash = 171328]
-ALL-NEXT: name: `__vc_attributes::helper_attributes::usageAttribute::usage_e`
+ALL-NEXT: 0x103C | LF_ENUM [size = 140, hash = 171328] `__vc_attributes::helper_attributes::usageAttribute::usage_e`
ALL-NEXT: unique name: `.?AW4usage_e at usageAttribute@helper_attributes at __vc_attributes@@`
ALL-NEXT: field list: 0x103B, underlying type: 0x0074 (int)
ALL-NEXT: options: has unique name | is nested
-ALL-NEXT: 0x103D | LF_STRUCTURE [size = 128, hash = 203640]
-ALL-NEXT: class name: `__vc_attributes::helper_attributes::usageAttribute`
+ALL-NEXT: 0x103D | LF_STRUCTURE [size = 128, hash = 203640] `__vc_attributes::helper_attributes::usageAttribute`
ALL-NEXT: unique name: `.?AUusageAttribute at helper_attributes@__vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
ALL-NEXT: options: forward ref | has unique name
@@ -397,8 +379,7 @@ ALL-NEXT: - LF_NESTTYPE [name
ALL-NEXT: - LF_ONEMETHOD [name = `usageAttribute`]
ALL-NEXT: type = 0x1040, vftable offset = -1, attrs = public
ALL-NEXT: - LF_MEMBER [name = `value`, Type = 0x0075 (unsigned), offset = 0, attrs = public]
-ALL-NEXT: 0x1042 | LF_STRUCTURE [size = 128, hash = 165040]
-ALL-NEXT: class name: `__vc_attributes::helper_attributes::usageAttribute`
+ALL-NEXT: 0x1042 | LF_STRUCTURE [size = 128, hash = 165040] `__vc_attributes::helper_attributes::usageAttribute`
ALL-NEXT: unique name: `.?AUusageAttribute at helper_attributes@__vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: 0x1041
ALL-NEXT: options: has ctor / dtor | contains nested class | has unique name
@@ -407,13 +388,11 @@ ALL-NEXT: - LF_ENUMERATE [eBo
ALL-NEXT: - LF_ENUMERATE [eInteger = 1]
ALL-NEXT: - LF_ENUMERATE [eFloat = 2]
ALL-NEXT: - LF_ENUMERATE [eDouble = 3]
-ALL-NEXT: 0x1044 | LF_ENUM [size = 148, hash = 142625]
-ALL-NEXT: name: `__vc_attributes::helper_attributes::v1_alttypeAttribute::type_e`
+ALL-NEXT: 0x1044 | LF_ENUM [size = 148, hash = 142625] `__vc_attributes::helper_attributes::v1_alttypeAttribute::type_e`
ALL-NEXT: unique name: `.?AW4type_e at v1_alttypeAttribute@helper_attributes at __vc_attributes@@`
ALL-NEXT: field list: 0x1043, underlying type: 0x0074 (int)
ALL-NEXT: options: has unique name | is nested
-ALL-NEXT: 0x1045 | LF_STRUCTURE [size = 140, hash = 52534]
-ALL-NEXT: class name: `__vc_attributes::helper_attributes::v1_alttypeAttribute`
+ALL-NEXT: 0x1045 | LF_STRUCTURE [size = 140, hash = 52534] `__vc_attributes::helper_attributes::v1_alttypeAttribute`
ALL-NEXT: unique name: `.?AUv1_alttypeAttribute at helper_attributes@__vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
ALL-NEXT: options: forward ref | has unique name
@@ -430,8 +409,7 @@ ALL-NEXT: - LF_NESTTYPE [name
ALL-NEXT: - LF_ONEMETHOD [name = `v1_alttypeAttribute`]
ALL-NEXT: type = 0x1048, vftable offset = -1, attrs = public
ALL-NEXT: - LF_MEMBER [name = `type`, Type = 0x1044, offset = 0, attrs = public]
-ALL-NEXT: 0x104A | LF_STRUCTURE [size = 140, hash = 213215]
-ALL-NEXT: class name: `__vc_attributes::helper_attributes::v1_alttypeAttribute`
+ALL-NEXT: 0x104A | LF_STRUCTURE [size = 140, hash = 213215] `__vc_attributes::helper_attributes::v1_alttypeAttribute`
ALL-NEXT: unique name: `.?AUv1_alttypeAttribute at helper_attributes@__vc_attributes@@`
ALL-NEXT: vtable: <no type>, base list: <no type>, field list: 0x1049
ALL-NEXT: options: has ctor / dtor | contains nested class | has unique name
Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test?rev=307187&r1=307186&r2=307187&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-merge-ids-and-types.test Wed Jul 5 11:43:25 2017
@@ -14,8 +14,7 @@ TPI-TYPES-NEXT: - LF_MEMBER [
TPI-TYPES-NEXT: 0x1002 | LF_ARGLIST [size = 16]
TPI-TYPES-NEXT: 0x0074 (int): `int`
TPI-TYPES-NEXT: 0x1000: `char**`
-TPI-TYPES-NEXT: 0x1003 | LF_STRUCTURE [size = 36]
-TPI-TYPES-NEXT: class name: `FooBar`
+TPI-TYPES-NEXT: 0x1003 | LF_STRUCTURE [size = 36] `FooBar`
TPI-TYPES-NEXT: unique name: `FooBar`
TPI-TYPES-NEXT: vtable: <no type>, base list: <no type>, field list: 0x1001
TPI-TYPES-NEXT: options: has unique name
Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-mergetypes.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-mergetypes.test?rev=307187&r1=307186&r2=307187&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-mergetypes.test (original)
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-mergetypes.test Wed Jul 5 11:43:25 2017
@@ -11,8 +11,7 @@ MERGED-NEXT: 0x1000 | LF_POINTER [size
MERGED-NEXT: referent = 0x0075 (unsigned), mode = pointer, opts = None, kind = ptr32
MERGED-NEXT: 0x1001 | LF_POINTER [size = 12]
MERGED-NEXT: referent = 0x0076 (__int64), mode = pointer, opts = None, kind = ptr32
-MERGED-NEXT: 0x1002 | LF_STRUCTURE [size = 48]
-MERGED-NEXT: class name: `OnlyInMerge1`
+MERGED-NEXT: 0x1002 | LF_STRUCTURE [size = 48] `OnlyInMerge1`
MERGED-NEXT: unique name: `OnlyInMerge1`
MERGED-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
MERGED-NEXT: options: forward ref | has unique name
@@ -29,8 +28,7 @@ MERGED-NEXT: 0x1003: `unsigne
MERGED-NEXT: 0x1007 | LF_PROCEDURE [size = 16]
MERGED-NEXT: return type = 0x0075 (unsigned), # args = 0, param list = 0x1006
MERGED-NEXT: calling conv = cdecl, options = None
-MERGED-NEXT: 0x1008 | LF_STRUCTURE [size = 48]
-MERGED-NEXT: class name: `OnlyInMerge2`
+MERGED-NEXT: 0x1008 | LF_STRUCTURE [size = 48] `OnlyInMerge2`
MERGED-NEXT: unique name: `OnlyInMerge2`
MERGED-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
MERGED-NEXT: options: forward ref | has unique name
Modified: llvm/trunk/test/tools/llvm-pdbdump/partial-type-stream.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-pdbdump/partial-type-stream.test?rev=307187&r1=307186&r2=307187&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-pdbdump/partial-type-stream.test (original)
+++ llvm/trunk/test/tools/llvm-pdbdump/partial-type-stream.test Wed Jul 5 11:43:25 2017
@@ -17,8 +17,7 @@ DEPS: Types (T
DEPS-NEXT: ============================================================
DEPS-NEXT: Showing 1 records and their dependents (4 records total)
DEPS-NEXT: 0x100E | LF_ARGLIST [size = 8]
-DEPS-NEXT: 0x1017 | LF_CLASS [size = 60]
-DEPS-NEXT: class name: `MembersTest::A`
+DEPS-NEXT: 0x1017 | LF_CLASS [size = 60] `MembersTest::A`
DEPS-NEXT: unique name: `.?AVA at MembersTest@@`
DEPS-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
DEPS-NEXT: options: forward ref | has unique name
Modified: llvm/trunk/tools/llvm-pdbutil/MinimalTypeDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/MinimalTypeDumper.cpp?rev=307187&r1=307186&r2=307187&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/MinimalTypeDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/MinimalTypeDumper.cpp Wed Jul 5 11:43:25 2017
@@ -299,7 +299,7 @@ Error MinimalTypeDumpVisitor::visitKnown
Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
ClassRecord &Class) {
- P.formatLine("class name: `{0}`", Class.Name);
+ P.format(" `{0}`", Class.Name);
if (Class.hasUniqueName())
P.formatLine("unique name: `{0}`", Class.UniqueName);
P.formatLine("vtable: {0}, base list: {1}, field list: {2}",
@@ -311,7 +311,7 @@ Error MinimalTypeDumpVisitor::visitKnown
Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR,
UnionRecord &Union) {
- P.formatLine("class name: `{0}`", Union.Name);
+ P.format(" `{0}`", Union.Name);
if (Union.hasUniqueName())
P.formatLine("unique name: `{0}`", Union.UniqueName);
P.formatLine("field list: {0}", Union.FieldList);
@@ -321,7 +321,7 @@ Error MinimalTypeDumpVisitor::visitKnown
}
Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR, EnumRecord &Enum) {
- P.formatLine("name: `{0}`", Enum.Name);
+ P.format(" `{0}`", Enum.Name);
if (Enum.hasUniqueName())
P.formatLine("unique name: `{0}`", Enum.UniqueName);
P.formatLine("field list: {0}, underlying type: {1}", Enum.FieldList,
Modified: llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp?rev=307187&r1=307186&r2=307187&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp (original)
+++ llvm/trunk/tools/llvm-pdbutil/llvm-pdbutil.cpp Wed Jul 5 11:43:25 2017
@@ -399,7 +399,7 @@ cl::opt<bool> DumpTypeExtras("type-extra
cl::cat(TypeOptions), cl::sub(DumpSubcommand));
cl::list<uint32_t> DumpTypeIndex(
- "type-index", cl::ZeroOrMore,
+ "type-index", cl::ZeroOrMore, cl::CommaSeparated,
cl::desc("only dump types with the specified hexadecimal type index"),
cl::cat(TypeOptions), cl::sub(DumpSubcommand));
@@ -415,7 +415,7 @@ cl::opt<bool> DumpIdExtras("id-extras",
cl::desc("dump id hashes and index offsets"),
cl::cat(TypeOptions), cl::sub(DumpSubcommand));
cl::list<uint32_t> DumpIdIndex(
- "id-index", cl::ZeroOrMore,
+ "id-index", cl::ZeroOrMore, cl::CommaSeparated,
cl::desc("only dump ids with the specified hexadecimal type index"),
cl::cat(TypeOptions), cl::sub(DumpSubcommand));
More information about the llvm-commits
mailing list