re PR libstdc++/64798 (g++.old-deja/g++.eh/badalloc1.C FAILs)
authorRichard Biener <rguenther@suse.de>
Wed, 28 Jan 2015 09:53:39 +0000 (09:53 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 28 Jan 2015 09:53:39 +0000 (09:53 +0000)
2015-01-28  Richard Biener  <rguenther@suse.de>

PR libstdc++/64798
* libsupc++/eh_alloc.cc (struct allocated_entry): Align
data member.
(pool::allocate): Adjust allocation size and alignment to
that change.
(pool::free): Adjust pointer offsetting.

From-SVN: r220201

libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/eh_alloc.cc

index 169f02e0312a47c7907a3a02b30367cae0ff8117..865e79b48da9eea539c6cd2d4a7f1cd04181bdaa 100644 (file)
@@ -1,3 +1,12 @@
+2015-01-28  Richard Biener  <rguenther@suse.de>
+
+       PR libstdc++/64798
+       * libsupc++/eh_alloc.cc (struct allocated_entry): Align
+       data member.
+       (pool::allocate): Adjust allocation size and alignment to
+       that change.
+       (pool::free): Adjust pointer offsetting.
+
 2015-01-27  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/64368
index c77f53fdf025616a32b205883aa06cae30a4b880..7ddd2b746d83d8da9653c6b876ec41bd80004f10 100644 (file)
@@ -94,7 +94,7 @@ namespace
       };
       struct allocated_entry {
        std::size_t size;
-       char data[];
+       char data[] __attribute__((aligned));
       };
 
       // A single mutex controlling emergency allocations.
@@ -133,17 +133,18 @@ namespace
   void *pool::allocate (std::size_t size)
     {
       __gnu_cxx::__scoped_lock sentry(emergency_mutex);
-      // We need an additional size_t member.
-      size += sizeof (std::size_t);
+      // We need an additional size_t member plus the padding to
+      // ensure proper alignment of data.
+      size += offsetof (allocated_entry, data);
       // And we need to at least hand out objects of the size of
       // a freelist entry.
       if (size < sizeof (free_entry))
        size = sizeof (free_entry);
-      // And we need to align objects we hand out to the required
-      // alignment of a freelist entry (this really aligns the
+      // And we need to align objects we hand out to the maximum
+      // alignment required on the target (this really aligns the
       // tail which will become a new freelist entry).
-      size = ((size + __alignof__(free_entry) - 1)
-             & ~(__alignof__(free_entry) - 1));
+      size = ((size + __alignof__ (allocated_entry::data) - 1)
+             & ~(__alignof__ (allocated_entry::data) - 1));
       // Search for an entry of proper size on the freelist.
       free_entry **e;
       for (e = &first_free_entry;
@@ -185,7 +186,7 @@ namespace
     {
       __gnu_cxx::__scoped_lock sentry(emergency_mutex);
       allocated_entry *e = reinterpret_cast <allocated_entry *>
-       (reinterpret_cast <char *> (data) - sizeof (std::size_t));
+       (reinterpret_cast <char *> (data) - offsetof (allocated_entry, data));
       std::size_t sz = e->size;
       if (!first_free_entry)
        {