diff options
author | Daniel Thornburgh <dthorn@google.com> | 2022-08-23 13:39:33 -0700 |
---|---|---|
committer | Daniel Thornburgh <dthorn@google.com> | 2022-09-28 13:35:35 -0700 |
commit | e61d89efd78b17f4969c9a394f480367307c7132 (patch) | |
tree | 2802a1819697f1f4ec0909ec2a44e7769947d7e5 /llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | |
parent | 97f919820b075fe49393405bf0ea990cf820ffeb (diff) | |
download | llvm-e61d89efd78b17f4969c9a394f480367307c7132.zip llvm-e61d89efd78b17f4969c9a394f480367307c7132.tar.gz llvm-e61d89efd78b17f4969c9a394f480367307c7132.tar.bz2 |
[NFC] [Object] Create library to fetch debug info by build ID.
This creates a library for fetching debug info by build ID, whether
locally or remotely via debuginfod. The functionality was refactored
out of existing code in the Symboliize library. Existing utilities
were refactored to use this library.
Reviewed By: phosek
Differential Revision: https://reviews.llvm.org/D132504
Diffstat (limited to 'llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp')
-rw-r--r-- | llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index 138b069..a59364a 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -23,7 +23,7 @@ #include "llvm/DebugInfo/Symbolize/MarkupFilter.h" #include "llvm/DebugInfo/Symbolize/SymbolizableModule.h" #include "llvm/DebugInfo/Symbolize/Symbolize.h" -#include "llvm/Debuginfod/DIFetcher.h" +#include "llvm/Debuginfod/BuildIDFetcher.h" #include "llvm/Debuginfod/Debuginfod.h" #include "llvm/Debuginfod/HTTPClient.h" #include "llvm/Option/Arg.h" @@ -109,30 +109,31 @@ enum class Command { Frame, }; -static void enableDebuginfod(LLVMSymbolizer &Symbolizer) { +static void enableDebuginfod(LLVMSymbolizer &Symbolizer, + const opt::ArgList &Args) { static bool IsEnabled = false; if (IsEnabled) return; IsEnabled = true; // Look up symbols using the debuginfod client. - Symbolizer.addDIFetcher(std::make_unique<DebuginfodDIFetcher>()); + Symbolizer.setBuildIDFetcher(std::make_unique<DebuginfodFetcher>( + Args.getAllArgValues(OPT_debug_file_directory_EQ))); // The HTTPClient must be initialized for use by the debuginfod client. HTTPClient::initialize(); } -static SmallVector<uint8_t> parseBuildID(StringRef Str) { +static object::BuildID parseBuildID(StringRef Str) { std::string Bytes; if (!tryGetFromHex(Str, Bytes)) return {}; ArrayRef<uint8_t> BuildID(reinterpret_cast<const uint8_t *>(Bytes.data()), Bytes.size()); - return SmallVector<uint8_t>(BuildID.begin(), BuildID.end()); + return object::BuildID(BuildID.begin(), BuildID.end()); } static bool parseCommand(StringRef BinaryName, bool IsAddr2Line, StringRef InputString, Command &Cmd, - std::string &ModuleName, - SmallVectorImpl<uint8_t> &BuildID, + std::string &ModuleName, object::BuildID &BuildID, uint64_t &ModuleOffset) { const char kDelimiters[] = " \n\r"; ModuleName = ""; @@ -249,13 +250,13 @@ void executeCommand(StringRef ModuleName, const T &ModuleSpec, Command Cmd, } static void symbolizeInput(const opt::InputArgList &Args, - ArrayRef<uint8_t> IncomingBuildID, + object::BuildIDRef IncomingBuildID, uint64_t AdjustVMA, bool IsAddr2Line, OutputStyle Style, StringRef InputString, LLVMSymbolizer &Symbolizer, DIPrinter &Printer) { Command Cmd; std::string ModuleName; - SmallVector<uint8_t> BuildID(IncomingBuildID.begin(), IncomingBuildID.end()); + object::BuildID BuildID(IncomingBuildID.begin(), IncomingBuildID.end()); uint64_t Offset = 0; if (!parseCommand(Args.getLastArgValue(OPT_obj_EQ), IsAddr2Line, StringRef(InputString), Cmd, ModuleName, BuildID, Offset)) { @@ -266,7 +267,7 @@ static void symbolizeInput(const opt::InputArgList &Args, if (!BuildID.empty()) { assert(ModuleName.empty()); if (!Args.hasArg(OPT_no_debuginfod)) - enableDebuginfod(Symbolizer); + enableDebuginfod(Symbolizer, Args); std::string BuildIDStr = toHex(BuildID); executeCommand(BuildIDStr, BuildID, Cmd, Offset, AdjustVMA, ShouldInline, Style, Symbolizer, Printer); @@ -351,14 +352,13 @@ static Optional<bool> parseColorArg(const opt::InputArgList &Args) { return None; } -static SmallVector<uint8_t> parseBuildIDArg(const opt::InputArgList &Args, - int ID) { +static object::BuildID parseBuildIDArg(const opt::InputArgList &Args, int ID) { const opt::Arg *A = Args.getLastArg(ID); if (!A) return {}; StringRef V(A->getValue()); - SmallVector<uint8_t> BuildID = parseBuildID(V); + object::BuildID BuildID = parseBuildID(V); if (BuildID.empty()) { errs() << A->getSpelling() + ": expected a build ID, but got '" + V + "'\n"; exit(1); @@ -447,7 +447,7 @@ int main(int argc, char **argv) { !ExitOnErr(getDefaultDebuginfodUrls()).empty(); if (Args.hasFlag(OPT_debuginfod, OPT_no_debuginfod, ShouldUseDebuginfodByDefault)) - enableDebuginfod(Symbolizer); + enableDebuginfod(Symbolizer, Args); if (Args.hasArg(OPT_filter_markup)) { filterMarkup(Args, Symbolizer); @@ -468,7 +468,7 @@ int main(int argc, char **argv) { errs() << "error: cannot specify both --build-id and --obj\n"; return EXIT_FAILURE; } - SmallVector<uint8_t> BuildID = parseBuildIDArg(Args, OPT_build_id_EQ); + object::BuildID BuildID = parseBuildIDArg(Args, OPT_build_id_EQ); std::unique_ptr<DIPrinter> Printer; if (Style == OutputStyle::GNU) |