[RFA] Fix PR 598 and PR 776
Neil Booth
neil@daikokuya.demon.co.uk
Fri Oct 26 15:09:00 GMT 2001
Since at least as far back as 2.95.x, GCC ICEs if an object of
sufficiently large size is allocated on the stack.
This is because assign_stack_temp_for_type expects a size of -1
(returned indirectly from int_size_for_type) to mean an object of
unknown size has been allocated on the stack, an ICE condition.
However, in fact -1 has an overloaded meaning: it also means object
too large (larger than the positive range of HOST_WIDE_INT).
This patch + testcase catches such cases before
assign_stack_temp_for_type sees -1, emits an error, and allocates a
small object instead to allow the compilation to continue.
Bootstrapping x86 Linux. OK to commit?
Neil.
* function.c (assign_temp): Recover gracefully when stack
objects are too large.
* testsuite/gcc.dg/largeobj.c: New test.
Index: function.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/function.c,v
retrieving revision 1.319
diff -u -p -r1.319 function.c
--- function.c 2001/10/23 22:59:15 1.319
+++ function.c 2001/10/26 21:58:34
@@ -849,14 +849,23 @@ assign_temp (type, keep, memory_required
if (size == 0)
size = 1;
- /* Unfortunately, we don't yet know how to allocate variable-sized
- temporaries. However, sometimes we have a fixed upper limit on
- the size (which is stored in TYPE_ARRAY_MAX_SIZE) and can use that
- instead. This is the case for Chill variable-sized strings. */
- if (size == -1 && TREE_CODE (type) == ARRAY_TYPE
- && TYPE_ARRAY_MAX_SIZE (type) != NULL_TREE
- && host_integerp (TYPE_ARRAY_MAX_SIZE (type), 1))
- size = tree_low_cst (TYPE_ARRAY_MAX_SIZE (type), 1);
+ if (size == -1)
+ {
+ if (TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type)) != 0)
+ {
+ error ("object too large for the stack");
+ size = 1;
+ }
+ /* Unfortunately, we don't yet know how to allocate
+ variable-sized temporaries. However, sometimes we have a
+ fixed upper limit on the size (which is stored in
+ TYPE_ARRAY_MAX_SIZE) and can use that instead. This is
+ the case for Chill variable-sized strings. */
+ else if (TREE_CODE (type) == ARRAY_TYPE
+ && TYPE_ARRAY_MAX_SIZE (type) != NULL_TREE
+ && host_integerp (TYPE_ARRAY_MAX_SIZE (type), 1))
+ size = tree_low_cst (TYPE_ARRAY_MAX_SIZE (type), 1);
+ }
tmp = assign_stack_temp_for_type (mode, size, keep, type);
return tmp;
Index: testsuite/gcc.dg/largeobj.c
===================================================================
RCS file: largeobj.c
diff -N largeobj.c
--- /dev/null Tue May 5 13:32:27 1998
+++ largeobj.c Fri Oct 26 14:58:34 2001
@@ -0,0 +1,11 @@
+/* PRs 598 and 776 - ICE when declaring large objects on the stack. */
+
+/* Because we need to pick a definite size for the array, this test
+ only overflows "properly" on 32-bit machines. */
+
+/* { dg-do compile { target i?86-*-* } } */
+
+int main()
+{
+ int a[540000000]; /* { dg-error "too large" } */
+}
More information about the Gcc-patches
mailing list