diff --git a/llvm/test/tools/llvm-symbolizer/version.test b/llvm/test/tools/llvm-symbolizer/version.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-symbolizer/version.test @@ -0,0 +1,7 @@ +# RUN: llvm-symbolizer --version | FileCheck %s --check-prefixes=SYMBOLIZER,COMMON +# RUN: llvm-addr2line --version | FileCheck %s --check-prefixes=ADDR2LINE,COMMON +# RUN: llvm-addr2line -v | FileCheck %s --check-prefixes=ADDR2LINE,COMMON + +# SYMBOLIZER: llvm-symbolizer{{$}} +# ADDR2LINE: llvm-addr2line{{$}} +# COMMON: LLVM version {{.*}} diff --git a/llvm/tools/llvm-symbolizer/Opts.td b/llvm/tools/llvm-symbolizer/Opts.td --- a/llvm/tools/llvm-symbolizer/Opts.td +++ b/llvm/tools/llvm-symbolizer/Opts.td @@ -43,6 +43,7 @@ defm untag_addresses : B<"untag-addresses", "", "Remove memory tags from addresses before symbolization">; def use_native_pdb_reader : F<"use-native-pdb-reader", "Use native PDB functionality">; def verbose : F<"verbose", "Print verbose line info">; +def version : F<"version", "Display the version">; def : Flag<["-"], "a">, Alias, HelpText<"Alias for --addresses">; def : F<"print-address", "Alias for --addresses">, Alias; @@ -58,6 +59,7 @@ def : F<"inlining", "Alias for --inlines">, Alias; def : Flag<["-"], "p">, Alias, HelpText<"Alias for --pretty-print">; def : Flag<["-"], "s">, Alias, HelpText<"Alias for --basenames">; +def : Flag<["-"], "v">, Alias, HelpText<"Alias for --version">; // Compatibility aliases for old asan_symbolize.py and sanitizer binaries (before 2020-08). def : Flag<["--"], "inlining=true">, Alias, HelpText<"Alias for --inlines">; 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 @@ -190,9 +190,8 @@ outs() << "\n"; } -static void printHelp(bool IsAddr2Line, const SymbolizerOptTable &Tbl, +static void printHelp(StringRef ToolName, const SymbolizerOptTable &Tbl, raw_ostream &OS) { - StringRef ToolName = IsAddr2Line ? "llvm-addr2line" : "llvm-symbolizer"; const char HelpText[] = " [options] addresses..."; Tbl.PrintHelp(OS, (ToolName + HelpText).str().c_str(), ToolName.str().c_str()); @@ -203,6 +202,7 @@ static opt::InputArgList parseOptions(int Argc, char *Argv[], bool IsAddr2Line, StringSaver &Saver, SymbolizerOptTable &Tbl) { + StringRef ToolName = IsAddr2Line ? "llvm-addr2line" : "llvm-symbolizer"; Tbl.setGroupedShortOptions(true); // The environment variable specifies initial options which can be overridden // by commnad line options. @@ -217,7 +217,12 @@ if (HasError) exit(1); if (Args.hasArg(OPT_help)) { - printHelp(IsAddr2Line, Tbl, outs()); + printHelp(ToolName, Tbl, outs()); + exit(0); + } + if (Args.hasArg(OPT_version)) { + outs() << ToolName << '\n'; + cl::PrintVersionMessage(); exit(0); }