The posix_memalign declaration is incompatible with musl for C++, because of the exception specification. It also pollutes the namespace and lacks protection against a potential macro definition that is allowed by POSIX. The fix avoids source level namespace pollution but retains the dependency on the posix_memalign extern libc symbol.
The fix is ugly, but it is not possible to correctly redeclare a libc function in a public gcc header for C++. gcc/Changelog: 2015-04-16 Szabolcs Nagy <szabolcs.n...@arm.com> * config/i386/pmm_malloc.h (posix_memalign): Renamed to ... (__gcc_posix_memalign): This. Use posix_memalign as extern symbol only.
diff --git a/gcc/config/i386/pmm_malloc.h b/gcc/config/i386/pmm_malloc.h index 901001b..321fcd3 100644 --- a/gcc/config/i386/pmm_malloc.h +++ b/gcc/config/i386/pmm_malloc.h @@ -27,12 +27,13 @@ #include <stdlib.h> /* We can't depend on <stdlib.h> since the prototype of posix_memalign - may not be visible. */ + may not be visible and we can't pollute the namespace either. */ #ifndef __cplusplus -extern int posix_memalign (void **, size_t, size_t); +extern int __gcc_posix_memalign (void **, size_t, size_t) #else -extern "C" int posix_memalign (void **, size_t, size_t) throw (); +extern "C" int __gcc_posix_memalign (void **, size_t, size_t) throw () #endif +__asm__("posix_memalign"); static __inline void * _mm_malloc (size_t size, size_t alignment) @@ -42,7 +43,7 @@ _mm_malloc (size_t size, size_t alignment) return malloc (size); if (alignment == 2 || (sizeof (void *) == 8 && alignment == 4)) alignment = sizeof (void *); - if (posix_memalign (&ptr, alignment, size) == 0) + if (__gcc_posix_memalign (&ptr, alignment, size) == 0) return ptr; else return NULL;