[llvm-symbolizer] Add `--output-style` switch.

In general, llvm-symbolizer follows the output style of GNU's addr2line.
However, there are still some differences; in particular, for a requested
address, llvm-symbolizer prints line and column, while addr2line prints
only the line number.

This patch adds a new switch to select the preferred style.

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

llvm-svn: 357675
This commit is contained in:
Igor Kudrin 2019-04-04 08:39:40 +00:00
parent 8911c5be46
commit 0fed7b0564
4 changed files with 32 additions and 4 deletions

View File

@ -24,12 +24,17 @@ struct DIGlobal;
namespace symbolize {
class DIPrinter {
public:
enum class OutputStyle { LLVM, GNU };
private:
raw_ostream &OS;
bool PrintFunctionNames;
bool PrintPretty;
int PrintSourceContext;
bool Verbose;
bool Basenames;
OutputStyle Style;
void print(const DILineInfo &Info, bool Inlined);
void printContext(const std::string &FileName, int64_t Line);
@ -37,10 +42,11 @@ class DIPrinter {
public:
DIPrinter(raw_ostream &OS, bool PrintFunctionNames = true,
bool PrintPretty = false, int PrintSourceContext = 0,
bool Verbose = false, bool Basenames = false)
bool Verbose = false, bool Basenames = false,
OutputStyle Style = OutputStyle::LLVM)
: OS(OS), PrintFunctionNames(PrintFunctionNames),
PrintPretty(PrintPretty), PrintSourceContext(PrintSourceContext),
Verbose(Verbose), Basenames(Basenames) {}
Verbose(Verbose), Basenames(Basenames), Style(Style) {}
DIPrinter &operator<<(const DILineInfo &Info);
DIPrinter &operator<<(const DIInliningInfo &Info);

View File

@ -81,7 +81,10 @@ void DIPrinter::print(const DILineInfo &Info, bool Inlined) {
else if (Basenames)
Filename = llvm::sys::path::filename(Filename);
if (!Verbose) {
OS << Filename << ":" << Info.Line << ":" << Info.Column << "\n";
OS << Filename << ":" << Info.Line;
if (Style == OutputStyle::LLVM)
OS << ":" << Info.Column;
OS << "\n";
printContext(Filename, Info.Line);
return;
}

View File

@ -0,0 +1,11 @@
RUN: llvm-symbolizer -e %p/Inputs/addr.exe 0x40054d \
RUN: | FileCheck %s --check-prefix=LLVM
RUN: llvm-symbolizer --output-style=GNU -e %p/Inputs/addr.exe 0x40054d \
RUN: | FileCheck %s --check-prefix=GNU
RUN: llvm-symbolizer --output-style=LLVM -e %p/Inputs/addr.exe 0x40054d \
RUN: | FileCheck %s --check-prefix=LLVM
LLVM: {{^}}/tmp{{\\|/}}x.c:3:3{{$}}
GNU: {{^}}/tmp{{\\|/}}x.c:3{{$}}

View File

@ -147,6 +147,14 @@ static cl::opt<std::string>
ClFallbackDebugPath("fallback-debug-path", cl::init(""),
cl::desc("Fallback path for debug binaries."));
static cl::opt<DIPrinter::OutputStyle>
ClOutputStyle("output-style", cl::init(DIPrinter::OutputStyle::LLVM),
cl::desc("Specify print style"), cl::Hidden,
cl::values(clEnumValN(DIPrinter::OutputStyle::LLVM, "LLVM",
"LLVM default style"),
clEnumValN(DIPrinter::OutputStyle::GNU, "GNU",
"GNU addr2line style")));
template<typename T>
static bool error(Expected<T> &ResOrErr) {
if (ResOrErr)
@ -256,7 +264,7 @@ int main(int argc, char **argv) {
DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None,
ClPrettyPrint, ClPrintSourceContextLines, ClVerbose,
ClBasenames);
ClBasenames, ClOutputStyle);
if (ClInputAddresses.empty()) {
const int kMaxInputStringLength = 1024;