Skip to content

Commit

Permalink
[lldb] Instrument SB API with signposts
Browse files Browse the repository at this point in the history
Instrument the SB API with signposts on Darwin. This gives us a time
profile on whose behalf LLDB spends time (particularly when run via the
SBAPI from an IDE).

Differential revision: https://reviews.llvm.org/D117632
  • Loading branch information
JDevlieghere committed Jan 21, 2022
1 parent 1755f5b commit 156b997
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 6 deletions.
2 changes: 2 additions & 0 deletions lldb/include/lldb/Utility/Instrumentation.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ class Instrumenter {
private:
void UpdateBoundary();

llvm::StringRef m_pretty_func;

/// Whether this function call was the one crossing the API boundary.
bool m_local_boundary = false;
};
Expand Down
18 changes: 12 additions & 6 deletions lldb/source/Utility/Instrumentation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
//===----------------------------------------------------------------------===//

#include "lldb/Utility/Instrumentation.h"
#include "llvm/Support/Signposts.h"

#include <cstdio>
#include <cstdlib>
#include <limits>
Expand All @@ -17,21 +19,25 @@ using namespace lldb_private::instrumentation;
// Whether we're currently across the API boundary.
static thread_local bool g_global_boundary = false;

// Instrument SB API calls with singposts when supported.
static llvm::ManagedStatic<llvm::SignpostEmitter> g_api_signposts;

Instrumenter::Instrumenter(llvm::StringRef pretty_func,
std::string &&pretty_args)
: m_local_boundary(false) {
: m_pretty_func(pretty_func), m_local_boundary(false) {
if (!g_global_boundary) {
g_global_boundary = true;
m_local_boundary = true;
g_api_signposts->startInterval(this, m_pretty_func);
}
LLDB_LOG(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API), "[{0}] {1} ({2})",
m_local_boundary ? "external" : "internal", pretty_func,
m_local_boundary ? "external" : "internal", m_pretty_func,
pretty_args);
}

Instrumenter::~Instrumenter() { UpdateBoundary(); }

void Instrumenter::UpdateBoundary() {
if (m_local_boundary)
Instrumenter::~Instrumenter() {
if (m_local_boundary) {
g_global_boundary = false;
g_api_signposts->endInterval(this, m_pretty_func);
}
}

0 comments on commit 156b997

Please sign in to comment.