xref: /DragonOS/kernel/src/debug/bug.h (revision f049d1af01da7b92f312245ed411b22475b76065)
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