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 AndricInstrumenter::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 AndricInstrumenter::~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