Merge branch 'master' of win:c:/ghc/git/cygwin/.
[ghc.git] / includes / stg / Types.h
1 /* -----------------------------------------------------------------------------
2 *
3 * (c) The GHC Team, 1998-2004
4 *
5 * Various C datatypes used in the run-time system. This is the
6 * lowest-level include file, after ghcconfig.h and RtsConfig.h.
7 *
8 * Do not #include this file directly: #include "Rts.h" instead.
9 *
10 * To understand the structure of the RTS headers, see the wiki:
11 * http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes
12 *
13 * NOTE: assumes #include "ghcconfig.h"
14 *
15 * Works with or without _POSIX_SOURCE.
16 *
17 * WARNING: Keep this file, MachDeps.h, and HsFFI.h in synch!
18 *
19 * ---------------------------------------------------------------------------*/
20
21 #ifndef STGTYPES_H
22 #define STGTYPES_H
23
24 /*
25 * This module should define types *only*, all beginning with "Stg".
26 *
27 * Specifically:
28
29 StgInt8, 16, 32, 64
30 StgWord8, 16, 32, 64
31 StgChar, StgFloat, StgDouble
32
33 ***** All the same size (i.e. sizeof(void *)): *****
34 StgPtr Basic pointer type
35 StgWord Unit of heap allocation
36 StgInt Signed version of StgWord
37 StgAddr Generic address type
38
39 StgBool, StgVoid, StgPtr, StgOffset,
40 StgCode, StgStablePtr, StgFunPtr,
41 StgUnion.
42 */
43
44 /*
45 * First, platform-dependent definitions of size-specific integers.
46 * Assume for now that the int type is 32 bits.
47 * NOTE: Synch the following definitions with MachDeps.h!
48 * ToDo: move these into a platform-dependent file.
49 */
50
51 typedef signed char StgInt8;
52 typedef unsigned char StgWord8;
53
54 typedef signed short StgInt16;
55 typedef unsigned short StgWord16;
56
57 #if SIZEOF_INT == 4
58 typedef signed int StgInt32;
59 typedef unsigned int StgWord32;
60 #define FMT_Word32 "u"
61 #define FMT_Int32 "d"
62 #elif SIZEOF_LONG == 4
63 typedef signed long StgInt32;
64 typedef unsigned long StgWord32;
65 #define FMT_Word32 "lu"
66 #define FMT_Int32 "ld"
67 #else
68 #error GHC untested on this architecture: sizeof(int) != 4
69 #endif
70
71 #if SIZEOF_LONG == 8
72 typedef signed long StgInt64;
73 typedef unsigned long StgWord64;
74 #define FMT_Word64 "lu"
75 #define FMT_Int64 "ld"
76 #elif SIZEOF_LONG_LONG == 8
77 typedef signed long long int StgInt64;
78 typedef unsigned long long int StgWord64;
79 #define FMT_Word64 "llu"
80 #define FMT_Int64 "lld"
81 #else
82 #error cannot find a way to define StgInt64
83 #endif
84
85 /*
86 * Define the standard word size we'll use on this machine: make it
87 * big enough to hold a pointer.
88 *
89 * It's useful if StgInt/StgWord are always the same as long, so that
90 * we can use a consistent printf format specifier without warnings on
91 * any platform. Fortunately this works at the moement; if it breaks
92 * in the future we'll have to start using macros for format
93 * specifiers (c.f. FMT_StgWord64 in Rts.h).
94 */
95
96 #if SIZEOF_VOID_P == 8
97 typedef StgInt64 StgInt;
98 typedef StgWord64 StgWord;
99 typedef StgInt32 StgHalfInt;
100 typedef StgWord32 StgHalfWord;
101 #define FMT_Word FMT_Word64
102 #define FMT_Int FMT_Int64
103 #else
104 #if SIZEOF_VOID_P == 4
105 typedef StgInt32 StgInt;
106 typedef StgWord32 StgWord;
107 typedef StgInt16 StgHalfInt;
108 typedef StgWord16 StgHalfWord;
109 #define FMT_Word FMT_Word32
110 #define FMT_Int FMT_Int32
111 #else
112 #error GHC untested on this architecture: sizeof(void *) != 4 or 8
113 #endif
114 #endif
115
116 #define W_MASK (sizeof(W_)-1)
117
118 /*
119 * Other commonly-used STG datatypes.
120 */
121
122 typedef void* StgAddr;
123 typedef StgWord32 StgChar;
124 typedef int StgBool;
125 typedef float StgFloat;
126 typedef double StgDouble;
127 typedef StgWord* StgPtr; /* heap or stack pointer */
128 typedef StgWord volatile* StgVolatilePtr; /* pointer to volatile word */
129 typedef StgWord StgOffset; /* byte offset within closure */
130 typedef StgWord8 StgCode; /* close enough */
131 typedef void* StgStablePtr;
132 typedef StgWord8* StgByteArray;
133
134 /*
135 Types for the generated C functions
136 take no arguments
137 return a pointer to the next function to be called
138 use: Ptr to Fun that returns a Ptr to Fun which returns Ptr to void
139
140 Note: Neither StgFunPtr not StgFun is quite right (that is,
141 StgFunPtr != StgFun*). So, the functions we define all have type
142 StgFun but we always have to cast them to StgFunPtr when we assign
143 them to something.
144 The only way round this would be to write a recursive type but
145 C only allows that if you're defining a struct or union.
146 */
147
148 typedef void *(*(*StgFunPtr)(void))(void);
149 typedef StgFunPtr StgFun(void);
150
151 #endif /* STGTYPES_H */