This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 13/13] fix incompatible posix_memalign declaration on x86
- From: Szabolcs Nagy <szabolcs dot nagy at arm dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: Gregor Richards <gregor dot richards at uwaterloo dot ca>, Rich Felker <dalias at libc dot org>, Szabolcs Nagy <nsz at port70 dot net>
- Date: Mon, 20 Apr 2015 20:00:19 +0100
- Subject: [PATCH 13/13] fix incompatible posix_memalign declaration on x86
- Authentication-results: sourceware.org; auth=none
- References: <55354A4A dot 4060702 at arm dot com>
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.nagy@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;