X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FPrinter.c;h=28cdd0d4abd8c65aec0668245ea7d482eeb2c163;hb=a60af39758448f92d8eaa3b62072f9adcdbbee9d;hp=671d76fbf87d83463e1d4b280d25c1b943ba3122;hpb=9cef40bd4dd2536c7a370a1a9b78461c152805cc;p=ghc-hetmet.git diff --git a/rts/Printer.c b/rts/Printer.c index 671d76f..28cdd0d 100644 --- a/rts/Printer.c +++ b/rts/Printer.c @@ -15,7 +15,6 @@ #include "RtsFlags.h" #include "MBlock.h" -#include "Storage.h" #include "Bytecodes.h" /* for InstrPtr */ #include "Disassembler.h" #include "Apply.h" @@ -137,6 +136,7 @@ printClosure( StgClosure *obj ) case CONSTR_NOCAF_STATIC: { StgWord i, j; + #ifdef PROFILING debugBelch("%s(", info->prof.closure_desc); debugBelch("%s", obj->header.prof.ccs->cc->label); @@ -262,9 +262,7 @@ printClosure( StgClosure *obj ) /* Cannot happen -- use default case. case RET_BCO: case RET_SMALL: - case RET_VEC_SMALL: case RET_BIG: - case RET_VEC_BIG: case RET_DYN: case RET_FUN: */ @@ -577,7 +575,6 @@ printStackChunk( StgPtr sp, StgPtr spBottom ) } case RET_SMALL: - case RET_VEC_SMALL: debugBelch("RET_SMALL (%p)\n", info); bitmap = info->layout.bitmap; printSmallBitmap(spBottom, sp+1, @@ -596,7 +593,6 @@ printStackChunk( StgPtr sp, StgPtr spBottom ) } case RET_BIG: - case RET_VEC_BIG: barf("todo"); case RET_FUN: @@ -683,9 +679,7 @@ static char *closure_type_names[] = { "IND_STATIC", "RET_BCO", "RET_SMALL", - "RET_VEC_SMALL", "RET_BIG", - "RET_VEC_BIG", "RET_DYN", "RET_FUN", "UPDATE_FRAME", @@ -1112,6 +1106,88 @@ findPtr(P_ p, int follow) } } +/* prettyPrintClosure() is for printing out a closure using the data constructor + names found in the info tables. Closures are printed in a fashion that resembles + their Haskell representation. Useful during debugging. + + Todo: support for more closure types, and support for non pointer fields in the + payload. +*/ + +void prettyPrintClosure_ (StgClosure *); + +void prettyPrintClosure (StgClosure *obj) +{ + prettyPrintClosure_ (obj); + debugBelch ("\n"); +} + +void prettyPrintClosure_ (StgClosure *obj) +{ + StgInfoTable *info; + StgConInfoTable *con_info; + + /* collapse any indirections */ + unsigned int type; + type = get_itbl(obj)->type; + + while (type == IND || + type == IND_STATIC || + type == IND_OLDGEN || + type == IND_PERM || + type == IND_OLDGEN_PERM) + { + obj = ((StgInd *)obj)->indirectee; + type = get_itbl(obj)->type; + } + + /* find the info table for this object */ + info = get_itbl(obj); + + /* determine what kind of object we have */ + switch (info->type) + { + /* full applications of data constructors */ + case CONSTR: + case CONSTR_1_0: + case CONSTR_0_1: + case CONSTR_1_1: + case CONSTR_0_2: + case CONSTR_2_0: + case CONSTR_STATIC: + case CONSTR_NOCAF_STATIC: + { + int i; + char *descriptor; + + /* find the con_info for the constructor */ + con_info = get_con_itbl (obj); + + /* obtain the name of the constructor */ + descriptor = con_info->con_desc; + + debugBelch ("(%s", descriptor); + + /* process the payload of the closure */ + /* we don't handle non pointers at the moment */ + for (i = 0; i < info->layout.payload.ptrs; i++) + { + debugBelch (" "); + prettyPrintClosure_ ((StgClosure *) obj->payload[i]); + } + debugBelch (")"); + break; + } + + /* if it isn't a constructor then just print the closure type */ + default: + { + debugBelch ("<%s>", info_type(obj)); + break; + } + } +} + #else /* DEBUG */ void printPtr( StgPtr p ) { @@ -1122,4 +1198,6 @@ void printObj( StgClosure *obj ) { debugBelch("obj 0x%p (enable -DDEBUG for more info) " , obj ); } + + #endif /* DEBUG */