libstdc++
profiler.h
Go to the documentation of this file.
1// -*- C++ -*-
2//
3// Copyright (C) 2009-2019 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10//
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License along
21// with this library; see the file COPYING3. If not see
22// <http://www.gnu.org/licenses/>.
23
24/** @file profile/impl/profiler.h
25 * @brief Interface of the profiling runtime library.
26 */
27
28// Written by Lixia Liu and Silvius Rus.
29
30#ifndef _GLIBCXX_PROFILE_PROFILER_H
31#define _GLIBCXX_PROFILE_PROFILER_H 1
32
33#include <bits/c++config.h>
34
35// Mechanism to define data with inline linkage.
36#define _GLIBCXX_PROFILE_DEFINE_UNINIT_DATA(__type, __name) \
37 inline __type& \
38 __get_##__name() \
39 { \
40 static __type __name; \
41 return __name; \
42 }
43#define _GLIBCXX_PROFILE_DEFINE_DATA(__type, __name, __initial_value...) \
44 inline __type& __get_##__name() { \
45 static __type __name(__initial_value); \
46 return __name; \
47 }
48#define _GLIBCXX_PROFILE_DATA(__name) \
49 __get_##__name()
50
51namespace __gnu_profile
52{
53 /** @brief Reentrance guard.
54 *
55 * Mechanism to protect all __gnu_profile operations against recursion,
56 * multithreaded and exception reentrance.
57 */
59 {
60 static bool
61 __get_in()
62 {
63 if (__inside() == true)
64 return false;
65 else
66 {
67 __inside() = true;
68 return true;
69 }
70 }
71
72 static bool&
73 __inside()
74 {
75 static __thread bool _S_inside(false);
76 return _S_inside;
77 }
78
80 ~__reentrance_guard() { __inside() = false; }
81 };
82
83 // Forward declarations of implementation functions.
84 // Don't use any __gnu_profile:: in user code.
85 // Instead, use the __profcxx... macros, which offer guarded access.
87 class __hashfunc_info;
88 class __map2umap_info;
90 class __list2slist_info;
92
93 bool __turn_on();
94 bool __turn_off();
95 bool __is_invalid();
96 bool __is_on();
97 bool __is_off();
98 void __report();
99
101 __trace_hashtable_size_construct(std::size_t);
102 void __trace_hashtable_size_resize(__container_size_info*,
103 std::size_t, std::size_t);
104 void __trace_hashtable_size_destruct(__container_size_info*,
105 std::size_t, std::size_t);
106
108 __trace_hash_func_construct();
109 void __trace_hash_func_destruct(__hashfunc_info*,
110 std::size_t, std::size_t, std::size_t);
111
113 __trace_vector_size_construct(std::size_t);
114 void __trace_vector_size_resize(__container_size_info*,
115 std::size_t, std::size_t);
116 void __trace_vector_size_destruct(__container_size_info*,
117 std::size_t, std::size_t);
118
120 __trace_vector_to_list_construct();
121 void __trace_vector_to_list_insert(__vector2list_info*,
122 std::size_t, std::size_t);
123 void __trace_vector_to_list_iterate(__vector2list_info*, int);
124 void __trace_vector_to_list_invalid_operator(__vector2list_info*);
125 void __trace_vector_to_list_resize(__vector2list_info*,
126 std::size_t, std::size_t);
127 void __trace_vector_to_list_destruct(__vector2list_info*);
128
129 __list2slist_info*
130 __trace_list_to_slist_construct();
131 void __trace_list_to_slist_rewind(__list2slist_info*);
132 void __trace_list_to_slist_operation(__list2slist_info*);
133 void __trace_list_to_slist_destruct(__list2slist_info*);
134
136 __trace_list_to_vector_construct();
137 void __trace_list_to_vector_insert(__list2vector_info*,
138 std::size_t, std::size_t);
139 void __trace_list_to_vector_iterate(__list2vector_info*, int);
140 void __trace_list_to_vector_invalid_operator(__list2vector_info*);
141 void __trace_list_to_vector_resize(__list2vector_info*,
142 std::size_t, std::size_t);
143 void __trace_list_to_vector_destruct(__list2vector_info*);
144
146 __trace_map_to_unordered_map_construct();
147 void __trace_map_to_unordered_map_invalidate(__map2umap_info*);
148 void __trace_map_to_unordered_map_insert(__map2umap_info*, std::size_t,
149 std::size_t);
150 void __trace_map_to_unordered_map_erase(__map2umap_info*, std::size_t,
151 std::size_t);
152 void __trace_map_to_unordered_map_iterate(__map2umap_info*, std::size_t);
153 void __trace_map_to_unordered_map_find(__map2umap_info*, std::size_t);
154 void __trace_map_to_unordered_map_destruct(__map2umap_info*);
155} // namespace __gnu_profile
156
157// Master switch turns on all diagnostics that are not explicitly turned off.
158#ifdef _GLIBCXX_PROFILE
159#ifndef _GLIBCXX_PROFILE_NO_HASHTABLE_TOO_SMALL
160#define _GLIBCXX_PROFILE_HASHTABLE_TOO_SMALL
161#endif
162#ifndef _GLIBCXX_PROFILE_NO_HASHTABLE_TOO_LARGE
163#define _GLIBCXX_PROFILE_HASHTABLE_TOO_LARGE
164#endif
165#ifndef _GLIBCXX_PROFILE_NO_VECTOR_TOO_SMALL
166#define _GLIBCXX_PROFILE_VECTOR_TOO_SMALL
167#endif
168#ifndef _GLIBCXX_PROFILE_NO_VECTOR_TOO_LARGE
169#define _GLIBCXX_PROFILE_VECTOR_TOO_LARGE
170#endif
171#ifndef _GLIBCXX_PROFILE_NO_INEFFICIENT_HASH
172#define _GLIBCXX_PROFILE_INEFFICIENT_HASH
173#endif
174#ifndef _GLIBCXX_PROFILE_NO_VECTOR_TO_LIST
175#define _GLIBCXX_PROFILE_VECTOR_TO_LIST
176#endif
177#ifndef _GLIBCXX_PROFILE_NO_LIST_TO_SLIST
178#define _GLIBCXX_PROFILE_LIST_TO_SLIST
179#endif
180#ifndef _GLIBCXX_PROFILE_NO_LIST_TO_VECTOR
181#define _GLIBCXX_PROFILE_LIST_TO_VECTOR
182#endif
183#ifndef _GLIBCXX_PROFILE_NO_MAP_TO_UNORDERED_MAP
184#define _GLIBCXX_PROFILE_MAP_TO_UNORDERED_MAP
185#endif
186#endif
187
188// Expose global management routines to user code.
189#ifdef _GLIBCXX_PROFILE
190#define __profcxx_report() __gnu_profile::__report()
191#define __profcxx_turn_on() __gnu_profile::__turn_on()
192#define __profcxx_turn_off() __gnu_profile::__turn_off()
193#define __profcxx_is_invalid() __gnu_profile::__is_invalid()
194#define __profcxx_is_on() __gnu_profile::__is_on()
195#define __profcxx_is_off() __gnu_profile::__is_off()
196#else
197#define __profcxx_report()
198#define __profcxx_turn_on()
199#define __profcxx_turn_off()
200#define __profcxx_is_invalid()
201#define __profcxx_is_on()
202#define __profcxx_is_off()
203#endif
204
205// Turn on/off instrumentation for HASHTABLE_TOO_SMALL and HASHTABLE_TOO_LARGE.
206#if (defined(_GLIBCXX_PROFILE_HASHTABLE_TOO_SMALL) \
207 || defined(_GLIBCXX_PROFILE_HASHTABLE_TOO_LARGE))
208#define __profcxx_hashtable_size_construct(__x...) \
209 __gnu_profile::__trace_hashtable_size_construct(__x)
210#define __profcxx_hashtable_size_resize(__x...) \
211 __gnu_profile::__trace_hashtable_size_resize(__x)
212#define __profcxx_hashtable_size_destruct(__x...) \
213 __gnu_profile::__trace_hashtable_size_destruct(__x)
214#else
215#define __profcxx_hashtable_size_construct(__x...) 0
216#define __profcxx_hashtable_size_resize(__x...)
217#define __profcxx_hashtable_size_destruct(__x...)
218#endif
219
220// Turn on/off instrumentation for VECTOR_TOO_SMALL and VECTOR_TOO_LARGE.
221#if (defined(_GLIBCXX_PROFILE_VECTOR_TOO_SMALL) \
222 || defined(_GLIBCXX_PROFILE_VECTOR_TOO_LARGE))
223#define __profcxx_vector_size_construct(__x...) \
224 __gnu_profile::__trace_vector_size_construct(__x)
225#define __profcxx_vector_size_resize(__x...) \
226 __gnu_profile::__trace_vector_size_resize(__x)
227#define __profcxx_vector_size_destruct(__x...) \
228 __gnu_profile::__trace_vector_size_destruct(__x)
229#else
230#define __profcxx_vector_size_construct(__x...) 0
231#define __profcxx_vector_size_resize(__x...)
232#define __profcxx_vector_size_destruct(__x...)
233#endif
234
235// Turn on/off instrumentation for INEFFICIENT_HASH.
236#if defined(_GLIBCXX_PROFILE_INEFFICIENT_HASH)
237#define __profcxx_hash_func_construct(__x...) \
238 __gnu_profile::__trace_hash_func_construct(__x)
239#define __profcxx_hash_func_destruct(__x...) \
240 __gnu_profile::__trace_hash_func_destruct(__x)
241#else
242#define __profcxx_hash_func_construct(__x...) 0
243#define __profcxx_hash_func_destruct(__x...)
244#endif
245
246// Turn on/off instrumentation for VECTOR_TO_LIST.
247#if defined(_GLIBCXX_PROFILE_VECTOR_TO_LIST)
248#define __profcxx_vector2list_construct(__x...) \
249 __gnu_profile::__trace_vector_to_list_construct(__x)
250#define __profcxx_vector2list_insert(__x...) \
251 __gnu_profile::__trace_vector_to_list_insert(__x)
252#define __profcxx_vector2list_iterate(__x...) \
253 __gnu_profile::__trace_vector_to_list_iterate(__x)
254#define __profcxx_vector2list_invalid_operator(__x...) \
255 __gnu_profile::__trace_vector_to_list_invalid_operator(__x)
256#define __profcxx_vector2list_resize(__x...) \
257 __gnu_profile::__trace_vector_to_list_resize(__x)
258#define __profcxx_vector2list_destruct(__x...) \
259 __gnu_profile::__trace_vector_to_list_destruct(__x)
260#else
261#define __profcxx_vector2list_construct(__x...) 0
262#define __profcxx_vector2list_insert(__x...)
263#define __profcxx_vector2list_iterate(__x...)
264#define __profcxx_vector2list_invalid_operator(__x...)
265#define __profcxx_vector2list_resize(__x...)
266#define __profcxx_vector2list_destruct(__x...)
267#endif
268
269// Turn on/off instrumentation for LIST_TO_VECTOR.
270#if defined(_GLIBCXX_PROFILE_LIST_TO_VECTOR)
271#define __profcxx_list2vector_construct(__x...) \
272 __gnu_profile::__trace_list_to_vector_construct(__x)
273#define __profcxx_list2vector_insert(__x...) \
274 __gnu_profile::__trace_list_to_vector_insert(__x)
275#define __profcxx_list2vector_iterate(__x...) \
276 __gnu_profile::__trace_list_to_vector_iterate(__x)
277#define __profcxx_list2vector_invalid_operator(__x...) \
278 __gnu_profile::__trace_list_to_vector_invalid_operator(__x)
279#define __profcxx_list2vector_destruct(__x...) \
280 __gnu_profile::__trace_list_to_vector_destruct(__x)
281#else
282#define __profcxx_list2vector_construct(__x...) 0
283#define __profcxx_list2vector_insert(__x...)
284#define __profcxx_list2vector_iterate(__x...)
285#define __profcxx_list2vector_invalid_operator(__x...)
286#define __profcxx_list2vector_destruct(__x...)
287#endif
288
289// Turn on/off instrumentation for LIST_TO_SLIST.
290#if defined(_GLIBCXX_PROFILE_LIST_TO_SLIST)
291#define __profcxx_list2slist_construct(__x...) \
292 __gnu_profile::__trace_list_to_slist_construct(__x)
293#define __profcxx_list2slist_rewind(__x...) \
294 __gnu_profile::__trace_list_to_slist_rewind(__x)
295#define __profcxx_list2slist_operation(__x...) \
296 __gnu_profile::__trace_list_to_slist_operation(__x)
297#define __profcxx_list2slist_destruct(__x...) \
298 __gnu_profile::__trace_list_to_slist_destruct(__x)
299#else
300#define __profcxx_list2slist_construct(__x...) 0
301#define __profcxx_list2slist_rewind(__x...)
302#define __profcxx_list2slist_operation(__x...)
303#define __profcxx_list2slist_destruct(__x...)
304#endif
305
306// Turn on/off instrumentation for MAP_TO_UNORDERED_MAP.
307#if defined(_GLIBCXX_PROFILE_MAP_TO_UNORDERED_MAP)
308#define __profcxx_map2umap_construct(__x...) \
309 __gnu_profile::__trace_map_to_unordered_map_construct(__x)
310#define __profcxx_map2umap_insert(__x...) \
311 __gnu_profile::__trace_map_to_unordered_map_insert(__x)
312#define __profcxx_map2umap_erase(__x...) \
313 __gnu_profile::__trace_map_to_unordered_map_erase(__x)
314#define __profcxx_map2umap_iterate(__x...) \
315 __gnu_profile::__trace_map_to_unordered_map_iterate(__x)
316#define __profcxx_map2umap_invalidate(__x...) \
317 __gnu_profile::__trace_map_to_unordered_map_invalidate(__x)
318#define __profcxx_map2umap_find(__x...) \
319 __gnu_profile::__trace_map_to_unordered_map_find(__x)
320#define __profcxx_map2umap_destruct(__x...) \
321 __gnu_profile::__trace_map_to_unordered_map_destruct(__x)
322#else
323#define __profcxx_map2umap_construct(__x...) 0
324#define __profcxx_map2umap_insert(__x...)
325#define __profcxx_map2umap_erase(__x...)
326#define __profcxx_map2umap_iterate(__x...)
327#define __profcxx_map2umap_invalidate(__x...)
328#define __profcxx_map2umap_find(__x...)
329#define __profcxx_map2umap_destruct(__x...)
330#endif
331
332// Set default values for compile-time customizable variables.
333#ifndef _GLIBCXX_PROFILE_TRACE_PATH_ROOT
334#define _GLIBCXX_PROFILE_TRACE_PATH_ROOT "libstdcxx-profile"
335#endif
336#ifndef _GLIBCXX_PROFILE_TRACE_ENV_VAR
337#define _GLIBCXX_PROFILE_TRACE_ENV_VAR "_GLIBCXX_PROFILE_TRACE_PATH_ROOT"
338#endif
339#ifndef _GLIBCXX_PROFILE_MAX_WARN_COUNT_ENV_VAR
340#define _GLIBCXX_PROFILE_MAX_WARN_COUNT_ENV_VAR \
341 "_GLIBCXX_PROFILE_MAX_WARN_COUNT"
342#endif
343#ifndef _GLIBCXX_PROFILE_MAX_WARN_COUNT
344#define _GLIBCXX_PROFILE_MAX_WARN_COUNT 10
345#endif
346#ifndef _GLIBCXX_PROFILE_MAX_STACK_DEPTH
347#define _GLIBCXX_PROFILE_MAX_STACK_DEPTH 32
348#endif
349#ifndef _GLIBCXX_PROFILE_MAX_STACK_DEPTH_ENV_VAR
350#define _GLIBCXX_PROFILE_MAX_STACK_DEPTH_ENV_VAR \
351 "_GLIBCXX_PROFILE_MAX_STACK_DEPTH"
352#endif
353#ifndef _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC
354#define _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC (1 << 28)
355#endif
356#ifndef _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC_ENV_VAR
357#define _GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC_ENV_VAR \
358 "_GLIBCXX_PROFILE_MEM_PER_DIAGNOSTIC"
359#endif
360
361// Instrumentation hook implementations.
369
370#endif // _GLIBCXX_PROFILE_PROFILER_H
diagnostics for list to vector.
Collection of hashtable size traces.
Data structures to represent profiling traces.
diagnostics for vector to list.
Diagnostics for map to unordered_map.
Diagnostics for list to slist.
Collection of vector size traces.
GNU profile code for public use.
void __report()
Final report method, registered with atexit.
A container size instrumentation line in the object table.
A hash performance instrumentation line in the object table.
A list-to-vector instrumentation line in the object table.
A map-to-unordered_map instrumentation line in the object table.
A vector-to-list instrumentation line in the object table.