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 @@ -147,6 +147,28 @@ 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 paths, 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 +180,15 @@ .. 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/llvm/test/tools/llvm-symbolizer/relativenames.s b/llvm/test/tools/llvm-symbolizer/relativenames.s new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-symbolizer/relativenames.s @@ -0,0 +1,15 @@ +# 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 | FileCheck %s -DDIR=%p +# Ensure last option wins. +# RUN: llvm-symbolizer 0 --basenames --relativenames --obj=%t.o \ +# RUN: | FileCheck %s -DDIR=%p +# RUN: llvm-symbolizer 0 --relativenames --basenames --obj=%t.o \ +# RUN: | FileCheck %s -DDIR=%p --check-prefix=BASENAMES + +# CHECK: [[DIR]]{{\\|/}}relativenames.s:4 +# BASENAMES: relativenames.s:4 diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -77,6 +77,11 @@ 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 @@ 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") {