diff --git a/lldb/include/lldb/Utility/Timer.h b/lldb/include/lldb/Utility/Timer.h index c70c18049426..201378bbeb2c 100644 --- a/lldb/include/lldb/Utility/Timer.h +++ b/lldb/include/lldb/Utility/Timer.h @@ -9,16 +9,11 @@ #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 #include -namespace llvm { - class SignpostEmitter; -} - namespace lldb_private { class Stream; @@ -81,28 +76,15 @@ private: 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 diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index ff8e60df393f..b3892b016c2e 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -21,7 +21,6 @@ #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" @@ -44,6 +43,8 @@ #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" @@ -65,48 +66,65 @@ #include #include -#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 +#endif +#ifdef MH_DYLINKER #undef 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 +#endif +#ifdef MH_OBJECT #undef 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 diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 35ce2bc5c39e..64532139855a 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -16,6 +16,7 @@ #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) @@ -33,9 +34,6 @@ #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 using namespace lldb; diff --git a/lldb/source/Utility/Timer.cpp b/lldb/source/Utility/Timer.cpp index b59ce3b9f556..2f3afe4c8703 100644 --- a/lldb/source/Utility/Timer.cpp +++ b/lldb/source/Utility/Timer.cpp @@ -33,8 +33,6 @@ static std::atomic g_categories; /// Allows llvm::Timer to emit signposts when supported. static llvm::ManagedStatic Signposts; -llvm::SignpostEmitter &lldb_private::GetSignposts() { return *Signposts; } - std::atomic Timer::g_quiet(true); std::atomic Timer::g_display_depth(0); static std::mutex &GetFileMutex() { @@ -61,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); @@ -87,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 lock(GetFileMutex()); diff --git a/llvm/include/llvm/Config/config.h.cmake b/llvm/include/llvm/Config/config.h.cmake index d7cd44b5db36..37a0d234844d 100644 --- a/llvm/include/llvm/Config/config.h.cmake +++ b/llvm/include/llvm/Config/config.h.cmake @@ -353,6 +353,9 @@ /* 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 diff --git a/llvm/include/llvm/Config/llvm-config.h.cmake b/llvm/include/llvm/Config/llvm-config.h.cmake index 82a979411209..169f59695e5e 100644 --- a/llvm/include/llvm/Config/llvm-config.h.cmake +++ b/llvm/include/llvm/Config/llvm-config.h.cmake @@ -100,8 +100,4 @@ /* 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 diff --git a/llvm/include/llvm/Support/Signposts.h b/llvm/include/llvm/Support/Signposts.h index e352bbd4e25c..dabbba6f89d1 100644 --- a/llvm/include/llvm/Support/Signposts.h +++ b/llvm/include/llvm/Support/Signposts.h @@ -17,17 +17,8 @@ #define LLVM_SUPPORT_SIGNPOSTS_H #include "llvm/ADT/StringRef.h" -#include "llvm/Config/llvm-config.h" #include -#if LLVM_SUPPORT_XCODE_SIGNPOSTS -#include -#include -#endif - -#define SIGNPOSTS_AVAILABLE() \ - __builtin_available(macos 10.14, iOS 12, tvOS 12, watchOS 5, *) - namespace llvm { class SignpostEmitterImpl; @@ -44,33 +35,8 @@ public: /// 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 diff --git a/llvm/lib/Support/Signposts.cpp b/llvm/lib/Support/Signposts.cpp index 09df0220fb21..58fafb26cdf3 100644 --- a/llvm/lib/Support/Signposts.cpp +++ b/llvm/lib/Support/Signposts.cpp @@ -9,14 +9,19 @@ #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 +#include +#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; @@ -34,13 +39,13 @@ struct LogDeleter { namespace llvm { class SignpostEmitterImpl { using LogPtrTy = std::unique_ptr; + using LogTy = LogPtrTy::element_type; LogPtrTy SignpostLog; DenseMap Signposts; sys::SmartMutex Mutex; -public: - os_log_t &getLogger() const { return *SignpostLog; } + LogTy &getLogger() const { return *SignpostLog; } os_signpost_id_t getSignpostForObject(const void *O) { sys::SmartScopedLock Lock(Mutex); const auto &I = Signposts.find(O); @@ -54,6 +59,7 @@ public: return Inserted.first->second; } +public: SignpostEmitterImpl() : SignpostLog(LogCreator()) {} bool isEnabled() const { @@ -72,7 +78,7 @@ public: } } - 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. @@ -118,17 +124,10 @@ void SignpostEmitter::startInterval(const void *O, StringRef Name) { #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 } diff --git a/llvm/lib/Support/Timer.cpp b/llvm/lib/Support/Timer.cpp index f025ecd3d45c..d69199133f6a 100644 --- a/llvm/lib/Support/Timer.cpp +++ b/llvm/lib/Support/Timer.cpp @@ -199,7 +199,7 @@ void Timer::stopTimer() { Running = false; Time += TimeRecord::getCurrentTime(false); Time -= StartTime; - Signposts->endInterval(this); + Signposts->endInterval(this, getName()); } void Timer::clear() {