/* -----------------------------------------------------------------------------
- * $Id: LdvProfile.c,v 1.2 2001/11/26 16:54:21 simonmar Exp $
*
* (c) The GHC Team, 2001
* Author: Sungwoo Park
#ifdef PROFILING
-#include "Stg.h"
#include "Rts.h"
#include "LdvProfile.h"
#include "RtsFlags.h"
-#include "Itimer.h"
-#include "Proftimer.h"
#include "Profiling.h"
#include "Stats.h"
#include "Storage.h"
#include "RtsUtils.h"
#include "Schedule.h"
-// ldvTimeSave is set in LdvCensusKillAll(), and stores the final number of
-// times that LDV profiling was proformed.
-static nat ldvTimeSave;
-
/* --------------------------------------------------------------------------
* Fills in the slop when a *dynamic* closure changes its type.
* First calls LDV_recordDead() to declare the closure is dead, and then
void
LDV_recordDead_FILL_SLOP_DYNAMIC( StgClosure *p )
{
+ StgInfoTable *info;
+ nat nw, i;
+
+#if defined(__GNUC__) && __GNUC__ < 3 && defined(DEBUG)
+#error Please use gcc 3.0+ to compile this file with DEBUG; gcc < 3.0 miscompiles it
+#endif
+
if (era > 0) {
- StgInfoTable *inf = get_itbl((p));
- nat nw, i;
- switch (inf->type) {
+ info = get_itbl((p));
+ switch (info->type) {
case THUNK_1_0:
case THUNK_0_1:
+ nw = stg_max(MIN_UPD_SIZE,1);
+ break;
+
case THUNK_2_0:
case THUNK_1_1:
case THUNK_0_2:
case THUNK_SELECTOR:
- nw = MIN_UPD_SIZE;
+ nw = stg_max(MIN_UPD_SIZE,2);
break;
+
case THUNK:
- nw = inf->layout.payload.ptrs + inf->layout.payload.nptrs;
- if (nw < MIN_UPD_SIZE)
- nw = MIN_UPD_SIZE;
+ nw = stg_max(info->layout.payload.ptrs + info->layout.payload.nptrs,
+ MIN_UPD_SIZE);
+ break;
+ case AP:
+ nw = sizeofW(StgAP) - sizeofW(StgThunkHeader) + ((StgPAP *)p)->n_args;
break;
- case AP_UPD:
- nw = sizeofW(StgPAP) - sizeofW(StgHeader) + ((StgPAP *)p)->n_args;
+ case AP_STACK:
+ nw = sizeofW(StgAP_STACK) - sizeofW(StgThunkHeader)
+ + ((StgAP_STACK *)p)->size;
break;
case CAF_BLACKHOLE:
case BLACKHOLE:
case SE_BLACKHOLE:
case SE_CAF_BLACKHOLE:
- nw = inf->layout.payload.ptrs + inf->layout.payload.nptrs;
+ nw = info->layout.payload.ptrs + info->layout.payload.nptrs;
break;
default:
- barf("Unexpected closure type %u in LDV_recordDead_FILL_SLOP_DYNAMIC()", inf->type);
+ barf("Unexpected closure type %u in LDV_recordDead_FILL_SLOP_DYNAMIC()", info->type);
break;
}
LDV_recordDead((StgClosure *)(p), nw + sizeofW(StgHeader));
* closure. Returns the size of the closure, including the profiling
* header portion, so that the caller can find the next closure.
* ----------------------------------------------------------------------- */
-static inline nat
+STATIC_INLINE nat
processHeapClosureForDead( StgClosure *c )
{
nat size;
case MUT_ARR_PTRS:
case MUT_ARR_PTRS_FROZEN:
+ case MUT_ARR_PTRS_FROZEN0:
size = mut_arr_ptrs_sizeW((StgMutArrPtrs *)c);
return size;
case WEAK:
case MUT_VAR:
- case MUT_CONS:
- case FOREIGN:
case BCO:
case STABLE_NAME:
size = sizeW_fromITBL(info);
case THUNK_1_0:
case THUNK_0_1:
+ case THUNK_SELECTOR:
+ size = sizeofW(StgHeader) + stg_max(MIN_UPD_SIZE, 1);
+ break;
+
case THUNK_2_0:
case THUNK_1_1:
case THUNK_0_2:
- case THUNK_SELECTOR:
- size = sizeofW(StgHeader) + MIN_UPD_SIZE;
+ size = sizeofW(StgHeader) + stg_max(MIN_UPD_SIZE, 2);
+ break;
+
+ case AP:
+ size = ap_sizeW((StgAP *)c);
break;
- case AP_UPD:
case PAP:
size = pap_sizeW((StgPAP *)c);
break;
+ case AP_STACK:
+ size = ap_stack_sizeW((StgAP_STACK *)c);
+ break;
+
case CONSTR:
case CONSTR_1_0:
case CONSTR_0_1:
case FUN_1_1:
case FUN_0_2:
- case BLACKHOLE_BQ:
case BLACKHOLE:
case SE_BLACKHOLE:
case CAF_BLACKHOLE:
break;
case IND_PERM:
- size = sizeofW(StgInd);
- break;
-
case IND_OLDGEN_PERM:
- size = sizeofW(StgIndOldGen);
+ size = sizeofW(StgInd);
break;
/*
// because they will perish before the next census at any
// rate.
case IND:
- size = sizeofW(StgInd);
- return size;
-
case IND_OLDGEN:
- size = sizeofW(StgIndOldGen);
+ size = sizeofW(StgInd);
return size;
case EVACUATED:
case UPDATE_FRAME:
case CATCH_FRAME:
case STOP_FRAME:
- case SEQ_FRAME:
case RET_DYN:
case RET_BCO:
case RET_SMALL:
StgPtr p, bdLimit;
bdescr *bd;
- bd = MainCapability.r.rNursery;
+ bd = MainCapability.r.rNursery->blocks;
while (bd->start < bd->free) {
p = bd->start;
bdLimit = bd->start + BLOCK_SIZE_W;