1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     assert.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 29161 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_ASSERT_H_
17 #define NN_ASSERT_H_
18 
19 #include <nn/dbg/dbg_DebugString.h>
20 #include <nn/dbg/dbg_Break.h>
21 #include <nn/result.h>
22 #include <nn/config.h>
23 #include <nn/util/util_StaticAssert.h>
24 //TORIAEZU
25 #include <nn/os/os_MemoryMapSelect.h>
26 
27 #include <cfloat>
28 
29 
30 // Assert
31 
32 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING
33     #ifdef NN_SYSTEM_KERNEL
34         #define NN_ASSERTMSG(exp, ...)                                                          \
35             (void) ((exp) || ( NN_LOG("Failed assertion at %s:%d\n  ", NN_FILE_NAME, __LINE__), \
36                                NN_LOG(__VA_ARGS__),                                             \
37                                NN_LOG("\n"),                                                    \
38                                ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT),                  \
39                                0) )
40         #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...)                                              \
41             (void) ((exp) || ( NN_LOG("Result Assertion cannot be used on Kernel at %s:%d\n  ", NN_FILE_NAME, __LINE__), \
42                                NN_LOG(__VA_ARGS__),                                             \
43                                NN_LOG("\n"),                                                    \
44                                ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT),                  \
45                                0) )
46     #else
47         #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT
48             #define NN_ASSERTMSG(exp, ...)                                                  \
49                 (void) ((exp) || nndbgAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__))
50             #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...)                              \
51                 (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__))
52         #else
53             #define NN_ASSERTMSG(exp, ...)                                                  \
54                 (void) ((exp) || nndbgAssertionFailureHandler(false, NULL, __LINE__, NULL))
55             #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...)                              \
56                 (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL))
57         #endif
58     #endif
59 #else
60     #define NN_ASSERTMSG(exp, ...) ((void)0)
61     #define NN_ASSERTMSG_WITH_RESULT(exp, result, ...) ((void)0)
62 #endif // NN_SWITCH_DISABLE_ASSERT_WARNING
63 
64 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK
65     #ifdef NN_SYSTEM_KERNEL
66         #define NN_TASSERTMSG_(exp, ...)                                                          \
67             (void) ((exp) || ( NN_TLOG_("Failed assertion at %s:%d\n  ", NN_FILE_NAME, __LINE__), \
68                                NN_TLOG_(__VA_ARGS__),                                             \
69                                NN_TLOG_("\n"),                                                    \
70                                ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT),                  \
71                                0) )
72         #define NN_SASSERTMSG_(exp, ...)                                                          \
73             (void) ((exp) || ( NN_SLOG_("Failed assertion at %s:%d\n  ", NN_FILE_NAME, __LINE__), \
74                                NN_SLOG_(__VA_ARGS__),                                             \
75                                NN_SLOG_("\n"),                                                    \
76                                ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT),                  \
77                                0) )
78         #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...)                                              \
79             (void) ((exp) || ( NN_TLOG_("Result Assertion cannot be used on Kernel at %s:%d\n  ", NN_FILE_NAME, __LINE__), \
80                                NN_TLOG_(__VA_ARGS__),                                             \
81                                NN_TLOG_("\n"),                                                    \
82                                ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT),                  \
83                                0) )
84         #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...)                                              \
85             (void) ((exp) || ( NN_SLOG_("Result Assertion cannot be used on Kernel at %s:%d\n  ", NN_FILE_NAME, __LINE__), \
86                                NN_SLOG_(__VA_ARGS__),                                             \
87                                NN_SLOG_("\n"),                                                    \
88                                ::nn::dbg::Break(nn::dbg::BREAK_REASON_ASSERT),                  \
89                                0) )
90     #else
91         #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK
92             #define NN_TASSERTMSG_(exp, ...)                                                  \
93                 (void) ((exp) || nndbgTAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__))
94             #define NN_SASSERTMSG_(exp, ...)                                                  \
95                 (void) ((exp) || nndbgAssertionFailureHandler(true, NN_FILE_NAME, __LINE__, __VA_ARGS__))
96             #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...)                              \
97                 (void) ((exp) || nnResultTFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__))
98             #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...)                              \
99                 (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__))
100         #else
101             #define NN_TASSERTMSG_(exp, ...)                                                  \
102                 (void) ((exp) || nndbgTAssertionFailureHandler(false, NULL, __LINE__, NULL))
103             #define NN_SASSERTMSG_(exp, ...)                                                  \
104                 (void) ((exp) || nndbgAssertionFailureHandler(false, NULL, __LINE__, NULL))
105             #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...)                              \
106                 (void) ((exp) || nnResultTFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL))
107             #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...)                              \
108                 (void) ((exp) || nnResultFailureHandler(static_cast< ::nn::Result>(result), NULL, __LINE__, NULL))
109         #endif
110     #endif
111 #else
112     #define NN_TASSERTMSG_(exp, ...) ((void)0)
113     #define NN_SASSERTMSG_(exp, ...) ((void)0)
114     #define NN_TASSERTMSG_WITH_RESULT_(exp, result, ...) ((void)0)
115     #define NN_SASSERTMSG_WITH_RESULT_(exp, result, ...) ((void)0)
116 #endif // NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK
117 
118 
119 #define NN_ANY_TO_UPTR(ptr)         ((uptr)((const void*)(ptr)))
120 #define NN_IS_VALID_POINTER(ptr)    ( (NN_OS_ADDR_NULL_TRAP_END <= NN_ANY_TO_UPTR(ptr)) \
121                                         && (NN_ANY_TO_UPTR(ptr) < NN_OS_ADDR_SPACE_END) )
122 
123 
124 #define NN_ASSERT(exp)                      NN_ASSERTMSG((exp), "%s", #exp)
125 #define NN_TASSERT_(exp)                    NN_TASSERTMSG_((exp), "%s", #exp)
126 #define NN_SASSERT_(exp)                    NN_SASSERTMSG_((exp), "%s", #exp)
127 
128 #define NN_ASSERT_RESULT(exp)               NN_ASSERTMSG_WITH_RESULT((exp).IsSuccess(), (exp), "")
129 #define NN_TASSERT_RESULT_(exp)             NN_TASSERTMSG_WITH_RESULT_((exp).IsSuccess(), (exp), "")
130 #define NN_SASSERT_RESULT_(exp)             NN_SASSERTMSG_WITH_RESULT_((exp).IsSuccess(), (exp), "")
131 
132 #define NN_NULL_ASSERT(exp)                 NN_ASSERTMSG( (exp) != NULL, "%s must not be NULL", #exp )
133 #define NN_NULL_TASSERT_(exp)               NN_TASSERTMSG_( (exp) != NULL, "%s must not be NULL", #exp )
134 #define NN_NULL_SASSERT_(exp)               NN_SASSERTMSG_( (exp) != NULL, "%s must not be NULL", #exp )
135 
136 #define NN_ALIGN_ASSERT(exp, align)         NN_ASSERTMSG( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align )
137 #define NN_ALIGN_TASSERT_(exp, align)       NN_TASSERTMSG_( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align )
138 #define NN_ALIGN_SASSERT_(exp, align)       NN_SASSERTMSG_( ((uptr)(exp)) % (align) == 0, "%s(=0x%08x) must be %d byte aligned.", #exp, (exp), align )
139 
140 #define NN_MIN_ASSERT(exp, min)             NN_ASSERTMSG( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min )
141 #define NN_MIN_TASSERT_(exp, min)           NN_TASSERTMSG_( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min )
142 #define NN_MIN_SASSERT_(exp, min)           NN_SASSERTMSG_( (exp) >= (min), "%s(=%d) must be >= %s(=%d).", #exp, (exp), #min, min )
143 
144 #define NN_MAX_ASSERT(exp, max)             NN_ASSERTMSG( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max )
145 #define NN_MAX_TASSERT_(exp, max)           NN_TASSERTMSG_( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max )
146 #define NN_MAX_SASSERT_(exp, max)           NN_SASSERTMSG_( (exp) <= (max), "%s(=%d) must be <= %s(=%d).", #exp, (exp), #max, max )
147 
148 #define NN_MINMAX_ASSERT(exp, min, max)     NN_ASSERTMSG( (exp) >= (min) && (exp) <= (max), "%s(=%d) must be >= %s(=%d) and <= %s(=%d).", #exp, (exp), #min, min, #max, max )
149 #define NN_MINMAX_TASSERT_(exp, min, max)   NN_TASSERTMSG_( (exp) >= (min) && (exp) <= (max), "%s(=%d) must be >= %s(=%d) and <= %s(=%d).", #exp, (exp), #min, min, #max, max )
150 #define NN_MINMAX_SASSERT_(exp, min, max)   NN_SASSERTMSG_( (exp) >= (min) && (exp) <= (max), "%s(=%d) must be >= %s(=%d) and <= %s(=%d).", #exp, (exp), #min, min, #max, max )
151 
152 #define NN_EQUAL_ASSERT(exp, equ)           NN_ASSERTMSG( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ )
153 #define NN_EQUAL_TASSERT_(exp, equ)         NN_TASSERTMSG_( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ )
154 #define NN_EQUAL_SASSERT_(exp, equ)         NN_SASSERTMSG_( (exp) == (equ), "%s(=%d) must be == %s(=%d).", #exp, (exp), #equ, equ )
155 
156 #define NN_NOT_EQUAL_ASSERT(exp, equ)       NN_ASSERTMSG( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ )
157 #define NN_NOT_EQUAL_TASSERT_(exp, equ)     NN_TASSERTMSG_( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ )
158 #define NN_NOT_EQUAL_SASSERT_(exp, equ)     NN_SASSERTMSG_( (exp) != (equ), "%s(=%d) must be != %s(=%d).", #exp, (exp), #equ, equ )
159 
160 #define NN_POINTER_ASSERT(p)                NN_ASSERTMSG(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p))
161 #define NN_POINTER_TASSERT_(p)              NN_TASSERTMSG_(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p))
162 #define NN_POINTER_SASSERT_(p)              NN_SASSERTMSG_(NN_IS_VALID_POINTER(p), "%s(=0x%08X) is invalid pointer", #p, (p))
163 
164 #define NN_THIS_ASSERT()                    NN_POINTER_ASSERT(this)
165 #define NN_THIS_TASSERT_()                  NN_POINTER_TASSERT_(this)
166 #define NN_THIS_SASSERT_()                  NN_POINTER_SASSERT_(this)
167 
168 #define NN_ASSERT_WITH_RESULT(exp, result)      NN_ASSERTMSG_WITH_RESULT( (exp), (result), "%s", #exp )
169 #define NN_TASSERT_WITH_RESULT_(exp, result)    NN_TASSERTMSG_WITH_RESULT_( (exp), (result), "%s", #exp )
170 #define NN_SASSERT_WITH_RESULT_(exp, result)    NN_SASSERTMSG_WITH_RESULT_( (exp), (result), "%s", #exp )
171 
172 #define NN_FLOAT_ASSERT(exp) \
173             NN_ASSERTMSG((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.")
174 #define NN_FLOAT_TASSERT_(exp) \
175             NN_TASSERTMSG_((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.")
176 #define NN_FLOAT_SASSERT_(exp) \
177             NN_SASSERTMSG_((-FLT_MAX <= (exp) && (exp) <= FLT_MAX), "Floating Point Value Error\n"#exp" is infinite or nan.")
178 
179 
180 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING
181     #define NN_RESULT_ASSERT(exp)    NN_UTIL_PANIC_IF_FAILED(exp)
182 #else
183     #define NN_RESULT_ASSERT(exp)    ((void)0)
184 #endif
185 
186 
187 // Panic
188 
189 #ifdef __cplusplus
190 #define NN_PANIC(...) \
191             (void) (NN_LOG("Panic: %s:%d\n", NN_FILE_NAME, __LINE__),       \
192                     NN_LOG(__VA_ARGS__),                                    \
193                     NN_LOG("\n"),                                           \
194                     ::nn::dbg::Panic())
195 #define NN_TPANIC_(...) \
196             (void) (NN_TLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__),     \
197                     NN_TLOG_(__VA_ARGS__),                                  \
198                     NN_TLOG_("\n"),                                         \
199                     ::nn::dbg::Panic())
200 #define NN_SPANIC_(...) \
201             (void) (NN_SLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__),     \
202                     NN_SLOG_(__VA_ARGS__),                                  \
203                     NN_SLOG_("\n"),                                         \
204                     ::nn::dbg::Panic())
205 #else
206 #define NN_PANIC(...) \
207             (void) (NN_LOG("Panic: %s:%d\n", NN_FILE_NAME, __LINE__),       \
208                     NN_LOG(__VA_ARGS__),                                    \
209                     NN_LOG("\n"),                                           \
210                     nndbgPanic())
211 #define NN_TPANIC_(...) \
212             (void) (NN_TLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__),     \
213                     NN_TLOG_(__VA_ARGS__),                                  \
214                     NN_TLOG_("\n"),                                         \
215                     nndbgPanic())
216 #define NN_SPANIC_(...) \
217             (void) (NN_SLOG_("Panic: %s:%d\n", NN_FILE_NAME, __LINE__),     \
218                     NN_SLOG_(__VA_ARGS__),                                  \
219                     NN_SLOG_("\n"),                                         \
220                     nndbgPanic())
221 #endif
222 
223 #define NN_PANIC_WITH_RESULT(result, ...) \
224     ((void)nnResultPanicHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__), NN_PANIC(__VA_ARGS__))
225 
226 #define NN_TPANIC_WITH_RESULT_(result, ...) \
227     ((void)nnResultTPanicHandler(static_cast< ::nn::Result>(result), NN_FILE_NAME, __LINE__, __VA_ARGS__), NN_TPANIC_(__VA_ARGS__))
228 
229 #define NN_PANIC_IF_FALSE(result) \
230 do \
231 { \
232     if (!(result)) \
233     { \
234         NN_PANIC("Failed condition."); \
235     } \
236 } while(0) \
237 
238 #define NN_TPANIC_IF_FALSE_(result) \
239 do \
240 { \
241     if (!(result)) \
242     { \
243         NN_TPANIC_("Failed condition."); \
244     } \
245 } while(0) \
246 
247 #define NN_PANIC_IF_NULL(result) NN_PANIC_IF_FALSE(result)
248 #define NN_TPANIC_IF_NULL_(result) NN_TPANIC_IF_FALSE_(result)
249 
250 
251 // Warning
252 
253 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING
254     #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT
255         #define NN_WARNING(exp, ...) (void) ((exp) || (nndbgDetailPrintf(__VA_ARGS__), 0))
256     #else
257         #define NN_WARNING(exp, ...)  ((void)0)
258     #endif
259 #else
260     #define NN_WARNING(exp, ...)  ((void)0)
261 #endif // NN_SWITCH_DISABLE_ASSERT_WARNING
262 
263 #ifndef NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK
264     #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK
265         #define NN_TWARNING_(exp, ...) (void) ((exp) || (nndbgDetailTPrintf(__VA_ARGS__), 0))
266         #define NN_SWARNING_(exp, ...) (void) ((exp) || (nndbgDetailPrintf(__VA_ARGS__), 0))
267     #else
268         #define NN_TWARNING_(exp, ...)  ((void)0)
269         #define NN_SWARNING_(exp, ...)  ((void)0)
270     #endif
271 #else
272     #define NN_TWARNING_(exp, ...)  ((void)0)
273     #define NN_SWARNING_(exp, ...)  ((void)0)
274 #endif // NN_SWITCH_DISABLE_ASSERT_WARNING_FOR_SDK
275 
276 #endif /* NN_ASSERT_H_ */
277