From a07496f56ab22b54a0575bb54461db785dfc3049 Mon Sep 17 00:00:00 2001 From: Hemant Kulkarni Date: Wed, 11 Nov 2015 20:41:43 +0000 Subject: [PATCH] [Symbolizer]: Add -pretty-print option Differential Revision: http://reviews.llvm.org/D13671 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252798 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/CommandGuide/llvm-symbolizer.rst | 12 +++++++++++ include/llvm/DebugInfo/Symbolize/DIPrinter.h | 8 ++++++-- lib/DebugInfo/Symbolize/DIPrinter.cpp | 20 +++++++++++++------ test/tools/llvm-symbolizer/Inputs/addr.exe | Bin 9749 -> 10109 bytes test/tools/llvm-symbolizer/sym.test | 17 +++++++++++++--- tools/llvm-symbolizer/llvm-symbolizer.cpp | 11 ++++++++-- 6 files changed, 55 insertions(+), 13 deletions(-) diff --git a/docs/CommandGuide/llvm-symbolizer.rst b/docs/CommandGuide/llvm-symbolizer.rst index 9d6571d5c4c..dfbf4919abe 100644 --- a/docs/CommandGuide/llvm-symbolizer.rst +++ b/docs/CommandGuide/llvm-symbolizer.rst @@ -56,6 +56,14 @@ EXAMPLE foo(int) /tmp/a.cc:12 + $cat addr.txt + 0x40054d + $llvm-symbolizer -inlining -print-address -pretty-print -obj=addr.exe < addr.txt + 0x40054d: inc at /tmp/x.c:3:3 + (inlined by) main at /tmp/x.c:9:0 + $llvm-symbolizer -inlining -pretty-print -obj=addr.exe < addr.txt + inc at /tmp/x.c:3:3 + (inlined by) main at /tmp/x.c:9:0 OPTIONS ------- @@ -101,6 +109,10 @@ OPTIONS .. option:: -print-address Print address before the source code location. Defaults to false. +.. option:: -pretty-print + Print human readable output. If ``-inlining`` is specified, enclosing scope is + prefixed by (inlined by). Refer to listed examples. + EXIT STATUS ----------- diff --git a/include/llvm/DebugInfo/Symbolize/DIPrinter.h b/include/llvm/DebugInfo/Symbolize/DIPrinter.h index 6e192253d5d..0703fb14da6 100644 --- a/include/llvm/DebugInfo/Symbolize/DIPrinter.h +++ b/include/llvm/DebugInfo/Symbolize/DIPrinter.h @@ -27,10 +27,14 @@ namespace symbolize { class DIPrinter { raw_ostream &OS; bool PrintFunctionNames; + bool PrintPretty; + void printName(const DILineInfo &Info, bool Inlined); public: - DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true) - : OS(OS), PrintFunctionNames(PrintFunctionNames) {} + DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true, + bool PrintPretty = false) + : OS(OS), PrintFunctionNames(PrintFunctionNames), + PrintPretty(PrintPretty) {} DIPrinter &operator<<(const DILineInfo &Info); DIPrinter &operator<<(const DIInliningInfo &Info); diff --git a/lib/DebugInfo/Symbolize/DIPrinter.cpp b/lib/DebugInfo/Symbolize/DIPrinter.cpp index ad5f693d77e..c6bfbc07dcf 100644 --- a/lib/DebugInfo/Symbolize/DIPrinter.cpp +++ b/lib/DebugInfo/Symbolize/DIPrinter.cpp @@ -24,27 +24,35 @@ namespace symbolize { static const char kDILineInfoBadString[] = ""; static const char kBadString[] = "??"; -DIPrinter &DIPrinter::operator<<(const DILineInfo &Info) { +void DIPrinter::printName(const DILineInfo &Info, bool Inlined) { if (PrintFunctionNames) { std::string FunctionName = Info.FunctionName; if (FunctionName == kDILineInfoBadString) FunctionName = kBadString; - OS << FunctionName << "\n"; + + StringRef Delimiter = (PrintPretty == true) ? " at " : "\n"; + StringRef Prefix = (PrintPretty && Inlined) ? " (inlined by) " : ""; + OS << Prefix << FunctionName << Delimiter; } std::string Filename = Info.FileName; if (Filename == kDILineInfoBadString) Filename = kBadString; OS << Filename << ":" << Info.Line << ":" << Info.Column << "\n"; +} + +DIPrinter &DIPrinter::operator<<(const DILineInfo &Info) { + printName(Info, false); return *this; } DIPrinter &DIPrinter::operator<<(const DIInliningInfo &Info) { uint32_t FramesNum = Info.getNumberOfFrames(); - if (FramesNum == 0) - return (*this << DILineInfo()); - for (uint32_t i = 0; i < FramesNum; i++) { - *this << Info.getFrame(i); + if (FramesNum == 0) { + printName(DILineInfo(), false); + return *this; } + for (uint32_t i = 0; i < FramesNum; i++) + printName(Info.getFrame(i), i > 0); return *this; } diff --git a/test/tools/llvm-symbolizer/Inputs/addr.exe b/test/tools/llvm-symbolizer/Inputs/addr.exe index 0d9e87dd7232196dac17fe42d9135f0b6b1d19bb..38d88b65741e9bc98b5b692fc7fe5f649839a2d5 100755 GIT binary patch delta 953 zcma)5%}*0i5TEz9yWPb?x}~^PHf^D)!9pO7k>Uq-)q_9?sR@ZmFHkXRiF^eTJZR)% zyeNT8Fy1&3Bk>FOLQE_Y6HU-Rz$h^sJfJsjdcZnwcZ(i8ILXeN-^_2`?7TN`p?9}$ zuF2R6!=6~s0UB6v2om$z`6{2^jrjcYpGtaMaZy~c93zg8*ynKQ=EH7o#@3hazMSld z^|zFoZ+x{M@MWfs%NBIKTc5!m-;XAfl1hy7(yzBmzslt`$H8646LPFdWar;tUQVb3 zY8-m+C3ARNZeh*%LLSz(cFW~1V#G12oM3ZUP_ptIrKRj8<%l1*t1TW->{QJpZ%YwP zYz(kLpFqXYp{eOHxJ>3qp*RYCu8%apTU-w&Z#g;b1Q|agv~=3ByGetula%a}MS!0r z#gxA|io;PXYF3EYh+Q}*bU?726YLeRT0m8lu5g=#yGEM=h(TTiMRFw=6+yptoR)UL zZheGv16OrZW;5?d+TYFlj0JEdS|q^vMIf3ji(Tfb9#}w9Rx5bY!4t^YNm}TSm jvtfXy7xRs?2P&QVoH|sA?k)s1FoP^{g{ACb;xYdX%4Dj| delta 689 zcmYLHO=uHQ5PtKL-MkH^Zjz?S!lsS+0jZK&)T}npJO#0pQt=?7Sen>FO)<5ip!Md- zgV;0-ErOTgO%X4PARa;z4_PZ zrBt3LgMyUjX9N=R3fJ|_j3F4!2>^OoqGz!5+~N{_vf-mw zBxjN{x&KHQm1Rw%IjjaN)C}NZ&}8QEVflG2Oop<)nBwvGum^ZIG-?Q2Pe{pe`Hb`l z4HY5m+xNrMfLp!eb|O;rz&gH&4f)%ynYMyoV>ykv7hw1&W@-QLanZ0e?)JF7XuPD5 zLNG0@p?8;)Dqb=zxQ>fvLE8>GwLCV3qA%oRR}tbCoeJUec!9aK+t`d-5k2lG8t!k9 z7U?+*^q-;|DSM=U6^tX7j?O_3(Fw!Nfruwabc93{xXkQq;vV2mT(v))NCMqcaVxn5 dMJ%PJ#Z9r5S^|bQ(otBza(WgFdo%r!{smk+koW)q diff --git a/test/tools/llvm-symbolizer/sym.test b/test/tools/llvm-symbolizer/sym.test index 559124a44c0..01a6692222e 100644 --- a/test/tools/llvm-symbolizer/sym.test +++ b/test/tools/llvm-symbolizer/sym.test @@ -1,19 +1,30 @@ #Source: ##include -#static inline int inc (int *a) { +#static inline int inctwo (int *a) { # printf ("%d\n",(*a)++); # return (*a)++; #} +#static inline int inc (int *a) { +# printf ("%d\n",inctwo(a)); +# return (*a)++; +#} +# # #int main () { # int x = 1; # return inc(&x); #} +# #Build as : clang -g -O2 addr.c -RUN: llvm-symbolizer -inlining -print-address -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck %s +RUN: llvm-symbolizer -print-address -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck %s +RUN: llvm-symbolizer -inlining -print-address -pretty-print -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck --check-prefix="PRETTY" %s #CHECK: 0x40054d #CHECK: main -#CHECK: {{[/\]+}}tmp{{[/\]+}}x.c:9:0 +#CHECK: {{[/\]+}}tmp{{[/\]+}}x.c:14:0 +# +#PRETTY: {{[0x]+}}40054d: inctwo at {{[/\]+}}tmp{{[/\]+}}x.c:3:3 +#PRETTY: (inlined by) inc at {{[/\]+}}tmp{{[/\]+}}x.c:7:0 +#PRETTY (inlined by) main at {{[/\]+}}tmp{{[/\]+}}x.c:14:0 diff --git a/tools/llvm-symbolizer/llvm-symbolizer.cpp b/tools/llvm-symbolizer/llvm-symbolizer.cpp index d0ef51e6f17..e45660c84c7 100644 --- a/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -78,6 +78,10 @@ static cl::opt ClPrintAddress("print-address", cl::init(false), cl::desc("Show address before line information")); +static cl::opt + ClPrettyPrint("pretty-print", cl::init(false), + cl::desc("Make the output more human friendly")); + static bool error(std::error_code ec) { if (!ec) return false; @@ -143,6 +147,7 @@ int main(int argc, char **argv) { cl::ParseCommandLineOptions(argc, argv, "llvm-symbolizer\n"); LLVMSymbolizer::Options Opts(ClPrintFunctions, ClUseSymbolTable, ClDemangle, ClUseRelativeAddress, ClDefaultArch); + for (const auto &hint : ClDsymHint) { if (sys::path::extension(hint) == ".dSYM") { Opts.DsymHints.push_back(hint); @@ -156,13 +161,15 @@ int main(int argc, char **argv) { bool IsData = false; std::string ModuleName; uint64_t ModuleOffset; - DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None); + DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None, + ClPrettyPrint); while (parseCommand(IsData, ModuleName, ModuleOffset)) { if (ClPrintAddress) { outs() << "0x"; outs().write_hex(ModuleOffset); - outs() << "\n"; + StringRef Delimiter = (ClPrettyPrint == true) ? ": " : "\n"; + outs() << Delimiter; } if (IsData) { auto ResOrErr = Symbolizer.symbolizeData(ModuleName, ModuleOffset); -- 2.34.1