forked from OSchip/llvm-project
[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:
parent
8911c5be46
commit
0fed7b0564
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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{{$}}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue