https://gcc.gnu.org/g:0fdaf0eb61f8a270d6832feac4b81675b65bfd32
commit r16-7943-g0fdaf0eb61f8a270d6832feac4b81675b65bfd32 Author: Eric Botcazou <[email protected]> Date: Sat Mar 7 15:09:46 2026 +0100 Ada: adjust pattern matching to new stack probes on x86/Linux This fixes the couple of ACATS regressions introduced by the change: === acats tests === FAIL: c52103x FAIL: c52104x gcc/ada/ PR target/124336 * init.c (__gnat_adjust_context_for_raise) [x86/Linux]: Adjust pattern matching to new stack probes. Diff: --- gcc/ada/init.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/gcc/ada/init.c b/gcc/ada/init.c index 87d6cf242e49..edf66182a98e 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -507,17 +507,18 @@ __gnat_adjust_context_for_raise (int signo ATTRIBUTE_UNUSED, void *ucontext) #if defined (__i386__) unsigned long *pc = (unsigned long *)mcontext->gregs[REG_EIP]; - /* The pattern is "orl $0x0,(%esp)" for a probe in 32-bit mode. */ - if (signo == SIGSEGV && pc && *pc == 0x00240c83) + /* The pattern is "or{l,b} $0x0,(%esp)" for a probe in 32-bit mode. */ + if (signo == SIGSEGV && pc && (*pc == 0x00240c83 || *pc == 0x00240c80)) mcontext->gregs[REG_ESP] += 4096 + 4 * sizeof (unsigned long); #elif defined (__x86_64__) unsigned long long *pc = (unsigned long long *)mcontext->gregs[REG_RIP]; if (signo == SIGSEGV && pc /* The pattern is "orq $0x0,(%rsp)" for a probe in 64-bit mode. */ && ((*pc & 0xffffffffffLL) == 0x00240c8348LL - /* The pattern may also be "orl $0x0,(%esp)" for a probe in - x32 mode. */ - || (*pc & 0xffffffffLL) == 0x00240c83LL)) + /* The pattern is "orl $0x0,(%rsp)" for a probe in x32 mode. */ + || (*pc & 0xffffffffLL) == 0x00240c83LL) + /* The pattern may also be "orb $0x0,(%rsp)" in both modes. */ + || (*pc & 0xffffffffLL) == 0x00240c80LL) mcontext->gregs[REG_RSP] += 4096 + 4 * sizeof (unsigned long); #elif defined (__ia64__) /* ??? The IA-64 unwinder doesn't compensate for signals. */
