Generalise Package Support
[ghc-hetmet.git] / compiler / basicTypes / MkId.lhs
index 84b3546..172f8b0 100644 (file)
@@ -252,7 +252,7 @@ mkDataConIds wrap_name wkr_name data_con
                           isSingleton orig_arg_tys )
                   -- No existentials on a newtype, but it can have a context
                   -- e.g.      newtype Eq a => T a = MkT (...)
-                  mkTopUnfolding $ Note InlineMe $
+                  mkCompulsoryUnfolding $ 
                   mkLams tyvars $ Lam id_arg1 $ 
                   mkNewTypeBody tycon result_ty (Var id_arg1)
 
@@ -855,18 +855,18 @@ unsafeCoerceName = mkWiredInIdName gHC_PRIM FSLIT("unsafeCoerce#") unsafeCoerceI
 nullAddrName     = mkWiredInIdName gHC_PRIM FSLIT("nullAddr#")    nullAddrIdKey      nullAddrId
 seqName                 = mkWiredInIdName gHC_PRIM FSLIT("seq")           seqIdKey           seqId
 realWorldName   = mkWiredInIdName gHC_PRIM FSLIT("realWorld#")    realWorldPrimIdKey realWorldPrimId
-lazyIdName      = mkWiredInIdName pREL_BASE FSLIT("lazy")         lazyIdKey          lazyId
-
-errorName               = mkWiredInIdName pREL_ERR FSLIT("error")           errorIdKey eRROR_ID
-recSelErrorName                 = mkWiredInIdName pREL_ERR FSLIT("recSelError")     recSelErrorIdKey rEC_SEL_ERROR_ID
-runtimeErrorName        = mkWiredInIdName pREL_ERR FSLIT("runtimeError")    runtimeErrorIdKey rUNTIME_ERROR_ID
-irrefutPatErrorName     = mkWiredInIdName pREL_ERR FSLIT("irrefutPatError") irrefutPatErrorIdKey iRREFUT_PAT_ERROR_ID
-recConErrorName                 = mkWiredInIdName pREL_ERR FSLIT("recConError")     recConErrorIdKey rEC_CON_ERROR_ID
-patErrorName            = mkWiredInIdName pREL_ERR FSLIT("patError")        patErrorIdKey pAT_ERROR_ID
-noMethodBindingErrorName = mkWiredInIdName pREL_ERR FSLIT("noMethodBindingError")
+lazyIdName      = mkWiredInIdName gHC_BASE FSLIT("lazy")         lazyIdKey           lazyId
+
+errorName               = mkWiredInIdName gHC_ERR FSLIT("error")            errorIdKey eRROR_ID
+recSelErrorName                 = mkWiredInIdName gHC_ERR FSLIT("recSelError")     recSelErrorIdKey rEC_SEL_ERROR_ID
+runtimeErrorName        = mkWiredInIdName gHC_ERR FSLIT("runtimeError")    runtimeErrorIdKey rUNTIME_ERROR_ID
+irrefutPatErrorName     = mkWiredInIdName gHC_ERR FSLIT("irrefutPatError") irrefutPatErrorIdKey iRREFUT_PAT_ERROR_ID
+recConErrorName                 = mkWiredInIdName gHC_ERR FSLIT("recConError")     recConErrorIdKey rEC_CON_ERROR_ID
+patErrorName            = mkWiredInIdName gHC_ERR FSLIT("patError")         patErrorIdKey pAT_ERROR_ID
+noMethodBindingErrorName = mkWiredInIdName gHC_ERR FSLIT("noMethodBindingError")
                                           noMethodBindingErrorIdKey nO_METHOD_BINDING_ERROR_ID
 nonExhaustiveGuardsErrorName 
-  = mkWiredInIdName pREL_ERR FSLIT("nonExhaustiveGuardsError") 
+  = mkWiredInIdName gHC_ERR FSLIT("nonExhaustiveGuardsError") 
                    nonExhaustiveGuardsErrorIdKey nON_EXHAUSTIVE_GUARDS_ERROR_ID
 \end{code}
 
@@ -902,22 +902,26 @@ seqId
     ty  = mkForAllTys [alphaTyVar,openBetaTyVar]
                      (mkFunTy alphaTy (mkFunTy openBetaTy openBetaTy))
     [x,y] = mkTemplateLocals [alphaTy, openBetaTy]
--- gaw 2004
     rhs = mkLams [alphaTyVar,openBetaTyVar,x,y] (Case (Var x) x openBetaTy [(DEFAULT, [], Var y)])
 
 -- lazy :: forall a?. a? -> a?  (i.e. works for unboxed types too)
 -- Used to lazify pseq:                pseq a b = a `seq` lazy b
--- No unfolding: it gets "inlined" by the worker/wrapper pass
--- Also, no strictness: by being a built-in Id, it overrides all
--- the info in PrelBase.hi.  This is important, because the strictness
+-- 
+-- Also, no strictness: by being a built-in Id, all the info about lazyId comes from here,
+-- not from GHC.Base.hi.   This is important, because the strictness
 -- analyser will spot it as strict!
+--
+-- Also no unfolding in lazyId: it gets "inlined" by a HACK in the worker/wrapper pass
+--     (see WorkWrap.wwExpr)   
+-- We could use inline phases to do this, but that would be vulnerable to changes in 
+-- phase numbering....we must inline precisely after strictness analysis.
 lazyId
   = pcMiscPrelId lazyIdName ty info
   where
     info = noCafIdInfo
     ty  = mkForAllTys [alphaTyVar] (mkFunTy alphaTy alphaTy)
 
-lazyIdUnfolding :: CoreExpr    -- Used to expand LazyOp after strictness anal
+lazyIdUnfolding :: CoreExpr    -- Used to expand 'lazyId' after strictness anal
 lazyIdUnfolding = mkLams [openAlphaTyVar,x] (Var x)
                where
                  [x] = mkTemplateLocals [openAlphaTy]