diff options
author | shadchin <shadchin@yandex-team.ru> | 2022-02-10 16:44:39 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:39 +0300 |
commit | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (patch) | |
tree | 64175d5cadab313b3e7039ebaa06c5bc3295e274 /contrib/libs/llvm12/tools/llvm-symbolizer | |
parent | 2598ef1d0aee359b4b6d5fdd1758916d5907d04f (diff) | |
download | ydb-e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0.tar.gz |
Restoring authorship annotation for <shadchin@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/llvm12/tools/llvm-symbolizer')
-rw-r--r-- | contrib/libs/llvm12/tools/llvm-symbolizer/Opts.td | 142 | ||||
-rw-r--r-- | contrib/libs/llvm12/tools/llvm-symbolizer/llvm-symbolizer.cpp | 368 | ||||
-rw-r--r-- | contrib/libs/llvm12/tools/llvm-symbolizer/ya.make | 42 |
3 files changed, 276 insertions, 276 deletions
diff --git a/contrib/libs/llvm12/tools/llvm-symbolizer/Opts.td b/contrib/libs/llvm12/tools/llvm-symbolizer/Opts.td index aff1181799..ac23639f13 100644 --- a/contrib/libs/llvm12/tools/llvm-symbolizer/Opts.td +++ b/contrib/libs/llvm12/tools/llvm-symbolizer/Opts.td @@ -1,71 +1,71 @@ -include "llvm/Option/OptParser.td" - -multiclass B<string name, string help1, string help2> { - def NAME: Flag<["--", "-"], name>, HelpText<help1>; - def no_ # NAME: Flag<["--", "-"], "no-" # name>, HelpText<help2>; -} - -multiclass Eq<string name, string help> { - def NAME #_EQ : Joined<["--", "-"], name #"=">, - HelpText<help>; - def : Separate<["--", "-"], name>, Alias<!cast<Joined>(NAME #_EQ)>; -} - -class F<string name, string help>: Flag<["--", "-"], name>, HelpText<help>; - -def addresses : F<"addresses", "Show address before line information">; -defm adjust_vma - : Eq<"adjust-vma", "Add specified offset to object file addresses">, - MetaVarName<"<offset>">; -def basenames : Flag<["--"], "basenames">, HelpText<"Strip directory names from paths">; -defm debug_file_directory : Eq<"debug-file-directory", "Path to directory where to look for debug files">, MetaVarName<"<dir>">; -defm default_arch : Eq<"default-arch", "Default architecture (for multi-arch objects)">; -defm demangle : B<"demangle", "Demangle function names", "Don't demangle function names">; -def functions : F<"functions", "Print function name for a given address">; -def functions_EQ : Joined<["--"], "functions=">, HelpText<"Print function name for a given address">, Values<"none,short,linkage">; -def help : F<"help", "Display this help">; -defm dwp : Eq<"dwp", "Path to DWP file to be use for any split CUs">, MetaVarName<"<file>">; -defm dsym_hint : Eq<"dsym-hint", "Path to .dSYM bundles to search for debug info for the object files">, MetaVarName<"<dir>">; -defm fallback_debug_path : Eq<"fallback-debug-path", "Fallback path for debug binaries">, MetaVarName<"<dir>">; -defm inlines : B<"inlines", "Print all inlined frames for a given address", - "Do not print inlined frames">; -defm obj - : Eq<"obj", "Path to object file to be symbolized (if not provided, " - "object file should be specified for each input line)">, MetaVarName<"<file>">; -defm output_style - : Eq<"output-style", "Specify print style. Supported styles: LLVM, GNU">, - MetaVarName<"style">, - Values<"LLVM,GNU">; -def pretty_print : F<"pretty-print", "Make the output more human friendly">; -defm print_source_context_lines : Eq<"print-source-context-lines", "Print N lines of source file context">; -def relative_address : F<"relative-address", "Interpret addresses as addresses relative to the image base">; -def relativenames : F<"relativenames", "Strip the compilation directory from paths">; -defm untag_addresses : B<"untag-addresses", "", "Remove memory tags from addresses before symbolization">; -def use_dia: F<"dia", "Use the DIA library to access symbols (Windows only)">; -def verbose : F<"verbose", "Print verbose line info">; -def version : F<"version", "Display the version">; - -def : Flag<["-"], "a">, Alias<addresses>, HelpText<"Alias for --addresses">; -def : F<"print-address", "Alias for --addresses">, Alias<addresses>; -def : Flag<["-"], "C">, Alias<demangle>, HelpText<"Alias for --demangle">; -def : Joined<["--"], "exe=">, Alias<obj_EQ>, HelpText<"Alias for --obj">, MetaVarName<"<file>">; -def : Separate<["--"], "exe">, Alias<obj_EQ>, HelpText<"Alias for --obj">, MetaVarName<"<file>">; -def : JoinedOrSeparate<["-"], "e">, Alias<obj_EQ>, HelpText<"Alias for --obj">, MetaVarName<"<file>">; -def : Joined<["-"], "e=">, Alias<obj_EQ>, HelpText<"Alias for --obj">, MetaVarName<"<file>">; -def : Flag<["-"], "f">, Alias<functions>, HelpText<"Alias for --functions">; -def : Joined<["-"], "f=">, Alias<functions_EQ>, HelpText<"Alias for --functions=">; -def : Flag<["-"], "h">, Alias<help>; -def : Flag<["-"], "i">, Alias<inlines>, HelpText<"Alias for --inlines">; -def : F<"inlining", "Alias for --inlines">, Alias<inlines>; -def : Flag<["-"], "p">, Alias<pretty_print>, HelpText<"Alias for --pretty-print">; -def : Flag<["-"], "s">, Alias<basenames>, HelpText<"Alias for --basenames">; -def : Flag<["-"], "v">, Alias<version>, HelpText<"Alias for --version">; - -// Compatibility aliases for old asan_symbolize.py and sanitizer binaries (before 2020-08). -def : Flag<["--"], "inlining=true">, Alias<inlines>, HelpText<"Alias for --inlines">; -def : Flag<["--"], "inlining=false">, Alias<no_inlines>, HelpText<"Alias for --no-inlines">; -// Compatibility aliases for pprof's symbolizer. -def : Flag<["-"], "demangle=true">, Alias<demangle>, HelpText<"Alias for --demangle">; -def : Flag<["-"], "demangle=false">, Alias<no_demangle>, HelpText<"Alias for --no-demangle">; -// Compatibility no-op options. -def : Flag<["--"], "use-symbol-table=true">; +include "llvm/Option/OptParser.td" + +multiclass B<string name, string help1, string help2> { + def NAME: Flag<["--", "-"], name>, HelpText<help1>; + def no_ # NAME: Flag<["--", "-"], "no-" # name>, HelpText<help2>; +} + +multiclass Eq<string name, string help> { + def NAME #_EQ : Joined<["--", "-"], name #"=">, + HelpText<help>; + def : Separate<["--", "-"], name>, Alias<!cast<Joined>(NAME #_EQ)>; +} + +class F<string name, string help>: Flag<["--", "-"], name>, HelpText<help>; + +def addresses : F<"addresses", "Show address before line information">; +defm adjust_vma + : Eq<"adjust-vma", "Add specified offset to object file addresses">, + MetaVarName<"<offset>">; +def basenames : Flag<["--"], "basenames">, HelpText<"Strip directory names from paths">; +defm debug_file_directory : Eq<"debug-file-directory", "Path to directory where to look for debug files">, MetaVarName<"<dir>">; +defm default_arch : Eq<"default-arch", "Default architecture (for multi-arch objects)">; +defm demangle : B<"demangle", "Demangle function names", "Don't demangle function names">; +def functions : F<"functions", "Print function name for a given address">; +def functions_EQ : Joined<["--"], "functions=">, HelpText<"Print function name for a given address">, Values<"none,short,linkage">; +def help : F<"help", "Display this help">; +defm dwp : Eq<"dwp", "Path to DWP file to be use for any split CUs">, MetaVarName<"<file>">; +defm dsym_hint : Eq<"dsym-hint", "Path to .dSYM bundles to search for debug info for the object files">, MetaVarName<"<dir>">; +defm fallback_debug_path : Eq<"fallback-debug-path", "Fallback path for debug binaries">, MetaVarName<"<dir>">; +defm inlines : B<"inlines", "Print all inlined frames for a given address", + "Do not print inlined frames">; +defm obj + : Eq<"obj", "Path to object file to be symbolized (if not provided, " + "object file should be specified for each input line)">, MetaVarName<"<file>">; +defm output_style + : Eq<"output-style", "Specify print style. Supported styles: LLVM, GNU">, + MetaVarName<"style">, + Values<"LLVM,GNU">; +def pretty_print : F<"pretty-print", "Make the output more human friendly">; +defm print_source_context_lines : Eq<"print-source-context-lines", "Print N lines of source file context">; +def relative_address : F<"relative-address", "Interpret addresses as addresses relative to the image base">; +def relativenames : F<"relativenames", "Strip the compilation directory from paths">; +defm untag_addresses : B<"untag-addresses", "", "Remove memory tags from addresses before symbolization">; +def use_dia: F<"dia", "Use the DIA library to access symbols (Windows only)">; +def verbose : F<"verbose", "Print verbose line info">; +def version : F<"version", "Display the version">; + +def : Flag<["-"], "a">, Alias<addresses>, HelpText<"Alias for --addresses">; +def : F<"print-address", "Alias for --addresses">, Alias<addresses>; +def : Flag<["-"], "C">, Alias<demangle>, HelpText<"Alias for --demangle">; +def : Joined<["--"], "exe=">, Alias<obj_EQ>, HelpText<"Alias for --obj">, MetaVarName<"<file>">; +def : Separate<["--"], "exe">, Alias<obj_EQ>, HelpText<"Alias for --obj">, MetaVarName<"<file>">; +def : JoinedOrSeparate<["-"], "e">, Alias<obj_EQ>, HelpText<"Alias for --obj">, MetaVarName<"<file>">; +def : Joined<["-"], "e=">, Alias<obj_EQ>, HelpText<"Alias for --obj">, MetaVarName<"<file>">; +def : Flag<["-"], "f">, Alias<functions>, HelpText<"Alias for --functions">; +def : Joined<["-"], "f=">, Alias<functions_EQ>, HelpText<"Alias for --functions=">; +def : Flag<["-"], "h">, Alias<help>; +def : Flag<["-"], "i">, Alias<inlines>, HelpText<"Alias for --inlines">; +def : F<"inlining", "Alias for --inlines">, Alias<inlines>; +def : Flag<["-"], "p">, Alias<pretty_print>, HelpText<"Alias for --pretty-print">; +def : Flag<["-"], "s">, Alias<basenames>, HelpText<"Alias for --basenames">; +def : Flag<["-"], "v">, Alias<version>, HelpText<"Alias for --version">; + +// Compatibility aliases for old asan_symbolize.py and sanitizer binaries (before 2020-08). +def : Flag<["--"], "inlining=true">, Alias<inlines>, HelpText<"Alias for --inlines">; +def : Flag<["--"], "inlining=false">, Alias<no_inlines>, HelpText<"Alias for --no-inlines">; +// Compatibility aliases for pprof's symbolizer. +def : Flag<["-"], "demangle=true">, Alias<demangle>, HelpText<"Alias for --demangle">; +def : Flag<["-"], "demangle=false">, Alias<no_demangle>, HelpText<"Alias for --no-demangle">; +// Compatibility no-op options. +def : Flag<["--"], "use-symbol-table=true">; diff --git a/contrib/libs/llvm12/tools/llvm-symbolizer/llvm-symbolizer.cpp b/contrib/libs/llvm12/tools/llvm-symbolizer/llvm-symbolizer.cpp index f85ed6dc7e..8734c2d740 100644 --- a/contrib/libs/llvm12/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/contrib/libs/llvm12/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -14,21 +14,21 @@ // //===----------------------------------------------------------------------===// -#include "Opts.inc" +#include "Opts.inc" #include "llvm/ADT/StringRef.h" -#include "llvm/Config/config.h" +#include "llvm/Config/config.h" #include "llvm/DebugInfo/Symbolize/DIPrinter.h" #include "llvm/DebugInfo/Symbolize/Symbolize.h" -#include "llvm/Option/Arg.h" -#include "llvm/Option/ArgList.h" -#include "llvm/Option/Option.h" +#include "llvm/Option/Arg.h" +#include "llvm/Option/ArgList.h" +#include "llvm/Option/Option.h" #include "llvm/Support/COM.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/InitLLVM.h" #include "llvm/Support/Path.h" -#include "llvm/Support/StringSaver.h" +#include "llvm/Support/StringSaver.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> #include <cstdio> @@ -38,37 +38,37 @@ using namespace llvm; using namespace symbolize; -namespace { -enum ID { - OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, -#include "Opts.inc" -#undef OPTION -}; +namespace { +enum ID { + OPT_INVALID = 0, // This is not an option ID. +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + OPT_##ID, +#include "Opts.inc" +#undef OPTION +}; -#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE; -#include "Opts.inc" -#undef PREFIX +#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE; +#include "Opts.inc" +#undef PREFIX -static const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, -#include "Opts.inc" -#undef OPTION -}; +static const opt::OptTable::Info InfoTable[] = { +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + { \ + PREFIX, NAME, HELPTEXT, \ + METAVAR, OPT_##ID, opt::Option::KIND##Class, \ + PARAM, FLAGS, OPT_##GROUP, \ + OPT_##ALIAS, ALIASARGS, VALUES}, +#include "Opts.inc" +#undef OPTION +}; -class SymbolizerOptTable : public opt::OptTable { -public: - SymbolizerOptTable() : OptTable(InfoTable, true) {} -}; -} // namespace +class SymbolizerOptTable : public opt::OptTable { +public: + SymbolizerOptTable() : OptTable(InfoTable, true) {} +}; +} // namespace static cl::list<std::string> ClInputAddresses(cl::Positional, cl::desc("<input addresses>..."), @@ -89,8 +89,8 @@ enum class Command { Frame, }; -static bool parseCommand(StringRef BinaryName, bool IsAddr2Line, - StringRef InputString, Command &Cmd, +static bool parseCommand(StringRef BinaryName, bool IsAddr2Line, + StringRef InputString, Command &Cmd, std::string &ModuleName, uint64_t &ModuleOffset) { const char kDelimiters[] = " \n\r"; ModuleName = ""; @@ -106,7 +106,7 @@ static bool parseCommand(StringRef BinaryName, bool IsAddr2Line, } const char *Pos = InputString.data(); // Skip delimiters and parse input filename (if needed). - if (BinaryName.empty()) { + if (BinaryName.empty()) { Pos += strspn(Pos, kDelimiters); if (*Pos == '"' || *Pos == '\'') { char Quote = *Pos; @@ -122,7 +122,7 @@ static bool parseCommand(StringRef BinaryName, bool IsAddr2Line, Pos += NameLength; } } else { - ModuleName = BinaryName.str(); + ModuleName = BinaryName.str(); } // Skip delimiters and parse module offset. Pos += strspn(Pos, kDelimiters); @@ -135,26 +135,26 @@ static bool parseCommand(StringRef BinaryName, bool IsAddr2Line, return !Offset.getAsInteger(IsAddr2Line ? 16 : 0, ModuleOffset); } -static void symbolizeInput(const opt::InputArgList &Args, uint64_t AdjustVMA, - bool IsAddr2Line, DIPrinter::OutputStyle OutputStyle, - StringRef InputString, LLVMSymbolizer &Symbolizer, - DIPrinter &Printer) { +static void symbolizeInput(const opt::InputArgList &Args, uint64_t AdjustVMA, + bool IsAddr2Line, DIPrinter::OutputStyle OutputStyle, + StringRef InputString, LLVMSymbolizer &Symbolizer, + DIPrinter &Printer) { Command Cmd; std::string ModuleName; uint64_t Offset = 0; - if (!parseCommand(Args.getLastArgValue(OPT_obj_EQ), IsAddr2Line, - StringRef(InputString), Cmd, ModuleName, Offset)) { + if (!parseCommand(Args.getLastArgValue(OPT_obj_EQ), IsAddr2Line, + StringRef(InputString), Cmd, ModuleName, Offset)) { outs() << InputString << "\n"; return; } - if (Args.hasArg(OPT_addresses)) { + if (Args.hasArg(OPT_addresses)) { outs() << "0x"; outs().write_hex(Offset); - StringRef Delimiter = Args.hasArg(OPT_pretty_print) ? ": " : "\n"; + StringRef Delimiter = Args.hasArg(OPT_pretty_print) ? ": " : "\n"; outs() << Delimiter; } - Offset -= AdjustVMA; + Offset -= AdjustVMA; if (Cmd == Command::Data) { auto ResOrErr = Symbolizer.symbolizeData( ModuleName, {Offset, object::SectionedAddress::UndefSection}); @@ -168,182 +168,182 @@ static void symbolizeInput(const opt::InputArgList &Args, uint64_t AdjustVMA, if (ResOrErr->empty()) outs() << "??\n"; } - } else if (Args.hasFlag(OPT_inlines, OPT_no_inlines, !IsAddr2Line)) { + } else if (Args.hasFlag(OPT_inlines, OPT_no_inlines, !IsAddr2Line)) { auto ResOrErr = Symbolizer.symbolizeInlinedCode( ModuleName, {Offset, object::SectionedAddress::UndefSection}); Printer << (error(ResOrErr) ? DIInliningInfo() : ResOrErr.get()); - } else if (OutputStyle == DIPrinter::OutputStyle::GNU) { - // With PrintFunctions == FunctionNameKind::LinkageName (default) - // and UseSymbolTable == true (also default), Symbolizer.symbolizeCode() + } else if (OutputStyle == DIPrinter::OutputStyle::GNU) { + // With PrintFunctions == FunctionNameKind::LinkageName (default) + // and UseSymbolTable == true (also default), Symbolizer.symbolizeCode() // may override the name of an inlined function with the name of the topmost // caller function in the inlining chain. This contradicts the existing // behavior of addr2line. Symbolizer.symbolizeInlinedCode() overrides only // the topmost function, which suits our needs better. auto ResOrErr = Symbolizer.symbolizeInlinedCode( ModuleName, {Offset, object::SectionedAddress::UndefSection}); - if (!ResOrErr || ResOrErr->getNumberOfFrames() == 0) { - error(ResOrErr); - Printer << DILineInfo(); - } else { - Printer << ResOrErr->getFrame(0); - } + if (!ResOrErr || ResOrErr->getNumberOfFrames() == 0) { + error(ResOrErr); + Printer << DILineInfo(); + } else { + Printer << ResOrErr->getFrame(0); + } } else { auto ResOrErr = Symbolizer.symbolizeCode( ModuleName, {Offset, object::SectionedAddress::UndefSection}); Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get()); } - if (OutputStyle == DIPrinter::OutputStyle::LLVM) + if (OutputStyle == DIPrinter::OutputStyle::LLVM) outs() << "\n"; } -static void printHelp(StringRef ToolName, const SymbolizerOptTable &Tbl, - raw_ostream &OS) { - const char HelpText[] = " [options] addresses..."; - Tbl.PrintHelp(OS, (ToolName + HelpText).str().c_str(), - ToolName.str().c_str()); - // TODO Replace this with OptTable API once it adds extrahelp support. - OS << "\nPass @FILE as argument to read options from FILE.\n"; -} +static void printHelp(StringRef ToolName, const SymbolizerOptTable &Tbl, + raw_ostream &OS) { + const char HelpText[] = " [options] addresses..."; + Tbl.PrintHelp(OS, (ToolName + HelpText).str().c_str(), + ToolName.str().c_str()); + // TODO Replace this with OptTable API once it adds extrahelp support. + OS << "\nPass @FILE as argument to read options from FILE.\n"; +} -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. - Tbl.setInitialOptionsFromEnvironment(IsAddr2Line ? "LLVM_ADDR2LINE_OPTS" - : "LLVM_SYMBOLIZER_OPTS"); - bool HasError = false; - opt::InputArgList Args = - Tbl.parseArgs(Argc, Argv, OPT_UNKNOWN, Saver, [&](StringRef Msg) { - errs() << ("error: " + Msg + "\n"); - HasError = true; - }); - if (HasError) - exit(1); - if (Args.hasArg(OPT_help)) { - printHelp(ToolName, Tbl, outs()); - exit(0); - } - if (Args.hasArg(OPT_version)) { - outs() << ToolName << '\n'; - cl::PrintVersionMessage(); - exit(0); - } +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. + Tbl.setInitialOptionsFromEnvironment(IsAddr2Line ? "LLVM_ADDR2LINE_OPTS" + : "LLVM_SYMBOLIZER_OPTS"); + bool HasError = false; + opt::InputArgList Args = + Tbl.parseArgs(Argc, Argv, OPT_UNKNOWN, Saver, [&](StringRef Msg) { + errs() << ("error: " + Msg + "\n"); + HasError = true; + }); + if (HasError) + exit(1); + if (Args.hasArg(OPT_help)) { + printHelp(ToolName, Tbl, outs()); + exit(0); + } + if (Args.hasArg(OPT_version)) { + outs() << ToolName << '\n'; + cl::PrintVersionMessage(); + exit(0); + } - return Args; -} - -template <typename T> -static void parseIntArg(const opt::InputArgList &Args, int ID, T &Value) { - if (const opt::Arg *A = Args.getLastArg(ID)) { - StringRef V(A->getValue()); - if (!llvm::to_integer(V, Value, 0)) { - errs() << A->getSpelling() + - ": expected a non-negative integer, but got '" + V + "'"; - exit(1); - } - } else { - Value = 0; + return Args; +} + +template <typename T> +static void parseIntArg(const opt::InputArgList &Args, int ID, T &Value) { + if (const opt::Arg *A = Args.getLastArg(ID)) { + StringRef V(A->getValue()); + if (!llvm::to_integer(V, Value, 0)) { + errs() << A->getSpelling() + + ": expected a non-negative integer, but got '" + V + "'"; + exit(1); + } + } else { + Value = 0; } -} +} -static FunctionNameKind decideHowToPrintFunctions(const opt::InputArgList &Args, - bool IsAddr2Line) { - if (Args.hasArg(OPT_functions)) - return FunctionNameKind::LinkageName; - if (const opt::Arg *A = Args.getLastArg(OPT_functions_EQ)) - return StringSwitch<FunctionNameKind>(A->getValue()) - .Case("none", FunctionNameKind::None) - .Case("short", FunctionNameKind::ShortName) - .Default(FunctionNameKind::LinkageName); - return IsAddr2Line ? FunctionNameKind::None : FunctionNameKind::LinkageName; -} +static FunctionNameKind decideHowToPrintFunctions(const opt::InputArgList &Args, + bool IsAddr2Line) { + if (Args.hasArg(OPT_functions)) + return FunctionNameKind::LinkageName; + if (const opt::Arg *A = Args.getLastArg(OPT_functions_EQ)) + return StringSwitch<FunctionNameKind>(A->getValue()) + .Case("none", FunctionNameKind::None) + .Case("short", FunctionNameKind::ShortName) + .Default(FunctionNameKind::LinkageName); + return IsAddr2Line ? FunctionNameKind::None : FunctionNameKind::LinkageName; +} -int main(int argc, char **argv) { - InitLLVM X(argc, argv); - sys::InitializeCOMRAII COM(sys::COMThreadingMode::MultiThreaded); +int main(int argc, char **argv) { + InitLLVM X(argc, argv); + sys::InitializeCOMRAII COM(sys::COMThreadingMode::MultiThreaded); + + bool IsAddr2Line = sys::path::stem(argv[0]).contains("addr2line"); + BumpPtrAllocator A; + StringSaver Saver(A); + SymbolizerOptTable Tbl; + opt::InputArgList Args = parseOptions(argc, argv, IsAddr2Line, Saver, Tbl); - bool IsAddr2Line = sys::path::stem(argv[0]).contains("addr2line"); - BumpPtrAllocator A; - StringSaver Saver(A); - SymbolizerOptTable Tbl; - opt::InputArgList Args = parseOptions(argc, argv, IsAddr2Line, Saver, Tbl); - LLVMSymbolizer::Options Opts; - uint64_t AdjustVMA; - unsigned SourceContextLines; - parseIntArg(Args, OPT_adjust_vma_EQ, AdjustVMA); - if (const opt::Arg *A = Args.getLastArg(OPT_basenames, OPT_relativenames)) { - Opts.PathStyle = - A->getOption().matches(OPT_basenames) - ? DILineInfoSpecifier::FileLineInfoKind::BaseNameOnly - : DILineInfoSpecifier::FileLineInfoKind::RelativeFilePath; - } else { - Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath; - } - Opts.DebugFileDirectory = Args.getAllArgValues(OPT_debug_file_directory_EQ); - Opts.DefaultArch = Args.getLastArgValue(OPT_default_arch_EQ).str(); - Opts.Demangle = Args.hasFlag(OPT_demangle, OPT_no_demangle, !IsAddr2Line); - Opts.DWPName = Args.getLastArgValue(OPT_dwp_EQ).str(); - Opts.FallbackDebugPath = - Args.getLastArgValue(OPT_fallback_debug_path_EQ).str(); - Opts.PrintFunctions = decideHowToPrintFunctions(Args, IsAddr2Line); - parseIntArg(Args, OPT_print_source_context_lines_EQ, SourceContextLines); - Opts.RelativeAddresses = Args.hasArg(OPT_relative_address); - Opts.UntagAddresses = - Args.hasFlag(OPT_untag_addresses, OPT_no_untag_addresses, !IsAddr2Line); - Opts.UseDIA = Args.hasArg(OPT_use_dia); -#if !defined(LLVM_ENABLE_DIA_SDK) - if (Opts.UseDIA) { - WithColor::warning() << "DIA not available; using native PDB reader\n"; - Opts.UseDIA = false; - } -#endif - Opts.UseSymbolTable = true; + uint64_t AdjustVMA; + unsigned SourceContextLines; + parseIntArg(Args, OPT_adjust_vma_EQ, AdjustVMA); + if (const opt::Arg *A = Args.getLastArg(OPT_basenames, OPT_relativenames)) { + Opts.PathStyle = + A->getOption().matches(OPT_basenames) + ? DILineInfoSpecifier::FileLineInfoKind::BaseNameOnly + : DILineInfoSpecifier::FileLineInfoKind::RelativeFilePath; + } else { + Opts.PathStyle = DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath; + } + Opts.DebugFileDirectory = Args.getAllArgValues(OPT_debug_file_directory_EQ); + Opts.DefaultArch = Args.getLastArgValue(OPT_default_arch_EQ).str(); + Opts.Demangle = Args.hasFlag(OPT_demangle, OPT_no_demangle, !IsAddr2Line); + Opts.DWPName = Args.getLastArgValue(OPT_dwp_EQ).str(); + Opts.FallbackDebugPath = + Args.getLastArgValue(OPT_fallback_debug_path_EQ).str(); + Opts.PrintFunctions = decideHowToPrintFunctions(Args, IsAddr2Line); + parseIntArg(Args, OPT_print_source_context_lines_EQ, SourceContextLines); + Opts.RelativeAddresses = Args.hasArg(OPT_relative_address); + Opts.UntagAddresses = + Args.hasFlag(OPT_untag_addresses, OPT_no_untag_addresses, !IsAddr2Line); + Opts.UseDIA = Args.hasArg(OPT_use_dia); +#if !defined(LLVM_ENABLE_DIA_SDK) + if (Opts.UseDIA) { + WithColor::warning() << "DIA not available; using native PDB reader\n"; + Opts.UseDIA = false; + } +#endif + Opts.UseSymbolTable = true; - for (const opt::Arg *A : Args.filtered(OPT_dsym_hint_EQ)) { - StringRef Hint(A->getValue()); - if (sys::path::extension(Hint) == ".dSYM") { - Opts.DsymHints.emplace_back(Hint); + for (const opt::Arg *A : Args.filtered(OPT_dsym_hint_EQ)) { + StringRef Hint(A->getValue()); + if (sys::path::extension(Hint) == ".dSYM") { + Opts.DsymHints.emplace_back(Hint); } else { - errs() << "Warning: invalid dSYM hint: \"" << Hint - << "\" (must have the '.dSYM' extension).\n"; + errs() << "Warning: invalid dSYM hint: \"" << Hint + << "\" (must have the '.dSYM' extension).\n"; } } - - auto OutputStyle = - IsAddr2Line ? DIPrinter::OutputStyle::GNU : DIPrinter::OutputStyle::LLVM; - if (const opt::Arg *A = Args.getLastArg(OPT_output_style_EQ)) { - OutputStyle = strcmp(A->getValue(), "GNU") == 0 - ? DIPrinter::OutputStyle::GNU - : DIPrinter::OutputStyle::LLVM; - } - + + auto OutputStyle = + IsAddr2Line ? DIPrinter::OutputStyle::GNU : DIPrinter::OutputStyle::LLVM; + if (const opt::Arg *A = Args.getLastArg(OPT_output_style_EQ)) { + OutputStyle = strcmp(A->getValue(), "GNU") == 0 + ? DIPrinter::OutputStyle::GNU + : DIPrinter::OutputStyle::LLVM; + } + LLVMSymbolizer Symbolizer(Opts); - DIPrinter Printer(outs(), Opts.PrintFunctions != FunctionNameKind::None, - Args.hasArg(OPT_pretty_print), SourceContextLines, - Args.hasArg(OPT_verbose), OutputStyle); + DIPrinter Printer(outs(), Opts.PrintFunctions != FunctionNameKind::None, + Args.hasArg(OPT_pretty_print), SourceContextLines, + Args.hasArg(OPT_verbose), OutputStyle); - std::vector<std::string> InputAddresses = Args.getAllArgValues(OPT_INPUT); - if (InputAddresses.empty()) { + std::vector<std::string> InputAddresses = Args.getAllArgValues(OPT_INPUT); + if (InputAddresses.empty()) { const int kMaxInputStringLength = 1024; char InputString[kMaxInputStringLength]; while (fgets(InputString, sizeof(InputString), stdin)) { // Strip newline characters. std::string StrippedInputString(InputString); - llvm::erase_if(StrippedInputString, - [](char c) { return c == '\r' || c == '\n'; }); - symbolizeInput(Args, AdjustVMA, IsAddr2Line, OutputStyle, - StrippedInputString, Symbolizer, Printer); + llvm::erase_if(StrippedInputString, + [](char c) { return c == '\r' || c == '\n'; }); + symbolizeInput(Args, AdjustVMA, IsAddr2Line, OutputStyle, + StrippedInputString, Symbolizer, Printer); outs().flush(); } } else { - for (StringRef Address : InputAddresses) - symbolizeInput(Args, AdjustVMA, IsAddr2Line, OutputStyle, Address, - Symbolizer, Printer); + for (StringRef Address : InputAddresses) + symbolizeInput(Args, AdjustVMA, IsAddr2Line, OutputStyle, Address, + Symbolizer, Printer); } return 0; diff --git a/contrib/libs/llvm12/tools/llvm-symbolizer/ya.make b/contrib/libs/llvm12/tools/llvm-symbolizer/ya.make index 1c060ecda0..1f13f78269 100644 --- a/contrib/libs/llvm12/tools/llvm-symbolizer/ya.make +++ b/contrib/libs/llvm12/tools/llvm-symbolizer/ya.make @@ -12,30 +12,30 @@ LICENSE(Apache-2.0 WITH LLVM-exception) LICENSE_TEXTS(.yandex_meta/licenses.list.txt) PEERDIR( - contrib/libs/llvm12 - contrib/libs/llvm12/include - contrib/libs/llvm12/lib/BinaryFormat - contrib/libs/llvm12/lib/Bitcode/Reader - contrib/libs/llvm12/lib/Bitstream/Reader - contrib/libs/llvm12/lib/DebugInfo/CodeView - contrib/libs/llvm12/lib/DebugInfo/DWARF - contrib/libs/llvm12/lib/DebugInfo/MSF - contrib/libs/llvm12/lib/DebugInfo/PDB - contrib/libs/llvm12/lib/DebugInfo/Symbolize - contrib/libs/llvm12/lib/Demangle - contrib/libs/llvm12/lib/IR - contrib/libs/llvm12/lib/MC - contrib/libs/llvm12/lib/MC/MCParser - contrib/libs/llvm12/lib/Object - contrib/libs/llvm12/lib/Option - contrib/libs/llvm12/lib/Remarks - contrib/libs/llvm12/lib/Support - contrib/libs/llvm12/lib/TextAPI/MachO + contrib/libs/llvm12 + contrib/libs/llvm12/include + contrib/libs/llvm12/lib/BinaryFormat + contrib/libs/llvm12/lib/Bitcode/Reader + contrib/libs/llvm12/lib/Bitstream/Reader + contrib/libs/llvm12/lib/DebugInfo/CodeView + contrib/libs/llvm12/lib/DebugInfo/DWARF + contrib/libs/llvm12/lib/DebugInfo/MSF + contrib/libs/llvm12/lib/DebugInfo/PDB + contrib/libs/llvm12/lib/DebugInfo/Symbolize + contrib/libs/llvm12/lib/Demangle + contrib/libs/llvm12/lib/IR + contrib/libs/llvm12/lib/MC + contrib/libs/llvm12/lib/MC/MCParser + contrib/libs/llvm12/lib/Object + contrib/libs/llvm12/lib/Option + contrib/libs/llvm12/lib/Remarks + contrib/libs/llvm12/lib/Support + contrib/libs/llvm12/lib/TextAPI/MachO ) ADDINCL( - ${ARCADIA_BUILD_ROOT}/contrib/libs/llvm12/tools/llvm-symbolizer - contrib/libs/llvm12/tools/llvm-symbolizer + ${ARCADIA_BUILD_ROOT}/contrib/libs/llvm12/tools/llvm-symbolizer + contrib/libs/llvm12/tools/llvm-symbolizer ) NO_COMPILER_WARNINGS() |