From dcf1bd6c9471452e2db45cabbcd4197762ad3197 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Wed, 18 Dec 2019 10:19:47 -0800 Subject: [PATCH] [llvm-symbolizer] Support reading options from environment llvm-symbolizer is used by sanitizers to symbolize errors discovered by sanitizer, but there's no way to pass options to llvm-symbolizer since the tool is invoked directly by the sanitizer runtime. Therefore, we don't have a way to pass options needed to find debug symbols such as -dsym-hint or -debug-file-directory. This change enables reading options from the LLVM_SYMBOLIZER_OPTS in addition to command line which can be used to pass those additional options to llvm-symbolizer invocations made by sanitizer runtime. Differential Revision: https://reviews.llvm.org/D71668 --- docs/CommandGuide/llvm-addr2line.rst | 2 ++ docs/CommandGuide/llvm-symbolizer.rst | 6 ++++++ test/tools/llvm-symbolizer/options-from-env.test | 4 ++++ tools/llvm-symbolizer/llvm-symbolizer.cpp | 6 ++++-- 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 test/tools/llvm-symbolizer/options-from-env.test diff --git a/docs/CommandGuide/llvm-addr2line.rst b/docs/CommandGuide/llvm-addr2line.rst index 08f1b69675d..4f5881dc8e8 100644 --- a/docs/CommandGuide/llvm-addr2line.rst +++ b/docs/CommandGuide/llvm-addr2line.rst @@ -27,6 +27,8 @@ Here are some of those differences: - Uses `--output-style=GNU`_ by default. +- Parses options from the environment variable ``LLVM_ADDR2LINE_OPTS``. + SEE ALSO -------- diff --git a/docs/CommandGuide/llvm-symbolizer.rst b/docs/CommandGuide/llvm-symbolizer.rst index b157f94ef22..bb60246c835 100644 --- a/docs/CommandGuide/llvm-symbolizer.rst +++ b/docs/CommandGuide/llvm-symbolizer.rst @@ -28,6 +28,12 @@ Object files can be specified together with the addresses either on standard input or as positional arguments on the command-line, following any "DATA" or "CODE" prefix. +:program:`llvm-symbolizer` parses options from the environment variable +``LLVM_SYMBOLIZER_OPTS`` after parsing options from the command line. +``LLVM_SYMBOLIZER_OPTS`` is primarily useful for supplementing the command-line +options when :program:`llvm-symbolizer` is invoked by another program or +runtime. + EXAMPLES -------- diff --git a/test/tools/llvm-symbolizer/options-from-env.test b/test/tools/llvm-symbolizer/options-from-env.test new file mode 100644 index 00000000000..92fcbcda683 --- /dev/null +++ b/test/tools/llvm-symbolizer/options-from-env.test @@ -0,0 +1,4 @@ +RUN: LLVM_SYMBOLIZER_OPTS=--print-address llvm-symbolizer 0x20112f | FileCheck %s +RUN: LLVM_ADDR2LINE_OPTS=--print-address llvm-addr2line 0x20112f | FileCheck %s + +CHECK: 0x20112f diff --git a/tools/llvm-symbolizer/llvm-symbolizer.cpp b/tools/llvm-symbolizer/llvm-symbolizer.cpp index c9bc0309a65..45c845ac26e 100644 --- a/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -289,8 +289,10 @@ int main(int argc, char **argv) { } llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded); - cl::ParseCommandLineOptions(argc, argv, IsAddr2Line ? "llvm-addr2line\n" - : "llvm-symbolizer\n"); + cl::ParseCommandLineOptions( + argc, argv, IsAddr2Line ? "llvm-addr2line\n" : "llvm-symbolizer\n", + /*Errs=*/nullptr, + IsAddr2Line ? "LLVM_ADDR2LINE_OPTS" : "LLVM_SYMBOLIZER_OPTS"); // If both --demangle and --no-demangle are specified then pick the last one. if (ClNoDemangle.getPosition() > ClDemangle.getPosition())