| //===--- RuntimeInvocationsTracking.h ---------------------------*- C++ -*-===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Track invocations of Swift runtime functions. This can be used for |
| // performance analysis. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SWIFT_STDLIB_RUNTIME_INVOCATIONS_TRACKING_H |
| #define SWIFT_STDLIB_RUNTIME_INVOCATIONS_TRACKING_H |
| |
| #include "swift/Runtime/Config.h" |
| |
| /// This API is only enabled if this define is set. |
| #if defined(SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS) |
| |
| #if defined(__cplusplus) |
| |
| namespace swift { |
| struct HeapObject; |
| struct RuntimeFunctionCountersState; |
| } // end namespace swift |
| |
| using namespace swift; |
| #else |
| |
| struct HeapObject; |
| struct RuntimeFunctionCountersState; |
| |
| #endif |
| |
| /// The name of a helper function for tracking the calls of a runtime function. |
| #define SWIFT_RT_TRACK_INVOCATION_NAME(RT_FUNCTION) \ |
| swift_trackRuntimeInvocation_##RT_FUNCTION |
| |
| /// Invoke a helper function for tracking the calls of a runtime function. |
| #define SWIFT_RT_TRACK_INVOCATION(OBJ, RT_FUNCTION) \ |
| SWIFT_RT_TRACK_INVOCATION_NAME(RT_FUNCTION)(OBJ) |
| |
| #define FUNCTION_TO_TRACK(RT_FUNCTION) \ |
| extern void SWIFT_RT_TRACK_INVOCATION_NAME(RT_FUNCTION)(HeapObject * OBJ); |
| /// Declarations of external functions for invocations tracking. |
| #include "RuntimeInvocationsTracking.def" |
| |
| /// This type defines a callback to be called on any intercepted runtime |
| /// function. |
| using RuntimeFunctionCountersUpdateHandler = |
| __attribute__((swiftcall)) |
| void (*)(HeapObject *object, int64_t runtimeFunctionID); |
| |
| /// Public APIs |
| |
| /// Get the runtime object state associated with an object and store it |
| /// into the result. |
| SWIFT_RUNTIME_EXPORT void |
| _swift_getObjectRuntimeFunctionCounters(HeapObject *object, |
| RuntimeFunctionCountersState *result); |
| |
| /// Get the global runtime state containing the total numbers of invocations for |
| /// each runtime function of interest and store it into the result. |
| SWIFT_RUNTIME_EXPORT void _swift_getGlobalRuntimeFunctionCounters( |
| swift::RuntimeFunctionCountersState *result); |
| |
| /// Return the names of the runtime functions being tracked. |
| /// Their order is the same as the order of the counters in the |
| /// RuntimeObjectState structure. |
| SWIFT_RUNTIME_EXPORT const char **_swift_getRuntimeFunctionNames(); |
| |
| /// Return the offsets of the runtime function counters being tracked. |
| /// Their order is the same as the order of the counters in the |
| /// RuntimeFunctionCountersState structure. |
| SWIFT_RUNTIME_EXPORT const uint16_t *_swift_getRuntimeFunctionCountersOffsets(); |
| |
| /// Return the number of runtime functions being tracked. |
| SWIFT_RUNTIME_EXPORT uint64_t _swift_getNumRuntimeFunctionCounters(); |
| |
| /// Dump all per-object runtime function pointers. |
| SWIFT_RUNTIME_EXPORT void _swift_dumpObjectsRuntimeFunctionPointers(); |
| |
| /// Set mode for global runtime function counters. |
| /// Return the old value of this flag. |
| SWIFT_RUNTIME_EXPORT int |
| _swift_setPerObjectRuntimeFunctionCountersMode(int mode); |
| |
| /// Set mode for per object runtime function counters. |
| /// Return the old value of this flag. |
| SWIFT_RUNTIME_EXPORT int _swift_setGlobalRuntimeFunctionCountersMode(int mode); |
| |
| /// Set the global runtime state of function pointers from a provided state. |
| SWIFT_RUNTIME_EXPORT void _swift_setGlobalRuntimeFunctionCounters( |
| swift::RuntimeFunctionCountersState *state); |
| |
| /// Set the runtime object state associated with an object from a provided |
| /// state. |
| SWIFT_RUNTIME_EXPORT void |
| _swift_setObjectRuntimeFunctionCounters(HeapObject *object, |
| RuntimeFunctionCountersState *state); |
| |
| /// Set the global runtime function counters update handler. |
| SWIFT_RUNTIME_EXPORT RuntimeFunctionCountersUpdateHandler |
| _swift_setGlobalRuntimeFunctionCountersUpdateHandler( |
| RuntimeFunctionCountersUpdateHandler handler); |
| |
| #else |
| |
| /// Let runtime functions unconditionally use this define by making it a NOP if |
| /// counters are not enabled. |
| #define SWIFT_RT_TRACK_INVOCATION(OBJ, RT_FUNCTION) |
| |
| #endif // SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS |
| |
| #endif |