diff --git a/ghc/compiler/codeGen/CgBindery.hi-boot b/ghc/compiler/codeGen/CgBindery.hi-boot index 2cc7a1c20b6e6cafbf1731b6a7c180135aa0cc55..f80decba35d26ba1eccd561542502f59893b7e73 100644 --- a/ghc/compiler/codeGen/CgBindery.hi-boot +++ b/ghc/compiler/codeGen/CgBindery.hi-boot @@ -1,10 +1,9 @@ _interface_ CgBindery 1 _exports_ -CgBindery CgBindings CgIdInfo(MkCgIdInfo) VolatileLoc StableLoc nukeVolatileBinds maybeStkLoc; +CgBindery CgBindings CgIdInfo VolatileLoc StableLoc nukeVolatileBinds; _declarations_ 1 type CgBindings = VarEnv.IdEnv CgIdInfo; -1 data CgIdInfo = MkCgIdInfo Var.Id VolatileLoc StableLoc ClosureInfo!LambdaFormInfo; +1 data CgIdInfo; 1 data VolatileLoc; 1 data StableLoc; 1 nukeVolatileBinds _:_ CgBindings -> CgBindings ;; -1 maybeStkLoc _:_ StableLoc -> PrelMaybe.Maybe AbsCSyn.VirtualSpOffset ;; diff --git a/ghc/compiler/codeGen/CgBindery.hi-boot-4 b/ghc/compiler/codeGen/CgBindery.hi-boot-4 index 441dace2fd2fea1a44515c1f540d8bd76a15533a..9a4ba58313411c8f7c56da4208ec01d33ad43abb 100644 --- a/ghc/compiler/codeGen/CgBindery.hi-boot-4 +++ b/ghc/compiler/codeGen/CgBindery.hi-boot-4 @@ -1,10 +1,9 @@ _interface_ CgBindery 1 0 _exports_ -CgBindery CgBindings CgIdInfo{MkCgIdInfo} VolatileLoc StableLoc nukeVolatileBinds maybeStkLoc; +CgBindery CgBindings CgIdInfo VolatileLoc StableLoc nukeVolatileBinds; _declarations_ 1 type CgBindings = VarEnv.IdEnv CgIdInfo; -1 data CgIdInfo = MkCgIdInfo Var.Id VolatileLoc StableLoc ClosureInfo!LambdaFormInfo; +1 data CgIdInfo; 1 data VolatileLoc; 1 data StableLoc; 1 nukeVolatileBinds _:_ CgBindings -> CgBindings ;; -1 maybeStkLoc _:_ StableLoc -> PrelMaybe.Maybe AbsCSyn.VirtualSpOffset ;; diff --git a/ghc/compiler/codeGen/CgBindery.hi-boot-5 b/ghc/compiler/codeGen/CgBindery.hi-boot-5 index 548620193749bff382b9a9a64f89a266093eea9f..f375fcc6e147df8375250d16df082932d6dc5c6f 100644 --- a/ghc/compiler/codeGen/CgBindery.hi-boot-5 +++ b/ghc/compiler/codeGen/CgBindery.hi-boot-5 @@ -1,8 +1,7 @@ __interface CgBindery 1 0 where -__export CgBindery CgBindings CgIdInfo{MkCgIdInfo} VolatileLoc StableLoc nukeVolatileBinds maybeStkLoc; +__export CgBindery CgBindings CgIdInfo VolatileLoc StableLoc nukeVolatileBinds; 1 type CgBindings = VarEnv.IdEnv CgIdInfo; -1 data CgIdInfo = MkCgIdInfo Var.Id VolatileLoc StableLoc ClosureInfo!LambdaFormInfo; +1 data CgIdInfo; 1 data VolatileLoc; 1 data StableLoc; 1 nukeVolatileBinds :: CgBindings -> CgBindings ; -1 maybeStkLoc :: StableLoc -> PrelMaybe.Maybe AbsCSyn.VirtualSpOffset ; diff --git a/ghc/compiler/codeGen/CgBindery.lhs b/ghc/compiler/codeGen/CgBindery.lhs index 8fe334e985a2e5994bcda4e7757cc20689bdf8b3..3481feadabd47e72f8e478c427c542d873f0d9ac 100644 --- a/ghc/compiler/codeGen/CgBindery.lhs +++ b/ghc/compiler/codeGen/CgBindery.lhs @@ -5,14 +5,14 @@ \begin{code} module CgBindery ( - CgBindings, CgIdInfo(..){-dubiously concrete-}, + CgBindings, CgIdInfo, StableLoc, VolatileLoc, - maybeStkLoc, - stableAmodeIdInfo, heapIdInfo, newTempAmodeAndIdInfo, letNoEscapeIdInfo, idInfoToAmode, + addBindC, addBindsC, + nukeVolatileBinds, nukeDeadBindings, @@ -34,7 +34,7 @@ import CgMonad import CgUsages ( getHpRelOffset, getSpRelOffset, getRealSp ) import CgStackery ( freeStackSlots, addFreeSlots ) import CLabel ( mkStaticClosureLabel, mkClosureLabel, - mkBitmapLabel ) + mkBitmapLabel, pprCLabel ) import ClosureInfo ( mkLFImported, mkLFArgument, LambdaFormInfo ) import BitSet ( mkBS, emptyBS ) import PrimRep ( isFollowableRep, getPrimRepSize ) @@ -163,6 +163,63 @@ idInfoPiecesToAmode kind NoVolatileLoc NoStableLoc = panic "idInfoPiecesToAmode: #endif \end{code} +%************************************************************************ +%* * +\subsection[CgMonad-bindery]{Monad things for fiddling with @CgBindings@} +%* * +%************************************************************************ + +There are three basic routines, for adding (@addBindC@), modifying +(@modifyBindC@) and looking up (@lookupBindC@) bindings. + +A @Id@ is bound to a @(VolatileLoc, StableLoc)@ triple. +The name should not already be bound. (nice ASSERT, eh?) + +\begin{code} +addBindC :: Id -> CgIdInfo -> Code +addBindC name stuff_to_bind info_down (MkCgState absC binds usage) + = MkCgState absC (extendVarEnv binds name stuff_to_bind) usage + +addBindsC :: [(Id, CgIdInfo)] -> Code +addBindsC new_bindings info_down (MkCgState absC binds usage) + = MkCgState absC new_binds usage + where + new_binds = foldl (\ binds (name,info) -> extendVarEnv binds name info) + binds + new_bindings + +modifyBindC :: Id -> (CgIdInfo -> CgIdInfo) -> Code +modifyBindC name mangle_fn info_down (MkCgState absC binds usage) + = MkCgState absC (modifyVarEnv mangle_fn binds name) usage + +lookupBindC :: Id -> FCode CgIdInfo +lookupBindC name info_down@(MkCgInfoDown _ static_binds srt _) + state@(MkCgState absC local_binds usage) + = (val, state) + where + val = case (lookupVarEnv local_binds name) of + Nothing -> try_static + Just this -> this + + try_static = + case (lookupVarEnv static_binds name) of + Just this -> this + Nothing + -> cgPanic (text "lookupBindC: no info for" <+> ppr name) info_down state + +cgPanic :: SDoc -> CgInfoDownwards -> CgState -> a +cgPanic doc info_down@(MkCgInfoDown _ static_binds srt _) + state@(MkCgState absC local_binds usage) + = pprPanic "cgPanic" + (vcat [doc, + ptext SLIT("static binds for:"), + vcat [ ppr i | (MkCgIdInfo i _ _ _) <- rngVarEnv static_binds ], + ptext SLIT("local binds for:"), + vcat [ ppr i | (MkCgIdInfo i _ _ _) <- rngVarEnv local_binds ], + ptext SLIT("SRT label") <+> pprCLabel srt + ]) +\end{code} + %************************************************************************ %* * \subsection[Bindery-nuke-volatile]{Nuking volatile bindings} diff --git a/ghc/compiler/codeGen/CgExpr.lhs b/ghc/compiler/codeGen/CgExpr.lhs index a57ee94f42625152136c602966476efd35ff5fa3..fc96eb32da14db82a199bebb2f4d2b05324221fe 100644 --- a/ghc/compiler/codeGen/CgExpr.lhs +++ b/ghc/compiler/codeGen/CgExpr.lhs @@ -1,7 +1,7 @@ % % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -% $Id: CgExpr.lhs,v 1.26 1999/06/08 15:56:47 simonmar Exp $ +% $Id: CgExpr.lhs,v 1.27 1999/06/09 14:28:38 simonmar Exp $ % %******************************************************** %* * @@ -22,7 +22,8 @@ import AbsCUtils ( mkAbstractCs ) import CLabel ( mkClosureTblLabel ) import SMRep ( fixedHdrSize ) -import CgBindery ( getArgAmodes, getArgAmode, CgIdInfo, nukeDeadBindings) +import CgBindery ( getArgAmodes, getArgAmode, CgIdInfo, + nukeDeadBindings, addBindC, addBindsC ) import CgCase ( cgCase, saveVolatileVarsAndRegs, restoreCurrentCostCentre ) import CgClosure ( cgRhsClosure, cgStdRhsClosure ) diff --git a/ghc/compiler/codeGen/CgMonad.lhs b/ghc/compiler/codeGen/CgMonad.lhs index df41f44dba8b3327b37d35bee6daf9c276e14417..d649bc24aba61b414c3f9f06b3c8849dc0614106 100644 --- a/ghc/compiler/codeGen/CgMonad.lhs +++ b/ghc/compiler/codeGen/CgMonad.lhs @@ -1,7 +1,7 @@ % % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -% $Id: CgMonad.lhs,v 1.21 1999/06/08 15:56:47 simonmar Exp $ +% $Id: CgMonad.lhs,v 1.22 1999/06/09 14:28:38 simonmar Exp $ % \section[CgMonad]{The code generation monad} @@ -20,8 +20,6 @@ module CgMonad ( forkEvalHelp, forkAbsC, SemiTaggingStuff, - addBindC, addBindsC, modifyBindC, lookupBindC, - EndOfBlockInfo(..), setEndOfBlockInfo, getEndOfBlockInfo, @@ -29,7 +27,7 @@ module CgMonad ( StackUsage, Slot(..), HeapUsage, - profCtrC, cgPanic, + profCtrC, costCentresC, moduleName, @@ -43,13 +41,13 @@ module CgMonad ( #include "HsVersions.h" -import {-# SOURCE #-} CgBindery ( CgIdInfo(..), CgBindings, maybeStkLoc, nukeVolatileBinds ) +import {-# SOURCE #-} CgBindery ( CgIdInfo, CgBindings, nukeVolatileBinds ) import {-# SOURCE #-} CgUsages ( getSpRelOffset ) import AbsCSyn import AbsCUtils ( mkAbsCStmts ) import CmdLineOpts ( opt_SccProfilingOn, opt_DoTickyProfiling ) -import CLabel ( CLabel, mkUpdInfoLabel, pprCLabel ) +import CLabel ( CLabel, mkUpdInfoLabel ) import Module ( Module ) import DataCon ( ConTag ) import Id ( Id ) @@ -177,12 +175,18 @@ sequelToAmode (OnStack virt_sp_offset) sequelToAmode UpdateCode = returnFC (CLbl mkUpdInfoLabel RetRep) sequelToAmode (CaseAlts amode _) = returnFC amode -sequelToAmode (SeqFrame _ _) = cgPanic (text "sequelToAmode: SeqFrame") +sequelToAmode (SeqFrame _ _) = panic "sequelToAmode: SeqFrame" type CgStksAndHeapUsage -- stacks and heap usage information = (StackUsage, HeapUsage) -data Slot = Free | NonPointer deriving (Eq,Show) +data Slot = Free | NonPointer + deriving +#ifdef DEBUG + (Eq,Show) +#else + Eq +#endif type StackUsage = (Int, -- virtSp: Virtual offset of topmost allocated slot @@ -564,60 +568,3 @@ setSRTLabel :: CLabel -> Code -> Code setSRTLabel srt code (MkCgInfoDown c_info statics _ eob_info) state = code (MkCgInfoDown c_info statics srt eob_info) state \end{code} - -%************************************************************************ -%* * -\subsection[CgMonad-bindery]{Monad things for fiddling with @CgBindings@} -%* * -%************************************************************************ - -There are three basic routines, for adding (@addBindC@), modifying -(@modifyBindC@) and looking up (@lookupBindC@) bindings. - -A @Id@ is bound to a @(VolatileLoc, StableLoc)@ triple. -The name should not already be bound. (nice ASSERT, eh?) - -\begin{code} -addBindC :: Id -> CgIdInfo -> Code -addBindC name stuff_to_bind info_down (MkCgState absC binds usage) - = MkCgState absC (extendVarEnv binds name stuff_to_bind) usage - -addBindsC :: [(Id, CgIdInfo)] -> Code -addBindsC new_bindings info_down (MkCgState absC binds usage) - = MkCgState absC new_binds usage - where - new_binds = foldl (\ binds (name,info) -> extendVarEnv binds name info) - binds - new_bindings - -modifyBindC :: Id -> (CgIdInfo -> CgIdInfo) -> Code -modifyBindC name mangle_fn info_down (MkCgState absC binds usage) - = MkCgState absC (modifyVarEnv mangle_fn binds name) usage - -lookupBindC :: Id -> FCode CgIdInfo -lookupBindC name info_down@(MkCgInfoDown _ static_binds srt _) - state@(MkCgState absC local_binds usage) - = (val, state) - where - val = case (lookupVarEnv local_binds name) of - Nothing -> try_static - Just this -> this - - try_static = - case (lookupVarEnv static_binds name) of - Just this -> this - Nothing - -> cgPanic (text "lookupBindC: no info for" <+> ppr name) info_down state - -cgPanic :: SDoc -> CgInfoDownwards -> CgState -> a -cgPanic doc info_down@(MkCgInfoDown _ static_binds srt _) - state@(MkCgState absC local_binds usage) - = pprPanic "cgPanic" - (vcat [doc, - ptext SLIT("static binds for:"), - vcat [ ppr i | (MkCgIdInfo i _ _ _) <- rngVarEnv static_binds ], - ptext SLIT("local binds for:"), - vcat [ ppr i | (MkCgIdInfo i _ _ _) <- rngVarEnv local_binds ], - ptext SLIT("SRT label") <+> pprCLabel srt - ]) -\end{code} diff --git a/ghc/compiler/codeGen/CodeGen.lhs b/ghc/compiler/codeGen/CodeGen.lhs index 35e18cb659ccc7ec35e9cb27f5bc296538ac3624..95926aa602bcbbab56e62ab9710df8fe85820b3b 100644 --- a/ghc/compiler/codeGen/CodeGen.lhs +++ b/ghc/compiler/codeGen/CodeGen.lhs @@ -26,7 +26,7 @@ import CLabel ( CLabel, mkSRTLabel, mkClosureLabel ) import PprAbsC ( dumpRealC ) import AbsCUtils ( mkAbstractCs, mkAbsCStmts, flattenAbsC ) -import CgBindery ( CgIdInfo ) +import CgBindery ( CgIdInfo, addBindC, addBindsC ) import CgClosure ( cgTopRhsClosure ) import CgCon ( cgTopRhsCon ) import CgConTbls ( genStaticConBits )