From e8d28f3d7a73297b28bc60fe81ab38d116f3dc6c Mon Sep 17 00:00:00 2001
From: Hemant Kulkarni <khemant@codeaurora.org>
Date: Mon, 12 Oct 2015 19:26:44 +0000
Subject: [PATCH] [llvm-symbolizer] Add -print-address option

Differential Revision: http://reviews.llvm.org/D13518


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250086 91177308-0d34-0410-b5e6-96231b3b80d8
---
 docs/CommandGuide/llvm-symbolizer.rst      |   2 ++
 test/tools/llvm-symbolizer/Inputs/addr.exe | Bin 0 -> 9749 bytes
 test/tools/llvm-symbolizer/Inputs/addr.inp |   1 +
 test/tools/llvm-symbolizer/sym.test        |  19 +++++++++++++++++++
 tools/llvm-symbolizer/llvm-symbolizer.cpp  |   8 ++++++++
 5 files changed, 30 insertions(+)
 create mode 100755 test/tools/llvm-symbolizer/Inputs/addr.exe
 create mode 100644 test/tools/llvm-symbolizer/Inputs/addr.inp
 create mode 100644 test/tools/llvm-symbolizer/sym.test

diff --git a/docs/CommandGuide/llvm-symbolizer.rst b/docs/CommandGuide/llvm-symbolizer.rst
index 96720e633f2..9d6571d5c4c 100644
--- a/docs/CommandGuide/llvm-symbolizer.rst
+++ b/docs/CommandGuide/llvm-symbolizer.rst
@@ -98,6 +98,8 @@ OPTIONS
  location, look for the debug info at the .dSYM path provided via the
  ``-dsym-hint`` flag. This flag can be used multiple times.
 
+.. option:: -print-address
+ Print address before the source code location. Defaults to false.
 
 EXIT STATUS
 -----------
diff --git a/test/tools/llvm-symbolizer/Inputs/addr.exe b/test/tools/llvm-symbolizer/Inputs/addr.exe
new file mode 100755
index 0000000000000000000000000000000000000000..0d9e87dd7232196dac17fe42d9135f0b6b1d19bb
GIT binary patch
literal 9749
zcmeHNZERat89w(qPMoH5+@$N0wp+c;VePcsCT$k7RcmjWrnM*cV_gCat-EnzH!(PN
zWM8+*7+X+RG^_h45<(MbQpK<G1Bo99RS0eFidK;JqvHom3`CgNNcSOvRz@_oh37r@
zyvg;o!$62%^ho!-=Y7umob#TKd(OGXequ1bU)MCjK^MCPX<c=ugq&E2E3HyhSf6MV
zrsxp2iFzP@Jf_Sc>7-aLs-js2l${T<4o{!%0DZbC6D&77uwcm^lBD`pf~k^@yhaWo
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
b8r^|RqENulS{9nbT}f@_v94&T>^<>Mg4DJ(

literal 0
HcmV?d00001

diff --git a/test/tools/llvm-symbolizer/Inputs/addr.inp b/test/tools/llvm-symbolizer/Inputs/addr.inp
new file mode 100644
index 00000000000..4de096479da
--- /dev/null
+++ b/test/tools/llvm-symbolizer/Inputs/addr.inp
@@ -0,0 +1 @@
+0x40054d
diff --git a/test/tools/llvm-symbolizer/sym.test b/test/tools/llvm-symbolizer/sym.test
new file mode 100644
index 00000000000..559124a44c0
--- /dev/null
+++ b/test/tools/llvm-symbolizer/sym.test
@@ -0,0 +1,19 @@
+#Source:
+##include <stdio.h>
+#static inline int inc (int *a) {
+#  printf ("%d\n",(*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
+
+#CHECK: 0x40054d
+#CHECK: main
+#CHECK: {{[/\]+}}tmp{{[/\]+}}x.c:9:0
+
diff --git a/tools/llvm-symbolizer/llvm-symbolizer.cpp b/tools/llvm-symbolizer/llvm-symbolizer.cpp
index 9c9f3adbf60..b4485339b0d 100644
--- a/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -73,6 +73,9 @@ static cl::list<std::string>
 ClDsymHint("dsym-hint", cl::ZeroOrMore,
            cl::desc("Path to .dSYM bundles to search for debug info for the "
                     "object files"));
+static cl::opt<bool>
+    ClPrintAddress("print-address", cl::init(false),
+                   cl::desc("Show address before line information"));
 
 static bool parseCommand(bool &IsData, std::string &ModuleName,
                          uint64_t &ModuleOffset) {
@@ -152,6 +155,11 @@ int main(int argc, char **argv) {
     std::string Result =
         IsData ? Symbolizer.symbolizeData(ModuleName, ModuleOffset)
                : Symbolizer.symbolizeCode(ModuleName, ModuleOffset);
+    if (ClPrintAddress) {
+      outs() << "0x";
+      outs().write_hex(ModuleOffset);
+      outs() << "\n";
+    }
     outs() << Result << "\n";
     outs().flush();
   }
-- 
2.40.0