diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2019-12-17 15:02:51 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2019-12-19 11:16:17 -0500 |
commit | 0c114c6599c1df93b208c5f2b1754523858d80ee (patch) | |
tree | 3546bd29b114811f6e8a16e56986619803e60cc1 /rts/ProfHeap.c | |
parent | fad866e028e577b55510a3f9a2faf26d6fdd7bce (diff) | |
download | haskell-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/ProfHeap.c')
-rw-r--r-- | rts/ProfHeap.c | 16 |
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; |