mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-12 18:02:43 +00:00
[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
This commit is contained in:
parent
b37de2afa3
commit
6d94eeadd2
@ -25,6 +25,7 @@ public:
|
||||
class Category {
|
||||
public:
|
||||
explicit Category(const char *category_name);
|
||||
llvm::StringRef GetName() { return m_name; }
|
||||
|
||||
private:
|
||||
friend class Timer;
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user