1 // 2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // debug.h: Debugging utilities. 8 9 #ifndef COMMON_DEBUG_H_ 10 #define COMMON_DEBUG_H_ 11 12 #include <stdio.h> 13 #include <assert.h> 14 15 namespace gl 16 { 17 // Outputs text to the debugging log 18 void trace(const char *format, ...); 19 } 20 21 // A macro to output a trace of a function call and its arguments to the debugging log 22 #if !defined(NDEBUG) && !defined(ANGLE_DISABLE_TRACE) 23 #define TRACE(message, ...) gl::trace("trace: %s"message"\n", __FUNCTION__, __VA_ARGS__) 24 #else 25 #define TRACE(...) ((void)0) 26 #endif 27 28 // A macro to output a function call and its arguments to the debugging log, to denote an item in need of fixing. Will occur even in release mode. 29 #define FIXME(message, ...) gl::trace("fixme: %s"message"\n", __FUNCTION__, __VA_ARGS__) 30 31 // A macro to output a function call and its arguments to the debugging log, in case of error. Will occur even in release mode. 32 #define ERR(message, ...) gl::trace("err: %s"message"\n", __FUNCTION__, __VA_ARGS__) 33 34 // A macro asserting a condition and outputting failures to the debug log 35 #define ASSERT(expression) do { \ 36 if(!(expression)) \ 37 ERR("\t! Assert failed in %s(%d): "#expression"\n", __FUNCTION__, __LINE__); \ 38 assert(expression); \ 39 } while(0) 40 41 42 // A macro to indicate unimplemented functionality 43 #ifndef NDEBUG 44 #define UNIMPLEMENTED() do { \ 45 FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); \ 46 assert(false); \ 47 } while(0) 48 #else 49 #define UNIMPLEMENTED() FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__) 50 #endif 51 52 // A macro for code which is not expected to be reached under valid assumptions 53 #ifndef NDEBUG 54 #define UNREACHABLE() do { \ 55 ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__); \ 56 assert(false); \ 57 } while(0) 58 #else 59 #define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__) 60 #endif 61 62 // A macro functioning as a compile-time assert to validate constant conditions 63 #define META_ASSERT(condition) typedef int COMPILE_TIME_ASSERT_##__LINE__[static_cast<bool>(condition)?1:-1] 64 65 #endif // COMMON_DEBUG_H_ 66