summaryrefslogtreecommitdiff
path: root/gcc/global.c
diff options
context:
space:
mode:
authorBrendan Kehoe <brendan@lisa.cygnus.com>1997-10-28 23:39:28 +0000
committerBrendan Kehoe <brendan@gcc.gnu.org>1997-10-28 18:39:28 -0500
commitba3b38784c486a363d676df2543be51d0eb357a0 (patch)
tree6e9ce222eb9af1aad3826cc235ca09e70aec95c5 /gcc/global.c
parentd540ae2cd874aeb3c4b07cdc0b25e1229eb4bf06 (diff)
downloadgcc-ba3b38784c486a363d676df2543be51d0eb357a0.tar.gz
global.c (global_alloc): Use xmalloc instead of alloca for CONFLICTS...
* global.c (global_alloc): Use xmalloc instead of alloca for CONFLICTS, since max_allocno * allocno_row_words alone can be more than 2.5Mb sometimes. From-SVN: r16223
Diffstat (limited to 'gcc/global.c')
-rw-r--r--gcc/global.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/global.c b/gcc/global.c
index 83b09fe431f..0480ebf3c4d 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -486,8 +486,11 @@ global_alloc (file)
allocno_row_words = (max_allocno + INT_BITS - 1) / INT_BITS;
- conflicts = (INT_TYPE *) alloca (max_allocno * allocno_row_words
- * sizeof (INT_TYPE));
+ /* We used to use alloca here, but the size of what it would try to
+ allocate would occasionally cause it to exceed the stack limit and
+ cause unpredictable core dumps. Some examples were > 2Mb in size. */
+ conflicts = (INT_TYPE *) xmalloc (max_allocno * allocno_row_words
+ * sizeof (INT_TYPE));
bzero ((char *) conflicts,
max_allocno * allocno_row_words * sizeof (INT_TYPE));
@@ -570,6 +573,8 @@ global_alloc (file)
}
}
+ free (conflicts);
+
/* Do the reloads now while the allocno data still exist, so that we can
try to assign new hard regs to any pseudo regs that are spilled. */