| Safe Haskell | None | 
|---|---|
| Language | Haskell2010 | 
GHC.Cmm.Switch
Synopsis
- data SwitchTargets
 - mkSwitchTargets :: Bool -> (Integer, Integer) -> Maybe Label -> Map Integer Label -> SwitchTargets
 - switchTargetsCases :: SwitchTargets -> [(Integer, Label)]
 - switchTargetsDefault :: SwitchTargets -> Maybe Label
 - switchTargetsRange :: SwitchTargets -> (Integer, Integer)
 - switchTargetsSigned :: SwitchTargets -> Bool
 - mapSwitchTargets :: (Label -> Label) -> SwitchTargets -> SwitchTargets
 - switchTargetsToTable :: SwitchTargets -> (Int, [Maybe Label])
 - switchTargetsFallThrough :: SwitchTargets -> ([(NonEmpty Integer, Label)], Maybe Label)
 - switchTargetsToList :: SwitchTargets -> [Label]
 - eqSwitchTargetWith :: (Label -> Label -> Bool) -> SwitchTargets -> SwitchTargets -> Bool
 - data SwitchPlan
 - backendHasNativeSwitch :: Backend -> Bool
 - createSwitchPlan :: SwitchTargets -> SwitchPlan
 
Documentation
data SwitchTargets Source #
A value of type SwitchTargets contains the alternatives for a CmmSwitch
 value, and knows whether the value is signed, the possible range, an
 optional default value and a map from values to jump labels.
Instances
| Show SwitchTargets Source # | |
Defined in GHC.Cmm.Switch  | |
| Eq SwitchTargets Source # | |
Defined in GHC.Cmm.Switch Methods (==) :: SwitchTargets -> SwitchTargets -> Bool # (/=) :: SwitchTargets -> SwitchTargets -> Bool #  | |
mkSwitchTargets :: Bool -> (Integer, Integer) -> Maybe Label -> Map Integer Label -> SwitchTargets Source #
The smart constructor mkSwitchTargets normalises the map a bit: * No entries outside the range * No entries equal to the default * No default if all elements have explicit values
switchTargetsCases :: SwitchTargets -> [(Integer, Label)] Source #
Returns the list of non-default branches of the SwitchTargets value
switchTargetsDefault :: SwitchTargets -> Maybe Label Source #
Return the default label of the SwitchTargets value
switchTargetsRange :: SwitchTargets -> (Integer, Integer) Source #
Return the range of the SwitchTargets value
switchTargetsSigned :: SwitchTargets -> Bool Source #
Return whether this is used for a signed value
mapSwitchTargets :: (Label -> Label) -> SwitchTargets -> SwitchTargets Source #
Changes all labels mentioned in the SwitchTargets value
switchTargetsToTable :: SwitchTargets -> (Int, [Maybe Label]) Source #
switchTargetsToTable creates a dense jump table, usable for code generation.
Also returns an offset to add to the value; the list is 0-based on the result of that addition.
The conversion from Integer to Int is a bit of a wart, as the actual scrutinee might be an unsigned word, but it just works, due to wrap-around arithmetic (as verified by the CmmSwitchTest test case).
switchTargetsFallThrough :: SwitchTargets -> ([(NonEmpty Integer, Label)], Maybe Label) Source #
Groups cases with equal targets, suitable for pretty-printing to a c-like switch statement with fall-through semantics.
switchTargetsToList :: SwitchTargets -> [Label] Source #
The list of all labels occurring in the SwitchTargets value.
eqSwitchTargetWith :: (Label -> Label -> Bool) -> SwitchTargets -> SwitchTargets -> Bool Source #
Custom equality helper, needed for GHC.Cmm.CommonBlockElim
data SwitchPlan Source #
A SwitchPlan abstractly describes how a Switch statement ought to be implemented. See Note [createSwitchPlan]
Constructors
| Unconditionally Label | |
| IfEqual Integer Label SwitchPlan | |
| IfLT Bool Integer SwitchPlan SwitchPlan | |
| JumpTable SwitchTargets | 
Instances
| Show SwitchPlan Source # | |
Defined in GHC.Cmm.Switch  | |
backendHasNativeSwitch :: Backend -> Bool Source #
The back end targets a technology that implements
 switch natively.  (For example, LLVM or C.) Therefore
 it is not necessary for GHC to ccompile a Cmm Switch
 form into a decision tree with jump tables at the
 leaves.
createSwitchPlan :: SwitchTargets -> SwitchPlan Source #
This function creates a SwitchPlan from a SwitchTargets value, breaking it down into smaller pieces suitable for code generation.