root/rts/StgMiscClosures.cmm

Revision 5872bf5965d591536d7d9c9f9023c4966ac6ec31, 26.8 KB (checked in by Ian Lynagh <igloo@…>, 3 weeks ago)

Working towards fixing DLLs on Win64

  • Property mode set to 100644
Line 
1/* ----------------------------------------------------------------------------
2 *
3 * (c) The GHC Team, 1998-2004
4 *
5 * Entry code for various built-in closure types.
6 *
7 * This file is written in a subset of C--, extended with various
8 * features specific to GHC.  It is compiled by GHC directly.  For the
9 * syntax of .cmm files, see the parser in ghc/compiler/cmm/CmmParse.y.
10 *
11 * --------------------------------------------------------------------------*/
12
13#include "Cmm.h"
14
15import pthread_mutex_lock;
16import ghczmprim_GHCziTypes_Czh_static_info;
17import ghczmprim_GHCziTypes_Izh_static_info;
18import EnterCriticalSection;
19import LeaveCriticalSection;
20
21/* ----------------------------------------------------------------------------
22   Stack underflow
23   ------------------------------------------------------------------------- */
24
25INFO_TABLE_RET (stg_stack_underflow_frame, UNDERFLOW_FRAME, P_ unused)
26{
27    W_ new_tso;
28    W_ ret_off;
29
30    SAVE_THREAD_STATE();
31    ("ptr" ret_off) = foreign "C" threadStackUnderflow(MyCapability(),
32                                                       CurrentTSO);
33    LOAD_THREAD_STATE();
34
35    jump %ENTRY_CODE(Sp(ret_off));
36}
37
38/* ----------------------------------------------------------------------------
39   Restore a saved cost centre
40   ------------------------------------------------------------------------- */
41
42INFO_TABLE_RET (stg_restore_cccs, RET_SMALL, W_ cccs)
43{
44#if defined(PROFILING)
45    CCCS = Sp(1);
46#endif
47    Sp_adj(2);
48    jump %ENTRY_CODE(Sp(0));
49}
50
51/* ----------------------------------------------------------------------------
52   Support for the bytecode interpreter.
53   ------------------------------------------------------------------------- */
54
55/* 9 bits of return code for constructors created by the interpreter. */
56stg_interp_constr_entry
57{
58    /* R1 points at the constructor */
59    jump %ENTRY_CODE(Sp(0));
60}
61
62/* Some info tables to be used when compiled code returns a value to
63   the interpreter, i.e. the interpreter pushes one of these onto the
64   stack before entering a value.  What the code does is to
65   impedance-match the compiled return convention (in R1p/R1n/F1/D1 etc) to
66   the interpreter's convention (returned value is on top of stack),
67   and then cause the scheduler to enter the interpreter.
68
69   On entry, the stack (growing down) looks like this:
70
71      ptr to BCO holding return continuation
72      ptr to one of these info tables.
73
74   The info table code, both direct and vectored, must:
75      * push R1/F1/D1 on the stack, and its tag if necessary
76      * push the BCO (so it's now on the stack twice)
77      * Yield, ie, go to the scheduler.
78
79   Scheduler examines the t.o.s, discovers it is a BCO, and proceeds
80   directly to the bytecode interpreter.  That pops the top element
81   (the BCO, containing the return continuation), and interprets it.
82   Net result: return continuation gets interpreted, with the
83   following stack:
84
85      ptr to this BCO
86      ptr to the info table just jumped thru
87      return value
88
89   which is just what we want -- the "standard" return layout for the
90   interpreter.  Hurrah!
91
92   Don't ask me how unboxed tuple returns are supposed to work.  We
93   haven't got a good story about that yet.
94*/
95
96INFO_TABLE_RET( stg_ctoi_R1p, RET_BCO)
97{
98    Sp_adj(-2);
99    Sp(1) = R1;
100    Sp(0) = stg_enter_info;
101    jump stg_yield_to_interpreter;
102}
103
104/*
105 * When the returned value is a pointer, but unlifted, in R1 ...
106 */
107INFO_TABLE_RET( stg_ctoi_R1unpt, RET_BCO )
108{
109    Sp_adj(-2);
110    Sp(1) = R1;
111    Sp(0) = stg_gc_unpt_r1_info;
112    jump stg_yield_to_interpreter;
113}
114
115/*
116 * When the returned value is a non-pointer in R1 ...
117 */
118INFO_TABLE_RET( stg_ctoi_R1n, RET_BCO )
119{
120    Sp_adj(-2);
121    Sp(1) = R1;
122    Sp(0) = stg_gc_unbx_r1_info;
123    jump stg_yield_to_interpreter;
124}
125
126/*
127 * When the returned value is in F1
128 */
129INFO_TABLE_RET( stg_ctoi_F1, RET_BCO )
130{
131    Sp_adj(-2);
132    F_[Sp + WDS(1)] = F1;
133    Sp(0) = stg_gc_f1_info;
134    jump stg_yield_to_interpreter;
135}
136
137/*
138 * When the returned value is in D1
139 */
140INFO_TABLE_RET( stg_ctoi_D1, RET_BCO )
141{
142    Sp_adj(-1) - SIZEOF_DOUBLE;
143    D_[Sp + WDS(1)] = D1;
144    Sp(0) = stg_gc_d1_info;
145    jump stg_yield_to_interpreter;
146}
147
148/*
149 * When the returned value is in L1
150 */
151INFO_TABLE_RET( stg_ctoi_L1, RET_BCO )
152{
153    Sp_adj(-1) - 8;
154    L_[Sp + WDS(1)] = L1;
155    Sp(0) = stg_gc_l1_info;
156    jump stg_yield_to_interpreter;
157}
158
159/*
160 * When the returned value is a void
161 */
162INFO_TABLE_RET( stg_ctoi_V, RET_BCO )
163{
164    Sp_adj(-1);
165    Sp(0) = stg_gc_void_info;
166    jump stg_yield_to_interpreter;
167}
168
169/*
170 * Dummy info table pushed on the top of the stack when the interpreter
171 * should apply the BCO on the stack to its arguments, also on the
172 * stack.
173 */
174INFO_TABLE_RET( stg_apply_interp, RET_BCO )
175{
176    /* Just in case we end up in here... (we shouldn't) */
177    jump stg_yield_to_interpreter;
178}
179
180/* ----------------------------------------------------------------------------
181   Entry code for a BCO
182   ------------------------------------------------------------------------- */
183
184INFO_TABLE_FUN( stg_BCO, 4, 0, BCO, "BCO", "BCO", ARG_BCO )
185{
186  /* entering a BCO means "apply it", same as a function */
187  Sp_adj(-2);
188  Sp(1) = R1;
189  Sp(0) = stg_apply_interp_info;
190  jump stg_yield_to_interpreter;
191}
192
193/* ----------------------------------------------------------------------------
194   Info tables for indirections.
195
196   SPECIALISED INDIRECTIONS: we have a specialised indirection for direct returns,
197   so that we can avoid entering
198   the object when we know it points directly to a value.  The update
199   code (Updates.cmm) updates objects with the appropriate kind of
200   indirection.  We only do this for young-gen indirections.
201   ------------------------------------------------------------------------- */
202
203INFO_TABLE(stg_IND,1,0,IND,"IND","IND")
204{
205    TICK_ENT_DYN_IND(); /* tick */
206    R1 = UNTAG(StgInd_indirectee(R1));
207    TICK_ENT_VIA_NODE();
208    jump %GET_ENTRY(R1);
209}
210
211INFO_TABLE(stg_IND_direct,1,0,IND,"IND","IND")
212{
213    TICK_ENT_DYN_IND(); /* tick */
214    R1 = StgInd_indirectee(R1);
215    TICK_ENT_VIA_NODE();
216    jump %ENTRY_CODE(Sp(0));
217}
218
219INFO_TABLE(stg_IND_STATIC,1,0,IND_STATIC,"IND_STATIC","IND_STATIC")
220{
221    TICK_ENT_STATIC_IND(); /* tick */
222    R1 = UNTAG(StgInd_indirectee(R1));
223    TICK_ENT_VIA_NODE();
224    jump %GET_ENTRY(R1);
225}
226
227INFO_TABLE(stg_IND_PERM,1,0,IND_PERM,"IND_PERM","IND_PERM")
228{
229    /* Don't add INDs to granularity cost */
230
231    /* Don't: TICK_ENT_STATIC_IND(Node); for ticky-ticky; this ind is
232       here only to help profiling */
233
234#if defined(TICKY_TICKY) && !defined(PROFILING)
235    /* TICKY_TICKY && !PROFILING means PERM_IND *replaces* an IND, rather than
236       being extra  */
237    TICK_ENT_PERM_IND();
238#endif
239
240    LDV_ENTER(R1);
241
242    /* For ticky-ticky, change the perm_ind to a normal ind on first
243     * entry, so the number of ent_perm_inds is the number of *thunks*
244     * entered again, not the number of subsequent entries.
245     *
246     * Since this screws up cost centres, we die if profiling and
247     * ticky_ticky are on at the same time.  KSW 1999-01.
248     */
249#ifdef TICKY_TICKY
250#  ifdef PROFILING
251#    error Profiling and ticky-ticky do not mix at present!
252#  endif  /* PROFILING */
253    StgHeader_info(R1) = stg_IND_info;
254#endif /* TICKY_TICKY */
255
256    R1 = UNTAG(StgInd_indirectee(R1));
257
258#if defined(TICKY_TICKY) && !defined(PROFILING)
259    TICK_ENT_VIA_NODE();
260#endif
261
262    jump %GET_ENTRY(R1);
263}
264
265/* ----------------------------------------------------------------------------
266   Black holes.
267
268   Entering a black hole normally causes a cyclic data dependency, but
269   in the concurrent world, black holes are synchronization points,
270   and they are turned into blocking queues when there are threads
271   waiting for the evaluation of the closure to finish.
272   ------------------------------------------------------------------------- */
273
274INFO_TABLE(stg_BLACKHOLE,1,0,BLACKHOLE,"BLACKHOLE","BLACKHOLE")
275{
276    W_ r, p, info, bq, msg, owner, bd;
277
278    TICK_ENT_DYN_IND(); /* tick */
279
280retry:
281    p = StgInd_indirectee(R1);
282    if (GETTAG(p) != 0) {
283        R1 = p;
284        jump %ENTRY_CODE(Sp(0));
285    }
286
287    info = StgHeader_info(p);
288    if (info == stg_IND_info) {
289        // This could happen, if e.g. we got a BLOCKING_QUEUE that has
290        // just been replaced with an IND by another thread in
291        // wakeBlockingQueue().
292        goto retry;
293    }
294
295    if (info == stg_TSO_info ||
296        info == stg_BLOCKING_QUEUE_CLEAN_info ||
297        info == stg_BLOCKING_QUEUE_DIRTY_info)
298    {
299        ("ptr" msg) = foreign "C" allocate(MyCapability() "ptr",
300                                           BYTES_TO_WDS(SIZEOF_MessageBlackHole)) [R1];
301
302        SET_HDR(msg, stg_MSG_BLACKHOLE_info, CCS_SYSTEM);
303        MessageBlackHole_tso(msg) = CurrentTSO;
304        MessageBlackHole_bh(msg) = R1;
305
306        (r) = foreign "C" messageBlackHole(MyCapability() "ptr", msg "ptr") [R1];
307
308        if (r == 0) {
309            goto retry;
310        } else {
311            StgTSO_why_blocked(CurrentTSO) = BlockedOnBlackHole::I16;
312            StgTSO_block_info(CurrentTSO) = msg;
313            jump stg_block_blackhole;
314        }
315    }
316    else
317    {
318        R1 = p;
319        ENTER();
320    }
321}
322
323INFO_TABLE(__stg_EAGER_BLACKHOLE,1,0,BLACKHOLE,"BLACKHOLE","BLACKHOLE")
324{
325    jump ENTRY_LBL(stg_BLACKHOLE);
326}
327
328// CAF_BLACKHOLE is allocated when entering a CAF.  The reason it is
329// distinct from BLACKHOLE is so that we can tell the difference
330// between an update frame on the stack that points to a CAF under
331// evaluation, and one that points to a closure that is under
332// evaluation by another thread (a BLACKHOLE).  See threadPaused().
333//
334INFO_TABLE(stg_CAF_BLACKHOLE,1,0,BLACKHOLE,"BLACKHOLE","BLACKHOLE")
335{
336    jump ENTRY_LBL(stg_BLACKHOLE);
337}
338
339INFO_TABLE(stg_BLOCKING_QUEUE_CLEAN,4,0,BLOCKING_QUEUE,"BLOCKING_QUEUE","BLOCKING_QUEUE")
340{ foreign "C" barf("BLOCKING_QUEUE_CLEAN object entered!") never returns; }
341
342
343INFO_TABLE(stg_BLOCKING_QUEUE_DIRTY,4,0,BLOCKING_QUEUE,"BLOCKING_QUEUE","BLOCKING_QUEUE")
344{ foreign "C" barf("BLOCKING_QUEUE_DIRTY object entered!") never returns; }
345
346
347/* ----------------------------------------------------------------------------
348   Whiteholes are used for the "locked" state of a closure (see lockClosure())
349   ------------------------------------------------------------------------- */
350
351INFO_TABLE(stg_WHITEHOLE, 0,0, WHITEHOLE, "WHITEHOLE", "WHITEHOLE")
352{
353#if defined(THREADED_RTS)
354    W_ info, i;
355
356    i = 0;
357loop:
358    // spin until the WHITEHOLE is updated
359    info = StgHeader_info(R1);
360    if (info == stg_WHITEHOLE_info) {
361        i = i + 1;
362        if (i == SPIN_COUNT) {
363            i = 0;
364            foreign "C" yieldThread() [R1];
365        }
366        goto loop;
367    }
368    jump %ENTRY_CODE(info);
369#else
370    foreign "C" barf("WHITEHOLE object entered!") never returns;
371#endif
372}
373
374/* ----------------------------------------------------------------------------
375   Some static info tables for things that don't get entered, and
376   therefore don't need entry code (i.e. boxed but unpointed objects)
377   NON_ENTERABLE_ENTRY_CODE now defined at the beginning of the file
378   ------------------------------------------------------------------------- */
379
380INFO_TABLE(stg_TSO, 0,0,TSO, "TSO", "TSO")
381{ foreign "C" barf("TSO object entered!") never returns; }
382
383INFO_TABLE(stg_STACK, 0,0, STACK, "STACK", "STACK")
384{ foreign "C" barf("STACK object entered!") never returns; }
385
386/* ----------------------------------------------------------------------------
387   Weak pointers
388
389   Live weak pointers have a special closure type.  Dead ones are just
390   nullary constructors (although they live on the heap - we overwrite
391   live weak pointers with dead ones).
392   ------------------------------------------------------------------------- */
393
394INFO_TABLE(stg_WEAK,1,4,WEAK,"WEAK","WEAK")
395{ foreign "C" barf("WEAK object entered!") never returns; }
396
397/*
398 * It's important when turning an existing WEAK into a DEAD_WEAK
399 * (which is what finalizeWeak# does) that we don't lose the link
400 * field and break the linked list of weak pointers.  Hence, we give
401 * DEAD_WEAK 5 non-pointer fields.
402 */
403INFO_TABLE_CONSTR(stg_DEAD_WEAK,0,5,0,CONSTR,"DEAD_WEAK","DEAD_WEAK")
404{ foreign "C" barf("DEAD_WEAK object entered!") never returns; }
405
406/* ----------------------------------------------------------------------------
407   NO_FINALIZER
408
409   This is a static nullary constructor (like []) that we use to mark an empty
410   finalizer in a weak pointer object.
411   ------------------------------------------------------------------------- */
412
413INFO_TABLE_CONSTR(stg_NO_FINALIZER,0,0,0,CONSTR_NOCAF_STATIC,"NO_FINALIZER","NO_FINALIZER")
414{ foreign "C" barf("NO_FINALIZER object entered!") never returns; }
415
416CLOSURE(stg_NO_FINALIZER_closure,stg_NO_FINALIZER);
417
418/* ----------------------------------------------------------------------------
419   Stable Names are unlifted too.
420   ------------------------------------------------------------------------- */
421
422INFO_TABLE(stg_STABLE_NAME,0,1,PRIM,"STABLE_NAME","STABLE_NAME")
423{ foreign "C" barf("STABLE_NAME object entered!") never returns; }
424
425/* ----------------------------------------------------------------------------
426   MVars
427
428   There are two kinds of these: full and empty.  We need an info table
429   and entry code for each type.
430   ------------------------------------------------------------------------- */
431
432INFO_TABLE(stg_MVAR_CLEAN,3,0,MVAR_CLEAN,"MVAR","MVAR")
433{ foreign "C" barf("MVAR object entered!") never returns; }
434
435INFO_TABLE(stg_MVAR_DIRTY,3,0,MVAR_DIRTY,"MVAR","MVAR")
436{ foreign "C" barf("MVAR object entered!") never returns; }
437
438/* -----------------------------------------------------------------------------
439   STM
440   -------------------------------------------------------------------------- */
441
442INFO_TABLE(stg_TVAR, 2, 1, MUT_PRIM, "TVAR", "TVAR")
443{ foreign "C" barf("TVAR object entered!") never returns; }
444
445INFO_TABLE(stg_TVAR_WATCH_QUEUE, 3, 0, MUT_PRIM, "TVAR_WATCH_QUEUE", "TVAR_WATCH_QUEUE")
446{ foreign "C" barf("TVAR_WATCH_QUEUE object entered!") never returns; }
447
448INFO_TABLE(stg_ATOMIC_INVARIANT, 2, 1, MUT_PRIM, "ATOMIC_INVARIANT", "ATOMIC_INVARIANT")
449{ foreign "C" barf("ATOMIC_INVARIANT object entered!") never returns; }
450
451INFO_TABLE(stg_INVARIANT_CHECK_QUEUE, 3, 0, MUT_PRIM, "INVARIANT_CHECK_QUEUE", "INVARIANT_CHECK_QUEUE")
452{ foreign "C" barf("INVARIANT_CHECK_QUEUE object entered!") never returns; }
453
454INFO_TABLE(stg_TREC_CHUNK, 0, 0, TREC_CHUNK, "TREC_CHUNK", "TREC_CHUNK")
455{ foreign "C" barf("TREC_CHUNK object entered!") never returns; }
456
457INFO_TABLE(stg_TREC_HEADER, 3, 1, MUT_PRIM, "TREC_HEADER", "TREC_HEADER")
458{ foreign "C" barf("TREC_HEADER object entered!") never returns; }
459
460INFO_TABLE_CONSTR(stg_END_STM_WATCH_QUEUE,0,0,0,CONSTR_NOCAF_STATIC,"END_STM_WATCH_QUEUE","END_STM_WATCH_QUEUE")
461{ foreign "C" barf("END_STM_WATCH_QUEUE object entered!") never returns; }
462
463INFO_TABLE_CONSTR(stg_END_INVARIANT_CHECK_QUEUE,0,0,0,CONSTR_NOCAF_STATIC,"END_INVARIANT_CHECK_QUEUE","END_INVARIANT_CHECK_QUEUE")
464{ foreign "C" barf("END_INVARIANT_CHECK_QUEUE object entered!") never returns; }
465
466INFO_TABLE_CONSTR(stg_END_STM_CHUNK_LIST,0,0,0,CONSTR_NOCAF_STATIC,"END_STM_CHUNK_LIST","END_STM_CHUNK_LIST")
467{ foreign "C" barf("END_STM_CHUNK_LIST object entered!") never returns; }
468
469INFO_TABLE_CONSTR(stg_NO_TREC,0,0,0,CONSTR_NOCAF_STATIC,"NO_TREC","NO_TREC")
470{ foreign "C" barf("NO_TREC object entered!") never returns; }
471
472CLOSURE(stg_END_STM_WATCH_QUEUE_closure,stg_END_STM_WATCH_QUEUE);
473
474CLOSURE(stg_END_INVARIANT_CHECK_QUEUE_closure,stg_END_INVARIANT_CHECK_QUEUE);
475
476CLOSURE(stg_END_STM_CHUNK_LIST_closure,stg_END_STM_CHUNK_LIST);
477
478CLOSURE(stg_NO_TREC_closure,stg_NO_TREC);
479
480/* ----------------------------------------------------------------------------
481   Messages
482   ------------------------------------------------------------------------- */
483
484// PRIM rather than CONSTR, because PRIM objects cannot be duplicated by the GC.
485
486INFO_TABLE_CONSTR(stg_MSG_TRY_WAKEUP,2,0,0,PRIM,"MSG_TRY_WAKEUP","MSG_TRY_WAKEUP")
487{ foreign "C" barf("MSG_TRY_WAKEUP object entered!") never returns; }
488
489INFO_TABLE_CONSTR(stg_MSG_THROWTO,4,0,0,PRIM,"MSG_THROWTO","MSG_THROWTO")
490{ foreign "C" barf("MSG_THROWTO object entered!") never returns; }
491
492INFO_TABLE_CONSTR(stg_MSG_BLACKHOLE,3,0,0,PRIM,"MSG_BLACKHOLE","MSG_BLACKHOLE")
493{ foreign "C" barf("MSG_BLACKHOLE object entered!") never returns; }
494
495// used to overwrite a MSG_THROWTO when the message has been used/revoked
496INFO_TABLE_CONSTR(stg_MSG_NULL,1,0,0,PRIM,"MSG_NULL","MSG_NULL")
497{ foreign "C" barf("MSG_NULL object entered!") never returns; }
498
499/* ----------------------------------------------------------------------------
500   END_TSO_QUEUE
501
502   This is a static nullary constructor (like []) that we use to mark the
503   end of a linked TSO queue.
504   ------------------------------------------------------------------------- */
505
506INFO_TABLE_CONSTR(stg_END_TSO_QUEUE,0,0,0,CONSTR_NOCAF_STATIC,"END_TSO_QUEUE","END_TSO_QUEUE")
507{ foreign "C" barf("END_TSO_QUEUE object entered!") never returns; }
508
509CLOSURE(stg_END_TSO_QUEUE_closure,stg_END_TSO_QUEUE);
510
511/* ----------------------------------------------------------------------------
512   Arrays
513
514   These come in two basic flavours: arrays of data (StgArrWords) and arrays of
515   pointers (StgArrPtrs).  They all have a similar layout:
516
517   ___________________________
518   | Info | No. of | data....
519        |  Ptr | Words  |
520   ---------------------------
521
522   These are *unpointed* objects: i.e. they cannot be entered.
523
524   ------------------------------------------------------------------------- */
525
526INFO_TABLE(stg_ARR_WORDS, 0, 0, ARR_WORDS, "ARR_WORDS", "ARR_WORDS")
527{ foreign "C" barf("ARR_WORDS object entered!") never returns; }
528
529INFO_TABLE(stg_MUT_ARR_PTRS_CLEAN, 0, 0, MUT_ARR_PTRS_CLEAN, "MUT_ARR_PTRS_CLEAN", "MUT_ARR_PTRS_CLEAN")
530{ foreign "C" barf("MUT_ARR_PTRS_CLEAN object entered!") never returns; }
531
532INFO_TABLE(stg_MUT_ARR_PTRS_DIRTY, 0, 0, MUT_ARR_PTRS_DIRTY, "MUT_ARR_PTRS_DIRTY", "MUT_ARR_PTRS_DIRTY")
533{ foreign "C" barf("MUT_ARR_PTRS_DIRTY object entered!") never returns; }
534
535INFO_TABLE(stg_MUT_ARR_PTRS_FROZEN, 0, 0, MUT_ARR_PTRS_FROZEN, "MUT_ARR_PTRS_FROZEN", "MUT_ARR_PTRS_FROZEN")
536{ foreign "C" barf("MUT_ARR_PTRS_FROZEN object entered!") never returns; }
537
538INFO_TABLE(stg_MUT_ARR_PTRS_FROZEN0, 0, 0, MUT_ARR_PTRS_FROZEN0, "MUT_ARR_PTRS_FROZEN0", "MUT_ARR_PTRS_FROZEN0")
539{ foreign "C" barf("MUT_ARR_PTRS_FROZEN0 object entered!") never returns; }
540
541/* ----------------------------------------------------------------------------
542   Mutable Variables
543   ------------------------------------------------------------------------- */
544
545INFO_TABLE(stg_MUT_VAR_CLEAN, 1, 0, MUT_VAR_CLEAN, "MUT_VAR_CLEAN", "MUT_VAR_CLEAN")
546{ foreign "C" barf("MUT_VAR_CLEAN object entered!") never returns; }
547INFO_TABLE(stg_MUT_VAR_DIRTY, 1, 0, MUT_VAR_DIRTY, "MUT_VAR_DIRTY", "MUT_VAR_DIRTY")
548{ foreign "C" barf("MUT_VAR_DIRTY object entered!") never returns; }
549
550/* ----------------------------------------------------------------------------
551   Dummy return closure
552
553   Entering this closure will just return to the address on the top of the
554   stack.  Useful for getting a thread in a canonical form where we can
555   just enter the top stack word to start the thread.  (see deleteThread)
556 * ------------------------------------------------------------------------- */
557
558INFO_TABLE( stg_dummy_ret, 0, 0, CONSTR_NOCAF_STATIC, "DUMMY_RET", "DUMMY_RET")
559{
560  jump %ENTRY_CODE(Sp(0));
561}
562CLOSURE(stg_dummy_ret_closure,stg_dummy_ret);
563
564/* ----------------------------------------------------------------------------
565   MVAR_TSO_QUEUE
566   ------------------------------------------------------------------------- */
567
568INFO_TABLE_CONSTR(stg_MVAR_TSO_QUEUE,2,0,0,PRIM,"MVAR_TSO_QUEUE","MVAR_TSO_QUEUE")
569{ foreign "C" barf("MVAR_TSO_QUEUE object entered!") never returns; }
570
571/* ----------------------------------------------------------------------------
572   CHARLIKE and INTLIKE closures.
573
574   These are static representations of Chars and small Ints, so that
575   we can remove dynamic Chars and Ints during garbage collection and
576   replace them with references to the static objects.
577   ------------------------------------------------------------------------- */
578
579#if defined(COMPILING_WINDOWS_DLL)
580/*
581 * When sticking the RTS in a Windows DLL, we delay populating the
582 * Charlike and Intlike tables until load-time, which is only
583 * when we've got the real addresses to the C# and I# closures.
584 *
585 * -- this is currently broken BL 2009/11/14.
586 *    we don't rewrite to static closures at all with Windows DLLs.
587 */
588// #warning Is this correct? _imp is a pointer!
589#define Char_hash_static_info _imp__ghczmprim_GHCziTypes_Czh_static_info
590#define Int_hash_static_info _imp__ghczmprim_GHCziTypes_Izh_static_info
591#else
592#define Char_hash_static_info ghczmprim_GHCziTypes_Czh_static_info
593#define Int_hash_static_info ghczmprim_GHCziTypes_Izh_static_info
594#endif
595
596
597#define CHARLIKE_HDR(n)  CLOSURE(Char_hash_static_info, n)
598#define INTLIKE_HDR(n)   CLOSURE(Int_hash_static_info, n)
599
600/* put these in the *data* section, since the garbage collector relies
601 * on the fact that static closures live in the data section.
602 */
603
604#if !(defined(COMPILING_WINDOWS_DLL))
605section "data" {
606 stg_CHARLIKE_closure:
607    CHARLIKE_HDR(0)
608    CHARLIKE_HDR(1)
609    CHARLIKE_HDR(2)
610    CHARLIKE_HDR(3)
611    CHARLIKE_HDR(4)
612    CHARLIKE_HDR(5)
613    CHARLIKE_HDR(6)
614    CHARLIKE_HDR(7)
615    CHARLIKE_HDR(8)
616    CHARLIKE_HDR(9)
617    CHARLIKE_HDR(10)
618    CHARLIKE_HDR(11)
619    CHARLIKE_HDR(12)
620    CHARLIKE_HDR(13)
621    CHARLIKE_HDR(14)
622    CHARLIKE_HDR(15)
623    CHARLIKE_HDR(16)
624    CHARLIKE_HDR(17)
625    CHARLIKE_HDR(18)
626    CHARLIKE_HDR(19)
627    CHARLIKE_HDR(20)
628    CHARLIKE_HDR(21)
629    CHARLIKE_HDR(22)
630    CHARLIKE_HDR(23)
631    CHARLIKE_HDR(24)
632    CHARLIKE_HDR(25)
633    CHARLIKE_HDR(26)
634    CHARLIKE_HDR(27)
635    CHARLIKE_HDR(28)
636    CHARLIKE_HDR(29)
637    CHARLIKE_HDR(30)
638    CHARLIKE_HDR(31)
639    CHARLIKE_HDR(32)
640    CHARLIKE_HDR(33)
641    CHARLIKE_HDR(34)
642    CHARLIKE_HDR(35)
643    CHARLIKE_HDR(36)
644    CHARLIKE_HDR(37)
645    CHARLIKE_HDR(38)
646    CHARLIKE_HDR(39)
647    CHARLIKE_HDR(40)
648    CHARLIKE_HDR(41)
649    CHARLIKE_HDR(42)
650    CHARLIKE_HDR(43)
651    CHARLIKE_HDR(44)
652    CHARLIKE_HDR(45)
653    CHARLIKE_HDR(46)
654    CHARLIKE_HDR(47)
655    CHARLIKE_HDR(48)
656    CHARLIKE_HDR(49)
657    CHARLIKE_HDR(50)
658    CHARLIKE_HDR(51)
659    CHARLIKE_HDR(52)
660    CHARLIKE_HDR(53)
661    CHARLIKE_HDR(54)
662    CHARLIKE_HDR(55)
663    CHARLIKE_HDR(56)
664    CHARLIKE_HDR(57)
665    CHARLIKE_HDR(58)
666    CHARLIKE_HDR(59)
667    CHARLIKE_HDR(60)
668    CHARLIKE_HDR(61)
669    CHARLIKE_HDR(62)
670    CHARLIKE_HDR(63)
671    CHARLIKE_HDR(64)
672    CHARLIKE_HDR(65)
673    CHARLIKE_HDR(66)
674    CHARLIKE_HDR(67)
675    CHARLIKE_HDR(68)
676    CHARLIKE_HDR(69)
677    CHARLIKE_HDR(70)
678    CHARLIKE_HDR(71)
679    CHARLIKE_HDR(72)
680    CHARLIKE_HDR(73)
681    CHARLIKE_HDR(74)
682    CHARLIKE_HDR(75)
683    CHARLIKE_HDR(76)
684    CHARLIKE_HDR(77)
685    CHARLIKE_HDR(78)
686    CHARLIKE_HDR(79)
687    CHARLIKE_HDR(80)
688    CHARLIKE_HDR(81)
689    CHARLIKE_HDR(82)
690    CHARLIKE_HDR(83)
691    CHARLIKE_HDR(84)
692    CHARLIKE_HDR(85)
693    CHARLIKE_HDR(86)
694    CHARLIKE_HDR(87)
695    CHARLIKE_HDR(88)
696    CHARLIKE_HDR(89)
697    CHARLIKE_HDR(90)
698    CHARLIKE_HDR(91)
699    CHARLIKE_HDR(92)
700    CHARLIKE_HDR(93)
701    CHARLIKE_HDR(94)
702    CHARLIKE_HDR(95)
703    CHARLIKE_HDR(96)
704    CHARLIKE_HDR(97)
705    CHARLIKE_HDR(98)
706    CHARLIKE_HDR(99)
707    CHARLIKE_HDR(100)
708    CHARLIKE_HDR(101)
709    CHARLIKE_HDR(102)
710    CHARLIKE_HDR(103)
711    CHARLIKE_HDR(104)
712    CHARLIKE_HDR(105)
713    CHARLIKE_HDR(106)
714    CHARLIKE_HDR(107)
715    CHARLIKE_HDR(108)
716    CHARLIKE_HDR(109)
717    CHARLIKE_HDR(110)
718    CHARLIKE_HDR(111)
719    CHARLIKE_HDR(112)
720    CHARLIKE_HDR(113)
721    CHARLIKE_HDR(114)
722    CHARLIKE_HDR(115)
723    CHARLIKE_HDR(116)
724    CHARLIKE_HDR(117)
725    CHARLIKE_HDR(118)
726    CHARLIKE_HDR(119)
727    CHARLIKE_HDR(120)
728    CHARLIKE_HDR(121)
729    CHARLIKE_HDR(122)
730    CHARLIKE_HDR(123)
731    CHARLIKE_HDR(124)
732    CHARLIKE_HDR(125)
733    CHARLIKE_HDR(126)
734    CHARLIKE_HDR(127)
735    CHARLIKE_HDR(128)
736    CHARLIKE_HDR(129)
737    CHARLIKE_HDR(130)
738    CHARLIKE_HDR(131)
739    CHARLIKE_HDR(132)
740    CHARLIKE_HDR(133)
741    CHARLIKE_HDR(134)
742    CHARLIKE_HDR(135)
743    CHARLIKE_HDR(136)
744    CHARLIKE_HDR(137)
745    CHARLIKE_HDR(138)
746    CHARLIKE_HDR(139)
747    CHARLIKE_HDR(140)
748    CHARLIKE_HDR(141)
749    CHARLIKE_HDR(142)
750    CHARLIKE_HDR(143)
751    CHARLIKE_HDR(144)
752    CHARLIKE_HDR(145)
753    CHARLIKE_HDR(146)
754    CHARLIKE_HDR(147)
755    CHARLIKE_HDR(148)
756    CHARLIKE_HDR(149)
757    CHARLIKE_HDR(150)
758    CHARLIKE_HDR(151)
759    CHARLIKE_HDR(152)
760    CHARLIKE_HDR(153)
761    CHARLIKE_HDR(154)
762    CHARLIKE_HDR(155)
763    CHARLIKE_HDR(156)
764    CHARLIKE_HDR(157)
765    CHARLIKE_HDR(158)
766    CHARLIKE_HDR(159)
767    CHARLIKE_HDR(160)
768    CHARLIKE_HDR(161)
769    CHARLIKE_HDR(162)
770    CHARLIKE_HDR(163)
771    CHARLIKE_HDR(164)
772    CHARLIKE_HDR(165)
773    CHARLIKE_HDR(166)
774    CHARLIKE_HDR(167)
775    CHARLIKE_HDR(168)
776    CHARLIKE_HDR(169)
777    CHARLIKE_HDR(170)
778    CHARLIKE_HDR(171)
779    CHARLIKE_HDR(172)
780    CHARLIKE_HDR(173)
781    CHARLIKE_HDR(174)
782    CHARLIKE_HDR(175)
783    CHARLIKE_HDR(176)
784    CHARLIKE_HDR(177)
785    CHARLIKE_HDR(178)
786    CHARLIKE_HDR(179)
787    CHARLIKE_HDR(180)
788    CHARLIKE_HDR(181)
789    CHARLIKE_HDR(182)
790    CHARLIKE_HDR(183)
791    CHARLIKE_HDR(184)
792    CHARLIKE_HDR(185)
793    CHARLIKE_HDR(186)
794    CHARLIKE_HDR(187)
795    CHARLIKE_HDR(188)
796    CHARLIKE_HDR(189)
797    CHARLIKE_HDR(190)
798    CHARLIKE_HDR(191)
799    CHARLIKE_HDR(192)
800    CHARLIKE_HDR(193)
801    CHARLIKE_HDR(194)
802    CHARLIKE_HDR(195)
803    CHARLIKE_HDR(196)
804    CHARLIKE_HDR(197)
805    CHARLIKE_HDR(198)
806    CHARLIKE_HDR(199)
807    CHARLIKE_HDR(200)
808    CHARLIKE_HDR(201)
809    CHARLIKE_HDR(202)
810    CHARLIKE_HDR(203)
811    CHARLIKE_HDR(204)
812    CHARLIKE_HDR(205)
813    CHARLIKE_HDR(206)
814    CHARLIKE_HDR(207)
815    CHARLIKE_HDR(208)
816    CHARLIKE_HDR(209)
817    CHARLIKE_HDR(210)
818    CHARLIKE_HDR(211)
819    CHARLIKE_HDR(212)
820    CHARLIKE_HDR(213)
821    CHARLIKE_HDR(214)
822    CHARLIKE_HDR(215)
823    CHARLIKE_HDR(216)
824    CHARLIKE_HDR(217)
825    CHARLIKE_HDR(218)
826    CHARLIKE_HDR(219)
827    CHARLIKE_HDR(220)
828    CHARLIKE_HDR(221)
829    CHARLIKE_HDR(222)
830    CHARLIKE_HDR(223)
831    CHARLIKE_HDR(224)
832    CHARLIKE_HDR(225)
833    CHARLIKE_HDR(226)
834    CHARLIKE_HDR(227)
835    CHARLIKE_HDR(228)
836    CHARLIKE_HDR(229)
837    CHARLIKE_HDR(230)
838    CHARLIKE_HDR(231)
839    CHARLIKE_HDR(232)
840    CHARLIKE_HDR(233)
841    CHARLIKE_HDR(234)
842    CHARLIKE_HDR(235)
843    CHARLIKE_HDR(236)
844    CHARLIKE_HDR(237)
845    CHARLIKE_HDR(238)
846    CHARLIKE_HDR(239)
847    CHARLIKE_HDR(240)
848    CHARLIKE_HDR(241)
849    CHARLIKE_HDR(242)
850    CHARLIKE_HDR(243)
851    CHARLIKE_HDR(244)
852    CHARLIKE_HDR(245)
853    CHARLIKE_HDR(246)
854    CHARLIKE_HDR(247)
855    CHARLIKE_HDR(248)
856    CHARLIKE_HDR(249)
857    CHARLIKE_HDR(250)
858    CHARLIKE_HDR(251)
859    CHARLIKE_HDR(252)
860    CHARLIKE_HDR(253)
861    CHARLIKE_HDR(254)
862    CHARLIKE_HDR(255)
863}
864
865section "data" {
866 stg_INTLIKE_closure:
867    INTLIKE_HDR(-16) /* MIN_INTLIKE == -16 */
868    INTLIKE_HDR(-15)
869    INTLIKE_HDR(-14)
870    INTLIKE_HDR(-13)
871    INTLIKE_HDR(-12)
872    INTLIKE_HDR(-11)
873    INTLIKE_HDR(-10)
874    INTLIKE_HDR(-9)
875    INTLIKE_HDR(-8)
876    INTLIKE_HDR(-7)
877    INTLIKE_HDR(-6)
878    INTLIKE_HDR(-5)
879    INTLIKE_HDR(-4)
880    INTLIKE_HDR(-3)
881    INTLIKE_HDR(-2)
882    INTLIKE_HDR(-1)
883    INTLIKE_HDR(0)
884    INTLIKE_HDR(1)
885    INTLIKE_HDR(2)
886    INTLIKE_HDR(3)
887    INTLIKE_HDR(4)
888    INTLIKE_HDR(5)
889    INTLIKE_HDR(6)
890    INTLIKE_HDR(7)
891    INTLIKE_HDR(8)
892    INTLIKE_HDR(9)
893    INTLIKE_HDR(10)
894    INTLIKE_HDR(11)
895    INTLIKE_HDR(12)
896    INTLIKE_HDR(13)
897    INTLIKE_HDR(14)
898    INTLIKE_HDR(15)
899    INTLIKE_HDR(16)  /* MAX_INTLIKE == 16 */
900}
901
902#endif
Note: See TracBrowser for help on using the browser.