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