1ebf1d86f0215440470d9e12be519b43a8df941fenethercote
2ebf1d86f0215440470d9e12be519b43a8df941fenethercote/*--------------------------------------------------------------------*/
3c7561b931e249acf3768ead77638545b0ccaa8f1njn/*--- Header included by every tool C file.      pub_tool_basics.h ---*/
4ebf1d86f0215440470d9e12be519b43a8df941fenethercote/*--------------------------------------------------------------------*/
5ebf1d86f0215440470d9e12be519b43a8df941fenethercote
6ebf1d86f0215440470d9e12be519b43a8df941fenethercote/*
7b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn   This file is part of Valgrind, a dynamic binary instrumentation
8b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn   framework.
9ebf1d86f0215440470d9e12be519b43a8df941fenethercote
10ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   Copyright (C) 2000-2017 Julian Seward
11ebf1d86f0215440470d9e12be519b43a8df941fenethercote      jseward@acm.org
12ebf1d86f0215440470d9e12be519b43a8df941fenethercote
13ebf1d86f0215440470d9e12be519b43a8df941fenethercote   This program is free software; you can redistribute it and/or
14ebf1d86f0215440470d9e12be519b43a8df941fenethercote   modify it under the terms of the GNU General Public License as
15ebf1d86f0215440470d9e12be519b43a8df941fenethercote   published by the Free Software Foundation; either version 2 of the
16ebf1d86f0215440470d9e12be519b43a8df941fenethercote   License, or (at your option) any later version.
17ebf1d86f0215440470d9e12be519b43a8df941fenethercote
18ebf1d86f0215440470d9e12be519b43a8df941fenethercote   This program is distributed in the hope that it will be useful, but
19ebf1d86f0215440470d9e12be519b43a8df941fenethercote   WITHOUT ANY WARRANTY; without even the implied warranty of
20ebf1d86f0215440470d9e12be519b43a8df941fenethercote   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ebf1d86f0215440470d9e12be519b43a8df941fenethercote   General Public License for more details.
22ebf1d86f0215440470d9e12be519b43a8df941fenethercote
23ebf1d86f0215440470d9e12be519b43a8df941fenethercote   You should have received a copy of the GNU General Public License
24ebf1d86f0215440470d9e12be519b43a8df941fenethercote   along with this program; if not, write to the Free Software
25ebf1d86f0215440470d9e12be519b43a8df941fenethercote   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26ebf1d86f0215440470d9e12be519b43a8df941fenethercote   02111-1307, USA.
27ebf1d86f0215440470d9e12be519b43a8df941fenethercote
28ebf1d86f0215440470d9e12be519b43a8df941fenethercote   The GNU General Public License is contained in the file COPYING.
29ebf1d86f0215440470d9e12be519b43a8df941fenethercote*/
30ebf1d86f0215440470d9e12be519b43a8df941fenethercote
31c7561b931e249acf3768ead77638545b0ccaa8f1njn#ifndef __PUB_TOOL_BASICS_H
32c7561b931e249acf3768ead77638545b0ccaa8f1njn#define __PUB_TOOL_BASICS_H
33c7561b931e249acf3768ead77638545b0ccaa8f1njn
34c7561b931e249acf3768ead77638545b0ccaa8f1njn//--------------------------------------------------------------------
35c7561b931e249acf3768ead77638545b0ccaa8f1njn// PURPOSE: This header should be imported by every single C file in
36c7561b931e249acf3768ead77638545b0ccaa8f1njn// tools.  It contains the basic types and other things needed everywhere.
37c7561b931e249acf3768ead77638545b0ccaa8f1njn// There is no corresponding C file because this isn't a module
38c7561b931e249acf3768ead77638545b0ccaa8f1njn// containing executable code, it's all just declarations.
39c7561b931e249acf3768ead77638545b0ccaa8f1njn//--------------------------------------------------------------------
40ebf1d86f0215440470d9e12be519b43a8df941fenethercote
41ebf1d86f0215440470d9e12be519b43a8df941fenethercote/* ---------------------------------------------------------------------
42c7561b931e249acf3768ead77638545b0ccaa8f1njn   Other headers to include
43ebf1d86f0215440470d9e12be519b43a8df941fenethercote   ------------------------------------------------------------------ */
44ebf1d86f0215440470d9e12be519b43a8df941fenethercote
45af93042b93f16e80ef57038b2f514d86fb365b9cflorian// VEX defines Char, UChar, Short, UShort, Int, UInt, Long, ULong, SizeT,
469b3da11211e7737d67e95a9a393813663f6fff0bflorian// Addr, Addr32, Addr64, HWord, HChar, Bool, False and True.
478b635a4526e86972ea8fc5a0827f1fd1487e2c3fsewardj#include "libvex_basictypes.h"
488b635a4526e86972ea8fc5a0827f1fd1487e2c3fsewardj
49c7561b931e249acf3768ead77638545b0ccaa8f1njn// For varargs types
50c7561b931e249acf3768ead77638545b0ccaa8f1njn#include <stdarg.h>
51c7561b931e249acf3768ead77638545b0ccaa8f1njn
52c7561b931e249acf3768ead77638545b0ccaa8f1njn
53c7561b931e249acf3768ead77638545b0ccaa8f1njn/* ---------------------------------------------------------------------
549c533254da4205e624f90288a0df734d64cc3b88njn   symbol prefixing
559c533254da4205e624f90288a0df734d64cc3b88njn   ------------------------------------------------------------------ */
569c533254da4205e624f90288a0df734d64cc3b88njn
579c533254da4205e624f90288a0df734d64cc3b88njn// All symbols externally visible from Valgrind are prefixed
589c533254da4205e624f90288a0df734d64cc3b88njn// as specified here to avoid namespace conflict problems.
599c533254da4205e624f90288a0df734d64cc3b88njn//
609c533254da4205e624f90288a0df734d64cc3b88njn// VG_ is for symbols exported from modules.  ML_ (module-local) is
619c533254da4205e624f90288a0df734d64cc3b88njn// for symbols which are not intended to be visible outside modules,
629c533254da4205e624f90288a0df734d64cc3b88njn// but which cannot be declared as C 'static's since they need to be
639c533254da4205e624f90288a0df734d64cc3b88njn// visible across C files within a given module.  It is a mistake for
649c533254da4205e624f90288a0df734d64cc3b88njn// a ML_ name to appear in a pub_core_*.h or pub_tool_*.h file.
659c533254da4205e624f90288a0df734d64cc3b88njn// Likewise it is a mistake for a VG_ name to appear in a priv_*.h
669c533254da4205e624f90288a0df734d64cc3b88njn// file.
679c533254da4205e624f90288a0df734d64cc3b88njn
689c533254da4205e624f90288a0df734d64cc3b88njn#define VGAPPEND(str1,str2) str1##str2
699c533254da4205e624f90288a0df734d64cc3b88njn
709c533254da4205e624f90288a0df734d64cc3b88njn#define VG_(str)    VGAPPEND(vgPlain_,          str)
719c533254da4205e624f90288a0df734d64cc3b88njn#define ML_(str)    VGAPPEND(vgModuleLocal_,    str)
729c533254da4205e624f90288a0df734d64cc3b88njn
739c533254da4205e624f90288a0df734d64cc3b88njn
749c533254da4205e624f90288a0df734d64cc3b88njn/* ---------------------------------------------------------------------
75c7561b931e249acf3768ead77638545b0ccaa8f1njn   builtin types
76c7561b931e249acf3768ead77638545b0ccaa8f1njn   ------------------------------------------------------------------ */
778b635a4526e86972ea8fc5a0827f1fd1487e2c3fsewardj
78ebf1d86f0215440470d9e12be519b43a8df941fenethercote// By choosing the right types, we can get these right for 32-bit and 64-bit
79ebf1d86f0215440470d9e12be519b43a8df941fenethercote// platforms without having to do any conditional compilation or anything.
80c4431bfe04c7490ea2d74939d222d87f13f30960njn// POSIX references:
81c4431bfe04c7490ea2d74939d222d87f13f30960njn// - http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html
82c4431bfe04c7490ea2d74939d222d87f13f30960njn// - http://www.opengroup.org/onlinepubs/009695399/basedefs/stddef.h.html
838b5f40c481a89483c1738e5d5e9e718b418948d4nethercote//
84ebf1d86f0215440470d9e12be519b43a8df941fenethercote// Size in bits on:                          32-bit archs   64-bit archs
85ebf1d86f0215440470d9e12be519b43a8df941fenethercote//                                           ------------   ------------
86ebf1d86f0215440470d9e12be519b43a8df941fenethercotetypedef unsigned long          UWord;     // 32             64
87c4431bfe04c7490ea2d74939d222d87f13f30960njntypedef   signed long           Word;     // 32             64
88ebf1d86f0215440470d9e12be519b43a8df941fenethercote
89af93042b93f16e80ef57038b2f514d86fb365b9cflorian// Our equivalent of POSIX 'ssize_t':
90c4431bfe04c7490ea2d74939d222d87f13f30960njn// - ssize_t is "used for a count of bytes or an error indication".
917ac7f7b2ccfc708851a758e9c8dd43ce7d325a10nethercotetypedef  Word                 SSizeT;     // 32             64
927ac7f7b2ccfc708851a758e9c8dd43ce7d325a10nethercote
93c4431bfe04c7490ea2d74939d222d87f13f30960njn// Our equivalent of POSIX 'ptrdiff_t':
94c4431bfe04c7490ea2d74939d222d87f13f30960njn// - ptrdiff_t is a "signed integer type of the result of subtracting two
95c4431bfe04c7490ea2d74939d222d87f13f30960njn//   pointers".
96c4431bfe04c7490ea2d74939d222d87f13f30960njn// We use it for memory offsets, eg. the offset into a memory block.
97c4431bfe04c7490ea2d74939d222d87f13f30960njntypedef  Word                 PtrdiffT;   // 32             64
98c4431bfe04c7490ea2d74939d222d87f13f30960njn
99c4431bfe04c7490ea2d74939d222d87f13f30960njn// Our equivalent of POSIX 'off_t':
100c4431bfe04c7490ea2d74939d222d87f13f30960njn// - off_t is "used for file sizes".
101c4431bfe04c7490ea2d74939d222d87f13f30960njn// At one point we were using it for memory offsets, but PtrdiffT should be
102c4431bfe04c7490ea2d74939d222d87f13f30960njn// used in those cases.
1036e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj// Nb: on Linux, off_t is a signed word-sized int.  On Darwin it's
104f76d27a697a7b0bf3b84490baf60623fc96a23afnjn// always a signed 64-bit int.  So we defined our own Off64T as well.
1058eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#if defined(VGO_linux) || defined(VGO_solaris)
106c4431bfe04c7490ea2d74939d222d87f13f30960njntypedef Word                   OffT;      // 32             64
107f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#elif defined(VGO_darwin)
108f76d27a697a7b0bf3b84490baf60623fc96a23afnjntypedef Long                   OffT;      // 64             64
109f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#else
110f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#  error Unknown OS
111f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif
112c4431bfe04c7490ea2d74939d222d87f13f30960njntypedef Long                 Off64T;      // 64             64
113274461dcb67f680196c97e8afb7028a79b97dcb7sewardj
11421edee3ddbb70411625914b8a4083675cce25ea0njn#if !defined(NULL)
11521edee3ddbb70411625914b8a4083675cce25ea0njn#  define NULL ((void*)0)
11621edee3ddbb70411625914b8a4083675cce25ea0njn#endif
117bc7df20072ffd5d7bd770401c8a81819a998a189sewardj
1189c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj/* This is just too useful to not have around the place somewhere. */
1199c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardjtypedef  struct { UWord uw1; UWord uw2; }  UWordPair;
1209c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj
121e1f33a49ddf53a28b3f1ee8b5cba71f5d58b4687sewardj
122d01fef7de693582a6ce32bdbef7c9040ad6b356bnjn/* ---------------------------------------------------------------------
123d01fef7de693582a6ce32bdbef7c9040ad6b356bnjn   non-builtin types
124d01fef7de693582a6ce32bdbef7c9040ad6b356bnjn   ------------------------------------------------------------------ */
125d01fef7de693582a6ce32bdbef7c9040ad6b356bnjn
126c7561b931e249acf3768ead77638545b0ccaa8f1njn// These probably shouldn't be here, but moving them to their logical
127c7561b931e249acf3768ead77638545b0ccaa8f1njn// modules results in a lot more #includes...
1285363a5685ae84d477f7895631b4c1c543fd562dfnjn
129d01fef7de693582a6ce32bdbef7c9040ad6b356bnjn/* ThreadIds are simply indices into the VG_(threads)[] array. */
130c7561b931e249acf3768ead77638545b0ccaa8f1njntypedef UInt ThreadId;
1315363a5685ae84d477f7895631b4c1c543fd562dfnjn
132ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes/* Many data structures need to allocate and release memory.
133ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   The allocation/release functions must be provided by the caller.
134ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   The Alloc_Fn_t function must allocate a chunk of memory of size szB.
135ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   cc is the Cost Centre for this allocated memory. This constant string
136ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   is used to provide Valgrind's heap profiling, activated by
137ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   --profile-heap=no|yes.
138ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   The corresponding Free_Fn_t frees the memory chunk p. */
139ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
140ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughestypedef void* (*Alloc_Fn_t)       ( const HChar* cc, SizeT szB );
141ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughestypedef void  (*Free_Fn_t)        ( void* p );
142ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
143a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj/* An abstraction of syscall return values.
144bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   Linux/MIPS32 and Linux/MIPS64:
145bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      When _isError == False,
146bd664fdd6b51670786bf058ae23e3f79a9758487sewardj         _val and possible _valEx hold the return value.  Whether
147bd664fdd6b51670786bf058ae23e3f79a9758487sewardj         _valEx actually holds a valid value depends on which syscall
148bd664fdd6b51670786bf058ae23e3f79a9758487sewardj         this SysRes holds of the result of.
149bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      When _isError == True,
150bd664fdd6b51670786bf058ae23e3f79a9758487sewardj         _val holds the error code.
151bd664fdd6b51670786bf058ae23e3f79a9758487sewardj
152bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   Linux/other:
153cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      When _isError == False,
154cda2f0fbda4c4b2644babc830244be8aed95de1dnjn         _val holds the return value.
155cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      When _isError == True,
156bd664fdd6b51670786bf058ae23e3f79a9758487sewardj         _val holds the error code.
157e1f33a49ddf53a28b3f1ee8b5cba71f5d58b4687sewardj
158cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   Darwin:
159cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      Interpretation depends on _mode:
160cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      MACH, MDEP:
161cda2f0fbda4c4b2644babc830244be8aed95de1dnjn         these can never 'fail' (apparently).  The result of the
162cda2f0fbda4c4b2644babc830244be8aed95de1dnjn         syscall is a single host word, _wLO.
163cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      UNIX:
164cda2f0fbda4c4b2644babc830244be8aed95de1dnjn         Can record a double-word error or a double-word result:
165cda2f0fbda4c4b2644babc830244be8aed95de1dnjn         When _mode is SysRes_UNIX_OK,  _wHI:_wLO holds the result.
166cda2f0fbda4c4b2644babc830244be8aed95de1dnjn         When _mode is SysRes_UNIX_ERR, _wHI:_wLO holds the error code.
167cda2f0fbda4c4b2644babc830244be8aed95de1dnjn         Probably the high word of an error is always ignored by
168cda2f0fbda4c4b2644babc830244be8aed95de1dnjn         userspace, but we have to record it, so that we can correctly
16938c73d74cc572f0011517a6fa924e90ebb5da08dnjn         update both {R,E}DX and {R,E}AX (in guest state) given a SysRes,
17038c73d74cc572f0011517a6fa924e90ebb5da08dnjn         if we're required to.
1718eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1728eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   Solaris:
1738eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      When _isError == False,
1748eb8bab992e3998c33770b0cdb16059a8b918a06sewardj         _val and _val2 hold the return value.
1758eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      When _isError == True,
1768eb8bab992e3998c33770b0cdb16059a8b918a06sewardj         _val holds the error code.
177a8d8e239876796bc194636b8bb4b3b3c86db8528sewardj*/
178bd664fdd6b51670786bf058ae23e3f79a9758487sewardj#if defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
179e1f33a49ddf53a28b3f1ee8b5cba71f5d58b4687sewardjtypedef
180e1f33a49ddf53a28b3f1ee8b5cba71f5d58b4687sewardj   struct {
181cda2f0fbda4c4b2644babc830244be8aed95de1dnjn      Bool  _isError;
1829c120ae69abbc7cc57422ae9d973129c4d053099florian      UWord _val;
1839c120ae69abbc7cc57422ae9d973129c4d053099florian      UWord _valEx;
184e1f33a49ddf53a28b3f1ee8b5cba71f5d58b4687sewardj   }
185e1f33a49ddf53a28b3f1ee8b5cba71f5d58b4687sewardj   SysRes;
186bd664fdd6b51670786bf058ae23e3f79a9758487sewardj
187bd664fdd6b51670786bf058ae23e3f79a9758487sewardj#elif defined(VGO_linux) \
188bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      && !defined(VGP_mips32_linux) && !defined(VGP_mips64_linux)
189bd664fdd6b51670786bf058ae23e3f79a9758487sewardjtypedef
190bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   struct {
191bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      Bool  _isError;
192bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      UWord _val;
193bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   }
194bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   SysRes;
195bd664fdd6b51670786bf058ae23e3f79a9758487sewardj
196f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#elif defined(VGO_darwin)
197f76d27a697a7b0bf3b84490baf60623fc96a23afnjntypedef
198116458b096287fc6dd0350f59198cdad8f5a7ae2bart   enum {
199116458b096287fc6dd0350f59198cdad8f5a7ae2bart      SysRes_MACH=40,  // MACH, result is _wLO
200116458b096287fc6dd0350f59198cdad8f5a7ae2bart      SysRes_MDEP,     // MDEP, result is _wLO
201116458b096287fc6dd0350f59198cdad8f5a7ae2bart      SysRes_UNIX_OK,  // UNIX, success, result is _wHI:_wLO
202116458b096287fc6dd0350f59198cdad8f5a7ae2bart      SysRes_UNIX_ERR  // UNIX, error,   error  is _wHI:_wLO
203116458b096287fc6dd0350f59198cdad8f5a7ae2bart   }
204116458b096287fc6dd0350f59198cdad8f5a7ae2bart   SysResMode;
205116458b096287fc6dd0350f59198cdad8f5a7ae2barttypedef
206f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   struct {
207f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      UWord _wLO;
208f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      UWord _wHI;
209116458b096287fc6dd0350f59198cdad8f5a7ae2bart      SysResMode _mode;
210f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
211f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   SysRes;
212bd664fdd6b51670786bf058ae23e3f79a9758487sewardj
2138eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
2148eb8bab992e3998c33770b0cdb16059a8b918a06sewardjtypedef
2158eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   struct {
2168eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      UWord _val;
2178eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      UWord _val2;
2188eb8bab992e3998c33770b0cdb16059a8b918a06sewardj      Bool  _isError;
2198eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   }
2208eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   SysRes;
2218eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
222cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#else
223cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#  error "Unknown OS"
224cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#endif
225cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
226cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
227cda2f0fbda4c4b2644babc830244be8aed95de1dnjn/* ---- And now some basic accessor functions for it. ---- */
228cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
229bd664fdd6b51670786bf058ae23e3f79a9758487sewardj#if defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
230cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
231cda2f0fbda4c4b2644babc830244be8aed95de1dnjnstatic inline Bool sr_isError ( SysRes sr ) {
232cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return sr._isError;
233cda2f0fbda4c4b2644babc830244be8aed95de1dnjn}
234cda2f0fbda4c4b2644babc830244be8aed95de1dnjnstatic inline UWord sr_Res ( SysRes sr ) {
235cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return sr._isError ? 0 : sr._val;
236cda2f0fbda4c4b2644babc830244be8aed95de1dnjn}
2375db15403e889d4db339b342bc2a824ef0bfaa654sewardjstatic inline UWord sr_ResEx ( SysRes sr ) {
2385db15403e889d4db339b342bc2a824ef0bfaa654sewardj   return sr._isError ? 0 : sr._valEx;
2395db15403e889d4db339b342bc2a824ef0bfaa654sewardj}
240cda2f0fbda4c4b2644babc830244be8aed95de1dnjnstatic inline UWord sr_Err ( SysRes sr ) {
241cda2f0fbda4c4b2644babc830244be8aed95de1dnjn   return sr._isError ? sr._val : 0;
242cda2f0fbda4c4b2644babc830244be8aed95de1dnjn}
243bd664fdd6b51670786bf058ae23e3f79a9758487sewardjstatic inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
244bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   /* This uglyness of hardcoding syscall numbers is necessary to
245ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      avoid having this header file be dependent on
246bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      include/vki/vki-scnums-mips{32,64}-linux.h.  It seems pretty
247bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      safe given that it is inconceivable that the syscall numbers
248bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      for such simple syscalls would ever change.  To make it
249bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      really safe, coregrind/m_vkiscnums.c static-asserts that these
250bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      syscall numbers haven't changed, so that the build wil simply
251bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      fail if they ever do. */
252bd664fdd6b51670786bf058ae23e3f79a9758487sewardj#  if defined(VGP_mips32_linux)
253bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   const UInt __nr_Linux = 4000;
254bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   const UInt __nr_pipe  = __nr_Linux + 42;
255bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   const UInt __nr_pipe2 = __nr_Linux + 328;
256bd664fdd6b51670786bf058ae23e3f79a9758487sewardj#  else
257bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   const UInt __nr_Linux = 5000;
258bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   const UInt __nr_pipe  = __nr_Linux + 21;
259bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   const UInt __nr_pipe2 = __nr_Linux + 287;
260bd664fdd6b51670786bf058ae23e3f79a9758487sewardj#  endif
261bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   Bool useEx = sysno == __nr_pipe || sysno == __nr_pipe2;
262bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   return sr1._val == sr2._val
263bd664fdd6b51670786bf058ae23e3f79a9758487sewardj          && (useEx ? (sr1._valEx == sr2._valEx) : True)
264bd664fdd6b51670786bf058ae23e3f79a9758487sewardj          && sr1._isError == sr2._isError;
265bd664fdd6b51670786bf058ae23e3f79a9758487sewardj}
266bd664fdd6b51670786bf058ae23e3f79a9758487sewardj
267bd664fdd6b51670786bf058ae23e3f79a9758487sewardj#elif defined(VGO_linux) \
268bd664fdd6b51670786bf058ae23e3f79a9758487sewardj      && !defined(VGP_mips32_linux) && !defined(VGP_mips64_linux)
269bd664fdd6b51670786bf058ae23e3f79a9758487sewardj
270bd664fdd6b51670786bf058ae23e3f79a9758487sewardjstatic inline Bool sr_isError ( SysRes sr ) {
271bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   return sr._isError;
272bd664fdd6b51670786bf058ae23e3f79a9758487sewardj}
273bd664fdd6b51670786bf058ae23e3f79a9758487sewardjstatic inline UWord sr_Res ( SysRes sr ) {
274bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   return sr._isError ? 0 : sr._val;
275bd664fdd6b51670786bf058ae23e3f79a9758487sewardj}
276bd664fdd6b51670786bf058ae23e3f79a9758487sewardjstatic inline UWord sr_Err ( SysRes sr ) {
277bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   return sr._isError ? sr._val : 0;
278bd664fdd6b51670786bf058ae23e3f79a9758487sewardj}
279bd664fdd6b51670786bf058ae23e3f79a9758487sewardjstatic inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
280bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   /* sysno is ignored for Linux/not-MIPS */
281d59d9780069716bbdaa4713b232d18ac5963ee16florian   return sr1._val == sr2._val
282bd664fdd6b51670786bf058ae23e3f79a9758487sewardj          && sr1._isError == sr2._isError;
283cda2f0fbda4c4b2644babc830244be8aed95de1dnjn}
284cda2f0fbda4c4b2644babc830244be8aed95de1dnjn
285f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#elif defined(VGO_darwin)
286f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
287f76d27a697a7b0bf3b84490baf60623fc96a23afnjnstatic inline Bool sr_isError ( SysRes sr ) {
288f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   switch (sr._mode) {
28919e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_UNIX_ERR:
29019e2c940824d7f7524b25f338737d286eda7812bsewardj         return True;
291f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      /* should check tags properly and assert here, but we can't here */
29219e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_MACH:
29319e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_MDEP:
29419e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_UNIX_OK:
29519e2c940824d7f7524b25f338737d286eda7812bsewardj      default:
29619e2c940824d7f7524b25f338737d286eda7812bsewardj         return False;
297f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
298f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
299f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
300f76d27a697a7b0bf3b84490baf60623fc96a23afnjnstatic inline UWord sr_Res ( SysRes sr ) {
301f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   switch (sr._mode) {
302f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case SysRes_MACH:
303f76d27a697a7b0bf3b84490baf60623fc96a23afnjn      case SysRes_MDEP:
30419e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_UNIX_OK:
30519e2c940824d7f7524b25f338737d286eda7812bsewardj         return sr._wLO;
30619e2c940824d7f7524b25f338737d286eda7812bsewardj      /* should assert, but we can't here */
30719e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_UNIX_ERR:
30819e2c940824d7f7524b25f338737d286eda7812bsewardj      default:
30919e2c940824d7f7524b25f338737d286eda7812bsewardj         return 0;
310f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
311f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
312f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
313f76d27a697a7b0bf3b84490baf60623fc96a23afnjnstatic inline UWord sr_ResHI ( SysRes sr ) {
314f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   switch (sr._mode) {
31519e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_UNIX_OK:
31619e2c940824d7f7524b25f338737d286eda7812bsewardj         return sr._wHI;
31719e2c940824d7f7524b25f338737d286eda7812bsewardj      /* should assert, but we can't here */
31819e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_MACH:
31919e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_MDEP:
32019e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_UNIX_ERR:
32119e2c940824d7f7524b25f338737d286eda7812bsewardj      default:
32219e2c940824d7f7524b25f338737d286eda7812bsewardj         return 0;
323f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
324f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
325f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
326f76d27a697a7b0bf3b84490baf60623fc96a23afnjnstatic inline UWord sr_Err ( SysRes sr ) {
327f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   switch (sr._mode) {
32819e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_UNIX_ERR:
32919e2c940824d7f7524b25f338737d286eda7812bsewardj         return sr._wLO;
33019e2c940824d7f7524b25f338737d286eda7812bsewardj      /* should assert, but we can't here */
33119e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_MACH:
33219e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_MDEP:
33319e2c940824d7f7524b25f338737d286eda7812bsewardj      case SysRes_UNIX_OK:
33419e2c940824d7f7524b25f338737d286eda7812bsewardj      default:
33519e2c940824d7f7524b25f338737d286eda7812bsewardj         return 0;
336f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   }
337f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
338f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
339bd664fdd6b51670786bf058ae23e3f79a9758487sewardjstatic inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
340bd664fdd6b51670786bf058ae23e3f79a9758487sewardj   /* sysno is ignored for Darwin */
341f76d27a697a7b0bf3b84490baf60623fc96a23afnjn   return sr1._mode == sr2._mode
342f76d27a697a7b0bf3b84490baf60623fc96a23afnjn          && sr1._wLO == sr2._wLO && sr1._wHI == sr2._wHI;
343f76d27a697a7b0bf3b84490baf60623fc96a23afnjn}
344f76d27a697a7b0bf3b84490baf60623fc96a23afnjn
3458eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(VGO_solaris)
3468eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
3478eb8bab992e3998c33770b0cdb16059a8b918a06sewardjstatic inline Bool sr_isError ( SysRes sr ) {
3488eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   return sr._isError;
3498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
3508eb8bab992e3998c33770b0cdb16059a8b918a06sewardjstatic inline UWord sr_Res ( SysRes sr ) {
3518eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   return sr._isError ? 0 : sr._val;
3528eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
3538eb8bab992e3998c33770b0cdb16059a8b918a06sewardjstatic inline UWord sr_ResHI ( SysRes sr ) {
3548eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   return sr._isError ? 0 : sr._val2;
3558eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
3568eb8bab992e3998c33770b0cdb16059a8b918a06sewardjstatic inline UWord sr_Err ( SysRes sr ) {
3578eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   return sr._isError ? sr._val : 0;
3588eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
3598eb8bab992e3998c33770b0cdb16059a8b918a06sewardjstatic inline Bool sr_EQ ( UInt sysno, SysRes sr1, SysRes sr2 ) {
3608eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   /* sysno is ignored for Solaris */
3618eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   return sr1._val == sr2._val
362ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes       && sr1._isError == sr2._isError
363ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes       && (!sr1._isError) ? (sr1._val2 == sr2._val2) : True;
3648eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
3658eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
366cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#else
367cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#  error "Unknown OS"
368cda2f0fbda4c4b2644babc830244be8aed95de1dnjn#endif
369e1f33a49ddf53a28b3f1ee8b5cba71f5d58b4687sewardj
370c7561b931e249acf3768ead77638545b0ccaa8f1njn
371c7561b931e249acf3768ead77638545b0ccaa8f1njn/* ---------------------------------------------------------------------
37245f4e7c91119c7d01a59f5e827c67841632c9314sewardj   Miscellaneous (word size, endianness, regparmness, stringification)
373c7561b931e249acf3768ead77638545b0ccaa8f1njn   ------------------------------------------------------------------ */
374c7561b931e249acf3768ead77638545b0ccaa8f1njn
3756e340c7a2c09971ac5ead854c40bbc0491b67636sewardj/* Word size: this is going to be either 4 or 8. */
376c7561b931e249acf3768ead77638545b0ccaa8f1njn// It should probably be in m_machine.
377c7561b931e249acf3768ead77638545b0ccaa8f1njn#define VG_WORDSIZE VEX_HOST_WORDSIZE
378c7561b931e249acf3768ead77638545b0ccaa8f1njn
3796e340c7a2c09971ac5ead854c40bbc0491b67636sewardj/* Endianness */
3806e340c7a2c09971ac5ead854c40bbc0491b67636sewardj#undef VG_BIGENDIAN
3816e340c7a2c09971ac5ead854c40bbc0491b67636sewardj#undef VG_LITTLEENDIAN
3826e340c7a2c09971ac5ead854c40bbc0491b67636sewardj
3835db15403e889d4db339b342bc2a824ef0bfaa654sewardj#if defined(VGA_x86) || defined(VGA_amd64) || defined (VGA_arm) \
384f0c1250e324f6684757c6a15545366447ef1d64fsewardj    || ((defined(VGA_mips32) || defined(VGA_mips64)) && defined (_MIPSEL)) \
385ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes    || defined(VGA_arm64)  || defined(VGA_ppc64le)
3866e340c7a2c09971ac5ead854c40bbc0491b67636sewardj#  define VG_LITTLEENDIAN 1
387cae0cc22b83ffb260ee8379e92099c5a701944cbcarll#elif defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_s390x) \
3884df0bfc0614379192c780c944415dc420d9cfe8epetarj      || ((defined(VGA_mips32) || defined(VGA_mips64)) && defined (_MIPSEB))
3896e340c7a2c09971ac5ead854c40bbc0491b67636sewardj#  define VG_BIGENDIAN 1
39038c73d74cc572f0011517a6fa924e90ebb5da08dnjn#else
39138c73d74cc572f0011517a6fa924e90ebb5da08dnjn#  error Unknown arch
3926e340c7a2c09971ac5ead854c40bbc0491b67636sewardj#endif
3936e340c7a2c09971ac5ead854c40bbc0491b67636sewardj
394d65f726a45aa154ef612db5c60a4cdff27b65043florian/* Offsetof */
395d65f726a45aa154ef612db5c60a4cdff27b65043florian#if !defined(offsetof)
396d65f726a45aa154ef612db5c60a4cdff27b65043florian#   define offsetof(type,memb) ((SizeT)(HWord)&((type*)0)->memb)
397d65f726a45aa154ef612db5c60a4cdff27b65043florian#endif
398d65f726a45aa154ef612db5c60a4cdff27b65043florian
399ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#if !defined(container_of)
400ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#   define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
401ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#endif
402ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
403d65f726a45aa154ef612db5c60a4cdff27b65043florian/* Alignment */
404d65f726a45aa154ef612db5c60a4cdff27b65043florian/* We use a prefix vg_ for vg_alignof as its behaviour slightly
405d65f726a45aa154ef612db5c60a4cdff27b65043florian   differs from the standard alignof/gcc defined __alignof__
406d65f726a45aa154ef612db5c60a4cdff27b65043florian
407d65f726a45aa154ef612db5c60a4cdff27b65043florian   vg_alignof returns a "safe" alignement.
408d65f726a45aa154ef612db5c60a4cdff27b65043florian   "safe" is defined as the alignment chosen by the compiler in
409d65f726a45aa154ef612db5c60a4cdff27b65043florian   a struct made of a char followed by this type.
410d65f726a45aa154ef612db5c60a4cdff27b65043florian
411d65f726a45aa154ef612db5c60a4cdff27b65043florian      Note that this is not necessarily the "preferred" alignment
412d65f726a45aa154ef612db5c60a4cdff27b65043florian      for a platform. This preferred alignment is returned by the gcc
413d65f726a45aa154ef612db5c60a4cdff27b65043florian       __alignof__ and by the standard (in recent standard) alignof.
414d65f726a45aa154ef612db5c60a4cdff27b65043florian      Compared to __alignof__, vg_alignof gives on some platforms (e.g.
415d65f726a45aa154ef612db5c60a4cdff27b65043florian      amd64, ppc32, ppc64) a bigger alignment for long double (16 bytes
416d65f726a45aa154ef612db5c60a4cdff27b65043florian      instead of 8).
417d65f726a45aa154ef612db5c60a4cdff27b65043florian      On some platforms (e.g. x86), vg_alignof gives a smaller alignment
418d65f726a45aa154ef612db5c60a4cdff27b65043florian      than __alignof__ for long long and double (4 bytes instead of 8).
419d65f726a45aa154ef612db5c60a4cdff27b65043florian      If we want to have the "preferred" alignment for the basic types,
420d65f726a45aa154ef612db5c60a4cdff27b65043florian      then either we need to depend on gcc __alignof__, or on a (too)
421d65f726a45aa154ef612db5c60a4cdff27b65043florian      recent standard and compiler (implementing <stdalign.h>).
422d65f726a45aa154ef612db5c60a4cdff27b65043florian*/
423d65f726a45aa154ef612db5c60a4cdff27b65043florian#define vg_alignof(_type) (sizeof(struct {char c;_type _t;})-sizeof(_type))
424d65f726a45aa154ef612db5c60a4cdff27b65043florian
4256e340c7a2c09971ac5ead854c40bbc0491b67636sewardj/* Regparmness */
426c7561b931e249acf3768ead77638545b0ccaa8f1njn#if defined(VGA_x86)
427af839f52d74df156d655201a889954133ab01be7njn#  define VG_REGPARM(n)            __attribute__((regparm(n)))
42859570ffbe31930ab4d678754daaeec0715117a3dsewardj#elif defined(VGA_amd64) || defined(VGA_ppc32) \
429cae0cc22b83ffb260ee8379e92099c5a701944cbcarll      || defined(VGA_ppc64be) || defined(VGA_ppc64le) \
430cae0cc22b83ffb260ee8379e92099c5a701944cbcarll      || defined(VGA_arm) || defined(VGA_s390x) \
431f0c1250e324f6684757c6a15545366447ef1d64fsewardj      || defined(VGA_mips32) || defined(VGA_mips64) \
432ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      || defined(VGA_arm64)
433af839f52d74df156d655201a889954133ab01be7njn#  define VG_REGPARM(n)            /* */
434c7561b931e249acf3768ead77638545b0ccaa8f1njn#else
435c7561b931e249acf3768ead77638545b0ccaa8f1njn#  error Unknown arch
436c7561b931e249acf3768ead77638545b0ccaa8f1njn#endif
437c7561b931e249acf3768ead77638545b0ccaa8f1njn
43845f4e7c91119c7d01a59f5e827c67841632c9314sewardj/* Macro games */
43945f4e7c91119c7d01a59f5e827c67841632c9314sewardj#define VG_STRINGIFZ(__str)  #__str
44045f4e7c91119c7d01a59f5e827c67841632c9314sewardj#define VG_STRINGIFY(__str)  VG_STRINGIFZ(__str)
44145f4e7c91119c7d01a59f5e827c67841632c9314sewardj
44264ea7f8e1d3b1381abc250109d1c97cc01e91bbenjn// Where to send bug reports to.
44364ea7f8e1d3b1381abc250109d1c97cc01e91bbenjn#define VG_BUGS_TO "www.valgrind.org"
44464ea7f8e1d3b1381abc250109d1c97cc01e91bbenjn
4455dd8e6ab3b998e323eb293e561b62505a44f3144bart/* Branch prediction hints. */
4464ee9c560c7bbe7c305641964d5c2277e086ed1basewardj#if defined(__GNUC__)
4475dd8e6ab3b998e323eb293e561b62505a44f3144bart#  define LIKELY(x)   __builtin_expect(!!(x), 1)
4484ee9c560c7bbe7c305641964d5c2277e086ed1basewardj#  define UNLIKELY(x) __builtin_expect(!!(x), 0)
4495dd8e6ab3b998e323eb293e561b62505a44f3144bart#else
4505dd8e6ab3b998e323eb293e561b62505a44f3144bart#  define LIKELY(x)   (x)
4515dd8e6ab3b998e323eb293e561b62505a44f3144bart#  define UNLIKELY(x) (x)
4525dd8e6ab3b998e323eb293e561b62505a44f3144bart#endif
4535dd8e6ab3b998e323eb293e561b62505a44f3144bart
454588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj// printf format string checking for gcc.
455588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj// This feature has been supported since at least gcc version 2.95.
456588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj// For more information about the format attribute, see
457588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj// http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Function-Attributes.html.
458588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj#if defined(__GNUC__)
459588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj#define PRINTF_CHECK(x, y) __attribute__((format(__printf__, x, y)))
460588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj#else
461588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj#define PRINTF_CHECK(x, y)
462588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj#endif
463588adeffafa8102adcfa7a1c035ae272b35cf86dsewardj
46470a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian// Macro to "cast" away constness (from type const T to type T) without
46570a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian// GCC complaining about it. This macro should be used RARELY.
46670a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian// x is expected to have type const T
46770a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian#define CONST_CAST(T,x)    \
46870a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian   ({                      \
46970a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian      union {              \
47070a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian         const T in;      \
47170a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian         T out;           \
47270a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian      } var = { .in = x }; var.out;  \
47370a5de1d6c1a5c74b91b564b0ead8ae8a460173cflorian   })
4745dd8e6ab3b998e323eb293e561b62505a44f3144bart
475ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes/* Some architectures (eg. mips, arm) do not support unaligned memory access
476ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   by hardware, so GCC warns about suspicious situations. This macro could
477ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   be used to avoid these warnings but only after careful examination. */
478ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes#define ASSUME_ALIGNED(D, x)                 \
479ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   ({                                        \
480ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      union {                                \
481ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         void *in;                           \
482ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes         D out;                              \
483ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      } var;                                 \
484ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes      var.in = (void *) (x); var.out;        \
485ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes   })
486ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes
487c13d544ae513fa7e32b8413fb683d7c7a0f760e3florian// Poor man's static assert
488ea73483b07724293d0f0218d33bb34def542681dflorian#define STATIC_ASSERT(x)  extern int VG_(VG_(VG_(unused)))[(x) ? 1 : -1] \
489ea73483b07724293d0f0218d33bb34def542681dflorian                                     __attribute__((unused))
490c13d544ae513fa7e32b8413fb683d7c7a0f760e3florian
491a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define VG_MAX(a,b) ((a) > (b) ? a : b)
492a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#define VG_MIN(a,b) ((a) < (b) ? a : b)
493a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes
494c7561b931e249acf3768ead77638545b0ccaa8f1njn#endif /* __PUB_TOOL_BASICS_H */
495ebf1d86f0215440470d9e12be519b43a8df941fenethercote
496ebf1d86f0215440470d9e12be519b43a8df941fenethercote/*--------------------------------------------------------------------*/
497ebf1d86f0215440470d9e12be519b43a8df941fenethercote/*--- end                                                          ---*/
498ebf1d86f0215440470d9e12be519b43a8df941fenethercote/*--------------------------------------------------------------------*/
499