[project @ 1996-04-10 18:10:47 by partain]
[ghc-hetmet.git] / ghc / compiler / codeGen / CodeGen.lhs
index a1aa854..016bd99 100644 (file)
@@ -1,5 +1,5 @@
 %
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
 %
 \section[CodeGen]{@CodeGen@: main module of the code generator}
 
@@ -17,57 +17,54 @@ functions drive the mangling of top-level bindings.
 \begin{code}
 #include "HsVersions.h"
 
-module CodeGen (
-       codeGen,
-
-       -- and to make the interface self-sufficient...
-       UniqFM, AbstractC, StgBinding, Id, FiniteMap
-    ) where
+module CodeGen ( codeGen ) where
 
+import Ubiq{-uitous-}
 
 import StgSyn
 import CgMonad
 import AbsCSyn
 
-import CLabelInfo      ( modnameToC )
+import AbsCUtils       ( mkAbstractCs, mkAbsCStmts )
+import Bag             ( foldBag )
 import CgClosure       ( cgTopRhsClosure )
 import CgCon           ( cgTopRhsCon )
-import CgConTbls       ( genStaticConBits, TCE(..), UniqFM )
-import ClosureInfo     ( LambdaFormInfo, mkClosureLFInfo )
-import CmdLineOpts     ( GlobalSwitch(..), switchIsOn, stringSwitchSet, SwitchResult )
-import FiniteMap       ( FiniteMap )
-import Maybes          ( Maybe(..) )
-import PrimKind                ( getKindSize )
-import Util
+import CgConTbls       ( genStaticConBits )
+import ClosureInfo     ( mkClosureLFInfo )
+import CmdLineOpts     ( opt_SccProfilingOn, opt_CompilingPrelude,
+                         opt_EnsureSplittableC, opt_SccGroup
+                       )
+import CStrings                ( modnameToC )
+import Maybes          ( maybeToBool )
+import PrimRep         ( getPrimRepSize, PrimRep(..) )
+import Util            ( panic, assertPanic )
 \end{code}
 
 \begin{code}
 codeGen :: FAST_STRING         -- module name
        -> ([CostCentre],       -- local cost-centres needing declaring/registering
            [CostCentre])       -- "extern" cost-centres needing declaring
-       -> [FAST_STRING]        -- import names
-       -> (GlobalSwitch -> SwitchResult)
-                               -- global switch lookup function
+       -> [Module]             -- import names
        -> [TyCon]              -- tycons with data constructors to convert
-       -> FiniteMap TyCon [[Maybe UniType]]
+       -> FiniteMap TyCon [(Bool, [Maybe Type])]
                                -- tycon specialisation info
-       -> PlainStgProgram      -- bindings to convert
+       -> [StgBinding] -- bindings to convert
        -> AbstractC            -- output
 
-codeGen mod_name (local_CCs, extern_CCs) import_names sw_lookup_fn gen_tycons tycon_specs stg_pgm
+codeGen mod_name (local_CCs, extern_CCs) import_names gen_tycons tycon_specs stg_pgm
   = let
-       switch_is_on      = switchIsOn sw_lookup_fn
-       doing_profiling   = switch_is_on SccProfilingOn
-       compiling_prelude = switch_is_on CompilingPrelude
-       splitting         = switch_is_on (EnsureSplittableC (panic "codeGen:esc"))
+       doing_profiling   = opt_SccProfilingOn
+       compiling_prelude = opt_CompilingPrelude
+       maybe_split       = if maybeToBool (opt_EnsureSplittableC)
+                           then CSplitMarker
+                           else AbsCNop
+
+       cinfo = MkCompInfo mod_name
     in
     if not doing_profiling then
-       let
-           cinfo = MkCompInfo switch_is_on mod_name
-       in
        mkAbstractCs [
            genStaticConBits cinfo gen_tycons tycon_specs,
-           initC cinfo (cgTopBindings splitting stg_pgm) ]
+           initC cinfo (cgTopBindings maybe_split stg_pgm) ]
 
     else -- yes, cost-centre profiling:
         -- Besides the usual stuff, we must produce:
@@ -80,9 +77,7 @@ codeGen mod_name (local_CCs, extern_CCs) import_names sw_lookup_fn gen_tycons ty
         -- into the code-generator, as are the imported-modules' names.)
         --
         -- Note: we don't register/etc if compiling Prelude bits.
-       let
-           cinfo = MkCompInfo switch_is_on mod_name
-       in
+
        mkAbstractCs [
                if compiling_prelude
                then AbsCNop
@@ -91,21 +86,22 @@ codeGen mod_name (local_CCs, extern_CCs) import_names sw_lookup_fn gen_tycons ty
                                   mkCcRegister local_CCs import_names],
 
                genStaticConBits cinfo gen_tycons tycon_specs,
-               initC cinfo (cgTopBindings splitting stg_pgm) ]
+               initC cinfo (cgTopBindings maybe_split stg_pgm) ]
   where
     -----------------
-    grp_name  = case (stringSwitchSet sw_lookup_fn SccGroup) of
+    grp_name  = case opt_SccGroup of
                  Just xx -> _PK_ xx
                  Nothing -> mod_name   -- default: module name
 
     -----------------
     mkCcRegister ccs import_names
-      = let 
+      = let
            register_ccs     = mkAbstractCs (map mk_register ccs)
-           register_imports = mkAbstractCs (map mk_import_register import_names)
+           register_imports
+             = foldr (mkAbsCStmts . mk_import_register) AbsCNop import_names
        in
        mkAbstractCs [
-           CCallProfCCMacro SLIT("START_REGISTER_CCS") [CLitLit (modnameToC (SLIT("_reg") _APPEND_ mod_name)) AddrKind],
+           CCallProfCCMacro SLIT("START_REGISTER_CCS") [CLitLit (modnameToC (SLIT("_reg") _APPEND_ mod_name)) AddrRep],
            register_ccs,
            register_imports,
            CCallProfCCMacro SLIT("END_REGISTER_CCS") []
@@ -115,7 +111,7 @@ codeGen mod_name (local_CCs, extern_CCs) import_names sw_lookup_fn gen_tycons ty
          = CCallProfCCMacro SLIT("REGISTER_CC") [mkCCostCentre cc]
 
        mk_import_register import_name
-         = CCallProfCCMacro SLIT("REGISTER_IMPORT") [CLitLit (modnameToC (SLIT("_reg") _APPEND_ import_name)) AddrKind]
+         = CCallProfCCMacro SLIT("REGISTER_IMPORT") [CLitLit (modnameToC (SLIT("_reg") _APPEND_ import_name)) AddrRep]
 \end{code}
 
 %************************************************************************
@@ -135,39 +131,35 @@ style, with the increasing static environment being plumbed as a state
 variable.
 
 \begin{code}
-cgTopBindings :: Bool -> PlainStgProgram -> Code
+cgTopBindings :: AbstractC -> [StgBinding] -> Code
+
+cgTopBindings split bindings = mapCs (cgTopBinding split) bindings
 
-cgTopBindings splitting bindings = mapCs (cgTopBinding splitting) bindings
-  
-cgTopBinding :: Bool -> PlainStgBinding -> Code
+cgTopBinding :: AbstractC -> StgBinding -> Code
 
-cgTopBinding splitting (StgNonRec name rhs) 
-  = absC maybe_split   `thenC`
+cgTopBinding split (StgNonRec name rhs)
+  = absC split         `thenC`
     cgTopRhs name rhs  `thenFC` \ (name, info) ->
     addBindC name info
-  where
-    maybe_split = if splitting then CSplitMarker else AbsCNop
 
-cgTopBinding splitting (StgRec pairs) 
-  = absC maybe_split   `thenC`
+cgTopBinding split (StgRec pairs)
+  = absC split         `thenC`
     fixC (\ new_binds -> addBindsC new_binds   `thenC`
                         mapFCs ( \ (b,e) -> cgTopRhs b e ) pairs
     )                  `thenFC` \ new_binds ->
     addBindsC new_binds
-  where
-    maybe_split = if splitting then CSplitMarker else AbsCNop
 
 -- Urgh!  I tried moving the forkStatics call from the rhss of cgTopRhs
 -- to enclose the listFCs in cgTopBinding, but that tickled the
 -- statics "error" call in initC.  I DON'T UNDERSTAND WHY!
 
-cgTopRhs :: Id -> PlainStgRhs -> FCode (Id, CgIdInfo)
+cgTopRhs :: Id -> StgRhs -> FCode (Id, CgIdInfo)
        -- the Id is passed along for setting up a binding...
 
 cgTopRhs name (StgRhsCon cc con args)
   = forkStatics (cgTopRhsCon name con args (all zero_size args))
   where
-    zero_size atom = getKindSize (getAtomKind atom) == 0
+    zero_size atom = getPrimRepSize (getArgPrimRep atom) == 0
 
 cgTopRhs name (StgRhsClosure cc bi fvs upd_flag args body)
   = ASSERT(null fvs) -- There should be no free variables