From 2bb192ba911a00d554db592bd5d80ab56e9c7398 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 2 Feb 2024 17:05:36 +0100 Subject: [PATCH] MINOR: debug: make sure calls to ha_crash_now() are never merged As indicated in previous commit, we don't want calls to ha_crash_now() to be merged, since it will make gdb return a wrong line number. This was found to happen with gcc 4.7 and 4.8 in h3.c where 26 calls end up as only 5 to 18 "ud2" instructions depending on optimizations. By calling DO_NOT_FOLD() just before provoking the trap, we can reliably avoid this folding problem. Note that this does not address the case where abort() is used instead (DEBUG_USE_ABORT). --- include/haproxy/bug.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/include/haproxy/bug.h b/include/haproxy/bug.h index c980727e7a..24a38ff172 100644 --- a/include/haproxy/bug.h +++ b/include/haproxy/bug.h @@ -51,6 +51,7 @@ #define ha_crash_now() do { \ /* ud2 opcode: 2 bytes, raises illegal instruction */ \ __asm__ volatile(".byte 0x0f,0x0b\n"); \ + DO_NOT_FOLD(); \ my_unreachable(); \ } while (0) @@ -58,6 +59,7 @@ #define ha_crash_now() do { \ /* udf#imm16: 4 bytes (), raises illegal instruction */ \ __asm__ volatile(".byte 0x00,0x00,0x00,0x00\n"); \ + DO_NOT_FOLD(); \ my_unreachable(); \ } while (0) @@ -77,6 +79,7 @@ static inline __attribute((always_inline)) void ha_crash_now(void) #if __GNUC_PREREQ__(5, 0) #pragma GCC diagnostic pop #endif + DO_NOT_FOLD(); my_unreachable(); } -- 2.47.3