1ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 2ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj/*---------------------------------------------------------------*/ 3752f90673ebbb6b2f55fc5e46606dea371313713sewardj/*--- begin libvex_basictypes.h ---*/ 4ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj/*---------------------------------------------------------------*/ 5ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 6f8ed9d874a7b8651654591c68c6d431c758d787csewardj/* 7752f90673ebbb6b2f55fc5e46606dea371313713sewardj This file is part of Valgrind, a dynamic binary instrumentation 8752f90673ebbb6b2f55fc5e46606dea371313713sewardj framework. 9f8ed9d874a7b8651654591c68c6d431c758d787csewardj 1089ae8477745fd2a15453557d729a50e627325ee2sewardj Copyright (C) 2004-2013 OpenWorks LLP 11752f90673ebbb6b2f55fc5e46606dea371313713sewardj info@open-works.net 127bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 13752f90673ebbb6b2f55fc5e46606dea371313713sewardj This program is free software; you can redistribute it and/or 14752f90673ebbb6b2f55fc5e46606dea371313713sewardj modify it under the terms of the GNU General Public License as 15752f90673ebbb6b2f55fc5e46606dea371313713sewardj published by the Free Software Foundation; either version 2 of the 16752f90673ebbb6b2f55fc5e46606dea371313713sewardj License, or (at your option) any later version. 177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 18752f90673ebbb6b2f55fc5e46606dea371313713sewardj This program is distributed in the hope that it will be useful, but 19752f90673ebbb6b2f55fc5e46606dea371313713sewardj WITHOUT ANY WARRANTY; without even the implied warranty of 20752f90673ebbb6b2f55fc5e46606dea371313713sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21752f90673ebbb6b2f55fc5e46606dea371313713sewardj General Public License for more details. 22752f90673ebbb6b2f55fc5e46606dea371313713sewardj 23752f90673ebbb6b2f55fc5e46606dea371313713sewardj You should have received a copy of the GNU General Public License 24752f90673ebbb6b2f55fc5e46606dea371313713sewardj along with this program; if not, write to the Free Software 25752f90673ebbb6b2f55fc5e46606dea371313713sewardj Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 02110-1301, USA. 277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj 28752f90673ebbb6b2f55fc5e46606dea371313713sewardj The GNU General Public License is contained in the file COPYING. 29f8ed9d874a7b8651654591c68c6d431c758d787csewardj 30f8ed9d874a7b8651654591c68c6d431c758d787csewardj Neither the names of the U.S. Department of Energy nor the 31f8ed9d874a7b8651654591c68c6d431c758d787csewardj University of California nor the names of its contributors may be 32f8ed9d874a7b8651654591c68c6d431c758d787csewardj used to endorse or promote products derived from this software 33f8ed9d874a7b8651654591c68c6d431c758d787csewardj without prior written permission. 34f8ed9d874a7b8651654591c68c6d431c758d787csewardj*/ 35f8ed9d874a7b8651654591c68c6d431c758d787csewardj 365287fd7a7b3718889e02eb886c181ceb73e62b6asewardj#ifndef __LIBVEX_BASICTYPES_H 375287fd7a7b3718889e02eb886c181ceb73e62b6asewardj#define __LIBVEX_BASICTYPES_H 38ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 39ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj/* It is important that the sizes of the following data types (on the 40ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj host) are as stated. LibVEX_Init therefore checks these at 41ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj startup. */ 42ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 43ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj/* Always 8 bits. */ 44ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardjtypedef unsigned char UChar; 45810dcf0bb3ba08c64a8af14536edb6469274c413sewardjtypedef signed char Char; 46810dcf0bb3ba08c64a8af14536edb6469274c413sewardjtypedef char HChar; /* signfulness depends on host */ 47810dcf0bb3ba08c64a8af14536edb6469274c413sewardj /* Only to be used for printf etc 48810dcf0bb3ba08c64a8af14536edb6469274c413sewardj format strings */ 49ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 50ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj/* Always 16 bits. */ 51ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardjtypedef unsigned short UShort; 52ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardjtypedef signed short Short; 53ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 54ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj/* Always 32 bits. */ 55ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardjtypedef unsigned int UInt; 56ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardjtypedef signed int Int; 57ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 58ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj/* Always 64 bits. */ 59ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardjtypedef unsigned long long int ULong; 60ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardjtypedef signed long long int Long; 61ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 62c66ba6536adc89a69ed9caaf3c16d575b729e73cflorian/* Equivalent of C's size_t type. The type is unsigned and has this 63c66ba6536adc89a69ed9caaf3c16d575b729e73cflorian storage requirement: 64c66ba6536adc89a69ed9caaf3c16d575b729e73cflorian 32 bits on a 32-bit architecture 65c66ba6536adc89a69ed9caaf3c16d575b729e73cflorian 64 bits on a 64-bit architecture. */ 66c66ba6536adc89a69ed9caaf3c16d575b729e73cfloriantypedef unsigned long SizeT; 67c66ba6536adc89a69ed9caaf3c16d575b729e73cflorian 68c9a43665879a03886b27a65b68af2a2c11b04f59sewardj/* Always 128 bits. */ 69c9a43665879a03886b27a65b68af2a2c11b04f59sewardjtypedef UInt U128[4]; 70c9a43665879a03886b27a65b68af2a2c11b04f59sewardj 71c4530ae9079b0c3f8d4e8df35073613d718cadecsewardj/* Always 256 bits. */ 72c4530ae9079b0c3f8d4e8df35073613d718cadecsewardjtypedef UInt U256[8]; 73c4530ae9079b0c3f8d4e8df35073613d718cadecsewardj 74acfbd7d59ee5c85911c687c6666940a38019f48fsewardj/* A union for doing 128-bit vector primitives conveniently. */ 75acfbd7d59ee5c85911c687c6666940a38019f48fsewardjtypedef 76acfbd7d59ee5c85911c687c6666940a38019f48fsewardj union { 77acfbd7d59ee5c85911c687c6666940a38019f48fsewardj UChar w8[16]; 78acfbd7d59ee5c85911c687c6666940a38019f48fsewardj UShort w16[8]; 79acfbd7d59ee5c85911c687c6666940a38019f48fsewardj UInt w32[4]; 80acfbd7d59ee5c85911c687c6666940a38019f48fsewardj ULong w64[2]; 81acfbd7d59ee5c85911c687c6666940a38019f48fsewardj } 82acfbd7d59ee5c85911c687c6666940a38019f48fsewardj V128; 83acfbd7d59ee5c85911c687c6666940a38019f48fsewardj 84cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj/* A union for doing 256-bit vector primitives conveniently. */ 85cc3d219c3120150c9ab67f1f4850be0f39a9499csewardjtypedef 86cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj union { 87cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj UChar w8[32]; 88cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj UShort w16[16]; 89cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj UInt w32[8]; 90cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj ULong w64[4]; 91cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj } 92cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj V256; 93cc3d219c3120150c9ab67f1f4850be0f39a9499csewardj 94acfbd7d59ee5c85911c687c6666940a38019f48fsewardj/* Floating point. */ 95a58ea668d4725b87a146cf43cc48b8ea6ead84casewardjtypedef float Float; /* IEEE754 single-precision (32-bit) value */ 96a58ea668d4725b87a146cf43cc48b8ea6ead84casewardjtypedef double Double; /* IEEE754 double-precision (64-bit) value */ 97a58ea668d4725b87a146cf43cc48b8ea6ead84casewardj 98ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj/* Bool is always 8 bits. */ 99ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardjtypedef unsigned char Bool; 100ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj#define True ((Bool)1) 101ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj#define False ((Bool)0) 102ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 1037a24055849094ee15513cedbdf811121a6b64577sewardj/* Use this to coerce the result of a C comparison to a Bool. This is 1047a24055849094ee15513cedbdf811121a6b64577sewardj useful when compiling with Intel icc with ultra-paranoid 1057a24055849094ee15513cedbdf811121a6b64577sewardj compilation flags (-Wall). */ 1067a24055849094ee15513cedbdf811121a6b64577sewardjstatic inline Bool toBool ( Int x ) { 1077a24055849094ee15513cedbdf811121a6b64577sewardj Int r = (x == 0) ? False : True; 1087a24055849094ee15513cedbdf811121a6b64577sewardj return (Bool)r; 1097a24055849094ee15513cedbdf811121a6b64577sewardj} 1109d2e769a9368d2b22c32a4764a70e9da38769628sewardjstatic inline UChar toUChar ( Int x ) { 1119d2e769a9368d2b22c32a4764a70e9da38769628sewardj x &= 0xFF; 1129d2e769a9368d2b22c32a4764a70e9da38769628sewardj return (UChar)x; 1139d2e769a9368d2b22c32a4764a70e9da38769628sewardj} 1145827784e6bb74e2a032b66ec310776c24fd88729sewardjstatic inline HChar toHChar ( Int x ) { 1155827784e6bb74e2a032b66ec310776c24fd88729sewardj x &= 0xFF; 1165827784e6bb74e2a032b66ec310776c24fd88729sewardj return (HChar)x; 1175827784e6bb74e2a032b66ec310776c24fd88729sewardj} 1189d2e769a9368d2b22c32a4764a70e9da38769628sewardjstatic inline UShort toUShort ( Int x ) { 1199d2e769a9368d2b22c32a4764a70e9da38769628sewardj x &= 0xFFFF; 1209d2e769a9368d2b22c32a4764a70e9da38769628sewardj return (UShort)x; 1219d2e769a9368d2b22c32a4764a70e9da38769628sewardj} 12240e144d3c4b155ab30c71f5abc90ff67391e7a87sewardjstatic inline Short toShort ( Int x ) { 12340e144d3c4b155ab30c71f5abc90ff67391e7a87sewardj x &= 0xFFFF; 12440e144d3c4b155ab30c71f5abc90ff67391e7a87sewardj return (Short)x; 12540e144d3c4b155ab30c71f5abc90ff67391e7a87sewardj} 12698e65ba6e52f221c9dac2353cd436499e2581720sewardjstatic inline UInt toUInt ( Long x ) { 12798e65ba6e52f221c9dac2353cd436499e2581720sewardj x &= 0xFFFFFFFFLL; 12898e65ba6e52f221c9dac2353cd436499e2581720sewardj return (UInt)x; 12998e65ba6e52f221c9dac2353cd436499e2581720sewardj} 1307a24055849094ee15513cedbdf811121a6b64577sewardj 13135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* 32/64 bit addresses. */ 13235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjtypedef UInt Addr32; 13335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardjtypedef ULong Addr64; 13435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj 135beac530a718fcc646bc61fe60a86f599df54e1d7florian/* An address: 32-bit or 64-bit wide depending on host architecture */ 136beac530a718fcc646bc61fe60a86f599df54e1d7floriantypedef unsigned long Addr; 137beac530a718fcc646bc61fe60a86f599df54e1d7florian 138beac530a718fcc646bc61fe60a86f599df54e1d7florian 139ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj/* Something which has the same size as void* on the host. That is, 140ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj it is 32 bits on a 32-bit host and 64 bits on a 64-bit host, and so 141ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj it can safely be coerced to and from a pointer type on the host 142ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj machine. */ 143ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardjtypedef unsigned long HWord; 144ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj 14593a09742b0de3d61718882c2d999f64be402564dflorian/* Set up VEX_HOST_WORDSIZE and VEX_REGPARM. */ 14697e87935760215710e2d88bd66ca77fdeefd8dd7sewardj#undef VEX_HOST_WORDSIZE 14703d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj#undef VEX_REGPARM 14897e87935760215710e2d88bd66ca77fdeefd8dd7sewardj 149aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj/* The following 4 work OK for Linux. */ 150a219a80a5be6034d7633d609cb5b2d602b394c50sewardj#if defined(__x86_64__) 15197e87935760215710e2d88bd66ca77fdeefd8dd7sewardj# define VEX_HOST_WORDSIZE 8 15203d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj# define VEX_REGPARM(_n) /* */ 153216ac966b882f79055c60308588620d5415df1cfsewardj 15497e87935760215710e2d88bd66ca77fdeefd8dd7sewardj#elif defined(__i386__) 15597e87935760215710e2d88bd66ca77fdeefd8dd7sewardj# define VEX_HOST_WORDSIZE 4 15603d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj# define VEX_REGPARM(_n) __attribute__((regparm(_n))) 157216ac966b882f79055c60308588620d5415df1cfsewardj 158d953ebb9b04cbad6891676df597bf0c542b1ec89cerion#elif defined(__powerpc__) && defined(__powerpc64__) 159d953ebb9b04cbad6891676df597bf0c542b1ec89cerion# define VEX_HOST_WORDSIZE 8 16003d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj# define VEX_REGPARM(_n) /* */ 161216ac966b882f79055c60308588620d5415df1cfsewardj 162d953ebb9b04cbad6891676df597bf0c542b1ec89cerion#elif defined(__powerpc__) && !defined(__powerpc64__) 16397e87935760215710e2d88bd66ca77fdeefd8dd7sewardj# define VEX_HOST_WORDSIZE 4 164216ac966b882f79055c60308588620d5415df1cfsewardj# define VEX_REGPARM(_n) /* */ 165216ac966b882f79055c60308588620d5415df1cfsewardj 166bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#elif defined(__arm__) && !defined(__aarch64__) 1676c299f3acab617581ea504e45fbb6cab24c2b29fsewardj# define VEX_HOST_WORDSIZE 4 16803d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj# define VEX_REGPARM(_n) /* */ 169aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj 170bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#elif defined(__aarch64__) && !defined(__arm__) 171aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj# define VEX_HOST_WORDSIZE 8 17203d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj# define VEX_REGPARM(_n) /* */ 173aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj 1742019a976f07ff418dde2dfc7cc74667ef66d7764sewardj#elif defined(__s390x__) 1752019a976f07ff418dde2dfc7cc74667ef66d7764sewardj# define VEX_HOST_WORDSIZE 8 17603d91140809def2f5afc04b0cc9beb0f4f0a1b13sewardj# define VEX_REGPARM(_n) /* */ 1772019a976f07ff418dde2dfc7cc74667ef66d7764sewardj 178bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#elif defined(__mips__) && (__mips == 64) 179b92a95406aca7bba15ecc9b5828a16fdbbdc8778petarj# define VEX_HOST_WORDSIZE 8 180bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj# define VEX_REGPARM(_n) /* */ 181bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj 182bbcf188f6ae64a44fb31414eb9e1a738b4befcc0sewardj#elif defined(__mips__) && (__mips != 64) 183d0e5fe765fb79e5495206f8d0969133178b871f2sewardj# define VEX_HOST_WORDSIZE 4 184d0e5fe765fb79e5495206f8d0969133178b871f2sewardj# define VEX_REGPARM(_n) /* */ 185d0e5fe765fb79e5495206f8d0969133178b871f2sewardj 1860de80192f57cd132b31b233c65734de04939ce65sewardj#elif defined(__tilegx__) 1870de80192f57cd132b31b233c65734de04939ce65sewardj# define VEX_HOST_WORDSIZE 8 1880de80192f57cd132b31b233c65734de04939ce65sewardj# define VEX_REGPARM(_n) /* */ 1890de80192f57cd132b31b233c65734de04939ce65sewardj 19097e87935760215710e2d88bd66ca77fdeefd8dd7sewardj#else 19197e87935760215710e2d88bd66ca77fdeefd8dd7sewardj# error "Vex: Fatal: Can't establish the host architecture" 19297e87935760215710e2d88bd66ca77fdeefd8dd7sewardj#endif 19397e87935760215710e2d88bd66ca77fdeefd8dd7sewardj 19497e87935760215710e2d88bd66ca77fdeefd8dd7sewardj 19597e87935760215710e2d88bd66ca77fdeefd8dd7sewardj#endif /* ndef __LIBVEX_BASICTYPES_H */ 196ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj 197ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj/*---------------------------------------------------------------*/ 1985287fd7a7b3718889e02eb886c181ceb73e62b6asewardj/*--- libvex_basictypes.h ---*/ 199ac9af021b93dfe6f35c01d9c6fd15a3d67685843sewardj/*---------------------------------------------------------------*/ 2000de80192f57cd132b31b233c65734de04939ce65sewardj 201