From 426042f5f227944c12fbdfb597e078cfbcb1e13d Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 16 Sep 2016 13:11:19 +0100 Subject: [PATCH] Adjust arguments to aligned_alloc or posix_memalign * 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. From-SVN: r240187 --- libstdc++-v3/ChangeLog | 7 +++++++ libstdc++-v3/libsupc++/new_opa.cc | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index f81e87f9694..cddff99466d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2016-09-16 Jonathan Wakely + + * 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 * doc/xml/manual/debug_mode.xml: Minor editorial fixes. diff --git a/libstdc++-v3/libsupc++/new_opa.cc b/libstdc++-v3/libsupc++/new_opa.cc index 6ff5421bd15..9c859c1b61b 100644 --- a/libstdc++-v3/libsupc++/new_opa.cc +++ b/libstdc++-v3/libsupc++/new_opa.cc @@ -39,6 +39,9 @@ static inline void* 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; @@ -58,13 +61,19 @@ _GLIBCXX_WEAK_DEFINITION void * 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) -- 2.30.2