[commit: ghc] master: Comments (about the stack overflow check) only (4fa1efe)

git at git.haskell.org git at git.haskell.org
Fri Oct 18 13:35:33 UTC 2013


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/4fa1efe3f1feab103f11fbddc08bccf924ef4ef1/ghc

>---------------------------------------------------------------

commit 4fa1efe3f1feab103f11fbddc08bccf924ef4ef1
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date:   Fri Oct 18 13:04:33 2013 +0100

    Comments (about the stack overflow check) only


>---------------------------------------------------------------

4fa1efe3f1feab103f11fbddc08bccf924ef4ef1
 compiler/codeGen/StgCmmHeap.hs |   38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/compiler/codeGen/StgCmmHeap.hs b/compiler/codeGen/StgCmmHeap.hs
index 1d1100c..7710b6f 100644
--- a/compiler/codeGen/StgCmmHeap.hs
+++ b/compiler/codeGen/StgCmmHeap.hs
@@ -535,24 +535,32 @@ heapStackCheckGen stk_hwm mb_bytes
 
 -- Note [Single stack check]
 -- ~~~~~~~~~~~~~~~~~~~~~~~~~
---
 -- When compiling a function we can determine how much stack space it will
 -- use. We therefore need to perform only a single stack check at the beginning
--- of a function to see if we have enough stack space. Instead of referring
--- directly to Sp - as we used to do in the past - the code generator uses
--- (old + 0) in the stack check. Stack layout phase turns (old + 0) into Sp.
+-- of a function to see if we have enough stack space.
+--
+-- The check boils down to comparing Sp+N with SpLim, where N is the
+-- amount of stack space needed.  *BUT* at this stage of the pipeline
+-- we are not supposed to refer to Sp itself, because the stack is not
+-- yet manifest, so we don't quite know where Sp pointing.
+
+-- So instead of referring directly to Sp - as we used to do in the
+-- past - the code generator uses (old + 0) in the stack check. That
+-- is the address of the first word of the old area, so if we add N
+-- we'll get the address of highest used word.
 --
--- The idea here is that, while we need to perform only one stack check for
--- each function, we could in theory place more stack checks later in the
--- function. They would be redundant, but not incorrect (in a sense that they
--- should not change program behaviour). We need to make sure however that a
--- stack check inserted after incrementing the stack pointer checks for a
--- respectively smaller stack space. This would not be the case if the code
--- generator produced direct references to Sp. By referencing (old + 0) we make
--- sure that we always check for a correct amount of stack: when converting
--- (old + 0) to Sp the stack layout phase takes into account changes already
--- made to stack pointer. The idea for this change came from observations made
--- while debugging #8275.
+-- This makes the check robust.  For example, while we need to perform
+-- only one stack check for each function, we could in theory place
+-- more stack checks later in the function. They would be redundant,
+-- but not incorrect (in a sense that they should not change program
+-- behaviour). We need to make sure however that a stack check
+-- inserted after incrementing the stack pointer checks for a
+-- respectively smaller stack space. This would not be the case if the
+-- code generator produced direct references to Sp. By referencing
+-- (old + 0) we make sure that we always check for a correct amount of
+-- stack: when converting (old + 0) to Sp the stack layout phase takes
+-- into account changes already made to stack pointer. The idea for
+-- this change came from observations made while debugging #8275.
 
 do_checks :: Maybe CmmExpr    -- Should we check the stack?
           -> Bool       -- Should we check for preemption?



More information about the ghc-commits mailing list