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