summaryrefslogtreecommitdiff
path: root/gcc/ira.c
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-01 20:04:01 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-01 20:04:01 +0000
commit1c2859e1dc3955405c8eb17d6b4cd7828106b999 (patch)
tree9d8eef7ecfbe716d17be98b438245521b56c2b1e /gcc/ira.c
parent40e9ce2d71b6a11bcdf543df6fd15944c8ad808a (diff)
downloadgcc-1c2859e1dc3955405c8eb17d6b4cd7828106b999.tar.gz
PR ada/70017
* ira.c (do_reload): Issue warning for generic stack checking here... * reload1.c (reload): ...instead of here and streamline it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233862 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ira.c')
-rw-r--r--gcc/ira.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/ira.c b/gcc/ira.c
index 6b4a104cf8b..0973258d9e7 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -5404,9 +5404,8 @@ do_reload (void)
{
df_set_flags (DF_NO_INSN_RESCAN);
build_insn_chain ();
-
- need_dce = reload (get_insns (), ira_conflicts_p);
+ need_dce = reload (get_insns (), ira_conflicts_p);
}
timevar_pop (TV_RELOAD);
@@ -5484,6 +5483,20 @@ do_reload (void)
inform (DECL_SOURCE_LOCATION (decl), "for %qD", decl);
}
+ /* If we are doing generic stack checking, give a warning if this
+ function's frame size is larger than we expect. */
+ if (flag_stack_check == GENERIC_STACK_CHECK)
+ {
+ HOST_WIDE_INT size = get_frame_size () + STACK_CHECK_FIXED_FRAME_SIZE;
+
+ for (int i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ if (df_regs_ever_live_p (i) && !fixed_regs[i] && call_used_regs[i])
+ size += UNITS_PER_WORD;
+
+ if (size > STACK_CHECK_MAX_FRAME_SIZE)
+ warning (0, "frame size too large for reliable stack checking");
+ }
+
if (pic_offset_table_regno != INVALID_REGNUM)
pic_offset_table_rtx = gen_rtx_REG (Pmode, pic_offset_table_regno);