aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
diff options
context:
space:
mode:
authorDaniel Thornburgh <dthorn@google.com>2022-08-23 13:39:33 -0700
committerDaniel Thornburgh <dthorn@google.com>2022-09-28 13:35:35 -0700
commite61d89efd78b17f4969c9a394f480367307c7132 (patch)
tree2802a1819697f1f4ec0909ec2a44e7769947d7e5 /llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
parent97f919820b075fe49393405bf0ea990cf820ffeb (diff)
downloadllvm-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.cpp30
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)