1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License. 5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at 6d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// 9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software 10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and 13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License. 14d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 15d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// debug.h: Debugging utilities. 16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef COMMON_DEBUG_H_ 18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define COMMON_DEBUG_H_ 19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifdef __ANDROID__ 21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "../../Common/DebugAndroid.hpp" 22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#else 23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <stdio.h> 24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <assert.h> 25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#if !defined(TRACE_OUTPUT_FILE) 27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define TRACE_OUTPUT_FILE "debug.txt" 28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif 29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace es 31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{ 32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens // Outputs text to the debugging log 33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens void trace(const char *format, ...); 34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens} 35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// A macro to output a trace of a function call and its arguments to the debugging log 37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#if defined(ANGLE_DISABLE_TRACE) 38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define TRACE(message, ...) (void(0)) 39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#else 40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define TRACE(message, ...) es::trace("trace: %s(%d): " message "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__) 41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif 42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// A macro to output a function call and its arguments to the debugging log, to denote an item in need of fixing. 44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#if defined(ANGLE_DISABLE_TRACE) 45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define FIXME(message, ...) (void(0)) 46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#else 47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define FIXME(message, ...) do {es::trace("fixme: %s(%d): " message "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__); assert(false);} while(false) 48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif 49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// A macro to output a function call and its arguments to the debugging log, in case of error. 51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#if defined(ANGLE_DISABLE_TRACE) 52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define ERR(message, ...) (void(0)) 53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#else 54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define ERR(message, ...) do {es::trace("err: %s(%d): " message "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__); assert(false);} while(false) 55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif 56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// A macro asserting a condition and outputting failures to the debug log 58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#undef ASSERT 59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#if !defined(NDEBUG) 60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define ASSERT(expression) do { \ 61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens if(!(expression)) \ 62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens ERR("\t! Assert failed in %s(%d): "#expression"\n", __FUNCTION__, __LINE__); \ 63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens assert(expression); \ 64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } while(0) 65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#else 66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define ASSERT(expression) (void(0)) 67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif 68d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 69d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// A macro to indicate unimplemented functionality 70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#undef UNIMPLEMENTED 71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#if !defined(NDEBUG) 72d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define UNIMPLEMENTED() do { \ 73d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); \ 74d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens assert(false); \ 75d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } while(0) 76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#else 77d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens #define UNIMPLEMENTED() FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__) 78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif 79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// A macro for code which is not expected to be reached under valid assumptions 81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#undef UNREACHABLE 82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#if !defined(NDEBUG) 83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define UNREACHABLE(value) do { \ 84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens ERR("\t! Unreachable case reached: %s(%d). %s: %d\n", __FUNCTION__, __LINE__, #value, value); \ 85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens assert(false); \ 86d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens } while(0) 87d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#else 88d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens #define UNREACHABLE(value) ERR("\t! Unreachable reached: %s(%d). %s: %d\n", __FUNCTION__, __LINE__, #value, value) 89d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif 90d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 91d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif // __ANDROID__ 92d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens 93d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif // COMMON_DEBUG_H_ 94