From c7fbd6520179a1530e52468d90653a626df2e995 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Tue, 27 Nov 2007 11:42:47 +0000 Subject: [PATCH] Make Memcheck work sanely on AIX5.3 (again): * Don't intercept putenv/getenv/setenv. Causes a lot of whinging about missing TOC pointers. * Add 'strcmp' to the bundle of 4 functions intercepted in all objects. * xlc now seems to route calls through to malloc_common, free_common, calloc_common, realloc_common, memalign_common in libc. Intercept those names too. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7241 --- coregrind/m_replacemalloc/vg_replace_malloc.c | 32 ++++++++- memcheck/mc_replace_strmem.c | 70 ++++++++++--------- 2 files changed, 67 insertions(+), 35 deletions(-) diff --git a/coregrind/m_replacemalloc/vg_replace_malloc.c b/coregrind/m_replacemalloc/vg_replace_malloc.c index e9abb31f0f..3731e9e38d 100644 --- a/coregrind/m_replacemalloc/vg_replace_malloc.c +++ b/coregrind/m_replacemalloc/vg_replace_malloc.c @@ -103,7 +103,7 @@ extern void _exit(int); memcpy() is used by gcc for a struct assignment in mallinfo() below. Add the following conservative implementation (memmove, really). */ -#if defined(VGO_aix5) +#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5) __attribute__((weak)) void *memcpy(void *destV, const void *srcV, unsigned long n) { @@ -205,6 +205,9 @@ static void init(void) __attribute__((constructor)); // malloc ALLOC_or_NULL(m_libstdcxx_soname, malloc, malloc); ALLOC_or_NULL(m_libc_soname, malloc, malloc); +#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5) +ALLOC_or_NULL(m_libc_soname, malloc_common, malloc); +#endif /*---------------------- new ----------------------*/ @@ -318,6 +321,9 @@ ALLOC_or_BOMB(m_libc_soname, __builtin_vec_new, __builtin_vec_new ); // free FREE(m_libstdcxx_soname, free, free ); FREE(m_libc_soname, free, free ); +#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5) +FREE(m_libc_soname, free_common, free ); +#endif /*---------------------- cfree ----------------------*/ @@ -389,6 +395,9 @@ FREE(m_libc_soname, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete ); } CALLOC(m_libc_soname, calloc); +#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5) +CALLOC(m_libc_soname, calloc_common); +#endif /*---------------------- realloc ----------------------*/ @@ -418,6 +427,9 @@ CALLOC(m_libc_soname, calloc); } REALLOC(m_libc_soname, realloc); +#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5) +REALLOC(m_libc_soname, realloc_common); +#endif /*---------------------- memalign ----------------------*/ @@ -450,15 +462,23 @@ MEMALIGN(m_libc_soname, memalign); /*---------------------- valloc ----------------------*/ +static int local__getpagesize ( void ) { +# if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5) + return 4096; /* kludge - toc problems prevent calling getpagesize() */ +# else + extern int getpagesize (void); + return getpagesize(); +# endif +} + #define VALLOC(soname, fnname) \ \ void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( SizeT size ); \ void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( SizeT size ) \ { \ static int pszB = 0; \ - extern int getpagesize (void); \ if (pszB == 0) \ - pszB = getpagesize(); \ + pszB = local__getpagesize(); \ return VG_REPLACE_FUNCTION_ZU(m_libc_soname,memalign) \ ((SizeT)pszB, size); \ } @@ -547,6 +567,12 @@ MALLOC_TRIM(m_libc_soname, malloc_trim); } POSIX_MEMALIGN(m_libc_soname, posix_memalign); +#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5) +/* 27 Nov 07: it appears that xlc links into executables, a + posix_memalign, which calls onwards to memalign_common, with the + same args. */ +POSIX_MEMALIGN(m_libc_soname, memalign_common); +#endif /*---------------------- malloc_usable_size ----------------------*/ diff --git a/memcheck/mc_replace_strmem.c b/memcheck/mc_replace_strmem.c index 0d4d7aa410..46eaa288a5 100644 --- a/memcheck/mc_replace_strmem.c +++ b/memcheck/mc_replace_strmem.c @@ -725,6 +725,8 @@ GLIBC26___MEMCPY_CHK(m_libc_soname, __memcpy_chk) /*--- Improve definedness checking of process environment ---*/ /*------------------------------------------------------------*/ +#if defined(VGO_linux) + /* putenv */ int VG_WRAP_FUNCTION_ZU(m_libc_soname, putenv) (char* string); int VG_WRAP_FUNCTION_ZU(m_libc_soname, putenv) (char* string) @@ -782,50 +784,54 @@ int VG_WRAP_FUNCTION_ZU(m_libc_soname, setenv) return result; } +#endif /* defined(VGO_linux) */ + + /*------------------------------------------------------------*/ /*--- AIX stuff only after this point ---*/ /*------------------------------------------------------------*/ -/* Generate replacements for strcat, strncat, strcpy, strncpy, +/* Generate replacements for strcat, strncat, strcpy, strncpy, strcmp in the given soname. */ -#define Str4FNs(_soname) \ +#define Str5FNs(_soname) \ STRCAT(_soname, strcat) \ STRNCAT(_soname, strncat) \ STRCPY(_soname, strcpy) \ - STRNCPY(_soname, strncpy) + STRNCPY(_soname, strncpy) \ + STRCMP(_soname, strcmp) #if defined(VGP_ppc32_aix5) -Str4FNs(NONE) /* in main exe */ -Str4FNs(libCZdaZLshrcoreZdoZR) /* libC.a(shrcore.o) */ -Str4FNs(libX11ZdaZLshr4ZdoZR) /* libX11.a(shr4.o) */ -Str4FNs(libXmZdaZLshrZaZdoZR) /* libXm.a(shr*.o) */ -Str4FNs(libXtZdaZLshr4ZdoZR) /* libXt.a(shr4.o) */ -Str4FNs(libppeZurZdaZLdynamicZdoZR) /* libppe_r.a(dynamic.o) */ -Str4FNs(libodmZdaZLshrZdoZR) /* libodm.a(shr.o) */ -Str4FNs(libmpiZurZdaZLmpicoreZurZdoZR) /* libmpi_r.a(mpicore_r.o) */ -Str4FNs(libmpiZurZdaZLmpipoeZurZdoZR) /* libmpi_r.a(mpipoe_r.o) */ -Str4FNs(libmpiZurZdaZLmpciZurZdoZR) /* libmpi_r.a(mpci_r.o) */ -Str4FNs(libslurmZdso) /* libslurm.so */ -Str4FNs(libglibZdso) /* libglib.so */ -Str4FNs(libIMZdaZLshrZdoZR) /* libIM.a(shr.o) */ -Str4FNs(libiconvZdaZLshr4ZdoZR) /* libiconv.a(shr4.o) */ -Str4FNs(libGLZdaZLshrZdoZR) /* libGL.a(shr.o) */ -Str4FNs(libgdkZdso) /* libgdk.so */ -Str4FNs(libcursesZdaZLshr42ZdoZR) /* libcurses.a(shr42.o) */ -Str4FNs(libqtZda) /* libqt.a */ +Str5FNs(NONE) /* in main exe */ +Str5FNs(libCZdaZLshrcoreZdoZR) /* libC.a(shrcore.o) */ +Str5FNs(libX11ZdaZLshr4ZdoZR) /* libX11.a(shr4.o) */ +Str5FNs(libXmZdaZLshrZaZdoZR) /* libXm.a(shr*.o) */ +Str5FNs(libXtZdaZLshr4ZdoZR) /* libXt.a(shr4.o) */ +Str5FNs(libppeZurZdaZLdynamicZdoZR) /* libppe_r.a(dynamic.o) */ +Str5FNs(libodmZdaZLshrZdoZR) /* libodm.a(shr.o) */ +Str5FNs(libmpiZurZdaZLmpicoreZurZdoZR) /* libmpi_r.a(mpicore_r.o) */ +Str5FNs(libmpiZurZdaZLmpipoeZurZdoZR) /* libmpi_r.a(mpipoe_r.o) */ +Str5FNs(libmpiZurZdaZLmpciZurZdoZR) /* libmpi_r.a(mpci_r.o) */ +Str5FNs(libslurmZdso) /* libslurm.so */ +Str5FNs(libglibZdso) /* libglib.so */ +Str5FNs(libIMZdaZLshrZdoZR) /* libIM.a(shr.o) */ +Str5FNs(libiconvZdaZLshr4ZdoZR) /* libiconv.a(shr4.o) */ +Str5FNs(libGLZdaZLshrZdoZR) /* libGL.a(shr.o) */ +Str5FNs(libgdkZdso) /* libgdk.so */ +Str5FNs(libcursesZdaZLshr42ZdoZR) /* libcurses.a(shr42.o) */ +Str5FNs(libqtZda) /* libqt.a */ #endif #if defined(VGP_ppc64_aix5) -Str4FNs(NONE) /* in main exe */ -Str4FNs(libX11ZdaZLshrZu64ZdoZR) /* libX11.a(shr_64.o) */ -Str4FNs(libiconvZdaZLshr4Zu64ZdoZR) /* libiconv.a(shr4_64.o) */ -Str4FNs(libGLZdaZLshrZu64ZdoZR) /* libGL.a(shr_64.o) */ -Str4FNs(libppeZurZdaZLdynamic64ZdoZR) /* libppe_r.a(dynamic64.o) */ -Str4FNs(libodmZdaZLshrZu64ZdoZR) /* libodm.a(shr_64.o) */ -Str4FNs(libmpiZurZdaZLmpicore64ZurZdoZR) /* libmpi_r.a(mpicore64_r.o) */ -Str4FNs(libmpiZurZdaZLmpipoe64ZurZdoZR) /* libmpi_r.a(mpipoe64_r.o) */ -Str4FNs(libCZdaZLshrcoreZu64ZdoZR) /* libC.a(shrcore_64.o) */ -Str4FNs(libmpiZurZdaZLmpci64ZurZdoZR) /* libmpi_r.a(mpci64_r.o) */ -Str4FNs(libqtZda) /* libqt.a */ +Str5FNs(NONE) /* in main exe */ +Str5FNs(libX11ZdaZLshrZu64ZdoZR) /* libX11.a(shr_64.o) */ +Str5FNs(libiconvZdaZLshr4Zu64ZdoZR) /* libiconv.a(shr4_64.o) */ +Str5FNs(libGLZdaZLshrZu64ZdoZR) /* libGL.a(shr_64.o) */ +Str5FNs(libppeZurZdaZLdynamic64ZdoZR) /* libppe_r.a(dynamic64.o) */ +Str5FNs(libodmZdaZLshrZu64ZdoZR) /* libodm.a(shr_64.o) */ +Str5FNs(libmpiZurZdaZLmpicore64ZurZdoZR) /* libmpi_r.a(mpicore64_r.o) */ +Str5FNs(libmpiZurZdaZLmpipoe64ZurZdoZR) /* libmpi_r.a(mpipoe64_r.o) */ +Str5FNs(libCZdaZLshrcoreZu64ZdoZR) /* libC.a(shrcore_64.o) */ +Str5FNs(libmpiZurZdaZLmpci64ZurZdoZR) /* libmpi_r.a(mpci64_r.o) */ +Str5FNs(libqtZda) /* libqt.a */ #endif -- 2.47.2