aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2004-10-30 19:20:43 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2004-10-30 19:20:43 +0000
commit61168ff146d478146e397e1f1d0666b6b1d80d75 (patch)
tree753ac795eb8843525859a0e1ef6e5b26c6eca59a
parent41724e6a1387d9135026dae1a25f912d6f6d8372 (diff)
downloadgcc-61168ff146d478146e397e1f1d0666b6b1d80d75.zip
gcc-61168ff146d478146e397e1f1d0666b6b1d80d75.tar.gz
gcc-61168ff146d478146e397e1f1d0666b6b1d80d75.tar.bz2
re PR middle-end/18096 (internal compiler error: in final_scan_insn, at final.c:2429)
PR middle-end/18096 * config/rs6000/rs6000.c (rs6000_emit_allocate_stack): Check that the stack adjustment, "size", is valid for Pmode. If the stack frame is too large, generate a trap insn and issue a warning. * gcc.dg/pr18096-1.c: New test case. From-SVN: r89896
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/rs6000/rs6000.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr18096-1.c12
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a0781cb..be8f9e0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-10-30 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/18096
+ * config/rs6000/rs6000.c (rs6000_emit_allocate_stack): Check that
+ the stack adjustment, "size", is valid for Pmode. If the stack
+ frame is too large, generate a trap insn and issue a warning.
+
2004-10-30 Kazu Hirata <kazu@cs.umass.edu>
* tree-ssa-dom.c: Fix comment typos.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index da196bf..9d01da7 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -13111,7 +13111,14 @@ rs6000_emit_allocate_stack (HOST_WIDE_INT size, int copy_r12)
rtx insn;
rtx stack_reg = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
rtx tmp_reg = gen_rtx_REG (Pmode, 0);
- rtx todec = GEN_INT (-size);
+ rtx todec = gen_int_mode (-size, Pmode);
+
+ if (INTVAL (todec) != -size)
+ {
+ warning("stack frame too large");
+ emit_insn (gen_trap ());
+ return;
+ }
if (current_function_limit_stack)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e804c2f..95e2a9d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2004-10-30 Roger Sayle <roger@eyesopen.com>
+ PR middle-end/18096
+ * gcc.dg/pr18096-1.c: New test case.
+
+2004-10-30 Roger Sayle <roger@eyesopen.com>
+
* gcc.dg/pr17581-1.c: Add missing prototype for abort.
2004-10-30 Joseph S. Myers <joseph@codesourcery.com>
diff --git a/gcc/testsuite/gcc.dg/pr18096-1.c b/gcc/testsuite/gcc.dg/pr18096-1.c
new file mode 100644
index 0000000..b11f71a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr18096-1.c
@@ -0,0 +1,12 @@
+/* PR middle-end/18096 */
+/* { dg-do compile { target powerpc-*-* } } */
+/* { dg-options "-O2" } */
+
+void f(char*);
+
+void mkcatdefs(char *fname)
+{
+ char line [2147483647];
+ f(line);
+} /* { dg-warning "stack frame too large" "stack frame too large" } */
+