X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FPrinter.c;h=949ca8635c73a0ba8a849e24c69e18eabd214f18;hb=25f7169979a66f0ea58aa01477e019988d895be9;hp=c6aa7a38e055e50de6db1be43e2c2eb902a89d8c;hpb=6d35596c37601a9bf608e32034c390d516454c29;p=ghc-hetmet.git diff --git a/ghc/rts/Printer.c b/ghc/rts/Printer.c index c6aa7a3..949ca86 100644 --- a/ghc/rts/Printer.c +++ b/ghc/rts/Printer.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Printer.c,v 1.36 2001/02/11 17:51:08 simonmar Exp $ + * $Id: Printer.c,v 1.45 2001/08/14 13:40:09 sewardj Exp $ * * (c) The GHC Team, 1994-2000. * @@ -7,6 +7,7 @@ * * ---------------------------------------------------------------------------*/ +#include "PosixSource.h" #include "Rts.h" #include "Printer.h" @@ -21,9 +22,11 @@ #include "Printer.h" +#if defined(GRAN) || defined(PAR) // 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); +#endif /* -------------------------------------------------------------------------- * local function decls @@ -67,6 +70,9 @@ static void printStdObject( StgClosure *obj, char* tag ) const StgInfoTable* info = get_itbl(obj); fprintf(stderr,"%s(",tag); printPtr((StgPtr)obj->header.info); +#ifdef PROFILING + fprintf(stderr,", %s", obj->header.prof.ccs->cc->label); +#endif for (i = 0; i < info->layout.payload.ptrs; ++i) { fprintf(stderr,", "); printPtr((StgPtr)obj->payload[i]); @@ -79,7 +85,11 @@ static void printStdObject( StgClosure *obj, char* tag ) void printClosure( StgClosure *obj ) { - switch ( get_itbl(obj)->type ) { + StgInfoTable *info; + + info = get_itbl(obj); + + switch ( info->type ) { case INVALID_OBJECT: barf("Invalid object"); case BCO: @@ -112,6 +122,12 @@ void printClosure( StgClosure *obj ) break; } + case FOREIGN: + fprintf(stderr,"FOREIGN("); + printPtr((StgPtr)( ((StgForeignObj*)obj)->data )); + fprintf(stderr,")\n"); + break; + case IND: fprintf(stderr,"IND("); printPtr((StgPtr)stgCast(StgInd*,obj)->indirectee); @@ -174,6 +190,14 @@ void printClosure( StgClosure *obj ) fprintf(stderr,")\n"); break; +#ifdef DIST + case REMOTE_REF: + fprintf(stderr,"REMOTE_REF("); + printGA((globalAddr *)stgCast(StgFetchMe*,obj)->ga); + fprintf(stderr,")\n"); + break; +#endif + case FETCH_ME_BQ: fprintf(stderr,"FETCH_ME_BQ("); // printGA((globalAddr *)stgCast(StgFetchMe*,obj)->ga); @@ -202,12 +226,16 @@ void printClosure( StgClosure *obj ) * tag as well. */ StgWord i, j; - const StgInfoTable* info = get_itbl(obj); - fprintf(stderr,"PACK("); +#ifdef PROFILING + fprintf(stderr,"%s(", info->prof.closure_desc); + fprintf(stderr,"%s", obj->header.prof.ccs->cc->label); +#else + fprintf(stderr,"CONSTR("); printPtr((StgPtr)obj->header.info); fprintf(stderr,"(tag=%d)",info->srt_len); +#endif for (i = 0; i < info->layout.payload.ptrs; ++i) { - fprintf(stderr,", "); + fprintf(stderr,", "); printPtr((StgPtr)obj->payload[i]); } for (j = 0; j < info->layout.payload.nptrs; ++j) { @@ -246,7 +274,11 @@ void printClosure( StgClosure *obj ) case THUNK_1_1: case THUNK_0_2: case THUNK_2_0: case THUNK_STATIC: /* ToDo: will this work for THUNK_STATIC too? */ +#ifdef PROFILING + printStdObject(obj,info->prof.closure_desc); +#else printStdObject(obj,"THUNK"); +#endif break; case THUNK_SELECTOR: @@ -262,7 +294,7 @@ void printClosure( StgClosure *obj ) putchar(arrWordsGetChar(obj,i)); } */ for (i=0; i<((StgArrWords *)obj)->words; i++) - fprintf(stderr, "%d", ((StgArrWords *)obj)->payload[i]); + fprintf(stderr, "%ld", ((StgArrWords *)obj)->payload[i]); fprintf(stderr,"\")\n"); break; } @@ -316,6 +348,7 @@ void printClosure( StgClosure *obj ) //barf("printClosure %d",get_itbl(obj)->type); fprintf(stderr, "*** printClosure: unknown type %d ****\n", get_itbl(obj)->type ); + barf("printClosure %d",get_itbl(obj)->type); return; } } @@ -355,6 +388,9 @@ StgPtr printStackObj( StgPtr sp ) if (c == (StgClosure*)&stg_ctoi_ret_D1_info) { fprintf(stderr, "\t\t\tstg_ctoi_ret_D1_info\n" ); } else + if (c == (StgClosure*)&stg_ctoi_ret_V_info) { + fprintf(stderr, "\t\t\tstg_ctoi_ret_V_info\n" ); + } else if (get_itbl(c)->type == BCO) { fprintf(stderr, "\t\t\t"); fprintf(stderr, "BCO(...)\n"); @@ -371,7 +407,7 @@ StgPtr printStackObj( StgPtr sp ) void printStackChunk( StgPtr sp, StgPtr spBottom ) { - StgWord32 bitmap; + StgWord bitmap; const StgInfoTable *info; ASSERT(sp <= spBottom); @@ -414,12 +450,12 @@ void printStackChunk( StgPtr sp, StgPtr spBottom ) sp++; small_bitmap: while (bitmap != 0) { - fprintf(stderr," stk[%d] (%p) = ", spBottom-sp, sp); + fprintf(stderr," stk[%ld] (%p) = ", spBottom-sp, sp); if ((bitmap & 1) == 0) { printPtr((P_)*sp); fprintf(stderr,"\n"); } else { - fprintf(stderr,"Word# %d\n", *sp++); + fprintf(stderr,"Word# %ld\n", *sp++); } sp++; bitmap = bitmap >> 1; @@ -434,7 +470,7 @@ void printStackChunk( StgPtr sp, StgPtr spBottom ) break; } } - fprintf(stderr,"Stack[%d] (%p) = ", spBottom-sp, sp); + fprintf(stderr,"Stack[%ld] (%p) = ", spBottom-sp, sp); sp = printStackObj(sp); } } @@ -549,7 +585,8 @@ static char *closure_type_names[] = { "FETCH_ME_BQ", /* 62 */ "RBH", /* 63 */ "EVACUATED", /* 64 */ - "N_CLOSURE_TYPES" /* 65 */ + "REMOTE_REF", /* 65 */ + "N_CLOSURE_TYPES" /* 66 */ }; char * @@ -789,7 +826,7 @@ static void printZcoded( const char *raw ) /* Causing linking trouble on Win32 plats, so I'm disabling this for now. */ -#if defined(HAVE_BFD_H) && !defined(_WIN32) +#ifdef USING_LIBBFD #include @@ -897,25 +934,45 @@ extern void DEBUG_LoadSymbols( char *name STG_UNUSED ) #include "StoragePriv.h" -void findPtr(P_ p); /* keep gcc -Wall happy */ +void findPtr(P_ p, int); /* keep gcc -Wall happy */ void -findPtr(P_ p) +findPtr(P_ p, int follow) { nat s, g; - P_ q; + P_ q, r; bdescr *bd; + const int arr_size = 1024; + StgPtr arr[arr_size]; + int i = 0; 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); + for (s = 0; s < generations[g].n_steps; s++) { + if (RtsFlags.GcFlags.generations == 1) { + bd = generations[g].steps[s].to_blocks; + } else { + bd = generations[g].steps[s].blocks; + } + for (; bd; bd = bd->link) { + for (q = bd->start; q < bd->free; q++) { + if (*q == (W_)p) { + if (i < arr_size) { + r = q; + while (!LOOKS_LIKE_GHC_INFO(*r)) { r--; }; + fprintf(stderr, "%p = ", r); + printClosure((StgClosure *)r); + arr[i++] = r; + } else { + return; + } + } + } } - } } - } + } + if (follow && i == 1) { + fprintf(stderr, "-->\n"); + findPtr(arr[0], 1); } }