From: Willy Tarreau Date: Fri, 2 Feb 2024 16:05:36 +0000 (+0100) Subject: MINOR: debug: make sure calls to ha_crash_now() are never merged X-Git-Tag: v3.0-dev3~93 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2bb192ba911a00d554db592bd5d80ab56e9c7398;p=thirdparty%2Fhaproxy.git 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). --- 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(); }