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