This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Error out instead of ICE on too large variables (PR other/42611)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]