3 StgWord gtc_heap_view_closureSize(StgClosure *closure) {
4 ASSERT(LOOKS_LIKE_CLOSURE_PTR(closure));
5 return closure_sizeW(closure);
9 gtc_heap_view_closure_ptrs_in_large_bitmap(StgClosure *ptrs[], StgWord *nptrs, StgClosure **p, StgLargeBitmap *large_bitmap, nat size )
16 for (i = 0; i < size; b++) {
17 bitmap = large_bitmap->bitmap[b];
18 j = stg_min(size-i, BITS_IN(W_));
20 for (; j > 0; j--, p++) {
21 if ((bitmap & 1) == 0) {
22 ptrs[(*nptrs)++] = *p;
30 char *gtc_heap_view_closure_type_names[] = {
31 [INVALID_OBJECT] = "INVALID_OBJECT",
33 [CONSTR_1_0] = "CONSTR_1_0",
34 [CONSTR_0_1] = "CONSTR_0_1",
35 [CONSTR_2_0] = "CONSTR_2_0",
36 [CONSTR_1_1] = "CONSTR_1_1",
37 [CONSTR_0_2] = "CONSTR_0_2",
38 [CONSTR_STATIC] = "CONSTR_STATIC",
39 [CONSTR_NOCAF_STATIC] = "CONSTR_NOCAF_STATIC",
41 [FUN_1_0] = "FUN_1_0",
42 [FUN_0_1] = "FUN_0_1",
43 [FUN_2_0] = "FUN_2_0",
44 [FUN_1_1] = "FUN_1_1",
45 [FUN_0_2] = "FUN_0_2",
46 [FUN_STATIC] = "FUN_STATIC",
48 [THUNK_1_0] = "THUNK_1_0",
49 [THUNK_0_1] = "THUNK_0_1",
50 [THUNK_2_0] = "THUNK_2_0",
51 [THUNK_1_1] = "THUNK_1_1",
52 [THUNK_0_2] = "THUNK_0_2",
53 [THUNK_STATIC] = "THUNK_STATIC",
54 [THUNK_SELECTOR] = "THUNK_SELECTOR",
58 [AP_STACK] = "AP_STACK",
60 [IND_PERM] = "IND_PERM",
61 [IND_STATIC] = "IND_STATIC",
62 [RET_BCO] = "RET_BCO",
63 [RET_SMALL] = "RET_SMALL",
64 [RET_BIG] = "RET_BIG",
67 [RET_DYN] = "RET_DYN",
69 [RET_FUN] = "RET_FUN",
70 [UPDATE_FRAME] = "UPDATE_FRAME",
71 [CATCH_FRAME] = "CATCH_FRAME",
72 [UNDERFLOW_FRAME] = "UNDERFLOW_FRAME",
73 [STOP_FRAME] = "STOP_FRAME",
74 [BLACKHOLE] = "BLACKHOLE",
75 [BLOCKING_QUEUE] = "BLOCKING_QUEUE",
76 [MVAR_CLEAN] = "MVAR_CLEAN",
77 [MVAR_DIRTY] = "MVAR_DIRTY",
78 [ARR_WORDS] = "ARR_WORDS",
79 [MUT_ARR_PTRS_CLEAN] = "MUT_ARR_PTRS_CLEAN",
80 [MUT_ARR_PTRS_DIRTY] = "MUT_ARR_PTRS_DIRTY",
81 [MUT_ARR_PTRS_FROZEN0] = "MUT_ARR_PTRS_FROZEN0",
82 [MUT_ARR_PTRS_FROZEN] = "MUT_ARR_PTRS_FROZEN",
83 [MUT_VAR_CLEAN] = "MUT_VAR_CLEAN",
84 [MUT_VAR_DIRTY] = "MUT_VAR_DIRTY",
87 [MUT_PRIM] = "MUT_PRIM",
90 [TREC_CHUNK] = "TREC_CHUNK",
91 [ATOMICALLY_FRAME] = "ATOMICALLY_FRAME",
92 [CATCH_RETRY_FRAME] = "CATCH_RETRY_FRAME",
93 [CATCH_STM_FRAME] = "CATCH_STM_FRAME",
94 [WHITEHOLE] = "WHITEHOLE"
98 void gtc_heap_view_closure_ptrs_in_pap_payload(StgClosure *ptrs[], StgWord *nptrs, StgClosure *fun, StgClosure **payload, StgWord size) {
100 StgFunInfoTable *fun_info;
102 fun_info = get_fun_itbl(UNTAG_CLOSURE(fun));
103 // ASSERT(fun_info->i.type != PAP);
104 StgClosure **p = payload;
106 switch (fun_info->f.fun_type) {
108 bitmap = BITMAP_BITS(fun_info->f.b.bitmap);
111 gtc_heap_view_closure_ptrs_in_large_bitmap(ptrs, nptrs, payload, GET_FUN_LARGE_BITMAP(fun_info), size);
114 gtc_heap_view_closure_ptrs_in_large_bitmap(ptrs, nptrs, payload, BCO_BITMAP(fun), size);
117 bitmap = BITMAP_BITS(stg_arg_bitmaps[fun_info->f.fun_type]);
120 if ((bitmap & 1) == 0) {
121 ptrs[(*nptrs)++] = *p;
123 bitmap = bitmap >> 1;
131 StgMutArrPtrs *gtc_heap_view_closurePtrs(Capability *cap, StgClosure *closure) {
132 ASSERT(LOOKS_LIKE_CLOSURE_PTR(closure));
134 StgWord size = gtc_heap_view_closureSize(closure);
138 // First collect all pointers here, with the comfortable memory bound
139 // of the whole closure. Afterwards we know how many pointers are in
140 // the closure and then we can allocate space on the heap and copy them
142 StgClosure *ptrs[size];
147 StgInfoTable *info = get_itbl(closure);
148 StgThunkInfoTable *thunk_info;
149 StgFunInfoTable *fun_info;
151 switch (info->type) {
153 barf("Invalid Object");
168 case CONSTR_NOCAF_STATIC:
178 end = closure->payload + info->layout.payload.ptrs;
179 for (ptr = closure->payload; ptr < end; ptr++) {
180 ptrs[nptrs++] = *ptr;
191 end = ((StgThunk *)closure)->payload + info->layout.payload.ptrs;
192 for (ptr = ((StgThunk *)closure)->payload; ptr < end; ptr++) {
193 ptrs[nptrs++] = *ptr;
198 ptrs[nptrs++] = ((StgSelector *)closure)->selectee;
202 ptrs[nptrs++] = ((StgAP *)closure)->fun;
203 gtc_heap_view_closure_ptrs_in_pap_payload(ptrs, &nptrs,
204 ((StgAP *)closure)->fun,
205 ((StgAP *)closure)->payload,
206 ((StgAP *)closure)->n_args);
210 ptrs[nptrs++] = ((StgPAP *)closure)->fun;
211 gtc_heap_view_closure_ptrs_in_pap_payload(ptrs, &nptrs,
212 ((StgPAP *)closure)->fun,
213 ((StgPAP *)closure)->payload,
214 ((StgPAP *)closure)->n_args);
218 ptrs[nptrs++] = ((StgAP_STACK *)closure)->fun;
219 for (i = 0; i < ((StgAP_STACK *)closure)->size; ++i) {
220 ptrs[nptrs++] = ((StgAP_STACK *)closure)->payload[i];
225 ptrs[nptrs++] = (StgClosure *)((StgBCO *)closure)->instrs;
226 ptrs[nptrs++] = (StgClosure *)((StgBCO *)closure)->literals;
227 ptrs[nptrs++] = (StgClosure *)((StgBCO *)closure)->ptrs;
234 ptrs[nptrs++] = (StgClosure *)(((StgInd *)closure)->indirectee);
237 case MUT_ARR_PTRS_CLEAN:
238 case MUT_ARR_PTRS_DIRTY:
239 case MUT_ARR_PTRS_FROZEN:
240 case MUT_ARR_PTRS_FROZEN0:
241 for (i = 0; i < ((StgMutArrPtrs *)closure)->ptrs; ++i) {
242 ptrs[nptrs++] = ((StgMutArrPtrs *)closure)->payload[i];
246 ptrs[nptrs++] = ((StgMutVar *)closure)->var;
249 ptrs[nptrs++] = (StgClosure *)((StgMVar *)closure)->head;
250 ptrs[nptrs++] = (StgClosure *)((StgMVar *)closure)->tail;
251 ptrs[nptrs++] = ((StgMVar *)closure)->value;
255 //fprintf(stderr,"closurePtrs: Cannot handle type %s yet\n", gtc_heap_view_closure_type_names[info->type]);
259 size = nptrs + mutArrPtrsCardTableSize(nptrs);
261 (StgMutArrPtrs *)allocate(cap, sizeofW(StgMutArrPtrs) + size);
262 TICK_ALLOC_PRIM(sizeofW(StgMutArrPtrs), nptrs, 0);
263 SET_HDR(arr, &stg_MUT_ARR_PTRS_FROZEN_info, CCCS);
267 for (i = 0; i<nptrs; i++) {
268 arr->payload[i] = ptrs[i];