summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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.test19
-rw-r--r--llvm/test/tools/llvm-symbolizer/output-style-inlined.test17
-rw-r--r--llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp14
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();
}
OpenPOWER on IntegriCloud