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 
51 namespace __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 
79  __reentrance_guard() { }
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;
89  class __vector2list_info;
90  class __list2slist_info;
91  class __list2vector_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
A list-to-vector instrumentation line in the object table.
Data structures to represent profiling traces.
diagnostics for list to vector.
Collection of vector size traces.
GNU profile code for public use.
Diagnostics for list to slist.
A hash performance instrumentation line in the object table.
A container size instrumentation line in the object table.
void __report()
Final report method, registered with atexit.
Collection of hashtable size traces.
A vector-to-list instrumentation line in the object table.
A map-to-unordered_map instrumentation line in the object table.
Diagnostics for map to unordered_map.
diagnostics for vector to list.