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