From 08eb343cce893e2594de62f1ab976ed03536cb56 Mon Sep 17 00:00:00 2001 From: Adrian McCarthy Date: Mon, 10 Apr 2017 16:43:09 +0000 Subject: [PATCH] Improves pretty printing of variable types in llvm-pdbdump * Adds support for pointers to arrays, which was missing * Adds some tests * Improves consistency of const and volatile qualifiers * Eliminates non-composable special case code for arrays and function by using a more general recursive approach * Has a hack for getting the calling convention into the right spot for pointer-to-functions Given the rapid changes happenning in llvm-pdbdump, this may be difficult to merge. Differential Revision: https://reviews.llvm.org/D31832 llvm-svn: 299848 --- .../include/llvm/DebugInfo/PDB/PDBSymDumper.h | 16 ++ llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h | 5 + .../llvm/DebugInfo/PDB/PDBSymbolTypeArray.h | 1 + .../DebugInfo/PDB/PDBSymbolTypeFunctionSig.h | 1 + .../llvm/DebugInfo/PDB/PDBSymbolTypePointer.h | 1 + llvm/lib/DebugInfo/PDB/PDBSymbolTypeArray.cpp | 4 + .../PDB/PDBSymbolTypeFunctionSig.cpp | 4 + .../DebugInfo/PDB/PDBSymbolTypePointer.cpp | 4 + .../PDB/DIA/pdbdump-linenumbers.test | 14 +- .../PDB/DIA/pdbdump-symbol-format.test | 15 +- .../DebugInfo/PDB/Inputs/symbolformat.cpp | 8 + .../DebugInfo/PDB/Inputs/symbolformat.pdb | Bin 35840 -> 44032 bytes .../llvm-pdbdump/PrettyBuiltinDumper.cpp | 4 + .../llvm-pdbdump/PrettyVariableDumper.cpp | 137 +++++++++++------- .../tools/llvm-pdbdump/PrettyVariableDumper.h | 6 +- 15 files changed, 155 insertions(+), 65 deletions(-) diff --git a/llvm/include/llvm/DebugInfo/PDB/PDBSymDumper.h b/llvm/include/llvm/DebugInfo/PDB/PDBSymDumper.h index 095c33cfe8b..c976935c48e 100644 --- a/llvm/include/llvm/DebugInfo/PDB/PDBSymDumper.h +++ b/llvm/include/llvm/DebugInfo/PDB/PDBSymDumper.h @@ -54,6 +54,22 @@ public: virtual void dump(const PDBSymbolUnknown &Symbol); virtual void dump(const PDBSymbolUsingNamespace &Symbol); + virtual void dumpRight(const PDBSymbolTypeArray &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeBaseClass &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeBuiltin &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeCustom &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeDimension &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeEnum &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeFriend &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeFunctionArg &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeFunctionSig &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeManaged &Symbol) {} + virtual void dumpRight(const PDBSymbolTypePointer &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeTypedef &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeUDT &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeVTable &Symbol) {} + virtual void dumpRight(const PDBSymbolTypeVTableShape &Symbol) {} + private: bool RequireImpl; }; diff --git a/llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h b/llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h index e85d22875cb..652f2136105 100644 --- a/llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h +++ b/llvm/include/llvm/DebugInfo/PDB/PDBSymbol.h @@ -74,6 +74,11 @@ public: /// unknown properties, but individual implementations of PDBSymbol may /// override the behavior to only dump known fields. virtual void dump(PDBSymDumper &Dumper) const = 0; + + /// For certain PDBSymbolTypes, dumps additional information for the type that + /// normally goes on the right side of the symbol. + virtual void dumpRight(PDBSymDumper &Dumper) const {} + void defaultDump(raw_ostream &OS, int Indent) const; void dumpProperties() const; void dumpChildStats() const; diff --git a/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeArray.h b/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeArray.h index b70d0e852d9..39b7d3b300e 100644 --- a/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeArray.h +++ b/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeArray.h @@ -26,6 +26,7 @@ public: DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::ArrayType) void dump(PDBSymDumper &Dumper) const override; + void dumpRight(PDBSymDumper &Dumper) const override; FORWARD_SYMBOL_ID_METHOD(getArrayIndexType) FORWARD_SYMBOL_METHOD(isConstType) diff --git a/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h b/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h index a716cd324b7..8de54e70701 100644 --- a/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h +++ b/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h @@ -28,6 +28,7 @@ public: std::unique_ptr getArguments() const; void dump(PDBSymDumper &Dumper) const override; + void dumpRight(PDBSymDumper &Dumper) const override; void dumpArgList(raw_ostream &OS) const; FORWARD_SYMBOL_METHOD(getCallingConvention) diff --git a/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypePointer.h b/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypePointer.h index 47cfc8a34db..c502d4e77af 100644 --- a/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypePointer.h +++ b/llvm/include/llvm/DebugInfo/PDB/PDBSymbolTypePointer.h @@ -26,6 +26,7 @@ public: DECLARE_PDB_SYMBOL_CONCRETE_TYPE(PDB_SymType::PointerType) void dump(PDBSymDumper &Dumper) const override; + void dumpRight(PDBSymDumper &Dumper) const override; FORWARD_SYMBOL_METHOD(isConstType) FORWARD_SYMBOL_METHOD(getLength) diff --git a/llvm/lib/DebugInfo/PDB/PDBSymbolTypeArray.cpp b/llvm/lib/DebugInfo/PDB/PDBSymbolTypeArray.cpp index cf9b6fee98d..a8054a42d86 100644 --- a/llvm/lib/DebugInfo/PDB/PDBSymbolTypeArray.cpp +++ b/llvm/lib/DebugInfo/PDB/PDBSymbolTypeArray.cpp @@ -26,3 +26,7 @@ PDBSymbolTypeArray::PDBSymbolTypeArray(const IPDBSession &PDBSession, void PDBSymbolTypeArray::dump(PDBSymDumper &Dumper) const { Dumper.dump(*this); } + +void PDBSymbolTypeArray::dumpRight(PDBSymDumper &Dumper) const { + Dumper.dumpRight(*this); +} diff --git a/llvm/lib/DebugInfo/PDB/PDBSymbolTypeFunctionSig.cpp b/llvm/lib/DebugInfo/PDB/PDBSymbolTypeFunctionSig.cpp index 1d53c7daabf..473529d1b04 100644 --- a/llvm/lib/DebugInfo/PDB/PDBSymbolTypeFunctionSig.cpp +++ b/llvm/lib/DebugInfo/PDB/PDBSymbolTypeFunctionSig.cpp @@ -80,3 +80,7 @@ PDBSymbolTypeFunctionSig::getArguments() const { void PDBSymbolTypeFunctionSig::dump(PDBSymDumper &Dumper) const { Dumper.dump(*this); } + +void PDBSymbolTypeFunctionSig::dumpRight(PDBSymDumper &Dumper) const { + Dumper.dumpRight(*this); +} diff --git a/llvm/lib/DebugInfo/PDB/PDBSymbolTypePointer.cpp b/llvm/lib/DebugInfo/PDB/PDBSymbolTypePointer.cpp index f93b12d11ad..69819811d61 100644 --- a/llvm/lib/DebugInfo/PDB/PDBSymbolTypePointer.cpp +++ b/llvm/lib/DebugInfo/PDB/PDBSymbolTypePointer.cpp @@ -26,3 +26,7 @@ PDBSymbolTypePointer::PDBSymbolTypePointer( void PDBSymbolTypePointer::dump(PDBSymDumper &Dumper) const { Dumper.dump(*this); } + +void PDBSymbolTypePointer::dumpRight(PDBSymDumper &Dumper) const { + Dumper.dumpRight(*this); +} diff --git a/llvm/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test b/llvm/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test index 780e0db8466..2a596e4af14 100644 --- a/llvm/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test +++ b/llvm/test/DebugInfo/PDB/DIA/pdbdump-linenumbers.test @@ -1,12 +1,14 @@ +; RUN: llvm-pdbdump pretty -lines %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=LINE_NUMS_FPO %s ; RUN: llvm-pdbdump pretty -lines %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=LINE_NUMS %s -; LINE_NUMS: llvm\test\debuginfo\pdb\inputs\symbolformat-fpo.cpp -; LINE_NUMS: Line 5, Address: [0x000011a0 - 0x000011a5] (6 bytes) -; LINE_NUMS: Line 6, Address: [0x000011a6 - 0x000011a6] (1 bytes) +; LINE_NUMS_FPO: llvm\test\debuginfo\pdb\inputs\symbolformat-fpo.cpp +; LINE_NUMS_FPO: Line 5, Address: [0x000011a0 - 0x000011a5] (6 bytes) +; LINE_NUMS_FPO: Line 6, Address: [0x000011a6 - 0x000011a6] (1 bytes) + ; LINE_NUMS: llvm\test\debuginfo\pdb\inputs\symbolformat.cpp ; LINE_NUMS: Line 6, Address: [0x00001060 - 0x00001066] (7 bytes) -; LINE_NUMS: Line 72, Address: [0x000010d0 - 0x000010d1] (2 bytes) -; LINE_NUMS: Line 73, Address: [0x000010d2 - 0x000010d5] (4 bytes) +; LINE_NUMS: Line 80, Address: [0x000010d0 - 0x000010d1] (2 bytes) +; LINE_NUMS: Line 81, Address: [0x000010d2 - 0x000010d5] (4 bytes) ; LINE_NUMS: Line 28, Address: [0x00001170 - 0x0000117a] (11 bytes) ; LINE_NUMS: Line 21, Address: [0x00001180 - 0x0000118a] (11 bytes) -; LINE_NUMS: Line 20, Address: [0x00001190 - 0x0000119a] (11 bytes) \ No newline at end of file +; LINE_NUMS: Line 20, Address: [0x00001190 - 0x0000119a] (11 bytes) diff --git a/llvm/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test b/llvm/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test index 4116deb9922..697a723c483 100644 --- a/llvm/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test +++ b/llvm/test/DebugInfo/PDB/DIA/pdbdump-symbol-format.test @@ -1,3 +1,4 @@ +; RUN: llvm-pdbdump pretty -symbols %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=SYM_FORMAT_FPO %s ; RUN: llvm-pdbdump pretty -symbols %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=SYM_FORMAT %s ; RUN: llvm-pdbdump pretty -types %p/../Inputs/symbolformat.pdb > %t.types ; RUN: FileCheck --check-prefix=TYPES_FORMAT %s < %t.types @@ -7,9 +8,11 @@ ; RUN: llvm-pdbdump pretty -globals %p/../Inputs/symbolformat.pdb | FileCheck --check-prefix=GLOBALS %s ; The format is func [0x+ - 0x-] +; SYM_FORMAT_FPO: ---SYMBOLS--- +; SYM_FORMAT_FPO: symbolformat-fpo.obj +; SYM_FORMAT-FPO: func [{{.*}}] (FPO) unsigned int __cdecl fpo_func(unsigned int n) + ; SYM_FORMAT: ---SYMBOLS--- -; SYM_FORMAT: symbolformat-fpo.obj -; SYM_FORMAT-DAG: func [{{.*}}] (FPO) unsigned int __cdecl fpo_func(unsigned int n) ; SYM_FORMAT: symbolformat.obj ; SYM_FORMAT-DAG: func [{{.*}}] (EBP) int __cdecl _purecall() ; SYM_FORMAT-DAG: func [{{.*}}] (EBP) int __cdecl main(int argc, char** argv) @@ -50,10 +53,16 @@ ; TYPES_2: data +0x28 unsigned __int64 m_unsigned_int64 ; TYPES_2: data +0x30 float m_float ; TYPES_2: data +0x38 double m_double -; TYPES_2: data +0x40 void (__cdecl *m_pfn_2_args)(int, double) +; TYPES_2: data +0x40 void (__cdecl * m_pfn_2_args)(int, double) +; TYPES_2: data +0x44 int m_multidimensional_array[2][3] ; TYPES_2: } ; GLOBALS: ---GLOBALS--- ; GLOBALS-DAG: func [{{.*}}] (FPO) unsigned int __cdecl fpo_func(unsigned int n) ; GLOBALS-DAG: data [{{.*}}] static void* g_global_pointer ; GLOBALS-DAG: data [{{.*}}] static int g_global_int +; GLOBALS-DAG: data [{{.*}}] static int g_array[3] +; GLOBALS-DAG: data [{{.*}}] static int (* g_pointer_to_array)[3] +; GLOBALS-DAG: data [{{.*}}] static const int* g_pointer_to_const_int +; GLOBALS-DAG: data int* const g_const_pointer_to_int = 0 +; GLOBALS-DAG: data const int* const g_const_pointer_to_const_int = 0 diff --git a/llvm/test/DebugInfo/PDB/Inputs/symbolformat.cpp b/llvm/test/DebugInfo/PDB/Inputs/symbolformat.cpp index 5479b717cd9..14b44ae3c31 100644 --- a/llvm/test/DebugInfo/PDB/Inputs/symbolformat.cpp +++ b/llvm/test/DebugInfo/PDB/Inputs/symbolformat.cpp @@ -50,6 +50,7 @@ struct MemberTest { float m_float; double m_double; void (*m_pfn_2_args)(int, double); + int m_multidimensional_array[2][3]; }; typedef int IntType; @@ -58,6 +59,13 @@ typedef A ClassAType; int g_global_int; void *g_global_pointer = nullptr; +typedef int int_array[3]; +int_array g_array = { 1, 2, 3 }; +int_array *g_pointer_to_array = &g_array; +const int *g_pointer_to_const_int = nullptr; +int * const g_const_pointer_to_int = nullptr; +const int * const g_const_pointer_to_const_int = nullptr; + int main(int argc, char **argv) { // Force symbol references so the linker generates debug info B b; diff --git a/llvm/test/DebugInfo/PDB/Inputs/symbolformat.pdb b/llvm/test/DebugInfo/PDB/Inputs/symbolformat.pdb index 53d8a1b31a39c68c3f29c570f8dc87c179a26b6a..0e509f3a93c33fa65471692bb69155effebdb7d4 100644 GIT binary patch delta 5746 zcmZpe!PIbrX@ZI%BLf42HUk605e5j**leh9nwgD*nd1q=zs-Uy@0lknuyC_{_`}Wt zk{P%d>;y|07#J8C@)+0{Tm(UO2{E_|iZU=TfY=KdL2`_f-^)o)J}1E;E(lfu z(jm%_$H2tE#=yqlBWN@Et%S3}b4CUR0Y=dfHBVp8%X<4$mnhvnvFa$q90djjhRqWM z3z)#Z2_w=sI+N{W*d!V7cu8e)gA51bo5`Ir;Y>VClOM_CO+F*5G1*5}gO`tiTkygE z|NmPA7#NZ!cgpJPiZO5tp7{U&f0zIRLqKU!s$)t@5hze$-Y^tkV9;U^00(r%WKOwc z#ygX9<&qgSCSR2EW}GrvRz91Fg=KP=d>&H?%j93`o9bN|7#i3Z7#Q3c7#ai^7#KVm z7#hqO7#O@57#i#t7#O@67#ds|7#MsQ7#e&S7#MsR7#e~Z7#RE*7#gA&7#RE+7#b27 z7#IQ=7#flo7#IQ>7#hAXFfd3kFfizWgLB8sl|3AtHu{~$lT@GocbLq;@QHze0Ti4C zj0}^tHFLc@K;|vxk<3t6R85kTG7##G9QW8rN85pD(%mr&EbLuJAS28j%Ffr(* zLc|#uJI2ZHH$Hr3yMI+K&g|N z0U`qu2gOVS1H%E3JTrq{QgJcJ6=t%6EFi-IAO(&C1A~)ZQEE7#PYJ7#Lcl85sWm|Ns91DCsgl*dRU#gS3EX7|vrv$p2wvU?_nW49t@Q8{`FL z85kI37#P4sj2r_4gZxIvdgetcERzfjm;{(78yTp1fV>9^H3m>plmZ!#zzz%y2VgD* z7nK1Fpm2nkiBJa8?zDMDbfH0nW;ObqZ+n?Z?z4_rz?(t&+?e0olPQesYgW?qSd zgRzGr$O&ptH4==VA^@SLAU`v&B(=!F!8pJ%!V#2KA!dQ}Ff-Vv$0rsQC02r^K?XT! zG4R!cE#m=~CHCp@P!r-y@{!a=8W?#vGU!1qm4R7`q&7J}ueb#2!~iD`Cy<3w419v1 zgaOHQ@$m(vMXAY&IXMgr4DlcjfaE4HPF`gp%V<3LgoQez@#GH{Q$Wd%fr-K1KHl8X z!NJVQ0cI44=9#?EQkqd>@?J}6Sx{PGWI&iI#GnfH$_G%?P5x>rUk?dEh8JHO`!wKX%H3nY67y$+b zNC2hRBL^ltfIteB7}y2d!Iq@QLnNT~gMvLX50noX)EL+WJ8-FiXacL`W8e@3Y4FS| z38^edWe{TE0DB-akG}*Gg$xW}!3mRNt;BUDzzN*Z%E}QW3JI|qu$YsTl@qAMfr#mV z68z+aR^q&%`h=0e(dq#c1B1(CRvY>H4h9AW4<-hNR!~SYFfgnI7rP7$xllS5Dt-}4 zyF$eoVKh`+7Rv90(uQDnFfg2i@_#~UQK+~jL?1W9QV4_LF5~0`Tj@y>ER%h0c_yhS zOj6FhU{}6mLHm85l&E7#Iwg7#La@7#Nl?Ffdp!Ffhb0Ffd$TU|?tv zWMEhz$iPq_$iOfGlo&y50S1Ny0R{#IK?a6ckeC3dNc%t8+Is5b16C3e94sKdqm@-y zW>HCLVvZZA=>}?18CYCkR&-!602LSvZ#nLO3Jp+w&j3o+p#0hZlAFBN*;o@)d2xfv zK?Y`U;SX{vsBGp0i?P7Pj!fosQD*~{#zhR16MSqZ7rU6trr>RMUhvVGoaG`ah}j^$ z;A1#>l?xY38v_Hw4GMN3$hpvv1eFP}>goS~Zm`S$ z|L0-&|9_&R3Mk$-U$HY`Gyy4NV_@iGXP6Yn!N9=4!^FVwfRTYAgMooT2gyt^1_p*z z;Kbs?IGM*u0@Mg#&{=rFA7UjxLj}kYAiJSS4dfSnM{M3b=%6z>%TW+ZK!9ZIWY{J< zItVL+?EWL9l?O4OkHG*Wz`(!|0d@pfbTTgUO(*Ym;K6FX<>WPvax6j&7R(bJ#TYFn zKXtSR7n3lbfGuHUU=RnjX9NNg7$!S9Ni#A`js=sIPSRl2vu3fs1i1jDx`B~_fg7%R zBUs&8C+Sp>9L)WoKnAG?1+asF0k|Lr@j)0Q2TFsuJU zfdR($7hquM0;^#Z0{Odha&4M;P#3t&1r>yBLd=W|4BY|@3?RA;N|y_O+eK3zVg7t0wm(Ik({qOz1_n@G)WCE2p8k>!M*ck~HIEDmOC`>l?(Icoz z$4)n`AYU)Jpnw5X?t+2>l;}Y2*~h@Z5X!*7Fp+_QA&h~60o1((^~peLVEF4qN8!mg zY|S3D2Yq z9zanZzvR>Tw5q9i?zR+oCE4cGWg*%Oo68?+0ev557bfp_-!(0 zp%u2 zMfvGPiMb41j8GR%D3apwa}9Be2zK#~G0`)d%u!$_j>DwM_Y1`)PbiYYDPLElQ;$P$ zOnGKrQ3(Sd1B)1_dH(5c~ zzd~X120?4&Skb^09^hDE`1J7`)S$@+g*2!c6KY8eA7P73Xu+)ixp{9_5;hh)*!|x;ph9XM_h5}~>hCi7M4CTcP4D5*v48Ir| z7)p&97@|2D7$!5(PEN!J{DZkik0< z(4Yzf1H%s{28JAF1_lFADFhuASpaJOFfuSqWMW_d4IKSpWnhS4Vqo~gz`$U`%)kH& zP|z>{s6!#bz`y_+HU*V1phgy`P?7}qt3ZVt184}!i9rQAU;?VPK@Ck%`wCQ)gW5?T ucW^NeQD+2=qXp{z2VyiJQFtBfQv}a~i-^|$ZpM9}F3kv`c_`pH{ delta 2152 zcmZp;!PGE=X@ZI%69WT-G6Ms{1_lUF+{~zQnwjaqpUr|S@0lknu<)~5Ff%Z~xjYu! zrwkb_K#Bzz7#Kj9fq~)w|NsA47#J9s8$c2eK8OVphtZoYGEOj4pu6M*v&|GeL&hr{ zA3_)z7#PY<>dAMi^!YA1eJF2E$hvDFdq5Z@2f`pW3_DIVV%*HAa)f!33=4}B1Eb*N zleT6`x@iUZdihCN3=CEbHiC=_3=HfHLJSNHyg`gmdUAz;j`kC%DeO?1je&uIQGkJA z0V4wgBLhQPL4JH%X7A!?q!oR{_Xr!G;tePY#71_qYN4|H`m26Qoj9BBt}q`531_o;9iF$f5P zoOWgMLXmK$FN~9aiR4Y5BB~-P#=tFj;{X5uVFC;c0i{K$jwvZc43m$F>htn3a0@>8 z|Nnow00TqPa8?B)L_UKN6s-_dDk-T+ zrRgBGW`fKNJYWT!3}EVj9>f?1F$Qx%kXQo)!vT7i zrRL-(Z*&Y}oTOpE^nhuyk%k%@NHc@OL`N|p2L^@%5G4>T3;~nlG$a|FHaaFSPtxJY z$^bcnS6`1H(lq-xEqlLTODX{THSVO6Nkwd7-o-DBUwKFf>B>Q<)|o zFg2JMAT{}oj@rZk@yR}B0+Y4$_$K?9sZI>ggHS3EN@B8t-hquS0gRIjG&owo2Bj5j zHn6zB%({n(fx%)jtBHJl0Vq8&F)$cH9qLe(ci`JnhLkiiozrnuF11>c{dA~+AvNGP=&Z(ZSn>^lg&5m z3>fP{HnK4=^sqDV25~SjGHhXFU^v3azyJ#N9;i_uN{oSlAp~rb4@e702vl5viw#gw zqQDT4022Hoqy;J?7#J9M7(Rdm7#J8L!1@>%exyZ0MHm=dtYV6bl4B-cvDKcu)KPTu zODF5AFTlTX^3Pd?=!F!`pfIxDzj znf%{TnT4NW4bwzNF-FG8wodkpjFW4fq!}3}&vcTO1sQy$M79Q`8^n%fWMBZ9tso$f zz&QCLSlwGN$>|JHJ!=;GOPFd<2?_V=WJhP=dQcGo%3h#q2c!ywL2QsX2PpXq7&w6J z0f~b!NX~_UfdQ9X0GgcA27}o!eV{A~3K0he0|$^fpeTOt%*qO4@0fhoS)LPQY6FA8 z0mjLSHpZHutj`U$oEco9fy@ErI!>?{3tVj385r^y85qv6Le%_WWMC+P zhNJZ4Km~bQP^}KCQe+tz7-T@jH3I_!KLY~;A2^XRfGbCkCBh7#DwBbMi-CcGn}LBr Vj)8$eexqYBGbqz+7Fckb9RM%+oP7WQ diff --git a/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.cpp index f866132aa88..591d5e70cfd 100644 --- a/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.cpp +++ b/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.cpp @@ -20,6 +20,10 @@ BuiltinDumper::BuiltinDumper(LinePrinter &P) : PDBSymDumper(false), Printer(P) {} void BuiltinDumper::start(const PDBSymbolTypeBuiltin &Symbol) { + if (Symbol.isConstType()) + WithColor(Printer, PDB_ColorItem::Keyword).get() << "const "; + if (Symbol.isVolatileType()) + WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile "; WithColor(Printer, PDB_ColorItem::Type).get() << getTypeName(Symbol); } diff --git a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp index c565fcf0dd8..8b85f978869 100644 --- a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp +++ b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp @@ -14,6 +14,7 @@ #include "PrettyFunctionDumper.h" #include "llvm-pdbdump.h" +#include "llvm/DebugInfo/PDB/IPDBSession.h" #include "llvm/DebugInfo/PDB/PDBSymbolData.h" #include "llvm/DebugInfo/PDB/PDBSymbolFunc.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h" @@ -23,10 +24,12 @@ #include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h" +#include "llvm/DebugInfo/PDB/PDBTypes.h" #include "llvm/Support/Format.h" using namespace llvm; +using namespace llvm::codeview; using namespace llvm::pdb; VariableDumper::VariableDumper(LinePrinter &P) @@ -55,7 +58,6 @@ void VariableDumper::start(const PDBSymbolData &Var) { break; Printer.NewLine(); Printer << "data "; - WithColor(Printer, PDB_ColorItem::Keyword).get() << "const "; dumpSymbolTypeAndName(*VarType, Var.getName()); Printer << " = "; WithColor(Printer, PDB_ColorItem::LiteralValue).get() << Var.getValue(); @@ -85,6 +87,23 @@ void VariableDumper::start(const PDBSymbolData &Var) { } } +void VariableDumper::dump(const PDBSymbolTypeArray &Symbol) { + auto ElementType = Symbol.getElementType(); + assert(ElementType); + if (!ElementType) + return; + ElementType->dump(*this); +} + +void VariableDumper::dumpRight(const PDBSymbolTypeArray &Symbol) { + auto ElementType = Symbol.getElementType(); + assert(ElementType); + if (!ElementType) + return; + Printer << '[' << Symbol.getCount() << ']'; + ElementType->dumpRight(*this); +} + void VariableDumper::dump(const PDBSymbolTypeBuiltin &Symbol) { BuiltinDumper Dumper(Printer); Dumper.start(Symbol); @@ -94,27 +113,71 @@ void VariableDumper::dump(const PDBSymbolTypeEnum &Symbol) { WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName(); } -void VariableDumper::dump(const PDBSymbolTypeFunctionSig &Symbol) {} +void VariableDumper::dump(const PDBSymbolTypeFunctionSig &Symbol) { + auto ReturnType = Symbol.getReturnType(); + ReturnType->dump(*this); + Printer << " "; + + uint32_t ClassParentId = Symbol.getClassParentId(); + auto ClassParent = + Symbol.getSession().getConcreteSymbolById( + ClassParentId); + + if (ClassParent) { + WithColor(Printer, PDB_ColorItem::Identifier).get() + << ClassParent->getName(); + Printer << "::"; + } +} + +void VariableDumper::dumpRight(const PDBSymbolTypeFunctionSig &Symbol) { + Printer << "("; + if (auto Arguments = Symbol.getArguments()) { + uint32_t Index = 0; + while (auto Arg = Arguments->getNext()) { + Arg->dump(*this); + if (++Index < Arguments->getChildCount()) + Printer << ", "; + } + } + Printer << ")"; + + if (Symbol.isConstType()) + WithColor(Printer, PDB_ColorItem::Keyword).get() << " const"; + if (Symbol.isVolatileType()) + WithColor(Printer, PDB_ColorItem::Keyword).get() << " volatile"; +} void VariableDumper::dump(const PDBSymbolTypePointer &Symbol) { auto PointeeType = Symbol.getPointeeType(); if (!PointeeType) return; - - if (auto Func = PointeeType->cast()) { - FunctionDumper NestedDumper(Printer); - FunctionDumper::PointerType Pointer = - Symbol.isReference() ? FunctionDumper::PointerType::Reference - : FunctionDumper::PointerType::Pointer; - NestedDumper.start(*Func, Pointer); - } else { - if (Symbol.isConstType()) - WithColor(Printer, PDB_ColorItem::Keyword).get() << "const "; - if (Symbol.isVolatileType()) - WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile "; - PointeeType->dump(*this); - Printer << (Symbol.isReference() ? "&" : "*"); + PointeeType->dump(*this); + if (auto Func = PointeeType->cast()) { + // A hack to get the calling convention in the right spot. + Printer << " ("; + PDB_CallingConv CC = Func->getCallingConvention(); + WithColor(Printer, PDB_ColorItem::Keyword).get() << CC << " "; + } else if (isa(PointeeType.get())) { + Printer << " ("; } + Printer << (Symbol.isReference() ? "&" : "*"); + if (Symbol.isConstType()) + WithColor(Printer, PDB_ColorItem::Keyword).get() << " const "; + if (Symbol.isVolatileType()) + WithColor(Printer, PDB_ColorItem::Keyword).get() << " volatile "; +} + +void VariableDumper::dumpRight(const PDBSymbolTypePointer &Symbol) { + auto PointeeType = Symbol.getPointeeType(); + assert(PointeeType); + if (!PointeeType) + return; + if (isa(PointeeType.get()) || + isa(PointeeType.get())) { + Printer << ")"; + } + PointeeType->dumpRight(*this); } void VariableDumper::dump(const PDBSymbolTypeTypedef &Symbol) { @@ -128,43 +191,7 @@ void VariableDumper::dump(const PDBSymbolTypeUDT &Symbol) { void VariableDumper::dumpSymbolTypeAndName(const PDBSymbol &Type, StringRef Name) { - if (auto *ArrayType = Type.cast()) { - std::string IndexSpec; - raw_string_ostream IndexStream(IndexSpec); - std::unique_ptr ElementType = ArrayType->getElementType(); - while (auto NestedArray = ElementType->cast()) { - IndexStream << "["; - IndexStream << NestedArray->getCount(); - IndexStream << "]"; - ElementType = NestedArray->getElementType(); - } - IndexStream << "[" << ArrayType->getCount() << "]"; - ElementType->dump(*this); - WithColor(Printer, PDB_ColorItem::Identifier).get() << " " << Name; - Printer << IndexStream.str(); - } else { - if (!tryDumpFunctionPointer(Type, Name)) { - Type.dump(*this); - WithColor(Printer, PDB_ColorItem::Identifier).get() << " " << Name; - } - } -} - -bool VariableDumper::tryDumpFunctionPointer(const PDBSymbol &Type, - StringRef Name) { - // Function pointers come across as pointers to function signatures. But the - // signature carries no name, so we have to handle this case separately. - if (auto *PointerType = Type.cast()) { - auto PointeeType = PointerType->getPointeeType(); - if (auto *FunctionSig = PointeeType->cast()) { - FunctionDumper Dumper(Printer); - FunctionDumper::PointerType PT = FunctionDumper::PointerType::Pointer; - if (PointerType->isReference()) - PT = FunctionDumper::PointerType::Reference; - std::string NameStr(Name.begin(), Name.end()); - Dumper.start(*FunctionSig, NameStr.c_str(), PT); - return true; - } - } - return false; + Type.dump(*this); + WithColor(Printer, PDB_ColorItem::Identifier).get() << " " << Name; + Type.dumpRight(*this); } diff --git a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h index a122bb86058..eec389b1707 100644 --- a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h +++ b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h @@ -26,6 +26,7 @@ public: void start(const PDBSymbolData &Var); + void dump(const PDBSymbolTypeArray &Symbol) override; void dump(const PDBSymbolTypeBuiltin &Symbol) override; void dump(const PDBSymbolTypeEnum &Symbol) override; void dump(const PDBSymbolTypeFunctionSig &Symbol) override; @@ -33,9 +34,12 @@ public: void dump(const PDBSymbolTypeTypedef &Symbol) override; void dump(const PDBSymbolTypeUDT &Symbol) override; + void dumpRight(const PDBSymbolTypeArray &Symbol) override; + void dumpRight(const PDBSymbolTypeFunctionSig &Symbol) override; + void dumpRight(const PDBSymbolTypePointer &Symbol) override; + private: void dumpSymbolTypeAndName(const PDBSymbol &Type, StringRef Name); - bool tryDumpFunctionPointer(const PDBSymbol &Type, StringRef Name); LinePrinter &Printer; };