97d6a3a12ae03492985872c1f47f234ef209fba6
[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
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         interfaceFileFormatVersion
73
74     ) where
75
76 -- This magical #include brings in all the everybody-knows-these magic
77 -- constants unfortunately, we need to be *explicit* about which one
78 -- we want; if we just hope a -I... will get the right one, we could
79 -- be in trouble.
80
81 #include "HsVersions.h"
82 #include "../includes/config.h"
83 #include "../includes/MachRegs.h"
84 #include "../includes/Constants.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 \end{code}
124
125 A little function that abstracts the stack direction.  Note that most
126 of the code generator is dependent on the stack direction anyway, so
127 changing this on its own spells certain doom.  ToDo: remove?
128
129 \begin{code}
130 -- THIS IS DIRECTION SENSITIVE!
131
132 -- stack grows down, positive virtual offsets correspond to negative
133 -- additions to the stack pointer.
134
135 spRelToInt :: Int{-VirtualSpOffset-} -> Int{-VirtualSpOffset-} -> Int
136 spRelToInt sp off = sp - off
137 \end{code}
138
139 A section of code-generator-related MAGIC CONSTANTS.
140
141 \begin{code}
142 mAX_FAMILY_SIZE_FOR_VEC_RETURNS = (MAX_VECTORED_RTN::Int)  -- pretty arbitrary
143 -- If you change this, you may need to change runtimes/standard/Update.lhc
144
145 -- The update frame sizes
146 uF_SIZE = (NOSCC_UF_SIZE::Int)
147
148 -- Same again, with profiling
149 sCC_UF_SIZE = (SCC_UF_SIZE::Int)
150
151 -- Same again, with gransim
152 gRAN_UF_SIZE = (GRAN_UF_SIZE::Int)
153
154 -- Offsets in an update frame.  They don't change with profiling!
155 uF_RET         = (UF_RET::Int)
156 uF_SU          = (UF_SU::Int)
157 uF_UPDATEE     = (UF_UPDATEE::Int)
158 uF_CCS         = (UF_CCS::Int)
159 \end{code}
160
161 Seq frame sizes.
162
163 \begin{code}
164 sEQ_FRAME_SIZE = (NOSCC_SEQ_FRAME_SIZE::Int)
165 sCC_SEQ_FRAME_SIZE = (SCC_SEQ_FRAME_SIZE::Int)
166 gRAN_SEQ_FRAME_SIZE = (GRAN_SEQ_FRAME_SIZE::Int)
167 \end{code}
168
169 \begin{code}
170 mAX_Vanilla_REG = (MAX_VANILLA_REG :: Int)
171 mAX_Float_REG   = (MAX_FLOAT_REG :: Int)
172 mAX_Double_REG  = (MAX_DOUBLE_REG :: Int)
173 mAX_Long_REG    = (MAX_LONG_REG  :: Int)
174
175 mAX_Real_Vanilla_REG    = (MAX_REAL_VANILLA_REG :: Int)
176 mAX_Real_Float_REG      = (MAX_REAL_FLOAT_REG :: Int)
177 mAX_Real_Double_REG     = (MAX_REAL_DOUBLE_REG :: Int)
178 #ifdef MAX_REAL_LONG_REG
179 mAX_Real_Long_REG       = (MAX_REAL_LONG_REG :: Int)
180 #else
181 mAX_Real_Long_REG       = (0::Int)
182 #endif
183 \end{code}
184
185 Closure header sizes.
186
187 \begin{code}
188 sTD_HDR_SIZE       = (STD_HDR_SIZE       :: Int)
189 pROF_HDR_SIZE      = (PROF_HDR_SIZE      :: Int)
190 gRAN_HDR_SIZE      = (GRAN_HDR_SIZE      :: Int)
191 tICKY_HDR_SIZE     = (TICKY_HDR_SIZE     :: Int)
192 aRR_WORDS_HDR_SIZE = (ARR_WORDS_HDR_SIZE :: Int)
193 aRR_PTRS_HDR_SIZE  = (ARR_PTRS_HDR_SIZE  :: Int)
194 \end{code}
195
196 Info Table sizes.
197
198 \begin{code}
199 sTD_ITBL_SIZE   = (STD_ITBL_SIZE   :: Int)
200 pROF_ITBL_SIZE  = (PROF_ITBL_SIZE  :: Int)
201 gRAN_ITBL_SIZE  = (GRAN_ITBL_SIZE  :: Int)
202 tICKY_ITBL_SIZE = (TICKY_ITBL_SIZE :: Int)
203 \end{code}
204
205 Size of a double in StgWords.
206
207 \begin{code}
208 dOUBLE_SIZE    = (DOUBLE_SIZE   :: Int)
209 wORD64_SIZE    = (WORD64_SIZE   :: Int)
210 iNT64_SIZE     = (INT64_SIZE   :: Int)
211 \end{code}
212
213 The version of the interface file format we're using.  It's propagated
214 here by a devious route from ghc/mk/version.mk.  See comments
215 there for what it means.
216
217 \begin{code}
218 interfaceFileFormatVersion :: Int
219 interfaceFileFormatVersion = HscIfaceFileVersion
220 \end{code}
221
222 This tells the native code generator the size of the spill
223 area is has available.
224
225 \begin{code}
226 rESERVED_C_STACK_BYTES = (RESERVED_C_STACK_BYTES :: Int)
227 \end{code}
228
229 Size of a word, in bytes
230
231 \begin{code}
232 wORD_SIZE = (WORD_SIZE :: 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}