vg_replace_malloc.c revision 4c245e595b9f6300d3120408ca873f7115d9cc7d
19ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
29ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--------------------------------------------------------------------*/
39ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--- Replacements for malloc() et al, which run on the simulated  ---*/
49ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--- CPU.                                     vg_replace_malloc.c ---*/
59ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--------------------------------------------------------------------*/
69ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
79ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*
89ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   This file is part of Valgrind, a dynamic binary instrumentation
99ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   framework.
109ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
119f207460d70d38c46c9e81996a3dcdf90961c6dbnjn   Copyright (C) 2000-2009 Julian Seward
129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      jseward@acm.org
139ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   This program is free software; you can redistribute it and/or
159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   modify it under the terms of the GNU General Public License as
169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   published by the Free Software Foundation; either version 2 of the
179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   License, or (at your option) any later version.
189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
199ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   This program is distributed in the hope that it will be useful, but
209ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   General Public License for more details.
239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   You should have received a copy of the GNU General Public License
259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   along with this program; if not, write to the Free Software
269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
279ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   02111-1307, USA.
289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   The GNU General Public License is contained in the file COPYING.
309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* ---------------------------------------------------------------------
3316eeb4eaf602c7376f401a01f4544293b8ad5898njn   ALL THE CODE IN THIS FILE RUNS ON THE SIMULATED CPU.
3416eeb4eaf602c7376f401a01f4544293b8ad5898njn
3516eeb4eaf602c7376f401a01f4544293b8ad5898njn   These functions are drop-in replacements for malloc() and friends.
3616eeb4eaf602c7376f401a01f4544293b8ad5898njn   They have global scope, but are not intended to be called directly.
3716eeb4eaf602c7376f401a01f4544293b8ad5898njn   See pub_core_redir.h for the gory details.
3816eeb4eaf602c7376f401a01f4544293b8ad5898njn
3916eeb4eaf602c7376f401a01f4544293b8ad5898njn   This file can be linked into the vg_preload_<tool>.so file for any tool
4016eeb4eaf602c7376f401a01f4544293b8ad5898njn   that wishes to know about calls to malloc().  The tool must define all
4151d827bcd88ce045a383ea1ca81768757df2d1fanjn   the functions that will be called via 'info'.
42717cde5bda18d17792d1994c61b6a27408b4b4a7njn
4316eeb4eaf602c7376f401a01f4544293b8ad5898njn   It is called vg_replace_malloc.c because this filename appears in stack
4416eeb4eaf602c7376f401a01f4544293b8ad5898njn   traces, so we want the name to be (hopefully!) meaningful to users.
459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   ------------------------------------------------------------------ */
469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
47c7561b931e249acf3768ead77638545b0ccaa8f1njn#include "pub_core_basics.h"
48e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj#include "pub_core_vki.h"           // VKI_EINVAL, VKI_ENOMEM
4993fe3b2893ca401903646b856f9702c9ab394963njn#include "pub_core_clreq.h"         // for VALGRIND_INTERNAL_PRINTF,
5093fe3b2893ca401903646b856f9702c9ab394963njn                                    //   VALGRIND_NON_SIMD_CALL[12]
5116eeb4eaf602c7376f401a01f4544293b8ad5898njn#include "pub_core_debuginfo.h"     // needed for pub_core_redir.h :(
52af1d7dfc9412c09d24ea10118f3fd1082f92e49dnjn#include "pub_core_mallocfree.h"    // for VG_MIN_MALLOC_SZB, VG_AR_CLIENT
53ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#include "pub_core_redir.h"         // for VG_REPLACE_FUNCTION_*
54da325d921b976f48a73188024dfd195aa67c19d4njn#include "pub_core_replacemalloc.h"
559ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
569ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
579ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* 2 Apr 05: the Portland Group compiler, which uses cfront/ARM style
589ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   mangling, could be supported properly by the redirects in this
599ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   module.  Except we can't because it doesn't put its allocation
609ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   functions in libpgc.so but instead hardwires them into the
619ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   compilation unit holding main(), which makes them impossible to
629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   intercept directly.  Fortunately those fns seem to route everything
639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   through to malloc/free.
64ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
65ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   mid-06: could be improved, since we can now intercept in the main
66ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   executable too.
679ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
689ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
694c245e595b9f6300d3120408ca873f7115d9cc7dnjn__attribute__ ((__noreturn__))
709ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjextern void _exit(int);
719ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
72ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/* Apparently it is necessary to make ourselves free of any dependency
73ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   on memcpy() on ppc32-aix5; else programs linked with -brtl fail.
74ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   memcpy() is used by gcc for a struct assignment in mallinfo()
75ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   below.  Add the following conservative implementation (memmove,
76ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   really). */
77ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
78ec92a0765980ae931b59642e3a2b2ac310189b23sewardj__attribute__((weak))
79ec92a0765980ae931b59642e3a2b2ac310189b23sewardjvoid *memcpy(void *destV, const void *srcV, unsigned long n)
80ec92a0765980ae931b59642e3a2b2ac310189b23sewardj{
81ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   unsigned char* src = (unsigned char*)srcV;
82ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   unsigned char* dest = (unsigned char*)destV;
83ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   unsigned long  i;
84ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   if (dest < src) {
85ec92a0765980ae931b59642e3a2b2ac310189b23sewardj      for (i = 0; i < n; i++)
86ec92a0765980ae931b59642e3a2b2ac310189b23sewardj         dest[i] = src[i];
87ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   }
88ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   if (dest > src) {
89ec92a0765980ae931b59642e3a2b2ac310189b23sewardj      for (i = n; i > 0; i--)
90ec92a0765980ae931b59642e3a2b2ac310189b23sewardj         dest[i-1] = src[i-1];
91ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   }
92ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   return dest;
93ec92a0765980ae931b59642e3a2b2ac310189b23sewardj}
94ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#endif
95ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
96ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
979ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*------------------------------------------------------------*/
989ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--- Replacing malloc() et al                             ---*/
999ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*------------------------------------------------------------*/
1009ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1019ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* This struct is initially empty.  Before the first use of any of
1029ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   these functions, we make a client request which fills in the
1039ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   fields.
1049ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic struct vg_mallocfunc_info info;
1069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic int init_done;
1079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1089ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Startup hook - called as init section */
1099ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic void init(void) __attribute__((constructor));
1109ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1119ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOC_TRACE(format, args...)  \
1129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   if (info.clo_trace_malloc)          \
11312771097ad146cde1763b83eca63e55fc8d60ae2njn      VALGRIND_INTERNAL_PRINTF(format, ## args )
1149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Below are new versions of malloc, __builtin_new, free,
1169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   __builtin_delete, calloc, realloc, memalign, and friends.
1179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   None of these functions are called directly - they are not meant to
1190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   be found by the dynamic linker.  But ALL client calls to malloc()
1200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   and friends wind up here eventually.  They get called because
1210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   vg_replace_malloc installs a bunch of code redirects which causes
1220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   Valgrind to use these functions rather than the ones they're
1230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   replacing.
1249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
126ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
127ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc ----------------------*/
128ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
1299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
1309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to allocate memory.  If that fails, return NULL.
1319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define ALLOC_or_NULL(soname, fnname, vg_replacement) \
1339ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
1340ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) (SizeT n); \
1350ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) (SizeT n)  \
1369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
1379ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
1389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
1399ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (!init_done) init(); \
140cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      MALLOC_TRACE(#fnname "(%llu)", (ULong)n ); \
1419ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
1429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
1439ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE(" = %p", v ); \
1449ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
1459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
1469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1479ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1489ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
1499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to allocate memory.  If that fails, it bombs the
1509ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   system.
1519ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1529ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define ALLOC_or_BOMB(soname, fnname, vg_replacement)  \
1539ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
1540ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) (SizeT n); \
1550ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) (SizeT n)  \
1569ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
1579ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
1589ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
1599ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (!init_done) init(); \
160cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      MALLOC_TRACE(#fnname "(%llu)", (ULong)n );        \
1619ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
1629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
1639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE(" = %p", v ); \
1649ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (NULL == v) { \
1659ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         VALGRIND_PRINTF_BACKTRACE( \
1669ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj            "new/new[] failed and should throw an exception, but Valgrind\n" \
1679ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj            "   cannot throw exceptions and so is aborting instead.  Sorry."); \
1689ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj            _exit(1); \
1699ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
1709ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
1719ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
1729ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1739ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// Each of these lines generates a replacement function:
1749ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj//     (from_so, from_fn,  v's replacement)
1759ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// malloc
177e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, malloc,      malloc);
178e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_NULL(VG_Z_LIBC_SONAME,      malloc,      malloc);
179ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
180e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_NULL(VG_Z_LIBC_SONAME,      malloc_common, malloc);
181ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
182ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
1839ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
184ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new ----------------------*/
185a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj
1867c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj// operator new(unsigned int), not mangled (for gcc 2.96)
187e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  builtin_new,    __builtin_new);
188e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_BOMB(VG_Z_LIBC_SONAME,       builtin_new,    __builtin_new);
1897c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
190e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  __builtin_new,  __builtin_new);
191e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_BOMB(VG_Z_LIBC_SONAME,       __builtin_new,  __builtin_new);
1927c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
193ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new(unsigned int), GNU mangling
194a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#if VG_WORDSIZE == 4
195e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj,          __builtin_new);
196e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwj,          __builtin_new);
197a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
198ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
199ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new(unsigned long), GNU mangling
200ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if VG_WORDSIZE == 8 || defined(VGP_ppc32_aix5)
201e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwm,          __builtin_new);
202e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwm,          __builtin_new);
203a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
2049b3328d805f0b493d697172f912d98cf73d74641sewardj
205ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new(unsigned long), ARM/cfront mangling
206ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
207e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBC_DOT_A,       __nw__FUl,      __builtin_new);
208ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#endif
2099b3328d805f0b493d697172f912d98cf73d74641sewardj
2109ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
211ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new nothrow ----------------------*/
2129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
213ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new(unsigned, std::nothrow_t const&), GNU mangling
214a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#if VG_WORDSIZE == 4
215e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t,  __builtin_new);
216e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwjRKSt9nothrow_t,  __builtin_new);
217ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#endif
218ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
219ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new(unsigned long, std::nothrow_t const&), GNU mangling
220ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if VG_WORDSIZE == 8 || defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
221e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwmRKSt9nothrow_t,  __builtin_new);
222e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwmRKSt9nothrow_t,  __builtin_new);
223a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
224ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
225ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new(unsigned long, std::nothrow_t const&), ARM/cfront mangling
226ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
227e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBC_DOT_A,    __nw__FUlRCQ2_3std9nothrow_t, __builtin_new);
228a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
229a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj
230f91889f657474dce755b0a23d42da0266539251ctom
231ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new [] ----------------------*/
232ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
2337c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj// operator new[](unsigned int), not mangled (for gcc 2.96)
234e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  __builtin_vec_new, __builtin_vec_new );
235e61546621e9bca129420399d7c552f8f63c93509njnALLOC_or_BOMB(VG_Z_LIBC_SONAME,       __builtin_vec_new, __builtin_vec_new );
2367c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
237ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new[](unsigned int), GNU mangling
238a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#if VG_WORDSIZE == 4
239e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj,             __builtin_vec_new );
240e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znaj,             __builtin_vec_new );
241ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#endif
242ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
243ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new[](unsigned long), GNU mangling
244ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if VG_WORDSIZE == 8 || defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
245e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znam,             __builtin_vec_new );
246e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znam,             __builtin_vec_new );
247a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
248ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
249ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new[](unsigned long), ARM/cfront mangling
250ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
251e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBC_DOT_A,       __vn__FUl,         __builtin_vec_new);
252a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
253a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj
254a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj
255ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new [] nothrow ----------------------*/
256ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
257ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new[](unsigned, std::nothrow_t const&), GNU mangling
258a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#if VG_WORDSIZE == 4
259e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
260e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnajRKSt9nothrow_t, __builtin_vec_new );
261a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
262ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
263ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new[](unsigned long, std::nothrow_t const&), GNU mangling
264ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if VG_WORDSIZE == 8 || defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
265e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
266e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnamRKSt9nothrow_t, __builtin_vec_new );
267a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
268f91889f657474dce755b0a23d42da0266539251ctom
269ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator new [](unsigned long, std::nothrow_t const&), ARM/cfront mangling
270ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
271e61546621e9bca129420399d7c552f8f63c93509njn ALLOC_or_BOMB(VG_Z_LIBC_DOT_A,   __vn__FUlRCQ2_3std9nothrow_t, __builtin_vec_new );
272ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#endif
273ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
274ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
275ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- free ----------------------*/
2769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
2789ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to free previously allocated memory.
2799ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
2809ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define FREE(soname, fnname, vg_replacement) \
2819ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
2820ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void VG_REPLACE_FUNCTION_ZU(soname,fnname) (void *p); \
2830ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void VG_REPLACE_FUNCTION_ZU(soname,fnname) (void *p)  \
2849ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
285cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
2869ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE(#vg_replacement "(%p)", p ); \
2879ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (p == NULL)  \
2889ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return; \
2899ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      (void)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, p ); \
2909ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
2919ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2929ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// free
293e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBSTDCXX_SONAME,  free,                 free );
294e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,       free,                 free );
295ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
296e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,       free_common,          free );
297ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
298ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
299ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
300ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- cfree ----------------------*/
3019ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3029ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// cfree
303e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBSTDCXX_SONAME,  cfree,                free );
304e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,       cfree,                free );
305ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
307ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete ----------------------*/
3087c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj// operator delete(void*), not mangled (for gcc 2.96)
309e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBSTDCXX_SONAME,   __builtin_delete,     __builtin_delete );
310e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,        __builtin_delete,     __builtin_delete );
3117c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
3129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// operator delete(void*), GNU mangling
313e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBSTDCXX_SONAME,  _ZdlPv,               __builtin_delete );
314e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,       _ZdlPv,               __builtin_delete );
315ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
316ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator delete(void*), ARM/cfront mangling
317ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
318e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_DOT_A,        __dl__FPv,            __builtin_delete );
319ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#endif
320ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
321ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
322ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete nothrow ----------------------*/
3239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// operator delete(void*, std::nothrow_t const&), GNU mangling
325e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t,  __builtin_delete );
326e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,      _ZdlPvRKSt9nothrow_t,  __builtin_delete );
327ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
329ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete [] ----------------------*/
3307c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj// operator delete[](void*), not mangled (for gcc 2.96)
331e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBSTDCXX_SONAME,   __builtin_vec_delete, __builtin_vec_delete );
332e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,        __builtin_vec_delete, __builtin_vec_delete );
3337c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
3349ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// operator delete[](void*), GNU mangling
335e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPv,               __builtin_vec_delete );
336e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,       _ZdaPv,               __builtin_vec_delete );
337ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
338ec92a0765980ae931b59642e3a2b2ac310189b23sewardj// operator delete[](void*), ARM/cfront mangling
339ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
340e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_DOT_A,        __vd__FPv,            __builtin_vec_delete );
341ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#endif
342ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
343ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
344ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete [] nothrow ----------------------*/
3459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// operator delete[](void*, std::nothrow_t const&), GNU mangling
347e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
348e61546621e9bca129420399d7c552f8f63c93509njnFREE(VG_Z_LIBC_SONAME,       _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
3499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3509ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
351ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- calloc ----------------------*/
352ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3539ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define CALLOC(soname, fnname) \
3549ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
3550ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( SizeT nmemb, SizeT size ); \
3560ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( SizeT nmemb, SizeT size )  \
3579ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
3589ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
3599ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
360cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
3619ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("calloc(%llu,%llu)", (ULong)nmemb, (ULong)size ); \
3629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
3639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_calloc, nmemb, size ); \
3649ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE(" = %p", v ); \
3659ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
3669ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
3679ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
368e61546621e9bca129420399d7c552f8f63c93509njnCALLOC(VG_Z_LIBC_SONAME, calloc);
369ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
370e61546621e9bca129420399d7c552f8f63c93509njnCALLOC(VG_Z_LIBC_SONAME, calloc_common);
371ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
372ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3739ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
374ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- realloc ----------------------*/
3759ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define REALLOC(soname, fnname) \
3779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
3780ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( void* ptrV, SizeT new_size );\
3790ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( void* ptrV, SizeT new_size ) \
3809ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
3819ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
3829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
383cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
3849ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("realloc(%p,%llu)", ptrV, (ULong)new_size ); \
3859ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
3869ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (ptrV == NULL) \
3879ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         /* We need to call a malloc-like function; so let's use \
3889ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj            one which we know exists. */ \
389e61546621e9bca129420399d7c552f8f63c93509njn         return VG_REPLACE_FUNCTION_ZU(VG_Z_LIBC_SONAME,malloc) (new_size); \
3909ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (new_size <= 0) { \
391e61546621e9bca129420399d7c552f8f63c93509njn         VG_REPLACE_FUNCTION_ZU(VG_Z_LIBC_SONAME,free)(ptrV); \
39212771097ad146cde1763b83eca63e55fc8d60ae2njn         MALLOC_TRACE(" = 0"); \
3939ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return NULL; \
3949ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
3959ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_realloc, ptrV, new_size ); \
3969ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE(" = %p", v ); \
3979ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
3989ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
3999ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
400e61546621e9bca129420399d7c552f8f63c93509njnREALLOC(VG_Z_LIBC_SONAME, realloc);
401ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
402e61546621e9bca129420399d7c552f8f63c93509njnREALLOC(VG_Z_LIBC_SONAME, realloc_common);
403ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
404ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
4059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
406ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- memalign ----------------------*/
4079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4089ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MEMALIGN(soname, fnname) \
4099ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
4100ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( SizeT alignment, SizeT n ); \
4110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( SizeT alignment, SizeT n )  \
4129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
4139ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
4149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
415cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
4169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("memalign(al %llu, size %llu)", \
4179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj                   (ULong)alignment, (ULong)n ); \
4189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
4199ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Round up to minimum alignment if necessary. */ \
4209ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (alignment < VG_MIN_MALLOC_SZB) \
4219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         alignment = VG_MIN_MALLOC_SZB; \
4229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
4239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Round up to nearest power-of-two if necessary (like glibc). */ \
4249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      while (0 != (alignment & (alignment - 1))) alignment++; \
4259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
4269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_memalign, alignment, n ); \
4279ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE(" = %p", v ); \
4289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
4299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
4309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
431e61546621e9bca129420399d7c552f8f63c93509njnMEMALIGN(VG_Z_LIBC_SONAME, memalign);
4329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4339ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
434ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- valloc ----------------------*/
435ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
436ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardjstatic int local__getpagesize ( void ) {
437ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#  if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
438ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj   return 4096; /* kludge - toc problems prevent calling getpagesize() */
439ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#  else
440ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj   extern int getpagesize (void);
441ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj   return getpagesize();
442ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#  endif
443ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj}
444ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj
4459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define VALLOC(soname, fnname) \
4469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
4470ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( SizeT size ); \
4480ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void* VG_REPLACE_FUNCTION_ZU(soname,fnname) ( SizeT size )  \
4499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
450e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj      static int pszB = 0; \
451e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj      if (pszB == 0) \
452ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj         pszB = local__getpagesize(); \
453e61546621e9bca129420399d7c552f8f63c93509njn      return VG_REPLACE_FUNCTION_ZU(VG_Z_LIBC_SONAME,memalign) \
454e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj                ((SizeT)pszB, size); \
4559ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
4569ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
457e61546621e9bca129420399d7c552f8f63c93509njnVALLOC(VG_Z_LIBC_SONAME, valloc);
458ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
4599ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
460ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- mallopt ----------------------*/
4619ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Various compatibility wrapper functions, for glibc and libstdc++. */
4639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4649ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOPT(soname, fnname) \
4659ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
4660ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   int VG_REPLACE_FUNCTION_ZU(soname, fnname) ( int cmd, int value ); \
4670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   int VG_REPLACE_FUNCTION_ZU(soname, fnname) ( int cmd, int value )  \
4689ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
4699ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* In glibc-2.2.4, 1 denotes a successful return value for \
4709ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         mallopt */ \
4719ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return 1; \
4729ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
4739ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
474e61546621e9bca129420399d7c552f8f63c93509njnMALLOPT(VG_Z_LIBC_SONAME, mallopt);
4759ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
477ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc_trim ----------------------*/
478ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn// Documentation says:
479ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   malloc_trim(size_t pad);
480ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
481ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   If possible, gives memory back to the system (via negative arguments to
482ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   sbrk) if there is unused memory at the `high' end of the malloc pool.
483ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   You can call this after freeing large blocks of memory to potentially
484ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   reduce the system-level memory requirements of a program. However, it
485ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   cannot guarantee to reduce memory.  Under some allocation patterns,
486ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   some large free blocks of memory will be locked between two used
487ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   chunks, so they cannot be given back to the system.
488ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
489ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   The `pad' argument to malloc_trim represents the amount of free
490ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   trailing space to leave untrimmed. If this argument is zero, only the
491ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   minimum amount of memory to maintain internal data structures will be
492ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   left (one page or less). Non-zero arguments can be supplied to maintain
493ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   enough trailing space to service future expected allocations without
494ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   having to re-obtain memory from the system.
495ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
496ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   Malloc_trim returns 1 if it actually released any memory, else 0. On
497ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   systems that do not support "negative sbrks", it will always return 0.
498ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
499ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn// For simplicity, we always return 0.
500ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn#define MALLOC_TRIM(soname, fnname) \
501ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   \
502ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   int VG_REPLACE_FUNCTION_ZU(soname, fnname) ( SizeT pad ); \
503ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   int VG_REPLACE_FUNCTION_ZU(soname, fnname) ( SizeT pad )  \
504ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   { \
505ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn      /* 0 denotes that malloc_trim() either wasn't able \
506ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn         to do anything, or was not implemented */ \
507ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn      return 0; \
508ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   }
509ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
510e61546621e9bca129420399d7c552f8f63c93509njnMALLOC_TRIM(VG_Z_LIBC_SONAME, malloc_trim);
511ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
512ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
513ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- posix_memalign ----------------------*/
514ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
5159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define POSIX_MEMALIGN(soname, fnname) \
5169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
5170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   int VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void **memptr, \
5180ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                                                 SizeT alignment, SizeT size ); \
5190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   int VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void **memptr, \
5200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                                                 SizeT alignment, SizeT size )  \
5219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
5229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void *mem; \
5239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
5249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Test whether the alignment argument is valid.  It must be \
5259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         a power of two multiple of sizeof (void *).  */ \
5269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (alignment % sizeof (void *) != 0 \
5279ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj          || (alignment & (alignment - 1)) != 0) \
5289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return VKI_EINVAL; \
5299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
530e61546621e9bca129420399d7c552f8f63c93509njn      mem = VG_REPLACE_FUNCTION_ZU(VG_Z_LIBC_SONAME,memalign)(alignment, size); \
5319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
5329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (mem != NULL) { \
5339ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj        *memptr = mem; \
5349ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj        return 0; \
5359ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
5369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
5379ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return VKI_ENOMEM; \
5389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
5399ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
540e61546621e9bca129420399d7c552f8f63c93509njnPOSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
541ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#if defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
542ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj/* 27 Nov 07: it appears that xlc links into executables, a
543ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj   posix_memalign, which calls onwards to memalign_common, with the
544ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj   same args. */
545e61546621e9bca129420399d7c552f8f63c93509njnPOSIX_MEMALIGN(VG_Z_LIBC_SONAME, memalign_common);
546ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
547ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
5489ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
549ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc_usable_size ----------------------*/
5509ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5519ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOC_USABLE_SIZE(soname, fnname) \
5529ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
5530ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   int VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void* p ); \
5540ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   int VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void* p )  \
5559ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   {  \
5569ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      SizeT pszB; \
5579ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
558cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
5599ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("malloc_usable_size(%p)", p ); \
5609ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (NULL == p) \
5619ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return 0; \
5629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
5638b140dee891a850c09d27f316df913acc7d7bae7njn      pszB = (SizeT)VALGRIND_NON_SIMD_CALL1( info.tl_malloc_usable_size, p ); \
5649ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE(" = %llu", (ULong)pszB ); \
5659ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
5669ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return pszB; \
5679ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
5689ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
569e61546621e9bca129420399d7c552f8f63c93509njnMALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size);
5709ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5719ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
572ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- (unimplemented) ----------------------*/
573ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
5749ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Bomb out if we get any of these. */
5759ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic void panic(const char *str)
5779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj{
5789ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   VALGRIND_PRINTF_BACKTRACE("Program aborting because of call to %s", str);
5799ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   _exit(99);
5809ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   *(int *)0 = 'x';
5819ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj}
5829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5839ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define PANIC(soname, fnname) \
5849ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
5850ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void ); \
5860ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   void VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void )  \
5879ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
5889ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      panic(#fnname); \
5899ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
5909ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
591e61546621e9bca129420399d7c552f8f63c93509njnPANIC(VG_Z_LIBC_SONAME, pvalloc);
592e61546621e9bca129420399d7c552f8f63c93509njnPANIC(VG_Z_LIBC_SONAME, malloc_get_state);
593e61546621e9bca129420399d7c552f8f63c93509njnPANIC(VG_Z_LIBC_SONAME, malloc_set_state);
594ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
595a610f530e02397519957a7663adf1bb4de92c07dsewardj#define MALLOC_STATS(soname, fnname) \
596a610f530e02397519957a7663adf1bb4de92c07dsewardj   \
597a610f530e02397519957a7663adf1bb4de92c07dsewardj   void VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void ); \
598a610f530e02397519957a7663adf1bb4de92c07dsewardj   void VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void )  \
599a610f530e02397519957a7663adf1bb4de92c07dsewardj   { \
600a610f530e02397519957a7663adf1bb4de92c07dsewardj      /* Valgrind's malloc_stats implementation does nothing. */ \
601a610f530e02397519957a7663adf1bb4de92c07dsewardj   }
602a610f530e02397519957a7663adf1bb4de92c07dsewardj
603e61546621e9bca129420399d7c552f8f63c93509njnMALLOC_STATS(VG_Z_LIBC_SONAME, malloc_stats);
604a610f530e02397519957a7663adf1bb4de92c07dsewardj
605ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
606ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- mallinfo ----------------------*/
6079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
608088bfb456af4ad2d1d0962f41e91d029bdec993enjn// mi must be static;  if it is auto then Memcheck thinks it is
609088bfb456af4ad2d1d0962f41e91d029bdec993enjn// uninitialised when used by the caller of this function, because Memcheck
610088bfb456af4ad2d1d0962f41e91d029bdec993enjn// doesn't know that the call to mallinfo fills in mi.
6119ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLINFO(soname, fnname) \
6129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
6130ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   struct vg_mallinfo VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void ); \
6140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   struct vg_mallinfo VG_REPLACE_FUNCTION_ZU(soname, fnname) ( void )  \
6159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
616088bfb456af4ad2d1d0962f41e91d029bdec993enjn      static struct vg_mallinfo mi; \
617088bfb456af4ad2d1d0962f41e91d029bdec993enjn      if (!init_done) init(); \
618cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      MALLOC_TRACE("mallinfo()"); \
619088bfb456af4ad2d1d0962f41e91d029bdec993enjn      (void)VALGRIND_NON_SIMD_CALL1( info.mallinfo, &mi ); \
6209ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return mi; \
6219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
6229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
623e61546621e9bca129420399d7c552f8f63c93509njnMALLINFO(VG_Z_LIBC_SONAME, mallinfo);
6249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* All the code in here is unused until this function is called */
6279ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic void init(void)
6299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj{
6309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   int res;
6319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   if (init_done)
6339ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return;
6349ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6359ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   init_done = 1;
6369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6370ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__GET_MALLOCFUNCS, &info,
6389af10a1c0d1b8897195ccfbc6dc46d8113d77153sewardj                              0, 0, 0, 0);
6399ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj}
6409ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6419ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--------------------------------------------------------------------*/
6429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--- end                                      vg_replace_malloc.c ---*/
6439ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--------------------------------------------------------------------*/
644