Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Avoid useless calls to abort() when throwing exceptions if the compiler is smart...
authorGabriel Corona <gabriel.corona@loria.fr>
Tue, 3 May 2016 09:39:34 +0000 (11:39 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Tue, 3 May 2016 09:39:34 +0000 (11:39 +0200)
include/xbt/base.h
include/xbt/ex.h

index 9d4ea07..38f9308 100644 (file)
   #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 <stdlib.h>
+    #define XBT_UNREACHABLE() abort()
+  #endif
+#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+  #define XBT_UNREACHABLE() __builtin_unreachable()
+#else
+  #include <stdlib.h>
+  #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): */
index 156c820..2113c3e 100644 (file)
@@ -45,6 +45,8 @@
 #ifndef __XBT_EX_H__
 #define __XBT_EX_H__
 
+#include <stdlib.h>
+
 #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