d5467928ed48a5bf8ee8e4a03bf352c5f6419d86
[ghc-hetmet.git] / ghc / includes / Closures.h
1 /* ----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 1998-2004
4  *
5  * Closures
6  *
7  * -------------------------------------------------------------------------- */
8
9 #ifndef CLOSURES_H
10 #define CLOSURES_H
11
12 /*
13  * The Layout of a closure header depends on which kind of system we're
14  * compiling for: profiling, parallel, ticky, etc.
15  */
16
17 /* -----------------------------------------------------------------------------
18    The profiling header
19    -------------------------------------------------------------------------- */
20
21 typedef struct {
22   CostCentreStack *ccs;
23   union {
24     struct _RetainerSet *rs;  // Retainer Set
25     StgWord ldvw;             // Lag/Drag/Void Word
26   } hp;
27 } StgProfHeader;
28
29 /* -----------------------------------------------------------------------------
30    The GranSim header
31    -------------------------------------------------------------------------- */
32
33 typedef struct {
34   StgWord procs; /* bitmask indicating on which PEs this closure resides */
35 } StgGranHeader;
36
37 /* -----------------------------------------------------------------------------
38    The full fixed-size closure header
39
40    The size of the fixed header is the sum of the optional parts plus a single
41    word for the entry code pointer.
42    -------------------------------------------------------------------------- */
43
44 typedef struct {
45         const struct _StgInfoTable* info;
46 #ifdef PROFILING
47         StgProfHeader         prof;
48 #endif
49 #ifdef GRAN
50         StgGranHeader         gran;
51 #endif
52 } StgHeader;
53
54 /* -----------------------------------------------------------------------------
55    Closure Types
56
57    For any given closure type (defined in InfoTables.h), there is a
58    corresponding structure defined below.  The name of the structure
59    is obtained by concatenating the closure type with '_closure'
60    -------------------------------------------------------------------------- */
61
62 /* All closures follow the generic format */
63
64 struct StgClosure_ {
65     StgHeader   header;
66     struct StgClosure_ *payload[FLEXIBLE_ARRAY];
67 };
68
69 /* What a stroke of luck - all our mutable closures follow the same
70  * basic layout, with the mutable link field as the second field after
71  * the header.  This means the following structure is the supertype of
72  * mutable closures.
73  */
74
75 typedef struct StgMutClosure_ {
76     StgHeader   header;
77     StgWord     padding;
78     struct StgMutClosure_ *mut_link;
79     struct StgClosure_ *payload[FLEXIBLE_ARRAY];
80 } StgMutClosure;
81
82 typedef struct {
83     StgHeader   header;
84     StgClosure *selectee;
85 } StgSelector;
86
87 typedef struct {
88     StgHeader   header;
89     StgHalfWord arity;          /* zero if it is an AP */
90     StgHalfWord n_args;
91     StgClosure *fun;            /* really points to a fun */
92     StgClosure *payload[FLEXIBLE_ARRAY];
93 } StgPAP;
94
95 // AP closures have the same layout, for convenience
96 typedef StgPAP StgAP;
97
98 typedef struct {
99     StgHeader   header;
100     StgWord     size;                    // number of words in payload
101     StgClosure *fun;
102     StgClosure *payload[FLEXIBLE_ARRAY]; // contains a chunk of *stack*
103 } StgAP_STACK;
104
105 typedef struct {
106     StgHeader   header;
107     StgClosure *indirectee;
108 } StgInd;
109
110 typedef struct {
111     StgHeader   header;
112     StgClosure *indirectee;
113     StgMutClosure *mut_link;
114 } StgIndOldGen;
115
116 typedef struct {
117     StgHeader     header;
118     StgClosure   *indirectee;
119     StgClosure   *static_link;
120     struct _StgInfoTable *saved_info;
121 } StgIndStatic;
122
123 typedef struct {
124     StgHeader  header;
125     StgWord    words;
126     StgWord    payload[FLEXIBLE_ARRAY];
127 } StgArrWords;
128
129 typedef struct {
130     StgHeader   header;
131     StgWord     ptrs;
132     StgMutClosure *mut_link;    /* mutable list */
133     StgClosure *payload[FLEXIBLE_ARRAY];
134 } StgMutArrPtrs;
135
136 typedef struct {
137     StgHeader   header;
138     StgClosure *var;
139     StgMutClosure *mut_link;
140 } StgMutVar;
141
142 typedef struct _StgUpdateFrame {
143     StgHeader  header;
144     StgClosure *updatee;
145 } StgUpdateFrame;
146
147 typedef struct {
148     StgHeader  header;
149     StgInt      exceptions_blocked;
150     StgClosure *handler;
151 } StgCatchFrame;
152
153 typedef struct {
154     StgHeader  header;
155 } StgStopFrame;  
156
157 typedef struct {
158     StgHeader   header;
159     StgClosure *evacuee;
160 } StgEvacuated;
161
162 typedef struct {
163   StgHeader header;
164   StgWord data;
165 } StgIntCharlikeClosure;
166
167 /* statically allocated */
168 typedef struct {
169   StgHeader  header;
170 } StgRetry;
171
172 typedef struct _StgForeignObj {
173   StgHeader      header;
174   StgAddr        data;          /* pointer to data in non-haskell-land */
175 } StgForeignObj;
176   
177 typedef struct _StgStableName {
178   StgHeader      header;
179   StgWord        sn;
180 } StgStableName;
181
182 typedef struct _StgWeak {       /* Weak v */
183   StgHeader header;
184   StgClosure *key;
185   StgClosure *value;            /* v */
186   StgClosure *finalizer;
187   struct _StgWeak *link;
188 } StgWeak;
189
190 typedef struct _StgDeadWeak {   /* Weak v */
191   StgHeader header;
192   struct _StgWeak *link;
193 } StgDeadWeak;
194
195 /* Byte code objects.  These are fixed size objects with pointers to
196  * four arrays, designed so that a BCO can be easily "re-linked" to
197  * other BCOs, to facilitate GHC's intelligent recompilation.  The
198  * array of instructions is static and not re-generated when the BCO
199  * is re-linked, but the other 3 arrays will be regenerated.
200  *
201  * A BCO represents either a function or a stack frame.  In each case,
202  * it needs a bitmap to describe to the garbage collector the
203  * pointerhood of its arguments/free variables respectively, and in
204  * the case of a function it also needs an arity.  These are stored
205  * directly in the BCO, rather than in the instrs array, for two
206  * reasons:
207  * (a) speed: we need to get at the bitmap info quickly when
208  *     the GC is examining APs and PAPs that point to this BCO
209  * (b) a subtle interaction with the compacting GC.  In compacting
210  *     GC, the info that describes the size/layout of a closure
211  *     cannot be in an object more than one level of indirection
212  *     away from the current object, because of the order in
213  *     which pointers are updated to point to their new locations.
214  */
215
216 typedef struct {
217     StgHeader      header;
218     StgArrWords   *instrs;      // a pointer to an ArrWords
219     StgArrWords   *literals;    // a pointer to an ArrWords
220     StgMutArrPtrs *ptrs;        // a pointer to a  MutArrPtrs
221     StgArrWords   *itbls;       // a pointer to an ArrWords
222     StgHalfWord   arity;        // arity of this BCO
223     StgHalfWord   size;         // size of this BCO (in words)
224     StgWord       bitmap[FLEXIBLE_ARRAY];  // an StgLargeBitmap
225 } StgBCO;
226
227 #define BCO_BITMAP(bco)      ((StgLargeBitmap *)((StgBCO *)(bco))->bitmap)
228 #define BCO_BITMAP_SIZE(bco) (BCO_BITMAP(bco)->size)
229 #define BCO_BITMAP_BITS(bco) (BCO_BITMAP(bco)->bitmap)
230 #define BCO_BITMAP_SIZEW(bco) ((BCO_BITMAP_SIZE(bco) + BITS_IN(StgWord) - 1) \
231                                 / BITS_IN(StgWord))
232
233 /* -----------------------------------------------------------------------------
234    Dynamic stack frames for generic heap checks.
235
236    These generic heap checks are slow, but have the advantage of being
237    usable in a variety of situations.
238
239    The one restriction is that any relevant SRTs must already be pointed
240    to from the stack.  The return address doesn't need to have an info
241    table attached: hence it can be any old code pointer.
242
243    The liveness mask contains a 1 at bit n, if register Rn contains a
244    non-pointer.  The contents of all 8 vanilla registers are always saved
245    on the stack; the liveness mask tells the GC which ones contain
246    pointers.
247
248    Good places to use a generic heap check: 
249
250         - case alternatives (the return address with an SRT is already
251           on the stack).
252
253         - primitives (no SRT required).
254
255    The stack frame layout for a RET_DYN is like this:
256
257           some pointers         |-- RET_DYN_PTRS(liveness) words
258           some nonpointers      |-- RET_DYN_NONPTRS(liveness) words
259                                
260           L1                    \
261           D1-2                  |-- RET_DYN_NONPTR_REGS_SIZE words
262           F1-4                  /
263                                
264           R1-8                  |-- RET_DYN_BITMAP_SIZE words
265                                
266           return address        \
267           liveness mask         |-- StgRetDyn structure
268           stg_gen_chk_info      /
269
270    we assume that the size of a double is always 2 pointers (wasting a
271    word when it is only one pointer, but avoiding lots of #ifdefs).
272
273    See Liveness.h for the macros (RET_DYN_PTRS() etc.).
274
275    NOTE: if you change the layout of RET_DYN stack frames, then you
276    might also need to adjust the value of RESERVED_STACK_WORDS in
277    Constants.h.
278    -------------------------------------------------------------------------- */
279
280 typedef struct {
281     const struct _StgInfoTable* info;
282     StgWord        liveness;
283     StgWord        ret_addr;
284     StgClosure *   payload[FLEXIBLE_ARRAY];
285 } StgRetDyn;
286
287 /* A function return stack frame: used when saving the state for a
288  * garbage collection at a function entry point.  The function
289  * arguments are on the stack, and we also save the function (its
290  * info table describes the pointerhood of the arguments).
291  *
292  * The stack frame size is also cached in the frame for convenience.
293  */
294 typedef struct {
295     const struct _StgInfoTable* info;
296     StgWord        size;
297     StgClosure *   fun;
298     StgClosure *   payload[FLEXIBLE_ARRAY];
299 } StgRetFun;
300
301 /* Concurrent communication objects */
302
303 typedef struct {
304   StgHeader       header;
305   struct StgTSO_ *head;
306   StgMutClosure  *mut_link;
307   struct StgTSO_ *tail;
308   StgClosure*     value;
309 } StgMVar;
310
311 #if defined(PAR) || defined(GRAN)
312 /*
313   StgBlockingQueueElement is a ``collective type'' representing the types
314   of closures that can be found on a blocking queue: StgTSO, StgRBHSave,
315   StgBlockedFetch.  (StgRBHSave can only appear at the end of a blocking
316   queue).  Logically, this is a union type, but defining another struct
317   with a common layout is easier to handle in the code (same as for
318   StgMutClosures).  
319   Note that in the standard setup only StgTSOs can be on a blocking queue.
320   This is one of the main reasons for slightly different code in files
321   such as Schedule.c.
322 */
323 typedef struct StgBlockingQueueElement_ {
324   StgHeader                         header;
325   struct StgBlockingQueueElement_  *link;      /* next elem in BQ */
326   StgMutClosure                    *mut_link;  /* next elem in mutable list */
327   struct StgClosure_               *payload[FLEXIBLE_ARRAY];/* contents of the closure */
328 } StgBlockingQueueElement;
329
330 /* only difference to std code is type of the elem in the BQ */
331 typedef struct StgBlockingQueue_ {
332   StgHeader                 header;
333   struct StgBlockingQueueElement_ *blocking_queue; /* start of the BQ */
334   StgMutClosure            *mut_link;              /* next elem in mutable list */
335 } StgBlockingQueue;
336
337 /* this closure is hanging at the end of a blocking queue in (see RBH.c) */
338 typedef struct StgRBHSave_ {
339   StgHeader    header;
340   StgClosure  *payload[FLEXIBLE_ARRAY];     /* 2 words ripped out of the guts of the */
341 } StgRBHSave;                  /*  closure holding the blocking queue */
342  
343 typedef struct StgRBH_ {
344   StgHeader                         header;
345   struct StgBlockingQueueElement_  *blocking_queue; /* start of the BQ */
346   StgMutClosure                    *mut_link;       /* next elem in mutable list */
347 } StgRBH;
348
349 #else
350
351 typedef struct StgBlockingQueue_ {
352   StgHeader          header;
353   struct StgTSO_    *blocking_queue;
354   StgMutClosure     *mut_link;
355 } StgBlockingQueue;
356
357 #endif
358
359 #if defined(PAR)
360 /* global indirections aka FETCH_ME closures */
361 typedef struct StgFetchMe_ {
362   StgHeader              header;
363   globalAddr            *ga;        /* ptr to unique id for a closure */
364   StgMutClosure         *mut_link;  /* next elem in mutable list */
365 } StgFetchMe;
366
367 /* same contents as an ordinary StgBlockingQueue */
368 typedef struct StgFetchMeBlockingQueue_ {
369   StgHeader                          header;
370   struct StgBlockingQueueElement_   *blocking_queue; /* start of the BQ */
371   StgMutClosure                     *mut_link;       /* next elem in mutable list */
372 } StgFetchMeBlockingQueue;
373
374 /* This is an entry in a blocking queue. It indicates a fetch request from a 
375    TSO on another PE demanding the value of this closur. Note that a
376    StgBlockedFetch can only occur in a BQ. Once the node is evaluated and
377    updated with the result, the result will be sent back (the PE is encoded
378    in the globalAddr) and the StgBlockedFetch closure will be nuked.
379 */
380 typedef struct StgBlockedFetch_ {
381   StgHeader                         header;
382   struct StgBlockingQueueElement_  *link;     /* next elem in the BQ */
383   StgMutClosure                    *mut_link; /* next elem in mutable list */
384   StgClosure                       *node;     /* node to fetch */
385   globalAddr                        ga;       /* where to send the result to */
386 } StgBlockedFetch;                            /* NB: not just a ptr to a GA */
387 #endif
388
389 #endif /* CLOSURES_H */