From 4d56b5f5fd4b24a7046b13baf985354f162d5aa7 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Thu, 15 Jun 2017 23:04:42 +0000 Subject: [PATCH] [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 --- lib/DebugInfo/PDB/Native/TpiHashing.cpp | 1 + test/DebugInfo/PDB/pdbdump-headers.test | 186 ++++++++++++----------- tools/llvm-pdbutil/MinimalTypeDumper.cpp | 17 ++- tools/llvm-pdbutil/MinimalTypeDumper.h | 9 +- tools/llvm-pdbutil/RawOutputStyle.cpp | 55 +++++-- tools/llvm-pdbutil/llvm-pdbutil.cpp | 11 +- tools/llvm-pdbutil/llvm-pdbutil.h | 3 +- 7 files changed, 173 insertions(+), 109 deletions(-) diff --git a/lib/DebugInfo/PDB/Native/TpiHashing.cpp b/lib/DebugInfo/PDB/Native/TpiHashing.cpp index 16904a5a27e..91b8d648fcf 100644 --- a/lib/DebugInfo/PDB/Native/TpiHashing.cpp +++ b/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/test/DebugInfo/PDB/pdbdump-headers.test b/test/DebugInfo/PDB/pdbdump-headers.test index 7343dc48ef4..6f55590d6db 100644 --- a/test/DebugInfo/PDB/pdbdump-headers.test +++ b/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: , base list: , field list: 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: , base list: , 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: , base list: , field list: 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: , base list: , 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: , base list: , field list: 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: , base list: , 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: , base list: , field list: 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: , base list: , 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: , base list: , field list: 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: , base list: , 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: , base list: , field list: 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: , base list: , 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: , base list: , field list: 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: , base list: , 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: , String: d:\src\llvm\test\DebugInfo\PDB\Inputs -ALL-NEXT: 0x1008 | LF_STRING_ID [size = 76] ID: , String: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.exe -ALL-NEXT: 0x1009 | LF_STRING_ID [size = 20] ID: , String: empty.cpp -ALL-NEXT: 0x100A | LF_STRING_ID [size = 56] ID: , String: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb -ALL-NEXT: 0x100B | LF_STRING_ID [size = 252] ID: , 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: , String: d:\src\llvm\test\DebugInfo\PDB\Inputs +ALL-NEXT: 0x1008 | LF_STRING_ID [size = 76, hash = 154177] ID: , 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: , String: empty.cpp +ALL-NEXT: 0x100A | LF_STRING_ID [size = 56, hash = 253662] ID: , String: d:\src\llvm\test\DebugInfo\PDB\Inputs\vc120.pdb +ALL-NEXT: 0x100B | LF_STRING_ID [size = 252, hash = 193467] ID: , 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/tools/llvm-pdbutil/MinimalTypeDumper.cpp b/tools/llvm-pdbutil/MinimalTypeDumper.cpp index 98813e03c38..22d3a4557c5 100644 --- a/tools/llvm-pdbutil/MinimalTypeDumper.cpp +++ b/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/tools/llvm-pdbutil/MinimalTypeDumper.h b/tools/llvm-pdbutil/MinimalTypeDumper.h index 47f6781e3ca..42882b4b406 100644 --- a/tools/llvm-pdbutil/MinimalTypeDumper.h +++ b/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 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 HashValues; }; } // namespace pdb } // namespace llvm diff --git a/tools/llvm-pdbutil/RawOutputStyle.cpp b/tools/llvm-pdbutil/RawOutputStyle.cpp index e37b0b6763a..3614c75fb6b 100644 --- a/tools/llvm-pdbutil/RawOutputStyle.cpp +++ b/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 I = Types.getFirst(); - if (auto EC = codeview::visitTypeStream(Types, V)) { - P.formatLine("An error occurred dumping type records: {0}", - toString(std::move(EC))); + Optional 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/tools/llvm-pdbutil/llvm-pdbutil.cpp b/tools/llvm-pdbutil/llvm-pdbutil.cpp index 18fda036ee7..9dcad07a10c 100644 --- a/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -302,8 +302,8 @@ cl::opt DumpTypeData( cl::desc("dump CodeView type record raw bytes from TPI stream"), cl::cat(TypeOptions), cl::sub(RawSubcommand)); -cl::opt DumpTypeHashes("type-hash", - cl::desc("dump CodeView TPI hash stream"), +cl::opt DumpTypeExtras("type-extras", + cl::desc("dump type hashes and index offsets"), cl::cat(TypeOptions), cl::sub(RawSubcommand)); cl::opt DumpIds("ids", @@ -314,6 +314,10 @@ cl::opt cl::desc("dump CodeView type record raw bytes from IPI stream"), cl::cat(TypeOptions), cl::sub(RawSubcommand)); +cl::opt DumpIdExtras("id-extras", + cl::desc("dump id hashes and index offsets"), + cl::cat(TypeOptions), cl::sub(RawSubcommand)); + // SYMBOL OPTIONS cl::opt 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/tools/llvm-pdbutil/llvm-pdbutil.h b/tools/llvm-pdbutil/llvm-pdbutil.h index 37c4ca3ee5d..f38ec2d5a0a 100644 --- a/tools/llvm-pdbutil/llvm-pdbutil.h +++ b/tools/llvm-pdbutil/llvm-pdbutil.h @@ -105,9 +105,10 @@ extern llvm::cl::list DumpStreamData; extern llvm::cl::opt DumpStringTable; extern llvm::cl::opt DumpTypes; extern llvm::cl::opt DumpTypeData; -extern llvm::cl::opt DumpTypeHashes; +extern llvm::cl::opt DumpTypeExtras; extern llvm::cl::opt DumpIds; extern llvm::cl::opt DumpIdData; +extern llvm::cl::opt DumpIdExtras; extern llvm::cl::opt DumpSymbols; extern llvm::cl::opt DumpSymRecordBytes; extern llvm::cl::opt DumpPublics; -- 2.50.1