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 15namespace 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