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. */