Improve accuracy of get/setAllocationCounter
[ghc.git] / includes / stg / MiscClosures.h
1 /* ----------------------------------------------------------------------------
2 *
3 * (c) The GHC Team, 1998-2009
4 *
5 * Declarations for various symbols exported by the RTS.
6 *
7 * ToDo: many of the symbols in here don't need to be exported, but
8 * our Cmm code generator doesn't know how to generate local symbols
9 * for the RTS bits (it assumes all RTS symbols are external).
10 *
11 * See wiki:Commentary/Compiler/Backends/PprC#Prototypes
12 *
13 * Do not #include this file directly: #include "Rts.h" instead.
14 *
15 * To understand the structure of the RTS headers, see the wiki:
16 * http://ghc.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes
17 *
18 * --------------------------------------------------------------------------*/
19
20 #pragma once
21
22 #if IN_STG_CODE
23 # define RTS_RET_INFO(i) extern const W_(i)[]
24 # define RTS_FUN_INFO(i) extern const W_(i)[]
25 # define RTS_THUNK_INFO(i) extern const W_(i)[]
26 # define RTS_INFO(i) extern const W_(i)[]
27 # define RTS_CLOSURE(i) extern W_(i)[]
28 # define RTS_FUN_DECL(f) extern DLL_IMPORT_RTS StgFunPtr f(void)
29 #else
30 # define RTS_RET_INFO(i) extern DLL_IMPORT_RTS const StgRetInfoTable i
31 # define RTS_FUN_INFO(i) extern DLL_IMPORT_RTS const StgFunInfoTable i
32 # define RTS_THUNK_INFO(i) extern DLL_IMPORT_RTS const StgThunkInfoTable i
33 # define RTS_INFO(i) extern DLL_IMPORT_RTS const StgInfoTable i
34 # define RTS_CLOSURE(i) extern DLL_IMPORT_RTS StgClosure i
35 # define RTS_FUN_DECL(f) extern DLL_IMPORT_RTS StgFunPtr f(void)
36 #endif
37
38 #if defined(TABLES_NEXT_TO_CODE)
39 # define RTS_RET(f) RTS_INFO(f##_info)
40 # define RTS_ENTRY(f) RTS_INFO(f##_info)
41 # define RTS_FUN(f) RTS_FUN_INFO(f##_info)
42 # define RTS_THUNK(f) RTS_THUNK_INFO(f##_info)
43 #else
44 # define RTS_RET(f) RTS_INFO(f##_info); RTS_FUN_DECL(f##_ret)
45 # define RTS_ENTRY(f) RTS_INFO(f##_info); RTS_FUN_DECL(f##_entry)
46 # define RTS_FUN(f) RTS_FUN_INFO(f##_info); RTS_FUN_DECL(f##_entry)
47 # define RTS_THUNK(f) RTS_THUNK_INFO(f##_info); RTS_FUN_DECL(f##_entry)
48 #endif
49
50 /* Stack frames */
51 RTS_RET(stg_upd_frame);
52 RTS_RET(stg_bh_upd_frame);
53 RTS_RET(stg_marked_upd_frame);
54 RTS_RET(stg_noupd_frame);
55 RTS_RET(stg_catch_frame);
56 RTS_RET(stg_catch_retry_frame);
57 RTS_RET(stg_atomically_frame);
58 RTS_RET(stg_atomically_waiting_frame);
59 RTS_RET(stg_catch_stm_frame);
60 RTS_RET(stg_unmaskAsyncExceptionszh_ret);
61 RTS_RET(stg_maskUninterruptiblezh_ret);
62 RTS_RET(stg_maskAsyncExceptionszh_ret);
63 RTS_RET(stg_stack_underflow_frame);
64 RTS_RET(stg_restore_cccs);
65 RTS_RET(stg_restore_cccs_eval);
66
67 // RTS_FUN(stg_interp_constr1_entry);
68 // RTS_FUN(stg_interp_constr2_entry);
69 // RTS_FUN(stg_interp_constr3_entry);
70 // RTS_FUN(stg_interp_constr4_entry);
71 // RTS_FUN(stg_interp_constr5_entry);
72 // RTS_FUN(stg_interp_constr6_entry);
73 // RTS_FUN(stg_interp_constr7_entry);
74 //
75 // This is referenced using the FFI in the compiler (ByteCodeItbls),
76 // so we can't give it the correct type here because the prototypes
77 // would clash (FFI references are always declared with type StgWord[]
78 // in the generated C code).
79
80 /* Magic glue code for when compiled code returns a value in R1/F1/D1
81 or a VoidRep to the interpreter. */
82 RTS_RET(stg_ctoi_R1p);
83 RTS_RET(stg_ctoi_R1unpt);
84 RTS_RET(stg_ctoi_R1n);
85 RTS_RET(stg_ctoi_F1);
86 RTS_RET(stg_ctoi_D1);
87 RTS_RET(stg_ctoi_L1);
88 RTS_RET(stg_ctoi_V);
89
90 RTS_RET(stg_apply_interp);
91
92 RTS_ENTRY(stg_IND);
93 RTS_ENTRY(stg_IND_direct);
94 RTS_ENTRY(stg_IND_STATIC);
95 RTS_ENTRY(stg_BLACKHOLE);
96 RTS_ENTRY(stg_CAF_BLACKHOLE);
97 RTS_ENTRY(__stg_EAGER_BLACKHOLE);
98 RTS_ENTRY(stg_WHITEHOLE);
99 RTS_ENTRY(stg_BLOCKING_QUEUE_CLEAN);
100 RTS_ENTRY(stg_BLOCKING_QUEUE_DIRTY);
101
102 RTS_FUN(stg_BCO);
103 RTS_ENTRY(stg_EVACUATED);
104 RTS_ENTRY(stg_WEAK);
105 RTS_ENTRY(stg_DEAD_WEAK);
106 RTS_ENTRY(stg_C_FINALIZER_LIST);
107 RTS_ENTRY(stg_STABLE_NAME);
108 RTS_ENTRY(stg_MVAR_CLEAN);
109 RTS_ENTRY(stg_MVAR_DIRTY);
110 RTS_ENTRY(stg_TVAR_CLEAN);
111 RTS_ENTRY(stg_TVAR_DIRTY);
112 RTS_ENTRY(stg_TSO);
113 RTS_ENTRY(stg_STACK);
114 RTS_ENTRY(stg_RUBBISH_ENTRY);
115 RTS_ENTRY(stg_ARR_WORDS);
116 RTS_ENTRY(stg_MUT_ARR_WORDS);
117 RTS_ENTRY(stg_MUT_ARR_PTRS_CLEAN);
118 RTS_ENTRY(stg_MUT_ARR_PTRS_DIRTY);
119 RTS_ENTRY(stg_MUT_ARR_PTRS_FROZEN);
120 RTS_ENTRY(stg_MUT_ARR_PTRS_FROZEN0);
121 RTS_ENTRY(stg_SMALL_MUT_ARR_PTRS_CLEAN);
122 RTS_ENTRY(stg_SMALL_MUT_ARR_PTRS_DIRTY);
123 RTS_ENTRY(stg_SMALL_MUT_ARR_PTRS_FROZEN);
124 RTS_ENTRY(stg_SMALL_MUT_ARR_PTRS_FROZEN0);
125 RTS_ENTRY(stg_MUT_VAR_CLEAN);
126 RTS_ENTRY(stg_MUT_VAR_DIRTY);
127 RTS_ENTRY(stg_END_TSO_QUEUE);
128 RTS_ENTRY(stg_GCD_CAF);
129 RTS_ENTRY(stg_STM_AWOKEN);
130 RTS_ENTRY(stg_MSG_TRY_WAKEUP);
131 RTS_ENTRY(stg_MSG_THROWTO);
132 RTS_ENTRY(stg_MSG_BLACKHOLE);
133 RTS_ENTRY(stg_MSG_NULL);
134 RTS_ENTRY(stg_MVAR_TSO_QUEUE);
135 RTS_ENTRY(stg_catch);
136 RTS_ENTRY(stg_PAP);
137 RTS_ENTRY(stg_AP);
138 RTS_ENTRY(stg_AP_NOUPD);
139 RTS_ENTRY(stg_AP_STACK);
140 RTS_ENTRY(stg_AP_STACK_NOUPD);
141 RTS_ENTRY(stg_dummy_ret);
142 RTS_ENTRY(stg_raise);
143 RTS_ENTRY(stg_raise_ret);
144 RTS_ENTRY(stg_atomically);
145 RTS_ENTRY(stg_TVAR_WATCH_QUEUE);
146 RTS_ENTRY(stg_INVARIANT_CHECK_QUEUE);
147 RTS_ENTRY(stg_ATOMIC_INVARIANT);
148 RTS_ENTRY(stg_TREC_CHUNK);
149 RTS_ENTRY(stg_TREC_HEADER);
150 RTS_ENTRY(stg_END_STM_WATCH_QUEUE);
151 RTS_ENTRY(stg_END_INVARIANT_CHECK_QUEUE);
152 RTS_ENTRY(stg_END_STM_CHUNK_LIST);
153 RTS_ENTRY(stg_NO_TREC);
154 RTS_ENTRY(stg_COMPACT_NFDATA_CLEAN);
155 RTS_ENTRY(stg_COMPACT_NFDATA_DIRTY);
156
157 /* closures */
158
159 RTS_CLOSURE(stg_END_TSO_QUEUE_closure);
160 RTS_CLOSURE(stg_STM_AWOKEN_closure);
161 RTS_CLOSURE(stg_NO_FINALIZER_closure);
162 RTS_CLOSURE(stg_dummy_ret_closure);
163 RTS_CLOSURE(stg_forceIO_closure);
164
165 RTS_CLOSURE(stg_END_STM_WATCH_QUEUE_closure);
166 RTS_CLOSURE(stg_END_INVARIANT_CHECK_QUEUE_closure);
167 RTS_CLOSURE(stg_END_STM_CHUNK_LIST_closure);
168 RTS_CLOSURE(stg_NO_TREC_closure);
169
170 RTS_ENTRY(stg_NO_FINALIZER_entry);
171
172 #if IN_STG_CODE
173 extern DLL_IMPORT_RTS StgWordArray stg_CHARLIKE_closure;
174 extern DLL_IMPORT_RTS StgWordArray stg_INTLIKE_closure;
175 #else
176 extern DLL_IMPORT_RTS StgIntCharlikeClosure stg_CHARLIKE_closure[];
177 extern DLL_IMPORT_RTS StgIntCharlikeClosure stg_INTLIKE_closure[];
178 #endif
179
180 /* StgStartup */
181
182 RTS_RET(stg_forceIO);
183 RTS_RET(stg_noforceIO);
184
185 /* standard entry points */
186
187 /* standard selector thunks */
188
189 RTS_ENTRY(stg_sel_0_upd);
190 RTS_ENTRY(stg_sel_1_upd);
191 RTS_ENTRY(stg_sel_2_upd);
192 RTS_ENTRY(stg_sel_3_upd);
193 RTS_ENTRY(stg_sel_4_upd);
194 RTS_ENTRY(stg_sel_5_upd);
195 RTS_ENTRY(stg_sel_6_upd);
196 RTS_ENTRY(stg_sel_7_upd);
197 RTS_ENTRY(stg_sel_8_upd);
198 RTS_ENTRY(stg_sel_9_upd);
199 RTS_ENTRY(stg_sel_10_upd);
200 RTS_ENTRY(stg_sel_11_upd);
201 RTS_ENTRY(stg_sel_12_upd);
202 RTS_ENTRY(stg_sel_13_upd);
203 RTS_ENTRY(stg_sel_14_upd);
204 RTS_ENTRY(stg_sel_15_upd);
205
206 RTS_ENTRY(stg_sel_0_noupd);
207 RTS_ENTRY(stg_sel_1_noupd);
208 RTS_ENTRY(stg_sel_2_noupd);
209 RTS_ENTRY(stg_sel_3_noupd);
210 RTS_ENTRY(stg_sel_4_noupd);
211 RTS_ENTRY(stg_sel_5_noupd);
212 RTS_ENTRY(stg_sel_6_noupd);
213 RTS_ENTRY(stg_sel_7_noupd);
214 RTS_ENTRY(stg_sel_8_noupd);
215 RTS_ENTRY(stg_sel_9_noupd);
216 RTS_ENTRY(stg_sel_10_noupd);
217 RTS_ENTRY(stg_sel_11_noupd);
218 RTS_ENTRY(stg_sel_12_noupd);
219 RTS_ENTRY(stg_sel_13_noupd);
220 RTS_ENTRY(stg_sel_14_noupd);
221 RTS_ENTRY(stg_sel_15_noupd);
222
223 /* standard ap thunks */
224
225 RTS_THUNK(stg_ap_1_upd);
226 RTS_THUNK(stg_ap_2_upd);
227 RTS_THUNK(stg_ap_3_upd);
228 RTS_THUNK(stg_ap_4_upd);
229 RTS_THUNK(stg_ap_5_upd);
230 RTS_THUNK(stg_ap_6_upd);
231 RTS_THUNK(stg_ap_7_upd);
232
233 /* standard application routines (see also utils/genapply,
234 * and compiler/codeGen/StgCmmArgRep.hs).
235 */
236 RTS_RET(stg_ap_v);
237 RTS_RET(stg_ap_f);
238 RTS_RET(stg_ap_d);
239 RTS_RET(stg_ap_l);
240 RTS_RET(stg_ap_v16);
241 RTS_RET(stg_ap_v32);
242 RTS_RET(stg_ap_v64);
243 RTS_RET(stg_ap_n);
244 RTS_RET(stg_ap_p);
245 RTS_RET(stg_ap_pv);
246 RTS_RET(stg_ap_pp);
247 RTS_RET(stg_ap_ppv);
248 RTS_RET(stg_ap_ppp);
249 RTS_RET(stg_ap_pppv);
250 RTS_RET(stg_ap_pppp);
251 RTS_RET(stg_ap_ppppp);
252 RTS_RET(stg_ap_pppppp);
253
254 RTS_FUN_DECL(stg_ap_0_fast);
255 RTS_FUN_DECL(stg_ap_v_fast);
256 RTS_FUN_DECL(stg_ap_f_fast);
257 RTS_FUN_DECL(stg_ap_d_fast);
258 RTS_FUN_DECL(stg_ap_l_fast);
259 RTS_FUN_DECL(stg_ap_v16_fast);
260 RTS_FUN_DECL(stg_ap_v32_fast);
261 RTS_FUN_DECL(stg_ap_v64_fast);
262 RTS_FUN_DECL(stg_ap_n_fast);
263 RTS_FUN_DECL(stg_ap_p_fast);
264 RTS_FUN_DECL(stg_ap_pv_fast);
265 RTS_FUN_DECL(stg_ap_pp_fast);
266 RTS_FUN_DECL(stg_ap_ppv_fast);
267 RTS_FUN_DECL(stg_ap_ppp_fast);
268 RTS_FUN_DECL(stg_ap_pppv_fast);
269 RTS_FUN_DECL(stg_ap_pppp_fast);
270 RTS_FUN_DECL(stg_ap_ppppp_fast);
271 RTS_FUN_DECL(stg_ap_pppppp_fast);
272 RTS_FUN_DECL(stg_PAP_apply);
273
274 /* standard GC & stack check entry points, all defined in HeapStackCheck.cmm */
275
276 RTS_FUN_DECL(stg_gc_noregs);
277
278 RTS_RET(stg_ret_v);
279 RTS_RET(stg_ret_p);
280 RTS_RET(stg_ret_n);
281 RTS_RET(stg_ret_f);
282 RTS_RET(stg_ret_d);
283 RTS_RET(stg_ret_l);
284
285 RTS_FUN_DECL(stg_gc_prim);
286 RTS_FUN_DECL(stg_gc_prim_p);
287 RTS_FUN_DECL(stg_gc_prim_pp);
288 RTS_FUN_DECL(stg_gc_prim_n);
289
290 RTS_RET(stg_gc_prim_p_ll_ret);
291 RTS_FUN_DECL(stg_gc_prim_p_ll);
292
293 RTS_RET(stg_enter);
294 RTS_FUN_DECL(__stg_gc_enter_1);
295
296 RTS_FUN_DECL(stg_gc_unpt_r1);
297 RTS_FUN_DECL(stg_gc_unbx_r1);
298 RTS_FUN_DECL(stg_gc_f1);
299 RTS_FUN_DECL(stg_gc_d1);
300 RTS_FUN_DECL(stg_gc_l1);
301 RTS_FUN_DECL(stg_gc_pp);
302 RTS_FUN_DECL(stg_gc_ppp);
303 RTS_FUN_DECL(stg_gc_pppp);
304
305 RTS_RET(stg_gc_fun);
306 RTS_FUN_DECL(__stg_gc_fun);
307
308 RTS_FUN_DECL(stg_yield_noregs);
309 RTS_FUN_DECL(stg_yield_to_interpreter);
310 RTS_FUN_DECL(stg_block_noregs);
311 RTS_FUN_DECL(stg_block_blackhole);
312 RTS_FUN_DECL(stg_block_blackhole_finally);
313 RTS_FUN_DECL(stg_block_takemvar);
314 RTS_FUN_DECL(stg_block_readmvar);
315 RTS_RET(stg_block_takemvar);
316 RTS_RET(stg_block_readmvar);
317 RTS_FUN_DECL(stg_block_putmvar);
318 RTS_RET(stg_block_putmvar);
319 #if defined(mingw32_HOST_OS)
320 RTS_FUN_DECL(stg_block_async);
321 RTS_RET(stg_block_async);
322 RTS_FUN_DECL(stg_block_async_void);
323 RTS_RET(stg_block_async_void);
324 #endif
325 RTS_FUN_DECL(stg_block_stmwait);
326 RTS_FUN_DECL(stg_block_throwto);
327 RTS_RET(stg_block_throwto);
328
329 /* Entry/exit points from StgStartup.cmm */
330
331 RTS_RET(stg_stop_thread);
332
333 RTS_FUN_DECL(stg_returnToStackTop);
334 RTS_FUN_DECL(stg_returnToSched);
335 RTS_FUN_DECL(stg_returnToSchedNotPaused);
336 RTS_FUN_DECL(stg_returnToSchedButFirst);
337 RTS_FUN_DECL(stg_threadFinished);
338
339 RTS_FUN_DECL(StgReturn);
340
341 /* -----------------------------------------------------------------------------
342 PrimOps
343 -------------------------------------------------------------------------- */
344
345 RTS_FUN_DECL(stg_decodeFloatzuIntzh);
346 RTS_FUN_DECL(stg_decodeDoublezu2Intzh);
347 RTS_FUN_DECL(stg_decodeDoublezuInt64zh);
348
349 RTS_FUN_DECL(stg_unsafeThawArrayzh);
350 RTS_FUN_DECL(stg_casArrayzh);
351 RTS_FUN_DECL(stg_newByteArrayzh);
352 RTS_FUN_DECL(stg_newPinnedByteArrayzh);
353 RTS_FUN_DECL(stg_newAlignedPinnedByteArrayzh);
354 RTS_FUN_DECL(stg_isByteArrayPinnedzh);
355 RTS_FUN_DECL(stg_isMutableByteArrayPinnedzh);
356 RTS_FUN_DECL(stg_shrinkMutableByteArrayzh);
357 RTS_FUN_DECL(stg_resizzeMutableByteArrayzh);
358 RTS_FUN_DECL(stg_casIntArrayzh);
359 RTS_FUN_DECL(stg_newArrayzh);
360 RTS_FUN_DECL(stg_newArrayArrayzh);
361 RTS_FUN_DECL(stg_copyArrayzh);
362 RTS_FUN_DECL(stg_copyMutableArrayzh);
363 RTS_FUN_DECL(stg_copyArrayArrayzh);
364 RTS_FUN_DECL(stg_copyMutableArrayArrayzh);
365 RTS_FUN_DECL(stg_cloneArrayzh);
366 RTS_FUN_DECL(stg_cloneMutableArrayzh);
367 RTS_FUN_DECL(stg_freezzeArrayzh);
368 RTS_FUN_DECL(stg_thawArrayzh);
369
370 RTS_FUN_DECL(stg_newSmallArrayzh);
371 RTS_FUN_DECL(stg_unsafeThawSmallArrayzh);
372 RTS_FUN_DECL(stg_cloneSmallArrayzh);
373 RTS_FUN_DECL(stg_cloneSmallMutableArrayzh);
374 RTS_FUN_DECL(stg_freezzeSmallArrayzh);
375 RTS_FUN_DECL(stg_thawSmallArrayzh);
376 RTS_FUN_DECL(stg_copySmallArrayzh);
377 RTS_FUN_DECL(stg_copySmallMutableArrayzh);
378 RTS_FUN_DECL(stg_casSmallArrayzh);
379
380 RTS_FUN_DECL(stg_newMutVarzh);
381 RTS_FUN_DECL(stg_atomicModifyMutVarzh);
382 RTS_FUN_DECL(stg_casMutVarzh);
383
384 RTS_FUN_DECL(stg_isEmptyMVarzh);
385 RTS_FUN_DECL(stg_newMVarzh);
386 RTS_FUN_DECL(stg_takeMVarzh);
387 RTS_FUN_DECL(stg_putMVarzh);
388 RTS_FUN_DECL(stg_readMVarzh);
389 RTS_FUN_DECL(stg_tryTakeMVarzh);
390 RTS_FUN_DECL(stg_tryPutMVarzh);
391 RTS_FUN_DECL(stg_tryReadMVarzh);
392
393 RTS_FUN_DECL(stg_waitReadzh);
394 RTS_FUN_DECL(stg_waitWritezh);
395 RTS_FUN_DECL(stg_delayzh);
396 #if defined(mingw32_HOST_OS)
397 RTS_FUN_DECL(stg_asyncReadzh);
398 RTS_FUN_DECL(stg_asyncWritezh);
399 RTS_FUN_DECL(stg_asyncDoProczh);
400 #endif
401
402 RTS_FUN_DECL(stg_catchzh);
403 RTS_FUN_DECL(stg_raisezh);
404 RTS_FUN_DECL(stg_raiseIOzh);
405
406 RTS_FUN_DECL(stg_makeStableNamezh);
407 RTS_FUN_DECL(stg_makeStablePtrzh);
408 RTS_FUN_DECL(stg_deRefStablePtrzh);
409
410 RTS_FUN_DECL(stg_compactAddzh);
411 RTS_FUN_DECL(stg_compactAddWithSharingzh);
412 RTS_FUN_DECL(stg_compactNewzh);
413 RTS_FUN_DECL(stg_compactAppendzh);
414 RTS_FUN_DECL(stg_compactResizzezh);
415 RTS_FUN_DECL(stg_compactGetRootzh);
416 RTS_FUN_DECL(stg_compactContainszh);
417 RTS_FUN_DECL(stg_compactContainsAnyzh);
418 RTS_FUN_DECL(stg_compactGetFirstBlockzh);
419 RTS_FUN_DECL(stg_compactGetNextBlockzh);
420 RTS_FUN_DECL(stg_compactAllocateBlockzh);
421 RTS_FUN_DECL(stg_compactFixupPointerszh);
422 RTS_FUN_DECL(stg_compactSizzezh);
423
424 RTS_FUN_DECL(stg_forkzh);
425 RTS_FUN_DECL(stg_forkOnzh);
426 RTS_FUN_DECL(stg_yieldzh);
427 RTS_FUN_DECL(stg_killMyself);
428 RTS_FUN_DECL(stg_killThreadzh);
429 RTS_FUN_DECL(stg_getMaskingStatezh);
430 RTS_FUN_DECL(stg_maskAsyncExceptionszh);
431 RTS_FUN_DECL(stg_maskUninterruptiblezh);
432 RTS_FUN_DECL(stg_unmaskAsyncExceptionszh);
433 RTS_FUN_DECL(stg_myThreadIdzh);
434 RTS_FUN_DECL(stg_labelThreadzh);
435 RTS_FUN_DECL(stg_isCurrentThreadBoundzh);
436 RTS_FUN_DECL(stg_threadStatuszh);
437
438 RTS_FUN_DECL(stg_mkWeakzh);
439 RTS_FUN_DECL(stg_mkWeakNoFinalizzerzh);
440 RTS_FUN_DECL(stg_mkWeakForeignzh);
441 RTS_FUN_DECL(stg_addCFinalizzerToWeakzh);
442 RTS_FUN_DECL(stg_finalizzeWeakzh);
443 RTS_FUN_DECL(stg_deRefWeakzh);
444
445 RTS_FUN_DECL(stg_runRWzh);
446
447 RTS_FUN_DECL(stg_newBCOzh);
448 RTS_FUN_DECL(stg_mkApUpd0zh);
449
450 RTS_FUN_DECL(stg_retryzh);
451 RTS_FUN_DECL(stg_catchRetryzh);
452 RTS_FUN_DECL(stg_catchSTMzh);
453 RTS_FUN_DECL(stg_atomicallyzh);
454 RTS_FUN_DECL(stg_newTVarzh);
455 RTS_FUN_DECL(stg_readTVarzh);
456 RTS_FUN_DECL(stg_readTVarIOzh);
457 RTS_FUN_DECL(stg_writeTVarzh);
458 RTS_FUN_DECL(stg_checkzh);
459
460 RTS_FUN_DECL(stg_unpackClosurezh);
461 RTS_FUN_DECL(stg_getApStackValzh);
462 RTS_FUN_DECL(stg_getSparkzh);
463 RTS_FUN_DECL(stg_numSparkszh);
464
465 RTS_FUN_DECL(stg_noDuplicatezh);
466
467 RTS_FUN_DECL(stg_traceCcszh);
468 RTS_FUN_DECL(stg_clearCCSzh);
469 RTS_FUN_DECL(stg_traceEventzh);
470 RTS_FUN_DECL(stg_traceMarkerzh);
471 RTS_FUN_DECL(stg_getThreadAllocationCounterzh);
472 RTS_FUN_DECL(stg_setThreadAllocationCounterzh);
473
474
475 /* Other misc stuff */
476 // See wiki:Commentary/Compiler/Backends/PprC#Prototypes
477
478 #if IN_STG_CODE && !IN_STGCRUN
479
480 // Interpreter.c
481 extern StgWord rts_stop_next_breakpoint[];
482 extern StgWord rts_stop_on_exception[];
483 extern StgWord rts_breakpoint_io_action[];
484
485 // Schedule.c
486 extern StgWord RTS_VAR(blocked_queue_hd), RTS_VAR(blocked_queue_tl);
487 extern StgWord RTS_VAR(sleeping_queue);
488 extern StgWord RTS_VAR(sched_mutex);
489
490 // Apply.cmm
491 // canned bitmap for each arg type
492 extern const StgWord stg_arg_bitmaps[];
493 extern const StgWord stg_ap_stack_entries[];
494 extern const StgWord stg_stack_save_entries[];
495
496 // Storage.c
497 extern unsigned int RTS_VAR(g0);
498 extern unsigned int RTS_VAR(large_alloc_lim);
499 extern StgWord RTS_VAR(atomic_modify_mutvar_mutex);
500
501 // RtsFlags
502 extern StgWord RTS_VAR(RtsFlags); // bogus type
503
504 // Stable.c
505 extern StgWord RTS_VAR(stable_ptr_table);
506 extern StgWord RTS_VAR(stable_name_table);
507
508 // Profiling.c
509 extern unsigned int RTS_VAR(era);
510 extern unsigned int RTS_VAR(entering_PAP);
511 extern StgWord RTS_VAR(CC_LIST); /* registered CC list */
512 extern StgWord RTS_VAR(CCS_LIST); /* registered CCS list */
513 extern StgWord CCS_OVERHEAD[];
514 extern StgWord CCS_SYSTEM[];
515 extern unsigned int RTS_VAR(CC_ID); /* global ids */
516 extern unsigned int RTS_VAR(CCS_ID);
517
518 // Calls to these rts functions are generated directly
519 // by codegen (see compiler/codeGen/StgCmmProf.hs)
520 // and don't require (don't emit) forward declarations.
521 //
522 // In unregisterised mode (when building via .hc files)
523 // the calls are ordinary C calls. Functions must be in
524 // scope and must match prototype assumed by
525 // 'compiler/codeGen/StgCmmProf.hs'
526 // as opposed to real prototype declared in
527 // 'includes/rts/prof/CCS.h'
528 void enterFunCCS (void *reg, void *ccsfn);
529 void * pushCostCentre (void *ccs, void *cc);
530
531 // Capability.c
532 extern unsigned int n_capabilities;
533
534 #endif