]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Make Memcheck work sanely on AIX5.3 (again):
authorJulian Seward <jseward@acm.org>
Tue, 27 Nov 2007 11:42:47 +0000 (11:42 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 27 Nov 2007 11:42:47 +0000 (11:42 +0000)
* 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
memcheck/mc_replace_strmem.c

index e9abb31f0fb5c03fad5a704733a3e71f836ca998..3731e9e38d93456339bf9ba31f58fe90962af345 100644 (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 ----------------------*/
index 0d4d7aa410cbccafa50d0804896283689d5496da..46eaa288a5cb6cb2c942de3fef3c0cb71872521e 100644 (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