1*e4b17023SJohn Marino // -*- C++ -*- 2*e4b17023SJohn Marino // 3*e4b17023SJohn Marino // Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. 4*e4b17023SJohn Marino // 5*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 6*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 7*e4b17023SJohn Marino // terms of the GNU General Public License as published by the 8*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 9*e4b17023SJohn Marino // any later version. 10*e4b17023SJohn Marino // 11*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 12*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*e4b17023SJohn Marino // GNU General Public License for more details. 15*e4b17023SJohn Marino 16*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 17*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 18*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 19*e4b17023SJohn Marino 20*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License along 21*e4b17023SJohn Marino // with this library; see the file COPYING3. If not see 22*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 23*e4b17023SJohn Marino 24*e4b17023SJohn Marino /** @file profile/impl/profiler_node.h 25*e4b17023SJohn Marino * @brief Data structures to represent a single profiling event. 26*e4b17023SJohn Marino */ 27*e4b17023SJohn Marino 28*e4b17023SJohn Marino // Written by Lixia Liu and Silvius Rus. 29*e4b17023SJohn Marino 30*e4b17023SJohn Marino #ifndef _GLIBCXX_PROFILE_PROFILER_NODE_H 31*e4b17023SJohn Marino #define _GLIBCXX_PROFILE_PROFILER_NODE_H 1 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino #include <cstdio> // FILE, fprintf 34*e4b17023SJohn Marino 35*e4b17023SJohn Marino #include <vector> 36*e4b17023SJohn Marino #if defined _GLIBCXX_HAVE_EXECINFO_H 37*e4b17023SJohn Marino #include <execinfo.h> 38*e4b17023SJohn Marino #endif 39*e4b17023SJohn Marino 40*e4b17023SJohn Marino namespace __gnu_profile 41*e4b17023SJohn Marino { 42*e4b17023SJohn Marino typedef const void* __object_t; 43*e4b17023SJohn Marino typedef void* __instruction_address_t; 44*e4b17023SJohn Marino typedef std::_GLIBCXX_STD_C::vector<__instruction_address_t> __stack_npt; 45*e4b17023SJohn Marino typedef __stack_npt* __stack_t; 46*e4b17023SJohn Marino 47*e4b17023SJohn Marino std::size_t __stack_max_depth(); 48*e4b17023SJohn Marino 49*e4b17023SJohn Marino inline __stack_t __get_stack()50*e4b17023SJohn Marino __get_stack() 51*e4b17023SJohn Marino { 52*e4b17023SJohn Marino #if defined _GLIBCXX_HAVE_EXECINFO_H 53*e4b17023SJohn Marino std::size_t __max_depth = __stack_max_depth(); 54*e4b17023SJohn Marino if (__max_depth == 0) 55*e4b17023SJohn Marino return 0; 56*e4b17023SJohn Marino __stack_npt __buffer(__max_depth); 57*e4b17023SJohn Marino int __depth = backtrace(&__buffer[0], __max_depth); 58*e4b17023SJohn Marino __stack_t __stack = new __stack_npt(__depth); 59*e4b17023SJohn Marino __builtin_memcpy(&(*__stack)[0], &__buffer[0], 60*e4b17023SJohn Marino __depth * sizeof(__object_t)); 61*e4b17023SJohn Marino return __stack; 62*e4b17023SJohn Marino #else 63*e4b17023SJohn Marino return 0; 64*e4b17023SJohn Marino #endif 65*e4b17023SJohn Marino } 66*e4b17023SJohn Marino 67*e4b17023SJohn Marino inline std::size_t __size(__stack_t __stack)68*e4b17023SJohn Marino __size(__stack_t __stack) 69*e4b17023SJohn Marino { 70*e4b17023SJohn Marino if (!__stack) 71*e4b17023SJohn Marino return 0; 72*e4b17023SJohn Marino else 73*e4b17023SJohn Marino return __stack->size(); 74*e4b17023SJohn Marino } 75*e4b17023SJohn Marino 76*e4b17023SJohn Marino // XXX 77*e4b17023SJohn Marino inline void __write(FILE * __f,__stack_t __stack)78*e4b17023SJohn Marino __write(FILE* __f, __stack_t __stack) 79*e4b17023SJohn Marino { 80*e4b17023SJohn Marino if (!__stack) 81*e4b17023SJohn Marino return; 82*e4b17023SJohn Marino 83*e4b17023SJohn Marino __stack_npt::const_iterator __it; 84*e4b17023SJohn Marino for (__it = __stack->begin(); __it != __stack->end(); ++__it) 85*e4b17023SJohn Marino std::fprintf(__f, "%p ", *__it); 86*e4b17023SJohn Marino } 87*e4b17023SJohn Marino 88*e4b17023SJohn Marino /** @brief Hash function for summary trace using call stack as index. */ 89*e4b17023SJohn Marino class __stack_hash 90*e4b17023SJohn Marino { 91*e4b17023SJohn Marino public: 92*e4b17023SJohn Marino std::size_t operator()93*e4b17023SJohn Marino operator()(__stack_t __s) const 94*e4b17023SJohn Marino { 95*e4b17023SJohn Marino if (!__s) 96*e4b17023SJohn Marino return 0; 97*e4b17023SJohn Marino 98*e4b17023SJohn Marino std::size_t __index = 0; 99*e4b17023SJohn Marino __stack_npt::const_iterator __it; 100*e4b17023SJohn Marino for (__it = __s->begin(); __it != __s->end(); ++__it) 101*e4b17023SJohn Marino __index += reinterpret_cast<std::size_t>(*__it); 102*e4b17023SJohn Marino return __index; 103*e4b17023SJohn Marino } 104*e4b17023SJohn Marino operator()105*e4b17023SJohn Marino bool operator() (__stack_t __stack1, __stack_t __stack2) const 106*e4b17023SJohn Marino { 107*e4b17023SJohn Marino if (!__stack1 && !__stack2) 108*e4b17023SJohn Marino return true; 109*e4b17023SJohn Marino if (!__stack1 || !__stack2) 110*e4b17023SJohn Marino return false; 111*e4b17023SJohn Marino if (__stack1->size() != __stack2->size()) 112*e4b17023SJohn Marino return false; 113*e4b17023SJohn Marino 114*e4b17023SJohn Marino std::size_t __byte_size 115*e4b17023SJohn Marino = __stack1->size() * sizeof(__stack_npt::value_type); 116*e4b17023SJohn Marino return __builtin_memcmp(&(*__stack1)[0], &(*__stack2)[0], 117*e4b17023SJohn Marino __byte_size) == 0; 118*e4b17023SJohn Marino } 119*e4b17023SJohn Marino }; 120*e4b17023SJohn Marino 121*e4b17023SJohn Marino 122*e4b17023SJohn Marino /** @brief Base class for a line in the object table. */ 123*e4b17023SJohn Marino class __object_info_base 124*e4b17023SJohn Marino { 125*e4b17023SJohn Marino public: __object_info_base()126*e4b17023SJohn Marino __object_info_base() { } 127*e4b17023SJohn Marino __object_info_base(__stack_t __stack)128*e4b17023SJohn Marino __object_info_base(__stack_t __stack) 129*e4b17023SJohn Marino : _M_stack(__stack), _M_valid(true) { } 130*e4b17023SJohn Marino __object_info_base(const __object_info_base & __o)131*e4b17023SJohn Marino __object_info_base(const __object_info_base& __o) 132*e4b17023SJohn Marino : _M_stack(__o._M_stack), _M_valid(__o._M_valid) { } 133*e4b17023SJohn Marino ~__object_info_base()134*e4b17023SJohn Marino virtual ~__object_info_base() { } 135*e4b17023SJohn Marino 136*e4b17023SJohn Marino bool __is_valid()137*e4b17023SJohn Marino __is_valid() const 138*e4b17023SJohn Marino { return _M_valid; } 139*e4b17023SJohn Marino 140*e4b17023SJohn Marino __stack_t __stack()141*e4b17023SJohn Marino __stack() const 142*e4b17023SJohn Marino { return _M_stack; } 143*e4b17023SJohn Marino 144*e4b17023SJohn Marino virtual void __write(FILE* __f) const = 0; 145*e4b17023SJohn Marino 146*e4b17023SJohn Marino protected: 147*e4b17023SJohn Marino __stack_t _M_stack; 148*e4b17023SJohn Marino bool _M_valid; 149*e4b17023SJohn Marino }; 150*e4b17023SJohn Marino 151*e4b17023SJohn Marino 152*e4b17023SJohn Marino /** @brief Base class for a line in the stack table. */ 153*e4b17023SJohn Marino template<typename __object_info> 154*e4b17023SJohn Marino class __stack_info_base 155*e4b17023SJohn Marino { 156*e4b17023SJohn Marino public: __stack_info_base()157*e4b17023SJohn Marino __stack_info_base() { } 158*e4b17023SJohn Marino __stack_info_base(const __object_info& __info) = 0; ~__stack_info_base()159*e4b17023SJohn Marino virtual ~__stack_info_base() {} 160*e4b17023SJohn Marino void __merge(const __object_info& __info) = 0; 161*e4b17023SJohn Marino virtual float __magnitude() const = 0; 162*e4b17023SJohn Marino virtual const char* __get_id() const = 0; 163*e4b17023SJohn Marino }; 164*e4b17023SJohn Marino 165*e4b17023SJohn Marino } // namespace __gnu_profile 166*e4b17023SJohn Marino #endif /* _GLIBCXX_PROFILE_PROFILER_NODE_H */ 167