u_debug.h revision d355eee5cacac30e2b4c8ac2f10964e2861a539e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************** 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * "Software"), to deal in the Software without restriction, including 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish, 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * the following conditions: 13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * The above copyright notice and this permission notice (including the 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * next paragraph) shall be included in all copies or substantial portions 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Software. 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) **************************************************************************/ 27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 28a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)/** 29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * @file 30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Cross-platform debugging helpers. 31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * For now it just has assert and printf replacements, but it might be extended 33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * with stack trace reports and more advanced logging in the near future. 34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @author Jose Fonseca <jrfonseca@tungstengraphics.com> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef P_DEBUG_H_ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define P_DEBUG_H_ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h> 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "p_compiler.h" 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifdef __cplusplus 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)extern "C" { 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DBG 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef DEBUG 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG 1 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NDEBUG 1 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void _debug_vprintf(const char *format, va_list ap); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static INLINE void 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_debug_printf(const char *format, ...) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_list ap; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_start(ap, format); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _debug_vprintf(format, ap); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) va_end(ap); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Print debug messages. 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The actual channel used to output debug message is platform specific. To 80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * avoid misformating or truncation, follow these rules of thumb: 81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * - output whole lines 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * - avoid outputing large strings (512 bytes is the current maximum length 83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * that is guaranteed to be printed in all platforms) 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)static INLINE void 86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)debug_printf(const char *format, ...) 87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles){ 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifdef DEBUG 89b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) va_list ap; 90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) va_start(ap, format); 91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) _debug_vprintf(format, ap); 92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) va_end(ap); 93b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else 94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (void) format; /* silence warning */ 95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#ifdef DEBUG 100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#define debug_vprintf(_format, _ap) _debug_vprintf(_format, _ap) 101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#else 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define debug_vprintf(_format, _ap) ((void)0) 10358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#endif 10458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 10558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 10658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch/** 1072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch * Dump a blob in hex to the same place that debug_printf sends its 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * messages. 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef DEBUG 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void debug_print_blob( const char *name, 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const void *blob, 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) unsigned size ); 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_print_blob(_name, _blob, _size) ((void)0) 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void _debug_break(void); 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/** 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Hard-coded breakpoint. 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifdef DEBUG 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if (defined(__i386__) || defined(__386__)) && defined(__GNUC__) 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define debug_break() __asm("int3") 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif (defined(__i386__) || defined(__386__)) && defined(__MSC__) 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define debug_break() _asm {int 3} 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define debug_break() _debug_break() 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else /* !DEBUG */ 1348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#define debug_break() ((void)0) 1358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif /* !DEBUG */ 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)long 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)debug_get_num_option(const char *name, long dfault); 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void _debug_assert_fail(const char *expr, 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const char *file, 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) unsigned line, 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const char *function); 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/** 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Assert macro 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do not expect that the assert call terminates -- errors must be handled 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * regardless of assert behavior. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef DEBUG 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define debug_assert(expr) ((expr) ? (void)0 : _debug_assert_fail(#expr, __FILE__, __LINE__, __FUNCTION__)) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define debug_assert(expr) ((void)0) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** Override standard assert macro */ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef assert 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef assert 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define assert(expr) debug_assert(expr) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)/** 168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) * Output the current function name. 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef DEBUG 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_checkpoint() \ 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _debug_printf("%s\n", __FUNCTION__) 173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define debug_checkpoint() \ 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((void)0) 176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif 177b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Output the full source code position. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef DEBUG 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_checkpoint_full() \ 18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) _debug_printf("%s:%u:%s", __FILE__, __LINE__, __FUNCTION__) 18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_checkpoint_full() \ 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ((void)0) 18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/** 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * Output a warning message. Muted on release version. 1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) */ 1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#ifdef DEBUG 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define debug_warning(__msg) \ 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) _debug_printf("%s:%u:%s: warning: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg) 197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#else 1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#define debug_warning(__msg) \ 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ((void)0) 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/** 20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * Output an error message. Not muted on release version. 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef DEBUG 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define debug_error(__msg) \ 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) _debug_printf("%s:%u:%s: error: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg) 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define debug_error(__msg) \ 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) _debug_printf("error: %s\n", __msg) 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used by debug_dump_enum and debug_dump_flags to describe symbols. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct debug_named_value 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *name; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long value; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/** 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Some C pre-processor magic to simplify creating named values. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Example: 229b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * @code 230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * static const debug_named_value my_names[] = { 231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_X), 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Y), 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DEBUG_NAMED_VALUE(MY_ENUM_VALUE_Z), 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DEBUG_NAMED_VALUE_END 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * }; 236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * 237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * ... 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * debug_printf("%s = %s\n", 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * name, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * debug_dump_enum(my_names, my_value)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ... 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @endcode 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_NAMED_VALUE(__symbol) {#__symbol, (unsigned long)__symbol} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEBUG_NAMED_VALUE_END {NULL, 0} 246 247 248/** 249 * Convert a enum value to a string. 250 */ 251const char * 252debug_dump_enum(const struct debug_named_value *names, 253 unsigned long value); 254 255 256/** 257 * Convert binary flags value to a string. 258 */ 259const char * 260debug_dump_flags(const struct debug_named_value *names, 261 unsigned long value); 262 263 264/** 265 * Get option. 266 * 267 * It is an alias for getenv on Linux. 268 * 269 * On Windows it reads C:\gallium.cfg, which is a text file with CR+LF line 270 * endings with one option per line as 271 * 272 * NAME=value 273 * 274 * This file must be terminated with an extra empty line. 275 */ 276const char * 277debug_get_option(const char *name, const char *dfault); 278 279boolean 280debug_get_bool_option(const char *name, boolean dfault); 281 282long 283debug_get_unsigned_option(const char *name, long dfault); 284 285unsigned long 286debug_get_flags_option(const char *name, 287 const struct debug_named_value *flags, 288 unsigned long dfault); 289 290 291void * 292debug_malloc(const char *file, unsigned line, const char *function, 293 size_t size); 294 295void 296debug_free(const char *file, unsigned line, const char *function, 297 void *ptr); 298 299void * 300debug_calloc(const char *file, unsigned line, const char *function, 301 size_t count, size_t size ); 302 303void * 304debug_realloc(const char *file, unsigned line, const char *function, 305 void *old_ptr, size_t old_size, size_t new_size ); 306 307void 308debug_memory_reset(void); 309 310void 311debug_memory_report(void); 312 313 314#ifdef __cplusplus 315} 316#endif 317 318#endif /* P_DEBUG_H_ */ 319