2 Time-stamp: <Fri Jan 14 2000 13:52:00 Stardate: [-30]4202.88 hwloidl>
4 Various debugging routines for GranSim and GUM
7 #if defined(GRAN) || defined(PAR) /* whole file */
9 //@node Debugging routines for GranSim and GUM, , ,
10 //@section Debugging routines for GranSim and GUM
14 //* Constants and Variables::
21 //* Printing info type::
22 //* Printing Pack:et Contents::
27 //@node Includes, Prototypes, Debugging routines for GranSim and GUM, Debugging routines for GranSim and GUM
28 //@subsection Includes
32 #include "GranSimRts.h"
33 #include "ParallelRts.h"
34 #include "StgMiscClosures.h"
36 # include "ParallelDebug.h"
39 //@node Prototypes, Constants and Variables, Includes, Debugging routines for GranSim and GUM
40 //@subsection Prototypes
42 rtsBool isOffset(globalAddr *ga);
43 rtsBool isFixed(globalAddr *ga);
45 //@node Constants and Variables, Closures, Prototypes, Debugging routines for GranSim and GUM
46 //@subsection Constants and Variables
48 /* Names as strings; needed by get_closure_info in ClosureMacros.h -- HWL */
49 static char *closure_type_names[] = {
50 "INVALID_OBJECT", /* 0 */
57 "CONSTR_INTLIKE", /* 7 */
58 "CONSTR_CHARLIKE", /* 8 */
59 "CONSTR_STATIC", /* 9 */
60 "CONSTR_NOCAF_STATIC", /* 10 */
67 "FUN_STATIC", /* 17 */
74 "THUNK_STATIC", /* 24 */
75 "THUNK_SELECTOR", /* 25 */
80 "IND_OLDGEN", /* 30 */
82 "IND_OLDGEN_PERM", /* 32 */
83 "IND_STATIC", /* 33 */
84 "CAF_UNENTERED", /* 34 */
85 "CAF_ENTERED", /* 35 */
86 "CAF_BLACKHOLE", /* 36 */
89 "RET_VEC_SMALL", /* 39 */
91 "RET_VEC_BIG", /* 41 */
93 "UPDATE_FRAME", /* 43 */
94 "CATCH_FRAME", /* 44 */
95 "STOP_FRAME", /* 45 */
98 "BLACKHOLE_BQ", /* 48 */
99 "SE_BLACKHOLE", /* 49 */
100 "SE_CAF_BLACKHOLE", /* 50 */
102 "ARR_WORDS", /* 52 */
103 "MUT_ARR_PTRS", /* 53 */
104 "MUT_ARR_PTRS_FROZEN", /* 54 */
108 "STABLE_NAME", /* 58 */
110 "BLOCKED_FETCH", /* 60 */
112 "EVACUATED", /* 62 */
113 "N_CLOSURE_TYPES", /* 63 */
114 "FETCH_ME_BQ", /* 64 */
119 #if defined(GRAN) && defined(GRAN_CHECK)
120 //@node Closures, Threads, Constants and Variables, Debugging routines for GranSim and GUM
121 //@subsection Closures
127 StgInfoTable *info_ptr;
129 nat size = 0, ptrs = 0, nonptrs = 0, i, vhs = 0;
130 char info_hdr_ty[80], info_ty[80];
133 fprintf(stderr,"NULL\n");
135 } else if (node==END_TSO_QUEUE) {
136 fprintf(stderr,"END_TSO_QUEUE\n");
139 /* size_and_ptrs(node,&size,&ptrs); */
140 info_ptr = get_closure_info(node, &size, &ptrs, &nonptrs, &vhs, info_hdr_ty);
142 /* vhs = var_hdr_size(node); */
143 display_info_type(info_ptr,info_ty);
145 fprintf(stderr,"Node: 0x%lx", node);
148 fprintf(stderr," [GA: 0x%lx]",GA(node));
151 #if defined(USE_COST_CENTRES)
152 fprintf(stderr," [CC: 0x%lx]",CC_HDR(node));
156 fprintf(stderr," [Bitmask: 0%lo]",PROCS(node));
159 if (info_ptr->type==TSO)
160 fprintf(stderr," TSO: 0x%lx (%x) IP: 0x%lx (%s), type %s \n ",
161 (StgTSO*)node, ((StgTSO*)node)->id, info_ptr, info_hdr_ty, info_ty);
163 fprintf(stderr," IP: 0x%lx (%s), type %s \n VHS: %d, size: %ld, ptrs:%ld, nonptrs: %ld\n ",
164 info_ptr,info_hdr_ty,info_ty,vhs,size,ptrs,nonptrs);
166 /* For now, we ignore the variable header */
168 fprintf(stderr," Ptrs: ");
169 for(i=0; i < ptrs; ++i)
172 fprintf(stderr,"\n ");
173 fprintf(stderr," 0x%lx[P]",node->payload[i]);
176 fprintf(stderr," Data: ");
177 for(i=0; i < nonptrs; ++i)
180 fprintf(stderr,"\n ");
181 fprintf(stderr," %lu[D]",node->payload[ptrs+i]);
183 fprintf(stderr, "\n");
186 switch (info_ptr->type)
189 fprintf(stderr,"\n TSO_LINK: %#lx",
190 ((StgTSO*)node)->link);
195 bqe = ((StgBlockingQueue*)node)->blocking_queue;
196 fprintf(stderr," BQ of %#lx: ", node);
201 printf("Panic: found FETCH_ME or FETCH_ME_BQ Infotable in GrAnSim system.\n");
209 G_PPN(node) /* Extracted from PrintPacket in Pack.lc */
213 nat size = 0, ptrs = 0, nonptrs = 0, i, vhs = 0, locn = 0;
216 /* size_and_ptrs(node,&size,&ptrs); */
217 info = get_closure_info(node, &size, &ptrs, &nonptrs, &vhs, info_type);
219 if (info->type == FETCH_ME || info->type == FETCH_ME_BQ ||
220 info->type == BLACKHOLE || info->type == RBH )
221 size = ptrs = nonptrs = vhs = 0;
223 if (closure_THUNK(node)) {
224 if (!closure_UNPOINTED(node))
225 fputs("SHARED ", stderr);
227 fputs("UNSHARED ", stderr);
229 if (info->type==BLACKHOLE) {
230 fputs("BLACK HOLE\n", stderr);
233 fprintf(stderr, "(%s) FH [%#lx", info_type, node[locn++]);
234 for (i = 1; i < FIXED_HS; i++)
235 fprintf(stderr, " %#lx", node[locn++]);
237 /* Variable header */
239 fprintf(stderr, "] VH [%#lx", node->payload[0]);
241 for (i = 1; i < vhs; i++)
242 fprintf(stderr, " %#lx", node->payload[i]);
245 fprintf(stderr, "] PTRS %u", ptrs);
249 fprintf(stderr, " NPTRS [%#lx", node->payload[ptrs]);
251 for (i = 1; i < nonptrs; i++)
252 fprintf(stderr, " %#lx", node->payload[ptrs+i]);
262 // ToDo: fix this!! -- HWL
267 StgInfoTable *info_ptr;
268 nat size = 0, ptrs = 0, nonptrs = 0, vhs = 0;
269 char info_type[80], hdr_type[80];
271 info_hdr_type(info_ptr, hdr_type);
274 info_ptr = get_closure_info(node, &size, &ptrs, &nonptrs, &vhs, info_type);
275 fprintf(stderr,"%s Info Ptr @0x%lx; Entry: 0x%lx; Size: %lu; Ptrs: %lu\n\n",
276 info_type,info_ptr,(W_) ENTRY_CODE(info_ptr),
278 // INFO_SIZE(info_ptr),INFO_NoPTRS(info_ptr));
280 if (closure_THUNK(node) && !closure_UNPOINTED(node) ) {
281 fprintf(stderr," RBH InfoPtr: %#lx\n",
282 RBH_INFOPTR(info_ptr));
286 fprintf(stderr,"Enter Flush Entry: 0x%lx;\tExit Flush Entry: 0x%lx\n",INFO_FLUSHENT(info_ptr),INFO_FLUSH(info_ptr));
289 #if defined(USE_COST_CENTRES)
290 fprintf(stderr,"Cost Centre (???): 0x%lx\n",INFO_CAT(info_ptr));
293 #if defined(_INFO_COPYING)
294 fprintf(stderr,"Evacuate Entry: 0x%lx;\tScavenge Entry: 0x%lx\n",
295 INFO_EVAC_2S(info_ptr),INFO_SCAV_2S(info_ptr));
298 #if defined(_INFO_COMPACTING)
299 fprintf(stderr,"Scan Link: 0x%lx;\tScan Move: 0x%lx\n",
300 (W_) INFO_SCAN_LINK_1S(info_ptr), (W_) INFO_SCAN_MOVE_1S(info_ptr));
301 fprintf(stderr,"Mark: 0x%lx;\tMarked: 0x%lx;\t",
302 (W_) INFO_MARK_1S(info_ptr), (W_) INFO_MARKED_1S(info_ptr));
303 #if 0 /* avoid INFO_TYPE */
304 if(BASE_INFO_TYPE(info_ptr)==INFO_SPEC_TYPE)
305 fprintf(stderr,"plus specialised code\n");
307 fprintf(stderr,"Marking: 0x%lx\n",(W_) INFO_MARKING_1S(info_ptr));
309 #endif /* _INFO_COMPACTING */
320 char str[80], str0[80];
322 fprintf(stderr,"\n[PE %d] @ %lu BQ: ",
323 CurrentProc,CurrentTime[CurrentProc]);
324 if ( node == (StgClosure*)NULL ) {
325 fprintf(stderr," NULL.\n");
328 if ( node == END_TSO_QUEUE ) {
329 fprintf(stderr," _|_\n");
332 tso = ((StgBlockingQueue*)node)->blocking_queue;
333 while (node != END_TSO_QUEUE) {
336 /* Find where the tso lives */
337 proc = where_is(node);
338 info = get_itbl(node);
340 switch (info->type) {
345 strcpy(str0,"BLOCKED_FETCH");
352 if(proc == CurrentProc)
353 fprintf(stderr," %#lx (%x) L %s,",
354 node, ((StgBlockingQueue*)node)->blocking_queue, str0);
356 fprintf(stderr," %#lx (%x) G (PE %d) %s,",
357 node, ((StgBlockingQueue*)node)->blocking_queue, proc, str0);
362 if ( tso == END_TSO_QUEUE )
363 fprintf(stderr," _|_\n");
366 //@node Threads, Events, Closures, Debugging routines for GranSim and GUM
367 //@subsection Threads
370 G_CURR_THREADQ(verbose)
373 fprintf(stderr,"Thread Queue on proc %d: ", CurrentProc);
374 G_THREADQ(run_queue_hd, verbose);
378 G_THREADQ(closure, verbose)
384 fprintf(stderr,"Thread Queue: ");
385 for (x=closure; x!=END_TSO_QUEUE; x=x->link)
389 fprintf(stderr," %#lx",x);
391 if (closure==END_TSO_QUEUE)
392 fprintf(stderr,"NIL\n");
394 fprintf(stderr,"\n");
398 G_TSO(closure,verbose)
403 if (closure==END_TSO_QUEUE) {
404 fprintf(stderr,"TSO at %#lx is END_TSO_QUEUE!\n");
408 if ( verbose & 0x08 ) { /* short info */
409 fprintf(stderr,"[TSO @ %#lx, PE %d]: Id: %#lx, Link: %#lx\n",
410 closure,where_is(closure),
411 closure->id,closure->link);
415 fprintf(stderr,"TSO at %#lx has the following contents:\n",
418 fprintf(stderr,"> Id: \t%#lx",closure->id);
419 // fprintf(stderr,"\tstate: \t%#lx",closure->state);
420 fprintf(stderr,"\twhatNext: \t%#lx",closure->whatNext);
421 fprintf(stderr,"\tlink: \t%#lx\n",closure->link);
422 // fprintf(stderr,"\tType: \t%s\n",type_name[TSO_TYPE(closure)]);
423 fprintf(stderr,">PRI: \t%#lx", closure->gran.pri);
424 fprintf(stderr,"\tMAGIC: \t%#lx %s\n", closure->gran.magic,
425 (closure->gran.magic==TSO_MAGIC ? "it IS a TSO" : "THIS IS NO TSO!!"));
426 if ( verbose & 0x04 ) {
427 fprintf(stderr, "Stack: stack @ %#lx (stack_size: %u; max_stack_size: %u)\n",
428 closure->stack, closure->stack_size, closure->max_stack_size);
429 fprintf(stderr, " sp: %#lx, su: %#lx, splim: %#lx\n",
430 closure->sp, closure->su, closure->splim);
432 // fprintf(stderr,"\n");
433 if (verbose & 0x01) {
434 // fprintf(stderr,"} LOCKED: \t%#lx",closure->locked);
435 fprintf(stderr,"} SPARKNAME: \t%#lx\n", closure->gran.sparkname);
436 fprintf(stderr,"} STARTEDAT: \t%#lx", closure->gran.startedat);
437 fprintf(stderr,"\tEXPORTED: \t%#lx\n", closure->gran.exported);
438 fprintf(stderr,"} BASICBLOCKS: \t%#lx", closure->gran.basicblocks);
439 fprintf(stderr,"\tALLOCS: \t%#lx\n", closure->gran.allocs);
440 fprintf(stderr,"} EXECTIME: \t%#lx", closure->gran.exectime);
441 fprintf(stderr,"\tFETCHTIME: \t%#lx\n", closure->gran.fetchtime);
442 fprintf(stderr,"} FETCHCOUNT: \t%#lx", closure->gran.fetchcount);
443 fprintf(stderr,"\tBLOCKTIME: \t%#lx\n", closure->gran.blocktime);
444 fprintf(stderr,"} BLOCKCOUNT: \t%#lx", closure->gran.blockcount);
445 fprintf(stderr,"\tBLOCKEDAT: \t%#lx\n", closure->gran.blockedat);
446 fprintf(stderr,"} GLOBALSPARKS:\t%#lx", closure->gran.globalsparks);
447 fprintf(stderr,"\tLOCALSPARKS:\t%#lx\n", closure->gran.localsparks);
449 if ( verbose & 0x02 ) {
450 fprintf(stderr,"BQ that starts with this TSO: ");
455 //@node Events, Sparks, Threads, Debugging routines for GranSim and GUM
459 G_EVENT(event, verbose)
466 fprintf(stderr," %#lx",event);
474 extern rtsEventQ EventHd;
477 fprintf(stderr,"RtsEventQ (hd @%#lx):\n",EventHd);
478 for (x=EventHd; x!=NULL; x=x->next) {
482 fprintf(stderr,"NIL\n");
484 fprintf(stderr,"\n");
492 extern rtsEventQ EventHd;
495 fprintf(stderr,"RtsEventQ (hd @%#lx):\n",EventHd);
496 for (x=EventHd; x!=NULL; x=x->next) {
501 fprintf(stderr,"NIL\n");
503 fprintf(stderr,"\n");
506 //@node Sparks, Processors, Events, Debugging routines for GranSim and GUM
510 G_SPARK(spark, verbose)
514 if (spark==(rtsSpark*)NULL) {
515 belch("G_SPARK: NULL spark; aborting");
521 fprintf(stderr," %#lx",spark);
525 G_SPARKQ(spark,verbose)
531 if (spark==(rtsSpark*)NULL) {
532 belch("G_SPARKQ: NULL spark; aborting");
536 fprintf(stderr,"RtsSparkQ (hd @%#lx):\n",spark);
537 for (x=spark; x!=NULL; x=x->next) {
541 fprintf(stderr,"NIL\n");
543 fprintf(stderr,"\n");
547 G_CURR_SPARKQ(verbose)
550 G_SPARKQ(pending_sparks_hd,verbose);
553 //@node Processors, Shortcuts, Sparks, Debugging routines for GranSim and GUM
554 //@subsection Processors
561 extern rtsEventQ EventHd;
562 extern char *proc_status_names[];
564 fprintf(stderr,"Status of proc %d at time %d (%#lx): %s (%s)\n",
565 proc,CurrentTime[proc],CurrentTime[proc],
566 (CurrentProc==proc)?"ACTIVE":"INACTIVE",
567 proc_status_names[procStatus[proc]]);
568 G_THREADQ(run_queue_hds[proc],verbose & 0x2);
569 if ( (CurrentProc==proc) )
573 fprintf(stderr,"Next event (%s) is on proc %d\n",
574 event_names[EventHd->evttype],EventHd->proc);
577 fprintf(stderr,"\nREQUIRED sparks: ");
578 G_SPARKQ(pending_sparks_hds[proc],1);
579 fprintf(stderr,"\nADVISORY_sparks: ");
580 G_SPARKQ(pending_sparks_hds[proc],1);
584 //@node Shortcuts, Printing info type, Processors, Debugging routines for GranSim and GUM
585 //@subsection Shortcuts
587 /* Debug Processor */
594 /* Debug Current Processor */
596 GCP(){ G_PROC(CurrentProc,2); }
604 /* Debug CurrentTSO */
607 fprintf(stderr,"Current Proc: %d\n",CurrentProc);
611 /* Shorthand for debugging event queue */
613 GEQ() { G_EVENTQ(1); }
615 /* Shorthand for debugging thread queue of a processor */
617 GTQ(PEs p) { G_THREADQ(run_queue_hds[p],1); }
619 /* Shorthand for debugging thread queue of current processor */
621 GCTQ() { G_THREADQ(run_queue_hds[CurrentProc],1); }
623 /* Shorthand for debugging spark queue of a processor */
625 GSQ(PEs p) { G_SPARKQ(pending_sparks_hds[p],1); }
627 /* Shorthand for debugging spark queue of current processor */
629 GCSQ() { G_CURR_SPARKQ(1); }
631 /* Shorthand for printing a node */
633 GN(StgPtr node) { G_PRINT_NODE(node); }
635 /* Shorthand for printing info table */
639 GIT(StgPtr node) { G_INFO_TABLE(node); }
643 printThreadQPtrs(void)
646 for (p=0; p<RtsFlags.GranFlags.proc; p++) {
647 fprintf(stderr,", PE %d: (hd=%p,tl=%p)",
648 run_queue_hds[p], run_queue_tls[p]);
653 printThreadQ(StgTSO *tso) { G_THREADQ(tso, 0); };
656 printSparkQ(rtsSpark *spark) { G_SPARKQ(spark, 0); };
659 printThreadQ_verbose(StgTSO *tso) { G_THREADQ(tso, 1); };
662 printSparkQ_verbose(rtsSpark *spark) { G_SPARKQ(spark, 1); };
664 /* Shorthand for some of ADRs debugging functions */
666 #endif /* GRAN && GRAN_CHECK*/
670 DEBUG_PRINT_NODE(node)
673 W_ info_ptr = INFO_PTR(node);
674 StgInt size = 0, ptrs = 0, i, vhs = 0;
677 info_hdr_type(info_ptr, info_type);
679 size_and_ptrs(node,&size,&ptrs);
680 vhs = var_hdr_size(node);
682 fprintf(stderr,"Node: 0x%lx", (W_) node);
685 fprintf(stderr," [GA: 0x%lx]",GA(node));
688 #if defined(PROFILING)
689 fprintf(stderr," [CC: 0x%lx]",CC_HDR(node));
693 fprintf(stderr," [Bitmask: 0%lo]",PROCS(node));
696 fprintf(stderr," IP: 0x%lx (%s), size %ld, %ld ptrs\n",
697 info_ptr,info_type,size,ptrs);
699 /* For now, we ignore the variable header */
701 for(i=0; i < size; ++i)
704 fprintf(stderr,"Data: ");
707 fprintf(stderr,"\n ");
710 fprintf(stderr," 0x%lx[P]",*(node+_FHS+vhs+i));
712 fprintf(stderr," %lu[D]",*(node+_FHS+vhs+i));
714 fprintf(stderr, "\n");
718 #define INFO_MASK 0x80000000
724 W_ size = 0, ptrs = 0, i, vhs = 0;
726 /* Don't print cycles */
727 if((INFO_PTR(node) & INFO_MASK) != 0)
730 size_and_ptrs(node,&size,&ptrs);
731 vhs = var_hdr_size(node);
733 DEBUG_PRINT_NODE(node);
734 fprintf(stderr, "\n");
736 /* Mark the node -- may be dangerous */
737 INFO_PTR(node) |= INFO_MASK;
739 for(i = 0; i < ptrs; ++i)
740 DEBUG_TREE((StgPtr)node[i+vhs+_FHS]);
742 /* Unmark the node */
743 INFO_PTR(node) &= ~INFO_MASK;
748 DEBUG_INFO_TABLE(node)
751 W_ info_ptr = INFO_PTR(node);
752 char *iStgPtrtype = info_hdr_type(info_ptr);
754 fprintf(stderr,"%s Info Ptr @0x%lx; Entry: 0x%lx; Size: %lu; Ptrs: %lu\n\n",
755 iStgPtrtype,info_ptr,(W_) ENTRY_CODE(info_ptr),INFO_SIZE(info_ptr),INFO_NoPTRS(info_ptr));
757 fprintf(stderr,"Enter Flush Entry: 0x%lx;\tExit Flush Entry: 0x%lx\n",INFO_FLUSHENT(info_ptr),INFO_FLUSH(info_ptr));
760 #if defined(PROFILING)
761 fprintf(stderr,"Cost Centre (???): 0x%lx\n",INFO_CAT(info_ptr));
764 #if defined(_INFO_COPYING)
765 fprintf(stderr,"Evacuate Entry: 0x%lx;\tScavenge Entry: 0x%lx\n",
766 INFO_EVAC_2S(info_ptr),INFO_SCAV_2S(info_ptr));
769 #if defined(_INFO_COMPACTING)
770 fprintf(stderr,"Scan Link: 0x%lx;\tScan Move: 0x%lx\n",
771 (W_) INFO_SCAN_LINK_1S(info_ptr), (W_) INFO_SCAN_MOVE_1S(info_ptr));
772 fprintf(stderr,"Mark: 0x%lx;\tMarked: 0x%lx;\t",
773 (W_) INFO_MARK_1S(info_ptr), (W_) INFO_MARKED_1S(info_ptr));
774 #if 0 /* avoid INFO_TYPE */
775 if(BASE_INFO_TYPE(info_ptr)==INFO_SPEC_TYPE)
776 fprintf(stderr,"plus specialised code\n");
778 fprintf(stderr,"Marking: 0x%lx\n",(W_) INFO_MARKING_1S(info_ptr));
780 #endif /* _INFO_COMPACTING */
784 //@node Printing info type, Printing Packet Contents, Shortcuts, Debugging routines for GranSim and GUM
785 //@subsection Printing info type
788 display_info_type(closure, str)
793 if ( closure_HNF(closure) )
794 strcat(str,"|_HNF ");
795 else if ( closure_BITMAP(closure) )
797 else if ( !closure_SHOULD_SPARK(closure) )
799 else if ( closure_STATIC(closure) )
801 else if ( closure_THUNK(closure) )
803 else if ( closure_MUTABLE(closure) )
805 else if ( closure_UNPOINTED(closure) )
807 else if ( closure_SRT(closure) )
814 info_type(StgClosure *closure){
815 return closure_type_names[get_itbl(closure)->type];
819 info_type_by_ip(StgInfoTable *ip){
820 return closure_type_names[ip->type];
824 info_hdr_type(StgClosure *closure, char *res){
825 strcpy(res,closure_type_names[get_itbl(closure)->type]);
829 PrintPacket is in Pack.c because it makes use of closure queues
832 #if defined(GRAN) || defined(PAR)
835 Print graph rooted at q. The structure of this recursive printing routine
836 should be the same as in the graph traversals when packing a graph in
837 GUM. Thus, it demonstrates the structure of such a generic graph
838 traversal, and in particular, how to extract pointer and non-pointer info
839 from the multitude of different heap objects available.
841 {evacuate}Daq ngoqvam nIHlu'pu'!!
845 PrintGraph(StgClosure *p, int indent_level)
848 rtsBool printed = rtsFalse;
850 const StgInfoTable *info;
852 q = p; /* save ptr to object */
855 for (j=0; j<indent_level; j++)
858 ASSERT(p && (LOOKS_LIKE_GHC_INFO(GET_INFO((StgClosure *)p))
859 || IS_HUGS_CONSTR_INFO(GET_INFO((StgClosure *)p))));
861 printClosure(p); // prints contents of this one closure
864 for (j=0; j<indent_level; j++)
867 info = get_itbl((StgClosure *)p);
868 /* the rest of this fct recursively traverses the graph */
869 switch (info -> type) {
873 StgBCO* bco = stgCast(StgBCO*,p);
875 fprintf(stderr, "BCO (%p) with %d pointers\n", p, bco->n_ptrs);
876 for (i = 0; i < bco->n_ptrs; i++) {
877 // bcoConstCPtr(bco,i) =
878 PrintGraph(bcoConstCPtr(bco,i), indent_level+1);
880 // p += bco_sizeW(bco);
885 /* treat MVars specially, because we don't want to PrintGraph the
886 * mut_link field in the middle of the closure.
889 StgMVar *mvar = ((StgMVar *)p);
891 fprintf(stderr, "MVAR (%p) with 3 pointers (head, tail, value)\n", p);
892 // (StgClosure *)mvar->head =
893 PrintGraph((StgClosure *)mvar->head, indent_level+1);
894 // (StgClosure *)mvar->tail =
895 PrintGraph((StgClosure *)mvar->tail, indent_level+1);
896 //(StgClosure *)mvar->value =
897 PrintGraph((StgClosure *)mvar->value, indent_level+1);
898 // p += sizeofW(StgMVar);
899 // evac_gen = saved_evac_gen;
905 fprintf(stderr, "THUNK_2_0 (%p) with 2 pointers\n", p);
910 fprintf(stderr, "FUN_2_0 (%p) with 2 pointers\n", p);
913 // scavenge_srt(info);
916 fprintf(stderr, "CONSTR_2_0 (%p) with 2 pointers\n", p);
919 // ((StgClosure *)p)->payload[0] =
920 PrintGraph(((StgClosure *)p)->payload[0],
922 // ((StgClosure *)p)->payload[1] =
923 PrintGraph(((StgClosure *)p)->payload[1],
925 // p += sizeofW(StgHeader) + 2;
929 // scavenge_srt(info);
930 fprintf(stderr, "THUNK_1_0 (%p) with 1 pointer\n", p);
931 // ((StgClosure *)p)->payload[0] =
932 PrintGraph(((StgClosure *)p)->payload[0],
934 // p += sizeofW(StgHeader) + 2; /* MIN_UPD_SIZE */
939 fprintf(stderr, "FUN_1_0 (%p) with 1 pointer\n", p);
942 // scavenge_srt(info);
945 fprintf(stderr, "CONSTR_2_0 (%p) with 2 pointers\n", p);
948 // ((StgClosure *)p)->payload[0] =
949 PrintGraph(((StgClosure *)p)->payload[0],
951 // p += sizeofW(StgHeader) + 1;
955 fprintf(stderr, "THUNK_0_1 (%p) with 0 pointers\n", p);
956 // scavenge_srt(info);
957 // p += sizeofW(StgHeader) + 2; /* MIN_UPD_SIZE */
961 fprintf(stderr, "FUN_0_1 (%p) with 0 pointers\n", p);
962 //scavenge_srt(info);
964 fprintf(stderr, "CONSTR_0_1 (%p) with 0 pointers\n", p);
965 //p += sizeofW(StgHeader) + 1;
970 fprintf(stderr, "THUNK_0_2 (%p) with 0 pointers\n", p);
975 fprintf(stderr, "FUN_0_2 (%p) with 0 pointers\n", p);
978 // scavenge_srt(info);
981 fprintf(stderr, "CONSTR_0_2 (%p) with 0 pointers\n", p);
984 // p += sizeofW(StgHeader) + 2;
989 fprintf(stderr, "THUNK_1_1 (%p) with 1 pointer\n", p);
994 fprintf(stderr, "FUN_1_1 (%p) with 1 pointer\n", p);
997 // scavenge_srt(info);
1000 fprintf(stderr, "CONSTR_1_1 (%p) with 1 pointer\n", p);
1003 // ((StgClosure *)p)->payload[0] =
1004 PrintGraph(((StgClosure *)p)->payload[0],
1006 // p += sizeofW(StgHeader) + 2;
1011 fprintf(stderr, "FUN (%p) with %d pointers\n", p, info->layout.payload.ptrs);
1018 fprintf(stderr, "THUNK (%p) with %d pointers\n", p, info->layout.payload.ptrs);
1021 // scavenge_srt(info);
1026 fprintf(stderr, "CONSTR (%p) with %d pointers\n", p, info->layout.payload.ptrs);
1029 /* basically same as loop in STABLE_NAME case */
1030 for (i=0; i<info->layout.payload.ptrs; i++)
1031 PrintGraph(((StgClosure *)p)->payload[i],
1034 /* NOT fall through */
1038 fprintf(stderr, "WEAK (%p) with %d pointers\n", p, info->layout.payload.ptrs);
1045 fprintf(stderr, "FOREIGN (%p) with %d pointers\n", p, info->layout.payload.ptrs);
1055 fprintf(stderr, "STABLE_NAME (%p) with %d pointers (not followed!)\n",
1056 p, info->layout.payload.ptrs);
1059 end = (StgPtr)((StgClosure *)p)->payload + info->layout.payload.ptrs;
1060 for (p = (StgPtr)((StgClosure *)p)->payload; p < end; p++) {
1061 // (StgClosure *)*p =
1062 //PrintGraph((StgClosure *)*p, indent_level+1);
1063 fprintf(stderr, ", %p", *p);
1065 //fputs("\n", stderr);
1066 // p += info->layout.payload.nptrs;
1071 //if (step->gen->no != 0) {
1072 // SET_INFO(((StgClosure *)p), &IND_OLDGEN_PERM_info);
1075 fprintf(stderr, "IND_PERM (%p) with indirection to\n",
1076 p, ((StgIndOldGen *)p)->indirectee);
1081 case IND_OLDGEN_PERM:
1083 fprintf(stderr, "IND_OLDGEN_PERM (%p) with indirection to %p\n",
1084 p, ((StgIndOldGen *)p)->indirectee);
1087 // ((StgIndOldGen *)p)->indirectee =
1088 PrintGraph(((StgIndOldGen *)p)->indirectee,
1090 //if (failed_to_evac) {
1091 // failed_to_evac = rtsFalse;
1092 // recordOldToNewPtrs((StgMutClosure *)p);
1094 // p += sizeofW(StgIndOldGen);
1099 StgCAF *caf = (StgCAF *)p;
1101 fprintf(stderr, "CAF_UNENTERED (%p) pointing to %p\n", p, caf->body);
1102 PrintGraph(caf->body, indent_level+1);
1103 //if (failed_to_evac) {
1104 // failed_to_evac = rtsFalse;
1105 // recordOldToNewPtrs((StgMutClosure *)p);
1107 // caf->mut_link = NULL;
1109 //p += sizeofW(StgCAF);
1115 StgCAF *caf = (StgCAF *)p;
1117 fprintf(stderr, "CAF_ENTERED (%p) pointing to %p and %p\n",
1118 p, caf->body, caf->value);
1120 PrintGraph(caf->body, indent_level+1);
1122 PrintGraph(caf->value, indent_level+1);
1123 //if (failed_to_evac) {
1124 // failed_to_evac = rtsFalse;
1125 // recordOldToNewPtrs((StgMutClosure *)p);
1127 // caf->mut_link = NULL;
1129 //p += sizeofW(StgCAF);
1134 /* ignore MUT_CONSs */
1135 fprintf(stderr, "MUT_VAR (%p) pointing to %p\n", p, ((StgMutVar *)p)->var);
1136 if (((StgMutVar *)p)->header.info != &MUT_CONS_info) {
1138 PrintGraph(((StgMutVar *)p)->var, indent_level+1);
1139 //evac_gen = saved_evac_gen;
1141 //p += sizeofW(StgMutVar);
1146 fprintf(stderr, "CAF_BLACKHOLE (%p) with 0 pointers\n", p);
1149 case SE_CAF_BLACKHOLE:
1151 fprintf(stderr, "SE_CAF_BLACKHOLE (%p) with 0 pointers\n", p);
1156 fprintf(stderr, "SE_BLACKHOLE (%p) with 0 pointers\n", p);
1161 fprintf(stderr, "BLACKHOLE (%p) with 0 pointers\n", p);
1164 //p += BLACKHOLE_sizeW();
1169 StgBlockingQueue *bh = (StgBlockingQueue *)p;
1170 // (StgClosure *)bh->blocking_queue =
1171 fprintf(stderr, "BLACKHOLE_BQ (%p) pointing to %p\n",
1172 p, (StgClosure *)bh->blocking_queue);
1173 PrintGraph((StgClosure *)bh->blocking_queue, indent_level+1);
1174 //if (failed_to_evac) {
1175 // failed_to_evac = rtsFalse;
1176 // recordMutable((StgMutClosure *)bh);
1178 // p += BLACKHOLE_sizeW();
1182 case THUNK_SELECTOR:
1184 StgSelector *s = (StgSelector *)p;
1185 fprintf(stderr, "THUNK_SELECTOR (%p) pointing to %p\n",
1187 PrintGraph(s->selectee, indent_level+1);
1188 // p += THUNK_SELECTOR_sizeW();
1193 fprintf(stderr, "IND (%p) pointing to %p\n", p, ((StgInd*)p)->indirectee);
1194 PrintGraph(((StgInd*)p)->indirectee, indent_level+1);
1198 fprintf(stderr, "IND_OLDGEN (%p) pointing to %p\n",
1199 p, ((StgIndOldGen*)p)->indirectee);
1200 PrintGraph(((StgIndOldGen*)p)->indirectee, indent_level+1);
1203 case CONSTR_INTLIKE:
1204 fprintf(stderr, "CONSTR_INTLIKE (%p) with 0 pointers\n", p);
1206 case CONSTR_CHARLIKE:
1207 fprintf(stderr, "CONSTR_CHARLIKE (%p) with 0 pointers\n", p);
1210 fprintf(stderr, "CONSTR_STATIC (%p) with 0 pointers\n", p);
1212 case CONSTR_NOCAF_STATIC:
1213 fprintf(stderr, "CONSTR_NOCAF_STATIC (%p) with 0 pointers\n", p);
1216 fprintf(stderr, "THUNK_STATIC (%p) with 0 pointers\n", p);
1219 fprintf(stderr, "FUN_STATIC (%p) with 0 pointers\n", p);
1222 fprintf(stderr, "IND_STATIC (%p) with 0 pointers\n", p);
1226 fprintf(stderr, "RET_BCO (%p) with 0 pointers\n", p);
1229 fprintf(stderr, "RET_SMALL (%p) with 0 pointers\n", p);
1232 fprintf(stderr, "RET_VEC_SMALL (%p) with 0 pointers\n", p);
1235 fprintf(stderr, "RET_BIG (%p) with 0 pointers\n", p);
1238 fprintf(stderr, "RET_VEC_BIG (%p) with 0 pointers\n", p);
1241 fprintf(stderr, "RET_DYN (%p) with 0 pointers\n", p);
1244 fprintf(stderr, "UPDATE_FRAME (%p) with 0 pointers\n", p);
1247 fprintf(stderr, "STOP_FRAME (%p) with 0 pointers\n", p);
1250 fprintf(stderr, "CATCH_FRAME (%p) with 0 pointers\n", p);
1253 fprintf(stderr, "SEQ_FRAME (%p) with 0 pointers\n", p);
1256 case AP_UPD: /* same as PAPs */
1257 fprintf(stderr, "AP_UPD (%p) with 0 pointers\n", p);
1259 /* Treat a PAP just like a section of stack, not forgetting to
1260 * PrintGraph the function pointer too...
1263 StgPAP* pap = stgCast(StgPAP*,p);
1265 fprintf(stderr, "PAP (%p) pointing to %p\n", p, pap->fun);
1267 PrintGraph(pap->fun, indent_level+1);
1268 //scavenge_stack((P_)pap->payload, (P_)pap->payload + pap->n_args);
1269 //p += pap_sizeW(pap);
1274 fprintf(stderr, "ARR_WORDS (%p) with 0 pointers\n", p);
1275 /* nothing to follow */
1276 //p += arr_words_sizeW(stgCast(StgArrWords*,p));
1280 /* follow everything */
1284 fprintf(stderr, "MUT_ARR_PTRS (%p) with %d pointers (not followed)\n",
1285 p, mut_arr_ptrs_sizeW((StgMutArrPtrs*)p));
1286 // evac_gen = 0; /* repeatedly mutable */
1287 next = p + mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
1288 for (p = (P_)((StgMutArrPtrs *)p)->payload; p < next; p++) {
1289 // (StgClosure *)*p =
1290 // PrintGraph((StgClosure *)*p, indent_level+1);
1291 fprintf(stderr, ", %p", *p);
1293 fputs("\n", stderr);
1294 //evac_gen = saved_evac_gen;
1298 case MUT_ARR_PTRS_FROZEN:
1299 /* follow everything */
1301 StgPtr start = p, next;
1303 fprintf(stderr, "MUT_ARR_PTRS (%p) with %d pointers (not followed)",
1304 p, mut_arr_ptrs_sizeW((StgMutArrPtrs*)p));
1305 next = p + mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
1306 for (p = (P_)((StgMutArrPtrs *)p)->payload; p < next; p++) {
1307 // (StgClosure *)*p =
1308 // PrintGraph((StgClosure *)*p, indent_level+1);
1309 fprintf(stderr, ", %p", *p);
1311 fputs("\n", stderr);
1312 //if (failed_to_evac) {
1313 /* we can do this easier... */
1314 // recordMutable((StgMutClosure *)start);
1315 // failed_to_evac = rtsFalse;
1325 fprintf(stderr, "TSO (%p) with link field %p\n", p, (StgClosure *)tso->link);
1327 /* chase the link field for any TSOs on the same queue */
1328 // (StgClosure *)tso->link =
1329 PrintGraph((StgClosure *)tso->link, indent_level+1);
1330 //if (tso->blocked_on) {
1331 // tso->blocked_on = PrintGraph(tso->blocked_on);
1333 /* scavenge this thread's stack */
1334 //scavenge_stack(tso->sp, &(tso->stack[tso->stack_size]));
1335 //evac_gen = saved_evac_gen;
1336 //p += tso_sizeW(tso);
1340 #if defined(GRAN) || defined(PAR)
1343 StgInfoTable *rip = REVERT_INFOPTR(get_itbl(p));
1344 //if (LOOKS_LIKE_GHC_INFO(rip))
1345 // fprintf(stderr, "RBH (%p) with 0 pointers (reverted type=%s)\n",
1346 // p, info_type_by_ip(rip));
1348 fprintf(stderr, "RBH (%p) with 0 pointers (reverted IP=%x)\n",
1355 fprintf(stderr, "BLOCKED_FETCH (%p) with 0 pointers (link=%p)\n",
1356 p, ((StgBlockedFetch *)p)->link);
1359 fprintf(stderr, "FETCH_ME (%p) with 0 pointers\n", p);
1362 fprintf(stderr, "FETCH_ME_BQ (%p) with 0 pointers (blocking_queue=%p)\n",
1363 p, ((StgFetchMeBlockingQueue *)p)->blocking_queue);
1367 fprintf(stderr, "EVACUATED (%p) with 0 pointers (evacuee=%p)\n",
1368 p, ((StgEvacuated *)p)->evacuee);
1372 barf("PrintGraph: unknown closure %d (%s)",
1373 info -> type, info_type(info));
1376 /* If we didn't manage to promote all the objects pointed to by
1377 * the current object, then we have to designate this object as
1378 * mutable (because it contains old-to-new generation pointers).
1380 //if (failed_to_evac) {
1381 // mkMutCons((StgClosure *)q, &generations[evac_gen]);
1382 // failed_to_evac = rtsFalse;
1388 #endif /* GRAN || PAR */
1390 #if !defined(GRAN) && !defined(PAR)
1391 // just dummy defs in this setup
1393 #include "ParallelDebug.h"
1396 info_type(StgClosure *closure){
1401 info_type_by_ip(StgInfoTable *ip){
1406 info_hdr_type(StgClosure *closure, char *res){
1407 strcpy(res,"petaQ");
1409 #endif /* GRAN || PAR */
1411 //@node End of File, , Printing Packet Contents, Debugging routines for GranSim and GUM
1412 //@subsection End of File