diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-01-24 16:13:17 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-01-24 16:13:17 +0100 |
commit | 134c2de3336b55561bb73a743dd5368ffef71716 (patch) | |
tree | f8fcf51e57edbc14ce3bd08506bcad307e4a35a9 /gcc/tree-stdarg.c | |
parent | 160b8b8014c02e0863633caec43bb5f322cfc0db (diff) | |
download | gcc-134c2de3336b55561bb73a743dd5368ffef71716.zip gcc-134c2de3336b55561bb73a743dd5368ffef71716.tar.gz gcc-134c2de3336b55561bb73a743dd5368ffef71716.tar.bz2 |
re PR middle-end/34934 (-O1 crash compile *** glibc detected *** /usr/lib/gcc/i486-linux-gnu/4.2.3/cc1: double free or corruption (!prev))
PR middle-end/34934
* tree-stdarg.c (reachable_at_most_once): Use VEC vector instead of
a fixed vector for stack.
* gcc.c-torture/compile/20080124-1.c: New test.
From-SVN: r131780
Diffstat (limited to 'gcc/tree-stdarg.c')
-rw-r--r-- | gcc/tree-stdarg.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c index 168bd2f..8df09ec 100644 --- a/gcc/tree-stdarg.c +++ b/gcc/tree-stdarg.c @@ -1,5 +1,5 @@ /* Pass computing data for optimizing stdarg functions. - Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. Contributed by Jakub Jelinek <jakub@redhat.com> This file is part of GCC. @@ -46,9 +46,9 @@ along with GCC; see the file COPYING3. If not see static bool reachable_at_most_once (basic_block va_arg_bb, basic_block va_start_bb) { - edge *stack, e; + VEC (edge, heap) *stack = NULL; + edge e; edge_iterator ei; - int sp; sbitmap visited; bool ret; @@ -58,22 +58,18 @@ reachable_at_most_once (basic_block va_arg_bb, basic_block va_start_bb) if (! dominated_by_p (CDI_DOMINATORS, va_arg_bb, va_start_bb)) return false; - stack = XNEWVEC (edge, n_basic_blocks + 1); - sp = 0; - visited = sbitmap_alloc (last_basic_block); sbitmap_zero (visited); ret = true; FOR_EACH_EDGE (e, ei, va_arg_bb->preds) - stack[sp++] = e; + VEC_safe_push (edge, heap, stack, e); - while (sp) + while (! VEC_empty (edge, stack)) { basic_block src; - --sp; - e = stack[sp]; + e = VEC_pop (edge, stack); src = e->src; if (e->flags & EDGE_COMPLEX) @@ -98,11 +94,11 @@ reachable_at_most_once (basic_block va_arg_bb, basic_block va_start_bb) { SET_BIT (visited, src->index); FOR_EACH_EDGE (e, ei, src->preds) - stack[sp++] = e; + VEC_safe_push (edge, heap, stack, e); } } - free (stack); + VEC_free (edge, heap, stack); sbitmap_free (visited); return ret; } |