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