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