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