GHC.Types.Id.Info

ghc-lib-parser-9.14.1.20251220: The GHC API, decoupled from GHC versions

Safe Haskell | Ignore
Language | GHC2021

GHC.Types.Id.Info

Contents

- The IdDetails type
- The IdInfo type
  - The OneShotInfo type
  - Zapping various forms of Info
  - The ArityInfo type
  - Demand and strictness Info
  - Unfolding Info
  - The InlinePragInfo type
  - The OccInfo type
  - The RuleInfo type
  - The CAFInfo type
  - The LambdaFormInfo type
  - Tick-box Info

Synopsis

- data IdDetails
  - = VanillaId
  - | RecSelId {
    - sel_tycon :: RecSelParent
    - sel_fieldLabel :: FieldLabel
    - sel_naughty :: Bool
    - sel_cons :: RecSelInfo
    }
  - | DataConWorkId DataCon
  - | DataConWrapId DataCon
  - | ClassOpId Class Bool
  - | RepPolyId {
    - id_concrete_tvs :: ConcreteTyVars
    }
  - | PrimOpId {
    - id_primop :: PrimOp
    - id_concrete_tvs :: ConcreteTyVars
    }
  - | FCallId ForeignCall
  - | TickBoxOpId TickBoxOp
  - | DFunId Bool
  - | CoVarId
  - | JoinId JoinArity (Maybe [CbvMark])
  - | WorkerLikeId [CbvMark]
- pprIdDetails :: IdDetails -> SDoc
- coVarDetails :: IdDetails
- isCoVarDetails :: IdDetails -> Bool
- type JoinArity = Int
- isJoinIdDetails_maybe :: IdDetails -> Maybe (JoinArity, Maybe [CbvMark])
- data RecSelParent
  - = RecSelData TyCon
  - | RecSelPatSyn PatSyn
- recSelParentName :: RecSelParent -> Name
- recSelFirstConName :: RecSelParent -> Name
- recSelParentCons :: RecSelParent -> [ConLike]
- idDetailsConcreteTvs :: IdDetails -> ConcreteTyVars
- data RecSelInfo = RSI {
  - rsi_def :: [ConLike]
  - rsi_undef :: [ConLike]
  }
- conLikesRecSelInfo :: [ConLike] -> [FieldLabelString] -> RecSelInfo
- data IdInfo
- vanillaIdInfo :: IdInfo
- noCafIdInfo :: IdInfo
- data OneShotInfo
  - = NoOneShotInfo
  - | OneShotLam
- oneShotInfo :: IdInfo -> OneShotInfo
- noOneShotInfo :: OneShotInfo
- hasNoOneShotInfo :: OneShotInfo -> Bool
- setOneShotInfo :: IdInfo -> OneShotInfo -> IdInfo
- zapLamInfo :: IdInfo -> Maybe IdInfo
- zapFragileInfo :: IdInfo -> Maybe IdInfo
- lazifyDemandInfo :: IdInfo -> Maybe IdInfo
- floatifyDemandInfo :: IdInfo -> Maybe IdInfo
- zapUsageInfo :: IdInfo -> Maybe IdInfo
- zapUsageEnvInfo :: IdInfo -> Maybe IdInfo
- zapUsedOnceInfo :: IdInfo -> Maybe IdInfo
- zapTailCallInfo :: IdInfo -> Maybe IdInfo
- zapCallArityInfo :: IdInfo -> IdInfo
- trimUnfolding :: Unfolding -> Unfolding
- type ArityInfo = Arity
- unknownArity :: Arity
- arityInfo :: IdInfo -> ArityInfo
- setArityInfo :: IdInfo -> ArityInfo -> IdInfo
- ppArityInfo :: Int -> SDoc
- callArityInfo :: IdInfo -> ArityInfo
- setCallArityInfo :: IdInfo -> ArityInfo -> IdInfo
- dmdSigInfo :: IdInfo -> DmdSig
- setDmdSigInfo :: IdInfo -> DmdSig -> IdInfo
- cprSigInfo :: IdInfo -> CprSig
- setCprSigInfo :: IdInfo -> CprSig -> IdInfo
- demandInfo :: IdInfo -> Demand
- setDemandInfo :: IdInfo -> Demand -> IdInfo
- pprStrictness :: DmdSig -> SDoc
- realUnfoldingInfo :: IdInfo -> Unfolding
- unfoldingInfo :: IdInfo -> Unfolding
- setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo
- hasInlineUnfolding :: IdInfo -> Bool
- type InlinePragInfo = InlinePragma
- inlinePragInfo :: IdInfo -> InlinePragma
- setInlinePragInfo :: IdInfo -> InlinePragma -> IdInfo
- data OccInfo
  - = ManyOccs {
    - occ_tail :: !TailCallInfo
    }
  - | IAmDead
  - | OneOcc {
    - occ_in_lam :: !InsideLam
    - occ_n_br :: !BranchCount
    - occ_int_cxt :: !InterestingCxt
    - occ_tail :: !TailCallInfo
    }
  - | IAmALoopBreaker {
    - occ_rules_only :: !RulesOnly
    - occ_tail :: !TailCallInfo
    }
- isDeadOcc :: OccInfo -> Bool
- isStrongLoopBreaker :: OccInfo -> Bool
- isWeakLoopBreaker :: OccInfo -> Bool
- occInfo :: IdInfo -> OccInfo
- setOccInfo :: IdInfo -> OccInfo -> IdInfo
- data InsideLam
  - = IsInsideLam
  - | NotInsideLam
- type BranchCount = Int
- data TailCallInfo
  - = AlwaysTailCalled !JoinArity
  - | NoTailCallInfo
- tailCallInfo :: OccInfo -> TailCallInfo
- isAlwaysTailCalled :: OccInfo -> Bool
- data RuleInfo = RuleInfo [CoreRule] DVarSet
- emptyRuleInfo :: RuleInfo
- isEmptyRuleInfo :: RuleInfo -> Bool
- ruleInfoFreeVars :: RuleInfo -> DVarSet
- ruleInfoRules :: RuleInfo -> [CoreRule]
- setRuleInfoHead :: Name -> RuleInfo -> RuleInfo
- ruleInfo :: IdInfo -> RuleInfo
- setRuleInfo :: IdInfo -> RuleInfo -> IdInfo
- tagSigInfo :: IdInfo -> Maybe TagSig
- data CafInfo
  - = MayHaveCafRefs
  - | NoCafRefs
- ppCafInfo :: CafInfo -> SDoc
- mayHaveCafRefs :: CafInfo -> Bool
- cafInfo :: IdInfo -> CafInfo
- setCafInfo :: IdInfo -> CafInfo -> IdInfo
- data LambdaFormInfo
- lfInfo :: IdInfo -> Maybe LambdaFormInfo
- setLFInfo :: IdInfo -> LambdaFormInfo -> IdInfo
- setTagSig :: IdInfo -> TagSig -> IdInfo
- tagSig :: IdInfo -> Maybe TagSig
- data TickBoxOp = TickBox Module !TickBoxId
- type TickBoxId = Int

# The IdDetails type

data IdDetails #

Identifier Details

The `IdDetails` of an `Id` give stable, and necessary, information about the Id.

Constructors

VanillaId |
RecSelId | The `Id` for a record selector
Fields sel_tycon :: RecSelParent sel_fieldLabel :: FieldLabel sel_naughty :: Bool sel_cons :: RecSelInfo
DataConWorkId DataCon | The `Id` is for a data constructor worker
DataConWrapId DataCon | The `Id` is for a data constructor wrapper
ClassOpId Class Bool | The `Id` is a superclass selector or class operation
RepPolyId | A representation-polymorphic pseudo-op.
Fields id_concrete_tvs :: ConcreteTyVars Which type variables of this representation-polymorphic 'Id should be instantiated to concrete type variables? See Note [Representation-polymorphism checking built-ins] in GHC.Tc.Utils.Concrete.
PrimOpId | The `Id` is for a primitive operator.
Fields id_primop :: PrimOp id_concrete_tvs :: ConcreteTyVars Which type variables of this representation-polymorphic 'Id should be instantiated to concrete type variables? See Note [Representation-polymorphism checking built-ins] in GHC.Tc.Utils.Concrete.
FCallId ForeignCall | The `Id` is for a foreign call. Type will be simple: no type families, newtypes, etc
TickBoxOpId TickBoxOp | The `Id` is for a HPC tick box (both traditional and binary)
DFunId Bool | A dictionary function. Bool = True = the class has only one method, so may be implemented with a newtype, so it might be bad to be strict on this dictionary
CoVarId | A coercion variable This only covers un-lifted coercions, of type (t1 ~# t2) or (t1 ~R# t2), not their lifted variants
JoinId JoinArity (Maybe [CbvMark]) | An `Id` for a join point taking n arguments Note [Join points] in GHC.Core Can also work as a WorkerLikeId if given `CbvMark`s. See Note [CBV Function Ids] The [CbvMark] is always empty (and ignored) until after Tidy.
WorkerLikeId [CbvMark] | An `Id` for a worker like function, which might expect some arguments to be passed both evaluated and tagged. Worker like functions are create by W/W and SpecConstr and we can expect that they aren't used unapplied. See Note [CBV Function Ids] See Note [EPT enforcement] The [CbvMark] is always empty (and ignored) until after Tidy for ids from the current module.

#### Instances

Instances details

Outputable IdDetails # |
Instance details Defined in GHC.Types.Id.Info Methods ppr :: IdDetails -> SDoc #

pprIdDetails :: IdDetails -> SDoc #

coVarDetails :: IdDetails #

Just a synonym for `CoVarId`. Written separately so it can be exported in the hs-boot file.

isCoVarDetails :: IdDetails -> Bool #

Check if an `IdDetails` says `CoVarId`.

type JoinArity = Int #

The number of arguments that a join point takes. Unlike the arity of a function, this is a purely syntactic property and is fixed when the join point is created (or converted from a value). Both type and value arguments are counted.

isJoinIdDetails_maybe :: IdDetails -> Maybe (JoinArity, Maybe [CbvMark]) #

data RecSelParent #

Parent of a record selector function.

Either the parent `TyCon` or `PatSyn` depending on the origin of the record selector.

For a data family, this is the instance `TyCon`, **not** the family `TyCon`.

Constructors

RecSelData TyCon | Parent of a data constructor record field. For a data family, this is the instance `TyCon`.
RecSelPatSyn PatSyn | Parent of a pattern synonym record field: the `PatSyn` itself.

#### Instances

Instances details

Data RecSelParent # |
Instance details Defined in GHC.Types.Id.Info Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> RecSelParent -> c RecSelParent # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c RecSelParent # toConstr :: RecSelParent -> Constr # dataTypeOf :: RecSelParent -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c RecSelParent) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c RecSelParent) # gmapT :: (forall b. Data b => b -> b) -> RecSelParent -> RecSelParent # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> RecSelParent -> r # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> RecSelParent -> r # gmapQ :: (forall d. Data d => d -> u) -> RecSelParent -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> RecSelParent -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> RecSelParent -> m RecSelParent # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> RecSelParent -> m RecSelParent # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> RecSelParent -> m RecSelParent #
Outputable RecSelParent # |
Instance details Defined in GHC.Types.Id.Info Methods ppr :: RecSelParent -> SDoc #
Eq RecSelParent # |
Instance details Defined in GHC.Types.Id.Info Methods (==) :: RecSelParent -> RecSelParent -> Bool # (/=) :: RecSelParent -> RecSelParent -> Bool #

recSelParentName :: RecSelParent -> Name #

recSelFirstConName :: RecSelParent -> Name #

recSelParentCons :: RecSelParent -> [ConLike] #

idDetailsConcreteTvs :: IdDetails -> ConcreteTyVars #

data RecSelInfo #

Constructors

RSI |
Fields rsi_def :: [ConLike] rsi_undef :: [ConLike]

conLikesRecSelInfo :: [ConLike] -> [FieldLabelString] -> RecSelInfo #

The ConLikes that have *all* the given fields

# The IdInfo type

data IdInfo #

Identifier Information

An `IdInfo` gives optional information about an `Id`. If present it never lies, but it may not be present, in which case there is always a conservative assumption which can be made.

Two `Id`s may have different info even though they have the same `Unique` (and are hence the same `Id`); for example, one might lack the properties attached to the other.

Most of the `IdInfo` gives information about the value, or definition, of the `Id`, independent of its usage. Exceptions to this are `demandInfo`, `occInfo`, `oneShotInfo` and `callArityInfo`.

Performance note: when we update `IdInfo`, we have to reallocate this entire record, so it is a good idea not to let this data structure get too big.

#### Instances

Instances details

Outputable IdInfo # |
Instance details Defined in GHC.Core.Ppr Methods ppr :: IdInfo -> SDoc #

vanillaIdInfo :: IdInfo #

Basic `IdInfo` that carries no useful information whatsoever

noCafIdInfo :: IdInfo #

More informative `IdInfo` we can use when we know the `Id` has no CAF references

## The OneShotInfo type

data OneShotInfo #

If the `Id` is a lambda-bound variable then it may have lambda-bound variable info. Sometimes we know whether the lambda binding this variable is a "one-shot" lambda; that is, whether it is applied at most once.

This information may be useful in optimisation, as computations may safely be floated inside such a lambda without risk of duplicating work.

See also Note [OneShotInfo overview] above.

Constructors

NoOneShotInfo | No information
OneShotLam | The lambda is applied at most once.

#### Instances

Instances details

Outputable OneShotInfo # |
Instance details Defined in GHC.Types.Basic Methods ppr :: OneShotInfo -> SDoc #
Eq OneShotInfo # |
Instance details Defined in GHC.Types.Basic Methods (==) :: OneShotInfo -> OneShotInfo -> Bool # (/=) :: OneShotInfo -> OneShotInfo -> Bool #

oneShotInfo :: IdInfo -> OneShotInfo #

Info about a lambda-bound variable, if the `Id` is one

noOneShotInfo :: OneShotInfo #

It is always safe to assume that an `Id` has no lambda-bound variable information

hasNoOneShotInfo :: OneShotInfo -> Bool #

setOneShotInfo :: IdInfo -> OneShotInfo -> IdInfo infixl 1 #

## Zapping various forms of Info

zapLamInfo :: IdInfo -> Maybe IdInfo #

This is used to remove information on lambda binders that we have setup as part of a lambda group, assuming they will be applied all at once, but turn out to be part of an unsaturated lambda as in e.g:

    (\x1. \x2. e) arg1

zapFragileInfo :: IdInfo -> Maybe IdInfo #

Zap info that depends on free variables

lazifyDemandInfo :: IdInfo -> Maybe IdInfo #

Lazify (remove the top-level demand, only) the demand in `IdInfo` Keep nested demands; see Note [Floatifying demand info when floating] in GHC.Core.Opt.SetLevels

floatifyDemandInfo :: IdInfo -> Maybe IdInfo #

Floatify the demand in `IdInfo` But keep nested demands; see Note [Floatifying demand info when floating] in GHC.Core.Opt.SetLevels

zapUsageInfo :: IdInfo -> Maybe IdInfo #

Remove usage (but not strictness) info on the `IdInfo`

zapUsageEnvInfo :: IdInfo -> Maybe IdInfo #

Remove usage environment info from the strictness signature on the `IdInfo`

zapUsedOnceInfo :: IdInfo -> Maybe IdInfo #

zapTailCallInfo :: IdInfo -> Maybe IdInfo #

zapCallArityInfo :: IdInfo -> IdInfo #

trimUnfolding :: Unfolding -> Unfolding #

## The ArityInfo type

type ArityInfo = Arity #

Arity Information

An `ArityInfo` of `n` tells us that partial application of this `Id` to up to `n-1` value arguments does essentially no work.

That is not necessarily the same as saying that it has `n` leading lambdas, because coerces may get in the way.

The arity might increase later in the compilation process, if an extra lambda floats up to the binding site.

Invariant: the `Arity` of an `Id` must never exceed the number of value arguments that appear in the type of the `Id`. See Note [Arity and function types].

unknownArity :: Arity #

It is always safe to assume that an `Id` has an arity of 0

arityInfo :: IdInfo -> ArityInfo #

`Id` arity, as computed by GHC.Core.Opt.Arity. Specifies how many arguments this `Id` has to be applied to before it does any meaningful work.

setArityInfo :: IdInfo -> ArityInfo -> IdInfo infixl 1 #

ppArityInfo :: Int -> SDoc #

callArityInfo :: IdInfo -> ArityInfo #

How this is called. This is the number of arguments to which a binding can be eta-expanded without losing any sharing. n = all calls have at least n arguments

setCallArityInfo :: IdInfo -> ArityInfo -> IdInfo #

## Demand and strictness Info

dmdSigInfo :: IdInfo -> DmdSig #

A strictness signature. Describes how a function uses its arguments See Note [idArity varies independently of dmdTypeDepth] in GHC.Core.Opt.DmdAnal

setDmdSigInfo :: IdInfo -> DmdSig -> IdInfo infixl 1 #

cprSigInfo :: IdInfo -> CprSig #

Information on whether the function will ultimately return a freshly allocated constructor.

setCprSigInfo :: IdInfo -> CprSig -> IdInfo infixl 1 #

demandInfo :: IdInfo -> Demand #

ID demand information

setDemandInfo :: IdInfo -> Demand -> IdInfo infixl 1 #

pprStrictness :: DmdSig -> SDoc #

## Unfolding Info

realUnfoldingInfo :: IdInfo -> Unfolding #

The `Id`s unfolding

unfoldingInfo :: IdInfo -> Unfolding #

Essentially returns the `realUnfoldingInfo` field, but does not expose the unfolding of a strong loop breaker.

This is the right thing to call if you plan to decide whether an unfolding will inline.

setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo infixl 1 #

hasInlineUnfolding :: IdInfo -> Bool #

True of a non-loop-breaker Id that has a stable unfolding that is (a) always inlined; that is, with an `UnfWhen` guidance, or (b) a DFunUnfolding which never needs to be inlined

## The InlinePragInfo type

type InlinePragInfo = InlinePragma #

Inline Pragma Information

Tells when the inlining is active. When it is active the thing may be inlined, depending on how big it is.

If there was an `INLINE` pragma, then as a separate matter, the RHS will have been made to look small with a Core inline `Note`

The default `InlinePragInfo` is `AlwaysActive`, so the info serves entirely as a way to inhibit inlining until we want it

inlinePragInfo :: IdInfo -> InlinePragma #

Any inline pragma attached to the `Id`

setInlinePragInfo :: IdInfo -> InlinePragma -> IdInfo infixl 1 #

## The OccInfo type

data OccInfo #

identifier Occurrence Information

Constructors

ManyOccs | There are many occurrences, or unknown occurrences
Fields occ_tail :: !TailCallInfo
IAmDead | Marks unused variables. Sometimes useful for lambda and case-bound variables.
OneOcc | Occurs exactly once (per branch), not inside a rule
Fields occ_in_lam :: !InsideLam occ_n_br :: !BranchCount occ_int_cxt :: !InterestingCxt occ_tail :: !TailCallInfo
IAmALoopBreaker | This identifier breaks a loop of mutually recursive functions. The field marks whether it is only a loop breaker due to a reference in a rule
Fields occ_rules_only :: !RulesOnly occ_tail :: !TailCallInfo

#### Instances

Instances details

Outputable OccInfo # |
Instance details Defined in GHC.Types.Basic Methods ppr :: OccInfo -> SDoc #
Eq OccInfo # |
Instance details Defined in GHC.Types.Basic Methods (==) :: OccInfo -> OccInfo -> Bool # (/=) :: OccInfo -> OccInfo -> Bool #

isDeadOcc :: OccInfo -> Bool #

isStrongLoopBreaker :: OccInfo -> Bool #

isWeakLoopBreaker :: OccInfo -> Bool #

occInfo :: IdInfo -> OccInfo #

How the `Id` occurs in the program

setOccInfo :: IdInfo -> OccInfo -> IdInfo infixl 1 #

data InsideLam #

Inside Lambda

Constructors

IsInsideLam | Occurs inside a non-linear lambda Substituting a redex for this occurrence is dangerous because it might duplicate work.
NotInsideLam |

#### Instances

Instances details

Monoid InsideLam # |
Instance details Defined in GHC.Types.Basic Methods mempty :: InsideLam # mappend :: InsideLam -> InsideLam -> InsideLam # mconcat :: [InsideLam] -> InsideLam #
Semigroup InsideLam # | If any occurrence of an identifier is inside a lambda, then the occurrence info of that identifier marks it as occurring inside a lambda
Instance details Defined in GHC.Types.Basic Methods (<>) :: InsideLam -> InsideLam -> InsideLam # sconcat :: NonEmpty InsideLam -> InsideLam # stimes :: Integral b => b -> InsideLam -> InsideLam #
Eq InsideLam # |
Instance details Defined in GHC.Types.Basic Methods (==) :: InsideLam -> InsideLam -> Bool # (/=) :: InsideLam -> InsideLam -> Bool #

type BranchCount = Int #

data TailCallInfo #

Constructors

AlwaysTailCalled !JoinArity |
NoTailCallInfo |

#### Instances

Instances details

Outputable TailCallInfo # |
Instance details Defined in GHC.Types.Basic Methods ppr :: TailCallInfo -> SDoc #
Eq TailCallInfo # |
Instance details Defined in GHC.Types.Basic Methods (==) :: TailCallInfo -> TailCallInfo -> Bool # (/=) :: TailCallInfo -> TailCallInfo -> Bool #

tailCallInfo :: OccInfo -> TailCallInfo #

isAlwaysTailCalled :: OccInfo -> Bool #

## The RuleInfo type

data RuleInfo #

Rule Information

Records the specializations of this `Id` that we know about in the form of rewrite `CoreRule`s that target them

Constructors

RuleInfo [CoreRule] DVarSet |

emptyRuleInfo :: RuleInfo #

Assume that no specializations exist: always safe

isEmptyRuleInfo :: RuleInfo -> Bool #

ruleInfoFreeVars :: RuleInfo -> DVarSet #

Retrieve the locally-defined free variables of both the left and right hand sides of the specialization rules

ruleInfoRules :: RuleInfo -> [CoreRule] #

setRuleInfoHead :: Name -> RuleInfo -> RuleInfo #

Change the name of the function the rule is keyed on all of the `CoreRule`s

ruleInfo :: IdInfo -> RuleInfo #

Specialisations of the `Id`s function which exist. See Note [Specialisations and RULES in IdInfo]

setRuleInfo :: IdInfo -> RuleInfo -> IdInfo infixl 1 #

tagSigInfo :: IdInfo -> Maybe TagSig #

## The CAFInfo type

data CafInfo #

Constant applicative form Information

Records whether an `Id` makes Constant Applicative Form references

Constructors

MayHaveCafRefs | Indicates that the `Id` is for either: A function or static constructor that refers to one or more CAFs, or A real live CAF
NoCafRefs | A function or static constructor that refers to no CAFs.

#### Instances

Instances details

Outputable CafInfo # |
Instance details Defined in GHC.Types.Id.Info Methods ppr :: CafInfo -> SDoc #
Eq CafInfo # |
Instance details Defined in GHC.Types.Id.Info Methods (==) :: CafInfo -> CafInfo -> Bool # (/=) :: CafInfo -> CafInfo -> Bool #
Ord CafInfo # |
Instance details Defined in GHC.Types.Id.Info Methods compare :: CafInfo -> CafInfo -> Ordering # (<) :: CafInfo -> CafInfo -> Bool # (<=) :: CafInfo -> CafInfo -> Bool # (>) :: CafInfo -> CafInfo -> Bool # (>=) :: CafInfo -> CafInfo -> Bool # max :: CafInfo -> CafInfo -> CafInfo # min :: CafInfo -> CafInfo -> CafInfo #

ppCafInfo :: CafInfo -> SDoc #

mayHaveCafRefs :: CafInfo -> Bool #

cafInfo :: IdInfo -> CafInfo #

`Id` CAF info

setCafInfo :: IdInfo -> CafInfo -> IdInfo infixl 1 #

## The LambdaFormInfo type

data LambdaFormInfo #

Information about an identifier, from the code generator's point of view. Every identifier is bound to a LambdaFormInfo in the environment, which gives the code generator enough info to be able to tail call or return that identifier.

#### Instances

Instances details

Outputable LambdaFormInfo # |
Instance details Defined in GHC.StgToCmm.Types Methods ppr :: LambdaFormInfo -> SDoc #

lfInfo :: IdInfo -> Maybe LambdaFormInfo #

If lfInfo = Just info, then the `info` is guaranteed correct. If lfInfo = Nothing, then we do not have a `LambdaFormInfo` for this Id, so (for imported Ids) we make a conservative version. See Note [The LFInfo of Imported Ids] in GHC.StgToCmm.Closure For locally-defined Ids other than DataCons, the `lfInfo` field is always Nothing. See also Note [LFInfo of DataCon workers and wrappers]

setLFInfo :: IdInfo -> LambdaFormInfo -> IdInfo infixl 1 #

setTagSig :: IdInfo -> TagSig -> IdInfo #

tagSig :: IdInfo -> Maybe TagSig #

## Tick-box Info

data TickBoxOp #

Tick box for Hpc-style coverage

Constructors

TickBox Module !TickBoxId |

#### Instances

Instances details

Outputable TickBoxOp # |
Instance details Defined in GHC.Types.Id.Info Methods ppr :: TickBoxOp -> SDoc #

type TickBoxId = Int #