diff --git a/llvm/docs/CommandGuide/llvm-symbolizer.rst b/llvm/docs/CommandGuide/llvm-symbolizer.rst --- a/llvm/docs/CommandGuide/llvm-symbolizer.rst +++ b/llvm/docs/CommandGuide/llvm-symbolizer.rst @@ -227,6 +227,9 @@ topmost caller when inlined frames are not shown and :option:`--use-symbol-table` is on. + * Prints an address's dwarf discriminator when it is non-zero. Clang only + includes discriminators when compiling with -fdebug-info-for-profiling. + .. code-block:: console $ llvm-symbolizer --obj=inlined.elf 0x4004be 0x400486 -p @@ -244,6 +247,10 @@ baz() at /tmp/test.cpp:11 foo() at /tmp/test.cpp:6 + $ clang -g -fdebug-info-for-profiling test.cpp -o profiling.elf + $ llvm-symbolizer --output-style=GNU --obj=profiling.elf 0x401167 -p -i=0 + main at /usr/local/google/home/saugustine/tmp/test.cpp:15 (discriminator 2) + .. option:: --pretty-print, -p Print human readable output. If :option:`--inlining` is specified, the diff --git a/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp b/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp --- a/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp +++ b/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp @@ -79,6 +79,8 @@ OS << Filename << ":" << Info.Line; if (Style == OutputStyle::LLVM) OS << ":" << Info.Column; + else if (Style == OutputStyle::GNU && Info.Discriminator != 0) + OS << " (discriminator " << Info.Discriminator << ")"; OS << "\n"; printContext(Filename, Info.Line); return; diff --git a/llvm/test/tools/llvm-symbolizer/discriminator.test b/llvm/test/tools/llvm-symbolizer/discriminator.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-symbolizer/discriminator.test @@ -0,0 +1,20 @@ +# Check that llvm-symbolizer prints line-table discriminators properly. + +RUN: llvm-symbolizer --output-style=GNU -f --obj=%p/Inputs/discrim 0x400590 0x400575 \ +RUN: | FileCheck %s --check-prefix=GNU --match-full-lines +RUN: llvm-symbolizer --output-style=LLVM -f --obj=%p/Inputs/discrim 0x400590 0x400575 \ +RUN: | FileCheck %s --check-prefix=LLVM --match-full-lines + +GNU: foo +GNU: /tmp/discrim.c:5 +GNU: main +GNU: /tmp/discrim.c:10 +GNU: foo +GNU: /tmp/discrim.c:5 (discriminator 2) + +LLVM: foo +LLVM: /tmp/discrim.c:5:7 +LLVM: main +LLVM: /tmp/discrim.c:10:0 +LLVM: foo +LLVM: /tmp/discrim.c:5:17