diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2020-05-03 12:53:35 +0100 |
---|---|---|
committer | Matthew Pickering <matthewtpickering@gmail.com> | 2020-05-03 12:53:35 +0100 |
commit | d81e96721163404db23fe8e772362b9df7cd8453 (patch) | |
tree | 034c3576a5e0291d0a73d68fa19e04ef92d04a91 | |
parent | fd7ea0fee92a60f9658254cc4fe3abdb4ff299b1 (diff) | |
download | haskell-wip/profile-info-table.tar.gz |
Add new profiling mode -hi profile by info tablewip/profile-info-table
-rw-r--r-- | includes/rts/EventLogFormat.h | 3 | ||||
-rw-r--r-- | includes/rts/Flags.h | 1 | ||||
-rw-r--r-- | libraries/base/GHC/RTS/Flags.hsc | 3 | ||||
-rw-r--r-- | rts/ProfHeap.c | 22 | ||||
-rw-r--r-- | rts/RtsFlags.c | 4 | ||||
-rw-r--r-- | rts/eventlog/EventLog.c | 2 |
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"); } |