1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
/* -----------------------------------------------------------------------------
*
* (c) The GHC Team, 1998-2004
*
* Various C datatypes used in the run-time system. This is the
* lowest-level include file, after ghcconfig.h and RtsConfig.h.
*
* This module should define types *only*, all beginning with "Stg".
*
* Specifically:
StgInt8, 16, 32, 64
StgWord8, 16, 32, 64
StgChar, StgFloat, StgDouble
***** All the same size (i.e. sizeof(void *)): *****
StgPtr Basic pointer type
StgWord Unit of heap allocation
StgInt Signed version of StgWord
StgAddr Generic address type
StgBool, StgVoid, StgClosurePtr, StgPtr, StgOffset,
StgTSOPtr, StgForeignPtr, StgStackOffset, StgStackPtr,
StgCode, StgArray, StgByteArray, StgStablePtr, StgFunPtr,
StgUnion.
* WARNING: Keep this file, MachDeps.h, and HsFFI.h in synch!
*
* NOTE: assumes #include "ghcconfig.h"
*
* Works with or without _POSIX_SOURCE.
*
* ---------------------------------------------------------------------------*/
#ifndef STGTYPES_H
#define STGTYPES_H
/*
* First, platform-dependent definitions of size-specific integers.
* Assume for now that the int type is 32 bits.
* NOTE: Synch the following definitions with MachDeps.h!
* ToDo: move these into a platform-dependent file.
*/
typedef signed char StgInt8;
typedef unsigned char StgWord8;
typedef signed short StgInt16;
typedef unsigned short StgWord16;
#if SIZEOF_UNSIGNED_INT == 4
typedef signed int StgInt32;
typedef unsigned int StgWord32;
#else
#error GHC untested on this architecture: sizeof(unsigned int) != 4
#endif
#ifdef SUPPORT_LONG_LONGS
/* assume long long is 64 bits */
# ifndef _MSC_VER
typedef signed long long int StgInt64;
typedef unsigned long long int StgWord64;
# else
typedef __int64 StgInt64;
typedef unsigned __int64 StgWord64;
# endif
#elif SIZEOF_LONG == 8
typedef signed long StgInt64;
typedef unsigned long StgWord64;
#elif defined(__MSVC__)
typedef __int64 StgInt64;
typedef unsigned __int64 StgWord64;
#else
#error GHC untested on this architecture: sizeof(void *) < 8 and no long longs.
#endif
/*
* Define the standard word size we'll use on this machine: make it
* big enough to hold a pointer.
*/
#if SIZEOF_VOID_P == 8
typedef StgInt64 StgInt;
typedef StgWord64 StgWord;
typedef StgInt32 StgHalfInt;
typedef StgWord32 StgHalfWord;
#else
#if SIZEOF_VOID_P == 4
typedef StgInt32 StgInt;
typedef StgWord32 StgWord;
typedef StgInt16 StgHalfInt;
typedef StgWord16 StgHalfWord;
#else
#error GHC untested on this architecture: sizeof(void *) != 4 or 8
#endif
#endif
#define W_MASK (sizeof(W_)-1)
typedef void* StgAddr;
/*
* Other commonly-used STG datatypes.
*/
typedef StgWord32 StgChar;
typedef int StgBool;
typedef float StgFloat;
typedef double StgDouble;
typedef void StgVoid;
typedef struct StgClosure_ StgClosure;
typedef StgClosure* StgClosurePtr;
typedef StgWord* StgPtr; /* pointer into closure */
typedef StgWord volatile* StgVolatilePtr; /* pointer to volatile word */
typedef StgWord StgOffset; /* byte offset within closure */
typedef struct StgTSO_* StgTSOPtr;
typedef void* StgForeignPtr;
typedef StgInt StgStackOffset; /* offset in words! */
typedef StgWord* StgStackPtr;
typedef StgWord8 StgCode; /* close enough */
typedef StgPtr* StgArray; /* the goods of an Array# */
typedef char* StgByteArray; /* the goods of a ByteArray# */
typedef void* StgStablePtr;
/*
Types for the generated C functions
take no arguments
return a pointer to the next function to be called
use: Ptr to Fun that returns a Ptr to Fun which returns Ptr to void
Note: Neither StgFunPtr not StgFun is quite right (that is,
StgFunPtr != StgFun*). So, the functions we define all have type
StgFun but we always have to cast them to StgFunPtr when we assign
them to something.
The only way round this would be to write a recursive type but
C only allows that if you're defining a struct or union.
*/
typedef void *(*(*StgFunPtr)(void))(void);
typedef StgFunPtr StgFun(void);
#endif /* STGTYPES_H */
|