Index: llvm/trunk/include/llvm/DebugInfo/Symbolize/DIPrinter.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/Symbolize/DIPrinter.h +++ llvm/trunk/include/llvm/DebugInfo/Symbolize/DIPrinter.h @@ -24,12 +24,17 @@ 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 @@ 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); Index: llvm/trunk/lib/DebugInfo/Symbolize/DIPrinter.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/Symbolize/DIPrinter.cpp +++ llvm/trunk/lib/DebugInfo/Symbolize/DIPrinter.cpp @@ -81,7 +81,10 @@ 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; } Index: llvm/trunk/test/tools/llvm-symbolizer/output-style.test =================================================================== --- llvm/trunk/test/tools/llvm-symbolizer/output-style.test +++ llvm/trunk/test/tools/llvm-symbolizer/output-style.test @@ -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{{$}} Index: llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp =================================================================== --- llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -147,6 +147,14 @@ ClFallbackDebugPath("fallback-debug-path", cl::init(""), cl::desc("Fallback path for debug binaries.")); +static cl::opt + 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 static bool error(Expected &ResOrErr) { if (ResOrErr) @@ -256,7 +264,7 @@ DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None, ClPrettyPrint, ClPrintSourceContextLines, ClVerbose, - ClBasenames); + ClBasenames, ClOutputStyle); if (ClInputAddresses.empty()) { const int kMaxInputStringLength = 1024;