This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH,FIXINCLUDES] AIX stdlib.h #define malloc
- From: David Edelsohn <dje dot gcc at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Bruce Korb <bkorb at gnu dot org>
- Date: Thu, 9 Jun 2016 13:25:53 -0400
- Subject: [PATCH,FIXINCLUDES] AIX stdlib.h #define malloc
- Authentication-results: sourceware.org; auth=none
AIX has added variants of malloc, realloc, calloc and valloc with
greater compatibility with Linux semantics, especially for NULL
addresses. The variants are declared in stdlib.h and use #define to
override the normal definition if _LINUX_SOURCE_COMPAT is defined,
e.g.,
#define malloc __linux_malloc
#define calloc __linux_calloc
#define realloc __linux_realloc
#define valloc __linux_valloc
libstdc++-v3 cstdlib specifically undefines a number of stdlib.h macros, e.g.,
// Get rid of those macros defined in <stdlib.h> in lieu of real functions.
...
#undef malloc
#undef realloc
C++ applications on AIX, especially users of BOOST that include
cstdlib, encounter unexpected behavior when the definition of malloc
changes from the expected / requested version.
The following patch updates fixincludes to correct the AIX stdlib.h
header by converting the #define to GCC asm aliases. I created a
separate fix for each definition because the order is not guaranteed.
Bootstrapped on powerpc-ibm-aix7.1.0.0. This fixes a recent node.js
build failure on AIX due to additional dependence on BOOST.
Okay for trunk, GCC 6 and GCC 5?
Thanks, David
* inclhack.def (aix_stdlib_malloc): New fix.
(aix_stdlib_realloc): New fix.
(aix_stdlib_calloc): New fix.
(aix_stdlib_valloc): New fix.
* fixincl.x: Regenerate.
* test/base/stdlib.h [AIX_STDLIB_MALLOC]: New test.
[AIX_STDLIB_REALLOC]: New test.
[AIX_STDLIB_CALLOC]: New test.
[AIX_STDLIB_VALLOC]: New test.
Index: inclhack.def
===================================================================
--- inclhack.def (revision 237258)
+++ inclhack.def (working copy)
@@ -911,7 +911,49 @@
test_text = "#ifdef __cplusplus\n}\n\n#ifdef ferror";
};
+/*
+ * stdlib.h on AIX uses #define on malloc and friends.
+ */
+fix = {
+ hackname = aix_stdlib_malloc;
+ mach = "*-*-aix*";
+ files = stdlib.h;
+ select = "#define[ \t]+malloc[ \t]+__linux_malloc";
+ c_fix = format;
+ c_fix_arg = "extern void malloc(size_t) __asm__(\"__linux_malloc\");";
+ test_text = "#define malloc __linux_malloc";
+};
+fix = {
+ hackname = aix_stdlib_realloc;
+ mach = "*-*-aix*";
+ files = stdlib.h;
+ select = "#define[ \t]+realloc[ \t]+__linux_realloc";
+ c_fix = format;
+ c_fix_arg = "extern void realloc(void *, size_t)
__asm__(\"__linux_realloc\");";
+ test_text = "#define realloc __linux_realloc";
+};
+
+fix = {
+ hackname = aix_stdlib_calloc;
+ mach = "*-*-aix*";
+ files = stdlib.h;
+ select = "#define[ \t]+calloc[ \t]+__linux_calloc";
+ c_fix = format;
+ c_fix_arg = "extern void calloc(size_t, size_t)
__asm__(\"__linux_calloc\");";
+ test_text = "#define calloc __linux_calloc";
+};
+
+fix = {
+ hackname = aix_stdlib_valloc;
+ mach = "*-*-aix*";
+ files = stdlib.h;
+ select = "#define[ \t]+valloc[ \t]+__linux_valloc";
+ c_fix = format;
+ c_fix_arg = "extern void valloc(size_t) __asm__(\"__linux_valloc\");";
+ test_text = "#define valloc __linux_valloc";
+};
+
/*
* stdlib.h on AIX 4.3 declares strtof() with a non-const first argument.
*/