1b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
2b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/*--------------------------------------------------------------------*/
3b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/*--- Misc simple stuff lacking a better home.              misc.c ---*/
4b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/*--------------------------------------------------------------------*/
5b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
6b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/*
7b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   This file is part of Valgrind, a dynamic binary instrumentation
8b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   framework.
9b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
100f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj   Copyright (C) 2008-2013 OpenWorks LLP
11b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      info@open-works.co.uk
12b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
13b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   This program is free software; you can redistribute it and/or
14b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   modify it under the terms of the GNU General Public License as
15b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   published by the Free Software Foundation; either version 2 of the
16b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   License, or (at your option) any later version.
17b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
18b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   This program is distributed in the hope that it will be useful, but
19b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
20b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   General Public License for more details.
22b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
23b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   You should have received a copy of the GNU General Public License
24b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   along with this program; if not, write to the Free Software
25b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   02111-1307, USA.
27b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
28b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   The GNU General Public License is contained in the file COPYING.
29b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
30b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Neither the names of the U.S. Department of Energy nor the
31b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   University of California nor the names of its contributors may be
32b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   used to endorse or promote products derived from this software
33b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   without prior written permission.
34b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj*/
35b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
36b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "pub_core_basics.h"
37b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "pub_core_libcbase.h"
38b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "pub_core_libcassert.h"
39b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "pub_core_mallocfree.h"
40b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "pub_core_xarray.h"
41b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
42b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj#include "priv_misc.h"            /* self */
43b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
44b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
4554fe2021b87b9e5edb8ec8070f47b86d5cafb8aaflorianvoid* ML_(dinfo_zalloc) ( const HChar* cc, SizeT szB ) {
46b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   void* v;
47b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   vg_assert(szB > 0);
489c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   v = VG_(arena_malloc)( VG_AR_DINFO, cc, szB );
49b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   VG_(memset)(v, 0, szB);
50b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   return v;
51b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
52b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
530b9d0646949bd382758763664d3bf2d6115993aephilippevoid  ML_(dinfo_shrink_block)( void* ptr, SizeT szB ) {
540b9d0646949bd382758763664d3bf2d6115993aephilippe   VG_(arena_realloc_shrink)( VG_AR_DINFO, ptr, szB );
550b9d0646949bd382758763664d3bf2d6115993aephilippe}
560b9d0646949bd382758763664d3bf2d6115993aephilippe
57b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(dinfo_free) ( void* v ) {
58b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   VG_(arena_free)( VG_AR_DINFO, v );
59b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
60b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
611636d33c13958b9c0e7d3059cdd5005746418eb2florianHChar* ML_(dinfo_strdup) ( const HChar* cc, const HChar* str ) {
629c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   return VG_(arena_strdup)( VG_AR_DINFO, cc, str );
639c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj}
649c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj
65518850bf0da07ed3e2244e307268ae0fd80e93a8florianvoid* ML_(dinfo_memdup) ( const HChar* cc, const void* str, SizeT nStr ) {
661636d33c13958b9c0e7d3059cdd5005746418eb2florian   void* dst = VG_(arena_malloc)( VG_AR_DINFO, cc, nStr );
679c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   VG_(memcpy)(dst, str, nStr);
689c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   return dst;
69b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj}
70b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
7146cc04521acf2827eb33310fadc119bf2dc039e4florianvoid* ML_(dinfo_realloc) ( const HChar* cc, void* ptr, SizeT new_size ) {
7246cc04521acf2827eb33310fadc119bf2dc039e4florian   void* dst = VG_(arena_realloc)( VG_AR_DINFO, cc, ptr, new_size );
7346cc04521acf2827eb33310fadc119bf2dc039e4florian   vg_assert(dst);
7446cc04521acf2827eb33310fadc119bf2dc039e4florian   return dst;
7546cc04521acf2827eb33310fadc119bf2dc039e4florian}
7646cc04521acf2827eb33310fadc119bf2dc039e4florian
77d32fb2b481ee4eda50a62e49d25199e0174940e0tomstatic inline Bool host_is_little_endian ( void ) {
78d32fb2b481ee4eda50a62e49d25199e0174940e0tom   UInt x = 0x76543210;
79d32fb2b481ee4eda50a62e49d25199e0174940e0tom   UChar* p = (UChar*)(&x);
80d32fb2b481ee4eda50a62e49d25199e0174940e0tom   return toBool(*p == 0x10);
81d32fb2b481ee4eda50a62e49d25199e0174940e0tom}
82d32fb2b481ee4eda50a62e49d25199e0174940e0tom
83c474069560175a011af75868e0cbe66a6646f8a1philippeShort ML_(readUAS_Short)( const UChar* data ) {
84d32fb2b481ee4eda50a62e49d25199e0174940e0tom   Short r = 0;
85d32fb2b481ee4eda50a62e49d25199e0174940e0tom   if (host_is_little_endian()) {
86d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[0]
87d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[1]) << 8 );
88d32fb2b481ee4eda50a62e49d25199e0174940e0tom   } else {
89d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[1]
90d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[0]) << 8 );
91d32fb2b481ee4eda50a62e49d25199e0174940e0tom   }
92d32fb2b481ee4eda50a62e49d25199e0174940e0tom   return r;
93d32fb2b481ee4eda50a62e49d25199e0174940e0tom}
94d32fb2b481ee4eda50a62e49d25199e0174940e0tom
95c474069560175a011af75868e0cbe66a6646f8a1philippeInt ML_(readUAS_Int) ( const UChar* data ) {
96d32fb2b481ee4eda50a62e49d25199e0174940e0tom   Int r = 0;
97d32fb2b481ee4eda50a62e49d25199e0174940e0tom   if (host_is_little_endian()) {
98d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[0]
99d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[1]) << 8 )
100d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[2]) << 16 )
101d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[3]) << 24 );
102d32fb2b481ee4eda50a62e49d25199e0174940e0tom   } else {
103d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[3]
104d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[2]) << 8 )
105d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[1]) << 16 )
106d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[0]) << 24 );
107d32fb2b481ee4eda50a62e49d25199e0174940e0tom   }
108d32fb2b481ee4eda50a62e49d25199e0174940e0tom   return r;
109d32fb2b481ee4eda50a62e49d25199e0174940e0tom}
110d32fb2b481ee4eda50a62e49d25199e0174940e0tom
111c474069560175a011af75868e0cbe66a6646f8a1philippeLong ML_(readUAS_Long) ( const UChar* data ) {
112d32fb2b481ee4eda50a62e49d25199e0174940e0tom   Long r = 0;
113d32fb2b481ee4eda50a62e49d25199e0174940e0tom   if (host_is_little_endian()) {
114d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[0]
115d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[1]) << 8 )
116d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[2]) << 16 )
117d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[3]) << 24 )
118d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[4]) << 32 )
119d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[5]) << 40 )
120d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[6]) << 48 )
121d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[7]) << 56 );
122d32fb2b481ee4eda50a62e49d25199e0174940e0tom   } else {
123d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[7]
124d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[6]) << 8 )
125d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[5]) << 16 )
126d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[4]) << 24 )
127d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[3]) << 32 )
128d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[2]) << 40 )
129d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[1]) << 48 )
130d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((ULong)data[0]) << 56 );
131d32fb2b481ee4eda50a62e49d25199e0174940e0tom   }
132d32fb2b481ee4eda50a62e49d25199e0174940e0tom   return r;
133d32fb2b481ee4eda50a62e49d25199e0174940e0tom}
134d32fb2b481ee4eda50a62e49d25199e0174940e0tom
135c474069560175a011af75868e0cbe66a6646f8a1philippeUShort ML_(readUAS_UShort) ( const UChar* data ) {
136d32fb2b481ee4eda50a62e49d25199e0174940e0tom   UInt r = 0;
137d32fb2b481ee4eda50a62e49d25199e0174940e0tom   if (host_is_little_endian()) {
138d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[0]
139d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[1]) << 8 );
140d32fb2b481ee4eda50a62e49d25199e0174940e0tom   } else {
141d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[1]
142d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[0]) << 8 );
143d32fb2b481ee4eda50a62e49d25199e0174940e0tom   }
144d32fb2b481ee4eda50a62e49d25199e0174940e0tom   return r;
145d32fb2b481ee4eda50a62e49d25199e0174940e0tom}
146d32fb2b481ee4eda50a62e49d25199e0174940e0tom
147c474069560175a011af75868e0cbe66a6646f8a1philippeUChar *ML_(writeUAS_UShort) ( UChar* ptr, UShort val ) {
14886781fabbfc019b752f9605e487cfce77b2a592atom   if (host_is_little_endian()) {
14986781fabbfc019b752f9605e487cfce77b2a592atom      ptr[0] = val & 0xff;
15086781fabbfc019b752f9605e487cfce77b2a592atom      ptr[1] = ( val >> 8 ) & 0xff;
15186781fabbfc019b752f9605e487cfce77b2a592atom   } else {
15286781fabbfc019b752f9605e487cfce77b2a592atom      ptr[0] = ( val >> 8 ) & 0xff;
15386781fabbfc019b752f9605e487cfce77b2a592atom      ptr[1] = val & 0xff;
15486781fabbfc019b752f9605e487cfce77b2a592atom   }
15586781fabbfc019b752f9605e487cfce77b2a592atom   return ptr + sizeof(UShort);
15686781fabbfc019b752f9605e487cfce77b2a592atom}
15786781fabbfc019b752f9605e487cfce77b2a592atom
158c474069560175a011af75868e0cbe66a6646f8a1philippeUWord ML_(readUAS_UWord) ( const UChar* data ) {
15986781fabbfc019b752f9605e487cfce77b2a592atom   if (sizeof(UWord) == sizeof(UInt)) {
16086781fabbfc019b752f9605e487cfce77b2a592atom      return ML_(read_UInt)(data);
16186781fabbfc019b752f9605e487cfce77b2a592atom   } else if  (sizeof(UWord) == sizeof(ULong)) {
16286781fabbfc019b752f9605e487cfce77b2a592atom      return ML_(read_ULong)(data);
16386781fabbfc019b752f9605e487cfce77b2a592atom   } else {
16486781fabbfc019b752f9605e487cfce77b2a592atom      vg_assert(0);
16586781fabbfc019b752f9605e487cfce77b2a592atom   }
16686781fabbfc019b752f9605e487cfce77b2a592atom}
16786781fabbfc019b752f9605e487cfce77b2a592atom
168c474069560175a011af75868e0cbe66a6646f8a1philippeUInt ML_(readUAS_UInt) ( const UChar* data ) {
169d32fb2b481ee4eda50a62e49d25199e0174940e0tom   UInt r = 0;
170d32fb2b481ee4eda50a62e49d25199e0174940e0tom   if (host_is_little_endian()) {
171d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[0]
172d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[1]) << 8 )
173d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[2]) << 16 )
174d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[3]) << 24 );
175d32fb2b481ee4eda50a62e49d25199e0174940e0tom   } else {
176d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[3]
177d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[2]) << 8 )
178d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[1]) << 16 )
179d32fb2b481ee4eda50a62e49d25199e0174940e0tom          | ( ((UInt)data[0]) << 24 );
180d32fb2b481ee4eda50a62e49d25199e0174940e0tom   }
181d32fb2b481ee4eda50a62e49d25199e0174940e0tom   return r;
182d32fb2b481ee4eda50a62e49d25199e0174940e0tom}
183d32fb2b481ee4eda50a62e49d25199e0174940e0tom
184c474069560175a011af75868e0cbe66a6646f8a1philippeUChar* ML_(writeUAS_UInt) ( UChar* ptr, UInt val ) {
18586781fabbfc019b752f9605e487cfce77b2a592atom   if (host_is_little_endian()) {
18686781fabbfc019b752f9605e487cfce77b2a592atom      ptr[0] = val & 0xff;
18786781fabbfc019b752f9605e487cfce77b2a592atom      ptr[1] = ( val >> 8 ) & 0xff;
18886781fabbfc019b752f9605e487cfce77b2a592atom      ptr[2] = ( val >> 16 ) & 0xff;
18986781fabbfc019b752f9605e487cfce77b2a592atom      ptr[3] = ( val >> 24 ) & 0xff;
19086781fabbfc019b752f9605e487cfce77b2a592atom   } else {
19186781fabbfc019b752f9605e487cfce77b2a592atom      ptr[0] = ( val >> 24 ) & 0xff;
19286781fabbfc019b752f9605e487cfce77b2a592atom      ptr[1] = ( val >> 16 ) & 0xff;
19386781fabbfc019b752f9605e487cfce77b2a592atom      ptr[2] = ( val >> 8 ) & 0xff;
19486781fabbfc019b752f9605e487cfce77b2a592atom      ptr[3] = val & 0xff;
19586781fabbfc019b752f9605e487cfce77b2a592atom   }
19686781fabbfc019b752f9605e487cfce77b2a592atom   return ptr + sizeof(UInt);
19786781fabbfc019b752f9605e487cfce77b2a592atom}
19886781fabbfc019b752f9605e487cfce77b2a592atom
199c474069560175a011af75868e0cbe66a6646f8a1philippeULong ML_(readUAS_ULong) ( const UChar* data ) {
200d32fb2b481ee4eda50a62e49d25199e0174940e0tom   ULong r = 0;
201d32fb2b481ee4eda50a62e49d25199e0174940e0tom   if (host_is_little_endian()) {
202d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[0]
203d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[1]) << 8 )
204d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[2]) << 16 )
205d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[3]) << 24 )
206d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[4]) << 32 )
207d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[5]) << 40 )
208d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[6]) << 48 )
209d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[7]) << 56 );
210d32fb2b481ee4eda50a62e49d25199e0174940e0tom   } else {
211d32fb2b481ee4eda50a62e49d25199e0174940e0tom      r = data[7]
212d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[6]) << 8 )
213d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[5]) << 16 )
214d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[4]) << 24 )
215d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[3]) << 32 )
216d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[2]) << 40 )
217d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[1]) << 48 )
218d32fb2b481ee4eda50a62e49d25199e0174940e0tom       | ( ((ULong)data[0]) << 56 );
219d32fb2b481ee4eda50a62e49d25199e0174940e0tom   }
220d32fb2b481ee4eda50a62e49d25199e0174940e0tom   return r;
221d32fb2b481ee4eda50a62e49d25199e0174940e0tom}
222d32fb2b481ee4eda50a62e49d25199e0174940e0tom
223c474069560175a011af75868e0cbe66a6646f8a1philippeUChar* ML_(writeUAS_ULong) ( UChar* ptr, ULong val ) {
22486781fabbfc019b752f9605e487cfce77b2a592atom   if (host_is_little_endian()) {
22586781fabbfc019b752f9605e487cfce77b2a592atom      ptr[0] = val & 0xff;
22686781fabbfc019b752f9605e487cfce77b2a592atom      ptr[1] = ( val >> 8 ) & 0xff;
22786781fabbfc019b752f9605e487cfce77b2a592atom      ptr[2] = ( val >> 16 ) & 0xff;
22886781fabbfc019b752f9605e487cfce77b2a592atom      ptr[3] = ( val >> 24 ) & 0xff;
22986781fabbfc019b752f9605e487cfce77b2a592atom      ptr[4] = ( val >> 32 ) & 0xff;
23086781fabbfc019b752f9605e487cfce77b2a592atom      ptr[5] = ( val >> 40 ) & 0xff;
23186781fabbfc019b752f9605e487cfce77b2a592atom      ptr[6] = ( val >> 48 ) & 0xff;
23286781fabbfc019b752f9605e487cfce77b2a592atom      ptr[7] = ( val >> 56 ) & 0xff;
23386781fabbfc019b752f9605e487cfce77b2a592atom   } else {
23486781fabbfc019b752f9605e487cfce77b2a592atom      ptr[0] = ( val >> 56 ) & 0xff;
23586781fabbfc019b752f9605e487cfce77b2a592atom      ptr[1] = ( val >> 48 ) & 0xff;
23686781fabbfc019b752f9605e487cfce77b2a592atom      ptr[2] = ( val >> 40 ) & 0xff;
23786781fabbfc019b752f9605e487cfce77b2a592atom      ptr[3] = ( val >> 32 ) & 0xff;
23886781fabbfc019b752f9605e487cfce77b2a592atom      ptr[4] = ( val >> 24 ) & 0xff;
23986781fabbfc019b752f9605e487cfce77b2a592atom      ptr[5] = ( val >> 16 ) & 0xff;
24086781fabbfc019b752f9605e487cfce77b2a592atom      ptr[6] = ( val >> 8 ) & 0xff;
24186781fabbfc019b752f9605e487cfce77b2a592atom      ptr[7] = val & 0xff;
24286781fabbfc019b752f9605e487cfce77b2a592atom   }
24386781fabbfc019b752f9605e487cfce77b2a592atom   return ptr + sizeof(ULong);
24486781fabbfc019b752f9605e487cfce77b2a592atom}
24586781fabbfc019b752f9605e487cfce77b2a592atom
24686781fabbfc019b752f9605e487cfce77b2a592atom
247c474069560175a011af75868e0cbe66a6646f8a1philippeAddr ML_(readUAS_Addr) ( const UChar* data ) {
248fd892fc2654e6eae5e40f401a230e0fb80d6362ftom   if (sizeof(Addr) == sizeof(UInt)) {
249fd892fc2654e6eae5e40f401a230e0fb80d6362ftom      return ML_(read_UInt)(data);
250fd892fc2654e6eae5e40f401a230e0fb80d6362ftom   } else if  (sizeof(Addr) == sizeof(ULong)) {
251fd892fc2654e6eae5e40f401a230e0fb80d6362ftom      return ML_(read_ULong)(data);
252fd892fc2654e6eae5e40f401a230e0fb80d6362ftom   } else {
253fd892fc2654e6eae5e40f401a230e0fb80d6362ftom      vg_assert(0);
254fd892fc2654e6eae5e40f401a230e0fb80d6362ftom   }
255fd892fc2654e6eae5e40f401a230e0fb80d6362ftom}
256fd892fc2654e6eae5e40f401a230e0fb80d6362ftom
257c474069560175a011af75868e0cbe66a6646f8a1philippeUChar* ML_(writeUAS_Addr) ( UChar* ptr, Addr val ) {
25886781fabbfc019b752f9605e487cfce77b2a592atom   if (sizeof(Addr) == sizeof(UInt)) {
25986781fabbfc019b752f9605e487cfce77b2a592atom      return ML_(write_UInt)(ptr, val);
26086781fabbfc019b752f9605e487cfce77b2a592atom   } else if  (sizeof(Addr) == sizeof(ULong)) {
26186781fabbfc019b752f9605e487cfce77b2a592atom      return ML_(write_ULong)(ptr, val);
26286781fabbfc019b752f9605e487cfce77b2a592atom   } else {
26386781fabbfc019b752f9605e487cfce77b2a592atom      vg_assert(0);
26486781fabbfc019b752f9605e487cfce77b2a592atom   }
26586781fabbfc019b752f9605e487cfce77b2a592atom}
26686781fabbfc019b752f9605e487cfce77b2a592atom
267b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/*--------------------------------------------------------------------*/
268b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/*--- end                                                   misc.c ---*/
269b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/*--------------------------------------------------------------------*/
270