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