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
This commit is contained in:
Richard Biener 2015-01-28 09:53:39 +00:00 committed by Richard Biener
parent de5bcff3bc
commit 8aa33fadbe
2 changed files with 18 additions and 8 deletions

View 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

View 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)
{