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