This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 13/13] fix incompatible posix_memalign declaration on x86


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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]