diff options
| -rw-r--r-- | llvm/test/tools/llvm-symbolizer/output-style-column.test (renamed from llvm/test/tools/llvm-symbolizer/output-style.test) | 0 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-symbolizer/output-style-empty-line.test | 19 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-symbolizer/output-style-inlined.test | 17 | ||||
| -rw-r--r-- | llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 14 |
4 files changed, 49 insertions, 1 deletions
diff --git a/llvm/test/tools/llvm-symbolizer/output-style.test b/llvm/test/tools/llvm-symbolizer/output-style-column.test index bb143c16f1d..bb143c16f1d 100644 --- a/llvm/test/tools/llvm-symbolizer/output-style.test +++ b/llvm/test/tools/llvm-symbolizer/output-style-column.test diff --git a/llvm/test/tools/llvm-symbolizer/output-style-empty-line.test b/llvm/test/tools/llvm-symbolizer/output-style-empty-line.test new file mode 100644 index 00000000000..8b14b4c07aa --- /dev/null +++ b/llvm/test/tools/llvm-symbolizer/output-style-empty-line.test @@ -0,0 +1,19 @@ +This test checks that with --output-style=GNU the tool does not print an empty +line after the report for an address. The current behavior is preserved for +--output-style=LLVM or if the option is omitted. + +RUN: llvm-symbolizer -e %p/Inputs/addr.exe < %p/Inputs/addr.inp \ +RUN: | FileCheck %s --check-prefix=LLVM + +RUN: llvm-symbolizer --output-style=LLVM -e %p/Inputs/addr.exe < %p/Inputs/addr.inp \ +RUN: | FileCheck %s --check-prefix=LLVM + +RUN: llvm-symbolizer --output-style=GNU -e %p/Inputs/addr.exe < %p/Inputs/addr.inp \ +RUN: | FileCheck %s --check-prefix=GNU + +LLVM: x.c:14:0 +LLVM-EMPTY: +LLVM-NEXT: some text2 + +GNU: x.c:14 +GNU-NEXT: some text2 diff --git a/llvm/test/tools/llvm-symbolizer/output-style-inlined.test b/llvm/test/tools/llvm-symbolizer/output-style-inlined.test new file mode 100644 index 00000000000..e9707532ac9 --- /dev/null +++ b/llvm/test/tools/llvm-symbolizer/output-style-inlined.test @@ -0,0 +1,17 @@ +This test checks that when inlined frames are not shown (-i=0) and the output +style is set to GNU (--output-style=GNU) the name of an inlined function is not +replaced with the name of the top caller function. At the same time, the current +behavior of llvm-symbolizer is preserved with --output-style=LLVM or when +the option is not specified. + +RUN: llvm-symbolizer -i=0 -e %p/Inputs/addr.exe 0x40054d \ +RUN: | FileCheck %s --check-prefix=LLVM --implicit-check-not=inctwo + +RUN: llvm-symbolizer --output-style=LLVM -i=0 -e %p/Inputs/addr.exe 0x40054d \ +RUN: | FileCheck %s --check-prefix=LLVM --implicit-check-not=inctwo + +RUN: llvm-symbolizer --output-style=GNU -i=0 -e %p/Inputs/addr.exe 0x40054d \ +RUN: | FileCheck %s --check-prefix=GNU --implicit-check-not=main + +LLVM: main +GNU: inctwo diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index 359c64b37ce..c57f5f85c86 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -227,13 +227,25 @@ static void symbolizeInput(StringRef InputString, LLVMSymbolizer &Symbolizer, ModuleName, {Offset, object::SectionedAddress::UndefSection}, ClDwpName); Printer << (error(ResOrErr) ? DIInliningInfo() : ResOrErr.get()); + } else if (ClOutputStyle == DIPrinter::OutputStyle::GNU) { + // With ClPrintFunctions == FunctionNameKind::LinkageName (default) + // and ClUseSymbolTable == true (also default), Symbolizer.symbolizeCode() + // may override the name of an inlined function with the name of the topmost + // caller function in the inlining chain. This contradicts the existing + // behavior of addr2line. Symbolizer.symbolizeInlinedCode() overrides only + // the topmost function, which suits our needs better. + auto ResOrErr = Symbolizer.symbolizeInlinedCode( + ModuleName, {Offset, object::SectionedAddress::UndefSection}, + ClDwpName); + Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get().getFrame(0)); } else { auto ResOrErr = Symbolizer.symbolizeCode( ModuleName, {Offset, object::SectionedAddress::UndefSection}, ClDwpName); Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get()); } - outs() << "\n"; + if (ClOutputStyle == DIPrinter::OutputStyle::LLVM) + outs() << "\n"; outs().flush(); } |

