This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Error out instead of ICE on too large variables (PR other/42611)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 4 Jan 2010 15:21:58 -0500
- Subject: [PATCH] Error out instead of ICE on too large variables (PR other/42611)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
In GCC 3.4 variable expansion went through assign_temps which diagnosed too
large variables, but cfgexpand doesn't do that any longer, so we ICE whenever
defer_stack_allocation or expand_one_stack_var or expand_one_var uses
tree_low_cst.
Ok for trunk/4.4 if it passes bootstrap/regtest?
2010-01-04 Jakub Jelinek <jakub@redhat.com>
PR other/42611
* cfgexpand.c (expand_one_var): Diagnose too large variables.
* gcc.dg/pr42611.c: New test.
--- gcc/cfgexpand.c.jj 2009-07-15 13:30:23.000000000 +0200
+++ gcc/cfgexpand.c 2010-01-04 20:15:04.000000000 +0100
@@ -1116,6 +1116,14 @@ expand_one_var (tree var, bool toplevel,
if (really_expand)
expand_one_register_var (var);
}
+ else if (!host_integerp (DECL_SIZE_UNIT (var), 1))
+ {
+ if (really_expand)
+ {
+ error ("size of variable %q+D is too large", var);
+ expand_one_error_var (var);
+ }
+ }
else if (defer_stack_allocation (var, toplevel))
add_stack_var (var);
else
--- gcc/testsuite/gcc.dg/pr42611.c.jj 2010-01-04 20:17:40.000000000 +0100
+++ gcc/testsuite/gcc.dg/pr42611.c 2010-01-04 20:17:09.000000000 +0100
@@ -0,0 +1,18 @@
+/* PR other/42611 */
+/* { dg-do compile } */
+
+#define L \
+ (sizeof (__SIZE_TYPE__) == 1 ? __SCHAR_MAX__ \
+ : sizeof (__SIZE_TYPE__) == sizeof (short) ? __SHRT_MAX__ \
+ : sizeof (__SIZE_TYPE__) == sizeof (int) ? __INT_MAX__ \
+ : sizeof (__SIZE_TYPE__) == sizeof (long) ? __LONG_MAX__ \
+ : sizeof (__SIZE_TYPE__) == sizeof (long long) ? __LONG_LONG_MAX__ \
+ : __INTMAX_MAX__)
+struct S { int a; char b[L]; };
+
+void
+foo (void)
+{
+ struct S s; /* { dg-error "is too large" } */
+ asm volatile ("" : : "r" (&s));
+}
Jakub