diff options
author | Roger Sayle <roger@eyesopen.com> | 2004-10-30 19:20:43 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2004-10-30 19:20:43 +0000 |
commit | 61168ff146d478146e397e1f1d0666b6b1d80d75 (patch) | |
tree | 753ac795eb8843525859a0e1ef6e5b26c6eca59a | |
parent | 41724e6a1387d9135026dae1a25f912d6f6d8372 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr18096-1.c | 12 |
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" } */ + |