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.  */

Reply via email to