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