[Lldb-commits] [lldb] [llvm] [lldb] Add HTTP support in SymbolLocatorSymStore (PR #186986)
Stefan Gränitz via lldb-commits
lldb-commits at lists.llvm.org
Wed Mar 18 03:30:43 PDT 2026
================
@@ -95,20 +102,124 @@ SymbolLocator *SymbolLocatorSymStore::CreateInstance() {
return new SymbolLocatorSymStore();
}
+namespace {
+
// RSDS entries store identity as a 20-byte UUID composed of 16-byte GUID and
// 4-byte age:
// 12345678-1234-5678-9ABC-DEF012345678-00000001
//
// SymStore key is a string with no separators and age as decimal:
// 12345678123456789ABCDEF0123456781
//
-static std::string formatSymStoreKey(const UUID &uuid) {
+std::string formatSymStoreKey(const UUID &uuid) {
llvm::ArrayRef<uint8_t> bytes = uuid.GetBytes();
uint32_t age = llvm::support::endian::read32be(bytes.data() + 16);
constexpr bool LowerCase = false;
return llvm::toHex(bytes.slice(0, 16), LowerCase) + std::to_string(age);
}
+// This is a simple version of Debuginfod's StreamedHTTPResponseHandler. We
+// should consider reusing that once we introduce caching.
+class FileDownloadHandler : public llvm::HTTPResponseHandler {
+private:
+ std::error_code m_ec;
+ llvm::raw_fd_ostream m_stream;
+
+public:
+ FileDownloadHandler(llvm::StringRef file) : m_stream(file.str(), m_ec) {}
+ virtual ~FileDownloadHandler() = default;
+
+ llvm::Error handleBodyChunk(llvm::StringRef data) override {
+ // Propagate error from ctor
+ if (m_ec)
+ return llvm::createStringError(m_ec, "Failed to open file for writing");
+ m_stream.write(data.data(), data.size());
+ if (std::error_code ec = m_stream.error())
+ return llvm::createStringError(ec, "Error writing to file");
+
+ return llvm::Error::success();
+ }
+};
+
+llvm::Error downloadFileHTTP(llvm::StringRef url, FileDownloadHandler dest) {
+ if (!llvm::HTTPClient::isAvailable())
+ return llvm::createStringError(
+ std::make_error_code(std::errc::not_supported),
+ "HTTP client is not available");
+ llvm::HTTPRequest Request(url);
+ Request.FollowRedirects = true;
+
+ llvm::HTTPClient Client;
+ Client.setTimeout(std::chrono::seconds(60));
----------------
weliveindetail wrote:
Yes, I agree, but I don't want to bundle more than necessary into this patch. Can I do it in a separate PR? There are more related topics like progress visualization.
https://github.com/llvm/llvm-project/pull/186986
More information about the lldb-commits
mailing list