From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keir Fraser Subject: Re: [PATCH] x86: mark BUG()s and assertion failures as terminal. Date: Thu, 19 Sep 2013 15:56:50 +0100 Message-ID: References: <1379601586-27173-1-git-send-email-tim@xen.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1379601586-27173-1-git-send-email-tim@xen.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Tim Deegan , xen-devel@lists.xen.org Cc: jbeulich@suse.com List-Id: xen-devel@lists.xenproject.org On 19/09/2013 15:39, "Tim Deegan" wrote: > 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 > --- > xen/include/asm-x86/bug.h | 11 ++++++++--- > 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 e5dd559..956bfd2 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 7009a09..7d6805c 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)) Do you mean for gcc-3.4 to use __builtin_unreachable()? This might be clearer, correcter, and better match the prevailing compiler.h style, if it was switched round to handle the __builtin_unreachable() case first. -- Keir > +#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. */