[project @ 2004-08-13 10:45:16 by simonmar]
[ghc-hetmet.git] / ghc / compiler / codeGen / CgConTbls.lhs
index a20e0ee..37ced1e 100644 (file)
@@ -11,21 +11,13 @@ module CgConTbls ( genStaticConBits ) where
 import AbsCSyn
 import CgMonad
 
-import StgSyn          ( SRT(..) )
 import AbsCUtils       ( mkAbstractCs, mkAbsCStmts )
 import CgTailCall      ( performReturn, mkStaticAlgReturnCode )
-import CLabel          ( mkConEntryLabel )
-import ClosureInfo     ( layOutStaticClosure, layOutDynCon,
-                         mkConLFInfo, ClosureInfo
-                       )
-import CostCentre      ( dontCareCCS )
-import FiniteMap       ( fmToList, FiniteMap )
-import DataCon         ( DataCon, dataConName, dataConRepArgTys, isNullaryDataCon )
-import Name            ( getOccString )
-import PrimRep         ( getPrimRepSize, PrimRep(..) )
+import ClosureInfo     ( layOutStaticConstr, layOutDynConstr, ClosureInfo )
+import DataCon         ( DataCon, dataConRepArgTys, isNullaryDataCon )
 import TyCon           ( tyConDataCons, isEnumerationTyCon, TyCon )
-import Type            ( typePrimRep, Type )
-import Outputable      
+import Type            ( typePrimRep )
+import CmdLineOpts
 \end{code}
 
 For every constructor we generate the following info tables:
@@ -82,19 +74,22 @@ genStaticConBits comp_info gen_tycons
     --       C labels are local to this module i.e. static
     --      since they may be duplicated in other modules
 
-    mkAbstractCs [ gen_for_tycon tc | tc <- gen_tycons ]
+    mkAbstractCs [ gen_for_tycon tc `mkAbsCStmts` enum_closure_table tc
+                | tc <- gen_tycons ]
   where
     gen_for_tycon :: TyCon -> AbstractC
-    gen_for_tycon tycon
-      = mkAbstractCs (map (genConInfo comp_info tycon) (tyConDataCons tycon)) 
-       `mkAbsCStmts` (
-         -- after the con decls, so we don't need to declare the constructor labels
-         if (isEnumerationTyCon tycon)
-           then CClosureTbl tycon
-           else AbsCNop
-       )
+    gen_for_tycon tycon = mkAbstractCs [ genConInfo comp_info data_con 
+                                      | data_con <- tyConDataCons tycon ] 
+
+    enum_closure_table tycon
+       | isEnumerationTyCon tycon = CClosureTbl tycon
+       | otherwise                = AbsCNop
+               -- Put the table after the data constructor decls, because the
+               -- datatype closure table (for enumeration types)
+               -- to (say) PrelBase_$wTrue_closure, which is defined in code_stuff
 \end{code}
 
+
 %************************************************************************
 %*                                                                     *
 \subsection[CgConTbls-info-tables]{Generating info tables for constructors}
@@ -105,41 +100,38 @@ Generate the entry code, info tables, and (for niladic constructor) the
 static closure, for a constructor.
 
 \begin{code}
-genConInfo :: CompilationInfo -> TyCon -> DataCon -> AbstractC
+genConInfo :: CompilationInfo -> DataCon -> AbstractC
 
-genConInfo comp_info tycon data_con
-  = mkAbstractCs [
-                 CSplitMarker,
+genConInfo comp_info data_con
+  =    -- Order of things is to reduce forward references
+    mkAbstractCs [if opt_EnsureSplittableC then CSplitMarker else AbsCNop,
                  closure_code,
                  static_code]
-       -- Order of things is to reduce forward references
   where
     (closure_info, body_code) = mkConCodeAndInfo data_con
 
     -- To allow the debuggers, interpreters, etc to cope with static
     -- data structures (ie those built at compile time), we take care that
     -- info-table contains the information we need.
-    (static_ci,_) = layOutStaticClosure con_name typePrimRep arg_tys 
-                               (mkConLFInfo data_con)
+    (static_ci,_) = layOutStaticConstr data_con typePrimRep arg_tys
+
+    static_body  = initC comp_info (
+                      profCtrC FSLIT("TICK_ENT_STATIC_CON") [CReg node] `thenC`
+                      ldv_enter_and_body_code)
 
-    body       = (initC comp_info (
-                     profCtrC SLIT("TICK_ENT_CON") [CReg node] `thenC`
-                     body_code))
+    closure_body = initC comp_info (
+                      profCtrC FSLIT("TICK_ENT_DYN_CON") [CReg node] `thenC`
+                      ldv_enter_and_body_code)
 
-    entry_addr = CLbl entry_label CodePtrRep
-    con_descr  = getOccString data_con
+    ldv_enter_and_body_code = ldvEnter `thenC` body_code
 
     -- Don't need any dynamic closure code for zero-arity constructors
     closure_code = if zero_arity_con then 
                        AbsCNop 
                   else 
-                       CClosureInfoAndCode closure_info body Nothing con_descr
-
-    static_code  = CClosureInfoAndCode static_ci body Nothing con_descr
-
-    cost_centre  = mkCCostCentreStack dontCareCCS -- not worried about static data costs
+                       CClosureInfoAndCode closure_info closure_body
 
-    zero_size arg_ty = getPrimRepSize (typePrimRep arg_ty) == 0
+    static_code  = CClosureInfoAndCode static_ci static_body
 
     zero_arity_con   = isNullaryDataCon data_con
        -- We used to check that all the arg-sizes were zero, but we don't
@@ -147,8 +139,6 @@ genConInfo comp_info tycon data_con
        -- just one more thing to go wrong.
 
     arg_tys        = dataConRepArgTys  data_con
-    entry_label     = mkConEntryLabel      con_name
-    con_name       = dataConName data_con
 \end{code}
 
 \begin{code}
@@ -159,12 +149,11 @@ mkConCodeAndInfo con
   = let
        arg_tys = dataConRepArgTys con
 
-       (closure_info, arg_things)
-               = layOutDynCon con typePrimRep arg_tys
+       (closure_info, arg_things) = layOutDynConstr con typePrimRep arg_tys
 
        body_code
                = -- NB: We don't set CC when entering data (WDP 94/06)
-                 profCtrC SLIT("TICK_RET_OLD") 
+                 profCtrC FSLIT("TICK_RET_OLD") 
                        [mkIntCLit (length arg_things)] `thenC`
 
                  performReturn AbsCNop         -- Ptr to thing already in Node