diff options
Diffstat (limited to 'ghc/compiler/codeGen')
-rw-r--r-- | ghc/compiler/codeGen/CgBindery.lhs | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/ghc/compiler/codeGen/CgBindery.lhs b/ghc/compiler/codeGen/CgBindery.lhs index f2c32dc123..634b406932 100644 --- a/ghc/compiler/codeGen/CgBindery.lhs +++ b/ghc/compiler/codeGen/CgBindery.lhs @@ -514,11 +514,19 @@ buildContLivenessMask name = do let lbl = mkBitmapLabel name - -- realSp points to the frame-header for the current stack frame, - -- and the end of this frame is frame_sp. The size is therefore - -- realSp - frame_sp - 1 (subtract one for the frame-header). frame_sp <- getStackFrame - let liveness = Liveness lbl (realSp-1-frame_sp) mask + let + -- realSp points to the frame-header for the current stack frame, + -- and the end of this frame is frame_sp. The size is therefore + -- realSp - frame_sp - 1 (subtract one for the frame-header). + frame_size = realSp - frame_sp - 1 + + -- make sure the bitmap covers the full frame, by adding + -- zero words at the end as necessary + expand n [] = take ((n+31) `quot` 32) (repeat emptyBS) + expand n (b:bs) = b : expand (n-32) bs + + liveness = Liveness lbl frame_size (expand frame_size mask) absC (CBitmap liveness) return liveness |