X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcodeGen%2FStgCmmHeap.hs;h=817a896591855fd70b921b23353c67555082c156;hb=b48fc016e9b15c465ba2c2f1d42b6221bcd19b45;hp=713857929ac2439a48ff1e52bcc4ab385a68f163;hpb=6bc92166180824bf046d31e378359e3c386150f9;p=ghc-hetmet.git diff --git a/compiler/codeGen/StgCmmHeap.hs b/compiler/codeGen/StgCmmHeap.hs index 7138579..817a896 100644 --- a/compiler/codeGen/StgCmmHeap.hs +++ b/compiler/codeGen/StgCmmHeap.hs @@ -334,7 +334,7 @@ These are used in the following circumstances -------------------------------------------------------------- -- A heap/stack check at a function or thunk entry point. -entryHeapCheck :: LocalReg -- Function (closure environment) +entryHeapCheck :: Maybe LocalReg -- Function (closure environment) -> Int -- Arity -- not same as length args b/c of voids -> [LocalReg] -- Non-void args (empty for thunk) -> FCode () @@ -344,15 +344,15 @@ entryHeapCheck fun arity args code = do updfr_sz <- getUpdFrameOff heapCheck True (gc_call updfr_sz) code -- The 'fun' keeps relevant CAFs alive where - fun_expr = CmmReg (CmmLocal fun) - -- JD: ugh... we should only do the following for dynamic closures - args' = fun_expr : map (CmmReg . CmmLocal) args + args' = case fun of Just f -> f : args + Nothing -> args + arg_exprs = map (CmmReg . CmmLocal) args' gc_call updfr_sz - | arity == 0 = mkJumpGC (CmmReg (CmmGlobal GCEnter1)) args' updfr_sz - | otherwise = case gc_lbl (fun : args) of - Just lbl -> mkJumpGC (CmmLit (CmmLabel (mkRtsCodeLabel lbl))) - args' updfr_sz - Nothing -> mkCall generic_gc GC [] [] updfr_sz + | arity == 0 = mkJumpGC (CmmReg (CmmGlobal GCEnter1)) arg_exprs updfr_sz + | otherwise = case gc_lbl args' of + Just lbl -> mkJumpGC (CmmLit (CmmLabel (mkRtsCodeLabel lbl))) + arg_exprs updfr_sz + Nothing -> mkCall generic_gc (GC, GC) [] [] updfr_sz gc_lbl :: [LocalReg] -> Maybe LitString {- @@ -386,13 +386,13 @@ altHeapCheck regs code heapCheck False (gc_call updfr_sz) code where gc_call updfr_sz - | null regs = mkCall generic_gc GC [] [] updfr_sz + | null regs = mkCall generic_gc (GC, GC) [] [] updfr_sz | Just gc_lbl <- rts_label regs -- Canned call - = mkCall (CmmLit (CmmLabel (mkRtsCodeLabel gc_lbl))) GC + = mkCall (CmmLit (CmmLabel (mkRtsCodeLabel gc_lbl))) (GC, GC) regs (map (CmmReg . CmmLocal) regs) updfr_sz | otherwise -- No canned call, and non-empty live vars - = mkCall generic_gc GC [] [] updfr_sz + = mkCall generic_gc (GC, GC) [] [] updfr_sz {- rts_label [reg] @@ -437,7 +437,7 @@ do_checks :: Bool -- Should we check the stack? do_checks checkStack alloc do_gc = withFreshLabel "gc" $ \ loop_id -> withFreshLabel "gc" $ \ gc_id -> - mkLabel loop_id emptyStackInfo + mkLabel loop_id <*> (let hpCheck = if alloc == 0 then mkNop else mkAssign hpReg bump_hp <*> mkCmmIfThen hp_oflo (save_alloc <*> mkBranch gc_id) @@ -445,7 +445,7 @@ do_checks checkStack alloc do_gc mkCmmIfThenElse sp_oflo (mkBranch gc_id) hpCheck else hpCheck) <*> mkComment (mkFastString "outOfLine should follow:") - <*> outOfLine (mkLabel gc_id emptyStackInfo + <*> outOfLine (mkLabel gc_id <*> mkComment (mkFastString "outOfLine here") <*> do_gc <*> mkBranch loop_id)