From a801991954f70fb9470502d305065719849c5660 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 8 Aug 2018 16:16:43 +0100 Subject: [PATCH] Prevent internal aligned_alloc clashing with libc version If configure fails to detect aligned_alloc we will try to define our own in new_opa.cc but that could clash with the libcversion in . Use a namespace to keep them distinct. * libsupc++/new_opa.cc (aligned_alloc): Declare inside namespace to avoid clashing with an ::aligned_alloc function that was not detected by configure. From-SVN: r263409 --- libstdc++-v3/ChangeLog | 4 ++++ libstdc++-v3/libsupc++/new_opa.cc | 30 ++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 25432d9d21f..0bbc7f9e2c6 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2018-08-08 Jonathan Wakely + * libsupc++/new_opa.cc (aligned_alloc): Declare inside namespace to + avoid clashing with an ::aligned_alloc function that was not detected + by configure. + * doc/xml/manual/using.xml: Fix markup for empty table entry. * doc/html/*: Regenerate. diff --git a/libstdc++-v3/libsupc++/new_opa.cc b/libstdc++-v3/libsupc++/new_opa.cc index 5be0cc2ca65..68eac5b8ceb 100644 --- a/libstdc++-v3/libsupc++/new_opa.cc +++ b/libstdc++-v3/libsupc++/new_opa.cc @@ -25,15 +25,30 @@ #include #include +#include #include #include "new" +#if !_GLIBCXX_HAVE_ALIGNED_ALLOC && !_GLIBCXX_HAVE__ALIGNED_MALLOC \ + && !_GLIBCXX_HAVE_POSIX_MEMALIGN && _GLIBCXX_HAVE_MEMALIGN +# if _GLIBCXX_HOSTED && __has_include() +// Some C libraries declare memalign in +# include +# else +extern "C" void *memalign(std::size_t boundary, std::size_t size); +# endif +#endif + using std::new_handler; using std::bad_alloc; -#if !_GLIBCXX_HAVE_ALIGNED_ALLOC -#if _GLIBCXX_HAVE__ALIGNED_MALLOC -#define aligned_alloc(al,sz) _aligned_malloc(sz,al) +namespace __gnu_cxx { +#if _GLIBCXX_HAVE_ALIGNED_ALLOC +using ::aligned_alloc; +#elif _GLIBCXX_HAVE__ALIGNED_MALLOC +static inline void* +aligned_alloc (std::size_t al, std::size_t sz) +{ return _aligned_malloc(sz, al); } #elif _GLIBCXX_HAVE_POSIX_MEMALIGN static inline void* aligned_alloc (std::size_t al, std::size_t sz) @@ -49,11 +64,6 @@ aligned_alloc (std::size_t al, std::size_t sz) return nullptr; } #elif _GLIBCXX_HAVE_MEMALIGN -#if _GLIBCXX_HOSTED -#include -#else -extern "C" void *memalign(std::size_t boundary, std::size_t size); -#endif static inline void* aligned_alloc (std::size_t al, std::size_t sz) { @@ -66,7 +76,6 @@ aligned_alloc (std::size_t al, std::size_t sz) return memalign (al, sz); } #else // !HAVE__ALIGNED_MALLOC && !HAVE_POSIX_MEMALIGN && !HAVE_MEMALIGN -#include // The C library doesn't provide any aligned allocation functions, define one. // This is a modified version of code from gcc/config/i386/gmm_malloc.h static inline void* @@ -87,7 +96,7 @@ aligned_alloc (std::size_t al, std::size_t sz) return aligned_ptr; } #endif -#endif +} // namespace __gnu_cxx _GLIBCXX_WEAK_DEFINITION void * operator new (std::size_t sz, std::align_val_t al) @@ -116,6 +125,7 @@ operator new (std::size_t sz, std::align_val_t al) sz += align - rem; #endif + using __gnu_cxx::aligned_alloc; while (__builtin_expect ((p = aligned_alloc (align, sz)) == 0, false)) { new_handler handler = std::get_new_handler (); -- 2.30.2