diff options
author | Richard Biener <rguenther@suse.de> | 2015-01-28 09:53:39 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-01-28 09:53:39 +0000 |
commit | 8aa33fadbe1ca12a8e1c3b188a2301a0239e8e7b (patch) | |
tree | 928d9bf3a2c8f257cd9c7177c6402c44b98d91a6 | |
parent | de5bcff3bcce9ccb415e354415825c2ad7f03316 (diff) | |
download | gcc-8aa33fadbe1ca12a8e1c3b188a2301a0239e8e7b.zip gcc-8aa33fadbe1ca12a8e1c3b188a2301a0239e8e7b.tar.gz gcc-8aa33fadbe1ca12a8e1c3b188a2301a0239e8e7b.tar.bz2 |
re PR libstdc++/64798 (g++.old-deja/g++.eh/badalloc1.C FAILs)
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/eh_alloc.cc | 17 |
2 files changed, 18 insertions, 8 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 169f02e..865e79b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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 diff --git a/libstdc++-v3/libsupc++/eh_alloc.cc b/libstdc++-v3/libsupc++/eh_alloc.cc index c77f53f..7ddd2b7 100644 --- a/libstdc++-v3/libsupc++/eh_alloc.cc +++ b/libstdc++-v3/libsupc++/eh_alloc.cc @@ -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) { |