Debug

ghc-8.6.3: The GHC API

Safe Haskell | None
Language | Haskell2010

Debug

Contents

- Unwinding information

Synopsis

- data DebugBlock = DebugBlock {
  - dblProcedure :: !Label
  - dblLabel :: !Label
  - dblCLabel :: !CLabel
  - dblHasInfoTbl :: !Bool
  - dblParent :: !(Maybe DebugBlock)
  - dblTicks :: ![CmmTickish]
  - dblSourceTick :: !(Maybe CmmTickish)
  - dblPosition :: !(Maybe Int)
  - dblUnwind :: [UnwindPoint]
  - dblBlocks :: ![DebugBlock]
  }
- dblIsEntry :: DebugBlock -> Bool
- cmmDebugGen :: ModLocation -> RawCmmGroup -> [DebugBlock]
- cmmDebugLabels :: (i -> Bool) -> GenCmmGroup d g (ListGraph i) -> [Label]
- cmmDebugLink :: [Label] -> LabelMap [UnwindPoint] -> [DebugBlock] -> [DebugBlock]
- debugToMap :: [DebugBlock] -> LabelMap DebugBlock
- type UnwindTable = Map GlobalReg (Maybe UnwindExpr)
- data UnwindPoint = UnwindPoint !CLabel !UnwindTable
- data UnwindExpr
  - = UwConst !Int
  - | UwReg !GlobalReg !Int
  - | UwDeref UnwindExpr
  - | UwLabel CLabel
  - | UwPlus UnwindExpr UnwindExpr
  - | UwMinus UnwindExpr UnwindExpr
  - | UwTimes UnwindExpr UnwindExpr
- toUnwindExpr :: CmmExpr -> UnwindExpr

# Documentation

data DebugBlock #

Debug information about a block of code. Ticks scope over nested blocks.

Constructors

DebugBlock |
Fields dblProcedure :: !Label Entry label of containing proc dblLabel :: !Label Hoopl label dblCLabel :: !CLabel Output label dblHasInfoTbl :: !Bool Has an info table? dblParent :: !(Maybe DebugBlock) The parent of this proc. See Note [Splitting DebugBlocks] dblTicks :: ![CmmTickish] Ticks defined in this block dblSourceTick :: !(Maybe CmmTickish) Best source tick covering block dblPosition :: !(Maybe Int) Output position relative to other blocks. `Nothing` means the block was optimized out dblUnwind :: [UnwindPoint] dblBlocks :: ![DebugBlock] Nested blocks

Instances

Outputable DebugBlock # |
Instance details Defined in Debug Methods ppr :: DebugBlock -> SDoc # pprPrec :: Rational -> DebugBlock -> SDoc #

dblIsEntry :: DebugBlock -> Bool #

Is this the entry block?

cmmDebugGen :: ModLocation -> RawCmmGroup -> [DebugBlock] #

Extract debug data from a group of procedures. We will prefer source notes that come from the given module (presumably the module that we are currently compiling).

cmmDebugLabels :: (i -> Bool) -> GenCmmGroup d g (ListGraph i) -> [Label] #

cmmDebugLink :: [Label] -> LabelMap [UnwindPoint] -> [DebugBlock] -> [DebugBlock] #

Sets position and unwind table fields in the debug block tree according to native generated code.

debugToMap :: [DebugBlock] -> LabelMap DebugBlock #

Converts debug blocks into a label map for easier lookups

# Unwinding information

type UnwindTable = Map GlobalReg (Maybe UnwindExpr) #

Maps registers to expressions that yield their "old" values further up the stack. Most interesting for the stack pointer `Sp`, but might be useful to document saved registers, too. Note that a register's value will be `Nothing` when the register's previous value cannot be reconstructed.

data UnwindPoint #

A label associated with an `UnwindTable`

Constructors

UnwindPoint !CLabel !UnwindTable |

Instances

Outputable UnwindPoint # |
Instance details Defined in Debug Methods ppr :: UnwindPoint -> SDoc # pprPrec :: Rational -> UnwindPoint -> SDoc #

data UnwindExpr #

Expressions, used for unwind information

Constructors

UwConst !Int | literal value
UwReg !GlobalReg !Int | register plus offset
UwDeref UnwindExpr | pointer dereferencing
UwLabel CLabel |
UwPlus UnwindExpr UnwindExpr |
UwMinus UnwindExpr UnwindExpr |
UwTimes UnwindExpr UnwindExpr |

Instances

Eq UnwindExpr # |
Instance details Defined in Debug Methods (==) :: UnwindExpr -> UnwindExpr -> Bool # (/=) :: UnwindExpr -> UnwindExpr -> Bool #
Outputable UnwindExpr # |
Instance details Defined in Debug Methods ppr :: UnwindExpr -> SDoc # pprPrec :: Rational -> UnwindExpr -> SDoc #

toUnwindExpr :: CmmExpr -> UnwindExpr #

Conversion of Cmm expressions to unwind expressions. We check for unsupported operator usages and simplify the expression as far as possible.