summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2020-11-18 11:23:00 +0000
committerMatthew Pickering <matthewtpickering@gmail.com>2020-11-18 16:30:35 +0000
commit34b03977d2d3969c9b0e4fef082715e660a9b1ab (patch)
treea7d8f91e44b2b1213af12a1be3dc992d38ec425b
parent4addeede1bee7cec08d3c8b7e614c030307b5f0d (diff)
downloadhaskell-34b03977d2d3969c9b0e4fef082715e660a9b1ab.tar.gz
Profiling by info table mode (-hi)
-rw-r--r--includes/rts/EventLogFormat.h3
-rw-r--r--includes/rts/Flags.h11
-rw-r--r--libraries/base/GHC/RTS/Flags.hsc3
-rw-r--r--rts/ProfHeap.c10
-rw-r--r--rts/RtsFlags.c8
-rw-r--r--rts/eventlog/EventLog.c2
6 files changed, 31 insertions, 6 deletions
diff --git a/includes/rts/EventLogFormat.h b/includes/rts/EventLogFormat.h
index 89a07bf5e1..a3cbb6297b 100644
--- a/includes/rts/EventLogFormat.h
+++ b/includes/rts/EventLogFormat.h
@@ -217,7 +217,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 9455892cdb..7b67f1486d 100644
--- a/includes/rts/Flags.h
+++ b/includes/rts/Flags.h
@@ -132,15 +132,16 @@ typedef struct _COST_CENTRE_FLAGS {
/* See Note [Synchronization of flags and base APIs] */
typedef struct _PROFILING_FLAGS {
uint32_t doHeapProfile;
-# define NO_HEAP_PROFILING 0 /* N.B. Used as indexes into arrays */
-# define HEAP_BY_CCS 1
-# define HEAP_BY_MOD 2
-# define HEAP_BY_DESCR 4
-# define HEAP_BY_TYPE 5
+# define NO_HEAP_PROFILING 0 /* N.B. Used as indexes into arrays */
+# define HEAP_BY_CCS 1
+# define HEAP_BY_MOD 2
+# define HEAP_BY_DESCR 4
+# define HEAP_BY_TYPE 5
# define HEAP_BY_RETAINER 6
# 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 b23ae34165..4c039ee69a 100644
--- a/libraries/base/GHC/RTS/Flags.hsc
+++ b/libraries/base/GHC/RTS/Flags.hsc
@@ -256,6 +256,7 @@ data DoHeapProfile
| HeapByRetainer
| HeapByLDV
| HeapByClosureType
+ | HeapByInfoTable
deriving ( Show -- ^ @since 4.8.0.0
, Generic -- ^ @since 4.15.0.0
)
@@ -270,6 +271,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
@@ -279,6 +281,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 06bff048e7..967c738014 100644
--- a/rts/ProfHeap.c
+++ b/rts/ProfHeap.c
@@ -238,6 +238,10 @@ closureIdentity( const StgClosure *p )
return closure_type_names[info->type];
}
}
+ case HEAP_BY_INFO_TABLE: {
+ const StgInfoTable *info;
+ return get_itbl(p);
+ }
default:
barf("closureIdentity");
@@ -955,6 +959,12 @@ dumpCensus( Census *census )
traceHeapProfSampleString(0, (char *)ctr->identity,
count * sizeof(W_));
break;
+ case HEAP_BY_INFO_TABLE:
+ fprintf(hp_file, "%p", ctr->identity);
+ 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 e7375a0746..0291d0eed7 100644
--- a/rts/RtsFlags.c
+++ b/rts/RtsFlags.c
@@ -1380,6 +1380,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();
@@ -2121,6 +2125,7 @@ static bool read_heap_profiling_flag(const char *arg)
case 'd':
case 'Y':
case 'y':
+ case 'i':
case 'R':
case 'r':
case 'B':
@@ -2201,6 +2206,9 @@ static bool read_heap_profiling_flag(const char *arg)
case 'y':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_TYPE;
break;
+ case 'i':
+ RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_INFO_TABLE;
+ break;
case 'R':
case 'r':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_RETAINER;
diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c
index 11e8a5e0b6..1fcbd0bcc7 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");
}