summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2020-05-03 12:53:35 +0100
committerMatthew Pickering <matthewtpickering@gmail.com>2020-05-03 12:53:35 +0100
commitd81e96721163404db23fe8e772362b9df7cd8453 (patch)
tree034c3576a5e0291d0a73d68fa19e04ef92d04a91
parentfd7ea0fee92a60f9658254cc4fe3abdb4ff299b1 (diff)
downloadhaskell-wip/profile-info-table.tar.gz
Add new profiling mode -hi profile by info tablewip/profile-info-table
-rw-r--r--includes/rts/EventLogFormat.h3
-rw-r--r--includes/rts/Flags.h1
-rw-r--r--libraries/base/GHC/RTS/Flags.hsc3
-rw-r--r--rts/ProfHeap.c22
-rw-r--r--rts/RtsFlags.c4
-rw-r--r--rts/eventlog/EventLog.c2
6 files changed, 34 insertions, 1 deletions
diff --git a/includes/rts/EventLogFormat.h b/includes/rts/EventLogFormat.h
index d5ed01a864..57e9a4b76e 100644
--- a/includes/rts/EventLogFormat.h
+++ b/includes/rts/EventLogFormat.h
@@ -257,7 +257,8 @@ typedef enum {
HEAP_PROF_BREAKDOWN_TYPE_DESCR,
HEAP_PROF_BREAKDOWN_RETAINER,
HEAP_PROF_BREAKDOWN_BIOGRAPHY,
- HEAP_PROF_BREAKDOWN_CLOSURE_TYPE
+ HEAP_PROF_BREAKDOWN_CLOSURE_TYPE,
+ HEAP_PROF_BREAKDOWN_INFO_TABLE
} HeapProfBreakdown;
#if !defined(EVENTLOG_CONSTANTS_ONLY)
diff --git a/includes/rts/Flags.h b/includes/rts/Flags.h
index d0c41a1576..c7d21411b4 100644
--- a/includes/rts/Flags.h
+++ b/includes/rts/Flags.h
@@ -141,6 +141,7 @@ typedef struct _PROFILING_FLAGS {
# define HEAP_BY_LDV 7
# define HEAP_BY_CLOSURE_TYPE 8
+# define HEAP_BY_INFO_TABLE 9
Time heapProfileInterval; /* time between samples */
uint32_t heapProfileIntervalTicks; /* ticks between samples (derived) */
diff --git a/libraries/base/GHC/RTS/Flags.hsc b/libraries/base/GHC/RTS/Flags.hsc
index abff8aa1f9..969a845cf4 100644
--- a/libraries/base/GHC/RTS/Flags.hsc
+++ b/libraries/base/GHC/RTS/Flags.hsc
@@ -219,6 +219,7 @@ data DoHeapProfile
| HeapByRetainer
| HeapByLDV
| HeapByClosureType
+ | HeapByInfoTable
deriving ( Show -- ^ @since 4.8.0.0
)
@@ -232,6 +233,7 @@ instance Enum DoHeapProfile where
fromEnum HeapByRetainer = #{const HEAP_BY_RETAINER}
fromEnum HeapByLDV = #{const HEAP_BY_LDV}
fromEnum HeapByClosureType = #{const HEAP_BY_CLOSURE_TYPE}
+ fromEnum HeapByInfoTable = #{const HEAP_BY_INFO_TABLE}
toEnum #{const NO_HEAP_PROFILING} = NoHeapProfiling
toEnum #{const HEAP_BY_CCS} = HeapByCCS
@@ -241,6 +243,7 @@ instance Enum DoHeapProfile where
toEnum #{const HEAP_BY_RETAINER} = HeapByRetainer
toEnum #{const HEAP_BY_LDV} = HeapByLDV
toEnum #{const HEAP_BY_CLOSURE_TYPE} = HeapByClosureType
+ toEnum #{const HEAP_BY_INFO_TABLE} = HeapByInfoTable
toEnum e = errorWithoutStackTrace ("invalid enum for DoHeapProfile: " ++ show e)
-- | Parameters of the cost-center profiler
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");
}