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
11ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Copyright (C) 2000-2017 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
977817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   10220 CREATE_ZONE
987817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   10230 ZONE_FROM_PTR
997817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   10240 ZONE_CHECK
1007817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   10250 ZONE_REGISTER
1017817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   10260 ZONE_UNREGISTER
1027817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   10270 ZONE_SET_NAME
1037817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   10280 ZONE_GET_NAME
104bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj*/
1059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* 2 Apr 05: the Portland Group compiler, which uses cfront/ARM style
1079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   mangling, could be supported properly by the redirects in this
1089ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   module.  Except we can't because it doesn't put its allocation
1099ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   functions in libpgc.so but instead hardwires them into the
1109ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   compilation unit holding main(), which makes them impossible to
1119ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   intercept directly.  Fortunately those fns seem to route everything
1129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   through to malloc/free.
113ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
114ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   mid-06: could be improved, since we can now intercept in the main
115ec92a0765980ae931b59642e3a2b2ac310189b23sewardj   executable too.
1169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
118126e82d6275be490a1d0ea608d6a860976bba0cbsewardj
119126e82d6275be490a1d0ea608d6a860976bba0cbsewardj
120126e82d6275be490a1d0ea608d6a860976bba0cbsewardj/* Call here to exit if we can't continue.  On Android we can't call
121126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   _exit for some reason, so we have to blunt-instrument it. */
1224c245e595b9f6300d3120408ca873f7115d9cc7dnjn__attribute__ ((__noreturn__))
123126e82d6275be490a1d0ea608d6a860976bba0cbsewardjstatic inline void my_exit ( int x )
124126e82d6275be490a1d0ea608d6a860976bba0cbsewardj{
12526ed419d60369d0545510eba0832566e24452e1esewardj#  if defined(VGPV_arm_linux_android) || defined(VGPV_mips32_linux_android) \
12626ed419d60369d0545510eba0832566e24452e1esewardj      || defined(VGPV_arm64_linux_android)
127126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   __asm__ __volatile__(".word 0xFFFFFFFF");
128126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   while (1) {}
1295d5dd8e6b7ff782fc89f5b96cecf04839742882bphilippe#  elif defined(VGPV_x86_linux_android)
1305d5dd8e6b7ff782fc89f5b96cecf04839742882bphilippe   __asm__ __volatile__("ud2");
1315d5dd8e6b7ff782fc89f5b96cecf04839742882bphilippe   while (1) {}
132126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  else
133052f591f8a373549aedb12fd3515a9e0c86bd8a9florian   extern __attribute__ ((__noreturn__)) void _exit(int status);
1344966542d95689e822685acd539181d117103ecdasewardj   _exit(x);
135126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  endif
136126e82d6275be490a1d0ea608d6a860976bba0cbsewardj}
137126e82d6275be490a1d0ea608d6a860976bba0cbsewardj
138126e82d6275be490a1d0ea608d6a860976bba0cbsewardj/* Same problem with getpagesize. */
1393c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardjstatic inline int my_getpagesize ( void )
1403c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj{
14126ed419d60369d0545510eba0832566e24452e1esewardj#  if defined(VGPV_arm_linux_android) \
14226ed419d60369d0545510eba0832566e24452e1esewardj      || defined(VGPV_x86_linux_android) \
14326ed419d60369d0545510eba0832566e24452e1esewardj      || defined(VGPV_mips32_linux_android) \
14426ed419d60369d0545510eba0832566e24452e1esewardj      || defined(VGPV_arm64_linux_android)
145126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   return 4096; /* kludge - link failure on Android, for some reason */
146126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  else
147126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   extern int getpagesize (void);
148126e82d6275be490a1d0ea608d6a860976bba0cbsewardj   return getpagesize();
149126e82d6275be490a1d0ea608d6a860976bba0cbsewardj#  endif
150126e82d6275be490a1d0ea608d6a860976bba0cbsewardj}
1519ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
152ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
15359570ffbe31930ab4d678754daaeec0715117a3dsewardj/* Compute the high word of the double-length unsigned product of U
15459570ffbe31930ab4d678754daaeec0715117a3dsewardj   and V.  This is for calloc argument overflow checking; see comments
15559570ffbe31930ab4d678754daaeec0715117a3dsewardj   below.  Algorithm as described in Hacker's Delight, chapter 8. */
15659570ffbe31930ab4d678754daaeec0715117a3dsewardjstatic UWord umulHW ( UWord u, UWord v )
15759570ffbe31930ab4d678754daaeec0715117a3dsewardj{
15859570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord u0, v0, w0, rHi;
15959570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord u1, v1, w1,w2,t;
16059570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord halfMask  = sizeof(UWord)==4 ? (UWord)0xFFFF
16159570ffbe31930ab4d678754daaeec0715117a3dsewardj                                      : (UWord)0xFFFFFFFFULL;
16259570ffbe31930ab4d678754daaeec0715117a3dsewardj   UWord halfShift = sizeof(UWord)==4 ? 16 : 32;
16359570ffbe31930ab4d678754daaeec0715117a3dsewardj   u0  = u & halfMask;
16459570ffbe31930ab4d678754daaeec0715117a3dsewardj   u1  = u >> halfShift;
16559570ffbe31930ab4d678754daaeec0715117a3dsewardj   v0  = v & halfMask;
16659570ffbe31930ab4d678754daaeec0715117a3dsewardj   v1  = v >> halfShift;
16759570ffbe31930ab4d678754daaeec0715117a3dsewardj   w0  = u0 * v0;
16859570ffbe31930ab4d678754daaeec0715117a3dsewardj   t   = u1 * v0 + (w0 >> halfShift);
16959570ffbe31930ab4d678754daaeec0715117a3dsewardj   w1  = t & halfMask;
17059570ffbe31930ab4d678754daaeec0715117a3dsewardj   w2  = t >> halfShift;
17159570ffbe31930ab4d678754daaeec0715117a3dsewardj   w1  = u0 * v1 + w1;
17259570ffbe31930ab4d678754daaeec0715117a3dsewardj   rHi = u1 * v1 + w2 + (w1 >> halfShift);
17359570ffbe31930ab4d678754daaeec0715117a3dsewardj   return rHi;
17459570ffbe31930ab4d678754daaeec0715117a3dsewardj}
17559570ffbe31930ab4d678754daaeec0715117a3dsewardj
17659570ffbe31930ab4d678754daaeec0715117a3dsewardj
1779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*------------------------------------------------------------*/
1789ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--- Replacing malloc() et al                             ---*/
1799ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*------------------------------------------------------------*/
1809ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1819ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* This struct is initially empty.  Before the first use of any of
1829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   these functions, we make a client request which fills in the
1839ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   fields.
1849ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
1859ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic struct vg_mallocfunc_info info;
1869ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic int init_done;
187cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe#define DO_INIT if (UNLIKELY(!init_done)) init()
1889ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1899ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Startup hook - called as init section */
1902c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn__attribute__((constructor))
1912c4e5358db11e4d69efb7d9c3ef2baa4a87af220njnstatic void init(void);
1929ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1939ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOC_TRACE(format, args...)  \
194d2597c22ffe4d197b9f078212d8db1a789f47275njn   if (info.clo_trace_malloc) {        \
195d2597c22ffe4d197b9f078212d8db1a789f47275njn      VALGRIND_INTERNAL_PRINTF(format, ## args ); }
1969ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1979ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Below are new versions of malloc, __builtin_new, free,
1989ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   __builtin_delete, calloc, realloc, memalign, and friends.
1999ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2009ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   None of these functions are called directly - they are not meant to
2010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   be found by the dynamic linker.  But ALL client calls to malloc()
2020ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   and friends wind up here eventually.  They get called because
2030ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   vg_replace_malloc installs a bunch of code redirects which causes
2040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   Valgrind to use these functions rather than the ones they're
2050ec07f32bbbb209d749b9974408e6f025ad40b31sewardj   replacing.
2069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
2079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
208cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe/* The replacement functions are running on the simulated CPU.
209cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe   The code on the simulated CPU does not necessarily use
210cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe   all arguments. E.g. args can be ignored and/or only given
211cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe   to a NON SIMD call.
212cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe   The definedness of such 'unused' arguments will not be verified
213cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe   by memcheck.
214347a481512d1e9adb8f195a5cbec850215a1ec05philippe   The macro 'TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED' allows
215cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe   memcheck to detect such errors for the otherwise unused args.
216347a481512d1e9adb8f195a5cbec850215a1ec05philippe   Apart of allowing memcheck to detect an error, the macro
217347a481512d1e9adb8f195a5cbec850215a1ec05philippe   TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED has no effect and
218cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe   has a minimal cost for other tools replacing malloc functions.
219cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe*/
220347a481512d1e9adb8f195a5cbec850215a1ec05philippe#define TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(x) \
221347a481512d1e9adb8f195a5cbec850215a1ec05philippe   if ((ULong)x == 0) __asm__ __volatile__( "" ::: "memory" )
222ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
223ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc ----------------------*/
224ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
2259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
2269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to allocate memory.  If that fails, return NULL.
2279ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
2289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define ALLOC_or_NULL(soname, fnname, vg_replacement) \
2299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
23096044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10010,soname,fnname) (SizeT n); \
23196044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10010,soname,fnname) (SizeT n)  \
2329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
2339ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
2349ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
235cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
236347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(n); \
237cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      MALLOC_TRACE(#fnname "(%llu)", (ULong)n ); \
2389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
2399ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
240d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
2419ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
2429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
2439ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
244f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEALLOC_or_NULL(soname, fnname, vg_replacement) \
245f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
24696044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10020,soname,fnname) (void *zone, SizeT n); \
24796044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10020,soname,fnname) (void *zone, SizeT n)  \
248f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
249f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      void* v; \
250f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
251cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
252347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) zone);	\
253347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(n);                   \
254f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      MALLOC_TRACE(#fnname "(%p, %llu)", zone, (ULong)n ); \
255f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
256f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
257d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
258f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return v; \
259f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
260f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
2619ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
2639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to allocate memory.  If that fails, it bombs the
2649ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   system.
2659ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
2669ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define ALLOC_or_BOMB(soname, fnname, vg_replacement)  \
2679ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
26896044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10030,soname,fnname) (SizeT n); \
26996044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10030,soname,fnname) (SizeT n)  \
2709ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
2719ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
2729ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
273cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
274347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(n);           \
275cf64bd259fa9be4913f57319f59c0b143df8dd1esewardj      MALLOC_TRACE(#fnname "(%llu)", (ULong)n );        \
2769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
2779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, n ); \
278d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
2799ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (NULL == v) { \
2809cdf9623a0328f09103b136bc8f7acfd1d5b906etom         VALGRIND_PRINTF( \
281d55f0d924062c7b5b3453242a6f9611bd5ce7458njn            "new/new[] failed and should throw an exception, but Valgrind\n"); \
282d55f0d924062c7b5b3453242a6f9611bd5ce7458njn         VALGRIND_PRINTF_BACKTRACE( \
283d55f0d924062c7b5b3453242a6f9611bd5ce7458njn            "   cannot throw exceptions and so is aborting instead.  Sorry.\n"); \
284126e82d6275be490a1d0ea608d6a860976bba0cbsewardj            my_exit(1); \
2859ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
2869ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
2879ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
2889ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2899ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// Each of these lines generates a replacement function:
2909ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj//     (from_so, from_fn,  v's replacement)
2911e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe// For some lines, we will also define a replacement function
2921e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe// whose only purpose is to be a soname synonym place holder
2931e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe// that can be replaced using --soname-synonyms.
2949ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
2959ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// malloc
2963c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
2973c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, malloc,      malloc);
2983c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_NULL(VG_Z_LIBC_SONAME,      malloc,      malloc);
2991e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ALLOC_or_NULL(SO_SYN_MALLOC,         malloc,      malloc);
300ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3013c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
3023c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_NULL(VG_Z_LIBC_SONAME,      malloc,      malloc);
3031e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ALLOC_or_NULL(SO_SYN_MALLOC,         malloc,      malloc);
3041e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ZONEALLOC_or_NULL(VG_Z_LIBC_SONAME,  malloc_zone_malloc, malloc);
3051e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ZONEALLOC_or_NULL(SO_SYN_MALLOC,     malloc_zone_malloc, malloc);
3069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3078eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
3088eb8bab992e3998c33770b0cdb16059a8b918a06sewardj ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, malloc,      malloc);
3098eb8bab992e3998c33770b0cdb16059a8b918a06sewardj ALLOC_or_NULL(VG_Z_LIBC_SONAME,      malloc,      malloc);
3108eb8bab992e3998c33770b0cdb16059a8b918a06sewardj ALLOC_or_NULL(VG_Z_LIBUMEM_SO_1,     malloc,      malloc);
3118eb8bab992e3998c33770b0cdb16059a8b918a06sewardj ALLOC_or_NULL(SO_SYN_MALLOC,         malloc,      malloc);
3128eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
3133c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
314a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj
3157c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
3163c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj/*---------------------- new ----------------------*/
3177c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
3183c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
3193c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned int), not mangled (for gcc 2.96)
3203c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  builtin_new,    __builtin_new);
3213c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBC_SONAME,       builtin_new,    __builtin_new);
3223c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  __builtin_new,  __builtin_new);
3233c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBC_SONAME,       __builtin_new,  __builtin_new);
3243c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned int), GNU mangling
3253c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
3263c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj,          __builtin_new);
3273c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwj,          __builtin_new);
3281e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  ALLOC_or_BOMB(SO_SYN_MALLOC,         _Znwj,          __builtin_new);
3293c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3303c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned long), GNU mangling
3313c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 8
3323c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwm,          __builtin_new);
3333c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwm,          __builtin_new);
3341e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  ALLOC_or_BOMB(SO_SYN_MALLOC,         _Znwm,          __builtin_new);
3353c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3363c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
3373c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
3383c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned int), GNU mangling
3393c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
340731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj,          __builtin_new);
341731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwj,          __builtin_new);
3423c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3433c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned long), GNU mangling
3443c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if 1 // FIXME: is this right?
345731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwm,          __builtin_new);
346731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znwm,          __builtin_new);
3473c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
348ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
3508eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator new(unsigned int), GNU mangling
3518eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #if VG_WORDSIZE == 4
3528eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj,          __builtin_new);
3538eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_BOMB(SO_SYN_MALLOC,         _Znwj,          __builtin_new);
3548eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #endif
3558eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator new(unsigned long), GNU mangling
3568eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #if VG_WORDSIZE == 8
3578eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwm,          __builtin_new);
3588eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_BOMB(SO_SYN_MALLOC,         _Znwm,          __builtin_new);
3598eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #endif
3608eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
361a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
3629b3328d805f0b493d697172f912d98cf73d74641sewardj
3639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
364ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new nothrow ----------------------*/
3659ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
3663c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
3673c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned, std::nothrow_t const&), GNU mangling
3683c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
3693c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t,  __builtin_new);
3703c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwjRKSt9nothrow_t,  __builtin_new);
3711e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  ALLOC_or_NULL(SO_SYN_MALLOC,         _ZnwjRKSt9nothrow_t,  __builtin_new);
3723c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3733c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned long, std::nothrow_t const&), GNU mangling
3743c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 8
3753c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwmRKSt9nothrow_t,  __builtin_new);
3763c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwmRKSt9nothrow_t,  __builtin_new);
3771e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  ALLOC_or_NULL(SO_SYN_MALLOC,         _ZnwmRKSt9nothrow_t,  __builtin_new);
3783c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3793c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
3803c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
3813c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned, std::nothrow_t const&), GNU mangling
3823c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
383731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t,  __builtin_new);
384731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwjRKSt9nothrow_t,  __builtin_new);
3853c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
3863c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new(unsigned long, std::nothrow_t const&), GNU mangling
3873c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if 1 // FIXME: is this right?
388731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwmRKSt9nothrow_t,  __builtin_new);
389731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnwmRKSt9nothrow_t,  __builtin_new);
3903c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
391ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
3928eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
3938eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator new(unsigned, std::nothrow_t const&), GNU mangling
3948eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #if VG_WORDSIZE == 4
3958eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t,  __builtin_new);
3968eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_NULL(SO_SYN_MALLOC,         _ZnwjRKSt9nothrow_t,  __builtin_new);
3978eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #endif
3988eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator new(unsigned long, std::nothrow_t const&), GNU mangling
3998eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #if VG_WORDSIZE == 8
4008eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwmRKSt9nothrow_t,  __builtin_new);
4018eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_NULL(SO_SYN_MALLOC,         _ZnwmRKSt9nothrow_t,  __builtin_new);
4028eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #endif
4038eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
404a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
405ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
406f91889f657474dce755b0a23d42da0266539251ctom
407ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new [] ----------------------*/
408ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
4093c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
4103c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned int), not mangled (for gcc 2.96)
4113c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME,  __builtin_vec_new, __builtin_vec_new );
4123c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ALLOC_or_BOMB(VG_Z_LIBC_SONAME,       __builtin_vec_new, __builtin_vec_new );
4133c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned int), GNU mangling
4143c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
4153c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj,             __builtin_vec_new );
4163c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znaj,             __builtin_vec_new );
4171e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  ALLOC_or_BOMB(SO_SYN_MALLOC,         _Znaj,             __builtin_vec_new );
4183c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
4193c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned long), GNU mangling
4203c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 8
4213c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znam,             __builtin_vec_new );
4223c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znam,             __builtin_vec_new );
4231e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  ALLOC_or_BOMB(SO_SYN_MALLOC,         _Znam,             __builtin_vec_new );
4243c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
4253c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4263c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
4273c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned int), GNU mangling
4283c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
429731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj,             __builtin_vec_new );
430731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znaj,             __builtin_vec_new );
4313c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
4323c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned long), GNU mangling
4333c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if 1 // FIXME: is this right?
434731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znam,             __builtin_vec_new );
435731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_BOMB(VG_Z_LIBC_SONAME,      _Znam,             __builtin_vec_new );
4363c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
4377c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
4388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
4398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator new[](unsigned int), GNU mangling
4408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #if VG_WORDSIZE == 4
4418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj,             __builtin_vec_new );
4428eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_BOMB(SO_SYN_MALLOC,         _Znaj,             __builtin_vec_new );
4438eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #endif
4448eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator new[](unsigned long), GNU mangling
4458eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #if VG_WORDSIZE == 8
4468eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znam,             __builtin_vec_new );
4478eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_BOMB(SO_SYN_MALLOC,         _Znam,             __builtin_vec_new );
4488eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #endif
4498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
450a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
451ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
452a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj
453ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- new [] nothrow ----------------------*/
454ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
4553c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
4563c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned, std::nothrow_t const&), GNU mangling
4573c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
4583c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
4593c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnajRKSt9nothrow_t, __builtin_vec_new );
4601e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  ALLOC_or_NULL(SO_SYN_MALLOC,         _ZnajRKSt9nothrow_t, __builtin_vec_new );
4613c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
4623c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned long, std::nothrow_t const&), GNU mangling
4633c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 8
4643c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
4653c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj  ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnamRKSt9nothrow_t, __builtin_vec_new );
4661e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  ALLOC_or_NULL(SO_SYN_MALLOC,         _ZnamRKSt9nothrow_t, __builtin_vec_new );
4673c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
4683c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
4693c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
4703c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned, std::nothrow_t const&), GNU mangling
4713c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if VG_WORDSIZE == 4
472731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
473731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnajRKSt9nothrow_t, __builtin_vec_new );
4743c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
4753c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator new[](unsigned long, std::nothrow_t const&), GNU mangling
4763c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #if 1 // FIXME: is this right?
477731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
478731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj  //ALLOC_or_NULL(VG_Z_LIBC_SONAME,      _ZnamRKSt9nothrow_t, __builtin_vec_new );
4793c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj #endif
480ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
4818eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
4828eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator new[](unsigned, std::nothrow_t const&), GNU mangling
4838eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #if VG_WORDSIZE == 4
4848eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
4858eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_NULL(SO_SYN_MALLOC,         _ZnajRKSt9nothrow_t, __builtin_vec_new );
4868eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #endif
4878eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator new[](unsigned long, std::nothrow_t const&), GNU mangling
4888eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #if VG_WORDSIZE == 8
4898eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
4908eb8bab992e3998c33770b0cdb16059a8b918a06sewardj  ALLOC_or_NULL(SO_SYN_MALLOC,         _ZnamRKSt9nothrow_t, __builtin_vec_new );
4918eb8bab992e3998c33770b0cdb16059a8b918a06sewardj #endif
4928eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
493a0e1656ef31215bd9ff8f55338313166cfa5f13asewardj#endif
494f91889f657474dce755b0a23d42da0266539251ctom
495ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
496ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- free ----------------------*/
4979ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
4989ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Generate a replacement for 'fnname' in object 'soname', which calls
4999ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   'vg_replacement' to free previously allocated memory.
5009ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj*/
501f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEFREE(soname, fnname, vg_replacement) \
502f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
50396044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10040,soname,fnname) (void *zone, void *p); \
50496044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10040,soname,fnname) (void *zone, void *p)  \
505f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
506cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
507347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) zone);	\
508731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE(#fnname "(%p, %p)\n", zone, p ); \
509f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (p == NULL)  \
510f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         return; \
511f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      (void)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, p ); \
512f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
513f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
5149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define FREE(soname, fnname, vg_replacement) \
5159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
51696044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10050,soname,fnname) (void *p); \
51796044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10050,soname,fnname) (void *p)  \
5189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
519cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
520731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE(#fnname "(%p)\n", p ); \
5219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (p == NULL)  \
5229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return; \
5239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      (void)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, p ); \
5249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
5259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5261e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe
5273c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
5283c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  free,                 free );
5293c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       free,                 free );
5301e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe FREE(SO_SYN_MALLOC,          free,                 free );
5313c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5323c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
5333c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       free,                 free );
5341e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe FREE(SO_SYN_MALLOC,          free,                 free );
5353c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEFREE(VG_Z_LIBC_SONAME,   malloc_zone_free,     free );
5361e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ZONEFREE(SO_SYN_MALLOC,      malloc_zone_free,     free );
5373c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
5398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(VG_Z_LIBC_SONAME,       free,                 free );
5408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(VG_Z_LIBUMEM_SO_1,      free,                 free );
5418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(SO_SYN_MALLOC,          free,                 free );
5428eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
543ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
544ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
545ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
546ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- cfree ----------------------*/
5479ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5489ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj// cfree
5493c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
5503c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  cfree,                free );
5513c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       cfree,                free );
5521e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe FREE(SO_SYN_MALLOC,          cfree,                free );
5533c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5543c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
555731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,  cfree,                free );
556731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,       cfree,                free );
5573c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5588eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
5598eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(VG_Z_LIBC_SONAME,       cfree,                free );
5608eb8bab992e3998c33770b0cdb16059a8b918a06sewardj /* libumem does not implement cfree(). */
5618eb8bab992e3998c33770b0cdb16059a8b918a06sewardj //FREE(VG_Z_LIBUMEM_SO_1,      cfree,                free );
5628eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(SO_SYN_MALLOC,          cfree,                free );
5638eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
5643c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
565ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
5669ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
567ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete ----------------------*/
5687c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
5693c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
5703c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*), not mangled (for gcc 2.96)
5713c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,   __builtin_delete,     __builtin_delete );
5723c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,        __builtin_delete,     __builtin_delete );
5733c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*), GNU mangling
5743c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdlPv,               __builtin_delete );
5753c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       _ZdlPv,               __builtin_delete );
5761e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe FREE(SO_SYN_MALLOC,          _ZdlPv,               __builtin_delete );
5773c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5783c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
5793c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*), GNU mangling
580731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdlPv,               __builtin_delete );
581731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,       _ZdlPv,               __builtin_delete );
5823c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5838eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
5848eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator delete(void*), GNU mangling
5858eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdlPv,               __builtin_delete );
5868eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(SO_SYN_MALLOC,          _ZdlPv,               __builtin_delete );
5878eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
5883c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
589ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
590ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
591ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete nothrow ----------------------*/
5929ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
5933c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
5943c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*, std::nothrow_t const&), GNU mangling
5953c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t,  __builtin_delete );
5963c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,      _ZdlPvRKSt9nothrow_t,  __builtin_delete );
5971e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe FREE(SO_SYN_MALLOC,         _ZdlPvRKSt9nothrow_t,  __builtin_delete );
5983c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
5993c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
6003c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete(void*, std::nothrow_t const&), GNU mangling
601731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t,  __builtin_delete );
602731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,      _ZdlPvRKSt9nothrow_t,  __builtin_delete );
6033c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
6048eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
6058eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator delete(void*, std::nothrow_t const&), GNU mangling
6068eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t,  __builtin_delete );
6078eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(SO_SYN_MALLOC,         _ZdlPvRKSt9nothrow_t,  __builtin_delete );
6088eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
6093c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
610ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
6119ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
612ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete [] ----------------------*/
6137c1fa878a4ae368a84b680e8c881222e2ff2de51sewardj
6143c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
6153c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*), not mangled (for gcc 2.96)
6163c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,   __builtin_vec_delete, __builtin_vec_delete );
6173c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,        __builtin_vec_delete, __builtin_vec_delete );
6183c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*), GNU mangling
6193c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPv,               __builtin_vec_delete );
6203c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       _ZdaPv,               __builtin_vec_delete );
6211e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe FREE(SO_SYN_MALLOC,          _ZdaPv,               __builtin_vec_delete );
6223c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
6233c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
6243c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*), not mangled (for gcc 2.96)
625731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,   __builtin_vec_delete, __builtin_vec_delete );
626731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,        __builtin_vec_delete, __builtin_vec_delete );
6273c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*), GNU mangling
628731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPv,               __builtin_vec_delete );
629731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,       _ZdaPv,               __builtin_vec_delete );
6303c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
6318eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
6328eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator delete[](void*), GNU mangling
6338eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPv,               __builtin_vec_delete );
6348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(SO_SYN_MALLOC,          _ZdaPv,               __builtin_vec_delete );
6358eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
6363c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
637ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
638ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
639ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- delete [] nothrow ----------------------*/
6409ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6413c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
6423c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*, std::nothrow_t const&), GNU mangling
6433c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
6443c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj FREE(VG_Z_LIBC_SONAME,       _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
6451e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe FREE(SO_SYN_MALLOC,          _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
6463c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
6473c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
6483c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj // operator delete[](void*, std::nothrow_t const&), GNU mangling
649731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
650731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //FREE(VG_Z_LIBC_SONAME,       _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
6513c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
6528eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
6538eb8bab992e3998c33770b0cdb16059a8b918a06sewardj // operator delete[](void*, std::nothrow_t const&), GNU mangling
6548eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(VG_Z_LIBSTDCXX_SONAME,  _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
6558eb8bab992e3998c33770b0cdb16059a8b918a06sewardj FREE(SO_SYN_MALLOC,          _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
6568eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
6573c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
6589ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
6599ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
660ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- calloc ----------------------*/
661ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
662f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONECALLOC(soname, fnname) \
663f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
66496044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10060,soname,fnname) \
665bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT nmemb, SizeT size ); \
66696044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10060,soname,fnname) \
667bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT nmemb, SizeT size )  \
668f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
669f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      void* v; \
670f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
671cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
672347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) zone); \
673347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(nmemb); \
674347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(size); \
675731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE("zone_calloc(%p, %llu,%llu)", zone, (ULong)nmemb, (ULong)size ); \
676f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
677f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_calloc, nmemb, size ); \
678d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
679f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return v; \
680f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
681f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
6829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define CALLOC(soname, fnname) \
6839ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
68496044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10070,soname,fnname) \
685bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( SizeT nmemb, SizeT size ); \
68696044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10070,soname,fnname) \
687bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( SizeT nmemb, SizeT size )  \
6889ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
6899ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
6909ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
691cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
6929ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("calloc(%llu,%llu)", (ULong)nmemb, (ULong)size ); \
6939ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
69459570ffbe31930ab4d678754daaeec0715117a3dsewardj      /* Protect against overflow.  See bug 24078. (that bug number is
69559570ffbe31930ab4d678754daaeec0715117a3dsewardj         invalid.  Which one really?) */ \
69659570ffbe31930ab4d678754daaeec0715117a3dsewardj      /* But don't use division, since that produces an external symbol
69759570ffbe31930ab4d678754daaeec0715117a3dsewardj         reference on ARM, in the form of a call to __aeabi_uidiv.  It's
69859570ffbe31930ab4d678754daaeec0715117a3dsewardj         normally OK, because ld.so manages to resolve it to something in the
69959570ffbe31930ab4d678754daaeec0715117a3dsewardj         executable, or one of its shared objects.  But that isn't guaranteed
70059570ffbe31930ab4d678754daaeec0715117a3dsewardj         to be the case, and it has been observed to fail in rare cases, eg:
70159570ffbe31930ab4d678754daaeec0715117a3dsewardj            echo x | valgrind /bin/sed -n "s/.*-\>\ //p"
70259570ffbe31930ab4d678754daaeec0715117a3dsewardj         So instead compute the high word of the product and check it is zero. */ \
70359570ffbe31930ab4d678754daaeec0715117a3dsewardj      if (umulHW(size, nmemb) != 0) return NULL; \
7049ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_calloc, nmemb, size ); \
705d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
7069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
7079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
7089ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
7093c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
7103c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj CALLOC(VG_Z_LIBC_SONAME, calloc);
7111e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe CALLOC(SO_SYN_MALLOC,    calloc);
7123c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
7133c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
7143c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj CALLOC(VG_Z_LIBC_SONAME, calloc);
7151e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe CALLOC(SO_SYN_MALLOC,    calloc);
7163c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONECALLOC(VG_Z_LIBC_SONAME, malloc_zone_calloc);
7171e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ZONECALLOC(SO_SYN_MALLOC,    malloc_zone_calloc);
7183c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
7198eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
7208eb8bab992e3998c33770b0cdb16059a8b918a06sewardj CALLOC(VG_Z_LIBC_SONAME,      calloc);
7218eb8bab992e3998c33770b0cdb16059a8b918a06sewardj CALLOC(VG_Z_LIBUMEM_SO_1,     calloc);
7228eb8bab992e3998c33770b0cdb16059a8b918a06sewardj CALLOC(SO_SYN_MALLOC,         calloc);
7238eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
724ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
725ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
7269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
727ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- realloc ----------------------*/
7289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
729f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEREALLOC(soname, fnname) \
730f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
73196044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10080,soname,fnname) \
732bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, void* ptrV, SizeT new_size ); \
73396044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10080,soname,fnname) \
734bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, void* ptrV, SizeT new_size ) \
735f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
736f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      void* v; \
737f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
738cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
739731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE("zone_realloc(%p,%p,%llu)", zone, ptrV, (ULong)new_size ); \
740f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
741f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (ptrV == NULL) \
742f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         /* We need to call a malloc-like function; so let's use \
743f76d27a697a7b0bf3b84490baf60623fc96a23afnjn            one which we know exists. GrP fixme use zonemalloc instead? */ \
74496044842731e581702c9ed4104d2949fcde20fd8sewardj         return VG_REPLACE_FUNCTION_EZU(10010,VG_Z_LIBC_SONAME,malloc) \
7457696726f188b4b50dc792a2b351bf7e162517ba9sewardj                   (new_size); \
746f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (new_size <= 0) { \
74796044842731e581702c9ed4104d2949fcde20fd8sewardj         VG_REPLACE_FUNCTION_EZU(10050,VG_Z_LIBC_SONAME,free)(ptrV); \
748d55f0d924062c7b5b3453242a6f9611bd5ce7458njn         MALLOC_TRACE(" = 0\n"); \
749f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         return NULL; \
750f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      } \
751f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_realloc, ptrV, new_size ); \
752d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
753f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return v; \
754f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
755f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
7569ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define REALLOC(soname, fnname) \
7579ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
75896044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10090,soname,fnname) \
759bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void* ptrV, SizeT new_size );\
76096044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10090,soname,fnname) \
761bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void* ptrV, SizeT new_size ) \
7629ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
7639ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
7649ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
765cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
7669ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("realloc(%p,%llu)", ptrV, (ULong)new_size ); \
7679ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
7689ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (ptrV == NULL) \
7699ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         /* We need to call a malloc-like function; so let's use \
7709ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj            one which we know exists. */ \
77196044842731e581702c9ed4104d2949fcde20fd8sewardj         return VG_REPLACE_FUNCTION_EZU(10010,VG_Z_LIBC_SONAME,malloc) \
772bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj                   (new_size); \
7739ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (new_size <= 0) { \
77496044842731e581702c9ed4104d2949fcde20fd8sewardj         VG_REPLACE_FUNCTION_EZU(10050,VG_Z_LIBC_SONAME,free)(ptrV); \
775d55f0d924062c7b5b3453242a6f9611bd5ce7458njn         MALLOC_TRACE(" = 0\n"); \
7769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return NULL; \
7779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
7789ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_realloc, ptrV, new_size ); \
779d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
7809ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
7819ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
7829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
7833c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
7843c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj REALLOC(VG_Z_LIBC_SONAME, realloc);
7851e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe REALLOC(SO_SYN_MALLOC,    realloc);
7863c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
7873c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
7883c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj REALLOC(VG_Z_LIBC_SONAME, realloc);
7891e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe REALLOC(SO_SYN_MALLOC,    realloc);
7903c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEREALLOC(VG_Z_LIBC_SONAME, malloc_zone_realloc);
7911e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ZONEREALLOC(SO_SYN_MALLOC,    malloc_zone_realloc);
7923c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
7938eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
7948eb8bab992e3998c33770b0cdb16059a8b918a06sewardj REALLOC(VG_Z_LIBC_SONAME,      realloc);
7958eb8bab992e3998c33770b0cdb16059a8b918a06sewardj REALLOC(VG_Z_LIBUMEM_SO_1,     realloc);
7968eb8bab992e3998c33770b0cdb16059a8b918a06sewardj REALLOC(SO_SYN_MALLOC,         realloc);
7978eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
798ddc00dde46e4f556d7ec9bf1a1a1e4434bef63acsewardj#endif
799ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
8009ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
801ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- memalign ----------------------*/
8029ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
803f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEMEMALIGN(soname, fnname) \
804f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
80596044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10100,soname,fnname) \
806bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT alignment, SizeT n ); \
80796044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10100,soname,fnname) \
808bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT alignment, SizeT n ) \
809f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
810f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      void* v; \
811f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
812cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
813347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) zone);	\
814347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(n); \
815731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      MALLOC_TRACE("zone_memalign(%p, al %llu, size %llu)", \
816f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                   zone, (ULong)alignment, (ULong)n );  \
817f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
818f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      /* Round up to minimum alignment if necessary. */ \
819f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (alignment < VG_MIN_MALLOC_SZB) \
820f76d27a697a7b0bf3b84490baf60623fc96a23afnjn         alignment = VG_MIN_MALLOC_SZB; \
821f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
822f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      /* Round up to nearest power-of-two if necessary (like glibc). */ \
823f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      while (0 != (alignment & (alignment - 1))) alignment++; \
824f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      \
825f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_memalign, alignment, n ); \
826d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
827f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return v; \
828f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
829f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
8309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MEMALIGN(soname, fnname) \
8319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
83296044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10110,soname,fnname) \
833bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( SizeT alignment, SizeT n ); \
83496044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10110,soname,fnname) \
835bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( SizeT alignment, SizeT n )  \
8369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
8379ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void* v; \
8389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
839cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
840347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(n); \
8419ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("memalign(al %llu, size %llu)", \
8429ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj                   (ULong)alignment, (ULong)n ); \
8439ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
8449ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Round up to minimum alignment if necessary. */ \
8459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (alignment < VG_MIN_MALLOC_SZB) \
8469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         alignment = VG_MIN_MALLOC_SZB; \
8479ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
8489ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Round up to nearest power-of-two if necessary (like glibc). */ \
8499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      while (0 != (alignment & (alignment - 1))) alignment++; \
8509ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
8519ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_memalign, alignment, n ); \
852d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %p\n", v ); \
8539ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return v; \
8549ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
8559ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8563c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
8573c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MEMALIGN(VG_Z_LIBC_SONAME, memalign);
8581e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MEMALIGN(SO_SYN_MALLOC,    memalign);
8593c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8603c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
8613c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MEMALIGN(VG_Z_LIBC_SONAME, memalign);
8621e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MEMALIGN(SO_SYN_MALLOC,    memalign);
8633c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEMEMALIGN(VG_Z_LIBC_SONAME, malloc_zone_memalign);
8641e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ZONEMEMALIGN(SO_SYN_MALLOC,    malloc_zone_memalign);
8653c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
8668eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
8678eb8bab992e3998c33770b0cdb16059a8b918a06sewardj MEMALIGN(VG_Z_LIBC_SONAME,      memalign);
8688eb8bab992e3998c33770b0cdb16059a8b918a06sewardj MEMALIGN(VG_Z_LIBUMEM_SO_1,     memalign);
8698eb8bab992e3998c33770b0cdb16059a8b918a06sewardj MEMALIGN(SO_SYN_MALLOC,         memalign);
8708eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
871f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif
8729ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
8739ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
874ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- valloc ----------------------*/
875ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
8769ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define VALLOC(soname, fnname) \
8779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
87896044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10120,soname,fnname) ( SizeT size ); \
87996044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10120,soname,fnname) ( SizeT size ) \
8809ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
881e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj      static int pszB = 0; \
882e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj      if (pszB == 0) \
883126e82d6275be490a1d0ea608d6a860976bba0cbsewardj         pszB = my_getpagesize(); \
88496044842731e581702c9ed4104d2949fcde20fd8sewardj      return VG_REPLACE_FUNCTION_EZU(10110,VG_Z_LIBC_SONAME,memalign) \
885e66f2e09ec1aa9bab7a0fd6b02a6a6150ea85190sewardj                ((SizeT)pszB, size); \
8869ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
8879ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
888f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONEVALLOC(soname, fnname) \
889f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
89096044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10130,soname,fnname) \
891bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT size ); \
89296044842731e581702c9ed4104d2949fcde20fd8sewardj   void* VG_REPLACE_FUNCTION_EZU(10130,soname,fnname) \
893bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj            ( void *zone, SizeT size )  \
894f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
895f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      static int pszB = 0; \
896f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      if (pszB == 0) \
897126e82d6275be490a1d0ea608d6a860976bba0cbsewardj         pszB = my_getpagesize(); \
898ef93463730b79d68adcb9f865123544e0299e390sewardj      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) zone);	      \
89996044842731e581702c9ed4104d2949fcde20fd8sewardj      return VG_REPLACE_FUNCTION_EZU(10110,VG_Z_LIBC_SONAME,memalign) \
900f76d27a697a7b0bf3b84490baf60623fc96a23afnjn                ((SizeT)pszB, size); \
901f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
902f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
9033c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
9043c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj VALLOC(VG_Z_LIBC_SONAME, valloc);
9051e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe VALLOC(SO_SYN_MALLOC, valloc);
9063c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9073c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
9083c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj VALLOC(VG_Z_LIBC_SONAME, valloc);
9091e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe VALLOC(SO_SYN_MALLOC, valloc);
9103c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj ZONEVALLOC(VG_Z_LIBC_SONAME, malloc_zone_valloc);
9111e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe ZONEVALLOC(SO_SYN_MALLOC,    malloc_zone_valloc);
9123c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9138eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
9148eb8bab992e3998c33770b0cdb16059a8b918a06sewardj VALLOC(VG_Z_LIBC_SONAME,      valloc);
9158eb8bab992e3998c33770b0cdb16059a8b918a06sewardj VALLOC(VG_Z_LIBUMEM_SO_1,     valloc);
9168eb8bab992e3998c33770b0cdb16059a8b918a06sewardj VALLOC(SO_SYN_MALLOC,         valloc);
9178eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
918f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif
919ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
9209ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
921ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- mallopt ----------------------*/
9229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
9239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Various compatibility wrapper functions, for glibc and libstdc++. */
9249ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
9259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOPT(soname, fnname) \
9269ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
92796044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10140,soname,fnname) ( int cmd, int value ); \
92896044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10140,soname,fnname) ( int cmd, int value ) \
9299ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
9309ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* In glibc-2.2.4, 1 denotes a successful return value for \
9319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         mallopt */ \
932347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(cmd); \
933347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(value); \
9349ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return 1; \
9359ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
9369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
9373c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
9383c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOPT(VG_Z_LIBC_SONAME, mallopt);
9391e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MALLOPT(SO_SYN_MALLOC,    mallopt);
9403c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9413c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
942731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLOPT(VG_Z_LIBC_SONAME, mallopt);
9433c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9443c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
9459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
9469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
947ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc_trim ----------------------*/
948ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn// Documentation says:
949ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   malloc_trim(size_t pad);
950ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
951ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   If possible, gives memory back to the system (via negative arguments to
952ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   sbrk) if there is unused memory at the `high' end of the malloc pool.
953ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   You can call this after freeing large blocks of memory to potentially
954ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   reduce the system-level memory requirements of a program. However, it
955ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   cannot guarantee to reduce memory.  Under some allocation patterns,
956ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   some large free blocks of memory will be locked between two used
957ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   chunks, so they cannot be given back to the system.
958ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
959ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   The `pad' argument to malloc_trim represents the amount of free
960ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   trailing space to leave untrimmed. If this argument is zero, only the
961ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   minimum amount of memory to maintain internal data structures will be
962ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   left (one page or less). Non-zero arguments can be supplied to maintain
963ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   enough trailing space to service future expected allocations without
964ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   having to re-obtain memory from the system.
965ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
966ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   Malloc_trim returns 1 if it actually released any memory, else 0. On
967ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//   systems that do not support "negative sbrks", it will always return 0.
968ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn//
969ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn// For simplicity, we always return 0.
970ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn#define MALLOC_TRIM(soname, fnname) \
971ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   \
97296044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10150,soname,fnname) ( SizeT pad ); \
97396044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10150,soname,fnname) ( SizeT pad ) \
974ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   { \
975ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn      /* 0 denotes that malloc_trim() either wasn't able \
976ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn         to do anything, or was not implemented */ \
977347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(pad); \
978ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn      return 0; \
979ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn   }
980ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
9813c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
9823c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_TRIM(VG_Z_LIBC_SONAME, malloc_trim);
9831e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MALLOC_TRIM(SO_SYN_MALLOC,    malloc_trim);
9843c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9853c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
986731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLOC_TRIM(VG_Z_LIBC_SONAME, malloc_trim);
9873c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
9883c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
989ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
990ceb026640b0b5808eba0c0e7e2f898d0ce56ec61njn
991ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- posix_memalign ----------------------*/
992ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
9939ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define POSIX_MEMALIGN(soname, fnname) \
9949ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
99596044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10160,soname,fnname) \
996bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj          ( void **memptr, SizeT alignment, SizeT size ); \
99796044842731e581702c9ed4104d2949fcde20fd8sewardj   int VG_REPLACE_FUNCTION_EZU(10160,soname,fnname) \
998bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj          ( void **memptr, SizeT alignment, SizeT size ) \
9999ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
10009ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      void *mem; \
10019ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
10029ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      /* Test whether the alignment argument is valid.  It must be \
10039ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         a power of two multiple of sizeof (void *).  */ \
10049ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (alignment % sizeof (void *) != 0 \
10059ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj          || (alignment & (alignment - 1)) != 0) \
10069ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return VKI_EINVAL; \
10079ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
100896044842731e581702c9ed4104d2949fcde20fd8sewardj      mem = VG_REPLACE_FUNCTION_EZU(10110,VG_Z_LIBC_SONAME,memalign) \
1009bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj               (alignment, size); \
10109ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
10119ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (mem != NULL) { \
10129ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj        *memptr = mem; \
10139ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj        return 0; \
10149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      } \
10159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
10169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return VKI_ENOMEM; \
10179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
10189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10193c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
10203c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
10211e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe POSIX_MEMALIGN(SO_SYN_MALLOC,    posix_memalign);
10223c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
10233c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
1024731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
10253c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
10268eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
10278eb8bab992e3998c33770b0cdb16059a8b918a06sewardj POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
10288eb8bab992e3998c33770b0cdb16059a8b918a06sewardj POSIX_MEMALIGN(SO_SYN_MALLOC,    posix_memalign);
10298eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
10303c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
1031ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
10329ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1033ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- malloc_usable_size ----------------------*/
10349ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10359ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLOC_USABLE_SIZE(soname, fnname) \
10369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
103796044842731e581702c9ed4104d2949fcde20fd8sewardj   SizeT VG_REPLACE_FUNCTION_EZU(10170,soname,fnname) ( void* p ); \
103896044842731e581702c9ed4104d2949fcde20fd8sewardj   SizeT VG_REPLACE_FUNCTION_EZU(10170,soname,fnname) ( void* p ) \
10399ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   {  \
10409ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      SizeT pszB; \
10419ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
1042cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
10439ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      MALLOC_TRACE("malloc_usable_size(%p)", p ); \
10449ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      if (NULL == p) \
10459ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj         return 0; \
10469ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
10478b140dee891a850c09d27f316df913acc7d7bae7njn      pszB = (SizeT)VALGRIND_NON_SIMD_CALL1( info.tl_malloc_usable_size, p ); \
1048d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE(" = %llu\n", (ULong)pszB ); \
10499ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      \
10509ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return pszB; \
10519ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
10529ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10533c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
10543c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size);
10551e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MALLOC_USABLE_SIZE(SO_SYN_MALLOC,    malloc_usable_size);
10563c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_size);
10571e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MALLOC_USABLE_SIZE(SO_SYN_MALLOC,    malloc_size);
10589c6b05db45362b1afb981aa8298ab12ab4027b1adejanj# if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android) \
10599c6b05db45362b1afb981aa8298ab12ab4027b1adejanj     || defined(VGPV_mips32_linux_android)
1060cce48f8ca0acec17ce1463cd2c4f3bd760057ca9sewardj  MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, dlmalloc_usable_size);
10611e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe  MALLOC_USABLE_SIZE(SO_SYN_MALLOC,    dlmalloc_usable_size);
1062cce48f8ca0acec17ce1463cd2c4f3bd760057ca9sewardj# endif
10633c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
10643c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
1065731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size);
10663c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_size);
10671e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MALLOC_USABLE_SIZE(SO_SYN_MALLOC,    malloc_size);
10683c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
10693c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
10709ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10719ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1072ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- (unimplemented) ----------------------*/
1073ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
10749ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* Bomb out if we get any of these. */
10759ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10768eb8bab992e3998c33770b0cdb16059a8b918a06sewardjstatic void panic(const char *str) __attribute__((unused));
10779ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic void panic(const char *str)
10789ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj{
1079d55f0d924062c7b5b3453242a6f9611bd5ce7458njn   VALGRIND_PRINTF_BACKTRACE("Program aborting because of call to %s\n", str);
108077ae9992c9acc09fdab63e1bc951bea61e719b1eflorian   my_exit(1);
10819ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj}
10829ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10839ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define PANIC(soname, fnname) \
10849ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
108596044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10180,soname,fnname) ( void ); \
108696044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10180,soname,fnname) ( void )  \
10879ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
10889ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      panic(#fnname); \
10899ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
10909ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
10913c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
10923c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, pvalloc);
10933c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, malloc_get_state);
10943c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, malloc_set_state);
10953c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
10963c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
10973c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, pvalloc);
10983c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, malloc_get_state);
10993c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj PANIC(VG_Z_LIBC_SONAME, malloc_set_state);
11003c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
11013c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
11023c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
1103ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
1104a610f530e02397519957a7663adf1bb4de92c07dsewardj#define MALLOC_STATS(soname, fnname) \
1105a610f530e02397519957a7663adf1bb4de92c07dsewardj   \
110696044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10190,soname,fnname) ( void ); \
110796044842731e581702c9ed4104d2949fcde20fd8sewardj   void VG_REPLACE_FUNCTION_EZU(10190,soname,fnname) ( void )  \
1108a610f530e02397519957a7663adf1bb4de92c07dsewardj   { \
1109a610f530e02397519957a7663adf1bb4de92c07dsewardj      /* Valgrind's malloc_stats implementation does nothing. */ \
1110a610f530e02397519957a7663adf1bb4de92c07dsewardj   }
1111a610f530e02397519957a7663adf1bb4de92c07dsewardj
11123c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
11133c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLOC_STATS(VG_Z_LIBC_SONAME, malloc_stats);
11141e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MALLOC_STATS(SO_SYN_MALLOC,    malloc_stats);
11153c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
11163c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
1117731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLOC_STATS(VG_Z_LIBC_SONAME, malloc_stats);
11183c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
11193c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
1120a610f530e02397519957a7663adf1bb4de92c07dsewardj
1121ec92a0765980ae931b59642e3a2b2ac310189b23sewardj
1122ec92a0765980ae931b59642e3a2b2ac310189b23sewardj/*---------------------- mallinfo ----------------------*/
11239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1124088bfb456af4ad2d1d0962f41e91d029bdec993enjn// mi must be static;  if it is auto then Memcheck thinks it is
1125088bfb456af4ad2d1d0962f41e91d029bdec993enjn// uninitialised when used by the caller of this function, because Memcheck
1126088bfb456af4ad2d1d0962f41e91d029bdec993enjn// doesn't know that the call to mallinfo fills in mi.
11279ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj#define MALLINFO(soname, fnname) \
11289ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   \
112996044842731e581702c9ed4104d2949fcde20fd8sewardj   struct vg_mallinfo VG_REPLACE_FUNCTION_EZU(10200,soname,fnname) ( void ); \
113096044842731e581702c9ed4104d2949fcde20fd8sewardj   struct vg_mallinfo VG_REPLACE_FUNCTION_EZU(10200,soname,fnname) ( void ) \
11319ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   { \
1132088bfb456af4ad2d1d0962f41e91d029bdec993enjn      static struct vg_mallinfo mi; \
1133cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe      DO_INIT; \
1134d55f0d924062c7b5b3453242a6f9611bd5ce7458njn      MALLOC_TRACE("mallinfo()\n"); \
1135088bfb456af4ad2d1d0962f41e91d029bdec993enjn      (void)VALGRIND_NON_SIMD_CALL1( info.mallinfo, &mi ); \
11369ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return mi; \
11379ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   }
11389ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
11393c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#if defined(VGO_linux)
11403c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj MALLINFO(VG_Z_LIBC_SONAME, mallinfo);
11411e470b5ec96bdd4fb46750d4e2e596e194af56fephilippe MALLINFO(SO_SYN_MALLOC,    mallinfo);
11423c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
11433c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#elif defined(VGO_darwin)
1144731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj //MALLINFO(VG_Z_LIBC_SONAME, mallinfo);
11453c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj
11463c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif
11479ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
11489ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
1149731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj/*------------------ Darwin zone stuff ------------------*/
1150731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
1151f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#if defined(VGO_darwin)
1152f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1153eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardjstatic size_t my_malloc_size ( void* zone, void* ptr )
1154eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardj{
1155eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardj   /* Implement "malloc_size" by handing the request through to the
1156eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardj      tool's .tl_usable_size method. */
1157cf9e1973453f3bcc4cea9e5e943f10101bc3740bphilippe   DO_INIT;
1158347a481512d1e9adb8f195a5cbec850215a1ec05philippe   TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) zone);
1159347a481512d1e9adb8f195a5cbec850215a1ec05philippe   TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED((UWord) ptr);
1160eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardj   size_t res = (size_t)VALGRIND_NON_SIMD_CALL1(
1161eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardj                           info.tl_malloc_usable_size, ptr);
1162eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardj   return res;
1163eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardj}
1164eb83f6c675d04a1dc955dacee16af3dffbe2fdc2sewardj
116521b7ab237c6d3bcfa2924d35d1bc43a4ebe6dea8sewardj/* Note that the (void*) casts below are a kludge which stops
1166ad4e979f408239dabbaae955d8ffcb84a51a5c85florian   compilers complaining about the fact that the replacement
116721b7ab237c6d3bcfa2924d35d1bc43a4ebe6dea8sewardj   functions aren't really of the right type. */
1168f76d27a697a7b0bf3b84490baf60623fc96a23afnjnstatic vki_malloc_zone_t vg_default_zone = {
1169731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // reserved1
1170731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // reserved2
117121b7ab237c6d3bcfa2924d35d1bc43a4ebe6dea8sewardj    (void*)my_malloc_size, // JRS fixme: is this right?
117296044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10020,VG_Z_LIBC_SONAME,malloc_zone_malloc),
117396044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10060,VG_Z_LIBC_SONAME,malloc_zone_calloc),
117496044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10130,VG_Z_LIBC_SONAME,malloc_zone_valloc),
117596044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10040,VG_Z_LIBC_SONAME,malloc_zone_free),
117696044842731e581702c9ed4104d2949fcde20fd8sewardj    (void*)VG_REPLACE_FUNCTION_EZU(10080,VG_Z_LIBC_SONAME,malloc_zone_realloc),
1177731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // GrP fixme: destroy
1178f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    "ValgrindMallocZone",
1179f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    NULL, // batch_malloc
1180f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    NULL, // batch_free
1181731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, // GrP fixme: introspect
1182f76d27a697a7b0bf3b84490baf60623fc96a23afnjn    2,  // version (GrP fixme 3?)
1183fa37d5b0244198bcd68cfac458a3beb7e424aab6rhyskidd    (void*)VG_REPLACE_FUNCTION_EZU(10100,VG_Z_LIBC_SONAME,malloc_zone_memalign), // DDD: this field exists in Mac OS 10.6+
1184731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, /* free_definite_size */
1185731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj    NULL, /* pressure_relief */
1186f76d27a697a7b0bf3b84490baf60623fc96a23afnjn};
1187f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1188731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
1189f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define DEFAULT_ZONE(soname, fnname) \
1190f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   \
119196044842731e581702c9ed4104d2949fcde20fd8sewardj   void *VG_REPLACE_FUNCTION_EZU(10210,soname,fnname) ( void ); \
119296044842731e581702c9ed4104d2949fcde20fd8sewardj   void *VG_REPLACE_FUNCTION_EZU(10210,soname,fnname) ( void )  \
1193f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
1194f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return &vg_default_zone; \
1195f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
1196f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1197f76d27a697a7b0bf3b84490baf60623fc96a23afnjnDEFAULT_ZONE(VG_Z_LIBC_SONAME, malloc_default_zone);
11981e470b5ec96bdd4fb46750d4e2e596e194af56fephilippeDEFAULT_ZONE(SO_SYN_MALLOC,    malloc_default_zone);
11997817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjDEFAULT_ZONE(VG_Z_LIBC_SONAME, malloc_default_purgeable_zone);
12007817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjDEFAULT_ZONE(SO_SYN_MALLOC,    malloc_default_purgeable_zone);
12017817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12027817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12037817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj#define CREATE_ZONE(soname, fnname) \
12047817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   \
12057817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void *VG_REPLACE_FUNCTION_EZU(10220,soname,fnname)(size_t sz, unsigned fl); \
12067817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void *VG_REPLACE_FUNCTION_EZU(10220,soname,fnname)(size_t sz, unsigned fl)  \
12077817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   { \
12087817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj      return &vg_default_zone; \
12097817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   }
12107817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjCREATE_ZONE(VG_Z_LIBC_SONAME, malloc_create_zone);
1211f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1212731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
1213731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj#define ZONE_FROM_PTR(soname, fnname) \
1214731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   \
12157817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void *VG_REPLACE_FUNCTION_EZU(10230,soname,fnname) ( void* ptr ); \
12167817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void *VG_REPLACE_FUNCTION_EZU(10230,soname,fnname) ( void* ptr )  \
1217731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   { \
1218731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj      return &vg_default_zone; \
1219731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj   }
1220731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
1221731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardjZONE_FROM_PTR(VG_Z_LIBC_SONAME, malloc_zone_from_ptr);
12221e470b5ec96bdd4fb46750d4e2e596e194af56fephilippeZONE_FROM_PTR(SO_SYN_MALLOC,    malloc_zone_from_ptr);
1223731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
1224731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
1225f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// GrP fixme bypass libc's use of zone->introspect->check
1226f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#define ZONE_CHECK(soname, fnname) \
1227bd2cff29a38ddf72c3f5c675dc68c6f5ba8d3c1asewardj   \
12287817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   int VG_REPLACE_FUNCTION_EZU(10240,soname,fnname)(void* zone); \
12297817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   int VG_REPLACE_FUNCTION_EZU(10240,soname,fnname)(void* zone)  \
1230f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   { \
1231347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(zone); \
12327817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj      panic(#fnname); \
1233f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      return 1; \
1234f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
1235f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
12367817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjZONE_CHECK(VG_Z_LIBC_SONAME, malloc_zone_check);
12377817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjZONE_CHECK(SO_SYN_MALLOC,    malloc_zone_check);
12387817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12397817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12407817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj#define ZONE_REGISTER(soname, fnname) \
12417817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   \
12427817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void VG_REPLACE_FUNCTION_EZU(10250,soname,fnname)(void* zone); \
12437817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void VG_REPLACE_FUNCTION_EZU(10250,soname,fnname)(void* zone)  \
12447817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   { \
1245347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(zone); \
12467817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   }
12477817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12487817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjZONE_REGISTER(VG_Z_LIBC_SONAME, malloc_zone_register);
12497817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjZONE_REGISTER(SO_SYN_MALLOC,    malloc_zone_register);
12507817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12517817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12527817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj#define ZONE_UNREGISTER(soname, fnname) \
12537817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   \
12547817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void VG_REPLACE_FUNCTION_EZU(10260,soname,fnname)(void* zone); \
12557817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void VG_REPLACE_FUNCTION_EZU(10260,soname,fnname)(void* zone)  \
12567817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   { \
1257347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(zone); \
12587817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   }
12597817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12607817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjZONE_UNREGISTER(VG_Z_LIBC_SONAME, malloc_zone_unregister);
12617817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjZONE_UNREGISTER(SO_SYN_MALLOC,    malloc_zone_unregister);
12627817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12637817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12647817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj#define ZONE_SET_NAME(soname, fnname) \
12657817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   \
12667817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void VG_REPLACE_FUNCTION_EZU(10270,soname,fnname)(void* zone, char* nm); \
12677817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   void VG_REPLACE_FUNCTION_EZU(10270,soname,fnname)(void* zone, char* nm)  \
12687817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   { \
1269347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(zone); \
12707817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   }
12717817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12727817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjZONE_SET_NAME(VG_Z_LIBC_SONAME, malloc_set_zone_name);
12737817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardjZONE_SET_NAME(SO_SYN_MALLOC,    malloc_set_zone_name);
12747817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12757817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12767817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj#define ZONE_GET_NAME(soname, fnname) \
12777817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   \
1278f7e83455272d3d819ccb9225ab69f4677f0ac7ccrhyskidd   const char* VG_REPLACE_FUNCTION_EZU(10280,soname,fnname)(void* zone); \
1279f7e83455272d3d819ccb9225ab69f4677f0ac7ccrhyskidd   const char* VG_REPLACE_FUNCTION_EZU(10280,soname,fnname)(void* zone)  \
12807817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   { \
1281347a481512d1e9adb8f195a5cbec850215a1ec05philippe      TRIGGER_MEMCHECK_ERROR_IF_UNDEFINED(zone); \
12827817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj      return vg_default_zone.zone_name; \
12837817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj   }
12847817ee4856cf0fec2f168c8f1c8b82b6af0feab1sewardj
12850bbeecd2af34eaf4c852758d050ac9c8154157a9rhyskiddZONE_GET_NAME(VG_Z_LIBC_SONAME, malloc_get_zone_name);
12860bbeecd2af34eaf4c852758d050ac9c8154157a9rhyskiddZONE_GET_NAME(SO_SYN_MALLOC,    malloc_get_zone_name);
1287f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
12883c9444598b4b8e9645a5e6c0456aa1acd62058a1sewardj#endif /* defined(VGO_darwin) */
1289f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1290f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
1291731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj/*------------------ (startup related) ------------------*/
1292731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj
12939ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/* All the code in here is unused until this function is called */
12949ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
12952c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn__attribute__((constructor))
12969ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardjstatic void init(void)
12979ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj{
12982c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   // This doesn't look thread-safe, but it should be ok... Bart says:
12992c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //
13002c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   Every program I know of calls malloc() at least once before calling
13012c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   pthread_create().  So init_done gets initialized before any thread is
13022c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   created, and is only read when multiple threads are active
13032c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   simultaneously.  Such an access pattern is safe.
13042c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //
13052c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   If the assignment to the variable init_done would be triggering a race
13062c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   condition, both DRD and Helgrind would report this race.
13072c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //
13082c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   By the way, although the init() function in
13092c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   coregrind/m_replacemalloc/vg_replace_malloc.c has been declared
13102c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   __attribute__((constructor)), it is not safe to remove the variable
13112c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   init_done. This is because it is possible that malloc() and hence
13122c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //   init() gets called before shared library initialization finished.
13132c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn   //
13149ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   if (init_done)
13159ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj      return;
13169ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
13179ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj   init_done = 1;
13189ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
13194b3a74204894e943c43cb8e8aae39d813040702csewardj   VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__GET_MALLOCFUNCS, &info,
1320575ce8ef8fa86a502dabe152293320676922dcfebart                                   0, 0, 0, 0);
13219ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj}
13229ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj
13239ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--------------------------------------------------------------------*/
13242c4e5358db11e4d69efb7d9c3ef2baa4a87af220njn/*--- end                                                          ---*/
13259ee81f503b5d0c6888a3cb1c7e6f7371d84351afsewardj/*--------------------------------------------------------------------*/
1326