Copyright | (c) Galois Inc 2014-2016 |
---|---|
License | BSD3 |
Maintainer | Joe Hendrix <jhendrix@galois.com> |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Lang.Crucible.CFG.Core
Description
Define a SSA-based control flow graph data structure using a side-effect free expression syntax.
Unlike usual SSA forms, we do not use phi-functions, but instead rely on an argument-passing formulation for basic blocks. In this form, concrete values are bound to formal parameters instead of using phi-functions that switch on the place from which you jumped.
Synopsis
- data CFG (ext :: Type) (blocks :: Ctx (Ctx CrucibleType)) (init :: Ctx CrucibleType) (ret :: CrucibleType) = CFG {
- cfgHandle :: FnHandle init ret
- cfgBlockMap :: !(BlockMap ext blocks ret)
- cfgEntryBlockID :: !(BlockID blocks init)
- cfgBreakpoints :: !(Bimap BreakpointName (Some (BlockID blocks)))
- data SomeCFG ext (init :: Ctx CrucibleType) (ret :: CrucibleType) where
- class HasSomeCFG f ext init ret | f -> ext, f -> init, f -> ret where
- data AnyCFG ext where
- ppCFG :: PrettyExt ext => Bool -> CFG ext blocks init ret -> Doc ann
- ppCFG' :: PrettyExt ext => Bool -> CFGPostdom blocks -> CFG ext blocks init ret -> Doc ann
- cfgArgTypes :: CFG ext blocks init ret -> CtxRepr init
- cfgReturnType :: CFG ext blocks init ret -> TypeRepr ret
- type CFGPostdom blocks = Assignment (Const [Some (BlockID blocks)]) blocks
- type BlockMap ext blocks ret = Assignment (Block ext blocks ret) blocks
- getBlock :: BlockID blocks args -> BlockMap ext blocks ret -> Block ext blocks ret args
- extendBlockMap :: Assignment (Block ext blocks ret) b -> Assignment (Block ext (blocks ::> args) ret) b
- newtype BlockID (blocks :: Ctx (Ctx CrucibleType)) (tp :: Ctx CrucibleType) = BlockID {
- blockIDIndex :: Index blocks tp
- extendBlockID :: KnownDiff l r => BlockID l tp -> BlockID r tp
- extendBlockID' :: Diff l r -> BlockID l tp -> BlockID r tp
- data Block ext (blocks :: Ctx (Ctx CrucibleType)) (ret :: CrucibleType) ctx = Block {
- blockID :: !(BlockID blocks ctx)
- blockInputs :: !(CtxRepr ctx)
- _blockStmts :: !(StmtSeq ext blocks ret ctx)
- blockLoc :: Block ext blocks ret ctx -> ProgramLoc
- blockStmts :: Simple Lens (Block ext b r c) (StmtSeq ext b r c)
- withBlockTermStmt :: Block ext blocks ret args -> (forall ctx. ProgramLoc -> TermStmt blocks ret ctx -> r) -> r
- nextBlocks :: Block ext b r a -> [Some (BlockID b)]
- data JumpTarget blocks ctx where
- JumpTarget :: !(BlockID blocks args) -> !(CtxRepr args) -> !(Assignment (Reg ctx) args) -> JumpTarget blocks ctx
- extendJumpTarget :: Diff blocks' blocks -> JumpTarget blocks' ctx -> JumpTarget blocks ctx
- jumpTargetID :: JumpTarget blocks ctx -> Some (BlockID blocks)
- data SwitchTarget blocks ctx tp where
- SwitchTarget :: !(BlockID blocks (args ::> tp)) -> !(CtxRepr args) -> !(Assignment (Reg ctx) args) -> SwitchTarget blocks ctx tp
- switchTargetID :: SwitchTarget blocks ctx tp -> Some (BlockID blocks)
- extendSwitchTarget :: Diff blocks' blocks -> SwitchTarget blocks' ctx tp -> SwitchTarget blocks ctx tp
- data StmtSeq ext blocks (ret :: CrucibleType) ctx where
- ConsStmt :: !ProgramLoc -> !(Stmt ext ctx ctx') -> !(StmtSeq ext blocks ret ctx') -> StmtSeq ext blocks ret ctx
- TermStmt :: !ProgramLoc -> !(TermStmt blocks ret ctx) -> StmtSeq ext blocks ret ctx
- firstStmtLoc :: StmtSeq ext b r ctx -> ProgramLoc
- stmtSeqTermStmt :: Functor f => (forall ctx. (ProgramLoc, TermStmt b ret ctx) -> f (StmtSeq ext b' ret ctx)) -> StmtSeq ext b ret args -> f (StmtSeq ext b' ret args)
- data Stmt ext (ctx :: Ctx CrucibleType) (ctx' :: Ctx CrucibleType) where
- SetReg :: !(TypeRepr tp) -> !(Expr ext ctx tp) -> Stmt ext ctx (ctx ::> tp)
- ExtendAssign :: !(StmtExtension ext (Reg ctx) tp) -> Stmt ext ctx (ctx ::> tp)
- CallHandle :: !(TypeRepr ret) -> !(Reg ctx (FunctionHandleType args ret)) -> !(CtxRepr args) -> !(Assignment (Reg ctx) args) -> Stmt ext ctx (ctx ::> ret)
- Print :: !(Reg ctx (StringType Unicode)) -> Stmt ext ctx ctx
- ReadGlobal :: !(GlobalVar tp) -> Stmt ext ctx (ctx ::> tp)
- WriteGlobal :: !(GlobalVar tp) -> !(Reg ctx tp) -> Stmt ext ctx ctx
- FreshConstant :: !(BaseTypeRepr bt) -> !(Maybe SolverSymbol) -> Stmt ext ctx (ctx ::> BaseToType bt)
- FreshFloat :: !(FloatInfoRepr fi) -> !(Maybe SolverSymbol) -> Stmt ext ctx (ctx ::> FloatType fi)
- FreshNat :: !(Maybe SolverSymbol) -> Stmt ext ctx (ctx ::> NatType)
- NewRefCell :: !(TypeRepr tp) -> !(Reg ctx tp) -> Stmt ext ctx (ctx ::> ReferenceType tp)
- NewEmptyRefCell :: !(TypeRepr tp) -> Stmt ext ctx (ctx ::> ReferenceType tp)
- ReadRefCell :: !(Reg ctx (ReferenceType tp)) -> Stmt ext ctx (ctx ::> tp)
- WriteRefCell :: !(Reg ctx (ReferenceType tp)) -> !(Reg ctx tp) -> Stmt ext ctx ctx
- DropRefCell :: !(Reg ctx (ReferenceType tp)) -> Stmt ext ctx ctx
- Assert :: !(Reg ctx BoolType) -> !(Reg ctx (StringType Unicode)) -> Stmt ext ctx ctx
- Assume :: !(Reg ctx BoolType) -> !(Reg ctx (StringType Unicode)) -> Stmt ext ctx ctx
- ppStmt :: PrettyExt ext => Size ctx -> Stmt ext ctx ctx' -> Doc ann
- nextStmtHeight :: Size ctx -> Stmt ext ctx ctx' -> Size ctx'
- applyEmbeddingStmt :: forall ext ctx ctx' sctx. TraverseExt ext => CtxEmbedding ctx ctx' -> Stmt ext ctx sctx -> Pair (Stmt ext ctx') (CtxEmbedding sctx)
- data TermStmt blocks (ret :: CrucibleType) (ctx :: Ctx CrucibleType) where
- Jump :: !(JumpTarget blocks ctx) -> TermStmt blocks ret ctx
- Br :: !(Reg ctx BoolType) -> !(JumpTarget blocks ctx) -> !(JumpTarget blocks ctx) -> TermStmt blocks ret ctx
- MaybeBranch :: !(TypeRepr tp) -> !(Reg ctx (MaybeType tp)) -> !(SwitchTarget blocks ctx tp) -> !(JumpTarget blocks ctx) -> TermStmt blocks rtp ctx
- VariantElim :: !(CtxRepr varctx) -> !(Reg ctx (VariantType varctx)) -> !(Assignment (SwitchTarget blocks ctx) varctx) -> TermStmt blocks ret ctx
- Return :: !(Reg ctx ret) -> TermStmt blocks ret ctx
- TailCall :: !(Reg ctx (FunctionHandleType args ret)) -> !(CtxRepr args) -> !(Assignment (Reg ctx) args) -> TermStmt blocks ret ctx
- ErrorStmt :: !(Reg ctx (StringType Unicode)) -> TermStmt blocks ret ctx
- termStmtNextBlocks :: TermStmt b ret ctx -> Maybe [Some (BlockID b)]
- newtype Expr ext (ctx :: Ctx CrucibleType) (tp :: CrucibleType) = App (App ext (Reg ctx) tp)
- newtype Reg (ctx :: Ctx CrucibleType) (tp :: CrucibleType) = Reg {}
- extendReg :: Reg ctx tp -> Reg (ctx ::> r) tp
- lastReg :: KnownContext ctx => Reg (ctx ::> tp) tp
- module Lang.Crucible.Types
- module Lang.Crucible.CFG.Common
- module Data.Parameterized.Classes
- module Data.Parameterized.Some
CFG
data CFG (ext :: Type) (blocks :: Ctx (Ctx CrucibleType)) (init :: Ctx CrucibleType) (ret :: CrucibleType) Source #
A CFG consists of:
- a function handle, uniquely identifying the function this CFG implements;
- a block map, representing the main CFG data structure;
- and the identifier of the function entry point.
The blocks
type parameter maps each block identifier to the
formal arguments it expects. The init
type parameter identifies
the formal arguments of the function represented by this control-flow graph,
which correspond to the formal arguments of the CFG entry point.
The ret
type parameter indicates the return type of the function.
Constructors
CFG | |
Fields
|
data SomeCFG ext (init :: Ctx CrucibleType) (ret :: CrucibleType) where Source #
Control flow graph with some blocks. This data type closes
existentially over the blocks
type parameter.
class HasSomeCFG f ext init ret | f -> ext, f -> init, f -> ret where Source #
Class for types that embed a CFG of some sort.
data AnyCFG ext where Source #
Control flow graph. This data type closes existentially
over all the type parameters except ext
.
Arguments
:: PrettyExt ext | |
=> Bool | Flag indicates if we should print line numbers |
-> CFG ext blocks init ret | |
-> Doc ann |
Pretty print a CFG.
Arguments
:: PrettyExt ext | |
=> Bool | Flag indicates if we should print line numbers |
-> CFGPostdom blocks | |
-> CFG ext blocks init ret | |
-> Doc ann |
Pretty print CFG with postdom information.
cfgArgTypes :: CFG ext blocks init ret -> CtxRepr init Source #
cfgReturnType :: CFG ext blocks init ret -> TypeRepr ret Source #
type CFGPostdom blocks = Assignment (Const [Some (BlockID blocks)]) blocks Source #
Postdominator information about a CFG. The assignment maps each block to the postdominators of the given block. The postdominators are ordered with nearest postdominator first.
Blocks
type BlockMap ext blocks ret = Assignment (Block ext blocks ret) blocks Source #
A mapping from block indices to CFG blocks
extendBlockMap :: Assignment (Block ext blocks ret) b -> Assignment (Block ext (blocks ::> args) ret) b Source #
newtype BlockID (blocks :: Ctx (Ctx CrucibleType)) (tp :: Ctx CrucibleType) Source #
A BlockID
uniquely identifies a block in a control-flow graph.
Each block has an associated context, indicating the formal arguments
it expects to find in registers from its calling locations.
Constructors
BlockID | |
Fields
|
Instances
TestEquality (BlockID blocks :: Ctx CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core | |
OrdF (BlockID blocks :: Ctx CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods compareF :: forall (x :: k) (y :: k). BlockID blocks x -> BlockID blocks y -> OrderingF x y # leqF :: forall (x :: k) (y :: k). BlockID blocks x -> BlockID blocks y -> Bool # ltF :: forall (x :: k) (y :: k). BlockID blocks x -> BlockID blocks y -> Bool # geqF :: forall (x :: k) (y :: k). BlockID blocks x -> BlockID blocks y -> Bool # gtF :: forall (x :: k) (y :: k). BlockID blocks x -> BlockID blocks y -> Bool # | |
ShowF (BlockID blocks :: Ctx CrucibleType -> Type) Source # | |
Show (BlockID blocks ctx) Source # | |
Eq (BlockID blocks tp) Source # | |
Ord (BlockID blocks tp) Source # | |
Defined in Lang.Crucible.CFG.Core Methods compare :: BlockID blocks tp -> BlockID blocks tp -> Ordering # (<) :: BlockID blocks tp -> BlockID blocks tp -> Bool # (<=) :: BlockID blocks tp -> BlockID blocks tp -> Bool # (>) :: BlockID blocks tp -> BlockID blocks tp -> Bool # (>=) :: BlockID blocks tp -> BlockID blocks tp -> Bool # max :: BlockID blocks tp -> BlockID blocks tp -> BlockID blocks tp # min :: BlockID blocks tp -> BlockID blocks tp -> BlockID blocks tp # | |
Pretty (BlockID blocks tp) Source # | |
Defined in Lang.Crucible.CFG.Core |
data Block ext (blocks :: Ctx (Ctx CrucibleType)) (ret :: CrucibleType) ctx Source #
A basic block within a function.
Constructors
Block | |
Fields
|
blockLoc :: Block ext blocks ret ctx -> ProgramLoc Source #
Return location of start of block.
withBlockTermStmt :: Block ext blocks ret args -> (forall ctx. ProgramLoc -> TermStmt blocks ret ctx -> r) -> r Source #
Get the terminal statement of a basic block. This is implemented in a CPS style due to the block context.
Jump targets
data JumpTarget blocks ctx where Source #
Target for jump and branch statements
Constructors
JumpTarget :: !(BlockID blocks args) -> !(CtxRepr args) -> !(Assignment (Reg ctx) args) -> JumpTarget blocks ctx |
Instances
ApplyEmbedding (JumpTarget blocks :: Ctx CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods applyEmbedding :: forall (ctx :: Ctx k) (ctx' :: Ctx k). CtxEmbedding ctx ctx' -> JumpTarget blocks ctx -> JumpTarget blocks ctx' # | |
ExtendContext (JumpTarget blocks :: Ctx CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods extendContext :: forall (ctx :: Ctx k) (ctx' :: Ctx k). Diff ctx ctx' -> JumpTarget blocks ctx -> JumpTarget blocks ctx' # | |
Pretty (JumpTarget blocks ctx) Source # | |
Defined in Lang.Crucible.CFG.Core Methods pretty :: JumpTarget blocks ctx -> Doc ann # prettyList :: [JumpTarget blocks ctx] -> Doc ann # |
extendJumpTarget :: Diff blocks' blocks -> JumpTarget blocks' ctx -> JumpTarget blocks ctx Source #
jumpTargetID :: JumpTarget blocks ctx -> Some (BlockID blocks) Source #
data SwitchTarget blocks ctx tp where Source #
Target for a switch statement.
Constructors
SwitchTarget :: !(BlockID blocks (args ::> tp)) -> !(CtxRepr args) -> !(Assignment (Reg ctx) args) -> SwitchTarget blocks ctx tp |
Instances
ApplyEmbedding' (SwitchTarget blocks :: Ctx CrucibleType -> CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods applyEmbedding' :: forall (ctx :: Ctx k) (ctx' :: Ctx k) (v :: k'). CtxEmbedding ctx ctx' -> SwitchTarget blocks ctx v -> SwitchTarget blocks ctx' v # | |
ExtendContext' (SwitchTarget blocks :: Ctx CrucibleType -> CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods extendContext' :: forall (ctx :: Ctx k) (ctx' :: Ctx k) (v :: k'). Diff ctx ctx' -> SwitchTarget blocks ctx v -> SwitchTarget blocks ctx' v # |
switchTargetID :: SwitchTarget blocks ctx tp -> Some (BlockID blocks) Source #
extendSwitchTarget :: Diff blocks' blocks -> SwitchTarget blocks' ctx tp -> SwitchTarget blocks ctx tp Source #
Statements
data StmtSeq ext blocks (ret :: CrucibleType) ctx where Source #
A sequence of straight-line program statements that end with a terminating statement (return, jump, etc).
Constructors
ConsStmt :: !ProgramLoc -> !(Stmt ext ctx ctx') -> !(StmtSeq ext blocks ret ctx') -> StmtSeq ext blocks ret ctx | |
TermStmt :: !ProgramLoc -> !(TermStmt blocks ret ctx) -> StmtSeq ext blocks ret ctx |
Instances
TraverseExt ext => ApplyEmbedding (StmtSeq ext blocks ret :: Ctx CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods applyEmbedding :: forall (ctx :: Ctx k) (ctx' :: Ctx k). CtxEmbedding ctx ctx' -> StmtSeq ext blocks ret ctx -> StmtSeq ext blocks ret ctx' # |
firstStmtLoc :: StmtSeq ext b r ctx -> ProgramLoc Source #
Return the location of a statement.
stmtSeqTermStmt :: Functor f => (forall ctx. (ProgramLoc, TermStmt b ret ctx) -> f (StmtSeq ext b' ret ctx)) -> StmtSeq ext b ret args -> f (StmtSeq ext b' ret args) Source #
A lens-like operation that gives one access to program location and term statement, and allows the terminal statement to be replaced with an arbitrary sequence of statements.
data Stmt ext (ctx :: Ctx CrucibleType) (ctx' :: Ctx CrucibleType) where Source #
A sequential statement that does not affect the program location within the current block or leave the current block.
Constructors
SetReg :: !(TypeRepr tp) -> !(Expr ext ctx tp) -> Stmt ext ctx (ctx ::> tp) | |
ExtendAssign :: !(StmtExtension ext (Reg ctx) tp) -> Stmt ext ctx (ctx ::> tp) | |
CallHandle :: !(TypeRepr ret) -> !(Reg ctx (FunctionHandleType args ret)) -> !(CtxRepr args) -> !(Assignment (Reg ctx) args) -> Stmt ext ctx (ctx ::> ret) | |
Print :: !(Reg ctx (StringType Unicode)) -> Stmt ext ctx ctx | |
ReadGlobal :: !(GlobalVar tp) -> Stmt ext ctx (ctx ::> tp) | |
WriteGlobal :: !(GlobalVar tp) -> !(Reg ctx tp) -> Stmt ext ctx ctx | |
FreshConstant :: !(BaseTypeRepr bt) -> !(Maybe SolverSymbol) -> Stmt ext ctx (ctx ::> BaseToType bt) | |
FreshFloat :: !(FloatInfoRepr fi) -> !(Maybe SolverSymbol) -> Stmt ext ctx (ctx ::> FloatType fi) | |
FreshNat :: !(Maybe SolverSymbol) -> Stmt ext ctx (ctx ::> NatType) | |
NewRefCell :: !(TypeRepr tp) -> !(Reg ctx tp) -> Stmt ext ctx (ctx ::> ReferenceType tp) | |
NewEmptyRefCell :: !(TypeRepr tp) -> Stmt ext ctx (ctx ::> ReferenceType tp) | |
ReadRefCell :: !(Reg ctx (ReferenceType tp)) -> Stmt ext ctx (ctx ::> tp) | |
WriteRefCell :: !(Reg ctx (ReferenceType tp)) -> !(Reg ctx tp) -> Stmt ext ctx ctx | |
DropRefCell :: !(Reg ctx (ReferenceType tp)) -> Stmt ext ctx ctx | |
Assert :: !(Reg ctx BoolType) -> !(Reg ctx (StringType Unicode)) -> Stmt ext ctx ctx | |
Assume :: !(Reg ctx BoolType) -> !(Reg ctx (StringType Unicode)) -> Stmt ext ctx ctx |
applyEmbeddingStmt :: forall ext ctx ctx' sctx. TraverseExt ext => CtxEmbedding ctx ctx' -> Stmt ext ctx sctx -> Pair (Stmt ext ctx') (CtxEmbedding sctx) Source #
data TermStmt blocks (ret :: CrucibleType) (ctx :: Ctx CrucibleType) where Source #
Constructors
Jump :: !(JumpTarget blocks ctx) -> TermStmt blocks ret ctx | |
Br :: !(Reg ctx BoolType) -> !(JumpTarget blocks ctx) -> !(JumpTarget blocks ctx) -> TermStmt blocks ret ctx | |
MaybeBranch :: !(TypeRepr tp) -> !(Reg ctx (MaybeType tp)) -> !(SwitchTarget blocks ctx tp) -> !(JumpTarget blocks ctx) -> TermStmt blocks rtp ctx | |
VariantElim :: !(CtxRepr varctx) -> !(Reg ctx (VariantType varctx)) -> !(Assignment (SwitchTarget blocks ctx) varctx) -> TermStmt blocks ret ctx | |
Return :: !(Reg ctx ret) -> TermStmt blocks ret ctx | |
TailCall :: !(Reg ctx (FunctionHandleType args ret)) -> !(CtxRepr args) -> !(Assignment (Reg ctx) args) -> TermStmt blocks ret ctx | |
ErrorStmt :: !(Reg ctx (StringType Unicode)) -> TermStmt blocks ret ctx |
Instances
ApplyEmbedding (TermStmt blocks ret :: Ctx CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods applyEmbedding :: forall (ctx :: Ctx k) (ctx' :: Ctx k). CtxEmbedding ctx ctx' -> TermStmt blocks ret ctx -> TermStmt blocks ret ctx' # | |
ExtendContext (TermStmt blocks ret :: Ctx CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core | |
Pretty (TermStmt blocks ret ctx) Source # | |
Defined in Lang.Crucible.CFG.Core |
termStmtNextBlocks :: TermStmt b ret ctx -> Maybe [Some (BlockID b)] Source #
Return the set of possible next blocks from a TermStmt
Expressions
newtype Expr ext (ctx :: Ctx CrucibleType) (tp :: CrucibleType) Source #
An expression is just an App applied to some registers.
Instances
TraversableFC (ExprExtension ext) => ApplyEmbedding' (Expr ext :: Ctx CrucibleType -> CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods applyEmbedding' :: forall (ctx :: Ctx k) (ctx' :: Ctx k) (v :: k'). CtxEmbedding ctx ctx' -> Expr ext ctx v -> Expr ext ctx' v # | |
TraversableFC (ExprExtension ext) => ExtendContext' (Expr ext :: Ctx CrucibleType -> CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core | |
IsString (Expr ext ctx (StringType Unicode)) Source # | |
Defined in Lang.Crucible.CFG.Core Methods fromString :: String -> Expr ext ctx (StringType Unicode) # | |
PrettyApp (ExprExtension ext) => Pretty (Expr ext ctx tp) Source # | |
Defined in Lang.Crucible.CFG.Core |
newtype Reg (ctx :: Ctx CrucibleType) (tp :: CrucibleType) Source #
A temporary register identifier introduced during translation.
These are unique to the current function. The ctx
parameter
is a context containing the types of all the temporary registers
currently in scope, and the tp
parameter indicates the type
of this register (which necessarily appears somewhere in ctx
)
Instances
ApplyEmbedding' Reg Source # | |
Defined in Lang.Crucible.CFG.Core Methods applyEmbedding' :: forall (ctx :: Ctx k) (ctx' :: Ctx k) (v :: k'). CtxEmbedding ctx ctx' -> Reg ctx v -> Reg ctx' v # | |
ExtendContext' Reg Source # | |
Defined in Lang.Crucible.CFG.Core | |
TestEquality (Reg ctx :: CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core | |
OrdF (Reg ctx :: CrucibleType -> Type) Source # | |
Defined in Lang.Crucible.CFG.Core Methods compareF :: forall (x :: k) (y :: k). Reg ctx x -> Reg ctx y -> OrderingF x y # leqF :: forall (x :: k) (y :: k). Reg ctx x -> Reg ctx y -> Bool # ltF :: forall (x :: k) (y :: k). Reg ctx x -> Reg ctx y -> Bool # geqF :: forall (x :: k) (y :: k). Reg ctx x -> Reg ctx y -> Bool # gtF :: forall (x :: k) (y :: k). Reg ctx x -> Reg ctx y -> Bool # | |
ShowF (Reg ctx :: CrucibleType -> Type) Source # | |
Show (Reg ctx tp) Source # | |
Eq (Reg ctx tp) Source # | |
Ord (Reg ctx tp) Source # | |
Defined in Lang.Crucible.CFG.Core | |
Pretty (Reg ctx tp) Source # | |
Defined in Lang.Crucible.CFG.Core |
extendReg :: Reg ctx tp -> Reg (ctx ::> r) tp Source #
Extend the set of registers in scope for a given register value without changing its index or type.
lastReg :: KnownContext ctx => Reg (ctx ::> tp) tp Source #
Finds the value of the most-recently introduced register in scope.
Re-exports
module Lang.Crucible.Types
module Lang.Crucible.CFG.Common
module Data.Parameterized.Classes
module Data.Parameterized.Some