summaryrefslogtreecommitdiff
path: root/gcc/cfgexpand.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2009-11-26 21:46:45 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2009-11-26 21:46:45 +0000
commit15b83b0f4781d79436e45afb0afcca8ea33327ca (patch)
treea9aa8b9c7a24e7daac7f1cb68dc03d61d2c3775a /gcc/cfgexpand.c
parenta96caf80851972e5f4e3e48a368f7e9d9bf450d2 (diff)
downloadgcc-15b83b0f4781d79436e45afb0afcca8ea33327ca.tar.gz
cfgexpand (n_stack_vars_conflict): New static variable.
* cfgexpand (n_stack_vars_conflict): New static variable. (triangular_index): Reduce likelyhood of overflow by performing the division before the multiplication. (resize_stack_vars_conflict): Call fatal_error if overflow occurred in triangular_index. Update n_stack_vars_conflict. From-SVN: r154689
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r--gcc/cfgexpand.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 087b6240b9b..d3637a02548 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -217,6 +217,7 @@ static size_t *stack_vars_sorted;
is lower triangular. */
static bool *stack_vars_conflict;
static size_t stack_vars_conflict_alloc;
+static size_t n_stack_vars_conflict;
/* The phase of the stack frame. This is the known misalignment of
virtual_stack_vars_rtx from PREFERRED_STACK_BOUNDARY. That is,
@@ -335,7 +336,11 @@ triangular_index (size_t i, size_t j)
size_t t;
t = i, i = j, j = t;
}
- return (i * (i + 1)) / 2 + j;
+
+ if (i & 1)
+ return ((i + 1) / 2) * i + j;
+ else
+ return (i / 2) * (i + 1) + j;
}
/* Ensure that STACK_VARS_CONFLICT is large enough for N objects. */
@@ -346,12 +351,17 @@ resize_stack_vars_conflict (size_t n)
size_t size = triangular_index (n-1, n-1) + 1;
if (size <= stack_vars_conflict_alloc)
- return;
+ {
+ if (n > n_stack_vars_conflict)
+ fatal_error ("program is too large to be compiled on this machine");
+ return;
+ }
stack_vars_conflict = XRESIZEVEC (bool, stack_vars_conflict, size);
memset (stack_vars_conflict + stack_vars_conflict_alloc, 0,
(size - stack_vars_conflict_alloc) * sizeof (bool));
stack_vars_conflict_alloc = size;
+ n_stack_vars_conflict = n;
}
/* Make the decls associated with luid's X and Y conflict. */