1ffeaf689SAlexander Kabaev // Debugging support implementation -*- C++ -*- 2ffeaf689SAlexander Kabaev 3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2003, 2005, 2006 4ffeaf689SAlexander Kabaev // Free Software Foundation, Inc. 5ffeaf689SAlexander Kabaev // 6ffeaf689SAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free 7ffeaf689SAlexander Kabaev // software; you can redistribute it and/or modify it under the 8ffeaf689SAlexander Kabaev // terms of the GNU General Public License as published by the 9ffeaf689SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option) 10ffeaf689SAlexander Kabaev // any later version. 11ffeaf689SAlexander Kabaev 12ffeaf689SAlexander Kabaev // This library is distributed in the hope that it will be useful, 13ffeaf689SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of 14ffeaf689SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15ffeaf689SAlexander Kabaev // GNU General Public License for more details. 16ffeaf689SAlexander Kabaev 17ffeaf689SAlexander Kabaev // You should have received a copy of the GNU General Public License along 18ffeaf689SAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free 19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 20ffeaf689SAlexander Kabaev // USA. 21ffeaf689SAlexander Kabaev 22ffeaf689SAlexander Kabaev // As a special exception, you may use this file as part of a free software 23ffeaf689SAlexander Kabaev // library without restriction. Specifically, if other files instantiate 24ffeaf689SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile 25ffeaf689SAlexander Kabaev // this file and link it with other files to produce an executable, this 26ffeaf689SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by 27ffeaf689SAlexander Kabaev // the GNU General Public License. This exception does not however 28ffeaf689SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by 29ffeaf689SAlexander Kabaev // the GNU General Public License. 30ffeaf689SAlexander Kabaev 31*f8a1b7d9SAlexander Kabaev /** @file debug/debug.h 32*f8a1b7d9SAlexander Kabaev * This file is a GNU debug extension to the Standard C++ Library. 33ffeaf689SAlexander Kabaev */ 34*f8a1b7d9SAlexander Kabaev 35*f8a1b7d9SAlexander Kabaev #ifndef _GLIBCXX_DEBUG_MACRO_SWITCH_H 36*f8a1b7d9SAlexander Kabaev #define _GLIBCXX_DEBUG_MACRO_SWITCH_H 1 37*f8a1b7d9SAlexander Kabaev 38*f8a1b7d9SAlexander Kabaev /** Macros and namespaces used by the implementation outside of debug 39*f8a1b7d9SAlexander Kabaev * wrappers to verify certain properties. The __glibcxx_requires_xxx 40*f8a1b7d9SAlexander Kabaev * macros are merely wrappers around the __glibcxx_check_xxx wrappers 41*f8a1b7d9SAlexander Kabaev * when we are compiling with debug mode, but disappear when we are 42*f8a1b7d9SAlexander Kabaev * in release mode so that there is no checking performed in, e.g., 43*f8a1b7d9SAlexander Kabaev * the standard library algorithms. 44*f8a1b7d9SAlexander Kabaev */ 45*f8a1b7d9SAlexander Kabaev 46*f8a1b7d9SAlexander Kabaev // Debug mode namespaces. 47*f8a1b7d9SAlexander Kabaev namespace std 48*f8a1b7d9SAlexander Kabaev { 49*f8a1b7d9SAlexander Kabaev namespace __debug { } 50*f8a1b7d9SAlexander Kabaev } 51*f8a1b7d9SAlexander Kabaev 52*f8a1b7d9SAlexander Kabaev namespace __gnu_cxx 53*f8a1b7d9SAlexander Kabaev { 54*f8a1b7d9SAlexander Kabaev namespace __debug { }; 55*f8a1b7d9SAlexander Kabaev } 56*f8a1b7d9SAlexander Kabaev 57*f8a1b7d9SAlexander Kabaev namespace __gnu_debug 58*f8a1b7d9SAlexander Kabaev { 59*f8a1b7d9SAlexander Kabaev using namespace std::__debug; 60*f8a1b7d9SAlexander Kabaev using namespace __gnu_cxx::__debug; 61*f8a1b7d9SAlexander Kabaev } 62*f8a1b7d9SAlexander Kabaev 63*f8a1b7d9SAlexander Kabaev #ifndef _GLIBCXX_DEBUG 64*f8a1b7d9SAlexander Kabaev 65*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_ASSERT(_Condition) 66*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_PEDASSERT(_Condition) 67*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_ONLY(_Statement) ; 68*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_cond(_Cond,_Msg) 69*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_valid_range(_First,_Last) 70*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_sorted(_First,_Last) 71*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_sorted_pred(_First,_Last,_Pred) 72*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_partitioned(_First,_Last,_Value) 73*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_partitioned_pred(_First,_Last,_Value,_Pred) 74*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_heap(_First,_Last) 75*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_heap_pred(_First,_Last,_Pred) 76*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_nonempty() 77*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_string(_String) 78*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_string_len(_String,_Len) 79*f8a1b7d9SAlexander Kabaev # define __glibcxx_requires_subscript(_N) 80*f8a1b7d9SAlexander Kabaev 81*f8a1b7d9SAlexander Kabaev #else 82*f8a1b7d9SAlexander Kabaev 83*f8a1b7d9SAlexander Kabaev # include <cstdlib> 84*f8a1b7d9SAlexander Kabaev # include <cstdio> 85*f8a1b7d9SAlexander Kabaev # include <debug/macros.h> 86*f8a1b7d9SAlexander Kabaev 87*f8a1b7d9SAlexander Kabaev namespace std 88*f8a1b7d9SAlexander Kabaev { 89*f8a1b7d9SAlexander Kabaev namespace __debug 90*f8a1b7d9SAlexander Kabaev { 91*f8a1b7d9SAlexander Kabaev // Avoid the use of assert, because we're trying to keep the <cassert> 92*f8a1b7d9SAlexander Kabaev // include out of the mix. 93*f8a1b7d9SAlexander Kabaev inline void __replacement_assert(const char * __file,int __line,const char * __function,const char * __condition)94*f8a1b7d9SAlexander Kabaev __replacement_assert(const char* __file, int __line, 95*f8a1b7d9SAlexander Kabaev const char* __function, const char* __condition) 96*f8a1b7d9SAlexander Kabaev { 97*f8a1b7d9SAlexander Kabaev printf("%s:%d: %s: Assertion '%s' failed.\n", __file, __line, 98*f8a1b7d9SAlexander Kabaev __function, __condition); 99*f8a1b7d9SAlexander Kabaev abort(); 100*f8a1b7d9SAlexander Kabaev } 101*f8a1b7d9SAlexander Kabaev } // namespace __debug 102*f8a1b7d9SAlexander Kabaev } // namespace std 103*f8a1b7d9SAlexander Kabaev 104*f8a1b7d9SAlexander Kabaev #define _GLIBCXX_DEBUG_ASSERT(_Condition) \ 105*f8a1b7d9SAlexander Kabaev do \ 106*f8a1b7d9SAlexander Kabaev { \ 107ffeaf689SAlexander Kabaev if (! (_Condition)) \ 108*f8a1b7d9SAlexander Kabaev std::__debug::__replacement_assert(__FILE__, __LINE__, \ 109*f8a1b7d9SAlexander Kabaev __PRETTY_FUNCTION__, #_Condition); \ 110ffeaf689SAlexander Kabaev } while (false) 111ffeaf689SAlexander Kabaev 112ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_DEBUG_PEDANTIC 113*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_PEDASSERT(_Condition) _GLIBCXX_DEBUG_ASSERT(_Condition) 114ffeaf689SAlexander Kabaev #else 115ffeaf689SAlexander Kabaev # define _GLIBCXX_DEBUG_PEDASSERT(_Condition) 116ffeaf689SAlexander Kabaev #endif 117*f8a1b7d9SAlexander Kabaev # define _GLIBCXX_DEBUG_ONLY(_Statement) _Statement 118ffeaf689SAlexander Kabaev 119ffeaf689SAlexander Kabaev # define __glibcxx_requires_cond(_Cond,_Msg) _GLIBCXX_DEBUG_VERIFY(_Cond,_Msg) 120ffeaf689SAlexander Kabaev # define __glibcxx_requires_valid_range(_First,_Last) \ 121ffeaf689SAlexander Kabaev __glibcxx_check_valid_range(_First,_Last) 122ffeaf689SAlexander Kabaev # define __glibcxx_requires_sorted(_First,_Last) \ 123ffeaf689SAlexander Kabaev __glibcxx_check_sorted(_First,_Last) 124ffeaf689SAlexander Kabaev # define __glibcxx_requires_sorted_pred(_First,_Last,_Pred) \ 125ffeaf689SAlexander Kabaev __glibcxx_check_sorted_pred(_First,_Last,_Pred) 126ffeaf689SAlexander Kabaev # define __glibcxx_requires_partitioned(_First,_Last,_Value) \ 127ffeaf689SAlexander Kabaev __glibcxx_check_partitioned(_First,_Last,_Value) 128ffeaf689SAlexander Kabaev # define __glibcxx_requires_partitioned_pred(_First,_Last,_Value,_Pred) \ 129ffeaf689SAlexander Kabaev __glibcxx_check_partitioned_pred(_First,_Last,_Value,_Pred) 130ffeaf689SAlexander Kabaev # define __glibcxx_requires_heap(_First,_Last) \ 131ffeaf689SAlexander Kabaev __glibcxx_check_heap(_First,_Last) 132ffeaf689SAlexander Kabaev # define __glibcxx_requires_heap_pred(_First,_Last,_Pred) \ 133ffeaf689SAlexander Kabaev __glibcxx_check_heap_pred(_First,_Last,_Pred) 134ffeaf689SAlexander Kabaev # define __glibcxx_requires_nonempty() __glibcxx_check_nonempty() 135ffeaf689SAlexander Kabaev # define __glibcxx_requires_string(_String) __glibcxx_check_string(_String) 136ffeaf689SAlexander Kabaev # define __glibcxx_requires_string_len(_String,_Len) \ 137ffeaf689SAlexander Kabaev __glibcxx_check_string_len(_String,_Len) 138ffeaf689SAlexander Kabaev # define __glibcxx_requires_subscript(_N) __glibcxx_check_subscript(_N) 139ffeaf689SAlexander Kabaev 140*f8a1b7d9SAlexander Kabaev # include <debug/functions.h> 141ffeaf689SAlexander Kabaev # include <debug/formatter.h> 142ffeaf689SAlexander Kabaev 143ffeaf689SAlexander Kabaev #endif 144*f8a1b7d9SAlexander Kabaev 145*f8a1b7d9SAlexander Kabaev #endif // _GLIBCXX_DEBUG_MACRO_SWITCH_H 146