-
/* -----------------------------------------------------------------------------
- * $Id: Printer.c,v 1.12 1999/05/04 10:19:17 sof Exp $
+ * $Id: Printer.c,v 1.22 2000/03/17 14:37:21 simonmar Exp $
*
- * Copyright (c) 1994-1999.
+ * (c) The GHC Team, 1994-2000.
*
* Heap printer
*
* ---------------------------------------------------------------------------*/
#include "Rts.h"
+#include "Printer.h"
#ifdef DEBUG
#include "Printer.h"
+// HWL: explicit fixed header size to make debugging easier
+int fixed_hs = FIXED_HS, itbl_sz = sizeofW(StgInfoTable),
+ uf_sz=sizeofW(StgUpdateFrame), sf_sz=sizeofW(StgSeqFrame);
+
/* --------------------------------------------------------------------------
* local function decls
* ------------------------------------------------------------------------*/
void printPtr( StgPtr p )
{
+#ifdef INTERPRETER
char* str;
+#endif
const char *raw;
if (lookupGHCName( p, &raw )) {
printZcoded(raw);
printPtr((StgPtr)obj->header.info);
for (i = 0; i < info->layout.payload.ptrs; ++i) {
fprintf(stderr,", ");
- printPtr(payloadPtr(obj,i));
+ printPtr((StgPtr)obj->payload[i]);
}
for (j = 0; j < info->layout.payload.nptrs; ++j) {
- fprintf(stderr,", %xd#",payloadWord(obj,i+j));
+ fprintf(stderr,", %pd#",obj->payload[i+j]);
}
fprintf(stderr,")\n");
}
fprintf(stderr,"AP_UPD("); printPtr((StgPtr)ap->fun);
for (i = 0; i < ap->n_args; ++i) {
fprintf(stderr,", ");
- printPtr(payloadPtr(ap,i));
+ printPtr(ap->payload[i]);
}
fprintf(stderr,")\n");
break;
fprintf(stderr,"PAP("); printPtr((StgPtr)pap->fun);
for (i = 0; i < pap->n_args; ++i) {
fprintf(stderr,", ");
- printPtr(payloadPtr(pap,i));
+ printPtr((StgPtr)pap->payload[i]);
}
fprintf(stderr,")\n");
break;
fprintf(stderr,")\n");
break;
+ case SE_BLACKHOLE:
+ fprintf(stderr,"SE_BH\n");
+ break;
+
+ case SE_CAF_BLACKHOLE:
+ fprintf(stderr,"SE_CAF_BH\n");
+ break;
+
case BLACKHOLE:
fprintf(stderr,"BH\n");
break;
fprintf(stderr,")\n");
break;
+#if defined(GRAN) || defined(PAR)
+ case RBH:
+ fprintf(stderr,"RBH(");
+ printPtr((StgPtr)stgCast(StgRBH*,obj)->blocking_queue);
+ fprintf(stderr,")\n");
+ break;
+#endif
+
case CONSTR:
case CONSTR_1_0: case CONSTR_0_1:
case CONSTR_1_1: case CONSTR_0_2: case CONSTR_2_0:
fprintf(stderr,"(tag=%d)",info->srt_len);
for (i = 0; i < info->layout.payload.ptrs; ++i) {
fprintf(stderr,", ");
- printPtr(payloadPtr(obj,i));
+ printPtr((StgPtr)obj->payload[i]);
}
for (j = 0; j < info->layout.payload.nptrs; ++j) {
- fprintf(stderr,", %x#",payloadWord(obj,i+j));
+ fprintf(stderr,", %p#", obj->payload[i+j]);
}
fprintf(stderr,")\n");
break;
}
default:
//barf("printClosure %d",get_itbl(obj)->type);
- fprintf(stderr, "*** printClosure: unknown type %d ****\n",get_itbl(obj)->type );
+ fprintf(stderr, "*** printClosure: unknown type %d ****\n",
+ get_itbl(obj)->type );
return;
}
}
+/*
+void printGraph( StgClosure *obj )
+{
+ printClosure(obj);
+}
+*/
+
StgPtr printStackObj( StgPtr sp )
{
/*fprintf(stderr,"Stack[%d] = ", &stgStack[STACK_SIZE] - sp); */
if (IS_ARG_TAG(*sp)) {
-
-#ifdef DEBUG_EXTRA
- StackTag tag = (StackTag)*sp;
- switch ( tag ) {
- case ILLEGAL_TAG:
- barf("printStackObj: ILLEGAL_TAG");
- break;
- case REALWORLD_TAG:
- fprintf(stderr,"RealWorld#\n");
- break;
- case INT_TAG:
- fprintf(stderr,"Int# %d\n", *(StgInt*)(sp+1));
- break;
- case INT64_TAG:
- fprintf(stderr,"Int64# %lld\n", *(StgInt64*)(sp+1));
- break;
- case WORD_TAG:
- fprintf(stderr,"Word# %d\n", *(StgWord*)(sp+1));
- break;
- case ADDR_TAG:
- fprintf(stderr,"Addr# "); printPtr(*(StgAddr*)(sp+1)); fprintf(stderr,"\n");
- break;
- case CHAR_TAG:
- fprintf(stderr,"Char# %d\n", *(StgChar*)(sp+1));
- break;
- case FLOAT_TAG:
- fprintf(stderr,"Float# %f\n", PK_FLT(sp+1));
- break;
- case DOUBLE_TAG:
- fprintf(stderr,"Double# %f\n", PK_DBL(sp+1));
- break;
- default:
- barf("printStackObj: unrecognised ARGTAG %d",tag);
+ nat i;
+ StgWord tag = *sp++;
+ fprintf(stderr,"Tagged{");
+ for (i = 0; i < tag; i++) {
+ fprintf(stderr,"0x%x#", (unsigned)(*sp++));
+ if (i < tag-1) fprintf(stderr, ", ");
}
- sp += 1 + ARG_SIZE(tag);
-
-#else /* !DEBUG_EXTRA */
- {
- StgWord tag = *sp++;
- nat i;
- fprintf(stderr,"Tag: %d words\n", tag);
- for (i = 0; i < tag; i++) {
- fprintf(stderr,"Word# %d\n", *sp++);
- }
- }
-#endif
-
+ fprintf(stderr, "}\n");
} else {
StgClosure* c = (StgClosure*)(*sp);
printPtr((StgPtr)*sp);
sp++;
small_bitmap:
while (bitmap != 0) {
- fprintf(stderr,"Stack[%d] (%p) = ", spBottom-sp, sp);
+ fprintf(stderr," stk[%d] (%p) = ", spBottom-sp, sp);
if ((bitmap & 1) == 0) {
printPtr((P_)*sp);
fprintf(stderr,"\n");
/* printStackChunk( tso->sp, tso->stack+tso->stack_size); */
}
+/* -----------------------------------------------------------------------------
+ Closure types
+
+ NOTE: must be kept in sync with the closure types in includes/ClosureTypes.h
+ -------------------------------------------------------------------------- */
+
+static char *closure_type_names[] = {
+ "INVALID_OBJECT", /* 0 */
+ "CONSTR", /* 1 */
+ "CONSTR_1_0", /* 2 */
+ "CONSTR_0_1", /* 3 */
+ "CONSTR_2_0", /* 4 */
+ "CONSTR_1_1", /* 5 */
+ "CONSTR_0_2", /* 6 */
+ "CONSTR_INTLIKE", /* 7 */
+ "CONSTR_CHARLIKE", /* 8 */
+ "CONSTR_STATIC", /* 9 */
+ "CONSTR_NOCAF_STATIC", /* 10 */
+ "FUN", /* 11 */
+ "FUN_1_0", /* 12 */
+ "FUN_0_1", /* 13 */
+ "FUN_2_0", /* 14 */
+ "FUN_1_1", /* 15 */
+ "FUN_0_2", /* 16 */
+ "FUN_STATIC", /* 17 */
+ "THUNK", /* 18 */
+ "THUNK_1_0", /* 19 */
+ "THUNK_0_1", /* 20 */
+ "THUNK_2_0", /* 21 */
+ "THUNK_1_1", /* 22 */
+ "THUNK_0_2", /* 23 */
+ "THUNK_STATIC", /* 24 */
+ "THUNK_SELECTOR", /* 25 */
+ "BCO", /* 26 */
+ "AP_UPD", /* 27 */
+ "PAP", /* 28 */
+ "IND", /* 29 */
+ "IND_OLDGEN", /* 30 */
+ "IND_PERM", /* 31 */
+ "IND_OLDGEN_PERM", /* 32 */
+ "IND_STATIC", /* 33 */
+ "CAF_UNENTERED", /* 34 */
+ "CAF_ENTERED", /* 35 */
+ "CAF_BLACKHOLE", /* 36 */
+ "RET_BCO", /* 37 */
+ "RET_SMALL", /* 38 */
+ "RET_VEC_SMALL", /* 39 */
+ "RET_BIG", /* 40 */
+ "RET_VEC_BIG", /* 41 */
+ "RET_DYN", /* 42 */
+ "UPDATE_FRAME", /* 43 */
+ "CATCH_FRAME", /* 44 */
+ "STOP_FRAME", /* 45 */
+ "SEQ_FRAME", /* 46 */
+ "BLACKHOLE", /* 47 */
+ "BLACKHOLE_BQ", /* 48 */
+ "SE_BLACKHOLE", /* 49 */
+ "SE_CAF_BLACKHOLE", /* 50 */
+ "MVAR", /* 51 */
+ "ARR_WORDS", /* 52 */
+ "MUT_ARR_PTRS", /* 53 */
+ "MUT_ARR_PTRS_FROZEN", /* 54 */
+ "MUT_VAR", /* 55 */
+ "WEAK", /* 56 */
+ "FOREIGN", /* 57 */
+ "STABLE_NAME", /* 58 */
+ "TSO", /* 59 */
+ "BLOCKED_FETCH", /* 60 */
+ "FETCH_ME", /* 61 */
+ "EVACUATED", /* 62 */
+ "N_CLOSURE_TYPES", /* 63 */
+ "FETCH_ME_BQ", /* 64 */
+ "RBH" /* 65 */
+};
+
+char *
+info_type(StgClosure *closure){
+ return closure_type_names[get_itbl(closure)->type];
+}
+
+char *
+info_type_by_ip(StgInfoTable *ip){
+ return closure_type_names[ip->type];
+}
+
+void
+info_hdr_type(StgClosure *closure, char *res){
+ strcpy(res,closure_type_names[get_itbl(closure)->type]);
+}
/* --------------------------------------------------------------------------
* Address printing code
return rtsFalse;
}
#else
+ (void)flags; /* keep gcc -Wall happy */
if (*name == '\0' ||
(name[0] == 'g' && name[1] == 'c' && name[2] == 'c') ||
(name[0] == 'c' && name[1] == 'c' && name[2] == '.')) {
#else /* HAVE_BFD_H */
-extern void DEBUG_LoadSymbols( char *name )
+extern void DEBUG_LoadSymbols( char *name STG_UNUSED )
{
/* nothing, yet */
}
#endif /* HAVE_BFD_H */
+#include "StoragePriv.h"
+
+void
+findPtr(P_ p)
+{
+ nat s, g;
+ P_ q;
+ bdescr *bd;
+
+ for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
+ for (s = 0; s < generations[g].n_steps; s++) {
+ for (bd = generations[g].steps[s].blocks; bd; bd = bd->link) {
+ for (q = bd->start; q < bd->free; q++) {
+ if (*q == (W_)p) {
+ printf("%p\n", q);
+ }
+ }
+ }
+ }
+ }
+}
+
#else /* DEBUG */
void printPtr( StgPtr p )
{