X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FLdvProfile.c;h=19ebe426d30f43e2eed62437b95cb4c5ecda57e4;hb=28a464a75e14cece5db40f2765a29348273ff2d2;hp=ec91b1a4c70e511fc2d7e842f808d93fc92738bc;hpb=712ab7c768423fe61f01573239ea4e792517fee8;p=ghc-hetmet.git diff --git a/ghc/rts/LdvProfile.c b/ghc/rts/LdvProfile.c index ec91b1a..19ebe42 100644 --- a/ghc/rts/LdvProfile.c +++ b/ghc/rts/LdvProfile.c @@ -36,52 +36,22 @@ void LDV_recordDead_FILL_SLOP_DYNAMIC( StgClosure *p ) { - StgInfoTable *info; - nat nw, i; + nat size, 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) { - info = get_itbl((p)); - switch (info->type) { - case THUNK_1_0: - case THUNK_0_1: - nw = stg_max(MIN_UPD_SIZE,1); - break; + // very like FILL_SLOP(), except that we call LDV_recordDead(). + size = closure_sizeW(p); - case THUNK_2_0: - case THUNK_1_1: - case THUNK_0_2: - case THUNK_SELECTOR: - nw = stg_max(MIN_UPD_SIZE,2); - break; + LDV_recordDead((StgClosure *)(p), size); - case THUNK: - 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_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 = info->layout.payload.ptrs + info->layout.payload.nptrs; - break; - default: - barf("Unexpected closure type %u in LDV_recordDead_FILL_SLOP_DYNAMIC()", info->type); - break; - } - LDV_recordDead((StgClosure *)(p), nw + sizeofW(StgHeader)); - for (i = 0; i < nw; i++) { - ((StgClosure *)(p))->payload[i] = 0; + if (size > sizeofW(StgThunkHeader)) { + for (i = 0; i < size - sizeofW(StgThunkHeader); i++) { + ((StgThunk *)(p))->payload[i] = 0; + } } } } @@ -113,94 +83,68 @@ processHeapClosureForDead( StgClosure *c ) )); } + if (info->type == EVACUATED) { + // The size of the evacuated closure is currently stored in + // the LDV field. See SET_EVACUAEE_FOR_LDV() in + // includes/StgLdvProf.h. + return LDVW(c); + } + + size = closure_sizeW(c); + switch (info->type) { /* 'inherently used' cases: do nothing. */ - case TSO: - size = tso_sizeW((StgTSO *)c); - return size; - case MVAR: - size = sizeofW(StgMVar); - return size; - - case MUT_ARR_PTRS: + case MUT_ARR_PTRS_CLEAN: + case MUT_ARR_PTRS_DIRTY: case MUT_ARR_PTRS_FROZEN: - size = mut_arr_ptrs_sizeW((StgMutArrPtrs *)c); - return size; - + case MUT_ARR_PTRS_FROZEN0: case ARR_WORDS: - size = arr_words_sizeW((StgArrWords *)c); - return size; - case WEAK: - case MUT_VAR: - case FOREIGN: + case MUT_VAR_CLEAN: + case MUT_VAR_DIRTY: case BCO: case STABLE_NAME: - size = sizeW_fromITBL(info); + case TVAR_WAIT_QUEUE: + case TVAR: + case TREC_HEADER: + case TREC_CHUNK: return size; /* ordinary cases: call LDV_recordDead(). */ - case THUNK: - size = stg_max(sizeW_fromITBL(info), sizeofW(StgHeader) + MIN_UPD_SIZE); - break; - 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: - size = sizeofW(StgHeader) + stg_max(MIN_UPD_SIZE, 2); - break; - case AP: - size = ap_sizeW((StgAP *)c); - break; - 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 CONSTR_2_0: case CONSTR_1_1: case CONSTR_0_2: - case FUN: case FUN_1_0: case FUN_0_1: case FUN_2_0: case FUN_1_1: case FUN_0_2: - case BLACKHOLE: case SE_BLACKHOLE: case CAF_BLACKHOLE: case SE_CAF_BLACKHOLE: - size = sizeW_fromITBL(info); - break; - case IND_PERM: case IND_OLDGEN_PERM: - size = sizeofW(StgInd); - break; - /* 'Ingore' cases */ @@ -212,15 +156,10 @@ processHeapClosureForDead( StgClosure *c ) // rate. case IND: case IND_OLDGEN: - size = sizeofW(StgInd); + // Found a dead closure: record its size + LDV_recordDead(c, size); return size; - case EVACUATED: - // The size of the evacuated closure is currently stored in - // the LDV field. See SET_EVACUAEE_FOR_LDV() in - // includes/StgLdvProf.h. - return LDVW(c); - /* Error case */ @@ -253,10 +192,6 @@ processHeapClosureForDead( StgClosure *c ) barf("Invalid object in processHeapClosureForDead(): %d", info->type); return 0; } - - // Found a dead closure: record its size - LDV_recordDead(c, size); - return size; } /* -------------------------------------------------------------------------- @@ -385,7 +320,7 @@ LdvCensusForDead( nat N ) processNurseryForDead(); processChainForDead(generations[g].steps[s].large_objects); } else{ - processHeapForDead(generations[g].steps[s].blocks); + processHeapForDead(generations[g].steps[s].old_blocks); processChainForDead(generations[g].steps[s].large_objects); } }