11#include "llvm/Config/config.h"
13#if LLVM_SUPPORT_XCODE_SIGNPOSTS
16#include <Availability.h>
17#include <os/signpost.h>
22#if LLVM_SUPPORT_XCODE_SIGNPOSTS
23#define SIGNPOSTS_AVAILABLE() \
24 __builtin_available(macos 10.14, iOS 12, tvOS 12, watchOS 5, *)
26os_log_t *LogCreator() {
27 os_log_t *
X =
new os_log_t;
28 *
X = os_log_create(
"org.llvm.signposts",
"toolchain");
32 void operator()(os_log_t *
X)
const {
41 using LogPtrTy = std::unique_ptr<os_log_t, LogDeleter>;
42 using LogTy = LogPtrTy::element_type;
45 DenseMap<const void *, os_signpost_id_t> Signposts;
46 sys::SmartMutex<true>
Mutex;
48 LogTy &getLogger()
const {
return *SignpostLog; }
49 os_signpost_id_t getSignpostForObject(
const void *O) {
51 const auto &
I = Signposts.
find(O);
52 if (
I != Signposts.
end())
54 os_signpost_id_t
ID = {};
55 if (SIGNPOSTS_AVAILABLE()) {
56 ID = os_signpost_id_make_with_pointer(getLogger(), O);
63 SignpostEmitterImpl() : SignpostLog(LogCreator()) {}
65 bool isEnabled()
const {
66 if (SIGNPOSTS_AVAILABLE())
67 return os_signpost_enabled(*SignpostLog);
71 void startInterval(
const void *O, llvm::StringRef Name) {
73 if (SIGNPOSTS_AVAILABLE()) {
75 os_signpost_interval_begin(getLogger(), getSignpostForObject(O),
76 "LLVM Timers",
"%s",
Name.data());
81 void endInterval(
const void *O, llvm::StringRef Name) {
83 if (SIGNPOSTS_AVAILABLE()) {
85 os_signpost_interval_end(getLogger(), getSignpostForObject(O),
97#if LLVM_SUPPORT_XCODE_SIGNPOSTS
98#define HAVE_ANY_SIGNPOST_IMPL 1
100#define HAVE_ANY_SIGNPOST_IMPL 0
104#if HAVE_ANY_SIGNPOST_IMPL
105 Impl = std::make_unique<SignpostEmitterImpl>();
112#if HAVE_ANY_SIGNPOST_IMPL
113 return Impl->isEnabled();
120#if HAVE_ANY_SIGNPOST_IMPL
123 return Impl->startInterval(O, Name);
128#if HAVE_ANY_SIGNPOST_IMPL
131 Impl->endInterval(O, Name);
This file defines the DenseMap class.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition necessary for use of std::unique_ptr in SignpostEmitter::Impl.
LLVM_ABI SignpostEmitter()
LLVM_ABI void endInterval(const void *O, StringRef Name)
End a signposted interval for a given object.
LLVM_ABI bool isEnabled() const
LLVM_ABI void startInterval(const void *O, StringRef Name)
Begin a signposted interval for a given object.
LLVM_ABI ~SignpostEmitter()
StringRef - Represent a constant reference to a string, i.e.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
std::lock_guard< SmartMutex< mt_only > > SmartScopedLock
SmartMutex< false > Mutex
Mutex - A standard, always enforced mutex.
This is an optimization pass for GlobalISel generic memory operations.