include 64bit type limit defines and literal defining macros
[dyninst.git] / common / h / Types.h
1 /*
2  * Copyright (c) 1996 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  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 /************************************************************************
43  * $Id: Types.h,v 1.9 2000/08/14 19:23:01 schendel Exp $
44  * Types.h: commonly used types (used by runtime libs and other modules)
45 ************************************************************************/
46
47 #if !defined(_Types_h_)
48 #define _Types_h_
49
50
51 /* sets up 64 bit
52    types:
53      int64_t         uint64_t
54      int32_t         uint32_t
55    constant macros:
56      I64_C(x)        UI64_C(x)
57    limits:
58      INT64_MAX       INT64_MIN        UINT64_MAX
59      INT32_MAX       INT32_MIN        UINT32_MAX
60
61      needs to be included before anything that includes an inttypes.h file
62      (eg. stdio on some systems) 
63 */
64
65 /* typedef appropriate definitions for ISO C9X standard integer types
66    if these currently aren't provided in <inttypes.h> */
67 #if defined(i386_unknown_nt4_0)
68 typedef __int64 int64_t;
69 typedef __int32 int32_t;
70 typedef unsigned __int64 uint64_t;
71 typedef unsigned __int32 uint32_t;
72 #elif defined(rs6000_ibm_aix4_1) && !defined(_H_INTTYPES)
73 typedef int int32_t;
74 typedef long long int64_t;
75 typedef unsigned int uint32_t;
76 typedef unsigned long long uint64_t;
77 #elif defined(alpha_dec_osf4_0) && !defined(_H_INTTYPES)
78 typedef int int32_t;
79 typedef long int64_t;
80 typedef unsigned int uint32_t;
81 typedef unsigned long uint64_t;
82 #else
83 #ifdef i386_unknown_linux2_0
84 #define __STDC_LIMIT_MACROS
85 #define __STDC_CONSTANT_MACROS
86 #endif
87
88 #ifdef rs6000_ibm_aix4_1
89 #define _ALL_SOURCE
90 #endif
91
92 #include <inttypes.h>
93
94 /* --- inttypes.h ---
95              int32_t  uint32_t  int64_t uint64_t 32B lmts 64Blmts 64BlitMacros#
96 Sol5.6       yes      yes       yes     yes      yes      no*     yes   
97 Sol5.7       yes      yes       yes     yes      yes      no*     yes   
98 Linux        yes      yes       yes     yes      yes      yes     yes
99 Irix         yes      yes       yes     yes      yes      yes     yes
100 Osf4.0       nonexistant
101 Osf5.0       ?
102 Aix4.2       nonexistant
103 Aix4.3+      yes      yes       yes     yes      yes      no*     yes
104 WindowsNT    nonexistant
105
106   * the 64bit limits on solaris and aix are defined, but they are not defined
107     properly to include the numeric literal postfix (eg. LL), so we need to
108     explicitly define these
109   # we rename all of the 64 bit literal macros to our shortened name
110   + can't depend on existance of inttypes.h for aix since nonexistant on 4.2
111 */
112 #endif
113
114
115 /* Set up the 64 BIT LITERAL MACROS */
116 #if defined(rs6000_ibm_aix4_1) && !defined(_H_INTTYPES)
117 #define I64_C(x)  (x##ll)
118 #define UI64_C(x) (x##ull)
119 #elif defined(alpha_dec_osf4_0)
120 #define I64_C(x)  (x##l)
121 #define UI64_C(x) (x##ul)
122 #elif defined(i386_unknown_nt4_0)
123 #define I64_C(x)  (x##i64)
124 #define UI64_C(x) (x##ui64)
125 #else
126 #define I64_C(x)  INT64_C(x)
127 #define UI64_C(x) UINT64_C(x)
128 #endif
129
130 /* Set up the 32 BIT LIMITS for those not already set up */
131 #if defined(alpha_dec_osf4_0) || \
132     (defined(rs6000_ibm_aix4_1) && !defined(_H_INTTYPES))
133 #define INT32_MAX  (2147483647)
134 #define UINT32_MAX (4294967295U)
135 #define INT32_MIN  (-2147483647-1)
136 #endif
137
138 /* Set up the 64 BIT LIMITS for those not already set up */
139 #if defined(sparc_sun_solaris2_4) || defined(i386_unknown_solaris2_5) || \
140     defined(rs6000_ibm_aix4_1) || defined(alpha_dec_osf4_0)
141 /* see note (*) above */
142 #undef INT64_MAX
143 #undef UINT64_MAX
144 #undef INT64_MIN
145 #define INT64_MAX    I64_C(9223372036854775807)
146 #define UINT64_MAX   UI64_C(18446744073709551615)
147 /* The GNU compilers on solaris have what seems like a bug where a
148    warning is printed when the ...808 int64 minimum is used, so we'll get the
149    value with some trickery */
150 #define INT64_MIN    (-INT64_MAX-1)
151 #elif defined(i386_unknown_nt4_0)
152 #include <limits.h>
153 #define INT64_MAX  _I64_MAX
154 #define UINT64_MAX _UI64_MAX
155 #define INT64_MIN  _I64_MIN
156 #define INT32_MAX  _I32_MAX
157 #define INT32_MIN  _I32_MIN
158 #define UINT32_MAX  _UI32_MAX
159 #endif
160
161 typedef int64_t time64;
162
163 typedef long unsigned int Address;
164 /* Note the inherent assumption that the size of a "long" integer matches
165    that of an address (void*) on every supported Paradyn/Dyninst system!
166    (This can be checked with Address_chk().)
167 */
168
169 typedef unsigned int Word;
170
171 typedef long int RegValue;      /* register content */
172 /* This needs to be an int since it is sometimes used to pass offsets
173    to the code generator (i.e. if-statement) - jkh 5/24/99 */
174 typedef unsigned int Register;  /* a register number, e.g., [0..31]  */
175 static const Register Null_Register = (Register)(-1);   /* '255' */
176
177 /* This file is now included by the rtinst library also, so all
178    C++ constructs need to be in #ifdef _cplusplus... 7/9/99 -bhs */
179
180 #ifdef __cplusplus
181
182 extern void Address_chk ();
183 extern char *Address_str (Address addr);
184
185 // NB: this is probably inappropriate for 64-bit addresses!
186 inline unsigned hash_address(const Address& addr) {
187     return (addr >> 2);
188 }
189 #endif /* __cplusplus */
190
191 #endif /* !defined(_Types_h_) */
192
193
194