Module SSA_Query.Domain

The actual transformation functor

Parameters

module S : Sig.SSA_Domain

Signature

include Sig.Doc
val id : string

Unique identifier for the domain, eg "N", "FA",...

val name : Stdlib.Format.formatter -> unit -> unit

Full human readable name

val state_name : string

Name of the domain's states

val doc : string

Long description of the domain

Domain types

module SSA_State = S.SSA_State
module StateBindingsSet = S.StateBindingsSet

Set of states and bindings (phi variables).

Domain operations

similar to apply, assume e s returns the state obtained from s when assuming that e is non-zero. None means e is always zero

  • raises Division_by_zero
val join : StateBindingsSet.t -> SSA_State.t option

Join the given states.

  • None on empty set
  • the unique element on the singleton set (bindings are discarded)
val entrypoint : Ast.Program.Var.t list -> SSA_State.t

Domain entrypoint, with a list of initial variables in scope

val is_included : Ast.Program.Loc.t -> SSA_State.t -> SSA_State.t -> bool

is_included l s1 s2 is true is s1 included in s2 according to the domain order at l. Used to know the fixpoint has been reached.

val join_and_widen : Ast.Program.Loc.t -> SSA_State.t -> StateBindingsSet.t -> SSA_State.t option

Performs both join and widening simultaneously. This simplifies numbering the new states.

Queries

Possible truth value of the given expression None when the domain provides no useful data

val query_is_constant : (SSA_State.t -> Ast.Program.SSAExpr.t -> Z.t option) option

query_is_constant state expr is Some z only if we can prove that expr is equal to constant z in the given state None when the domain provides no useful data