#ifndef LLDB_UTILITY_TIMER_H
#define LLDB_UTILITY_TIMER_H
-#include "llvm/ADT/ScopeExit.h"
+#include "lldb/lldb-defines.h"
#include "llvm/Support/Chrono.h"
-#include "llvm/Support/Signposts.h"
#include <atomic>
#include <cstdint>
-namespace llvm {
- class SignpostEmitter;
-}
-
namespace lldb_private {
class Stream;
const Timer &operator=(const Timer &) = delete;
};
-llvm::SignpostEmitter &GetSignposts();
-
} // namespace lldb_private
// Use a format string because LLVM_PRETTY_FUNCTION might not be a string
// literal.
#define LLDB_SCOPED_TIMER() \
static ::lldb_private::Timer::Category _cat(LLVM_PRETTY_FUNCTION); \
- ::lldb_private::Timer _scoped_timer(_cat, "%s", LLVM_PRETTY_FUNCTION); \
- SIGNPOST_EMITTER_START_INTERVAL(::lldb_private::GetSignposts(), \
- &_scoped_timer, "%s", LLVM_PRETTY_FUNCTION); \
- auto _scoped_signpost = llvm::make_scope_exit([&_scoped_timer]() { \
- ::lldb_private::GetSignposts().endInterval(&_scoped_timer); \
- })
-
-#define LLDB_SCOPED_TIMERF(FMT, ...) \
+ ::lldb_private::Timer _scoped_timer(_cat, "%s", LLVM_PRETTY_FUNCTION)
+#define LLDB_SCOPED_TIMERF(...) \
static ::lldb_private::Timer::Category _cat(LLVM_PRETTY_FUNCTION); \
- ::lldb_private::Timer _scoped_timer(_cat, FMT, __VA_ARGS__); \
- SIGNPOST_EMITTER_START_INTERVAL(::lldb_private::GetSignposts(), \
- &_scoped_timer, FMT, __VA_ARGS__); \
- auto _scoped_signpost = llvm::make_scope_exit([&_scoped_timer]() { \
- ::lldb_private::GetSignposts().endInterval(&_scoped_timer); \
- })
+ ::lldb_private::Timer _scoped_timer(_cat, __VA_ARGS__)
#endif // LLDB_UTILITY_TIMER_H
#include "lldb/Core/Section.h"
#include "lldb/Core/StreamFile.h"
#include "lldb/Host/Host.h"
-#include "lldb/Host/SafeMachO.h"
#include "lldb/Symbol/DWARFCallFrameInfo.h"
#include "lldb/Symbol/LocateSymbolFile.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Utility/Timer.h"
#include "lldb/Utility/UUID.h"
+#include "lldb/Host/SafeMachO.h"
+
#include "llvm/ADT/DenseSet.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/MemoryBuffer.h"
#include <bitset>
#include <memory>
-#if LLVM_SUPPORT_XCODE_SIGNPOSTS
// Unfortunately the signpost header pulls in the system MachO header, too.
+#ifdef CPU_TYPE_ARM
#undef CPU_TYPE_ARM
+#endif
+#ifdef CPU_TYPE_ARM64
#undef CPU_TYPE_ARM64
+#endif
+#ifdef CPU_TYPE_ARM64_32
#undef CPU_TYPE_ARM64_32
+#endif
+#ifdef CPU_TYPE_I386
#undef CPU_TYPE_I386
+#endif
+#ifdef CPU_TYPE_X86_64
#undef CPU_TYPE_X86_64
-#undef MH_BINDATLOAD
-#undef MH_BUNDLE
-#undef MH_CIGAM
-#undef MH_CIGAM_64
-#undef MH_CORE
-#undef MH_DSYM
-#undef MH_DYLDLINK
-#undef MH_DYLIB
-#undef MH_DYLIB_STUB
-#undef MH_DYLINKER
+#endif
+#ifdef MH_DYLINKER
#undef MH_DYLINKER
-#undef MH_EXECUTE
-#undef MH_FVMLIB
-#undef MH_INCRLINK
-#undef MH_KEXT_BUNDLE
-#undef MH_MAGIC
-#undef MH_MAGIC_64
-#undef MH_NOUNDEFS
-#undef MH_OBJECT
+#endif
+#ifdef MH_OBJECT
#undef MH_OBJECT
-#undef MH_PRELOAD
-
-#undef LC_BUILD_VERSION
+#endif
+#ifdef LC_VERSION_MIN_MACOSX
#undef LC_VERSION_MIN_MACOSX
+#endif
+#ifdef LC_VERSION_MIN_IPHONEOS
#undef LC_VERSION_MIN_IPHONEOS
+#endif
+#ifdef LC_VERSION_MIN_TVOS
#undef LC_VERSION_MIN_TVOS
+#endif
+#ifdef LC_VERSION_MIN_WATCHOS
#undef LC_VERSION_MIN_WATCHOS
-
+#endif
+#ifdef LC_BUILD_VERSION
+#undef LC_BUILD_VERSION
+#endif
+#ifdef PLATFORM_MACOS
#undef PLATFORM_MACOS
+#endif
+#ifdef PLATFORM_MACCATALYST
#undef PLATFORM_MACCATALYST
+#endif
+#ifdef PLATFORM_IOS
#undef PLATFORM_IOS
+#endif
+#ifdef PLATFORM_IOSSIMULATOR
#undef PLATFORM_IOSSIMULATOR
+#endif
+#ifdef PLATFORM_TVOS
#undef PLATFORM_TVOS
+#endif
+#ifdef PLATFORM_TVOSSIMULATOR
#undef PLATFORM_TVOSSIMULATOR
+#endif
+#ifdef PLATFORM_WATCHOS
#undef PLATFORM_WATCHOS
+#endif
+#ifdef PLATFORM_WATCHOSSIMULATOR
#undef PLATFORM_WATCHOSSIMULATOR
#endif
#include "lldb/Host/FileSystem.h"
#include "lldb/Utility/RangeMap.h"
#include "lldb/Utility/RegularExpression.h"
+#include "lldb/Utility/Timer.h"
//#define DEBUG_OSO_DMAP // DO NOT CHECKIN WITH THIS NOT COMMENTED OUT
#if defined(DEBUG_OSO_DMAP)
#include "LogChannelDWARF.h"
#include "SymbolFileDWARF.h"
-// Work around the fact that Timer.h pulls in the system Mach-O headers.
-#include "lldb/Utility/Timer.h"
-
#include <memory>
using namespace lldb;
/// Allows llvm::Timer to emit signposts when supported.
static llvm::ManagedStatic<llvm::SignpostEmitter> Signposts;
-llvm::SignpostEmitter &lldb_private::GetSignposts() { return *Signposts; }
-
std::atomic<bool> Timer::g_quiet(true);
std::atomic<unsigned> Timer::g_display_depth(0);
static std::mutex &GetFileMutex() {
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);
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());
/* Define to the default GlobalISel coverage file prefix */
#cmakedefine LLVM_GISEL_COV_PREFIX "${LLVM_GISEL_COV_PREFIX}"
+/* Whether Timers signpost passes in Xcode Instruments */
+#cmakedefine01 LLVM_SUPPORT_XCODE_SIGNPOSTS
+
#cmakedefine HAVE_PROC_PID_RUSAGE 1
#endif
/* Define if the xar_open() function is supported on this platform. */
#cmakedefine LLVM_HAVE_LIBXAR ${LLVM_HAVE_LIBXAR}
-/* Whether Timers signpost passes in Xcode Instruments */
-#cmakedefine01 LLVM_SUPPORT_XCODE_SIGNPOSTS
-
-
#endif
#define LLVM_SUPPORT_SIGNPOSTS_H
#include "llvm/ADT/StringRef.h"
-#include "llvm/Config/llvm-config.h"
#include <memory>
-#if LLVM_SUPPORT_XCODE_SIGNPOSTS
-#include <Availability.h>
-#include <os/signpost.h>
-#endif
-
-#define SIGNPOSTS_AVAILABLE() \
- __builtin_available(macos 10.14, iOS 12, tvOS 12, watchOS 5, *)
-
namespace llvm {
class SignpostEmitterImpl;
/// Begin a signposted interval for a given object.
void startInterval(const void *O, StringRef Name);
-
-#if LLVM_SUPPORT_XCODE_SIGNPOSTS
- os_log_t &getLogger() const;
- os_signpost_id_t getSignpostForObject(const void *O);
-#endif
-
- /// A macro to take advantage of the special format string handling
- /// in the os_signpost API. The format string substitution is
- /// deferred to the log consumer and done outside of the
- /// application.
-#if LLVM_SUPPORT_XCODE_SIGNPOSTS
-#define SIGNPOST_EMITTER_START_INTERVAL(SIGNPOST_EMITTER, O, ...) \
- do { \
- if ((SIGNPOST_EMITTER).isEnabled()) \
- if (SIGNPOSTS_AVAILABLE()) \
- os_signpost_interval_begin((SIGNPOST_EMITTER).getLogger(), \
- (SIGNPOST_EMITTER).getSignpostForObject(O), \
- "LLVM Timers", __VA_ARGS__); \
- } while (0)
-#else
-#define SIGNPOST_EMITTER_START_INTERVAL(SIGNPOST_EMITTER, O, ...) \
- do { \
- } while (0)
-#endif
-
/// End a signposted interval for a given object.
- void endInterval(const void *O);
+ void endInterval(const void *O, StringRef Name);
};
} // end namespace llvm
#include "llvm/Support/Signposts.h"
#include "llvm/Support/Timer.h"
+#include "llvm/Config/config.h"
#if LLVM_SUPPORT_XCODE_SIGNPOSTS
#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/Mutex.h"
-#endif
+#include <Availability.h>
+#include <os/signpost.h>
+#endif // if LLVM_SUPPORT_XCODE_SIGNPOSTS
using namespace llvm;
#if LLVM_SUPPORT_XCODE_SIGNPOSTS
+#define SIGNPOSTS_AVAILABLE() \
+ __builtin_available(macos 10.14, iOS 12, tvOS 12, watchOS 5, *)
namespace {
os_log_t *LogCreator() {
os_log_t *X = new os_log_t;
namespace llvm {
class SignpostEmitterImpl {
using LogPtrTy = std::unique_ptr<os_log_t, LogDeleter>;
+ using LogTy = LogPtrTy::element_type;
LogPtrTy SignpostLog;
DenseMap<const void *, os_signpost_id_t> Signposts;
sys::SmartMutex<true> Mutex;
-public:
- os_log_t &getLogger() const { return *SignpostLog; }
+ LogTy &getLogger() const { return *SignpostLog; }
os_signpost_id_t getSignpostForObject(const void *O) {
sys::SmartScopedLock<true> Lock(Mutex);
const auto &I = Signposts.find(O);
return Inserted.first->second;
}
+public:
SignpostEmitterImpl() : SignpostLog(LogCreator()) {}
bool isEnabled() const {
}
}
- void endInterval(const void *O) {
+ void endInterval(const void *O, llvm::StringRef Name) {
if (isEnabled()) {
if (SIGNPOSTS_AVAILABLE()) {
// Both strings used here are required to be constant literal strings.
#endif // if !HAVE_ANY_SIGNPOST_IMPL
}
-#if HAVE_ANY_SIGNPOST_IMPL
-os_log_t &SignpostEmitter::getLogger() const { return Impl->getLogger(); }
-os_signpost_id_t SignpostEmitter::getSignpostForObject(const void *O) {
- return Impl->getSignpostForObject(O);
-}
-#endif
-
-void SignpostEmitter::endInterval(const void *O) {
+void SignpostEmitter::endInterval(const void *O, StringRef Name) {
#if HAVE_ANY_SIGNPOST_IMPL
if (Impl == nullptr)
return;
- Impl->endInterval(O);
+ Impl->endInterval(O, Name);
#endif // if !HAVE_ANY_SIGNPOST_IMPL
}
Running = false;
Time += TimeRecord::getCurrentTime(false);
Time -= StartTime;
- Signposts->endInterval(this);
+ Signposts->endInterval(this, getName());
}
void Timer::clear() {