MINOR: compiler: rely on builtin detection for __builtin_unreachable()
authorWilly Tarreau <w@1wt.eu>
Tue, 17 Dec 2024 08:10:53 +0000 (09:10 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 17 Apr 2025 15:43:00 +0000 (17:43 +0200)
Due to __builtin_unreachable() only being associated to gcc 4.5 and
above, it turns out it was not enabled for clang. It's not used *that*
much but still a little bit, so let's enable it now. This reduces the
code size by 0.2% and makes it a bit more efficient.

(cherry picked from commit 41fc18b1d1a37e2a6645ea4a8fb4d2d5f009fc0c)
[wt: backported to shut a gcc warning in debug.c with USE_THREAD=0]
Signed-off-by: Willy Tarreau <w@1wt.eu>

include/haproxy/compiler.h

index 42ed017..b8b6279 100644 (file)
 #define __read_mostly           HA_SECTION("read_mostly")
 #endif
 
+/* __builtin_unreachable() was added in gcc 4.5 */
+#if defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
+#define __has_builtin___builtin_unreachable 1
+#endif
+
 /* This allows gcc to know that some locations are never reached, for example
  * after a longjmp() in the Lua code, hence that some errors caught by such
  * methods cannot propagate further. This is important with gcc versions 6 and
 #ifdef DEBUG_USE_ABORT
 #define my_unreachable() abort()
 #else
-#if defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
+#if __has_builtin(__builtin_unreachable)
 #define my_unreachable() __builtin_unreachable()
 #else
 #define my_unreachable() do { } while (1)