diff options
Diffstat (limited to 'include/linux/bug.h')
-rw-r--r-- | include/linux/bug.h | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/include/linux/bug.h b/include/linux/bug.h index dc11dc762fc3..7f4818673c41 100644 --- a/include/linux/bug.h +++ b/include/linux/bug.h | |||
@@ -17,6 +17,7 @@ struct pt_regs; | |||
17 | #define BUILD_BUG_ON_ZERO(e) (0) | 17 | #define BUILD_BUG_ON_ZERO(e) (0) |
18 | #define BUILD_BUG_ON_NULL(e) ((void*)0) | 18 | #define BUILD_BUG_ON_NULL(e) ((void*)0) |
19 | #define BUILD_BUG_ON_INVALID(e) (0) | 19 | #define BUILD_BUG_ON_INVALID(e) (0) |
20 | #define BUILD_BUG_ON_MSG(cond, msg) (0) | ||
20 | #define BUILD_BUG_ON(condition) (0) | 21 | #define BUILD_BUG_ON(condition) (0) |
21 | #define BUILD_BUG() (0) | 22 | #define BUILD_BUG() (0) |
22 | #else /* __CHECKER__ */ | 23 | #else /* __CHECKER__ */ |
@@ -40,6 +41,15 @@ struct pt_regs; | |||
40 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e)))) | 41 | #define BUILD_BUG_ON_INVALID(e) ((void)(sizeof((__force long)(e)))) |
41 | 42 | ||
42 | /** | 43 | /** |
44 | * BUILD_BUG_ON_MSG - break compile if a condition is true & emit supplied | ||
45 | * error message. | ||
46 | * @condition: the condition which the compiler should know is false. | ||
47 | * | ||
48 | * See BUILD_BUG_ON for description. | ||
49 | */ | ||
50 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) | ||
51 | |||
52 | /** | ||
43 | * BUILD_BUG_ON - break compile if a condition is true. | 53 | * BUILD_BUG_ON - break compile if a condition is true. |
44 | * @condition: the condition which the compiler should know is false. | 54 | * @condition: the condition which the compiler should know is false. |
45 | * | 55 | * |
@@ -60,15 +70,8 @@ struct pt_regs; | |||
60 | #ifndef __OPTIMIZE__ | 70 | #ifndef __OPTIMIZE__ |
61 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) | 71 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) |
62 | #else | 72 | #else |
63 | #define BUILD_BUG_ON(condition) \ | 73 | #define BUILD_BUG_ON(condition) \ |
64 | do { \ | 74 | BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition) |
65 | bool __cond = !!(condition); \ | ||
66 | extern void __build_bug_on_failed(void) \ | ||
67 | __compiletime_error("BUILD_BUG_ON failed"); \ | ||
68 | if (__cond) \ | ||
69 | __build_bug_on_failed(); \ | ||
70 | __compiletime_error_fallback(__cond); \ | ||
71 | } while (0) | ||
72 | #endif | 75 | #endif |
73 | 76 | ||
74 | /** | 77 | /** |
@@ -78,12 +81,7 @@ struct pt_regs; | |||
78 | * build time, you should use BUILD_BUG to detect if it is | 81 | * build time, you should use BUILD_BUG to detect if it is |
79 | * unexpectedly used. | 82 | * unexpectedly used. |
80 | */ | 83 | */ |
81 | #define BUILD_BUG() \ | 84 | #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed") |
82 | do { \ | ||
83 | extern void __build_bug_failed(void) \ | ||
84 | __compiletime_error("BUILD_BUG failed");\ | ||
85 | __build_bug_failed(); \ | ||
86 | } while (0) | ||
87 | 85 | ||
88 | #endif /* __CHECKER__ */ | 86 | #endif /* __CHECKER__ */ |
89 | 87 | ||