1 #pragma once 2 #include <common/compiler.h> 3 #include <common/kprint.h> 4 5 #pragma GCC push_options 6 #pragma GCC optimize("O0") 7 8 /** 9 * @brief 当condition为true时,认为产生了bug 10 * 11 */ 12 #define BUG_ON(condition) ({ \ 13 int __ret_bug_on = !!(condition); \ 14 if (unlikely(__ret_bug_on)) \ 15 kBUG("BUG at %s:%d", __FILE__, __LINE__); \ 16 unlikely(__ret_bug_on); \ 17 }) 18 19 /** 20 * @brief 当condition为true时输出警告信息 21 * 22 */ 23 #define WARN_ON(condition) ({ \ 24 int __ret_warn_on = !!(condition); \ 25 if (unlikely(__ret_warn_on)) \ 26 kwarn("Assertion failed at %s:%d", __FILE__, __LINE__); \ 27 unlikely(__ret_warn_on); \ 28 }) 29 30 /** 31 * @brief 当condition不为0时输出警告信息,且只会输出一次警告信息 32 * 33 */ 34 #define WARN_ON_ONCE(condition) ({ \ 35 static int __warned; \ 36 int __ret_warn_once = !!(condition); \ 37 \ 38 if (unlikely(__ret_warn_once && !__warned)) \ 39 { \ 40 __warned = true; \ 41 WARN_ON(1); \ 42 } \ 43 unlikely(__ret_warn_once); \ 44 }) 45 46 #define FAIL_ON_TO(condition, to) ({ \ 47 int __ret_warn_on = !!(condition); \ 48 if (unlikely(__ret_warn_on)) \ 49 goto to; \ 50 unlikely(__ret_warn_on); \ 51 }) 52 53 /** 54 * @brief 当condition为true时,中断编译,并输出错误信息msg 55 * 56 * 如果你的代码依赖于一些能够在编译期间计算出来的值,那么请使用这个宏以防止其他人错误的修改了这些值,从而导致程序运行错误 57 */ 58 #define BUILD_BUG_ON_MSG(condition, msg) complietime_assert(!(condition), msg) 59 60 /** 61 * @brief 当condition为true时,中断编译。 62 * 63 * 如果你的代码依赖于一些能够在编译期间计算出来的值,那么请使用这个宏以防止其他人错误的修改了这些值,从而导致程序运行错误 64 */ 65 #define BUILD_BUG_ON(condition) \ 66 BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition) 67 68 #pragma GCC pop_options