diff --git a/docs/CommandGuide/llvm-symbolizer.rst b/docs/CommandGuide/llvm-symbolizer.rst index dd93efd03cf..820b1506171 100644 --- a/docs/CommandGuide/llvm-symbolizer.rst +++ b/docs/CommandGuide/llvm-symbolizer.rst @@ -147,6 +147,27 @@ Example 4 - CODE and DATA prefixes: bar 6295592 4 +Example 5 - path-style options: + +This example uses the same source file as above, but the source file's +full path is /tmp/foo/test.cpp and is compiled as follows. The first case +shows the default absolute path, the second --basenames, and the third +shows --relativenames. + +.. code-block:: console + $ pwd + /tmp + $ clang -g foo/test.cpp -o test.elf + $ llvm-symbolizer --obj=test.elf 0x4004a0 + main + /tmp/foo/test.cpp:15:0 + $ llvm-symbolizer --obj=test.elf 0x4004a0 --basenames + main + test.cpp:15:0 + $ llvm-symbolizer --obj=test.elf 0x4004a0 --relativenames + main + foo/test.cpp:15:0 + OPTIONS ------- @@ -158,8 +179,15 @@ OPTIONS .. option:: --basenames, -s - Strip directories when printing the file path. + Print just the file's name without any directories, instead of the + absolute path. +.. option:: --relativenames + + Print the file's path relative to the compilation directory, instead + of the absolute path. If the command-line to the compiler included + the full path, this will be the same as the default. + .. _llvm-symbolizer-opt-C: .. option:: --demangle, -C diff --git a/test/tools/llvm-symbolizer/relativenames.s b/test/tools/llvm-symbolizer/relativenames.s new file mode 100644 index 00000000000..96b89cb004b --- /dev/null +++ b/test/tools/llvm-symbolizer/relativenames.s @@ -0,0 +1,18 @@ +# REQUIRES: x86-registered-target + +foo: + nop + +# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t.o -g + +# RUN: llvm-symbolizer 0 --relativenames --obj=%t.o \ +# RUN: | FileCheck %s -DDIR=%p --check-prefix=RELATIVENAMES + +## Ensure last option wins. +# RUN: llvm-symbolizer 0 --basenames --relativenames --obj=%t.o \ +# RUN: | FileCheck %s -DDIR=%p --check-prefix=RELATIVENAMES +# RUN: llvm-symbolizer 0 --relativenames --basenames --obj=%t.o \ +# RUN: | FileCheck %s --check-prefix=BASENAMES + +# RELATIVENAMES: [[DIR]]{{\\|/}}relativenames.s:4 +# BASENAMES: {{^}}relativenames.s:4 diff --git a/tools/llvm-symbolizer/llvm-symbolizer.cpp b/tools/llvm-symbolizer/llvm-symbolizer.cpp index 8f4a93fcc25..55d9c65d994 100644 --- a/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -77,6 +77,11 @@ static cl::opt ClBasenames("basenames", cl::init(false), static cl::alias ClBasenamesShort("s", cl::desc("Alias for -basenames"), cl::NotHidden, cl::aliasopt(ClBasenames)); +// -relativenames +static cl::opt + ClRelativenames("relativenames", cl::init(false), + cl::desc("Strip the compilation directory from paths")); + // -demangle, -C, -no-demangle static cl::opt ClDemangle("demangle", cl::init(true), cl::desc("Demangle function names")); @@ -310,8 +315,12 @@ int main(int argc, char **argv) { Opts.DWPName = ClDwpName; Opts.DebugFileDirectory = ClDebugFileDirectory; Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath; - if (ClBasenames) + // If both --basenames and --relativenames are specified then pick the last + // one. + if (ClBasenames.getPosition() > ClRelativenames.getPosition()) Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::BaseNameOnly; + else if (ClRelativenames) + Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::RelativeFilePath; for (const auto &hint : ClDsymHint) { if (sys::path::extension(hint) == ".dSYM") {