From 7aeb037b25f4624d0a7ea6b1184047135e56b036 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 16 Jan 2012 11:40:26 -0500 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/vec.c | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) 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; -- 2.47.3