1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Misc simple stuff lacking a better home. misc.c ---*/ 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This file is part of Valgrind, a dynamic binary instrumentation 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown framework. 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov Copyright (C) 2008-2013 OpenWorks LLP 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown info@open-works.co.uk 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is free software; you can redistribute it and/or 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown modify it under the terms of the GNU General Public License as 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown published by the Free Software Foundation; either version 2 of the 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown License, or (at your option) any later version. 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown This program is distributed in the hope that it will be useful, but 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown WITHOUT ANY WARRANTY; without even the implied warranty of 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown General Public License for more details. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown You should have received a copy of the GNU General Public License 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown along with this program; if not, write to the Free Software 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 02111-1307, USA. 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown The GNU General Public License is contained in the file COPYING. 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown Neither the names of the U.S. Department of Energy nor the 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown University of California nor the names of its contributors may be 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown used to endorse or promote products derived from this software 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown without prior written permission. 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/ 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics.h" 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcbase.h" 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_libcassert.h" 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_mallocfree.h" 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_xarray.h" 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "priv_misc.h" /* self */ 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid* ML_(dinfo_zalloc) ( const HChar* cc, SizeT szB ) { 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void* v; 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(szB > 0); 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown v = VG_(arena_malloc)( VG_AR_DINFO, cc, szB ); 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vg_assert(v); 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(memset)(v, 0, szB); 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return v; 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid ML_(dinfo_free) ( void* v ) { 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(arena_free)( VG_AR_DINFO, v ); 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovHChar* ML_(dinfo_strdup) ( const HChar* cc, const HChar* str ) { 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return VG_(arena_strdup)( VG_AR_DINFO, cc, str ); 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid* ML_(dinfo_memdup) ( const HChar* cc, void* str, SizeT nStr ) { 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov void* dst = VG_(arena_malloc)( VG_AR_DINFO, cc, nStr ); 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown tl_assert(dst); 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown VG_(memcpy)(dst, str, nStr); 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return dst; 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic inline Bool host_is_little_endian ( void ) { 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UInt x = 0x76543210; 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UChar* p = (UChar*)(&x); 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return toBool(*p == 0x10); 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovShort ML_(read_Short)( UChar* data ) { 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Short r = 0; 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[0] 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[1]) << 8 ); 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[1] 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[0]) << 8 ); 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return r; 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovInt ML_(read_Int) ( UChar* data ) { 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Int r = 0; 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[0] 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[1]) << 8 ) 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[2]) << 16 ) 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[3]) << 24 ); 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[3] 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[2]) << 8 ) 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[1]) << 16 ) 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[0]) << 24 ); 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return r; 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovLong ML_(read_Long) ( UChar* data ) { 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov Long r = 0; 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[0] 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[1]) << 8 ) 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[2]) << 16 ) 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[3]) << 24 ) 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[4]) << 32 ) 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[5]) << 40 ) 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[6]) << 48 ) 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[7]) << 56 ); 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[7] 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[6]) << 8 ) 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[5]) << 16 ) 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[4]) << 24 ) 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[3]) << 32 ) 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[2]) << 40 ) 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[1]) << 48 ) 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[0]) << 56 ); 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return r; 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUShort ML_(read_UShort) ( UChar* data ) { 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UInt r = 0; 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[0] 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[1]) << 8 ); 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[1] 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[0]) << 8 ); 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return r; 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUChar *ML_(write_UShort) ( UChar* ptr, UShort val ) { 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[0] = val & 0xff; 142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[1] = ( val >> 8 ) & 0xff; 143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[0] = ( val >> 8 ) & 0xff; 145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[1] = val & 0xff; 146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ptr + sizeof(UShort); 148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUWord ML_(read_UWord) ( UChar* data ) { 151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sizeof(UWord) == sizeof(UInt)) { 152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ML_(read_UInt)(data); 153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else if (sizeof(UWord) == sizeof(ULong)) { 154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ML_(read_ULong)(data); 155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(0); 157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUInt ML_(read_UInt) ( UChar* data ) { 161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov UInt r = 0; 162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[0] 164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[1]) << 8 ) 165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[2]) << 16 ) 166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[3]) << 24 ); 167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[3] 169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[2]) << 8 ) 170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[1]) << 16 ) 171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((UInt)data[0]) << 24 ); 172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return r; 174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUChar* ML_(write_UInt) ( UChar* ptr, UInt val ) { 177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[0] = val & 0xff; 179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[1] = ( val >> 8 ) & 0xff; 180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[2] = ( val >> 16 ) & 0xff; 181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[3] = ( val >> 24 ) & 0xff; 182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[0] = ( val >> 24 ) & 0xff; 184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[1] = ( val >> 16 ) & 0xff; 185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[2] = ( val >> 8 ) & 0xff; 186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[3] = val & 0xff; 187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ptr + sizeof(UInt); 189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovULong ML_(read_ULong) ( UChar* data ) { 192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ULong r = 0; 193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[0] 195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[1]) << 8 ) 196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[2]) << 16 ) 197b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[3]) << 24 ) 198b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[4]) << 32 ) 199b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[5]) << 40 ) 200b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[6]) << 48 ) 201b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[7]) << 56 ); 202b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 203b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov r = data[7] 204b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[6]) << 8 ) 205b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[5]) << 16 ) 206b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[4]) << 24 ) 207b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[3]) << 32 ) 208b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[2]) << 40 ) 209b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[1]) << 48 ) 210b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov | ( ((ULong)data[0]) << 56 ); 211b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 212b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return r; 213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 214b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 215b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUChar* ML_(write_ULong) ( UChar* ptr, ULong val ) { 216b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (host_is_little_endian()) { 217b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[0] = val & 0xff; 218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[1] = ( val >> 8 ) & 0xff; 219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[2] = ( val >> 16 ) & 0xff; 220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[3] = ( val >> 24 ) & 0xff; 221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[4] = ( val >> 32 ) & 0xff; 222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[5] = ( val >> 40 ) & 0xff; 223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[6] = ( val >> 48 ) & 0xff; 224b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[7] = ( val >> 56 ) & 0xff; 225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 226b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[0] = ( val >> 56 ) & 0xff; 227b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[1] = ( val >> 48 ) & 0xff; 228b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[2] = ( val >> 40 ) & 0xff; 229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[3] = ( val >> 32 ) & 0xff; 230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[4] = ( val >> 24 ) & 0xff; 231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[5] = ( val >> 16 ) & 0xff; 232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[6] = ( val >> 8 ) & 0xff; 233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[7] = val & 0xff; 234b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 235b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ptr + sizeof(ULong); 236b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 237b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 238b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUChar ML_(read_UChar) ( UChar* data ) { 239b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return data[0]; 240b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 241b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 242b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUChar* ML_(write_UChar) ( UChar* ptr, UChar val ) { 243b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov ptr[0] = val; 244b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ptr + sizeof(UChar); 245b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 246b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 247b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovAddr ML_(read_Addr) ( UChar* data ) { 248b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sizeof(Addr) == sizeof(UInt)) { 249b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ML_(read_UInt)(data); 250b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else if (sizeof(Addr) == sizeof(ULong)) { 251b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ML_(read_ULong)(data); 252b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 253b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(0); 254b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 255b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 256b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovUChar* ML_(write_Addr) ( UChar* ptr, Addr val ) { 258b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sizeof(Addr) == sizeof(UInt)) { 259b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ML_(write_UInt)(ptr, val); 260b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else if (sizeof(Addr) == sizeof(ULong)) { 261b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return ML_(write_ULong)(ptr, val); 262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } else { 263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov vg_assert(0); 264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end misc.c ---*/ 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 271