From f3b67d25914a2b5399d69afda4dc104c195f2078 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Tue, 3 May 2016 11:39:34 +0200 Subject: [PATCH] Avoid useless calls to abort() when throwing exceptions if the compiler is smart enough --- include/xbt/base.h | 15 +++++++++++++++ include/xbt/ex.h | 5 +++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/xbt/base.h b/include/xbt/base.h index 9d4ea07042..38f9308ec0 100644 --- a/include/xbt/base.h +++ b/include/xbt/base.h @@ -14,6 +14,21 @@ #define _GNU_SOURCE #endif +// Teach the compiler that some code path is unreacheable: +#if defined(__has_builtin) + #if __has_builtin(__builtin_unreachable) + #define XBT_UNREACHABLE() __builtin_unreachable() + #else + #include + #define XBT_UNREACHABLE() abort() + #endif +#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + #define XBT_UNREACHABLE() __builtin_unreachable() +#else + #include + #define XBT_UNREACHABLE() abort() +#endif + /* On MinGW, stdio.h defines __MINGW_PRINTF_FORMAT and __MINGW_SCANF_FORMAT which are the suitable format style (either gnu_printf or ms_printf) depending on which version is available (__USE_MINGW_ANSI_STDIO): */ diff --git a/include/xbt/ex.h b/include/xbt/ex.h index 156c820300..2113c3ee14 100644 --- a/include/xbt/ex.h +++ b/include/xbt/ex.h @@ -45,6 +45,8 @@ #ifndef __XBT_EX_H__ #define __XBT_EX_H__ +#include + #include "xbt/sysdep.h" #include "xbt/misc.h" #include "xbt/virtu.h" @@ -403,8 +405,7 @@ XBT_PUBLIC( void )__xbt_ex_terminate_default(xbt_ex_t * e); __xbt_ex_terminate((xbt_ex_t*)&(ctx->exception)); /* not catched */ \ else \ __ex_mctx_restore(ctx->ctx_mctx); /* catched somewhere */ \ - abort(); /* nope, stupid GCC, we won't survive a THROW */ \ - /* (this won't be reached) */ \ + XBT_UNREACHABLE(); \ } while(0) /** @brief Helper macro for THROW and THROWF -- 2.20.1