OSDN Git Service

PR c++/14179
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Jan 2012 16:40:26 +0000 (16:40 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Jan 2012 16:40:26 +0000 (16:40 +0000)
* vec.c (vec_gc_o_reserve_1): Use ggc_round_alloc_size.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183213 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/vec.c

index d06de3d..dd13d0b 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-16  Jason Merrill  <jason@redhat.com>
+
+       PR c++/14179
+       * vec.c (vec_gc_o_reserve_1): Use ggc_round_alloc_size.
+
 2012-01-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR bootstrap/51860
index c1d0034..783a3cf 100644 (file)
--- 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;