+2016-09-16 Jonathan Wakely <jwakely@redhat.com>
+
+ * libsupc++/new_opa.cc [_GLIBCXX_HAVE_POSIX_MEMALIGN] (aligned_alloc):
+ Increase alignment if less than sizeof(void*).
+ [_GLIBCXX_HAVE_ALIGNED_ALLOC] (operator new(size_t, align_val_t)):
+ Increase size if not a multiple of alignment.
+
2016-09-15 Jonathan Wakely <jwakely@redhat.com>
* doc/xml/manual/debug_mode.xml: Minor editorial fixes.
aligned_alloc (std::size_t al, std::size_t sz)
{
void *ptr;
+ // The value of alignment shall be a power of two multiple of sizeof(void *).
+ if (al < sizeof(void*))
+ al = sizeof(void*);
int ret = posix_memalign (&ptr, al, sz);
if (ret == 0)
return ptr;
operator new (std::size_t sz, std::align_val_t al)
{
void *p;
+ std::size_t align = (std::size_t)al;
/* malloc (0) is unpredictable; avoid it. */
if (sz == 0)
sz = 1;
- while (__builtin_expect ((p = aligned_alloc ((std::size_t)al, sz)) == 0,
- false))
+#if _GLIBCXX_HAVE_ALIGNED_ALLOC
+ /* C11: the value of size shall be an integral multiple of alignment. */
+ if (std::size_t rem = sz % align)
+ sz += align - rem;
+#endif
+
+ while (__builtin_expect ((p = aligned_alloc (align, sz)) == 0, false))
{
new_handler handler = std::get_new_handler ();
if (! handler)