diff options
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Native/TpiHashing.cpp | 1 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/PDB/pdbdump-headers.test | 186 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp | 17 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbutil/MinimalTypeDumper.h | 9 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbutil/RawOutputStyle.cpp | 55 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | 11 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbutil/llvm-pdbutil.h | 3 | 
7 files changed, 173 insertions, 109 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Native/TpiHashing.cpp b/llvm/lib/DebugInfo/PDB/Native/TpiHashing.cpp index 16904a5a27e..91b8d648fcf 100644 --- a/llvm/lib/DebugInfo/PDB/Native/TpiHashing.cpp +++ b/llvm/lib/DebugInfo/PDB/Native/TpiHashing.cpp @@ -9,6 +9,7 @@  #include "llvm/DebugInfo/PDB/Native/TpiHashing.h" +#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"  #include "llvm/DebugInfo/PDB/Native/Hash.h"  #include "llvm/DebugInfo/PDB/Native/RawError.h" diff --git a/llvm/test/DebugInfo/PDB/pdbdump-headers.test b/llvm/test/DebugInfo/PDB/pdbdump-headers.test index 7343dc48ef4..6f55590d6db 100644 --- a/llvm/test/DebugInfo/PDB/pdbdump-headers.test +++ b/llvm/test/DebugInfo/PDB/pdbdump-headers.test @@ -59,204 +59,204 @@ ALL-NEXT:              contributing source files:  ALL:                           Types (TPI Stream)  ALL-NEXT: ============================================================  ALL-NEXT:   Showing 75 records -ALL-NEXT:   0x1000 | LF_ARGLIST [size = 8] -ALL-NEXT:   0x1001 | LF_PROCEDURE [size = 16] +ALL-NEXT:   0x1000 | LF_ARGLIST [size = 8, hash = 205956] +ALL-NEXT:   0x1001 | LF_PROCEDURE [size = 16, hash = 163561]  ALL-NEXT:            return type = 0x0074 (int), # args = 0, param list = 0x1000  ALL-NEXT:            calling conv = cdecl, options = None -ALL-NEXT:   0x1002 | LF_FIELDLIST [size = 76] +ALL-NEXT:   0x1002 | LF_FIELDLIST [size = 76, hash = 59811]  ALL-NEXT:            - LF_ENUMERATE [apartment = 1]  ALL-NEXT:            - LF_ENUMERATE [single = 2]  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] +ALL-NEXT:   0x1003 | LF_ENUM [size = 120, hash = 208239]  ALL-NEXT:            name: `__vc_attributes::threadingAttribute::threading_e`  ALL-NEXT:            unique name: `.?AW4threading_e@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] +ALL-NEXT:   0x1004 | LF_STRUCTURE [size = 100, hash = 16377]  ALL-NEXT:            class name: `__vc_attributes::threadingAttribute`  ALL-NEXT:            unique name: `.?AUthreadingAttribute@__vc_attributes@@`  ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>  ALL-NEXT:            options: forward ref | has unique name -ALL-NEXT:   0x1005 | LF_POINTER [size = 12] +ALL-NEXT:   0x1005 | LF_POINTER [size = 12, hash = 247078]  ALL-NEXT:            referent = 0x1004, mode = pointer, opts = const, kind = ptr32 -ALL-NEXT:   0x1006 | LF_ARGLIST [size = 12] +ALL-NEXT:   0x1006 | LF_ARGLIST [size = 12, hash = 194342]  ALL-NEXT:            0x1003: `__vc_attributes::threadingAttribute::threading_e` -ALL-NEXT:   0x1007 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1007 | LF_MFUNCTION [size = 28, hash = 254156]  ALL-NEXT:            return type = 1, # args = 0x1006, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x1004, this type = 0x1005, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1008 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1008 | LF_MFUNCTION [size = 28, hash = 194536]  ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x1004, this type = 0x1005, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1009 | LF_METHODLIST [size = 20] +ALL-NEXT:   0x1009 | LF_METHODLIST [size = 20, hash = 167492]  ALL-NEXT:            - Method [type = 0x1007, vftable offset = -1, attrs = public]  ALL-NEXT:            - Method [type = 0x1008, vftable offset = -1, attrs = public] -ALL-NEXT:   0x100A | LF_FIELDLIST [size = 68] +ALL-NEXT:   0x100A | LF_FIELDLIST [size = 68, hash = 185421]  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] +ALL-NEXT:   0x100B | LF_STRUCTURE [size = 100, hash = 119540]  ALL-NEXT:            class name: `__vc_attributes::threadingAttribute`  ALL-NEXT:            unique name: `.?AUthreadingAttribute@__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 -ALL-NEXT:   0x100C | LF_FIELDLIST [size = 48] +ALL-NEXT:   0x100C | LF_FIELDLIST [size = 48, hash = 261871]  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] +ALL-NEXT:   0x100D | LF_ENUM [size = 120, hash = 198119]  ALL-NEXT:            name: `__vc_attributes::event_receiverAttribute::type_e`  ALL-NEXT:            unique name: `.?AW4type_e@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] +ALL-NEXT:   0x100E | LF_STRUCTURE [size = 112, hash = 48056]  ALL-NEXT:            class name: `__vc_attributes::event_receiverAttribute`  ALL-NEXT:            unique name: `.?AUevent_receiverAttribute@__vc_attributes@@`  ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>  ALL-NEXT:            options: forward ref | has unique name -ALL-NEXT:   0x100F | LF_POINTER [size = 12] +ALL-NEXT:   0x100F | LF_POINTER [size = 12, hash = 251486]  ALL-NEXT:            referent = 0x100E, mode = pointer, opts = const, kind = ptr32 -ALL-NEXT:   0x1010 | LF_ARGLIST [size = 16] +ALL-NEXT:   0x1010 | LF_ARGLIST [size = 16, hash = 134580]  ALL-NEXT:            0x100D: `__vc_attributes::event_receiverAttribute::type_e`  ALL-NEXT:            0x0030 (bool): `bool` -ALL-NEXT:   0x1011 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1011 | LF_MFUNCTION [size = 28, hash = 148190]  ALL-NEXT:            return type = 2, # args = 0x1010, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x100E, this type = 0x100F, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1012 | LF_ARGLIST [size = 12] +ALL-NEXT:   0x1012 | LF_ARGLIST [size = 12, hash = 113636]  ALL-NEXT:            0x100D: `__vc_attributes::event_receiverAttribute::type_e` -ALL-NEXT:   0x1013 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1013 | LF_MFUNCTION [size = 28, hash = 53336]  ALL-NEXT:            return type = 1, # args = 0x1012, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x100E, this type = 0x100F, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1014 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1014 | LF_MFUNCTION [size = 28, hash = 55779]  ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x100E, this type = 0x100F, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1015 | LF_METHODLIST [size = 28] +ALL-NEXT:   0x1015 | LF_METHODLIST [size = 28, hash = 220695]  ALL-NEXT:            - Method [type = 0x1011, vftable offset = -1, attrs = public]  ALL-NEXT:            - Method [type = 0x1013, vftable offset = -1, attrs = public]  ALL-NEXT:            - Method [type = 0x1014, vftable offset = -1, attrs = public] -ALL-NEXT:   0x1016 | LF_FIELDLIST [size = 96] +ALL-NEXT:   0x1016 | LF_FIELDLIST [size = 96, hash = 198114]  ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x100D]  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] +ALL-NEXT:   0x1017 | LF_STRUCTURE [size = 112, hash = 148734]  ALL-NEXT:            class name: `__vc_attributes::event_receiverAttribute`  ALL-NEXT:            unique name: `.?AUevent_receiverAttribute@__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 -ALL-NEXT:   0x1018 | LF_FIELDLIST [size = 48] +ALL-NEXT:   0x1018 | LF_FIELDLIST [size = 48, hash = 81128]  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] +ALL-NEXT:   0x1019 | LF_ENUM [size = 116, hash = 60158]  ALL-NEXT:            name: `__vc_attributes::aggregatableAttribute::type_e`  ALL-NEXT:            unique name: `.?AW4type_e@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] +ALL-NEXT:   0x101A | LF_STRUCTURE [size = 108, hash = 217249]  ALL-NEXT:            class name: `__vc_attributes::aggregatableAttribute`  ALL-NEXT:            unique name: `.?AUaggregatableAttribute@__vc_attributes@@`  ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>  ALL-NEXT:            options: forward ref | has unique name -ALL-NEXT:   0x101B | LF_POINTER [size = 12] +ALL-NEXT:   0x101B | LF_POINTER [size = 12, hash = 174209]  ALL-NEXT:            referent = 0x101A, mode = pointer, opts = const, kind = ptr32 -ALL-NEXT:   0x101C | LF_ARGLIST [size = 12] +ALL-NEXT:   0x101C | LF_ARGLIST [size = 12, hash = 159978]  ALL-NEXT:            0x1019: `__vc_attributes::aggregatableAttribute::type_e` -ALL-NEXT:   0x101D | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x101D | LF_MFUNCTION [size = 28, hash = 249504]  ALL-NEXT:            return type = 1, # args = 0x101C, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x101E | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x101E | LF_MFUNCTION [size = 28, hash = 141941]  ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x101A, this type = 0x101B, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x101F | LF_METHODLIST [size = 20] +ALL-NEXT:   0x101F | LF_METHODLIST [size = 20, hash = 238785]  ALL-NEXT:            - Method [type = 0x101D, vftable offset = -1, attrs = public]  ALL-NEXT:            - Method [type = 0x101E, vftable offset = -1, attrs = public] -ALL-NEXT:   0x1020 | LF_FIELDLIST [size = 68] +ALL-NEXT:   0x1020 | LF_FIELDLIST [size = 68, hash = 6214]  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] +ALL-NEXT:   0x1021 | LF_STRUCTURE [size = 108, hash = 94935]  ALL-NEXT:            class name: `__vc_attributes::aggregatableAttribute`  ALL-NEXT:            unique name: `.?AUaggregatableAttribute@__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] +ALL-NEXT:   0x1022 | LF_ENUM [size = 116, hash = 151449]  ALL-NEXT:            name: `__vc_attributes::event_sourceAttribute::type_e`  ALL-NEXT:            unique name: `.?AW4type_e@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] +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] +ALL-NEXT:   0x1024 | LF_ENUM [size = 124, hash = 73373]  ALL-NEXT:            name: `__vc_attributes::event_sourceAttribute::optimize_e`  ALL-NEXT:            unique name: `.?AW4optimize_e@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] +ALL-NEXT:   0x1025 | LF_STRUCTURE [size = 108, hash = 96512]  ALL-NEXT:            class name: `__vc_attributes::event_sourceAttribute`  ALL-NEXT:            unique name: `.?AUevent_sourceAttribute@__vc_attributes@@`  ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>  ALL-NEXT:            options: forward ref | has unique name -ALL-NEXT:   0x1026 | LF_POINTER [size = 12] +ALL-NEXT:   0x1026 | LF_POINTER [size = 12, hash = 254299]  ALL-NEXT:            referent = 0x1025, mode = pointer, opts = const, kind = ptr32 -ALL-NEXT:   0x1027 | LF_ARGLIST [size = 12] +ALL-NEXT:   0x1027 | LF_ARGLIST [size = 12, hash = 17744]  ALL-NEXT:            0x1022: `__vc_attributes::event_sourceAttribute::type_e` -ALL-NEXT:   0x1028 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1028 | LF_MFUNCTION [size = 28, hash = 239514]  ALL-NEXT:            return type = 1, # args = 0x1027, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x1025, this type = 0x1026, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1029 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1029 | LF_MFUNCTION [size = 28, hash = 173189]  ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x1025, this type = 0x1026, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x102A | LF_METHODLIST [size = 20] +ALL-NEXT:   0x102A | LF_METHODLIST [size = 20, hash = 130544]  ALL-NEXT:            - Method [type = 0x1028, vftable offset = -1, attrs = public]  ALL-NEXT:            - Method [type = 0x1029, vftable offset = -1, attrs = public] -ALL-NEXT:   0x102B | LF_FIELDLIST [size = 128] +ALL-NEXT:   0x102B | LF_FIELDLIST [size = 128, hash = 204437]  ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x1022]  ALL-NEXT:            - LF_NESTTYPE [name = `optimize_e`, parent = 0x1024]  ALL-NEXT:            - LF_METHOD [name = `event_sourceAttribute`, # overloads = 2, overload list = 0x102A]  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] +ALL-NEXT:   0x102C | LF_STRUCTURE [size = 108, hash = 238560]  ALL-NEXT:            class name: `__vc_attributes::event_sourceAttribute`  ALL-NEXT:            unique name: `.?AUevent_sourceAttribute@__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 -ALL-NEXT:   0x102D | LF_FIELDLIST [size = 92] +ALL-NEXT:   0x102D | LF_FIELDLIST [size = 92, hash = 144673]  ALL-NEXT:            - LF_ENUMERATE [dll = 1]  ALL-NEXT:            - LF_ENUMERATE [exe = 2]  ALL-NEXT:            - LF_ENUMERATE [service = 3]  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] +ALL-NEXT:   0x102E | LF_ENUM [size = 104, hash = 115151]  ALL-NEXT:            name: `__vc_attributes::moduleAttribute::type_e`  ALL-NEXT:            unique name: `.?AW4type_e@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] +ALL-NEXT:   0x102F | LF_STRUCTURE [size = 96, hash = 197306]  ALL-NEXT:            class name: `__vc_attributes::moduleAttribute`  ALL-NEXT:            unique name: `.?AUmoduleAttribute@__vc_attributes@@`  ALL-NEXT:            vtable: <no type>, base list: <no type>, field list: <no type>  ALL-NEXT:            options: forward ref | has unique name -ALL-NEXT:   0x1030 | LF_POINTER [size = 12] +ALL-NEXT:   0x1030 | LF_POINTER [size = 12, hash = 256035]  ALL-NEXT:            referent = 0x102F, mode = pointer, opts = const, kind = ptr32 -ALL-NEXT:   0x1031 | LF_MODIFIER [size = 12] +ALL-NEXT:   0x1031 | LF_MODIFIER [size = 12, hash = 101096]  ALL-NEXT:            referent = 0x0070 (char), modifiers = const -ALL-NEXT:   0x1032 | LF_POINTER [size = 12] +ALL-NEXT:   0x1032 | LF_POINTER [size = 12, hash = 231280]  ALL-NEXT:            referent = 0x1031, mode = pointer, opts = None, kind = ptr32 -ALL-NEXT:   0x1033 | LF_ARGLIST [size = 68] +ALL-NEXT:   0x1033 | LF_ARGLIST [size = 68, hash = 52156]  ALL-NEXT:            0x102E: `__vc_attributes::moduleAttribute::type_e`  ALL-NEXT:            0x1032: `const char*`  ALL-NEXT:            0x1032: `const char*` @@ -272,25 +272,25 @@ ALL-NEXT:            0x0030 (bool): `bool`  ALL-NEXT:            0x0030 (bool): `bool`  ALL-NEXT:            0x1032: `const char*`  ALL-NEXT:            0x1032: `const char*` -ALL-NEXT:   0x1034 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1034 | LF_MFUNCTION [size = 28, hash = 48854]  ALL-NEXT:            return type = 15, # args = 0x1033, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x102F, this type = 0x1030, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1035 | LF_ARGLIST [size = 12] +ALL-NEXT:   0x1035 | LF_ARGLIST [size = 12, hash = 170035]  ALL-NEXT:            0x102E: `__vc_attributes::moduleAttribute::type_e` -ALL-NEXT:   0x1036 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1036 | LF_MFUNCTION [size = 28, hash = 177041]  ALL-NEXT:            return type = 1, # args = 0x1035, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x102F, this type = 0x1030, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1037 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1037 | LF_MFUNCTION [size = 28, hash = 102745]  ALL-NEXT:            return type = 0, # args = 0x1000, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x102F, this type = 0x1030, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1038 | LF_METHODLIST [size = 28] +ALL-NEXT:   0x1038 | LF_METHODLIST [size = 28, hash = 16947]  ALL-NEXT:            - Method [type = 0x1034, vftable offset = -1, attrs = public]  ALL-NEXT:            - Method [type = 0x1036, vftable offset = -1, attrs = public]  ALL-NEXT:            - Method [type = 0x1037, vftable offset = -1, attrs = public] -ALL-NEXT:   0x1039 | LF_FIELDLIST [size = 356] +ALL-NEXT:   0x1039 | LF_FIELDLIST [size = 356, hash = 183703]  ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x102E]  ALL-NEXT:            - LF_METHOD [name = `moduleAttribute`, # overloads = 3, overload list = 0x1038]  ALL-NEXT:            - LF_MEMBER [name = `type`, Type = 0x102E, offset = 0, attrs = public] @@ -308,12 +308,12 @@ ALL-NEXT:            - LF_MEMBER [name = `hidden`, Type = 0x0030 (bool), offset  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] +ALL-NEXT:   0x103A | LF_STRUCTURE [size = 96, hash = 98548]  ALL-NEXT:            class name: `__vc_attributes::moduleAttribute`  ALL-NEXT:            unique name: `.?AUmoduleAttribute@__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 -ALL-NEXT:   0x103B | LF_FIELDLIST [size = 756] +ALL-NEXT:   0x103B | LF_FIELDLIST [size = 756, hash = 35693]  ALL-NEXT:            - LF_ENUMERATE [eAnyUsage = 0]  ALL-NEXT:            - LF_ENUMERATE [eCoClassUsage = 1]  ALL-NEXT:            - LF_ENUMERATE [eCOMInterfaceUsage = 2] @@ -344,98 +344,104 @@ ALL-NEXT:            - LF_ENUMERATE [eModuleUsage = 16777216]  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] +ALL-NEXT:   0x103C | LF_ENUM [size = 140, hash = 171328]  ALL-NEXT:            name: `__vc_attributes::helper_attributes::usageAttribute::usage_e`  ALL-NEXT:            unique name: `.?AW4usage_e@usageAttribute@helper_attributes@__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] +ALL-NEXT:   0x103D | LF_STRUCTURE [size = 128, hash = 203640]  ALL-NEXT:            class name: `__vc_attributes::helper_attributes::usageAttribute`  ALL-NEXT:            unique name: `.?AUusageAttribute@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 -ALL-NEXT:   0x103E | LF_POINTER [size = 12] +ALL-NEXT:   0x103E | LF_POINTER [size = 12, hash = 139292]  ALL-NEXT:            referent = 0x103D, mode = pointer, opts = const, kind = ptr32 -ALL-NEXT:   0x103F | LF_ARGLIST [size = 12] +ALL-NEXT:   0x103F | LF_ARGLIST [size = 12, hash = 49018]  ALL-NEXT:            0x0075 (unsigned): `unsigned` -ALL-NEXT:   0x1040 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1040 | LF_MFUNCTION [size = 28, hash = 43821]  ALL-NEXT:            return type = 1, # args = 0x103F, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x103D, this type = 0x103E, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1041 | LF_FIELDLIST [size = 60] +ALL-NEXT:   0x1041 | LF_FIELDLIST [size = 60, hash = 202555]  ALL-NEXT:            - LF_NESTTYPE [name = `usage_e`, parent = 0x103C]  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] +ALL-NEXT:   0x1042 | LF_STRUCTURE [size = 128, hash = 165040]  ALL-NEXT:            class name: `__vc_attributes::helper_attributes::usageAttribute`  ALL-NEXT:            unique name: `.?AUusageAttribute@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 -ALL-NEXT:   0x1043 | LF_FIELDLIST [size = 68] +ALL-NEXT:   0x1043 | LF_FIELDLIST [size = 68, hash = 215835]  ALL-NEXT:            - LF_ENUMERATE [eBoolean = 0]  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] +ALL-NEXT:   0x1044 | LF_ENUM [size = 148, hash = 142625]  ALL-NEXT:            name: `__vc_attributes::helper_attributes::v1_alttypeAttribute::type_e`  ALL-NEXT:            unique name: `.?AW4type_e@v1_alttypeAttribute@helper_attributes@__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] +ALL-NEXT:   0x1045 | LF_STRUCTURE [size = 140, hash = 52534]  ALL-NEXT:            class name: `__vc_attributes::helper_attributes::v1_alttypeAttribute`  ALL-NEXT:            unique name: `.?AUv1_alttypeAttribute@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 -ALL-NEXT:   0x1046 | LF_POINTER [size = 12] +ALL-NEXT:   0x1046 | LF_POINTER [size = 12, hash = 44186]  ALL-NEXT:            referent = 0x1045, mode = pointer, opts = const, kind = ptr32 -ALL-NEXT:   0x1047 | LF_ARGLIST [size = 12] +ALL-NEXT:   0x1047 | LF_ARGLIST [size = 12, hash = 103930]  ALL-NEXT:            0x1044: `__vc_attributes::helper_attributes::v1_alttypeAttribute::type_e` -ALL-NEXT:   0x1048 | LF_MFUNCTION [size = 28] +ALL-NEXT:   0x1048 | LF_MFUNCTION [size = 28, hash = 110942]  ALL-NEXT:            return type = 1, # args = 0x1047, param list = 0x0003 (void)  ALL-NEXT:            class type = 0x1045, this type = 0x1046, this adjust = 0  ALL-NEXT:            calling conv = thiscall, options = constructor -ALL-NEXT:   0x1049 | LF_FIELDLIST [size = 64] +ALL-NEXT:   0x1049 | LF_FIELDLIST [size = 64, hash = 17991]  ALL-NEXT:            - LF_NESTTYPE [name = `type_e`, parent = 0x1044]  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] +ALL-NEXT:   0x104A | LF_STRUCTURE [size = 140, hash = 213215]  ALL-NEXT:            class name: `__vc_attributes::helper_attributes::v1_alttypeAttribute`  ALL-NEXT:            unique name: `.?AUv1_alttypeAttribute@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 +ALL:        Type Index Offsets: +ALL-NEXT:     TI: 0x1000, Offset: 0 +ALL:        Hash Adjusters:  ALL:                           Types (IPI Stream)  ALL-NEXT: ============================================================  ALL-NEXT:   Showing 15 records -ALL-NEXT:   0x1000 | LF_UDT_MOD_SRC_LINE [size = 20] +ALL-NEXT:   0x1000 | LF_UDT_MOD_SRC_LINE [size = 20, hash = 7186]  ALL-NEXT:            udt = 0x100B, mod = 1, file = 1, line = 481 -ALL-NEXT:   0x1001 | LF_UDT_MOD_SRC_LINE [size = 20] +ALL-NEXT:   0x1001 | LF_UDT_MOD_SRC_LINE [size = 20, hash = 7198]  ALL-NEXT:            udt = 0x1017, mod = 1, file = 1, line = 194 -ALL-NEXT:   0x1002 | LF_UDT_MOD_SRC_LINE [size = 20] +ALL-NEXT:   0x1002 | LF_UDT_MOD_SRC_LINE [size = 20, hash = 7180]  ALL-NEXT:            udt = 0x1021, mod = 1, file = 1, line = 603 -ALL-NEXT:   0x1003 | LF_UDT_MOD_SRC_LINE [size = 20] +ALL-NEXT:   0x1003 | LF_UDT_MOD_SRC_LINE [size = 20, hash = 7191]  ALL-NEXT:            udt = 0x102C, mod = 1, file = 1, line = 1200 -ALL-NEXT:   0x1004 | LF_UDT_MOD_SRC_LINE [size = 20] +ALL-NEXT:   0x1004 | LF_UDT_MOD_SRC_LINE [size = 20, hash = 7201]  ALL-NEXT:            udt = 0x103A, mod = 1, file = 1, line = 540 -ALL-NEXT:   0x1005 | LF_UDT_MOD_SRC_LINE [size = 20] +ALL-NEXT:   0x1005 | LF_UDT_MOD_SRC_LINE [size = 20, hash = 7241]  ALL-NEXT:            udt = 0x1042, mod = 1, file = 1, line = 108 -ALL-NEXT:   0x1006 | LF_UDT_MOD_SRC_LINE [size = 20] +ALL-NEXT:   0x1006 | LF_UDT_MOD_SRC_LINE [size = 20, hash = 7249]  ALL-NEXT:            udt = 0x104A, mod = 1, file = 1, line = 96 -ALL-NEXT:   0x1007 | LF_STRING_ID [size = 48] ID: <no type>, String: d:\src\llvm\test\DebugInfo\PDB\Inputs -ALL-NEXT:   0x1008 | LF_STRING_ID [size = 76] ID: <no type>, String: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe -ALL-NEXT:   0x1009 | LF_STRING_ID [size = 20] ID: <no type>, String: empty.cpp -ALL-NEXT:   0x100A | LF_STRING_ID [size = 56] ID: <no type>, String: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb -ALL-NEXT:   0x100B | LF_STRING_ID [size = 252] ID: <no type>, String: -Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows -ALL-NEXT:   0x100C | LF_SUBSTR_LIST [size = 12] +ALL-NEXT:   0x1007 | LF_STRING_ID [size = 48, hash = 80727] ID: <no type>, String: d:\src\llvm\test\DebugInfo\PDB\Inputs +ALL-NEXT:   0x1008 | LF_STRING_ID [size = 76, hash = 154177] ID: <no type>, String: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe +ALL-NEXT:   0x1009 | LF_STRING_ID [size = 20, hash = 75189] ID: <no type>, String: empty.cpp +ALL-NEXT:   0x100A | LF_STRING_ID [size = 56, hash = 253662] ID: <no type>, String: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb +ALL-NEXT:   0x100B | LF_STRING_ID [size = 252, hash = 193467] ID: <no type>, String: -Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows +ALL-NEXT:   0x100C | LF_SUBSTR_LIST [size = 12, hash = 222705]  ALL-NEXT:            0x100B: `-Zi -MT -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE" -I"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\ATLMFC\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" -I"C:\Program Files (x86)\Windows` -ALL-NEXT:   0x100D | LF_STRING_ID [size = 96] ID: 0x100C, String:  Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X -ALL-NEXT:   0x100E | LF_BUILDINFO [size = 28] +ALL-NEXT:   0x100D | LF_STRING_ID [size = 96, hash = 186099] ID: 0x100C, String:  Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X +ALL-NEXT:   0x100E | LF_BUILDINFO [size = 28, hash = 257108]  ALL-NEXT:            0x1007: `d:\src\llvm\test\DebugInfo\PDB\Inputs`  ALL-NEXT:            0x1008: `C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe`  ALL-NEXT:            0x1009: `empty.cpp`  ALL-NEXT:            0x100A: `d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb`  ALL-NEXT:            0x100D: ` Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TP -X` +ALL:        Type Index Offsets: +ALL-NEXT:     TI: 0x1000, Offset: 0 +ALL:        Hash Adjusters:  ALL:                             Public Symbols  ALL-NEXT: ============================================================  ALL-NEXT:   - S_PUB32 [size = 36] `?__purecall@@3PAXA` diff --git a/llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp b/llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp index 98813e03c38..22d3a4557c5 100644 --- a/llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp +++ b/llvm/tools/llvm-pdbutil/MinimalTypeDumper.cpp @@ -208,9 +208,20 @@ Error MinimalTypeDumpVisitor::visitTypeBegin(CVType &Record, TypeIndex Index) {    // formatLine puts the newline at the beginning, so we use formatLine here    // to start a new line, and then individual visit methods use format to    // append to the existing line. -  P.formatLine("{0} | {1} [size = {2}]", -               fmt_align(Index, AlignStyle::Right, Width), -               getLeafTypeName(Record.Type), Record.length()); +  if (!Hashes) { +    P.formatLine("{0} | {1} [size = {2}]", +                 fmt_align(Index, AlignStyle::Right, Width), +                 getLeafTypeName(Record.Type), Record.length()); +  } else { +    std::string H; +    if (Index.toArrayIndex() >= HashValues.size()) +      H = "(not present)"; +    else +      H = utostr(HashValues[Index.toArrayIndex()]); +    P.formatLine("{0} | {1} [size = {2}, hash = {3}]", +                 fmt_align(Index, AlignStyle::Right, Width), +                 getLeafTypeName(Record.Type), Record.length(), H); +  }    P.Indent(Width + 3);    return Error::success();  } diff --git a/llvm/tools/llvm-pdbutil/MinimalTypeDumper.h b/llvm/tools/llvm-pdbutil/MinimalTypeDumper.h index 47f6781e3ca..42882b4b406 100644 --- a/llvm/tools/llvm-pdbutil/MinimalTypeDumper.h +++ b/llvm/tools/llvm-pdbutil/MinimalTypeDumper.h @@ -11,6 +11,7 @@  #define LLVM_TOOLS_LLVMPDBUTIL_MINIMAL_TYPE_DUMPER_H  #include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h" +#include "llvm/Support/BinaryStreamArray.h"  namespace llvm {  namespace codeview { @@ -23,8 +24,10 @@ class LinePrinter;  class MinimalTypeDumpVisitor : public codeview::TypeVisitorCallbacks {  public:    MinimalTypeDumpVisitor(LinePrinter &P, uint32_t Width, bool RecordBytes, -                         codeview::LazyRandomTypeCollection &Types) -      : P(P), Width(Width), RecordBytes(RecordBytes), Types(Types) {} +                         bool Hashes, codeview::LazyRandomTypeCollection &Types, +                         FixedStreamArray<support::ulittle32_t> HashValues) +      : P(P), Width(Width), RecordBytes(RecordBytes), Hashes(Hashes), +        Types(Types), HashValues(HashValues) {}    Error visitTypeBegin(codeview::CVType &Record,                         codeview::TypeIndex Index) override; @@ -48,7 +51,9 @@ private:    LinePrinter &P;    uint32_t Width;    bool RecordBytes = false; +  bool Hashes = false;    codeview::LazyRandomTypeCollection &Types; +  FixedStreamArray<support::ulittle32_t> HashValues;  };  } // namespace pdb  } // namespace llvm diff --git a/llvm/tools/llvm-pdbutil/RawOutputStyle.cpp b/llvm/tools/llvm-pdbutil/RawOutputStyle.cpp index e37b0b6763a..3614c75fb6b 100644 --- a/llvm/tools/llvm-pdbutil/RawOutputStyle.cpp +++ b/llvm/tools/llvm-pdbutil/RawOutputStyle.cpp @@ -103,12 +103,12 @@ Error RawOutputStyle::dump() {        return EC;    } -  if (opts::raw::DumpTypes) { +  if (opts::raw::DumpTypes || opts::raw::DumpTypeExtras) {      if (auto EC = dumpTpiStream(StreamTPI))        return EC;    } -  if (opts::raw::DumpIds) { +  if (opts::raw::DumpIds || opts::raw::DumpIdExtras) {      if (auto EC = dumpTpiStream(StreamIPI))        return EC;    } @@ -367,15 +367,21 @@ Error RawOutputStyle::dumpTpiStream(uint32_t StreamIdx) {    assert(StreamIdx == StreamTPI || StreamIdx == StreamIPI);    bool Present = false; +  bool DumpTypes = false;    bool DumpBytes = false; +  bool DumpExtras = false;    if (StreamIdx == StreamTPI) {      printHeader(P, "Types (TPI Stream)");      Present = File.hasPDBTpiStream(); +    DumpTypes = opts::raw::DumpTypes;      DumpBytes = opts::raw::DumpTypeData; +    DumpExtras = opts::raw::DumpTypeExtras;    } else if (StreamIdx == StreamIPI) {      printHeader(P, "Types (IPI Stream)");      Present = File.hasPDBIpiStream(); +    DumpTypes = opts::raw::DumpIds;      DumpBytes = opts::raw::DumpIdData; +    DumpExtras = opts::raw::DumpIdExtras;    }    AutoIndent Indent(P); @@ -391,16 +397,45 @@ Error RawOutputStyle::dumpTpiStream(uint32_t StreamIdx) {    auto &Types = Err(initializeTypeDatabase(StreamIdx)); -  P.formatLine("Showing {0:N} records", Stream.getNumTypeRecords()); -  uint32_t Width = -      NumDigits(TypeIndex::FirstNonSimpleIndex + Stream.getNumTypeRecords()); +  if (DumpTypes) { +    P.formatLine("Showing {0:N} records", Stream.getNumTypeRecords()); +    uint32_t Width = +        NumDigits(TypeIndex::FirstNonSimpleIndex + Stream.getNumTypeRecords()); -  MinimalTypeDumpVisitor V(P, Width + 2, DumpBytes, Types); +    MinimalTypeDumpVisitor V(P, Width + 2, DumpBytes, DumpExtras, Types, +                             Stream.getHashValues()); -  Optional<TypeIndex> I = Types.getFirst(); -  if (auto EC = codeview::visitTypeStream(Types, V)) { -    P.formatLine("An error occurred dumping type records: {0}", -                 toString(std::move(EC))); +    Optional<TypeIndex> I = Types.getFirst(); +    if (auto EC = codeview::visitTypeStream(Types, V)) { +      P.formatLine("An error occurred dumping type records: {0}", +                   toString(std::move(EC))); +    } +  } + +  if (DumpExtras) { +    P.NewLine(); +    auto IndexOffsets = Stream.getTypeIndexOffsets(); +    P.formatLine("Type Index Offsets:"); +    for (const auto &IO : IndexOffsets) { +      AutoIndent Indent2(P); +      P.formatLine("TI: {0}, Offset: {1}", IO.Type, fmtle(IO.Offset)); +    } + +    P.NewLine(); +    P.formatLine("Hash Adjusters:"); +    auto &Adjusters = Stream.getHashAdjusters(); +    auto &Strings = Err(File.getStringTable()); +    for (const auto &A : Adjusters) { +      AutoIndent Indent2(P); +      auto ExpectedStr = Strings.getStringForID(A.first); +      TypeIndex TI(A.second); +      if (ExpectedStr) +        P.formatLine("`{0}` -> {1}", *ExpectedStr, TI); +      else { +        P.formatLine("unknown str id ({0}) -> {1}", A.first, TI); +        consumeError(ExpectedStr.takeError()); +      } +    }    }    return Error::success();  } diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index 18fda036ee7..9dcad07a10c 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -302,8 +302,8 @@ cl::opt<bool> DumpTypeData(      cl::desc("dump CodeView type record raw bytes from TPI stream"),      cl::cat(TypeOptions), cl::sub(RawSubcommand)); -cl::opt<bool> DumpTypeHashes("type-hash", -                             cl::desc("dump CodeView TPI hash stream"), +cl::opt<bool> DumpTypeExtras("type-extras", +                             cl::desc("dump type hashes and index offsets"),                               cl::cat(TypeOptions), cl::sub(RawSubcommand));  cl::opt<bool> DumpIds("ids", @@ -314,6 +314,10 @@ cl::opt<bool>                 cl::desc("dump CodeView type record raw bytes from IPI stream"),                 cl::cat(TypeOptions), cl::sub(RawSubcommand)); +cl::opt<bool> DumpIdExtras("id-extras", +                           cl::desc("dump id hashes and index offsets"), +                           cl::cat(TypeOptions), cl::sub(RawSubcommand)); +  // SYMBOL OPTIONS  cl::opt<bool> DumpPublics("publics", cl::desc("dump Publics stream data"),                            cl::cat(SymbolOptions), cl::sub(RawSubcommand)); @@ -898,8 +902,9 @@ int main(int argc_, const char *argv_[]) {        opts::raw::DumpSummary = true;        opts::raw::DumpSymbols = true;        opts::raw::DumpIds = true; +      opts::raw::DumpIdExtras = true;        opts::raw::DumpTypes = true; -      opts::raw::DumpTypeHashes = true; +      opts::raw::DumpTypeExtras = true;        opts::raw::DumpModules = true;        opts::raw::DumpModuleFiles = true;      } diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h index 37c4ca3ee5d..f38ec2d5a0a 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h @@ -105,9 +105,10 @@ extern llvm::cl::list<std::string> DumpStreamData;  extern llvm::cl::opt<bool> DumpStringTable;  extern llvm::cl::opt<bool> DumpTypes;  extern llvm::cl::opt<bool> DumpTypeData; -extern llvm::cl::opt<bool> DumpTypeHashes; +extern llvm::cl::opt<bool> DumpTypeExtras;  extern llvm::cl::opt<bool> DumpIds;  extern llvm::cl::opt<bool> DumpIdData; +extern llvm::cl::opt<bool> DumpIdExtras;  extern llvm::cl::opt<bool> DumpSymbols;  extern llvm::cl::opt<bool> DumpSymRecordBytes;  extern llvm::cl::opt<bool> DumpPublics;  | 

