xref: /aosp_15_r20/external/executorch/runtime/platform/assert.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker #pragma once
10*523fa7a6SAndroid Build Coastguard Worker 
11*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/abort.h>
12*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/compiler.h>
13*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/log.h>
14*523fa7a6SAndroid Build Coastguard Worker 
15*523fa7a6SAndroid Build Coastguard Worker /**
16*523fa7a6SAndroid Build Coastguard Worker  * Assertion failure message emit method.
17*523fa7a6SAndroid Build Coastguard Worker  *
18*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _format Printf-style message format string.
19*523fa7a6SAndroid Build Coastguard Worker  * @param[in] ... Format string arguments.
20*523fa7a6SAndroid Build Coastguard Worker  */
21*523fa7a6SAndroid Build Coastguard Worker #define ET_ASSERT_MESSAGE_EMIT(_format, ...)     \
22*523fa7a6SAndroid Build Coastguard Worker   ET_LOG(                                        \
23*523fa7a6SAndroid Build Coastguard Worker       Fatal,                                     \
24*523fa7a6SAndroid Build Coastguard Worker       "In function %s(), assert failed" _format, \
25*523fa7a6SAndroid Build Coastguard Worker       ET_FUNCTION,                               \
26*523fa7a6SAndroid Build Coastguard Worker       ##__VA_ARGS__)
27*523fa7a6SAndroid Build Coastguard Worker 
28*523fa7a6SAndroid Build Coastguard Worker /**
29*523fa7a6SAndroid Build Coastguard Worker  * Abort the runtime if the condition is not true.
30*523fa7a6SAndroid Build Coastguard Worker  * This check will be performed even in release builds.
31*523fa7a6SAndroid Build Coastguard Worker  *
32*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _cond Condition asserted as true.
33*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _format Printf-style message format string.
34*523fa7a6SAndroid Build Coastguard Worker  * @param[in] ... Format string arguments.
35*523fa7a6SAndroid Build Coastguard Worker  */
36*523fa7a6SAndroid Build Coastguard Worker #define ET_CHECK_MSG(_cond, _format, ...)                               \
37*523fa7a6SAndroid Build Coastguard Worker   do {                                                                  \
38*523fa7a6SAndroid Build Coastguard Worker     if ET_UNLIKELY (!(_cond)) {                                         \
39*523fa7a6SAndroid Build Coastguard Worker       ET_ASSERT_MESSAGE_EMIT(" (%s): " _format, #_cond, ##__VA_ARGS__); \
40*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::runtime_abort();                           \
41*523fa7a6SAndroid Build Coastguard Worker     }                                                                   \
42*523fa7a6SAndroid Build Coastguard Worker   } while (0)
43*523fa7a6SAndroid Build Coastguard Worker 
44*523fa7a6SAndroid Build Coastguard Worker /**
45*523fa7a6SAndroid Build Coastguard Worker  * Abort the runtime if the condition is not true.
46*523fa7a6SAndroid Build Coastguard Worker  * This check will be performed even in release builds.
47*523fa7a6SAndroid Build Coastguard Worker  *
48*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _cond Condition asserted as true.
49*523fa7a6SAndroid Build Coastguard Worker  */
50*523fa7a6SAndroid Build Coastguard Worker #define ET_CHECK(_cond)                       \
51*523fa7a6SAndroid Build Coastguard Worker   do {                                        \
52*523fa7a6SAndroid Build Coastguard Worker     if ET_UNLIKELY (!(_cond)) {               \
53*523fa7a6SAndroid Build Coastguard Worker       ET_ASSERT_MESSAGE_EMIT(": %s", #_cond); \
54*523fa7a6SAndroid Build Coastguard Worker       ::executorch::runtime::runtime_abort(); \
55*523fa7a6SAndroid Build Coastguard Worker     }                                         \
56*523fa7a6SAndroid Build Coastguard Worker   } while (0)
57*523fa7a6SAndroid Build Coastguard Worker 
58*523fa7a6SAndroid Build Coastguard Worker #ifdef NDEBUG
59*523fa7a6SAndroid Build Coastguard Worker 
60*523fa7a6SAndroid Build Coastguard Worker /**
61*523fa7a6SAndroid Build Coastguard Worker  * Abort the runtime if the condition is not true.
62*523fa7a6SAndroid Build Coastguard Worker  * This check will be performed in debug builds, but not release builds.
63*523fa7a6SAndroid Build Coastguard Worker  *
64*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _cond Condition asserted as true.
65*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _format Printf-style message format string.
66*523fa7a6SAndroid Build Coastguard Worker  * @param[in] ... Format string arguments.
67*523fa7a6SAndroid Build Coastguard Worker  */
68*523fa7a6SAndroid Build Coastguard Worker #define ET_DCHECK_MSG(_cond, _format, ...) ((void)0)
69*523fa7a6SAndroid Build Coastguard Worker 
70*523fa7a6SAndroid Build Coastguard Worker /**
71*523fa7a6SAndroid Build Coastguard Worker  * Abort the runtime if the condition is not true.
72*523fa7a6SAndroid Build Coastguard Worker  * This check will be performed in debug builds, but not release builds.
73*523fa7a6SAndroid Build Coastguard Worker  *
74*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _cond Condition asserted as true.
75*523fa7a6SAndroid Build Coastguard Worker  */
76*523fa7a6SAndroid Build Coastguard Worker #define ET_DCHECK(_cond) ((void)0)
77*523fa7a6SAndroid Build Coastguard Worker #define ET_DEBUG_ONLY [[maybe_unused]]
78*523fa7a6SAndroid Build Coastguard Worker 
79*523fa7a6SAndroid Build Coastguard Worker #else // NDEBUG
80*523fa7a6SAndroid Build Coastguard Worker 
81*523fa7a6SAndroid Build Coastguard Worker /**
82*523fa7a6SAndroid Build Coastguard Worker  * Abort the runtime if the condition is not true.
83*523fa7a6SAndroid Build Coastguard Worker  * This check will be performed in debug builds, but not release builds.
84*523fa7a6SAndroid Build Coastguard Worker  *
85*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _cond Condition asserted as true.
86*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _format Printf-style message format string.
87*523fa7a6SAndroid Build Coastguard Worker  * @param[in] ... Format string arguments.
88*523fa7a6SAndroid Build Coastguard Worker  */
89*523fa7a6SAndroid Build Coastguard Worker #define ET_DCHECK_MSG(_cond, _format, ...) \
90*523fa7a6SAndroid Build Coastguard Worker   ET_CHECK_MSG(_cond, _format, ##__VA_ARGS__)
91*523fa7a6SAndroid Build Coastguard Worker 
92*523fa7a6SAndroid Build Coastguard Worker /**
93*523fa7a6SAndroid Build Coastguard Worker  * Abort the runtime if the condition is not true.
94*523fa7a6SAndroid Build Coastguard Worker  * This check will be performed in debug builds, but not release builds.
95*523fa7a6SAndroid Build Coastguard Worker  *
96*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _cond Condition asserted as true.
97*523fa7a6SAndroid Build Coastguard Worker  */
98*523fa7a6SAndroid Build Coastguard Worker #define ET_DCHECK(_cond) ET_CHECK(_cond)
99*523fa7a6SAndroid Build Coastguard Worker #define ET_DEBUG_ONLY
100*523fa7a6SAndroid Build Coastguard Worker 
101*523fa7a6SAndroid Build Coastguard Worker #endif // NDEBUG
102*523fa7a6SAndroid Build Coastguard Worker 
103*523fa7a6SAndroid Build Coastguard Worker /**
104*523fa7a6SAndroid Build Coastguard Worker  * Assert that this code location is unreachable during execution.
105*523fa7a6SAndroid Build Coastguard Worker  */
106*523fa7a6SAndroid Build Coastguard Worker #define ET_ASSERT_UNREACHABLE()                                   \
107*523fa7a6SAndroid Build Coastguard Worker   do {                                                            \
108*523fa7a6SAndroid Build Coastguard Worker     ET_CHECK_MSG(false, "Execution should not reach this point"); \
109*523fa7a6SAndroid Build Coastguard Worker     ET_UNREACHABLE();                                             \
110*523fa7a6SAndroid Build Coastguard Worker   } while (0)
111*523fa7a6SAndroid Build Coastguard Worker 
112*523fa7a6SAndroid Build Coastguard Worker /**
113*523fa7a6SAndroid Build Coastguard Worker  * Assert that this code location is unreachable during execution.
114*523fa7a6SAndroid Build Coastguard Worker  *
115*523fa7a6SAndroid Build Coastguard Worker  * @param[in] _message Message on how to avoid this assertion error.
116*523fa7a6SAndroid Build Coastguard Worker  */
117*523fa7a6SAndroid Build Coastguard Worker #define ET_ASSERT_UNREACHABLE_MSG(_format, ...)            \
118*523fa7a6SAndroid Build Coastguard Worker   do {                                                     \
119*523fa7a6SAndroid Build Coastguard Worker     ET_CHECK_MSG(                                          \
120*523fa7a6SAndroid Build Coastguard Worker         false,                                             \
121*523fa7a6SAndroid Build Coastguard Worker         "Execution should not reach this point. " _format, \
122*523fa7a6SAndroid Build Coastguard Worker         ##__VA_ARGS__);                                    \
123*523fa7a6SAndroid Build Coastguard Worker     ET_UNREACHABLE();                                      \
124*523fa7a6SAndroid Build Coastguard Worker   } while (0)
125