/* -----------------------------------------------------------------------------
- * $Id: Printer.c,v 1.37 2001/02/15 14:30:07 sewardj Exp $
+ * $Id: Printer.c,v 1.46 2001/08/21 10:12:02 sewardj Exp $
*
* (c) The GHC Team, 1994-2000.
*
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
#include "Printer.h"
#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
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]);
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:
disassemble( (StgBCO*)obj );
break;
+ case MUT_VAR:
+ {
+ StgMutVar* mv = (StgMutVar*)obj;
+ fprintf(stderr,"MUT_VAR(var=%p, link=%p)\n", mv->var, mv->mut_link);
+ break;
+ }
+
case AP_UPD:
{
StgAP_UPD* ap = stgCast(StgAP_UPD*,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);
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);
* 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) {
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:
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;
}
//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;
}
}
void printStackChunk( StgPtr sp, StgPtr spBottom )
{
- StgWord32 bitmap;
+ StgWord bitmap;
const StgInfoTable *info;
ASSERT(sp <= 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;
break;
}
}
- fprintf(stderr,"Stack[%d] (%p) = ", spBottom-sp, sp);
+ fprintf(stderr,"Stack[%ld] (%p) = ", spBottom-sp, sp);
sp = printStackObj(sp);
}
}
"FETCH_ME_BQ", /* 62 */
"RBH", /* 63 */
"EVACUATED", /* 64 */
- "N_CLOSURE_TYPES" /* 65 */
+ "REMOTE_REF", /* 65 */
+ "N_CLOSURE_TYPES" /* 66 */
};
char *
/* Causing linking trouble on Win32 plats, so I'm
disabling this for now.
*/
-#if defined(HAVE_BFD_H) && !defined(_WIN32)
+#ifdef USING_LIBBFD
#include <bfd.h>
#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);
}
}