From 357c4350680bf29f0c7a115424e3da11c53b5582 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 3 Mar 2021 12:25:03 +0100 Subject: [PATCH] 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. --- 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 e85b06b6824b..6672da597ba7 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6660,7 +6660,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) @@ -6678,6 +6679,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; } }