summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorSylvain Henry <sylvain@haskus.fr>2019-12-17 15:02:51 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-12-19 11:16:17 -0500
commit0c114c6599c1df93b208c5f2b1754523858d80ee (patch)
tree3546bd29b114811f6e8a16e56986619803e60cc1 /rts
parentfad866e028e577b55510a3f9a2faf26d6fdd7bce (diff)
downloadhaskell-0c114c6599c1df93b208c5f2b1754523858d80ee.tar.gz
Handle large ARR_WORDS in heap census (fix #17572)
We can do a heap census with a non-profiling RTS. With a non-profiling RTS we don't zero superfluous bytes of shrunk arrays hence a need to handle the case specifically to avoid a crash. Revert part of a586b33f8e8ad60b5c5ef3501c89e9b71794bbed
Diffstat (limited to 'rts')
-rw-r--r--rts/ProfHeap.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/rts/ProfHeap.c b/rts/ProfHeap.c
index c35b4bae4e..4f82b0ba83 100644
--- a/rts/ProfHeap.c
+++ b/rts/ProfHeap.c
@@ -1011,6 +1011,22 @@ heapCensusChain( Census *census, bdescr *bd )
p = bd->start;
+ // When we shrink a large ARR_WORDS, we do not adjust the free pointer
+ // of the associated block descriptor, thus introducing slop at the end
+ // of the object. This slop remains after GC, violating the assumption
+ // of the loop below that all slop has been eliminated (#11627).
+ // The slop isn't always zeroed (e.g. in non-profiling mode, cf
+ // OVERWRITING_CLOSURE_OFS).
+ // Consequently, we handle large ARR_WORDS objects as a special case.
+ if (bd->flags & BF_LARGE
+ && get_itbl((StgClosure *)p)->type == ARR_WORDS) {
+ size = arr_words_sizeW((StgArrBytes *)p);
+ prim = true;
+ heapProfObject(census, (StgClosure *)p, size, prim);
+ continue;
+ }
+
+
while (p < bd->free) {
info = get_itbl((const StgClosure *)p);
prim = false;