forked from OSchip/llvm-project
[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 llvm-svn: 351795
This commit is contained in:
parent
ca45087826
commit
33c16a3f16
|
@ -119,6 +119,10 @@ OPTIONS
|
||||||
Print human readable output. If ``-inlining`` is specified, enclosing scope is
|
Print human readable output. If ``-inlining`` is specified, enclosing scope is
|
||||||
prefixed by (inlined by). Refer to listed examples.
|
prefixed by (inlined by). Refer to listed examples.
|
||||||
|
|
||||||
|
.. option:: -basenames, -s
|
||||||
|
|
||||||
|
Strip directories when printing the file path.
|
||||||
|
|
||||||
EXIT STATUS
|
EXIT STATUS
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ class DIPrinter {
|
||||||
bool PrintPretty;
|
bool PrintPretty;
|
||||||
int PrintSourceContext;
|
int PrintSourceContext;
|
||||||
bool Verbose;
|
bool Verbose;
|
||||||
|
bool Basenames;
|
||||||
|
|
||||||
void print(const DILineInfo &Info, bool Inlined);
|
void print(const DILineInfo &Info, bool Inlined);
|
||||||
void printContext(const std::string &FileName, int64_t Line);
|
void printContext(const std::string &FileName, int64_t Line);
|
||||||
|
@ -36,10 +37,10 @@ class DIPrinter {
|
||||||
public:
|
public:
|
||||||
DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true,
|
DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true,
|
||||||
bool PrintPretty = false, int PrintSourceContext = 0,
|
bool PrintPretty = false, int PrintSourceContext = 0,
|
||||||
bool Verbose = false)
|
bool Verbose = false, bool Basenames = false)
|
||||||
: OS(OS), PrintFunctionNames(PrintFunctionNames),
|
: OS(OS), PrintFunctionNames(PrintFunctionNames),
|
||||||
PrintPretty(PrintPretty), PrintSourceContext(PrintSourceContext),
|
PrintPretty(PrintPretty), PrintSourceContext(PrintSourceContext),
|
||||||
Verbose(Verbose) {}
|
Verbose(Verbose), Basenames(Basenames) {}
|
||||||
|
|
||||||
DIPrinter &operator<<(const DILineInfo &Info);
|
DIPrinter &operator<<(const DILineInfo &Info);
|
||||||
DIPrinter &operator<<(const DIInliningInfo &Info);
|
DIPrinter &operator<<(const DIInliningInfo &Info);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "llvm/Support/Format.h"
|
#include "llvm/Support/Format.h"
|
||||||
#include "llvm/Support/LineIterator.h"
|
#include "llvm/Support/LineIterator.h"
|
||||||
#include "llvm/Support/MemoryBuffer.h"
|
#include "llvm/Support/MemoryBuffer.h"
|
||||||
|
#include "llvm/Support/Path.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
@ -77,6 +78,8 @@ void DIPrinter::print(const DILineInfo &Info, bool Inlined) {
|
||||||
std::string Filename = Info.FileName;
|
std::string Filename = Info.FileName;
|
||||||
if (Filename == kDILineInfoBadString)
|
if (Filename == kDILineInfoBadString)
|
||||||
Filename = kBadString;
|
Filename = kBadString;
|
||||||
|
else if (Basenames)
|
||||||
|
Filename = llvm::sys::path::filename(Filename);
|
||||||
if (!Verbose) {
|
if (!Verbose) {
|
||||||
OS << Filename << ":" << Info.Line << ":" << Info.Column << "\n";
|
OS << Filename << ":" << Info.Line << ":" << Info.Column << "\n";
|
||||||
printContext(Filename, Info.Line);
|
printContext(Filename, Info.Line);
|
||||||
|
|
|
@ -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
|
|
@ -54,6 +54,12 @@ static cl::opt<bool>
|
||||||
ClPrintInlining("inlining", cl::init(true),
|
ClPrintInlining("inlining", cl::init(true),
|
||||||
cl::desc("Print all inlined frames for a given address"));
|
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
|
// -demangle, -C, -no-demangle
|
||||||
static cl::opt<bool>
|
static cl::opt<bool>
|
||||||
ClDemangle("demangle", cl::init(true), cl::desc("Demangle function names"));
|
ClDemangle("demangle", cl::init(true), cl::desc("Demangle function names"));
|
||||||
|
@ -223,7 +229,8 @@ int main(int argc, char **argv) {
|
||||||
LLVMSymbolizer Symbolizer(Opts);
|
LLVMSymbolizer Symbolizer(Opts);
|
||||||
|
|
||||||
DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None,
|
DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None,
|
||||||
ClPrettyPrint, ClPrintSourceContextLines, ClVerbose);
|
ClPrettyPrint, ClPrintSourceContextLines, ClVerbose,
|
||||||
|
ClBasenames);
|
||||||
|
|
||||||
if (ClInputAddresses.empty()) {
|
if (ClInputAddresses.empty()) {
|
||||||
const int kMaxInputStringLength = 1024;
|
const int kMaxInputStringLength = 1024;
|
||||||
|
|
Loading…
Reference in New Issue