Author: Vy Nguyen Date: 2025-02-18T10:44:16-05:00 New Revision: e1a393e39275ca0fea4bb19fa08c88bae3178cf8
URL: https://github.com/llvm/llvm-project/commit/e1a393e39275ca0fea4bb19fa08c88bae3178cf8 DIFF: https://github.com/llvm/llvm-project/commit/e1a393e39275ca0fea4bb19fa08c88bae3178cf8.diff LOG: Define Telemetry plugin for LLDB. (#126588) Details: Make LLDB's TelemetryManager a "plugin" so that vendor can supply appropriate implementation. The rest of LLDB code will simply call `TelemetryManager::getInstance` --------- Co-authored-by: Pavel Labath <pa...@labath.sk> Added: lldb/unittests/Core/TelemetryTest.cpp Modified: lldb/include/lldb/Core/Telemetry.h lldb/source/Core/Telemetry.cpp lldb/unittests/Core/CMakeLists.txt Removed: ################################################################################ diff --git a/lldb/include/lldb/Core/Telemetry.h b/lldb/include/lldb/Core/Telemetry.h index 60a7097de5eee..7923b208e3b48 100644 --- a/lldb/include/lldb/Core/Telemetry.h +++ b/lldb/include/lldb/Core/Telemetry.h @@ -61,12 +61,19 @@ struct LLDBBaseTelemetryInfo : public llvm::telemetry::TelemetryInfo { /// applicable to LLDB. class TelemetryManager : public llvm::telemetry::Manager { public: + llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override; + + virtual llvm::StringRef GetInstanceName() const = 0; + static TelemetryManager *getInstance(); + +protected: TelemetryManager(std::unique_ptr<llvm::telemetry::Config> config); - llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override; + static void setInstance(std::unique_ptr<TelemetryManager> manger); private: std::unique_ptr<llvm::telemetry::Config> m_config; + static std::unique_ptr<TelemetryManager> g_instance; }; } // namespace telemetry diff --git a/lldb/source/Core/Telemetry.cpp b/lldb/source/Core/Telemetry.cpp index 0d0d7c1df3bb9..f2a9d4bd00dad 100644 --- a/lldb/source/Core/Telemetry.cpp +++ b/lldb/source/Core/Telemetry.cpp @@ -70,6 +70,13 @@ llvm::Error TelemetryManager::preDispatch(TelemetryInfo *entry) { return Error::success(); } +std::unique_ptr<TelemetryManager> TelemetryManager::g_instance = nullptr; +TelemetryManager *TelemetryManager::getInstance() { return g_instance.get(); } + +void TelemetryManager::setInstance(std::unique_ptr<TelemetryManager> manager) { + g_instance = std::move(manager); +} + } // namespace telemetry } // namespace lldb_private diff --git a/lldb/unittests/Core/CMakeLists.txt b/lldb/unittests/Core/CMakeLists.txt index 949963fd40346..d4d3764b67ae3 100644 --- a/lldb/unittests/Core/CMakeLists.txt +++ b/lldb/unittests/Core/CMakeLists.txt @@ -1,3 +1,7 @@ +if (LLVM_BUILD_TELEMETRY) + set(TELEMETRY_DEPS Telemetry) +endif() + add_lldb_unittest(LLDBCoreTests CommunicationTest.cpp DiagnosticEventTest.cpp @@ -10,6 +14,7 @@ add_lldb_unittest(LLDBCoreTests RichManglingContextTest.cpp SourceLocationSpecTest.cpp SourceManagerTest.cpp + TelemetryTest.cpp UniqueCStringMapTest.cpp LINK_LIBS @@ -26,4 +31,5 @@ add_lldb_unittest(LLDBCoreTests LLVMTestingSupport LINK_COMPONENTS Support + ${TELEMETRY_DEPS} ) diff --git a/lldb/unittests/Core/TelemetryTest.cpp b/lldb/unittests/Core/TelemetryTest.cpp new file mode 100644 index 0000000000000..03bd8a59ba7dc --- /dev/null +++ b/lldb/unittests/Core/TelemetryTest.cpp @@ -0,0 +1,98 @@ +//===-- TelemetryTest.cpp ------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/Config/llvm-config.h" + +#ifdef LLVM_BUILD_TELEMETRY + +#include "lldb/Core/PluginInterface.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/Core/Telemetry.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/Support/Error.h" +#include "llvm/Telemetry/Telemetry.h" +#include "llvm/Testing/Support/Error.h" +#include "gtest/gtest.h" +#include <memory> +#include <vector> + +namespace lldb_private { + +struct FakeTelemetryInfo : public llvm::telemetry::TelemetryInfo { + std::string msg; +}; + +class TestDestination : public llvm::telemetry::Destination { +public: + TestDestination(std::vector<const llvm::telemetry::TelemetryInfo *> *entries) + : received_entries(entries) {} + + llvm::Error + receiveEntry(const llvm::telemetry::TelemetryInfo *entry) override { + received_entries->push_back(entry); + return llvm::Error::success(); + } + + llvm::StringLiteral name() const override { return "TestDestination"; } + +private: + std::vector<const llvm::telemetry::TelemetryInfo *> *received_entries; +}; + +class FakePlugin : public telemetry::TelemetryManager { +public: + FakePlugin() + : telemetry::TelemetryManager( + std::make_unique<llvm::telemetry::Config>(true)) {} + + // TelemetryManager interface + llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override { + if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(entry)) + fake_entry->msg = "In FakePlugin"; + + return llvm::Error::success(); + } + + llvm::StringRef GetInstanceName() const override { + return "FakeTelemetryPlugin"; + } + + static void Initialize() { + telemetry::TelemetryManager::setInstance(std::make_unique<FakePlugin>()); + } + + static void Terminate() { telemetry::TelemetryManager::setInstance(nullptr); } +}; + +} // namespace lldb_private + +TEST(TelemetryTest, PluginTest) { + // This would have been called by the plugin reg in a "real" plugin + // For tests, we just call it directly. + lldb_private::FakePlugin::Initialize(); + + auto *ins = lldb_private::telemetry::TelemetryManager::getInstance(); + ASSERT_NE(ins, nullptr); + + std::vector<const ::llvm::telemetry::TelemetryInfo *> expected_entries; + ins->addDestination( + std::make_unique<lldb_private::TestDestination>(&expected_entries)); + + lldb_private::FakeTelemetryInfo entry; + entry.msg = ""; + + ASSERT_THAT_ERROR(ins->dispatch(&entry), ::llvm::Succeeded()); + ASSERT_EQ(1, expected_entries.size()); + EXPECT_EQ("In FakePlugin", + llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(expected_entries[0]) + ->msg); + + ASSERT_EQ("FakeTelemetryPlugin", ins->GetInstanceName()); +} + +#endif // LLVM_BUILD_TELEMETRY _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits