diff options
author | Tim Deegan <tim@xen.org> | 2013-09-19 15:38:09 +0100 |
---|---|---|
committer | Tim Deegan <tim@xen.org> | 2013-09-19 16:17:57 +0100 |
commit | d2fd6f2b01ed0e1dad93ee1970233e7b54507b26 (patch) | |
tree | cf9f920bdce2fcafbf771170d7511a6d75ec2272 | |
parent | dad7e45bf44c0569546a3ed7d0fa4182a4a73f0a (diff) | |
download | xen-d2fd6f2b01ed0e1dad93ee1970233e7b54507b26.tar.gz xen-d2fd6f2b01ed0e1dad93ee1970233e7b54507b26.tar.bz2 xen-d2fd6f2b01ed0e1dad93ee1970233e7b54507b26.zip |
x86: mark BUG()s and assertion failures as terminal.
This helps avoid static analysis false-positives, and might lead to
better code density as the compiler knows it doesn't have to restore
spilled state &c.
Signed-off-by: Tim Deegan <tim@xen.org>
Acked-by: Keir Fraser <keir@xen.org>
-rw-r--r-- | xen/include/asm-x86/bug.h | 11 | ||||
-rw-r--r-- | xen/include/xen/compiler.h | 6 |
2 files changed, 14 insertions, 3 deletions
diff --git a/xen/include/asm-x86/bug.h b/xen/include/asm-x86/bug.h index e5dd559407..956bfd231f 100644 --- a/xen/include/asm-x86/bug.h +++ b/xen/include/asm-x86/bug.h @@ -46,12 +46,17 @@ struct bug_frame { #define WARN() BUG_FRAME(BUGFRAME_warn, __LINE__, __FILE__, 0, NULL) -#define BUG() BUG_FRAME(BUGFRAME_bug, __LINE__, __FILE__, 0, NULL) +#define BUG() do { \ + BUG_FRAME(BUGFRAME_bug, __LINE__, __FILE__, 0, NULL); \ + unreachable(); \ +} while (0) #define run_in_exception_handler(fn) BUG_FRAME(BUGFRAME_run_fn, 0, fn, 0, NULL) -#define assert_failed(msg) \ - BUG_FRAME(BUGFRAME_assert, __LINE__, __FILE__, 1, msg) +#define assert_failed(msg) do { \ + BUG_FRAME(BUGFRAME_assert, __LINE__, __FILE__, 1, msg); \ + unreachable(); \ +} while (0) extern const struct bug_frame __start_bug_frames[], __stop_bug_frames_0[], diff --git a/xen/include/xen/compiler.h b/xen/include/xen/compiler.h index 7009a0930b..7d6805c415 100644 --- a/xen/include/xen/compiler.h +++ b/xen/include/xen/compiler.h @@ -14,6 +14,12 @@ #define always_inline __inline__ __attribute__ ((always_inline)) #define noinline __attribute__((noinline)) +#if (!defined(__clang__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 5)) +#define unreachable() do {} while (1) +#else +#define unreachable() __builtin_unreachable() +#endif + #ifdef __clang__ /* Clang can replace some vars with new automatic ones that go in .data; * mark all explicit-segment vars 'used' to prevent that. */ |