diff options
Diffstat (limited to 'rts')
-rw-r--r-- | rts/ProfHeap.c | 22 | ||||
-rw-r--r-- | rts/RtsFlags.c | 4 | ||||
-rw-r--r-- | rts/eventlog/EventLog.c | 2 |
3 files changed, 28 insertions, 0 deletions
diff --git a/rts/ProfHeap.c b/rts/ProfHeap.c index 43bce78b76..fdb7bae44c 100644 --- a/rts/ProfHeap.c +++ b/rts/ProfHeap.c @@ -238,6 +238,20 @@ closureIdentity( const StgClosure *p ) return closure_type_names[info->type]; } } + case HEAP_BY_INFO_TABLE: { + const StgInfoTable *info; + info = get_itbl(p); + switch (info->type) { + case THUNK: + case THUNK_1_1: + case THUNK_0_2: + case THUNK_2_0: + case THUNK_1_0: + case THUNK_0_1: + case THUNK_SELECTOR: + return get_itbl(p); + default: return NULL; + }} default: barf("closureIdentity"); @@ -939,6 +953,14 @@ dumpCensus( Census *census ) traceHeapProfSampleString(0, (char *)ctr->identity, count * sizeof(W_)); break; + case HEAP_BY_INFO_TABLE: + fprintf(hp_file, "%p", ctr->identity); + // TODO now all the types in this mode are just THUNK closures so + // don't really need to add any more info + char str[100]; + sprintf(str, "%p", ctr->identity); + traceHeapProfSampleString(0, str, count * sizeof(W_)); + break; #if defined(PROFILING) case HEAP_BY_CCS: fprint_ccs(hp_file, (CostCentreStack *)ctr->identity, diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index 5b594c915d..af47f11299 100644 --- a/rts/RtsFlags.c +++ b/rts/RtsFlags.c @@ -1315,6 +1315,10 @@ error = true; OPTION_UNSAFE; RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_CLOSURE_TYPE; break; + case 'i': + OPTION_UNSAFE; + RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_INFO_TABLE; + break; default: OPTION_SAFE; PROFILING_BUILD_ONLY(); diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c index e3597cd73c..1603835c4f 100644 --- a/rts/eventlog/EventLog.c +++ b/rts/eventlog/EventLog.c @@ -1297,6 +1297,8 @@ static HeapProfBreakdown getHeapProfBreakdown(void) return HEAP_PROF_BREAKDOWN_BIOGRAPHY; case HEAP_BY_CLOSURE_TYPE: return HEAP_PROF_BREAKDOWN_CLOSURE_TYPE; + case HEAP_BY_INFO_TABLE: + return HEAP_PROF_BREAKDOWN_INFO_TABLE; default: barf("getHeapProfBreakdown: unknown heap profiling mode"); } |