summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
Diffstat (limited to 'rts')
-rw-r--r--rts/ProfHeap.c22
-rw-r--r--rts/RtsFlags.c4
-rw-r--r--rts/eventlog/EventLog.c2
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");
}