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