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