From: James Henderson Date: Tue, 22 Jan 2019 10:24:32 +0000 (+0000) Subject: [llvm-symbolizer] Add support for --basenames/-s X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=24470819e8753ee7c63e57bb433fb8a06665cf0a;p=llvm [llvm-symbolizer] Add support for --basenames/-s 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 --- diff --git a/docs/CommandGuide/llvm-symbolizer.rst b/docs/CommandGuide/llvm-symbolizer.rst index 56999207e20..bfe8f3ee6bb 100644 --- a/docs/CommandGuide/llvm-symbolizer.rst +++ b/docs/CommandGuide/llvm-symbolizer.rst @@ -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 ----------- diff --git a/include/llvm/DebugInfo/Symbolize/DIPrinter.h b/include/llvm/DebugInfo/Symbolize/DIPrinter.h index 1a9b84fccb1..71663f30a59 100644 --- a/include/llvm/DebugInfo/Symbolize/DIPrinter.h +++ b/include/llvm/DebugInfo/Symbolize/DIPrinter.h @@ -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); diff --git a/lib/DebugInfo/Symbolize/DIPrinter.cpp b/lib/DebugInfo/Symbolize/DIPrinter.cpp index 89a537c7f38..18fe9bc610b 100644 --- a/lib/DebugInfo/Symbolize/DIPrinter.cpp +++ b/lib/DebugInfo/Symbolize/DIPrinter.cpp @@ -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 #include @@ -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 index 00000000000..b95817c6522 --- /dev/null +++ b/test/tools/llvm-symbolizer/basenames.s @@ -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 diff --git a/tools/llvm-symbolizer/llvm-symbolizer.cpp b/tools/llvm-symbolizer/llvm-symbolizer.cpp index 5986e5bbdcf..7414a9db284 100644 --- a/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -54,6 +54,12 @@ static cl::opt ClPrintInlining("inlining", cl::init(true), cl::desc("Print all inlined frames for a given address")); +// -basenames, -s +static cl::opt 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 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;