dyld-655.1.1.tar.gz
[apple/dyld.git] / dyld3 / Tracing.h
1 /*
2 * Copyright (c) 2017 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24
25 #ifndef Tracing_h
26 #define Tracing_h
27
28 #include <stdio.h>
29 #include <stdint.h>
30 #include <sys/stat.h>
31 #include <sys/param.h>
32 #include <sys/mount.h>
33 #include <uuid/uuid.h>
34 #include <mach-o/loader.h>
35 #include <System/sys/kdebug.h>
36
37 #define DBG_DYLD_INTERNAL_SUBCLASS (7)
38 #define DBG_DYLD_API_SUBCLASS (8)
39 #define DBG_DYLD_DEBUGGING_SUBCLASS (9)
40
41 #define DBG_DYLD_TIMING_STATIC_INITIALIZER (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 0))
42 #define DBG_DYLD_TIMING_LAUNCH_EXECUTABLE (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 1))
43 #define DBG_DYLD_TIMING_MAP_IMAGE (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 2))
44 #define DBG_DYLD_TIMING_APPLY_FIXUPS (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 3))
45 #define DBG_DYLD_TIMING_ATTACH_CODESIGNATURE (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 4))
46 #define DBG_DYLD_TIMING_BUILD_CLOSURE (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 5))
47 #define DBG_DYLD_TIMING_FUNC_FOR_ADD_IMAGE (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 6))
48 #define DBG_DYLD_TIMING_FUNC_FOR_REMOVE_IMAGE (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 7))
49 #define DBG_DYLD_TIMING_OBJC_INIT (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 8))
50 #define DBG_DYLD_TIMING_OBJC_MAP (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 9))
51 #define DBG_DYLD_TIMING_APPLY_INTERPOSING (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 10))
52 #define DBG_DYLD_GDB_IMAGE_NOTIFIER (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 11))
53 #define DBG_DYLD_REMOTE_IMAGE_NOTIFIER (KDBG_CODE(DBG_DYLD, DBG_DYLD_INTERNAL_SUBCLASS, 12))
54
55 #define DBG_DYLD_TIMING_DLOPEN (KDBG_CODE(DBG_DYLD, DBG_DYLD_API_SUBCLASS, 0))
56 #define DBG_DYLD_TIMING_DLOPEN_PREFLIGHT (KDBG_CODE(DBG_DYLD, DBG_DYLD_API_SUBCLASS, 1))
57 #define DBG_DYLD_TIMING_DLCLOSE (KDBG_CODE(DBG_DYLD, DBG_DYLD_API_SUBCLASS, 2))
58 #define DBG_DYLD_TIMING_DLSYM (KDBG_CODE(DBG_DYLD, DBG_DYLD_API_SUBCLASS, 3))
59 #define DBG_DYLD_TIMING_DLADDR (KDBG_CODE(DBG_DYLD, DBG_DYLD_API_SUBCLASS, 4))
60
61 #define DBG_DYLD_DEBUGGING_VM_REMAP (KDBG_CODE(DBG_DYLD, DBG_DYLD_DEBUGGING_SUBCLASS, 0))
62 #define DBG_DYLD_DEBUGGING_VM_UNMAP (KDBG_CODE(DBG_DYLD, DBG_DYLD_DEBUGGING_SUBCLASS, 1))
63 #define DBG_DYLD_DEBUGGING_MAP_LOOP (KDBG_CODE(DBG_DYLD, DBG_DYLD_DEBUGGING_SUBCLASS, 2))
64 #define DBG_DYLD_DEBUGGING_MARK (KDBG_CODE(DBG_DYLD, DBG_DYLD_DEBUGGING_SUBCLASS, 3))
65
66
67 #define VIS_HIDDEN __attribute__((visibility("hidden")))
68
69 namespace dyld3 {
70
71 struct VIS_HIDDEN kt_arg {
72 kt_arg(int value) : _value(value), _str(nullptr) {}
73 kt_arg(uint64_t value) : _value(value), _str(nullptr) {}
74 kt_arg(const char *value) : _value(0), _str(value) {}
75 kt_arg(void *value) : _value((uint64_t)value), _str(nullptr) {}
76 uint64_t value() const { return _value; }
77 private:
78 void prepare(uint32_t code) {
79 if (_str) {
80 _value = kdebug_trace_string(code, 0, _str);
81 if (_value == (uint64_t)-1) _value = 0;
82 }
83 }
84 void destroy(uint32_t code) {
85 if (_str && _value) {
86 kdebug_trace_string(code, _value, nullptr);
87 }
88 }
89 friend class ScopedTimer;
90 friend uint64_t kdebug_trace_dyld_duration_start(uint32_t code, kt_arg data1, kt_arg data2, kt_arg data3);
91 friend void kdebug_trace_dyld_duration_end(uint64_t pair_id, uint32_t code, kt_arg data4, kt_arg data5, kt_arg data6);
92 friend void kdebug_trace_dyld_marker(uint32_t code, kt_arg data1, kt_arg data2, kt_arg data3, kt_arg data4);
93 uint64_t _value;
94 const char* _str;
95 };
96
97 class VIS_HIDDEN ScopedTimer {
98 public:
99 ScopedTimer(uint32_t code, kt_arg data1, kt_arg data2, kt_arg data3)
100 : code(code), data1(data1), data2(data2), data3(data3), data4(0), data5(0), data6(0) {
101 #if BUILDING_LIBDYLD || BUILDING_DYLD
102 startTimer();
103 #endif
104 }
105
106 ~ScopedTimer() {
107 #if BUILDING_LIBDYLD || BUILDING_DYLD
108 endTimer();
109 #endif
110 }
111
112 void setData4(kt_arg data) { data4 = data; }
113 void setData5(kt_arg data) { data5 = data; }
114 void setData6(kt_arg data) { data6 = data; }
115 private:
116 #if BUILDING_LIBDYLD || BUILDING_DYLD
117 void startTimer();
118 void endTimer();
119 #endif
120
121 uint32_t code;
122 kt_arg data1;
123 kt_arg data2;
124 kt_arg data3;
125 kt_arg data4;
126 kt_arg data5;
127 kt_arg data6;
128 uint64_t current_trace_id = 0;
129 };
130
131 VIS_HIDDEN
132 void kdebug_trace_dyld_image(const uint32_t code,
133 const uuid_t* uuid_bytes,
134 const fsobj_id_t fsobjid,
135 const fsid_t fsid,
136 const mach_header* load_addr);
137
138 VIS_HIDDEN
139 bool kdebug_trace_dyld_enabled(uint32_t code);
140
141 VIS_HIDDEN
142 void kdebug_trace_dyld_marker(uint32_t code, kt_arg data1, kt_arg data2, kt_arg data3, kt_arg data4);
143
144 VIS_HIDDEN
145 uint64_t kdebug_trace_dyld_duration_start(uint32_t code, kt_arg data1, kt_arg data2, kt_arg data3);
146
147 VIS_HIDDEN
148 void kdebug_trace_dyld_duration_end(uint64_t trace_id, uint32_t code, kt_arg data4, kt_arg data5, kt_arg data6);
149
150 };
151 #endif /* Tracing_h */