[project @ 2000-08-07 23:37:19 by qrczak]
[ghc-hetmet.git] / ghc / compiler / main / Constants.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[Constants]{Info about this compilation}
5
6 \begin{code}
7 module Constants (
8         mAX_CONTEXT_REDUCTION_DEPTH,
9         mAX_TUPLE_SIZE,
10
11         mAX_SPEC_THUNK_SIZE,
12         mAX_SPEC_FUN_SIZE,
13         mAX_SPEC_CONSTR_SIZE,
14         mAX_SPEC_SELECTEE_SIZE,
15         mAX_SPEC_AP_SIZE,
16
17         mIN_UPD_SIZE,
18         mIN_SIZE_NonUpdHeapObject,
19
20         sTD_HDR_SIZE,
21         pROF_HDR_SIZE,
22         gRAN_HDR_SIZE,
23         tICKY_HDR_SIZE,
24         aRR_WORDS_HDR_SIZE,
25         aRR_PTRS_HDR_SIZE,
26         rESERVED_C_STACK_BYTES,
27
28         sTD_ITBL_SIZE,
29         pROF_ITBL_SIZE,
30         gRAN_ITBL_SIZE,
31         tICKY_ITBL_SIZE,
32
33         mAX_FAMILY_SIZE_FOR_VEC_RETURNS,
34
35         uF_SIZE,
36         sCC_UF_SIZE,
37         gRAN_UF_SIZE,  -- HWL
38         uF_RET,
39         uF_SU,
40         uF_UPDATEE,
41         uF_CCS,
42
43         sEQ_FRAME_SIZE,
44         sCC_SEQ_FRAME_SIZE,
45         gRAN_SEQ_FRAME_SIZE, -- HWL
46
47         mAX_Vanilla_REG,
48         mAX_Float_REG,
49         mAX_Double_REG,
50         mAX_Long_REG,
51
52         mAX_Real_Vanilla_REG,
53         mAX_Real_Float_REG,
54         mAX_Real_Double_REG,
55         mAX_Real_Long_REG,
56
57         oTHER_TAG,
58
59         mAX_INTLIKE, mIN_INTLIKE,
60         mAX_CHARLIKE, mIN_CHARLIKE,
61
62         spRelToInt,
63
64         dOUBLE_SIZE,
65         iNT64_SIZE,
66         wORD64_SIZE,
67         
68         wORD_SIZE,
69
70         bLOCK_SIZE,
71         bLOCK_SIZE_W,
72
73         interfaceFileFormatVersion
74
75     ) where
76
77 -- This magical #include brings in all the everybody-knows-these magic
78 -- constants unfortunately, we need to be *explicit* about which one
79 -- we want; if we just hope a -I... will get the right one, we could
80 -- be in trouble.
81
82 #include "HsVersions.h"
83 #include "../includes/config.h"
84 #include "../includes/MachRegs.h"
85 #include "../includes/Constants.h"
86
87 -- import Util
88 \end{code}
89
90 All pretty arbitrary:
91
92 \begin{code}
93 mAX_TUPLE_SIZE = (37 :: Int)
94 mAX_CONTEXT_REDUCTION_DEPTH = (20 :: Int)
95 \end{code}
96
97
98 \begin{code}
99 -- specialised fun/thunk/constr closure types
100 mAX_SPEC_THUNK_SIZE   = (MAX_SPEC_THUNK_SIZE :: Int)
101 mAX_SPEC_FUN_SIZE     = (MAX_SPEC_FUN_SIZE :: Int)
102 mAX_SPEC_CONSTR_SIZE  = (MAX_SPEC_CONSTR_SIZE :: Int)
103
104 -- pre-compiled thunk types
105 mAX_SPEC_SELECTEE_SIZE  = (MAX_SPEC_SELECTEE_SIZE :: Int)
106 mAX_SPEC_AP_SIZE        = (MAX_SPEC_AP_SIZE :: Int)
107
108 -- closure sizes: these do NOT include the header (see below for header sizes)
109 mIN_UPD_SIZE                    = (MIN_UPD_SIZE::Int)
110 mIN_SIZE_NonUpdHeapObject       = (MIN_NONUPD_SIZE::Int)
111 \end{code}
112
113 Constants for semi-tagging; the tags associated with the data
114 constructors will start at 0 and go up.
115
116 \begin{code}
117 oTHER_TAG = (INFO_OTHER_TAG :: Integer) -- (-1) unevaluated, probably
118 \end{code}
119
120 \begin{code}
121 mIN_INTLIKE, mAX_INTLIKE :: Integer     -- Only used to compare with (MachInt Integer)
122 mIN_INTLIKE = MIN_INTLIKE
123 mAX_INTLIKE = MAX_INTLIKE
124
125 mIN_CHARLIKE, mAX_CHARLIKE :: Int       -- Only used to compare with (MachChar Int)
126 mIN_CHARLIKE = MIN_CHARLIKE
127 mAX_CHARLIKE = MAX_CHARLIKE
128 \end{code}
129
130 A little function that abstracts the stack direction.  Note that most
131 of the code generator is dependent on the stack direction anyway, so
132 changing this on its own spells certain doom.  ToDo: remove?
133
134 \begin{code}
135 -- THIS IS DIRECTION SENSITIVE!
136
137 -- stack grows down, positive virtual offsets correspond to negative
138 -- additions to the stack pointer.
139
140 spRelToInt :: Int{-VirtualSpOffset-} -> Int{-VirtualSpOffset-} -> Int
141 spRelToInt sp off = sp - off
142 \end{code}
143
144 A section of code-generator-related MAGIC CONSTANTS.
145
146 \begin{code}
147 mAX_FAMILY_SIZE_FOR_VEC_RETURNS = (MAX_VECTORED_RTN::Int)  -- pretty arbitrary
148 -- If you change this, you may need to change runtimes/standard/Update.lhc
149
150 -- The update frame sizes
151 uF_SIZE = (NOSCC_UF_SIZE::Int)
152
153 -- Same again, with profiling
154 sCC_UF_SIZE = (SCC_UF_SIZE::Int)
155
156 -- Same again, with gransim
157 gRAN_UF_SIZE = (GRAN_UF_SIZE::Int)
158
159 -- Offsets in an update frame.  They don't change with profiling!
160 uF_RET         = (UF_RET::Int)
161 uF_SU          = (UF_SU::Int)
162 uF_UPDATEE     = (UF_UPDATEE::Int)
163 uF_CCS         = (UF_CCS::Int)
164 \end{code}
165
166 Seq frame sizes.
167
168 \begin{code}
169 sEQ_FRAME_SIZE = (NOSCC_SEQ_FRAME_SIZE::Int)
170 sCC_SEQ_FRAME_SIZE = (SCC_SEQ_FRAME_SIZE::Int)
171 gRAN_SEQ_FRAME_SIZE = (GRAN_SEQ_FRAME_SIZE::Int)
172 \end{code}
173
174 \begin{code}
175 mAX_Vanilla_REG = (MAX_VANILLA_REG :: Int)
176 mAX_Float_REG   = (MAX_FLOAT_REG :: Int)
177 mAX_Double_REG  = (MAX_DOUBLE_REG :: Int)
178 mAX_Long_REG    = (MAX_LONG_REG  :: Int)
179
180 mAX_Real_Vanilla_REG    = (MAX_REAL_VANILLA_REG :: Int)
181 mAX_Real_Float_REG      = (MAX_REAL_FLOAT_REG :: Int)
182 mAX_Real_Double_REG     = (MAX_REAL_DOUBLE_REG :: Int)
183 #ifdef MAX_REAL_LONG_REG
184 mAX_Real_Long_REG       = (MAX_REAL_LONG_REG :: Int)
185 #else
186 mAX_Real_Long_REG       = (0::Int)
187 #endif
188 \end{code}
189
190 Closure header sizes.
191
192 \begin{code}
193 sTD_HDR_SIZE       = (STD_HDR_SIZE       :: Int)
194 pROF_HDR_SIZE      = (PROF_HDR_SIZE      :: Int)
195 gRAN_HDR_SIZE      = (GRAN_HDR_SIZE      :: Int)
196 tICKY_HDR_SIZE     = (TICKY_HDR_SIZE     :: Int)
197 aRR_WORDS_HDR_SIZE = (ARR_WORDS_HDR_SIZE :: Int)
198 aRR_PTRS_HDR_SIZE  = (ARR_PTRS_HDR_SIZE  :: Int)
199 \end{code}
200
201 Info Table sizes.
202
203 \begin{code}
204 sTD_ITBL_SIZE   = (STD_ITBL_SIZE   :: Int)
205 pROF_ITBL_SIZE  = (PROF_ITBL_SIZE  :: Int)
206 gRAN_ITBL_SIZE  = (GRAN_ITBL_SIZE  :: Int)
207 tICKY_ITBL_SIZE = (TICKY_ITBL_SIZE :: Int)
208 \end{code}
209
210 Size of a double in StgWords.
211
212 \begin{code}
213 dOUBLE_SIZE    = (DOUBLE_SIZE   :: Int)
214 wORD64_SIZE    = (WORD64_SIZE   :: Int)
215 iNT64_SIZE     = (INT64_SIZE   :: Int)
216 \end{code}
217
218 The version of the interface file format we're using.  It's propagated
219 here by a devious route from ghc/mk/version.mk.  See comments
220 there for what it means.
221
222 \begin{code}
223 interfaceFileFormatVersion :: Int
224 interfaceFileFormatVersion = HscIfaceFileVersion
225 \end{code}
226
227 This tells the native code generator the size of the spill
228 area is has available.
229
230 \begin{code}
231 rESERVED_C_STACK_BYTES = (RESERVED_C_STACK_BYTES :: Int)
232 \end{code}
233
234 Size of a word, in bytes
235
236 \begin{code}
237 wORD_SIZE = (WORD_SIZE :: Int)
238 \end{code}
239
240 Size of a storage manager block (in bytes).
241
242 \begin{code}
243 bLOCK_SIZE = (BLOCK_SIZE :: Int)
244 bLOCK_SIZE_W = (bLOCK_SIZE `div` wORD_SIZE :: Int)
245 \end{code}