vg_replace_malloc.c revision 731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3
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
119eecbbb9a9cbbd30b903c09a9e04d8efc20bda33sewardj   Copyright (C) 2000-2010 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.
4559570ffbe31930ab4d678754daaeec0715117a3dsewardj
4659570ffbe31930ab4d678754daaeec0715117a3dsewardj   IMPORTANT: this file must not contain any floating point code, nor
4759570ffbe31930ab4d678754daaeec0715117a3dsewardj   any integer division.  This is because on ARM these can cause calls
4859570ffbe31930ab4d678754daaeec0715117a3dsewardj   to helper functions, which will be unresolved within this .so.
4959570ffbe31930ab4d678754daaeec0715117a3dsewardj   Although it is usually the case that the client's ld.so instance
5059570ffbe31930ab4d678754daaeec0715117a3dsewardj   can bind them at runtime to the relevant functions in the client
5159570ffbe31930ab4d678754daaeec0715117a3dsewardj   executable, there is no guarantee of this; and so the client may
5259570ffbe31930ab4d678754daaeec0715117a3dsewardj   die via a runtime link failure.  Hence the only safe approach is to
5359570ffbe31930ab4d678754daaeec0715117a3dsewardj   avoid such function calls in the first place.  See "#define CALLOC"
5459570ffbe31930ab4d678754daaeec0715117a3dsewardj   below for a specific example.
5559570ffbe31930ab4d678754daaeec0715117a3dsewardj
5659570ffbe31930ab4d678754daaeec0715117a3dsewardj   A useful command is
5759570ffbe31930ab4d678754daaeec0715117a3dsewardj      for f in `find . -name "*preload*.so*"` ; \
5859570ffbe31930ab4d678754daaeec0715117a3dsewardj          do nm -A $f | grep " U " ; \
5959570ffbe31930ab4d678754daaeec0715117a3dsewardj      done
6059570ffbe31930ab4d678754daaeec0715117a3dsewardj
6159570ffbe31930ab4d678754daaeec0715117a3dsewardj   to see all the undefined symbols in all the preload shared objects.
629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   ------------------------------------------------------------------ */
639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
64c7561b931e249acf3768ead77638545b0ccaa8f1njn#include "pub_core_basics.h"
65e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj#include "pub_core_vki.h"           // VKI_EINVAL, VKI_ENOMEM
6693fe3b2893ca401903646b856f9702c9ab394963njn#include "pub_core_clreq.h"         // for VALGRIND_INTERNAL_PRINTF,
6793fe3b2893ca401903646b856f9702c9ab394963njn                                    //   VALGRIND_NON_SIMD_CALL[12]
6816eeb4eaf602c7376f401a01f4544293b8ad5898njn#include "pub_core_debuginfo.h"     // needed for pub_core_redir.h :(
69af1d7dfc9412c09d24ea10118f3fd1082f92e49dnjn#include "pub_core_mallocfree.h"    // for VG_MIN_MALLOC_SZB, VG_AR_CLIENT
70ec92a0765980ae931b59642e3a2b2ac310189b23sewardj#include "pub_core_redir.h"         // for VG_REPLACE_FUNCTION_*
71da325d921b976f48a73188024dfd195aa67c19d4njn#include "pub_core_replacemalloc.h"
729ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
733c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj/* Assignment of behavioural equivalence class tags: 1NNNP is intended
74bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj   to be reserved for the Valgrind core.  Current usage:
75bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj
7696044842731e581702c9ed4104d2949fcde20fd8sewardj   10010 ALLOC_or_NULL
7796044842731e581702c9ed4104d2949fcde20fd8sewardj   10020 ZONEALLOC_or_NULL
7896044842731e581702c9ed4104d2949fcde20fd8sewardj   10030 ALLOC_or_BOMB
7996044842731e581702c9ed4104d2949fcde20fd8sewardj   10040 ZONEFREE
8096044842731e581702c9ed4104d2949fcde20fd8sewardj   10050 FREE
8196044842731e581702c9ed4104d2949fcde20fd8sewardj   10060 ZONECALLOC
8296044842731e581702c9ed4104d2949fcde20fd8sewardj   10070 CALLOC
8396044842731e581702c9ed4104d2949fcde20fd8sewardj   10080 ZONEREALLOC
8496044842731e581702c9ed4104d2949fcde20fd8sewardj   10090 REALLOC
8596044842731e581702c9ed4104d2949fcde20fd8sewardj   10100 ZONEMEMALIGN
8696044842731e581702c9ed4104d2949fcde20fd8sewardj   10110 MEMALIGN
8796044842731e581702c9ed4104d2949fcde20fd8sewardj   10120 VALLOC
8896044842731e581702c9ed4104d2949fcde20fd8sewardj   10130 ZONEVALLOC
8996044842731e581702c9ed4104d2949fcde20fd8sewardj   10140 MALLOPT
9096044842731e581702c9ed4104d2949fcde20fd8sewardj   10150 MALLOC_TRIM
9196044842731e581702c9ed4104d2949fcde20fd8sewardj   10160 POSIX_MEMALIGN
9296044842731e581702c9ed4104d2949fcde20fd8sewardj   10170 MALLOC_USABLE_SIZE
9396044842731e581702c9ed4104d2949fcde20fd8sewardj   10180 PANIC
9496044842731e581702c9ed4104d2949fcde20fd8sewardj   10190 MALLOC_STATS
9596044842731e581702c9ed4104d2949fcde20fd8sewardj   10200 MALLINFO
9696044842731e581702c9ed4104d2949fcde20fd8sewardj   10210 DEFAULT_ZONE
9796044842731e581702c9ed4104d2949fcde20fd8sewardj   10220 ZONE_CHECK
98bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj*/
999ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1009ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* 2 Apr 05: the Portland Group compiler, which uses cfront/ARM style
1019ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   mangling, could be supported properly by the redirects in this
1029ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   module.  Except we can't because it doesn't put its allocation
1039ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   functions in libpgc.so but instead hardwires them into the
1049ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   compilation unit holding main(), which makes them impossible to
1059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   intercept directly.  Fortunately those fns seem to route everything
1069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   through to malloc/free.
107ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
108ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   mid-06: could be improved, since we can now intercept in the main
109ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   executable too.
1109ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1119ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
112126e82d6275be490a1d0ea608d6a860976bba0cbsewardj
113126e82d6275be490a1d0ea608d6a860976bba0cbsewardj
114126e82d6275be490a1d0ea608d6a860976bba0cbsewardj/* Call here to exit if we can't continue.  On Android we can't call
115126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   _exit for some reason, so we have to blunt-instrument it. */
1164c245e595b9f6300d3120408ca873f7115d9cc7dnjn__attribute__ ((__noreturn__))
117126e82d6275be490a1d0ea608d6a860976bba0cbsewardjstatic inline void my_exit ( int x )
118126e82d6275be490a1d0ea608d6a860976bba0cbsewardj{
119126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  if defined(VGPV_arm_linux_android)
120126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   __asm__ __volatile__(".word 0xFFFFFFFF");
121126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   while (1) {}
122126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  else
123126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   extern void _exit(int status);
1244966542d95689e822685acd539181d117103ecdasewardj   _exit(x);
125126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  endif
126126e82d6275be490a1d0ea608d6a860976bba0cbsewardj}
127126e82d6275be490a1d0ea608d6a860976bba0cbsewardj
128126e82d6275be490a1d0ea608d6a860976bba0cbsewardj/* Same problem with getpagesize. */
1293c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardjstatic inline int my_getpagesize ( void )
1303c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj{
131126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  if defined(VGPV_arm_linux_android)
132126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   return 4096; /* kludge - link failure on Android, for some reason */
133126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  else
134126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   extern int getpagesize (void);
135126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   return getpagesize();
136126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  endif
137126e82d6275be490a1d0ea608d6a860976bba0cbsewardj}
1389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
139ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
14059570ffbe31930ab4d678754daaeec0715117a3dsewardj/* Compute the high word of the double-length unsigned product of U
14159570ffbe31930ab4d678754daaeec0715117a3dsewardj   and V.  This is for calloc argument overflow checking; see comments
14259570ffbe31930ab4d678754daaeec0715117a3dsewardj   below.  Algorithm as described in Hacker's Delight, chapter 8. */
14359570ffbe31930ab4d678754daaeec0715117a3dsewardjstatic UWord umulHW ( UWord u, UWord v )
14459570ffbe31930ab4d678754daaeec0715117a3dsewardj{
14559570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord u0, v0, w0, rHi;
14659570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord u1, v1, w1,w2,t;
14759570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord halfMask  = sizeof(UWord)==4 ? (UWord)0xFFFF
14859570ffbe31930ab4d678754daaeec0715117a3dsewardj                                      : (UWord)0xFFFFFFFFULL;
14959570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord halfShift = sizeof(UWord)==4 ? 16 : 32;
15059570ffbe31930ab4d678754daaeec0715117a3dsewardj   u0  = u & halfMask;
15159570ffbe31930ab4d678754daaeec0715117a3dsewardj   u1  = u >> halfShift;
15259570ffbe31930ab4d678754daaeec0715117a3dsewardj   v0  = v & halfMask;
15359570ffbe31930ab4d678754daaeec0715117a3dsewardj   v1  = v >> halfShift;
15459570ffbe31930ab4d678754daaeec0715117a3dsewardj   w0  = u0 * v0;
15559570ffbe31930ab4d678754daaeec0715117a3dsewardj   t   = u1 * v0 + (w0 >> halfShift);
15659570ffbe31930ab4d678754daaeec0715117a3dsewardj   w1  = t & halfMask;
15759570ffbe31930ab4d678754daaeec0715117a3dsewardj   w2  = t >> halfShift;
15859570ffbe31930ab4d678754daaeec0715117a3dsewardj   w1  = u0 * v1 + w1;
15959570ffbe31930ab4d678754daaeec0715117a3dsewardj   rHi = u1 * v1 + w2 + (w1 >> halfShift);
16059570ffbe31930ab4d678754daaeec0715117a3dsewardj   return rHi;
16159570ffbe31930ab4d678754daaeec0715117a3dsewardj}
16259570ffbe31930ab4d678754daaeec0715117a3dsewardj
16359570ffbe31930ab4d678754daaeec0715117a3dsewardj
1649ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*------------------------------------------------------------*/
1659ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--- Replacing malloc() et al                             ---*/
1669ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*------------------------------------------------------------*/
1679ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1689ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* This struct is initially empty.  Before the first use of any of
1699ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   these functions, we make a client request which fills in the
1709ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   fields.
1719ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1729ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic struct vg_mallocfunc_info info;
1739ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic int init_done;
1749ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1759ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Startup hook - called as init section */
1762c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn__attribute__((constructor))
1772c4e5358db11e4d69efb7d9c3ef2baa4a87af220njnstatic void init(void);
1789ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1799ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOC_TRACE(format, args...)  \
180d2597c22ffe4d197b9f078212d8db1a789f47275njn   if (info.clo_trace_malloc) {        \
181d2597c22ffe4d197b9f078212d8db1a789f47275njn      VALGRIND_INTERNAL_PRINTF(format, ## args ); }
1829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1839ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Below are new versions of malloc, __builtin_new, free,
1849ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   __builtin_delete, calloc, realloc, memalign, and friends.
1859ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1869ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   None of these functions are called directly - they are not meant to
1870ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   be found by the dynamic linker.  But ALL client calls to malloc()
1880ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   and friends wind up here eventually.  They get called because
1890ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   vg_replace_malloc installs a bunch of code redirects which causes
1900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   Valgrind to use these functions rather than the ones they're
1910ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   replacing.
1929ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1939ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
194ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
195ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc ----------------------*/
196ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
1979ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
1989ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to allocate memory.  If that fails, return NULL.
1999ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
2009ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define ALLOC_or_NULL(soname, fnname, vg_replacement) \
2019ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
20296044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10010,soname,fnname) (SizeT n); \
20396044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10010,soname,fnname) (SizeT n)  \
2049ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
2059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
2069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
2079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (!init_done) init(); \
208cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      MALLOC_TRACE(#fnname "(%llu)", (ULong)n ); \
2099ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
2109ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
211d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
2129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
2139ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
2149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
215f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEALLOC_or_NULL(soname, fnname, vg_replacement) \
216f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
21796044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10020,soname,fnname) (void *zone, SizeT n); \
21896044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10020,soname,fnname) (void *zone, SizeT n)  \
219f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
220f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      void* v; \
221f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
222f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (!init_done) init(); \
223f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      MALLOC_TRACE(#fnname "(%p, %llu)", zone, (ULong)n ); \
224f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
225f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
226d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
227f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return v; \
228f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
229f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
2309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
2329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to allocate memory.  If that fails, it bombs the
2339ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   system.
2349ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
2359ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define ALLOC_or_BOMB(soname, fnname, vg_replacement)  \
2369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
23796044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10030,soname,fnname) (SizeT n); \
23896044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10030,soname,fnname) (SizeT n)  \
2399ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
2409ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
2419ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
2429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (!init_done) init(); \
243cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      MALLOC_TRACE(#fnname "(%llu)", (ULong)n );        \
2449ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
2459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
246d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
2479ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (NULL == v) { \
2489cdf9623a0328f09103b136bc8f7acfd1d5b906etom         VALGRIND_PRINTF( \
249d55f0d924062c7b5b3453242a6f9611bd5ce7458njn            "new/new[] failed and should throw an exception, but Valgrind\n"); \
250d55f0d924062c7b5b3453242a6f9611bd5ce7458njn         VALGRIND_PRINTF_BACKTRACE( \
251d55f0d924062c7b5b3453242a6f9611bd5ce7458njn            "   cannot throw exceptions and so is aborting instead.  Sorry.\n"); \
252126e82d6275be490a1d0ea608d6a860976bba0cbsewardj            my_exit(1); \
2539ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
2549ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
2559ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
2569ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2579ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// Each of these lines generates a replacement function:
2589ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj//     (from_so, from_fn,  v's replacement)
2599ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2609ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// malloc
2613c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
2623c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, malloc,      malloc);
2633c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_NULL(VG_Z_LIBC_SONAME,      malloc,      malloc);
264ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
2653c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
2663c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_NULL(VG_Z_LIBC_SONAME,      malloc,      malloc);
2673c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEALLOC_or_NULL(VG_Z_LIBC_SONAME, malloc_zone_malloc, malloc);
2689ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2693c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
270a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj
2717c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
2723c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj/*---------------------- new ----------------------*/
2737c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
2743c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
2753c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned int), not mangled (for gcc 2.96)
2763c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  builtin_new,    __builtin_new);
2773c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBC_SONAME,       builtin_new,    __builtin_new);
2783c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  __builtin_new,  __builtin_new);
2793c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBC_SONAME,       __builtin_new,  __builtin_new);
2803c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned int), GNU mangling
2813c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
2823c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj,          __builtin_new);
2833c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwj,          __builtin_new);
2843c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
2853c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned long), GNU mangling
2863c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 8
2873c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwm,          __builtin_new);
2883c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwm,          __builtin_new);
2893c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
2903c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
2913c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
2923c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned int), GNU mangling
2933c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
294731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj,          __builtin_new);
295731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwj,          __builtin_new);
2963c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
2973c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned long), GNU mangling
2983c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if 1 // FIXME: is this right?
299731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwm,          __builtin_new);
300731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwm,          __builtin_new);
3013c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
302ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
303a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
3049b3328d805f0b493d697172f912d98cf73d74641sewardj
3059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
306ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new nothrow ----------------------*/
3079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3083c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
3093c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned, std::nothrow_t const&), GNU mangling
3103c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
3113c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t,  __builtin_new);
3123c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwjRKSt9nothrow_t,  __builtin_new);
3133c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3143c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned long, std::nothrow_t const&), GNU mangling
3153c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 8
3163c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwmRKSt9nothrow_t,  __builtin_new);
3173c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwmRKSt9nothrow_t,  __builtin_new);
3183c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3193c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
3203c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
3213c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned, std::nothrow_t const&), GNU mangling
3223c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
323731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t,  __builtin_new);
324731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwjRKSt9nothrow_t,  __builtin_new);
3253c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3263c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned long, std::nothrow_t const&), GNU mangling
3273c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if 1 // FIXME: is this right?
328731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwmRKSt9nothrow_t,  __builtin_new);
329731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwmRKSt9nothrow_t,  __builtin_new);
3303c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
331ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
332a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
333ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
334f91889f657474dce755b0a23d42da0266539251ctom
335ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new [] ----------------------*/
336ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3373c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
3383c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned int), not mangled (for gcc 2.96)
3393c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  __builtin_vec_new, __builtin_vec_new );
3403c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBC_SONAME,       __builtin_vec_new, __builtin_vec_new );
3413c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned int), GNU mangling
3423c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
3433c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj,             __builtin_vec_new );
3443c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znaj,             __builtin_vec_new );
3453c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3463c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned long), GNU mangling
3473c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 8
3483c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znam,             __builtin_vec_new );
3493c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znam,             __builtin_vec_new );
3503c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3513c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
3523c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
3533c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned int), GNU mangling
3543c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
355731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj,             __builtin_vec_new );
356731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znaj,             __builtin_vec_new );
3573c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3583c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned long), GNU mangling
3593c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if 1 // FIXME: is this right?
360731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znam,             __builtin_vec_new );
361731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znam,             __builtin_vec_new );
3623c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3637c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
364a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
365ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
366a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj
367ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new [] nothrow ----------------------*/
368ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3693c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
3703c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned, std::nothrow_t const&), GNU mangling
3713c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
3723c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
3733c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnajRKSt9nothrow_t, __builtin_vec_new );
3743c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3753c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned long, std::nothrow_t const&), GNU mangling
3763c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 8
3773c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
3783c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnamRKSt9nothrow_t, __builtin_vec_new );
3793c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3803c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
3813c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
3823c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned, std::nothrow_t const&), GNU mangling
3833c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
384731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
385731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnajRKSt9nothrow_t, __builtin_vec_new );
3863c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3873c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned long, std::nothrow_t const&), GNU mangling
3883c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if 1 // FIXME: is this right?
389731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
390731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnamRKSt9nothrow_t, __builtin_vec_new );
3913c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
392ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
393a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
394f91889f657474dce755b0a23d42da0266539251ctom
395ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
396ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- free ----------------------*/
3979ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3989ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
3999ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to free previously allocated memory.
4009ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
401f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEFREE(soname, fnname, vg_replacement) \
402f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
40396044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10040,soname,fnname) (void *zone, void *p); \
40496044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10040,soname,fnname) (void *zone, void *p)  \
405f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
406f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (!init_done) init(); \
407731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE(#fnname "(%p, %p)\n", zone, p ); \
408f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (p == NULL)  \
409f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         return; \
410f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      (void)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, p ); \
411f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
412f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
4139ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define FREE(soname, fnname, vg_replacement) \
4149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
41596044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10050,soname,fnname) (void *p); \
41696044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10050,soname,fnname) (void *p)  \
4179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
418cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
419731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE(#fnname "(%p)\n", p ); \
4209ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (p == NULL)  \
4219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return; \
4229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      (void)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, p ); \
4239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
4249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4253c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
4263c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  free,                 free );
4273c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       free,                 free );
4283c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4293c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
4303c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       free,                 free );
4313c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEFREE(VG_Z_LIBC_SONAME,   malloc_zone_free,     free );
4323c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
433ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
434ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
435ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
436ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- cfree ----------------------*/
4379ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// cfree
4393c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
4403c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  cfree,                free );
4413c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       cfree,                free );
4423c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4433c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
444731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,  cfree,                free );
445731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,       cfree,                free );
4463c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4473c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
448ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
4499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
450ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete ----------------------*/
4517c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
4523c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
4533c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*), not mangled (for gcc 2.96)
4543c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,   __builtin_delete,     __builtin_delete );
4553c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,        __builtin_delete,     __builtin_delete );
4563c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*), GNU mangling
4573c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdlPv,               __builtin_delete );
4583c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       _ZdlPv,               __builtin_delete );
4593c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4603c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
4613c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*), GNU mangling
462731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdlPv,               __builtin_delete );
463731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,       _ZdlPv,               __builtin_delete );
4643c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4653c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
466ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
467ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
468ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete nothrow ----------------------*/
4699ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4703c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
4713c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*, std::nothrow_t const&), GNU mangling
4723c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t,  __builtin_delete );
4733c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,      _ZdlPvRKSt9nothrow_t,  __builtin_delete );
4743c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4753c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
4763c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*, std::nothrow_t const&), GNU mangling
477731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t,  __builtin_delete );
478731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,      _ZdlPvRKSt9nothrow_t,  __builtin_delete );
4793c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4803c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
481ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
4829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
483ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete [] ----------------------*/
4847c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
4853c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
4863c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*), not mangled (for gcc 2.96)
4873c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,   __builtin_vec_delete, __builtin_vec_delete );
4883c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,        __builtin_vec_delete, __builtin_vec_delete );
4893c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*), GNU mangling
4903c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPv,               __builtin_vec_delete );
4913c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       _ZdaPv,               __builtin_vec_delete );
4923c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4933c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
4943c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*), not mangled (for gcc 2.96)
495731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,   __builtin_vec_delete, __builtin_vec_delete );
496731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,        __builtin_vec_delete, __builtin_vec_delete );
4973c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*), GNU mangling
498731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPv,               __builtin_vec_delete );
499731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,       _ZdaPv,               __builtin_vec_delete );
5003c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5013c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
502ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
503ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
504ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete [] nothrow ----------------------*/
5059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5063c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
5073c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*, std::nothrow_t const&), GNU mangling
5083c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
5093c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
5103c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5113c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
5123c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*, std::nothrow_t const&), GNU mangling
513731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
514731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,       _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
5153c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5163c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
5179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
519ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- calloc ----------------------*/
520ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
521f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONECALLOC(soname, fnname) \
522f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
52396044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10060,soname,fnname) \
524bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT nmemb, SizeT size ); \
52596044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10060,soname,fnname) \
526bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT nmemb, SizeT size )  \
527f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
528f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      void* v; \
529f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
530f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (!init_done) init(); \
531731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE("zone_calloc(%p, %llu,%llu)", zone, (ULong)nmemb, (ULong)size ); \
532f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
533f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_calloc, nmemb, size ); \
534d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
535f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return v; \
536f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
537f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
5389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define CALLOC(soname, fnname) \
5399ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
54096044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10070,soname,fnname) \
541bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( SizeT nmemb, SizeT size ); \
54296044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10070,soname,fnname) \
543bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( SizeT nmemb, SizeT size )  \
5449ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
5459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
5469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
547cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
5489ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("calloc(%llu,%llu)", (ULong)nmemb, (ULong)size ); \
5499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
55059570ffbe31930ab4d678754daaeec0715117a3dsewardj      /* Protect against overflow.  See bug 24078. (that bug number is
55159570ffbe31930ab4d678754daaeec0715117a3dsewardj         invalid.  Which one really?) */ \
55259570ffbe31930ab4d678754daaeec0715117a3dsewardj      /* But don't use division, since that produces an external symbol
55359570ffbe31930ab4d678754daaeec0715117a3dsewardj         reference on ARM, in the form of a call to __aeabi_uidiv.  It's
55459570ffbe31930ab4d678754daaeec0715117a3dsewardj         normally OK, because ld.so manages to resolve it to something in the
55559570ffbe31930ab4d678754daaeec0715117a3dsewardj         executable, or one of its shared objects.  But that isn't guaranteed
55659570ffbe31930ab4d678754daaeec0715117a3dsewardj         to be the case, and it has been observed to fail in rare cases, eg:
55759570ffbe31930ab4d678754daaeec0715117a3dsewardj            echo x | valgrind /bin/sed -n "s/.*-\>\ //p"
55859570ffbe31930ab4d678754daaeec0715117a3dsewardj         So instead compute the high word of the product and check it is zero. */ \
55959570ffbe31930ab4d678754daaeec0715117a3dsewardj      if (umulHW(size, nmemb) != 0) return NULL; \
5609ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_calloc, nmemb, size ); \
561d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
5629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
5639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
5649ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5653c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
5663c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj CALLOC(VG_Z_LIBC_SONAME, calloc);
5673c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5683c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
5693c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj CALLOC(VG_Z_LIBC_SONAME, calloc);
5703c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONECALLOC(VG_Z_LIBC_SONAME, malloc_zone_calloc);
5713c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
572ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
573ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
5749ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
575ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- realloc ----------------------*/
5769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
577f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEREALLOC(soname, fnname) \
578f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
57996044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10080,soname,fnname) \
580bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, void* ptrV, SizeT new_size ); \
58196044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10080,soname,fnname) \
582bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, void* ptrV, SizeT new_size ) \
583f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
584f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      void* v; \
585f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
586f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (!init_done) init(); \
587731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE("zone_realloc(%p,%p,%llu)", zone, ptrV, (ULong)new_size ); \
588f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
589f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (ptrV == NULL) \
590f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         /* We need to call a malloc-like function; so let's use \
591f76d27a697a7b0bf3b84490baf60623fc96a23afnjn            one which we know exists. GrP fixme use zonemalloc instead? */ \
59296044842731e581702c9ed4104d2949fcde20fd8sewardj         return VG_REPLACE_FUNCTION_EZU(10010,VG_Z_LIBC_SONAME,malloc) \
5937696726f188b4b50dc792a2b351bf7e162517ba9sewardj                   (new_size); \
594f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (new_size <= 0) { \
59596044842731e581702c9ed4104d2949fcde20fd8sewardj         VG_REPLACE_FUNCTION_EZU(10050,VG_Z_LIBC_SONAME,free)(ptrV); \
596d55f0d924062c7b5b3453242a6f9611bd5ce7458njn         MALLOC_TRACE(" = 0\n"); \
597f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         return NULL; \
598f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      } \
599f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_realloc, ptrV, new_size ); \
600d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
601f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return v; \
602f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
603f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
6049ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define REALLOC(soname, fnname) \
6059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
60696044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10090,soname,fnname) \
607bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void* ptrV, SizeT new_size );\
60896044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10090,soname,fnname) \
609bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void* ptrV, SizeT new_size ) \
6109ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
6119ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
6129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
613cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
6149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("realloc(%p,%llu)", ptrV, (ULong)new_size ); \
6159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
6169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (ptrV == NULL) \
6179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         /* We need to call a malloc-like function; so let's use \
6189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj            one which we know exists. */ \
61996044842731e581702c9ed4104d2949fcde20fd8sewardj         return VG_REPLACE_FUNCTION_EZU(10010,VG_Z_LIBC_SONAME,malloc) \
620bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj                   (new_size); \
6219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (new_size <= 0) { \
62296044842731e581702c9ed4104d2949fcde20fd8sewardj         VG_REPLACE_FUNCTION_EZU(10050,VG_Z_LIBC_SONAME,free)(ptrV); \
623d55f0d924062c7b5b3453242a6f9611bd5ce7458njn         MALLOC_TRACE(" = 0\n"); \
6249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return NULL; \
6259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
6269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_realloc, ptrV, new_size ); \
627d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
6289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
6299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
6309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6313c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
6323c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj REALLOC(VG_Z_LIBC_SONAME, realloc);
6333c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
6343c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
6353c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj REALLOC(VG_Z_LIBC_SONAME, realloc);
6363c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEREALLOC(VG_Z_LIBC_SONAME, malloc_zone_realloc);
6373c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
638ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
639ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
6409ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
641ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- memalign ----------------------*/
6429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
643f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEMEMALIGN(soname, fnname) \
644f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
64596044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10100,soname,fnname) \
646bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT alignment, SizeT n ); \
64796044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10100,soname,fnname) \
648bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT alignment, SizeT n ) \
649f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
650f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      void* v; \
651f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
652f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (!init_done) init(); \
653731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE("zone_memalign(%p, al %llu, size %llu)", \
654f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                   zone, (ULong)alignment, (ULong)n );  \
655f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
656f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      /* Round up to minimum alignment if necessary. */ \
657f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (alignment < VG_MIN_MALLOC_SZB) \
658f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         alignment = VG_MIN_MALLOC_SZB; \
659f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
660f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      /* Round up to nearest power-of-two if necessary (like glibc). */ \
661f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      while (0 != (alignment & (alignment - 1))) alignment++; \
662f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
663f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_memalign, alignment, n ); \
664d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
665f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return v; \
666f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
667f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
6689ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MEMALIGN(soname, fnname) \
6699ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
67096044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10110,soname,fnname) \
671bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( SizeT alignment, SizeT n ); \
67296044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10110,soname,fnname) \
673bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( SizeT alignment, SizeT n )  \
6749ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
6759ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
6769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
677cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
6789ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("memalign(al %llu, size %llu)", \
6799ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj                   (ULong)alignment, (ULong)n ); \
6809ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
6819ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Round up to minimum alignment if necessary. */ \
6829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (alignment < VG_MIN_MALLOC_SZB) \
6839ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         alignment = VG_MIN_MALLOC_SZB; \
6849ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
6859ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Round up to nearest power-of-two if necessary (like glibc). */ \
6869ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      while (0 != (alignment & (alignment - 1))) alignment++; \
6879ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
6889ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_memalign, alignment, n ); \
689d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
6909ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
6919ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
6929ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6933c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
6943c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MEMALIGN(VG_Z_LIBC_SONAME, memalign);
6953c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
6963c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
6973c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MEMALIGN(VG_Z_LIBC_SONAME, memalign);
6983c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEMEMALIGN(VG_Z_LIBC_SONAME, malloc_zone_memalign);
6993c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
700f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif
7019ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
7029ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
703ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- valloc ----------------------*/
704ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
7059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define VALLOC(soname, fnname) \
7069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
70796044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10120,soname,fnname) ( SizeT size ); \
70896044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10120,soname,fnname) ( SizeT size ) \
7099ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
710e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj      static int pszB = 0; \
711e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj      if (pszB == 0) \
712126e82d6275be490a1d0ea608d6a860976bba0cbsewardj         pszB = my_getpagesize(); \
71396044842731e581702c9ed4104d2949fcde20fd8sewardj      return VG_REPLACE_FUNCTION_EZU(10110,VG_Z_LIBC_SONAME,memalign) \
714e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj                ((SizeT)pszB, size); \
7159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
7169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
717f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEVALLOC(soname, fnname) \
718f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
71996044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10130,soname,fnname) \
720bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT size ); \
72196044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10130,soname,fnname) \
722bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT size )  \
723f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
724f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      static int pszB = 0; \
725f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (pszB == 0) \
726126e82d6275be490a1d0ea608d6a860976bba0cbsewardj         pszB = my_getpagesize(); \
72796044842731e581702c9ed4104d2949fcde20fd8sewardj      return VG_REPLACE_FUNCTION_EZU(10110,VG_Z_LIBC_SONAME,memalign) \
728f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                ((SizeT)pszB, size); \
729f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
730f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
7313c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
7323c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj VALLOC(VG_Z_LIBC_SONAME, valloc);
7333c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
7343c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
7353c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj VALLOC(VG_Z_LIBC_SONAME, valloc);
7363c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEVALLOC(VG_Z_LIBC_SONAME, malloc_zone_valloc);
7373c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
738f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif
739ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
7409ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
741ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- mallopt ----------------------*/
7429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
7439ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Various compatibility wrapper functions, for glibc and libstdc++. */
7449ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
7459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOPT(soname, fnname) \
7469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
74796044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10140,soname,fnname) ( int cmd, int value ); \
74896044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10140,soname,fnname) ( int cmd, int value ) \
7499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
7509ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* In glibc-2.2.4, 1 denotes a successful return value for \
7519ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         mallopt */ \
7529ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return 1; \
7539ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
7549ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
7553c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
7563c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOPT(VG_Z_LIBC_SONAME, mallopt);
7573c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
7583c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
759731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLOPT(VG_Z_LIBC_SONAME, mallopt);
7603c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
7613c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
7629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
7639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
764ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc_trim ----------------------*/
765ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn// Documentation says:
766ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   malloc_trim(size_t pad);
767ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
768ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   If possible, gives memory back to the system (via negative arguments to
769ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   sbrk) if there is unused memory at the `high' end of the malloc pool.
770ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   You can call this after freeing large blocks of memory to potentially
771ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   reduce the system-level memory requirements of a program. However, it
772ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   cannot guarantee to reduce memory.  Under some allocation patterns,
773ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   some large free blocks of memory will be locked between two used
774ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   chunks, so they cannot be given back to the system.
775ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
776ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   The `pad' argument to malloc_trim represents the amount of free
777ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   trailing space to leave untrimmed. If this argument is zero, only the
778ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   minimum amount of memory to maintain internal data structures will be
779ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   left (one page or less). Non-zero arguments can be supplied to maintain
780ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   enough trailing space to service future expected allocations without
781ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   having to re-obtain memory from the system.
782ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
783ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   Malloc_trim returns 1 if it actually released any memory, else 0. On
784ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   systems that do not support "negative sbrks", it will always return 0.
785ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
786ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn// For simplicity, we always return 0.
787ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn#define MALLOC_TRIM(soname, fnname) \
788ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   \
78996044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10150,soname,fnname) ( SizeT pad ); \
79096044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10150,soname,fnname) ( SizeT pad ) \
791ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   { \
792ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn      /* 0 denotes that malloc_trim() either wasn't able \
793ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn         to do anything, or was not implemented */ \
794ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn      return 0; \
795ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   }
796ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
7973c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
7983c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_TRIM(VG_Z_LIBC_SONAME, malloc_trim);
7993c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8003c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
801731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLOC_TRIM(VG_Z_LIBC_SONAME, malloc_trim);
8023c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8033c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
804ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
805ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
806ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- posix_memalign ----------------------*/
807ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
8089ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define POSIX_MEMALIGN(soname, fnname) \
8099ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
81096044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10160,soname,fnname) \
811bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj          ( void **memptr, SizeT alignment, SizeT size ); \
81296044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10160,soname,fnname) \
813bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj          ( void **memptr, SizeT alignment, SizeT size ) \
8149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
8159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void *mem; \
8169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
8179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Test whether the alignment argument is valid.  It must be \
8189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         a power of two multiple of sizeof (void *).  */ \
8199ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (alignment % sizeof (void *) != 0 \
8209ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj          || (alignment & (alignment - 1)) != 0) \
8219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return VKI_EINVAL; \
8229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
82396044842731e581702c9ed4104d2949fcde20fd8sewardj      mem = VG_REPLACE_FUNCTION_EZU(10110,VG_Z_LIBC_SONAME,memalign) \
824bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj               (alignment, size); \
8259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
8269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (mem != NULL) { \
8279ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj        *memptr = mem; \
8289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj        return 0; \
8299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
8309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
8319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return VKI_ENOMEM; \
8329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
8339ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8343c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
8353c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
8363c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8373c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
838731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
8393c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8403c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
841ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
8429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
843ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc_usable_size ----------------------*/
8449ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOC_USABLE_SIZE(soname, fnname) \
8469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
84796044842731e581702c9ed4104d2949fcde20fd8sewardj   SizeT VG_REPLACE_FUNCTION_EZU(10170,soname,fnname) ( void* p ); \
84896044842731e581702c9ed4104d2949fcde20fd8sewardj   SizeT VG_REPLACE_FUNCTION_EZU(10170,soname,fnname) ( void* p ) \
8499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   {  \
8509ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      SizeT pszB; \
8519ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
852cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      if (!init_done) init(); \
8539ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("malloc_usable_size(%p)", p ); \
8549ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (NULL == p) \
8559ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return 0; \
8569ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
8578b140dee891a850c09d27f316df913acc7d7bae7njn      pszB = (SizeT)VALGRIND_NON_SIMD_CALL1( info.tl_malloc_usable_size, p ); \
858d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %llu\n", (ULong)pszB ); \
8599ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
8609ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return pszB; \
8619ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
8629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8633c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
8643c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size);
8653c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_size);
8663c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8673c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
868731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size);
8693c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_size);
8703c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8713c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
8729ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8739ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
874ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- (unimplemented) ----------------------*/
875ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
8769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Bomb out if we get any of these. */
8779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8789ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic void panic(const char *str)
8799ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj{
880d55f0d924062c7b5b3453242a6f9611bd5ce7458njn   VALGRIND_PRINTF_BACKTRACE("Program aborting because of call to %s\n", str);
881126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   my_exit(99);
882a6f76eebd1d0bca59ca88b98e88e909086e8c9fasewardj   *(volatile int *)0 = 'x';
8839ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj}
8849ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8859ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define PANIC(soname, fnname) \
8869ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
88796044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10180,soname,fnname) ( void ); \
88896044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10180,soname,fnname) ( void )  \
8899ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
8909ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      panic(#fnname); \
8919ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
8929ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8933c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
8943c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, pvalloc);
8953c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, malloc_get_state);
8963c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, malloc_set_state);
8973c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8983c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
8993c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, pvalloc);
9003c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, malloc_get_state);
9013c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, malloc_set_state);
9023c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9033c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
9043c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
905ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
906a610f530e02397519957a7663adf1bb4de92c07dsewardj#define MALLOC_STATS(soname, fnname) \
907a610f530e02397519957a7663adf1bb4de92c07dsewardj   \
90896044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10190,soname,fnname) ( void ); \
90996044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10190,soname,fnname) ( void )  \
910a610f530e02397519957a7663adf1bb4de92c07dsewardj   { \
911a610f530e02397519957a7663adf1bb4de92c07dsewardj      /* Valgrind's malloc_stats implementation does nothing. */ \
912a610f530e02397519957a7663adf1bb4de92c07dsewardj   }
913a610f530e02397519957a7663adf1bb4de92c07dsewardj
9143c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
9153c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_STATS(VG_Z_LIBC_SONAME, malloc_stats);
9163c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9173c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
918731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLOC_STATS(VG_Z_LIBC_SONAME, malloc_stats);
9193c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9203c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
921a610f530e02397519957a7663adf1bb4de92c07dsewardj
922ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
923ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- mallinfo ----------------------*/
9249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
925088bfb456af4ad2d1d0962f41e91d029bdec993enjn// mi must be static;  if it is auto then Memcheck thinks it is
926088bfb456af4ad2d1d0962f41e91d029bdec993enjn// uninitialised when used by the caller of this function, because Memcheck
927088bfb456af4ad2d1d0962f41e91d029bdec993enjn// doesn't know that the call to mallinfo fills in mi.
9289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLINFO(soname, fnname) \
9299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
93096044842731e581702c9ed4104d2949fcde20fd8sewardj   struct vg_mallinfo VG_REPLACE_FUNCTION_EZU(10200,soname,fnname) ( void ); \
93196044842731e581702c9ed4104d2949fcde20fd8sewardj   struct vg_mallinfo VG_REPLACE_FUNCTION_EZU(10200,soname,fnname) ( void ) \
9329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
933088bfb456af4ad2d1d0962f41e91d029bdec993enjn      static struct vg_mallinfo mi; \
934088bfb456af4ad2d1d0962f41e91d029bdec993enjn      if (!init_done) init(); \
935d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE("mallinfo()\n"); \
936088bfb456af4ad2d1d0962f41e91d029bdec993enjn      (void)VALGRIND_NON_SIMD_CALL1( info.mallinfo, &mi ); \
9379ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return mi; \
9389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
9399ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
9403c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
9413c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLINFO(VG_Z_LIBC_SONAME, mallinfo);
9423c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9433c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
944731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLINFO(VG_Z_LIBC_SONAME, mallinfo);
9453c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9463c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
9479ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
9489ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
949731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj/*------------------ Darwin zone stuff ------------------*/
950731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
951f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#if defined(VGO_darwin)
952f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
953f76d27a697a7b0bf3b84490baf60623fc96a23afnjnstatic vki_malloc_zone_t vg_default_zone = {
954731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // reserved1
955731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // reserved2
956731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // GrP fixme: malloc_size
95796044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10020,VG_Z_LIBC_SONAME,malloc_zone_malloc),
95896044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10060,VG_Z_LIBC_SONAME,malloc_zone_calloc),
95996044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10130,VG_Z_LIBC_SONAME,malloc_zone_valloc),
96096044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10040,VG_Z_LIBC_SONAME,malloc_zone_free),
96196044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10080,VG_Z_LIBC_SONAME,malloc_zone_realloc),
962731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // GrP fixme: destroy
963f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "ValgrindMallocZone",
964f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    NULL, // batch_malloc
965f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    NULL, // batch_free
966731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // GrP fixme: introspect
967f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    2,  // version (GrP fixme 3?)
968731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, /* memalign */   // DDD: this field exists in Mac OS 10.6, but not 10.5.
969731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, /* free_definite_size */
970731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, /* pressure_relief */
971f76d27a697a7b0bf3b84490baf60623fc96a23afnjn};
972f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
973731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
974f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define DEFAULT_ZONE(soname, fnname) \
975f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
97696044842731e581702c9ed4104d2949fcde20fd8sewardj   void *VG_REPLACE_FUNCTION_EZU(10210,soname,fnname) ( void ); \
97796044842731e581702c9ed4104d2949fcde20fd8sewardj   void *VG_REPLACE_FUNCTION_EZU(10210,soname,fnname) ( void )  \
978f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
979f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return &vg_default_zone; \
980f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
981f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
982f76d27a697a7b0bf3b84490baf60623fc96a23afnjnDEFAULT_ZONE(VG_Z_LIBC_SONAME, malloc_default_zone);
983f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
984731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
985731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj#define ZONE_FROM_PTR(soname, fnname) \
986731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   \
987731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   void *VG_REPLACE_FUNCTION_EZU(10220,soname,fnname) ( void* ptr ); \
988731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   void *VG_REPLACE_FUNCTION_EZU(10220,soname,fnname) ( void* ptr )  \
989731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   { \
990731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      return &vg_default_zone; \
991731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   }
992731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
993731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardjZONE_FROM_PTR(VG_Z_LIBC_SONAME, malloc_zone_from_ptr);
994731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
995731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
996f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// GrP fixme bypass libc's use of zone->introspect->check
997f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONE_CHECK(soname, fnname) \
998bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj   \
999731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   int VG_REPLACE_FUNCTION_EZU(10230,soname,fnname)(void* zone); \
1000731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   int VG_REPLACE_FUNCTION_EZU(10230,soname,fnname)(void* zone)  \
1001f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
1002f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return 1; \
1003f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
1004f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1005731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj//ZONE_CHECK(VG_Z_LIBC_SONAME, malloc_zone_check);
1006f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
10073c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif /* defined(VGO_darwin) */
1008f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1009f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1010731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj/*------------------ (startup related) ------------------*/
1011731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
10129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* All the code in here is unused until this function is called */
10139ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10142c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn__attribute__((constructor))
10159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic void init(void)
10169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj{
10172c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   // This doesn't look thread-safe, but it should be ok... Bart says:
10182c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //
10192c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   Every program I know of calls malloc() at least once before calling
10202c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   pthread_create().  So init_done gets initialized before any thread is
10212c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   created, and is only read when multiple threads are active
10222c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   simultaneously.  Such an access pattern is safe.
10232c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //
10242c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   If the assignment to the variable init_done would be triggering a race
10252c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   condition, both DRD and Helgrind would report this race.
10262c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //
10272c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   By the way, although the init() function in
10282c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   coregrind/m_replacemalloc/vg_replace_malloc.c has been declared
10292c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   __attribute__((constructor)), it is not safe to remove the variable
10302c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   init_done. This is because it is possible that malloc() and hence
10312c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   init() gets called before shared library initialization finished.
10322c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //
10339ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   if (init_done)
10349ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return;
10359ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   init_done = 1;
10379ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1038575ce8ef8fa86a502dabe152293320676922dcfebart   VALGRIND_DO_CLIENT_REQUEST_EXPR(-1, VG_USERREQ__GET_MALLOCFUNCS, &info,
1039575ce8ef8fa86a502dabe152293320676922dcfebart                                   0, 0, 0, 0);
10409ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj}
10419ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--------------------------------------------------------------------*/
10432c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn/*--- end                                                          ---*/
10449ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--------------------------------------------------------------------*/
1045