]> granicus.if.org Git - llvm/commitdiff
[llvm-symbolizer] Add support for --basenames/-s
authorJames Henderson <jh7370@my.bristol.ac.uk>
Tue, 22 Jan 2019 10:24:32 +0000 (10:24 +0000)
committerJames Henderson <jh7370@my.bristol.ac.uk>
Tue, 22 Jan 2019 10:24:32 +0000 (10:24 +0000)
This fixes https://bugs.llvm.org/show_bug.cgi?id=40068.

--basenames is a GNU addr2line switch which strips the directory names
from the file path in the output.

Reviewed by: ruiu

Differential Revision: https://reviews.llvm.org/D56919

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351795 91177308-0d34-0410-b5e6-96231b3b80d8

docs/CommandGuide/llvm-symbolizer.rst
include/llvm/DebugInfo/Symbolize/DIPrinter.h
lib/DebugInfo/Symbolize/DIPrinter.cpp
test/tools/llvm-symbolizer/basenames.s [new file with mode: 0644]
tools/llvm-symbolizer/llvm-symbolizer.cpp

index 56999207e200406b57d34e809a98c5c57b9efe5d..bfe8f3ee6bb4d8aba9f447b81d8ee2d5dc16cb11 100644 (file)
@@ -119,6 +119,10 @@ OPTIONS
  Print human readable output. If ``-inlining`` is specified, enclosing scope is
  prefixed by (inlined by). Refer to listed examples.
 
+.. option:: -basenames, -s
+
+ Strip directories when printing the file path.
+
 EXIT STATUS
 -----------
 
index 1a9b84fccb11f2100fa2de7736a898ea084f1071..71663f30a59ff6314e277f9537ed9dfd4b3fd03a 100644 (file)
@@ -29,6 +29,7 @@ class DIPrinter {
   bool PrintPretty;
   int PrintSourceContext;
   bool Verbose;
+  bool Basenames;
 
   void print(const DILineInfo &Info, bool Inlined);
   void printContext(const std::string &FileName, int64_t Line);
@@ -36,10 +37,10 @@ class DIPrinter {
 public:
   DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true,
             bool PrintPretty = false, int PrintSourceContext = 0,
-            bool Verbose = false)
+            bool Verbose = false, bool Basenames = false)
       : OS(OS), PrintFunctionNames(PrintFunctionNames),
         PrintPretty(PrintPretty), PrintSourceContext(PrintSourceContext),
-        Verbose(Verbose) {}
+        Verbose(Verbose), Basenames(Basenames) {}
 
   DIPrinter &operator<<(const DILineInfo &Info);
   DIPrinter &operator<<(const DIInliningInfo &Info);
index 89a537c7f38b5a7b7ffbf5bb408cf47579480ac6..18fe9bc610b765561f21a55a0874c47a7f51b474 100644 (file)
@@ -18,6 +18,7 @@
 #include "llvm/Support/Format.h"
 #include "llvm/Support/LineIterator.h"
 #include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
 #include "llvm/Support/raw_ostream.h"
 #include <algorithm>
 #include <cmath>
@@ -77,6 +78,8 @@ void DIPrinter::print(const DILineInfo &Info, bool Inlined) {
   std::string Filename = Info.FileName;
   if (Filename == kDILineInfoBadString)
     Filename = kBadString;
+  else if (Basenames)
+    Filename = llvm::sys::path::filename(Filename);
   if (!Verbose) {
     OS << Filename << ":" << Info.Line << ":" << Info.Column << "\n";
     printContext(Filename, Info.Line);
diff --git a/test/tools/llvm-symbolizer/basenames.s b/test/tools/llvm-symbolizer/basenames.s
new file mode 100644 (file)
index 0000000..b95817c
--- /dev/null
@@ -0,0 +1,12 @@
+# REQUIRES: x86-registered-target
+
+foo:
+    nop
+
+# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t.o -g
+# RUN: llvm-symbolizer 0 --basenames --obj=%t.o | FileCheck %s
+# RUN: llvm-symbolizer 0 -s --obj=%t.o | FileCheck %s
+# RUN: llvm-symbolizer 0 --obj=%t.o | FileCheck %s -DDIR=%p --check-prefix=DEFAULT
+
+# CHECK: {{^}}basenames.s:4
+# DEFAULT: [[DIR]]{{\\|/}}basenames.s:4
index 5986e5bbdcf33565415113ba8146c78dd0fbabf6..7414a9db284cde234c1de967881d57a6cc33b633 100644 (file)
@@ -54,6 +54,12 @@ static cl::opt<bool>
     ClPrintInlining("inlining", cl::init(true),
                     cl::desc("Print all inlined frames for a given address"));
 
+// -basenames, -s
+static cl::opt<bool> ClBasenames("basenames", cl::init(false),
+                                 cl::desc("Strip directory names from paths"));
+static cl::alias ClBasenamesShort("s", cl::desc("Alias for -basenames"),
+                                  cl::NotHidden, cl::aliasopt(ClBasenames));
+
 // -demangle, -C, -no-demangle
 static cl::opt<bool>
 ClDemangle("demangle", cl::init(true), cl::desc("Demangle function names"));
@@ -223,7 +229,8 @@ int main(int argc, char **argv) {
   LLVMSymbolizer Symbolizer(Opts);
 
   DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None,
-                    ClPrettyPrint, ClPrintSourceContextLines, ClVerbose);
+                    ClPrettyPrint, ClPrintSourceContextLines, ClVerbose,
+                    ClBasenames);
 
   if (ClInputAddresses.empty()) {
     const int kMaxInputStringLength = 1024;