X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=ghc%2Frts%2FRetainerProfile.c;h=04b65830b01dba7dd0ae12084568d9ad11bb5edf;hb=b4d045ae655e5eae25b88917cfe75d7dc7689c21;hp=b28d898a10121c6ffbce5225789d8473d851ccc5;hpb=7daea7b0e1a01b41ba00c7c29d3c262ea8e94b8c;p=ghc-hetmet.git diff --git a/ghc/rts/RetainerProfile.c b/ghc/rts/RetainerProfile.c index b28d898..04b6583 100644 --- a/ghc/rts/RetainerProfile.c +++ b/ghc/rts/RetainerProfile.c @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: RetainerProfile.c,v 1.10 2003/05/16 14:39:29 simonmar Exp $ * * (c) The GHC Team, 2001 * Author: Sungwoo Park @@ -17,8 +16,6 @@ #define INLINE inline #endif -#include - #include "Rts.h" #include "RtsUtils.h" #include "RetainerProfile.h" @@ -26,11 +23,9 @@ #include "Schedule.h" #include "Printer.h" #include "Storage.h" -#include "StoragePriv.h" #include "RtsFlags.h" #include "Weak.h" #include "Sanity.h" -#include "StablePriv.h" #include "Profiling.h" #include "Stats.h" #include "BlockAlloc.h" @@ -334,11 +329,11 @@ init_srt_fun( stackPos *info, StgFunInfoTable *infoTable ) { if (infoTable->i.srt_bitmap == (StgHalfWord)(-1)) { info->type = posTypeLargeSRT; - info->next.large_srt.srt = (StgLargeSRT *)infoTable->srt; + info->next.large_srt.srt = (StgLargeSRT *)GET_FUN_SRT(infoTable); info->next.large_srt.offset = 0; } else { info->type = posTypeSRT; - info->next.srt.srt = (StgClosure **)(infoTable->srt); + info->next.srt.srt = (StgClosure **)GET_FUN_SRT(infoTable); info->next.srt.srt_bitmap = infoTable->i.srt_bitmap; } } @@ -348,11 +343,11 @@ init_srt_thunk( stackPos *info, StgThunkInfoTable *infoTable ) { if (infoTable->i.srt_bitmap == (StgHalfWord)(-1)) { info->type = posTypeLargeSRT; - info->next.large_srt.srt = (StgLargeSRT *)infoTable->srt; + info->next.large_srt.srt = (StgLargeSRT *)GET_SRT(infoTable); info->next.large_srt.offset = 0; } else { info->type = posTypeSRT; - info->next.srt.srt = (StgClosure **)(infoTable->srt); + info->next.srt.srt = (StgClosure **)GET_SRT(infoTable); info->next.srt.srt_bitmap = infoTable->i.srt_bitmap; } } @@ -441,7 +436,7 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child ) bdescr *nbd; // Next Block Descriptor #ifdef DEBUG_RETAINER - // fprintf(stderr, "push(): stackTop = 0x%x, currentStackBoundary = 0x%x\n", stackTop, currentStackBoundary); + // debugBelch("push(): stackTop = 0x%x, currentStackBoundary = 0x%x\n", stackTop, currentStackBoundary); #endif ASSERT(get_itbl(c)->type != TSO); @@ -634,7 +629,7 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child ) if (stackTop - 1 < stackBottom) { #ifdef DEBUG_RETAINER - // fprintf(stderr, "push() to the next stack.\n"); + // debugBelch("push() to the next stack.\n"); #endif // currentStack->free is updated when the active stack is switched // to the next stack. @@ -663,7 +658,7 @@ push( StgClosure *c, retainer c_child_r, StgClosure **first_child ) stackSize++; if (stackSize > maxStackSize) maxStackSize = stackSize; // ASSERT(stackSize >= 0); - // fprintf(stderr, "stackSize = %d\n", stackSize); + // debugBelch("stackSize = %d\n", stackSize); #endif } @@ -686,7 +681,7 @@ popOffReal(void) bdescr *pbd; // Previous Block Descriptor #ifdef DEBUG_RETAINER - // fprintf(stderr, "pop() to the previous stack.\n"); + // debugBelch("pop() to the previous stack.\n"); #endif ASSERT(stackTop + 1 == stackLimit); @@ -701,7 +696,7 @@ popOffReal(void) if (stackSize > maxStackSize) maxStackSize = stackSize; /* ASSERT(stackSize >= 0); - fprintf(stderr, "stackSize = %d\n", stackSize); + debugBelch("stackSize = %d\n", stackSize); */ #endif return; @@ -722,7 +717,7 @@ popOffReal(void) if (stackSize > maxStackSize) maxStackSize = stackSize; /* ASSERT(stackSize >= 0); - fprintf(stderr, "stackSize = %d\n", stackSize); + debugBelch("stackSize = %d\n", stackSize); */ #endif } @@ -730,7 +725,7 @@ popOffReal(void) static INLINE void popOff(void) { #ifdef DEBUG_RETAINER - // fprintf(stderr, "\tpopOff(): stackTop = 0x%x, currentStackBoundary = 0x%x\n", stackTop, currentStackBoundary); + // debugBelch("\tpopOff(): stackTop = 0x%x, currentStackBoundary = 0x%x\n", stackTop, currentStackBoundary); #endif ASSERT(stackTop != stackLimit); @@ -744,7 +739,7 @@ popOff(void) { if (stackSize > maxStackSize) maxStackSize = stackSize; /* ASSERT(stackSize >= 0); - fprintf(stderr, "stackSize = %d\n", stackSize); + debugBelch("stackSize = %d\n", stackSize); */ #endif return; @@ -775,7 +770,7 @@ pop( StgClosure **c, StgClosure **cp, retainer *r ) stackElement *se; #ifdef DEBUG_RETAINER - // fprintf(stderr, "pop(): stackTop = 0x%x, currentStackBoundary = 0x%x\n", stackTop, currentStackBoundary); + // debugBelch("pop(): stackTop = 0x%x, currentStackBoundary = 0x%x\n", stackTop, currentStackBoundary); #endif do { @@ -1295,7 +1290,7 @@ retainStack( StgClosure *c, retainer c_child_r, currentStackBoundary = stackTop; #ifdef DEBUG_RETAINER - // fprintf(stderr, "retainStack() called: oldStackBoundary = 0x%x, currentStackBoundary = 0x%x\n", oldStackBoundary, currentStackBoundary); + // debugBelch("retainStack() called: oldStackBoundary = 0x%x, currentStackBoundary = 0x%x\n", oldStackBoundary, currentStackBoundary); #endif ASSERT(get_itbl(c)->type != TSO || @@ -1324,7 +1319,7 @@ retainStack( StgClosure *c, retainer c_child_r, p = retain_small_bitmap(p, size, bitmap, c, c_child_r); follow_srt: - retainSRT((StgClosure **)info->srt, info->i.srt_bitmap, c, c_child_r); + retainSRT((StgClosure **)GET_SRT(info), info->i.srt_bitmap, c, c_child_r); continue; case RET_BCO: { @@ -1343,9 +1338,9 @@ retainStack( StgClosure *c, retainer c_child_r, // large bitmap (> 32 entries, or > 64 on a 64-bit machine) case RET_BIG: case RET_VEC_BIG: - size = info->i.layout.large_bitmap->size; + size = GET_LARGE_BITMAP(&info->i)->size; p++; - retain_large_bitmap(p, info->i.layout.large_bitmap, + retain_large_bitmap(p, GET_LARGE_BITMAP(&info->i), size, c, c_child_r); p += size; // and don't forget to follow the SRT @@ -1357,16 +1352,16 @@ retainStack( StgClosure *c, retainer c_child_r, dyn = ((StgRetDyn *)p)->liveness; // traverse the bitmap first - bitmap = GET_LIVENESS(dyn); + bitmap = RET_DYN_LIVENESS(dyn); p = (P_)&((StgRetDyn *)p)->payload[0]; size = RET_DYN_BITMAP_SIZE; p = retain_small_bitmap(p, size, bitmap, c, c_child_r); // skip over the non-ptr words - p += GET_NONPTRS(dyn) + RET_DYN_NONPTR_REGS_SIZE; + p += RET_DYN_NONPTRS(dyn) + RET_DYN_NONPTR_REGS_SIZE; // follow the ptr words - for (size = GET_PTRS(dyn); size > 0; size--) { + for (size = RET_DYN_PTRS(dyn); size > 0; size--) { retainClosure((StgClosure *)*p, c, c_child_r); p++; } @@ -1381,21 +1376,21 @@ retainStack( StgClosure *c, retainer c_child_r, fun_info = get_fun_itbl(ret_fun->fun); p = (P_)&ret_fun->payload; - switch (fun_info->fun_type) { + switch (fun_info->f.fun_type) { case ARG_GEN: - bitmap = BITMAP_BITS(fun_info->bitmap); - size = BITMAP_SIZE(fun_info->bitmap); + bitmap = BITMAP_BITS(fun_info->f.bitmap); + size = BITMAP_SIZE(fun_info->f.bitmap); p = retain_small_bitmap(p, size, bitmap, c, c_child_r); break; case ARG_GEN_BIG: - size = ((StgLargeBitmap *)fun_info->bitmap)->size; - retain_large_bitmap(p, (StgLargeBitmap *)fun_info->bitmap, + size = GET_FUN_LARGE_BITMAP(fun_info)->size; + retain_large_bitmap(p, GET_FUN_LARGE_BITMAP(fun_info), size, c, c_child_r); p += size; break; default: - bitmap = BITMAP_BITS(stg_arg_bitmaps[fun_info->fun_type]); - size = BITMAP_SIZE(stg_arg_bitmaps[fun_info->fun_type]); + bitmap = BITMAP_BITS(stg_arg_bitmaps[fun_info->f.fun_type]); + size = BITMAP_SIZE(stg_arg_bitmaps[fun_info->f.fun_type]); p = retain_small_bitmap(p, size, bitmap, c, c_child_r); break; } @@ -1411,7 +1406,7 @@ retainStack( StgClosure *c, retainer c_child_r, // restore currentStackBoundary currentStackBoundary = oldStackBoundary; #ifdef DEBUG_RETAINER - // fprintf(stderr, "retainStack() finished: currentStackBoundary = 0x%x\n", currentStackBoundary); + // debugBelch("retainStack() finished: currentStackBoundary = 0x%x\n", currentStackBoundary); #endif #ifdef DEBUG_RETAINER @@ -1437,14 +1432,14 @@ retain_PAP (StgPAP *pap, retainer c_child_r) p = (StgPtr)pap->payload; size = pap->n_args; - switch (fun_info->fun_type) { + switch (fun_info->f.fun_type) { case ARG_GEN: - bitmap = BITMAP_BITS(fun_info->bitmap); + bitmap = BITMAP_BITS(fun_info->f.bitmap); p = retain_small_bitmap(p, pap->n_args, bitmap, (StgClosure *)pap, c_child_r); break; case ARG_GEN_BIG: - retain_large_bitmap(p, (StgLargeBitmap *)fun_info->bitmap, + retain_large_bitmap(p, GET_FUN_LARGE_BITMAP(fun_info), size, (StgClosure *)pap, c_child_r); p += size; break; @@ -1454,7 +1449,7 @@ retain_PAP (StgPAP *pap, retainer c_child_r) p += size; break; default: - bitmap = BITMAP_BITS(stg_arg_bitmaps[fun_info->fun_type]); + bitmap = BITMAP_BITS(stg_arg_bitmaps[fun_info->f.fun_type]); p = retain_small_bitmap(p, pap->n_args, bitmap, (StgClosure *)pap, c_child_r); break; @@ -1497,7 +1492,7 @@ retainClosure( StgClosure *c0, StgClosure *cp0, retainer r0 ) #ifdef DEBUG_RETAINER // oldStackTop = stackTop; - // fprintf(stderr, "retainClosure() called: c0 = 0x%x, cp0 = 0x%x, r0 = 0x%x\n", c0, cp0, r0); + // debugBelch("retainClosure() called: c0 = 0x%x, cp0 = 0x%x, r0 = 0x%x\n", c0, cp0, r0); #endif // (c, cp, r) = (c0, cp0, r0) @@ -1507,18 +1502,18 @@ retainClosure( StgClosure *c0, StgClosure *cp0, retainer r0 ) goto inner_loop; loop: - //fprintf(stderr, "loop"); + //debugBelch("loop"); // pop to (c, cp, r); pop(&c, &cp, &r); if (c == NULL) { #ifdef DEBUG_RETAINER - // fprintf(stderr, "retainClosure() ends: oldStackTop = 0x%x, stackTop = 0x%x\n", oldStackTop, stackTop); + // debugBelch("retainClosure() ends: oldStackTop = 0x%x, stackTop = 0x%x\n", oldStackTop, stackTop); #endif return; } - //fprintf(stderr, "inner_loop"); + //debugBelch("inner_loop"); inner_loop: // c = current closure under consideration, @@ -1560,13 +1555,13 @@ inner_loop: if (((StgTSO *)c)->what_next == ThreadComplete || ((StgTSO *)c)->what_next == ThreadKilled) { #ifdef DEBUG_RETAINER - fprintf(stderr, "ThreadComplete or ThreadKilled encountered in retainClosure()\n"); + debugBelch("ThreadComplete or ThreadKilled encountered in retainClosure()\n"); #endif goto loop; } if (((StgTSO *)c)->what_next == ThreadRelocated) { #ifdef DEBUG_RETAINER - fprintf(stderr, "ThreadRelocated encountered in retainClosure()\n"); + debugBelch("ThreadRelocated encountered in retainClosure()\n"); #endif c = (StgClosure *)((StgTSO *)c)->link; goto inner_loop; @@ -1914,7 +1909,7 @@ resetStaticObjectForRetainerProfiling( void ) } } #ifdef DEBUG_RETAINER - // fprintf(stderr, "count in scavenged_static_objects = %d\n", count); + // debugBelch("count in scavenged_static_objects = %d\n", count); #endif } @@ -1936,25 +1931,25 @@ retainerProfile(void) #endif #ifdef DEBUG_RETAINER - fprintf(stderr, " < retainerProfile() invoked : %d>\n", retainerGeneration); + debugBelch(" < retainerProfile() invoked : %d>\n", retainerGeneration); #endif stat_startRP(); // We haven't flipped the bit yet. #ifdef DEBUG_RETAINER - fprintf(stderr, "Before traversing:\n"); + debugBelch("Before traversing:\n"); sumOfCostLinear = 0; for (i = 0;i < N_CLOSURE_TYPES; i++) costArrayLinear[i] = 0; totalHeapSize = checkHeapSanityForRetainerProfiling(); - fprintf(stderr, "\tsumOfCostLinear = %d, totalHeapSize = %d\n", sumOfCostLinear, totalHeapSize); + debugBelch("\tsumOfCostLinear = %d, totalHeapSize = %d\n", sumOfCostLinear, totalHeapSize); /* - fprintf(stderr, "costArrayLinear[] = "); + debugBelch("costArrayLinear[] = "); for (i = 0;i < N_CLOSURE_TYPES; i++) - fprintf(stderr, "[%u:%u] ", i, costArrayLinear[i]); - fprintf(stderr, "\n"); + debugBelch("[%u:%u] ", i, costArrayLinear[i]); + debugBelch("\n"); */ ASSERT(sumOfCostLinear == totalHeapSize); @@ -1962,7 +1957,7 @@ retainerProfile(void) /* #define pcostArrayLinear(index) \ if (costArrayLinear[index] > 0) \ - fprintf(stderr, "costArrayLinear[" #index "] = %u\n", costArrayLinear[index]) + debugBelch("costArrayLinear[" #index "] = %u\n", costArrayLinear[index]) pcostArrayLinear(THUNK_STATIC); pcostArrayLinear(FUN_STATIC); pcostArrayLinear(CONSTR_STATIC); @@ -1985,7 +1980,7 @@ retainerProfile(void) timesAnyObjectVisited = 0; #ifdef DEBUG_RETAINER - fprintf(stderr, "During traversing:\n"); + debugBelch("During traversing:\n"); sumOfNewCost = 0; sumOfNewCostExtra = 0; for (i = 0;i < N_CLOSURE_TYPES; i++) @@ -2007,13 +2002,13 @@ retainerProfile(void) computeRetainerSet(); #ifdef DEBUG_RETAINER - fprintf(stderr, "After traversing:\n"); + debugBelch("After traversing:\n"); sumOfCostLinear = 0; for (i = 0;i < N_CLOSURE_TYPES; i++) costArrayLinear[i] = 0; totalHeapSize = checkHeapSanityForRetainerProfiling(); - fprintf(stderr, "\tsumOfCostLinear = %d, totalHeapSize = %d\n", sumOfCostLinear, totalHeapSize); + debugBelch("\tsumOfCostLinear = %d, totalHeapSize = %d\n", sumOfCostLinear, totalHeapSize); ASSERT(sumOfCostLinear == totalHeapSize); // now, compare the two results @@ -2024,22 +2019,22 @@ retainerProfile(void) 1) Dead weak pointers, whose type is CONSTR. These objects are not reachable from any roots. */ - fprintf(stderr, "Comparison:\n"); - fprintf(stderr, "\tcostArrayLinear[] (must be empty) = "); + debugBelch("Comparison:\n"); + debugBelch("\tcostArrayLinear[] (must be empty) = "); for (i = 0;i < N_CLOSURE_TYPES; i++) if (costArray[i] != costArrayLinear[i]) // nothing should be printed except MUT_VAR after major GCs - fprintf(stderr, "[%u:%u] ", i, costArrayLinear[i]); - fprintf(stderr, "\n"); + debugBelch("[%u:%u] ", i, costArrayLinear[i]); + debugBelch("\n"); - fprintf(stderr, "\tsumOfNewCost = %u\n", sumOfNewCost); - fprintf(stderr, "\tsumOfNewCostExtra = %u\n", sumOfNewCostExtra); - fprintf(stderr, "\tcostArray[] (must be empty) = "); + debugBelch("\tsumOfNewCost = %u\n", sumOfNewCost); + debugBelch("\tsumOfNewCostExtra = %u\n", sumOfNewCostExtra); + debugBelch("\tcostArray[] (must be empty) = "); for (i = 0;i < N_CLOSURE_TYPES; i++) if (costArray[i] != costArrayLinear[i]) // nothing should be printed except MUT_VAR after major GCs - fprintf(stderr, "[%u:%u] ", i, costArray[i]); - fprintf(stderr, "\n"); + debugBelch("[%u:%u] ", i, costArray[i]); + debugBelch("\n"); // only for major garbage collection ASSERT(sumOfNewCost + sumOfNewCostExtra == sumOfCostLinear); @@ -2085,17 +2080,17 @@ sanityCheckHeapClosure( StgClosure *c ) if (get_itbl(c)->type == CONSTR && !strcmp(get_itbl(c)->prof.closure_type, "DEAD_WEAK") && !strcmp(get_itbl(c)->prof.closure_desc, "DEAD_WEAK")) { - fprintf(stderr, "\tUnvisited dead weak pointer object found: c = %p\n", c); + debugBelch("\tUnvisited dead weak pointer object found: c = %p\n", c); costArray[get_itbl(c)->type] += cost(c); sumOfNewCost += cost(c); } else - fprintf(stderr, + debugBelch( "Unvisited object: flip = %d, c = %p(%d, %s, %s), rs = %p\n", flip, c, get_itbl(c)->type, get_itbl(c)->prof.closure_type, get_itbl(c)->prof.closure_desc, RSET(c)); } else { - // fprintf(stderr, "sanityCheckHeapClosure) S: flip = %d, c = %p(%d), rs = %p\n", flip, c, get_itbl(c)->type, RSET(c)); + // debugBelch("sanityCheckHeapClosure) S: flip = %d, c = %p(%d), rs = %p\n", flip, c, get_itbl(c)->type, RSET(c)); } info = get_itbl(c); @@ -2284,12 +2279,12 @@ checkHeapSanityForRetainerProfiling( void ) nat costSum, g, s; costSum = 0; - fprintf(stderr, "START: sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); + debugBelch("START: sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); if (RtsFlags.GcFlags.generations == 1) { costSum += heapCheck(g0s0->to_blocks); - fprintf(stderr, "heapCheck: sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); + debugBelch("heapCheck: sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); costSum += chainCheck(g0s0->large_objects); - fprintf(stderr, "chainCheck: sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); + debugBelch("chainCheck: sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); } else { for (g = 0; g < RtsFlags.GcFlags.generations; g++) for (s = 0; s < generations[g].n_steps; s++) { @@ -2302,14 +2297,14 @@ checkHeapSanityForRetainerProfiling( void ) */ if (g == 0 && s == 0) { costSum += smallObjectPoolCheck(); - fprintf(stderr, "smallObjectPoolCheck(): sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); + debugBelch("smallObjectPoolCheck(): sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); costSum += chainCheck(generations[g].steps[s].large_objects); - fprintf(stderr, "chainCheck(): sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); + debugBelch("chainCheck(): sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); } else { costSum += heapCheck(generations[g].steps[s].blocks); - fprintf(stderr, "heapCheck(): sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); + debugBelch("heapCheck(): sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); costSum += chainCheck(generations[g].steps[s].large_objects); - fprintf(stderr, "chainCheck(): sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); + debugBelch("chainCheck(): sumOfCostLinear = %d, costSum = %d\n", sumOfCostLinear, costSum); } } } @@ -2333,7 +2328,7 @@ findPointer(StgPtr p) if (*q == (StgWord)p) { r = q; while (!LOOKS_LIKE_GHC_INFO(*r)) r--; - fprintf(stderr, "Found in gen[%d], step[%d]: q = %p, r = %p\n", g, s, q, r); + debugBelch("Found in gen[%d], step[%d]: q = %p, r = %p\n", g, s, q, r); // return; } } @@ -2345,7 +2340,7 @@ findPointer(StgPtr p) if (*q == (StgWord)p) { r = q; while (*r == 0 || !LOOKS_LIKE_GHC_INFO(*r)) r--; - fprintf(stderr, "Found in gen[%d], large_objects: %p\n", g, r); + debugBelch("Found in gen[%d], large_objects: %p\n", g, r); // return; } } @@ -2366,14 +2361,14 @@ belongToHeap(StgPtr p) bd = generations[g].steps[s].blocks; for (; bd; bd = bd->link) { if (bd->start <= p && p < bd->free) { - fprintf(stderr, "Belongs to gen[%d], step[%d]", g, s); + debugBelch("Belongs to gen[%d], step[%d]", g, s); return; } } bd = generations[g].steps[s].large_objects; for (; bd; bd = bd->link) { if (bd->start <= p && p < bd->start + getHeapClosureSize((StgClosure *)bd->start)) { - fprintf(stderr, "Found in gen[%d], large_objects: %p\n", g, bd->start); + debugBelch("Found in gen[%d], large_objects: %p\n", g, bd->start); return; } }