[gcc r10-9409] Fix ICE with pathologically large frames

Eric Botcazou ebotcazou@gcc.gnu.org
Wed Mar 3 11:31:15 GMT 2021


https://gcc.gnu.org/g:2939b358936bb824330888def98ad848dea41483

commit r10-9409-g2939b358936bb824330888def98ad848dea41483
Author: Eric Botcazou <ebotcazou@adacore.com>
Date:   Wed Mar 3 12:25:03 2021 +0100

    Fix ICE with pathologically large frames
    
    gcc/
            PR target/99234
            * config/i386/i386.c (ix86_compute_frame_layout): For a SEH target,
            point back the hard frame pointer to its default location when the
            frame is larger than SEH_MAX_FRAME_SIZE.

Diff:
---
 gcc/config/i386/i386.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 7b803661366..e23f92b58cc 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -6357,7 +6357,8 @@ ix86_compute_frame_layout (void)
       frame->hard_frame_pointer_offset = frame->sse_reg_save_offset;
 
       /* If we can leave the frame pointer where it is, do so.  Also, return
-	 the establisher frame for __builtin_frame_address (0).  */
+	 the establisher frame for __builtin_frame_address (0) or else if the
+	 frame overflows the SEH maximum frame size.  */
       const HOST_WIDE_INT diff
 	= frame->stack_pointer_offset - frame->hard_frame_pointer_offset;
       if (diff <= 255)
@@ -6375,6 +6376,8 @@ ix86_compute_frame_layout (void)
 	     frame that is addressable with 8-bit offsets.  */
 	  frame->hard_frame_pointer_offset = frame->stack_pointer_offset - 128;
 	}
+      else
+	frame->hard_frame_pointer_offset = frame->hfp_save_offset;
     }
 }


More information about the Gcc-cvs mailing list