ghc-7.10.3: The GHC API

Safe Haskell | None
Language | Haskell2010

Id

Contents

- The main types
  - Simple construction
  - Taking an Id apart
  - Modifying an Id
  - Predicates on Ids
  - Evidence variables
  - Inline pragma stuff
  - One-shot lambdas
  - Reading `IdInfo` fields
  - Writing `IdInfo` fields

Description

GHC uses several kinds of name internally:

- `OccName`: see OccName
- `RdrName`: see RdrName
- `Name`: see Name
- `Id` represents names that not only have a `Name` but also a `Type` and some additional details (a `IdInfo` and one of `LocalIdDetails` or `GlobalIdDetails`) that are added, modified and inspected by various compiler passes. These `Var` names may either be global or local, see Var
- `Var`: see Var

Synopsis

- data Var
- type Id = Var
- isId :: Var -> Bool
- mkGlobalId :: IdDetails -> Name -> Type -> IdInfo -> Id
- mkVanillaGlobal :: Name -> Type -> Id
- mkVanillaGlobalWithInfo :: Name -> Type -> IdInfo -> Id
- mkLocalId :: Name -> Type -> Id
- mkLocalIdWithInfo :: Name -> Type -> IdInfo -> Id
- mkExportedLocalId :: IdDetails -> Name -> Type -> Id
- mkSysLocal :: FastString -> Unique -> Type -> Id
- mkSysLocalM :: MonadUnique m => FastString -> Type -> m Id
- mkUserLocal :: OccName -> Unique -> Type -> SrcSpan -> Id
- mkUserLocalM :: MonadUnique m => OccName -> Type -> SrcSpan -> m Id
- mkDerivedLocalM :: MonadUnique m => (OccName -> OccName) -> Id -> Type -> m Id
- mkTemplateLocals :: [Type] -> [Id]
- mkTemplateLocalsNum :: Int -> [Type] -> [Id]
- mkTemplateLocal :: Int -> Type -> Id
- mkWorkerId :: Unique -> Id -> Type -> Id
- mkWiredInIdName :: Module -> FastString -> Unique -> Id -> Name
- idName :: Id -> Name
- idType :: Id -> Kind
- idUnique :: Id -> Unique
- idInfo :: Id -> IdInfo
- idDetails :: Id -> IdDetails
- idRepArity :: Id -> RepArity
- recordSelectorFieldLabel :: Id -> (TyCon, FieldLabel)
- setIdName :: Id -> Name -> Id
- setIdUnique :: Id -> Unique -> Id
- setIdType :: Id -> Type -> Id
- setIdExported :: Id -> Id
- setIdNotExported :: Id -> Id
- globaliseId :: Id -> Id
- localiseId :: Id -> Id
- setIdInfo :: Id -> IdInfo -> Id
- lazySetIdInfo :: Id -> IdInfo -> Id
- modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
- maybeModifyIdInfo :: Maybe IdInfo -> Id -> Id
- zapLamIdInfo :: Id -> Id
- zapIdDemandInfo :: Id -> Id
- zapIdUsageInfo :: Id -> Id
- zapFragileIdInfo :: Id -> Id
- zapIdStrictness :: Id -> Id
- transferPolyIdInfo :: Id -> [Var] -> Id -> Id
- isImplicitId :: Id -> Bool
- isDeadBinder :: Id -> Bool
- isStrictId :: Id -> Bool
- isExportedId :: Var -> Bool
- isLocalId :: Var -> Bool
- isGlobalId :: Var -> Bool
- isRecordSelector :: Id -> Bool
- isNaughtyRecordSelector :: Id -> Bool
- isClassOpId_maybe :: Id -> Maybe Class
- isDFunId :: Id -> Bool
- isPrimOpId :: Id -> Bool
- isPrimOpId_maybe :: Id -> Maybe PrimOp
- isFCallId :: Id -> Bool
- isFCallId_maybe :: Id -> Maybe ForeignCall
- isDataConWorkId :: Id -> Bool
- isDataConWorkId_maybe :: Id -> Maybe DataCon
- isDataConId_maybe :: Id -> Maybe DataCon
- idDataCon :: Id -> DataCon
- isConLikeId :: Id -> Bool
- isBottomingId :: Id -> Bool
- idIsFrom :: Module -> Id -> Bool
- hasNoBinding :: Id -> Bool
- type DictId = EvId
- isDictId :: Id -> Bool
- dfunNSilent :: Id -> Int
- isEvVar :: Var -> Bool
- idInlinePragma :: Id -> InlinePragma
- setInlinePragma :: Id -> InlinePragma -> Id
- modifyInlinePragma :: Id -> (InlinePragma -> InlinePragma) -> Id
- idInlineActivation :: Id -> Activation
- setInlineActivation :: Id -> Activation -> Id
- idRuleMatchInfo :: Id -> RuleMatchInfo
- isOneShotBndr :: Var -> Bool
- isOneShotLambda :: Id -> Bool
- isProbablyOneShotLambda :: Id -> Bool
- setOneShotLambda :: Id -> Id
- clearOneShotLambda :: Id -> Id
- updOneShotInfo :: Id -> OneShotInfo -> Id
- setIdOneShotInfo :: Id -> OneShotInfo -> Id
- isStateHackType :: Type -> Bool
- stateHackOneShot :: OneShotInfo
- typeOneShot :: Type -> OneShotInfo
- idArity :: Id -> Arity
- idCallArity :: Id -> Arity
- idUnfolding :: Id -> Unfolding
- realIdUnfolding :: Id -> Unfolding
- idSpecialisation :: Id -> SpecInfo
- idCoreRules :: Id -> [CoreRule]
- idHasRules :: Id -> Bool
- idCafInfo :: Id -> CafInfo
- idOneShotInfo :: Id -> OneShotInfo
- idOccInfo :: Id -> OccInfo
- setIdUnfoldingLazily :: Id -> Unfolding -> Id
- setIdUnfolding :: Id -> Unfolding -> Id
- setIdArity :: Id -> Arity -> Id
- setIdCallArity :: Id -> Arity -> Id
- setIdSpecialisation :: Id -> SpecInfo -> Id
- setIdCafInfo :: Id -> CafInfo -> Id
- setIdOccInfo :: Id -> OccInfo -> Id
- zapIdOccInfo :: Id -> Id
- setIdDemandInfo :: Id -> Demand -> Id
- setIdStrictness :: Id -> StrictSig -> Id
- idDemandInfo :: Id -> Demand
- idStrictness :: Id -> StrictSig

# The main types

data Var

Essentially a typed `Name`, that may also contain some additional information about the `Var` and it's use sites.

Instances

Eq Var |
Data Var |
Ord Var |
Outputable Var |
Uniquable Var |
NamedThing Var |
type PostRn Id ty = ty |
type PostTc Id ty = ty |

type Id = Var

isId :: Var -> Bool

## Simple construction

mkGlobalId :: IdDetails -> Name -> Type -> IdInfo -> Id

For an explanation of global vs. local `Id`s, see Var

mkVanillaGlobal :: Name -> Type -> Id

Make a global `Id` without any extra information at all

mkVanillaGlobalWithInfo :: Name -> Type -> IdInfo -> Id

Make a global `Id` with no global information but some generic `IdInfo`

mkLocalId :: Name -> Type -> Id

For an explanation of global vs. local `Id`s, see Var

mkLocalIdWithInfo :: Name -> Type -> IdInfo -> Id

mkExportedLocalId :: IdDetails -> Name -> Type -> Id

Create a local `Id` that is marked as exported. This prevents things attached to it from being removed as dead code. See Note [Exported LocalIds]

mkSysLocal :: FastString -> Unique -> Type -> Id

Create a system local `Id`. These are local `Id`s (see Var) that are created by the compiler out of thin air

mkSysLocalM :: MonadUnique m => FastString -> Type -> m Id

mkUserLocal :: OccName -> Unique -> Type -> SrcSpan -> Id

Create a user local `Id`. These are local `Id`s (see Var) with a name and location that the user might recognize

mkUserLocalM :: MonadUnique m => OccName -> Type -> SrcSpan -> m Id

mkDerivedLocalM :: MonadUnique m => (OccName -> OccName) -> Id -> Type -> m Id

mkTemplateLocals :: [Type] -> [Id]

Create a template local for a series of types

mkTemplateLocalsNum :: Int -> [Type] -> [Id]

Create a template local for a series of type, but start from a specified template local

mkTemplateLocal :: Int -> Type -> Id

Create a template local: a family of system local `Id`s in bijection with `Int`s, typically used in unfoldings

mkWorkerId :: Unique -> Id -> Type -> Id

Workers get local names. CoreTidy will externalise these if necessary

mkWiredInIdName :: Module -> FastString -> Unique -> Id -> Name

## Taking an Id apart

idName :: Id -> Name

idType :: Id -> Kind

idUnique :: Id -> Unique

idInfo :: Id -> IdInfo

idDetails :: Id -> IdDetails

idRepArity :: Id -> RepArity

recordSelectorFieldLabel :: Id -> (TyCon, FieldLabel)

If the `Id` is that for a record selector, extract the `sel_tycon` and label. Panic otherwise

## Modifying an Id

setIdName :: Id -> Name -> Id

setIdUnique :: Id -> Unique -> Id

setIdType :: Id -> Type -> Id

Not only does this set the `Id` `Type`, it also evaluates the type to try and reduce space usage

setIdExported :: Id -> Id

setIdNotExported :: Id -> Id

globaliseId :: Id -> Id

If it's a local, make it global

localiseId :: Id -> Id

setIdInfo :: Id -> IdInfo -> Id

lazySetIdInfo :: Id -> IdInfo -> Id

modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id

maybeModifyIdInfo :: Maybe IdInfo -> Id -> Id

zapLamIdInfo :: Id -> Id

zapIdDemandInfo :: Id -> Id

zapIdUsageInfo :: Id -> Id

zapFragileIdInfo :: Id -> Id

zapIdStrictness :: Id -> Id

transferPolyIdInfo :: Id -> [Var] -> Id -> Id

## Predicates on Ids

isImplicitId :: Id -> Bool

`isImplicitId` tells whether an `Id`s info is implied by other declarations, so we don't need to put its signature in an interface file, even if it's mentioned in some other interface unfolding.

isDeadBinder :: Id -> Bool

isStrictId :: Id -> Bool

This predicate says whether the `Id` has a strict demand placed on it or has a type such that it can always be evaluated strictly (i.e an unlifted type, as of GHC 7.6). We need to check separately whether the `Id` has a so-called "strict type" because if the demand for the given `id` hasn't been computed yet but `id` has a strict type, we still want `isStrictId id` to be `True`.

isExportedId :: Var -> Bool

`isExportedIdVar` means "don't throw this away"

isLocalId :: Var -> Bool

isGlobalId :: Var -> Bool

isRecordSelector :: Id -> Bool

isNaughtyRecordSelector :: Id -> Bool

isClassOpId_maybe :: Id -> Maybe Class

isDFunId :: Id -> Bool

isPrimOpId :: Id -> Bool

isPrimOpId_maybe :: Id -> Maybe PrimOp

isFCallId :: Id -> Bool

isFCallId_maybe :: Id -> Maybe ForeignCall

isDataConWorkId :: Id -> Bool

isDataConWorkId_maybe :: Id -> Maybe DataCon

isDataConId_maybe :: Id -> Maybe DataCon

idDataCon :: Id -> DataCon

Get from either the worker or the wrapper `Id` to the `DataCon`. Currently used only in the desugarer.

INVARIANT: `idDataCon (dataConWrapId d) = d`: remember, `dataConWrapId` can return either the wrapper or the worker

isConLikeId :: Id -> Bool

isBottomingId :: Id -> Bool

Returns true if an application to n args would diverge

idIsFrom :: Module -> Id -> Bool

hasNoBinding :: Id -> Bool

Returns `True` of an `Id` which may not have a binding, even though it is defined in this module.

## Evidence variables

type DictId = EvId

isDictId :: Id -> Bool

dfunNSilent :: Id -> Int

isEvVar :: Var -> Bool

## Inline pragma stuff

idInlinePragma :: Id -> InlinePragma

setInlinePragma :: Id -> InlinePragma -> Id infixl 1

modifyInlinePragma :: Id -> (InlinePragma -> InlinePragma) -> Id

idInlineActivation :: Id -> Activation

setInlineActivation :: Id -> Activation -> Id infixl 1

idRuleMatchInfo :: Id -> RuleMatchInfo

## One-shot lambdas

isOneShotBndr :: Var -> Bool

Returns whether the lambda associated with the `Id` is certainly applied at most once This one is the "business end", called externally. It works on type variables as well as Ids, returning True Its main purpose is to encapsulate the Horrible State Hack

isOneShotLambda :: Id -> Bool

Returns whether the lambda associated with the `Id` is certainly applied at most once. You probably want to use `isOneShotBndr` instead

isProbablyOneShotLambda :: Id -> Bool

setOneShotLambda :: Id -> Id

clearOneShotLambda :: Id -> Id

updOneShotInfo :: Id -> OneShotInfo -> Id

setIdOneShotInfo :: Id -> OneShotInfo -> Id infixl 1

isStateHackType :: Type -> Bool

stateHackOneShot :: OneShotInfo

Should we apply the state hack to values of this `Type`?

typeOneShot :: Type -> OneShotInfo

## Reading `IdInfo` fields

idArity :: Id -> Arity

idCallArity :: Id -> Arity

idUnfolding :: Id -> Unfolding

realIdUnfolding :: Id -> Unfolding

idSpecialisation :: Id -> SpecInfo

idCoreRules :: Id -> [CoreRule]

idHasRules :: Id -> Bool

idCafInfo :: Id -> CafInfo infixl 1

idOneShotInfo :: Id -> OneShotInfo

idOccInfo :: Id -> OccInfo

## Writing `IdInfo` fields

setIdUnfoldingLazily :: Id -> Unfolding -> Id infixl 1

setIdUnfolding :: Id -> Unfolding -> Id infixl 1

setIdArity :: Id -> Arity -> Id infixl 1

setIdCallArity :: Id -> Arity -> Id infixl 1

setIdSpecialisation :: Id -> SpecInfo -> Id infixl 1

setIdCafInfo :: Id -> CafInfo -> Id

setIdOccInfo :: Id -> OccInfo -> Id infixl 1

zapIdOccInfo :: Id -> Id

setIdDemandInfo :: Id -> Demand -> Id infixl 1

setIdStrictness :: Id -> StrictSig -> Id infixl 1

idDemandInfo :: Id -> Demand

idStrictness :: Id -> StrictSig