From 964a619cadf1642d7f99da03ade50c75286d0500 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Fri, 27 Feb 2015 09:15:18 +0000 Subject: [PATCH] [llvm-pdbdump] Add support for dumping global variables. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230744 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/DebugInfo/PDB/Inputs/symbolformat.cpp | 3 + test/DebugInfo/PDB/Inputs/symbolformat.pdb | Bin 143360 -> 35840 bytes test/DebugInfo/PDB/pdbdump-flags.test | 34 ++++++---- test/DebugInfo/PDB/pdbdump-symbol-format.test | 22 +++---- tools/llvm-pdbdump/TypeDumper.cpp | 17 ----- tools/llvm-pdbdump/TypeDumper.h | 2 - tools/llvm-pdbdump/llvm-pdbdump.cpp | 60 ++++++++++++++---- 7 files changed, 82 insertions(+), 56 deletions(-) diff --git a/test/DebugInfo/PDB/Inputs/symbolformat.cpp b/test/DebugInfo/PDB/Inputs/symbolformat.cpp index 237913e7221..5479b717cd9 100644 --- a/test/DebugInfo/PDB/Inputs/symbolformat.cpp +++ b/test/DebugInfo/PDB/Inputs/symbolformat.cpp @@ -55,6 +55,9 @@ struct MemberTest { typedef int IntType; typedef A ClassAType; +int g_global_int; +void *g_global_pointer = nullptr; + int main(int argc, char **argv) { // Force symbol references so the linker generates debug info B b; diff --git a/test/DebugInfo/PDB/Inputs/symbolformat.pdb b/test/DebugInfo/PDB/Inputs/symbolformat.pdb index 28832d4090fab93e9c9b48e4db52391aceb5013b..53d8a1b31a39c68c3f29c570f8dc87c179a26b6a 100644 GIT binary patch delta 2704 zcmcJRdu&w46~@2u-314G{ot|Kj_XH*ad_0-RY))duy=WwmsnN)RVBn9H7Tk>rB=2{(l!ZAf3v<& zlz$>s>PX*y=iE7S=FFLyGn*LAOdQYXE1&6;G9=vw`hjib1Ceu1#_(sU{JeiV{%S|E z;-^k^*1KU-Z7uRVK%dj_At%8P&FWv|!RnBC`+pz)Om%}fW>&d}#^$)=wU4Exiqun) z43qhZ{6RaLdoeoKeK%U;{x(|Z&We_~6Om2Dx;inQBVW+2FN=_~!J7;S!0vCNi`>1@ zSqz*}e5@*L{*XC#ufcH7J5{Ae<~&t@;@sJ`=k9&=kE!B@%T6+uot|~6TNlgC3T!f( zjw$TMV^5ge)Zbz=oMgwOP1s%0G4l&Hx1|yt`;93|U3=8YsPHqk3@igSoi=5brvTeW z!sQ!?Ty)&gGt=Cm(cnPCsFUn|xp%pgutqho-GT_b7>>d#;Fa)dcon=6Mow&o*TCO` z>);r?7H)#q!5_i};55iHJO8@+g`vs~Zb7H1^;svMiHa9^3Xk$d{;(^5F~QD2w2^A_CJO2btT z$GhXmK`qX=-x7R-$VpXGSC>?zyYhV^t_JC3swKJ2B>V3Pc!TT!)gFxmr`K9no!eX6 zw_#?#Hl()p?{kvFnJvv|)dV&Gh+kLuv3%as*LnPa$MZbCcHPe7-QM?r$L092ehzv1 z_ucsLzua~2uLH~3$psk+-_eMb?4D-1jc1qm4`bgq5ZP>!Bh|fMRZc#7x;d)Z*|@W{ zy(!+>*wWTrTYJaa2pwjwXOq5hH`#QwW3{~#yN1Y?h;oatBM!yvAT>62^mK0D7H@4u zZL>aXUtfA5HTSo4cK5_v*SL?2gOAJ5!s)1_adbpI zxTmAq=00?(#M_!O_sVb}^}%S+7|zmq zw(qeOeV9B4?1pV*YIbTvtLzf+QFuKLfTNyMtsmhf{Ou_XMJv;BeCAt9l zrV?#y`|9E%IYGas(v=BYa{6XOGsGD9HQ6}O`Pj3SxOYSM=@F_{8;^et>|x}OO* zm>+tD=>PGe^foV)1`kS?3#r2UsK_nS57tY+i%5Ip(mgY&ws%M`QoeswB{lA$5E0qT zuSi3LeSC*hN}0b84s}Q$VIM<&7Mo`JW0lf$N_v!%ej$tM46kBo+o>Rdh3eH6zm&5; zdMivt>Xm-~b?E@|Y_|IFE@^7B^kk#7u!K_0+u@%k{W%~#vPD`vTWWfk=V3Qj3g@r# zPz_Z`53Z5E$E1mnbbF3PxX%-W{#A?fN@au0%6|Cw2a?4if zmHE=29%WT4xk+TFYlF0z>|CNM{DsxE&!xx{)DHC1Wm4rgaC$#)ODCl(8|TOu2*ytq zm*V4mlQc^93bCytGcPTY?(QWW8)r$sWEBtYBwZN)gQ%N}2xtoFVqif`+PYNw?rN!% zAfMp&oWlO%<5VZ?x}&_zY)@B2iWBrF^Q0vNTeC^Jb|1lUn)YFPmKD#Tza5|HKSt0% zoiC$p8Bgz8Pz9EQI?x98fX^BD8jcI^l-B37im!1lf=om@AKypD$jlM!y1-s<%pv$m z@Cs+4gfmljkPA@G9I)~RB1z}zybNFO?P%mfhi~PMa0*6QuWj}*Ud9^7VB4MtWrmj# zw1M}qwKn!q@21aQ6kPD)ax4MqE#l=*k2WcfHYsZ2swbwO8-r=^UnZN X!8E{$;`!iw^YA%T*9`*=uTT9Ca*;v0 delta 4611 zcmeHLdr(x@9sbTayDZ4VMR}~S1|;|d88#Jy_{b8WzA#xv(}*>Q3JI|wgd~bqx@2a} zXp_mn-rAa2ZGEIkGdk5=+aZx@wc0jqVq4Q{Gl`Sp6kF5S3YHkHR{EXgu7cG}I+Mxd z56{eZzjJ@*d4K2Z_d9!9Hp`aI$ktH_PCx>JI;FWU=bm#MrRn(k#bwX*d{;5L~?k;RH-L+k6hcCuI zjD>pCRYV{a_^S;lwey8(Gh4b9P@{WbY9i7F;3HNNM_6wi%dRlrz%m!X>KIPweuol? zL<|u}#1hd2KNt~2ysqM4W(bi)B*S>lIbBp4PkA$q9_Q*%ZnXJayc7vTU`ygSh-T|X z*pp(&Mr-33!{1oq>Pdl0vco}JBoRdnA!5z?hK<*oCefsuCX>TWN8Zph(Q4`}SWzc1FXZnwV>Xwi9y0Url1s=%m=Dkm-zD}E2Z`SkUBpEqMgrrAS<-UeJu>*k`o>iUK0YkW{DYP2Gk*2Xm;SKr zv-!sC9HrOTlbvqu-&NW3LOGB5QTF3PY%#ayEEnNzQfv$U-wkrhVjHV#>z4ytxCZc= zPv@?^wv!5M!AX(j3u(`#^T!ih3vA^>^K9$=koA7d;(ZpcxA?Thqu7R7T(aI{jmIWk zYV*ww2BsO^d09qZvfY?BEwRlvI+&Sg)aOq&ZGkI#``6lo1qJRD#Km(&RED})vZUe3 z#_HuuYisqZ@%@6aLK$!9r`cWL7RIc?mp`cmLM;$#0i(O1)3gUJ>#@pg_FWt$*RW4b zTc(Ga#JAI-A%PbyZnk)`#rmr>9h$?Pg> z7s>{kabU*y_$csHzd7*%6teLihigtd5^%4{sN5sr9^vN^CgX@fI-$o-DvixRuMkt4JS@r?DX z12>c94etz=-hr~*eqwOhXD!P&iFVZAkV+iqthHL~vG`GowM}Ea_1Uz@PA(MLdT4oj1_$?I9;FBYDcie=4VU_U2C{T_Frq9r2^;_zSh`JfzqjoNT=5L zh=JD{T6c6G`gqAMpktQ4))+zDLAVHgT-Dba2?TFXbmY+28d^~z5XDTIu{X~fK26Vb O?3?t~wZCk|w*LY&jN9q} diff --git a/test/DebugInfo/PDB/pdbdump-flags.test b/test/DebugInfo/PDB/pdbdump-flags.test index d8d38cb705e..badbf0784b5 100644 --- a/test/DebugInfo/PDB/pdbdump-flags.test +++ b/test/DebugInfo/PDB/pdbdump-flags.test @@ -1,32 +1,40 @@ ; RUN: llvm-pdbdump %p/Inputs/empty.pdb | FileCheck %s -check-prefix=NO_ARGS ; RUN: llvm-pdbdump -types %p/Inputs/empty.pdb | FileCheck %s -check-prefix=TYPES ; RUN: llvm-pdbdump -compilands %p/Inputs/empty.pdb | FileCheck %s -check-prefix=COMPILANDS -; RUN: llvm-pdbdump -types -compilands %p/Inputs/empty.pdb | FileCheck %s -check-prefix=BOTH +; RUN: llvm-pdbdump -types -compilands %p/Inputs/empty.pdb | FileCheck %s -check-prefix=MULTIPLE ; Check that neither symbols nor compilands are dumped when neither argument specified. ; NO_ARGS: empty.pdb ; NO_ARGS: Guid: {0B355641-86A0-A249-896F-9988FAE52FF0} ; NO_ARGS: Attributes: HasPrivateSymbols -; NO_ARGS-NOT: Dumping compilands -; NO_ARGS-NOT: Dumping symbols +; NO_ARGS-NOT: ---TYPES--- +; NO_ARGS-NOT: ---COMPILANDS--- +; NO_ARGS-NOT: ---GLOBALS--- +; NO_ARGS-NOT: ---SYMBOLS--- -; Check that only symbols are dumped when only -types is specified. +; Check that only types are dumped when only -types is specified. ; TYPES: empty.pdb ; TYPES: Guid: {0B355641-86A0-A249-896F-9988FAE52FF0} ; TYPES: Attributes: HasPrivateSymbols -; TYPES: Dumping types -; TYPES-NOT: Dumping compilands +; TYPES: ---TYPES--- +; TYPES-NOT: ---COMPILANDS--- +; TYPES-NOT: ---GLOBALS--- +; TYPES-NOT: ---SYMBOLS--- ; Check that only compilands are dumped when only -compilands is specified. ; COMPILANDS: empty.pdb ; COMPILANDS: Guid: {0B355641-86A0-A249-896F-9988FAE52FF0} ; COMPILANDS: Attributes: HasPrivateSymbols -; COMPILANDS-NOT: Dumping types -; COMPILANDS: Dumping compilands +; COMPILANDS: ---COMPILANDS--- +; COMPILANDS-NOT: ---TYPES--- +; COMPILANDS-NOT: ---GLOBALS--- +; COMPILANDS-NOT: ---SYMBOLS--- ; Check that types and compilands are dumped when both arguments are specified. -; BOTH: empty.pdb -; BOTH: Guid: {0B355641-86A0-A249-896F-9988FAE52FF0} -; BOTH: Attributes: HasPrivateSymbols -; BOTH: Dumping types -; BOTH: Dumping compilands +; MULTIPLE: empty.pdb +; MULTIPLE: Guid: {0B355641-86A0-A249-896F-9988FAE52FF0} +; MULTIPLE: Attributes: HasPrivateSymbols +; MULTIPLE: ---COMPILANDS--- +; MULTIPLE: ---TYPES--- +; MULTIPLE-NOT: ---GLOBALS--- +; MULTIPLE-NOT: ---SYMBOLS--- diff --git a/test/DebugInfo/PDB/pdbdump-symbol-format.test b/test/DebugInfo/PDB/pdbdump-symbol-format.test index 5ed65642b7f..a34d46d8db6 100644 --- a/test/DebugInfo/PDB/pdbdump-symbol-format.test +++ b/test/DebugInfo/PDB/pdbdump-symbol-format.test @@ -1,8 +1,10 @@ ; RUN: llvm-pdbdump -symbols %p/Inputs/symbolformat.pdb | FileCheck --check-prefix=SYM_FORMAT %s ; RUN: llvm-pdbdump -types %p/Inputs/symbolformat.pdb | FileCheck --check-prefix=TYPES_FORMAT %s ; RUN: llvm-pdbdump -types -class-definitions %p/Inputs/symbolformat.pdb | FileCheck --check-prefix=FULL_CLASS %s +; RUN: llvm-pdbdump -globals %p/Inputs/symbolformat.pdb | FileCheck --check-prefix=GLOBALS %s ; The format is func [0x+ - 0x-] +; SYM_FORMAT: ---SYMBOLS--- ; SYM_FORMAT: symbolformat-fpo.obj ; SYM_FORMAT-DAG: func [{{.*}}] (FPO) unsigned __cdecl fpo_func(unsigned n) ; SYM_FORMAT: symbolformat.obj @@ -15,20 +17,10 @@ ; SYM_FORMAT-DAG: func [{{.*}}] (EBP) void A::RegularFunc() ; SYM_FORMAT-DAG: func [{{.*}}] (EBP) virtual void A::VirtualFunc() +; TYPES_FORMAT: ---TYPES--- ; TYPES_FORMAT: Enums ; TYPES_FORMAT-DAG: enum TestEnum ; TYPES_FORMAT-DAG: enum TestEnumClass -; TYPES_FORMAT: Function Signatures -; TYPES_FORMAT-DAG: int __cdecl () -; TYPES_FORMAT-DAG: int __cdecl (int, char**) -; TYPES_FORMAT-DAG: void (A::)() -; TYPES_FORMAT-DAG: void (B::)() -; TYPES_FORMAT-DAG: void (B::)(B&) -; TYPES_FORMAT-DAG: void (B::)() -; TYPES_FORMAT-DAG: B& (B::)(B&) -; TYPES_FORMAT-DAG: void (A::)(A&) -; TYPES_FORMAT-DAG: void (A::)() -; TYPES_FORMAT-DAG: A& (A::)(A&) ; TYPES_FORMAT: Typedefs ; TYPES_FORMAT-DAG: typedef int IntType ; TYPES_FORMAT-DAG: typedef class A ClassAType @@ -36,6 +28,7 @@ ; TYPES_FORMAT-DAG: class A ; TYPES_FORMAT-DAG: class B +; FULL_CLASS: ---TYPES--- ; FULL_CLASS: Classes ; FULL_CLASS-DAG: class A { ; FULL_CLASS: public: @@ -58,4 +51,9 @@ ; FULL_CLASS: data +0x30 float m_float ; FULL_CLASS: data +0x38 double m_double ; FULL_CLASS: data +0x40 void (__cdecl *m_pfn_2_args)(int, double) -; FULL_CLASS: } \ No newline at end of file +; FULL_CLASS: } + +; GLOBALS: ---GLOBALS--- +; GLOBALS-DAG: func [{{.*}}] (FPO) unsigned __cdecl fpo_func(unsigned n) +; GLOBALS-DAG: data [{{.*}}] static void* g_global_pointer +; GLOBALS-DAG: data [{{.*}}] static int g_global_int diff --git a/tools/llvm-pdbdump/TypeDumper.cpp b/tools/llvm-pdbdump/TypeDumper.cpp index 7b705961441..d0df9fec7ba 100644 --- a/tools/llvm-pdbdump/TypeDumper.cpp +++ b/tools/llvm-pdbdump/TypeDumper.cpp @@ -10,14 +10,12 @@ #include "TypeDumper.h" #include "ClassDefinitionDumper.h" -#include "FunctionDumper.h" #include "llvm-pdbdump.h" #include "TypedefDumper.h" #include "llvm/DebugInfo/PDB/IPDBSession.h" #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h" -#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h" #include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h" @@ -32,12 +30,6 @@ void TypeDumper::start(const PDBSymbolExe &Exe, raw_ostream &OS, int Indent) { while (auto Enum = Enums->getNext()) Enum->dump(OS, Indent + 2, *this); - auto FuncSigs = Exe.findAllChildren(); - OS << newline(Indent); - OS << "Function Signatures: (" << FuncSigs->getChildCount() << " items)"; - while (auto Sig = FuncSigs->getNext()) - Sig->dump(OS, Indent + 2, *this); - auto Typedefs = Exe.findAllChildren(); OS << newline(Indent) << "Typedefs: (" << Typedefs->getChildCount() << " items)"; @@ -62,15 +54,6 @@ void TypeDumper::dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS, OS << "enum " << Symbol.getName(); } -void TypeDumper::dump(const PDBSymbolTypeFunctionSig &Symbol, raw_ostream &OS, - int Indent) { - if (!InlineDump) - OS << newline(Indent); - - FunctionDumper Dumper; - Dumper.start(Symbol, nullptr, FunctionDumper::PointerType::None, OS); -} - void TypeDumper::dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS, int Indent) { if (!InlineDump) diff --git a/tools/llvm-pdbdump/TypeDumper.h b/tools/llvm-pdbdump/TypeDumper.h index d96c24c87fa..93e492429ff 100644 --- a/tools/llvm-pdbdump/TypeDumper.h +++ b/tools/llvm-pdbdump/TypeDumper.h @@ -22,8 +22,6 @@ public: void dump(const PDBSymbolTypeEnum &Symbol, raw_ostream &OS, int Indent) override; - void dump(const PDBSymbolTypeFunctionSig &Symbol, raw_ostream &OS, - int Indent) override; void dump(const PDBSymbolTypeTypedef &Symbol, raw_ostream &OS, int Indent) override; void dump(const PDBSymbolTypeUDT &Symbol, raw_ostream &OS, diff --git a/tools/llvm-pdbdump/llvm-pdbdump.cpp b/tools/llvm-pdbdump/llvm-pdbdump.cpp index e33e71562d3..e8a105d35d2 100644 --- a/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -15,7 +15,9 @@ #include "llvm-pdbdump.h" #include "CompilandDumper.h" +#include "FunctionDumper.h" #include "TypeDumper.h" +#include "VariableDumper.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringExtras.h" @@ -25,7 +27,10 @@ #include "llvm/DebugInfo/PDB/IPDBSession.h" #include "llvm/DebugInfo/PDB/PDB.h" #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" +#include "llvm/DebugInfo/PDB/PDBSymbolData.h" #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" +#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h" +#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/FileSystem.h" @@ -50,12 +55,13 @@ cl::list InputFilenames(cl::Positional, cl::desc(""), cl::OneOrMore); -cl::opt DumpCompilands("compilands", cl::desc("Display compilands")); -cl::opt DumpSymbols("symbols", - cl::desc("Display symbols (implies --compilands")); -cl::opt DumpTypes("types", cl::desc("Display types")); -cl::opt DumpClassDefs("class-definitions", - cl::desc("Display full class definitions")); +cl::opt Compilands("compilands", cl::desc("Display compilands")); +cl::opt Symbols("symbols", + cl::desc("Display symbols for each compiland")); +cl::opt Globals("globals", cl::desc("Dump global symbols")); +cl::opt Types("types", cl::desc("Display types")); +cl::opt ClassDefs("class-definitions", + cl::desc("Display full class definitions")); } static void dumpInput(StringRef Path) { @@ -85,18 +91,48 @@ static void dumpInput(StringRef Path) { if (GlobalScope->hasPrivateSymbols()) outs() << "HasPrivateSymbols "; - if (opts::DumpTypes) { - outs() << "\nDumping types"; - TypeDumper Dumper(false, opts::DumpClassDefs); + if (opts::Compilands) { + outs() << "\n---COMPILANDS---"; + auto Compilands = GlobalScope->findAllChildren(); + CompilandDumper Dumper; + while (auto Compiland = Compilands->getNext()) + Dumper.start(*Compiland, outs(), 2, false); + } + + if (opts::Types) { + outs() << "\n---TYPES---"; + TypeDumper Dumper(false, opts::ClassDefs); Dumper.start(*GlobalScope, outs(), 2); } - if (opts::DumpSymbols || opts::DumpCompilands) { - outs() << "\nDumping compilands"; + if (opts::Symbols) { + outs() << "\n---SYMBOLS---"; auto Compilands = GlobalScope->findAllChildren(); CompilandDumper Dumper; while (auto Compiland = Compilands->getNext()) - Dumper.start(*Compiland, outs(), 2, opts::DumpSymbols); + Dumper.start(*Compiland, outs(), 2, true); + } + + if (opts::Globals) { + outs() << "\n---GLOBALS---"; + { + FunctionDumper Dumper; + auto Functions = GlobalScope->findAllChildren(); + while (auto Function = Functions->getNext()) + Dumper.start(*Function, FunctionDumper::PointerType::None, outs(), 2); + } + { + auto Vars = GlobalScope->findAllChildren(); + VariableDumper Dumper; + while (auto Var = Vars->getNext()) + Dumper.start(*Var, outs(), 2); + } + { + auto Thunks = GlobalScope->findAllChildren(); + CompilandDumper Dumper; + while (auto Thunk = Thunks->getNext()) + Dumper.dump(*Thunk, outs(), 2); + } } outs().flush(); } -- 2.34.1