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
This commit is contained in:
Julian Seward 2007-11-27 11:42:47 +00:00
parent dc96d0a97a
commit c7fbd65201
2 changed files with 67 additions and 35 deletions

View File

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

View File

@ -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