mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-09 13:41:47 +00:00
[llvm-pdbutil] Add back the ability to dump hashes and index offsets.
This was regressed in a previous patch that re-wrote the dumper, and I'm incrementally adding back the pieces that are missing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305524 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
975d465bad
commit
4d56b5f5fd
@ -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"
|
||||
|
||||
|
@ -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`
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user