Author: Jonas Devlieghere Date: 2021-01-06T15:16:09-08:00 New Revision: 6d94eeadd28af4d488b5875778a3ebfa0d749b52
URL: https://github.com/llvm/llvm-project/commit/6d94eeadd28af4d488b5875778a3ebfa0d749b52 DIFF: https://github.com/llvm/llvm-project/commit/6d94eeadd28af4d488b5875778a3ebfa0d749b52.diff LOG: [lldb] Ad os_signpost support to lldb_private::Timer Emit os_signposts when supported from LLDB's timer class. A vast amount of performance sensitive places in LLDB are already instrumented with the Timer class. By emitting signposts we can examine this information in Instruments. I recommend looking at Daniel's differential for why this is so powerful: https://reviews.llvm.org/D52954. Differential revision: https://reviews.llvm.org/D93657 Added: Modified: lldb/include/lldb/Utility/Timer.h lldb/source/Utility/Timer.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Utility/Timer.h b/lldb/include/lldb/Utility/Timer.h index 91f9c57c03c1..edc064b23b57 100644 --- a/lldb/include/lldb/Utility/Timer.h +++ b/lldb/include/lldb/Utility/Timer.h @@ -25,6 +25,7 @@ class Timer { class Category { public: explicit Category(const char *category_name); + llvm::StringRef GetName() { return m_name; } private: friend class Timer; diff --git a/lldb/source/Utility/Timer.cpp b/lldb/source/Utility/Timer.cpp index d55c9863117b..7ead51069529 100644 --- a/lldb/source/Utility/Timer.cpp +++ b/lldb/source/Utility/Timer.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "lldb/Utility/Timer.h" #include "lldb/Utility/Stream.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/Signposts.h" #include <algorithm> #include <map> @@ -28,6 +30,9 @@ typedef std::vector<Timer *> TimerStack; static std::atomic<Timer::Category *> g_categories; } // end of anonymous namespace +/// Allows llvm::Timer to emit signposts when supported. +static llvm::ManagedStatic<llvm::SignpostEmitter> Signposts; + std::atomic<bool> Timer::g_quiet(true); std::atomic<unsigned> Timer::g_display_depth(0); static std::mutex &GetFileMutex() { @@ -54,6 +59,7 @@ void Timer::SetQuiet(bool value) { g_quiet = value; } Timer::Timer(Timer::Category &category, const char *format, ...) : m_category(category), m_total_start(std::chrono::steady_clock::now()) { + Signposts->startInterval(this, m_category.GetName()); TimerStack &stack = GetTimerStackForCurrentThread(); stack.push_back(this); @@ -80,6 +86,8 @@ Timer::~Timer() { auto total_dur = stop_time - m_total_start; auto timer_dur = total_dur - m_child_duration; + Signposts->endInterval(this, m_category.GetName()); + TimerStack &stack = GetTimerStackForCurrentThread(); if (g_quiet && stack.size() <= g_display_depth) { std::lock_guard<std::mutex> lock(GetFileMutex()); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits