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