xref: /freebsd-src/contrib/llvm-project/lldb/source/Utility/Instrumentation.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
104eeddc0SDimitry Andric //===-- Instrumentation.cpp -----------------------------------------------===//
204eeddc0SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
304eeddc0SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
404eeddc0SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
504eeddc0SDimitry Andric //
604eeddc0SDimitry Andric //===----------------------------------------------------------------------===//
704eeddc0SDimitry Andric 
804eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
9*81ad6265SDimitry Andric #include "lldb/Utility/LLDBLog.h"
1004eeddc0SDimitry Andric #include "llvm/Support/Signposts.h"
1104eeddc0SDimitry Andric 
1204eeddc0SDimitry Andric #include <cstdio>
1304eeddc0SDimitry Andric #include <cstdlib>
1404eeddc0SDimitry Andric #include <limits>
1504eeddc0SDimitry Andric #include <thread>
1604eeddc0SDimitry Andric 
1704eeddc0SDimitry Andric using namespace lldb_private;
1804eeddc0SDimitry Andric using namespace lldb_private::instrumentation;
1904eeddc0SDimitry Andric 
2004eeddc0SDimitry Andric // Whether we're currently across the API boundary.
2104eeddc0SDimitry Andric static thread_local bool g_global_boundary = false;
2204eeddc0SDimitry Andric 
2304eeddc0SDimitry Andric // Instrument SB API calls with singposts when supported.
2404eeddc0SDimitry Andric static llvm::ManagedStatic<llvm::SignpostEmitter> g_api_signposts;
2504eeddc0SDimitry Andric 
Instrumenter(llvm::StringRef pretty_func,std::string && pretty_args)2604eeddc0SDimitry Andric Instrumenter::Instrumenter(llvm::StringRef pretty_func,
2704eeddc0SDimitry Andric                            std::string &&pretty_args)
28*81ad6265SDimitry Andric     : m_pretty_func(pretty_func) {
2904eeddc0SDimitry Andric   if (!g_global_boundary) {
3004eeddc0SDimitry Andric     g_global_boundary = true;
3104eeddc0SDimitry Andric     m_local_boundary = true;
3204eeddc0SDimitry Andric     g_api_signposts->startInterval(this, m_pretty_func);
3304eeddc0SDimitry Andric   }
34*81ad6265SDimitry Andric   LLDB_LOG(GetLog(LLDBLog::API), "[{0}] {1} ({2})",
3504eeddc0SDimitry Andric            m_local_boundary ? "external" : "internal", m_pretty_func,
3604eeddc0SDimitry Andric            pretty_args);
3704eeddc0SDimitry Andric }
3804eeddc0SDimitry Andric 
~Instrumenter()3904eeddc0SDimitry Andric Instrumenter::~Instrumenter() {
4004eeddc0SDimitry Andric   if (m_local_boundary) {
4104eeddc0SDimitry Andric     g_global_boundary = false;
4204eeddc0SDimitry Andric     g_api_signposts->endInterval(this, m_pretty_func);
4304eeddc0SDimitry Andric   }
4404eeddc0SDimitry Andric }
45