These are the windows fixes that I previously alluded to, combined with
[dyninst.git] / common / h / Types.h
1 /*
2  * Copyright (c) 1996-2007 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
30  */
31
32 /************************************************************************
33  * $Id: Types.h,v 1.35 2008/05/09 00:25:37 jaw Exp $
34  * Types.h: commonly used types (used by runtime libs and other modules)
35 ************************************************************************/
36
37 #if !defined(_Types_h_)
38 #define _Types_h_
39
40
41 /* Sets up 64 and 32 bit
42    types:
43       int64_t      uint64_t      int32_t       uint32_t
44    constant macros:
45       I64_C(x)     UI64_C(x)
46    limits:
47       I64_MAX      I64_MIN       UI64_MAX
48       I32_MAX      I32_MIN       UI32_MAX
49
50    note: needs to be included before anything that includes inttypes.h
51          (eg. stdio on some systems)
52 */
53
54 /* Set up the 32 AND 64 BIT TYPES ===================================== */
55 /*
56    --- inttypes.h ---
57              int32_t  uint32_t  int64_t uint64_t 32B lmts 64Blmts 64BlitMacros#
58 Sol5.6       yes      yes       yes     yes      yes      no*     yes   
59 Sol5.7       yes      yes       yes     yes      yes      no*     yes   
60 Linux        yes      yes       yes     yes      yes      yes     yes
61 Irix         yes      yes       yes     yes      yes      yes     yes
62 Osf4.0       nonexistant
63 Osf5.0       ?
64 Aix4.2       nonexistant
65 Aix4.3       yes      yes       yes     yes      yes      no*     yes
66 WindowsNT    nonexistant
67
68   * the 64bit limits on solaris and aix are defined, but they are not defined
69     properly to include the numeric literal postfix (eg. LL), so we need to
70     explicitly define these
71   # we rename all of the 64 bit literal macros to our shortened name
72 */
73
74 #if defined(os_windows)
75    typedef __int64 int64_t;
76    typedef __int32 int32_t;
77    typedef unsigned __int64 uint64_t;
78    typedef unsigned __int32 uint32_t;
79 #elif defined(os_aix)  
80 #if defined (arch_power)
81 #  if defined(rs6000_ibm_aix64)
82 #       define TYPE64BIT
83 #  endif
84 #  ifndef _ALL_SOURCE
85 #     define _ALL_SOURCE
86 #  endif
87 #  include <sys/types.h>     /* if aix4.3, this will include inttypes.h */
88 #  ifndef _H_INTTYPES        /* for aix4.2 */
89      typedef int int32_t;
90      typedef unsigned int uint32_t;
91 #    if defined(rs6000_ibm_aix64)
92         typedef long int64_t;
93         typedef unsigned long uint64_t;
94 #    else
95         typedef long long int64_t;
96         typedef unsigned long long uint64_t;
97 #    endif
98 #  endif // defined (arch_power)
99 #  endif
100
101 #elif defined(arch_alpha)
102 #define TYPE64BIT
103 #  ifndef _H_INTTYPES
104    typedef int int32_t;
105    typedef long int64_t;
106    typedef unsigned int uint32_t;
107    typedef unsigned long uint64_t;
108 #  endif
109
110 #elif defined(os_linux)
111 #include <stdint.h>
112 #if defined(arch_x86_64) || defined(arch_ia64) || defined(arch_64bit)
113 #define TYPE64BIT
114 #endif
115
116 #elif defined(os_irix)
117 #define TYPE64BIT
118 #include <inttypes.h>
119 #elif defined(os_solaris)
120 #include <inttypes.h>
121 #else
122 #error Unknown architecture
123 #endif
124
125
126 /* Set up the 64 BIT LITERAL MACROS =================================== */
127 #if defined(os_aix) && !defined(_H_INTTYPES)  /* aix4.2 ---- */
128 #define I64_C(x)  (x##ll)
129 #define UI64_C(x) (x##ull)
130 #elif defined(os_osf)     /* osf ---------------------------- */
131 #define I64_C(x)  (x##l)
132 #define UI64_C(x) (x##ul)
133 #elif defined(os_windows)
134                                    /* nt ----------------------------- */
135 #define I64_C(x)  (x##i64)
136 #define UI64_C(x) (x##ui64)
137 #else                               /* linux, solaris, irix, aix4.3 --- */
138 #define I64_C(x)  INT64_C(x)
139 #define UI64_C(x) UINT64_C(x)
140 #endif
141
142 /* Set up the 32 and 64 BIT LIMITS for those not already set up ======= */
143 #if defined(os_osf)  || (defined(os_aix) && !defined(_H_INTTYPES))
144 #define INT32_MAX  (2147483647)
145 #define UINT32_MAX (4294967295U)
146 #define INT32_MIN  (-2147483647-1)
147 #endif
148
149                                    /* solaris, aix4.{23}, osf -------- */
150 #if defined(os_solaris) || defined(os_aix) || defined(os_osf)
151 /* see note (*) above */
152 #define I32_MAX    INT32_MAX
153 #define UI32_MAX   UINT32_MAX
154 #define I32_MIN    INT32_MIN
155 #define I64_MAX    I64_C(9223372036854775807)
156 #define UI64_MAX   UI64_C(18446744073709551615)
157 /* The GNU compilers on solaris and aix have what seems like a bug where a
158    warning is printed when the ...808 int64 minimum is used, so we'll get the
159    value with some trickery */
160 #define I64_MIN    (-I64_MAX-1)
161 #elif defined(os_windows)
162                          /* nt ----------------------------- */
163 #include <limits.h>
164 #define I64_MAX  _I64_MAX
165 #define UI64_MAX _UI64_MAX
166 #define I64_MIN  _I64_MIN
167 #define I32_MAX  _I32_MAX
168 #define I32_MIN  _I32_MIN
169 #define UI32_MAX  _UI32_MAX
170 #else                              /* linux, irix -------------------- */
171 #define I64_MAX  INT64_MAX
172 #define UI64_MAX UINT64_MAX
173 #define I64_MIN  INT64_MIN
174 #define I32_MAX  INT32_MAX
175 #define I32_MIN  INT32_MIN
176 #define UI32_MAX UINT32_MAX
177 #endif
178
179 //typedef int64_t time64;
180
181 #if defined(__cplusplus)
182 #include "dynutil/h/dyntypes.h"
183 using namespace Dyninst;
184 #else
185 typedef unsigned long Address;
186 #endif
187 /* Note the inherent assumption that the size of a "long" integer matches
188    that of an address (void*) on every supported Paradyn/Dyninst system!
189    (This can be checked with Address_chk().)
190 */
191 /* Gives a name for the NULL equivalent */
192 static const Address ADDR_NULL = (Address)(0);
193
194 typedef unsigned int Word;
195
196 typedef long int RegValue;      /* register content */
197 /* This needs to be an int since it is sometimes used to pass offsets
198    to the code generator (i.e. if-statement) - jkh 5/24/99 */
199 typedef unsigned int Register;  /* a register number, e.g., [0..31]  */
200 static const Register Null_Register = (Register)(-1);   /* '255' */
201 /* Easily noticeable name... */
202 static const Register REG_NULL = (Register)(-1);
203
204 /* This file is now included by the rtinst library also, so all
205    C++ constructs need to be in #ifdef _cplusplus... 7/9/99 -bhs */
206 #if !defined(DLLEXPORT)
207 #if defined (_MSC_VER)
208 /* If we're on Windows, we need to explicetely export these functions: */
209         #if defined(DLL_BUILD)
210                 #define DLLEXPORT __declspec(dllexport)
211         #else
212                 #define DLLEXPORT __declspec(dllimport) 
213         #endif
214 #else
215         #define DLLEXPORT
216 #endif
217 #endif
218
219
220 #ifdef __cplusplus
221
222 DLLEXPORT void Address_chk ();
223 DLLEXPORT char *Address_str (Address addr);
224
225 // NB: this is probably inappropriate for 64-bit addresses!
226 inline unsigned hash_address(const Address& addr) {
227     return (addr >> 2);
228 }
229 #endif /* __cplusplus */
230
231 #endif /* !defined(_Types_h_) */
232
233