floating-point fix for x86_64
[ghc-hetmet.git] / ghc / compiler / basicTypes / Var.lhs
index df030e2..60fdf38 100644 (file)
@@ -7,45 +7,42 @@
 module Var (
        Var, 
        varName, varUnique, 
-       setVarName, setVarUnique, setVarOcc,
+       setVarName, setVarUnique, 
 
        -- TyVars
        TyVar, mkTyVar, mkTcTyVar,
        tyVarName, tyVarKind,
        setTyVarName, setTyVarUnique,
-       tcTyVarRef, tcTyVarDetails,
+       tcTyVarDetails,
 
        -- Ids
        Id, DictId,
        idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
        setIdName, setIdUnique, setIdType, setIdInfo, lazySetIdInfo, 
-       setIdLocalExported, zapSpecPragmaId,
+       setIdExported, setIdNotExported, 
 
-       globalIdDetails, setGlobalIdDetails, 
+       globalIdDetails, globaliseId, 
 
-       mkLocalId, mkExportedLocalId, mkSpecPragmaId,
-       mkGlobalId, 
+       mkLocalId, mkExportedLocalId, mkGlobalId, 
 
        isTyVar, isTcTyVar, isId, isLocalVar, isLocalId,
-       isGlobalId, isExportedId, isSpecPragmaId,
+       isGlobalId, isExportedId, 
        mustHaveLocalBinding
     ) where
 
 #include "HsVersions.h"
 
 import {-# SOURCE #-}  TypeRep( Type )
-import {-# SOURCE #-}  TcType( TyVarDetails )
-import {-# SOURCE #-}  IdInfo( GlobalIdDetails, notGlobalId,
-                               IdInfo, seqIdInfo )
+import {-# SOURCE #-}  TcType( TcTyVarDetails, pprTcTyVarDetails )
+import {-# SOURCE #-}  IdInfo( GlobalIdDetails, notGlobalId, IdInfo, seqIdInfo )
 
-import Name            ( Name, OccName, NamedThing(..),
-                         setNameUnique, setNameOcc, nameUnique
+import Name            ( Name, NamedThing(..),
+                         setNameUnique, nameUnique
                        )
 import Kind            ( Kind )
 import Unique          ( Unique, Uniquable(..), mkUniqueGrimily, getKey# )
 import FastTypes
 import Outputable
-import DATA_IOREF
 \end{code}
 
 
@@ -70,12 +67,11 @@ data Var
                                        -- cached here for speed
        tyVarKind :: Kind }
 
-  | TcTyVar {                  -- Used only during type inference
-       varName        :: !Name,        -- Could we get away without a Name?
+  | TcTyVar {                          -- Used only during type inference
+       varName        :: !Name,
        realUnique     :: FastInt,
        tyVarKind      :: Kind,
-       tcTyVarRef     :: IORef (Maybe Type),
-       tcTyVarDetails :: TyVarDetails }
+       tcTyVarDetails :: TcTyVarDetails }
 
   | GlobalId {                         -- Used for imported Ids, dict selectors etc
        varName    :: !Name,
@@ -94,8 +90,8 @@ data Var
 data LocalIdDetails 
   = NotExported        -- Not exported
   | Exported   -- Exported
-  | SpecPragma -- Not exported, but not to be discarded either
-               -- It's unclean that this is so deeply built in
+  -- Exported Ids are kept alive; 
+  -- NotExported things may be discarded as dead code.
 \end{code}
 
 LocalId and GlobalId
@@ -115,7 +111,13 @@ After CoreTidy, top-level LocalIds are turned into GlobalIds
 
 \begin{code}
 instance Outputable Var where
-  ppr var = ppr (varName var)
+  ppr var = ppr (varName var) <+> ifPprDebug (brackets extra)
+       where
+         extra = case var of
+                       GlobalId {} -> ptext SLIT("gid")
+                       LocalId  {} -> ptext SLIT("lid")
+                       TyVar    {} -> ptext SLIT("tv")
+                       TcTyVar {tcTyVarDetails = details} -> pprTcTyVarDetails details
 
 instance Show Var where
   showsPrec p var = showsPrecSDoc p (ppr var)
@@ -151,10 +153,6 @@ setVarName :: Var -> Name -> Var
 setVarName var new_name
   = var { realUnique = getKey# (getUnique new_name), 
          varName = new_name }
-
-setVarOcc :: Var -> OccName -> Var
-setVarOcc var new_occ
-  = var { varName = setNameOcc (varName var) new_occ }
 \end{code}
 
 
@@ -180,12 +178,11 @@ mkTyVar name kind = TyVar { varName    = name
                          , tyVarKind  = kind
                        }
 
-mkTcTyVar :: Name -> Kind -> TyVarDetails -> IORef (Maybe Type) -> TyVar
-mkTcTyVar name kind details ref
+mkTcTyVar :: Name -> Kind -> TcTyVarDetails -> TyVar
+mkTcTyVar name kind details
   = TcTyVar {  varName    = name,
                realUnique = getKey# (nameUnique name),
                tyVarKind  = kind,
-               tcTyVarRef = ref,
                tcTyVarDetails = details
        }
 \end{code}
@@ -217,18 +214,23 @@ setIdName = setVarName
 setIdType :: Id -> Type -> Id
 setIdType id ty = id {idType = ty}
 
-setIdLocalExported :: Id -> Id
--- It had better be a LocalId already
-setIdLocalExported id = id { lclDetails = Exported }
+setIdExported :: Id -> Id
+-- Can be called on GlobalIds, such as data cons and class ops,
+-- which are "born" as GlobalIds and automatically exported
+setIdExported id@(LocalId {}) = id { lclDetails = Exported }
+setIdExported other_id       = ASSERT( isId other_id ) other_id
 
-setGlobalIdDetails :: Id -> GlobalIdDetails -> Id
--- It had better be a GlobalId already
-setGlobalIdDetails id details = id { gblDetails = details }
+setIdNotExported :: Id -> Id
+-- We can only do this to LocalIds
+setIdNotExported id = ASSERT( isLocalId id ) id { lclDetails = NotExported }
 
-zapSpecPragmaId :: Id -> Id
-zapSpecPragmaId id
-  | isSpecPragmaId id = id {lclDetails = NotExported}
-  | otherwise         = id
+globaliseId :: GlobalIdDetails -> Id -> Id
+-- If it's a local, make it global
+globaliseId details id = GlobalId { varName    = varName id,
+                                   realUnique = realUnique id,
+                                   idType     = idType id,
+                                   idInfo     = idInfo id,
+                                   gblDetails = details }
 
 lazySetIdInfo :: Id -> IdInfo -> Id
 lazySetIdInfo id info = id {idInfo = info}
@@ -279,16 +281,13 @@ mkLocalId name ty info = mk_local_id name ty NotExported info
 
 mkExportedLocalId :: Name -> Type -> IdInfo -> Id
 mkExportedLocalId name ty info = mk_local_id name ty Exported info
-
-mkSpecPragmaId :: Name -> Type -> IdInfo -> Id
-mkSpecPragmaId name ty info = mk_local_id name ty SpecPragma info
 \end{code}
 
 \begin{code}
-isTyVar, isTcTyVar                      :: Var -> Bool
-isId, isLocalVar, isLocalId                     :: Var -> Bool
-isGlobalId, isExportedId, isSpecPragmaId :: Var -> Bool
-mustHaveLocalBinding                    :: Var -> Bool
+isTyVar, isTcTyVar         :: Var -> Bool
+isId, isLocalVar, isLocalId :: Var -> Bool
+isGlobalId, isExportedId    :: Var -> Bool
+mustHaveLocalBinding       :: Var -> Bool
 
 isTyVar (TyVar {})   = True
 isTyVar (TcTyVar {}) = True
@@ -325,12 +324,8 @@ isExportedId (GlobalId {}) = True
 isExportedId (LocalId {lclDetails = details}) 
   = case details of
        Exported   -> True
-       SpecPragma -> True
        other      -> False
 isExportedId other = False
-
-isSpecPragmaId (LocalId {lclDetails = SpecPragma}) = True
-isSpecPragmaId other = False
 \end{code}
 
 \begin{code}