Coverage Report

Created: 2018-07-03 15:31

/home/travis/build/MoarVM/MoarVM/src/profiler/heapsnapshot.h
Line
Count
Source (jump to first uncovered line)
1
struct MVMHeapDumpIndexSnapshotEntry {
2
    MVMuint64 collectables_size;
3
    MVMuint64 full_refs_size;
4
    MVMuint64 refs_middlepoint;
5
    MVMuint64 incremental_data;
6
};
7
8
struct MVMHeapDumpIndex {
9
    MVMuint64 stringheap_size;
10
    MVMuint64 types_size;
11
    MVMuint64 staticframes_size;
12
13
    MVMuint64 snapshot_size_entries;
14
    MVMHeapDumpIndexSnapshotEntry *snapshot_sizes;
15
16
    MVMuint64 snapshot_sizes_alloced;
17
};
18
19
/* A collection of heap snapshots, with common type and static frame names.
20
 * Note that we take care to never refer to heap objects themselves in here,
21
 * including for types and frames, since to do so would extend their lifetime
22
 * for the whole program, which would render the results pretty bogus. */
23
struct MVMHeapSnapshotCollection {
24
    /* Snapshot we are currently taking and its index */
25
    MVMHeapSnapshot *snapshot;
26
    MVMuint64 snapshot_idx;
27
28
    /* Known types/REPRs. Just a list for now, but we might like to look at a
29
     * hash or trie if this ends up making taking a snapshot wicked slow. */
30
    MVMHeapSnapshotType *types;
31
    MVMuint64 num_types;
32
    MVMuint64 alloc_types;
33
34
    /* Known static frames. Same applies to searching this as to the above. */
35
    MVMHeapSnapshotStaticFrame *static_frames;
36
    MVMuint64 num_static_frames;
37
    MVMuint64 alloc_static_frames;
38
39
    /* Strings, referenced by index from various places. Also a "should we
40
     * free it" flag for each one. */
41
    char **strings;
42
    MVMuint64 num_strings;
43
    MVMuint64 alloc_strings;
44
    char *strings_free;
45
    MVMuint64 num_strings_free;
46
    MVMuint64 alloc_strings_free;
47
48
    MVMuint64 types_written;
49
    MVMuint64 static_frames_written;
50
    MVMuint64 strings_written;
51
52
    MVMHeapDumpIndex *index;
53
54
    /* The file handle we are outputting to */
55
    FILE *fh;
56
};
57
58
/* An individual heap snapshot. */
59
struct MVMHeapSnapshot {
60
    /* Array of data about collectables on the heap. */
61
    MVMHeapSnapshotCollectable *collectables;
62
    MVMuint64 num_collectables;
63
    MVMuint64 alloc_collectables;
64
65
    /* References.  */
66
    MVMHeapSnapshotReference *references;
67
    MVMuint64 num_references;
68
    MVMuint64 alloc_references;
69
};
70
71
/* An object/type object/STable type in the snapshot. */
72
struct MVMHeapSnapshotType {
73
    /* String heap index of the REPR name. */
74
    MVMuint64 repr_name;
75
76
    /* String heap index of the type's debug name. */
77
    MVMuint64 type_name;
78
};
79
80
/* A static frame in the snapshot. */
81
struct MVMHeapSnapshotStaticFrame {
82
    /* The static frame name; index into the snapshot collection string heap. */
83
    MVMuint64 name;
84
85
    /* The static frame compilation unit ID, for added uniqueness checking.
86
     * Also an index into the string heap. */
87
    MVMuint64 cuid;
88
89
    /* The line number where it's declared. */
90
    MVMuint64 line;
91
92
    /* And the filename; also an index into snapshot collection string heap. */
93
    MVMuint64 file;
94
};
95
96
/* Kinds of collectable, plus a few "virtual" kinds to cover the various places
97
 * we find roots. MVM_SNAPSHOT_COL_KIND_ROOT is the ultimate root of the heap
98
 * snapshot and everything hangs off it. */
99
0
#define MVM_SNAPSHOT_COL_KIND_OBJECT            1
100
0
#define MVM_SNAPSHOT_COL_KIND_TYPE_OBJECT       2
101
0
#define MVM_SNAPSHOT_COL_KIND_STABLE            3
102
0
#define MVM_SNAPSHOT_COL_KIND_FRAME             4
103
0
#define MVM_SNAPSHOT_COL_KIND_PERM_ROOTS        5
104
0
#define MVM_SNAPSHOT_COL_KIND_INSTANCE_ROOTS    6
105
0
#define MVM_SNAPSHOT_COL_KIND_CSTACK_ROOTS      7
106
0
#define MVM_SNAPSHOT_COL_KIND_THREAD_ROOTS      8
107
0
#define MVM_SNAPSHOT_COL_KIND_ROOT              9
108
0
#define MVM_SNAPSHOT_COL_KIND_INTERGEN_ROOTS    10
109
0
#define MVM_SNAPSHOT_COL_KIND_CALLSTACK_ROOTS   11
110
111
/* Data about an individual collectable in the heap snapshot. Ordered to avoid
112
 * holes. */
113
struct MVMHeapSnapshotCollectable {
114
    /* What kind of collectable is it? */
115
    MVMuint16 kind;
116
117
    /* Self-size (from the collectable header). */
118
    MVMuint16 collectable_size;
119
120
    /* Index into the snapshot collection type name or frame info array,
121
     * depending on kind. */
122
    MVMuint32 type_or_frame_index;
123
124
    /* The number of other collectables this one references. */
125
    MVMuint32 num_refs;
126
127
    /* Index into the references info list. */
128
    MVMuint64 refs_start;
129
130
    /* Unmanaged size (memory held but not under the GC's contorl). */
131
    MVMuint64 unmanaged_size;
132
};
133
134
/* Reference identifier kinds. */
135
0
#define MVM_SNAPSHOT_REF_KIND_UNKNOWN   0
136
0
#define MVM_SNAPSHOT_REF_KIND_INDEX     1
137
0
#define MVM_SNAPSHOT_REF_KIND_STRING    2
138
139
/* Number of bits needed for ref kind. */
140
0
#define MVM_SNAPSHOT_REF_KIND_BITS      2
141
142
/* A reference from one collectable to another. */
143
struct MVMHeapSnapshotReference {
144
    /* The lower MVM_SNAPSHOT_REF_KIND_BITS bits indicate the type of reference.
145
     * After shifting those away, we either have a numeric index (e.g. for
146
     * array indexes) or an index into the string heap (for lexicals in frames
147
     * and attributes in objects). If kind is MVM_SNAPSHOT_REF_KIND_UNKNOWN the
148
     * rest of the bits will be zero; we know nothing of the relationship. */
149
    MVMuint64 description;
150
151
    /* The index of the collectable referenced. */
152
    MVMuint64 collectable_index;
153
};
154
155
/* Current state object whlie taking a heap snapshot. */
156
struct MVMHeapSnapshotState {
157
    /* The heap snapshot collection and current working snapshot. */
158
    MVMHeapSnapshotCollection *col;
159
    MVMHeapSnapshot *hs;
160
161
    /* Our current collectable worklist. */
162
    MVMHeapSnapshotWorkItem *workitems;
163
    MVMuint64 num_workitems;
164
    MVMuint64 alloc_workitems;
165
166
    /* The collectable we're currently adding references for. */
167
    MVMuint64 ref_from;
168
169
    /* The seen hash of collectables (including frames). */
170
    MVMHeapSnapshotSeen *seen;
171
172
    /* We sometimes use GC mark functions to find references. Keep a worklist
173
     * around for those times (much cheaper than allocating it whenever we
174
     * need it). */
175
    MVMGCWorklist *gcwl;
176
};
177
178
/* Work item used while taking a heap snapshot. */
179
struct MVMHeapSnapshotWorkItem {
180
    /* The kind of collectable. */
181
    MVMuint16 kind;
182
183
    /* Index in the collectables (assigned upon adding to the worklist). */
184
    MVMuint64 col_idx;
185
186
    /* Target collectable, if any. */
187
    void *target;
188
};
189
190
/* Heap seen hash entry used while taking a heap snapshot. */
191
struct MVMHeapSnapshotSeen {
192
    /* The seen address. */
193
    void *address;
194
195
    /* The collectables index it has. */
196
    MVMuint64 idx;
197
198
    /* Hash handle. */
199
    UT_hash_handle hash_handle;
200
};
201
202
MVMint32 MVM_profile_heap_profiling(MVMThreadContext *tc);
203
void MVM_profile_heap_start(MVMThreadContext *tc, MVMObject *config);
204
void MVM_profile_heap_take_snapshot(MVMThreadContext *tc);
205
MVMObject * MVM_profile_heap_end(MVMThreadContext *tc);
206
207
/* API for things that want to contribute more detailed data to the heap
208
 * profile. */
209
MVM_PUBLIC void MVM_profile_heap_add_collectable_rel_const_cstr(MVMThreadContext *tc,
210
    MVMHeapSnapshotState *ss, MVMCollectable *collectable, char *desc);
211
MVM_PUBLIC void MVM_profile_heap_add_collectable_rel_vm_str(MVMThreadContext *tc,
212
    MVMHeapSnapshotState *ss, MVMCollectable *collectable, MVMString *desc);
213
MVM_PUBLIC void MVM_profile_heap_add_collectable_rel_idx(MVMThreadContext *tc,
214
    MVMHeapSnapshotState *ss, MVMCollectable *collectable, MVMuint64 idx);