From: Jason Merrill Date: Mon, 16 Jan 2012 16:40:26 +0000 (-0500) Subject: re PR c++/14179 (out of memory while parsing array with many initializers) X-Git-Tag: releases/gcc-4.7.0~980 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7aeb037b25f4624d0a7ea6b1184047135e56b036;p=thirdparty%2Fgcc.git re PR c++/14179 (out of memory while parsing array with many initializers) PR c++/14179 * vec.c (vec_gc_o_reserve_1): Use ggc_round_alloc_size. From-SVN: r183213 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d06de3d16a91..dd13d0bbc72a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-01-16 Jason Merrill + + PR c++/14179 + * vec.c (vec_gc_o_reserve_1): Use ggc_round_alloc_size. + 2012-01-16 Jakub Jelinek PR bootstrap/51860 diff --git a/gcc/vec.c b/gcc/vec.c index c1d003492e3c..783a3cfd52d5 100644 --- a/gcc/vec.c +++ b/gcc/vec.c @@ -221,6 +221,7 @@ vec_gc_o_reserve_1 (void *vec, int reserve, size_t vec_offset, size_t elt_size, { struct vec_prefix *pfx = (struct vec_prefix *) vec; unsigned alloc = calculate_allocation (pfx, reserve, exact); + size_t size; if (!alloc) { @@ -229,7 +230,17 @@ vec_gc_o_reserve_1 (void *vec, int reserve, size_t vec_offset, size_t elt_size, return NULL; } - vec = ggc_realloc_stat (vec, vec_offset + alloc * elt_size PASS_MEM_STAT); + /* Calculate the amount of space we want. */ + size = vec_offset + alloc * elt_size; + /* Ask the allocator how much space it will really give us. */ + size = ggc_round_alloc_size (size); + /* Adjust the number of slots accordingly. */ + alloc = (size - vec_offset) / elt_size; + /* And finally, recalculate the amount of space we ask for. */ + size = vec_offset + alloc * elt_size; + + vec = ggc_realloc_stat (vec, size PASS_MEM_STAT); + ((struct vec_prefix *)vec)->alloc = alloc; if (!pfx) ((struct vec_prefix *)vec)->num = 0;