aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHemant Kulkarni <khemant@codeaurora.org>2015-11-11 20:41:43 +0000
committerHemant Kulkarni <khemant@codeaurora.org>2015-11-11 20:41:43 +0000
commita07496f56ab22b54a0575bb54461db785dfc3049 (patch)
tree365a1a0eda994b61cd6998e856f67be4c90d1c79
parentf805775e099a8ed0fb6f5f5dfd6c4504f7187fcf (diff)
downloadllvm-a07496f56ab22b54a0575bb54461db785dfc3049.tar.gz
[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
-rw-r--r--docs/CommandGuide/llvm-symbolizer.rst12
-rw-r--r--include/llvm/DebugInfo/Symbolize/DIPrinter.h8
-rw-r--r--lib/DebugInfo/Symbolize/DIPrinter.cpp20
-rwxr-xr-xtest/tools/llvm-symbolizer/Inputs/addr.exebin9749 -> 10109 bytes
-rw-r--r--test/tools/llvm-symbolizer/sym.test17
-rw-r--r--tools/llvm-symbolizer/llvm-symbolizer.cpp11
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[] = "<invalid>";
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 0d9e87dd723..38d88b65741 100755
--- a/test/tools/llvm-symbolizer/Inputs/addr.exe
+++ b/test/tools/llvm-symbolizer/Inputs/addr.exe
Binary files differ
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 <stdio.h>
-#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<bool>
ClPrintAddress("print-address", cl::init(false),
cl::desc("Show address before line information"));
+static cl::opt<bool>
+ 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);