sig
  type 'a action = Default | Done of '| Post of ('-> 'a)
  type 'a stmtaction = SDefault | SDone | SUse of 'a
  type 'a guardaction = GDefault | GUse of '| GUnreachable
  module type StmtStartData =
    sig
      type data
      type key
      val clear : unit -> unit
      val mem : Dataflow.StmtStartData.key -> bool
      val find : Dataflow.StmtStartData.key -> Dataflow.StmtStartData.data
      val replace :
        Dataflow.StmtStartData.key -> Dataflow.StmtStartData.data -> unit
      val add :
        Dataflow.StmtStartData.key -> Dataflow.StmtStartData.data -> unit
      val iter :
        (Dataflow.StmtStartData.key -> Dataflow.StmtStartData.data -> unit) ->
        unit
      val length : unit -> int
    end
  module StmtStartData :
    functor (X : sig type t val size : int end->
      sig
        type data = X.t
        type key = int
        val clear : unit -> unit
        val mem : key -> bool
        val find : key -> data
        val replace : key -> data -> unit
        val add : key -> data -> unit
        val iter : (key -> data -> unit) -> unit
        val length : unit -> int
      end
  module StartData :
    functor (X : sig type t val size : int end->
      sig
        type data = X.t
        type key = Cil_types.stmt
        val clear : unit -> unit
        val mem : key -> bool
        val find : key -> data
        val replace : key -> data -> unit
        val add : key -> data -> unit
        val iter : (key -> data -> unit) -> unit
        val length : unit -> int
      end
  module type ForwardsTransfer =
    sig
      val name : string
      val debug : bool Pervasives.ref
      type t
      val copy : Dataflow.ForwardsTransfer.t -> Dataflow.ForwardsTransfer.t
      val pretty : Format.formatter -> Dataflow.ForwardsTransfer.t -> unit
      val computeFirstPredecessor :
        Cil_types.stmt ->
        Dataflow.ForwardsTransfer.t -> Dataflow.ForwardsTransfer.t
      val combinePredecessors :
        Cil_types.stmt ->
        old:Dataflow.ForwardsTransfer.t ->
        Dataflow.ForwardsTransfer.t -> Dataflow.ForwardsTransfer.t option
      val doInstr :
        Cil_types.stmt ->
        Cil_types.instr ->
        Dataflow.ForwardsTransfer.t ->
        Dataflow.ForwardsTransfer.t Dataflow.action
      val doGuard :
        Cil_types.stmt ->
        Cil_types.exp ->
        Dataflow.ForwardsTransfer.t ->
        Dataflow.ForwardsTransfer.t Dataflow.guardaction *
        Dataflow.ForwardsTransfer.t Dataflow.guardaction
      val doStmt :
        Cil_types.stmt ->
        Dataflow.ForwardsTransfer.t ->
        Dataflow.ForwardsTransfer.t Dataflow.stmtaction
      val filterStmt : Cil_types.stmt -> bool
      val stmt_can_reach : Cil_types.stmt -> Cil_types.stmt -> bool
      val doEdge :
        Cil_types.stmt ->
        Cil_types.stmt ->
        Dataflow.ForwardsTransfer.t -> Dataflow.ForwardsTransfer.t
      module StmtStartData :
        sig
          type data = t
          type key
          val clear : unit -> unit
          val mem : key -> bool
          val find : key -> data
          val replace : key -> data -> unit
          val add : key -> data -> unit
          val iter : (key -> data -> unit) -> unit
          val length : unit -> int
        end
    end
  module Forwards :
    functor
      (T : sig
             val name : string
             val debug : bool ref
             type t
             val copy : t -> t
             val pretty : Format.formatter -> t -> unit
             val computeFirstPredecessor : Cil_types.stmt -> t -> t
             val combinePredecessors :
               Cil_types.stmt -> old:t -> t -> t option
             val doInstr : Cil_types.stmt -> Cil_types.instr -> t -> t action
             val doGuard :
               Cil_types.stmt ->
               Cil_types.exp -> t -> t guardaction * t guardaction
             val doStmt : Cil_types.stmt -> t -> t stmtaction
             val filterStmt : Cil_types.stmt -> bool
             val stmt_can_reach : Cil_types.stmt -> Cil_types.stmt -> bool
             val doEdge : Cil_types.stmt -> Cil_types.stmt -> t -> t
             module StmtStartData :
               sig
                 type data = t
                 type key = Cil_types.stmt
                 val clear : unit -> unit
                 val mem : key -> bool
                 val find : key -> data
                 val replace : key -> data -> unit
                 val add : key -> data -> unit
                 val iter : (key -> data -> unit) -> unit
                 val length : unit -> int
               end
           end->
      sig
        val reachedStatement :
          Cil_types.stmt -> Cil_types.stmt -> T.t -> unit
        val compute : Cil_types.stmt list -> unit
      end
  module ForwardsDataFlow :
    functor
      (T : sig
             val name : string
             val debug : bool ref
             type t
             val copy : t -> t
             val pretty : Format.formatter -> t -> unit
             val computeFirstPredecessor : Cil_types.stmt -> t -> t
             val combinePredecessors :
               Cil_types.stmt -> old:t -> t -> t option
             val doInstr : Cil_types.stmt -> Cil_types.instr -> t -> t action
             val doGuard :
               Cil_types.stmt ->
               Cil_types.exp -> t -> t guardaction * t guardaction
             val doStmt : Cil_types.stmt -> t -> t stmtaction
             val filterStmt : Cil_types.stmt -> bool
             val stmt_can_reach : Cil_types.stmt -> Cil_types.stmt -> bool
             val doEdge : Cil_types.stmt -> Cil_types.stmt -> t -> t
             module StmtStartData :
               sig
                 type data = t
                 type key = int
                 val clear : unit -> unit
                 val mem : key -> bool
                 val find : key -> data
                 val replace : key -> data -> unit
                 val add : key -> data -> unit
                 val iter : (key -> data -> unit) -> unit
                 val length : unit -> int
               end
           end->
      sig
        val reachedStatement :
          Cil_types.stmt -> Cil_types.stmt -> T.t -> unit
        val compute : Cil_types.stmt list -> unit
      end
  module type BackwardsTransfer =
    sig
      val name : string
      val debug : bool Pervasives.ref
      type t
      val pretty : Format.formatter -> Dataflow.BackwardsTransfer.t -> unit
      val funcExitData : Dataflow.BackwardsTransfer.t
      val combineStmtStartData :
        Cil_types.stmt ->
        old:Dataflow.BackwardsTransfer.t ->
        Dataflow.BackwardsTransfer.t -> Dataflow.BackwardsTransfer.t option
      val combineSuccessors :
        Dataflow.BackwardsTransfer.t ->
        Dataflow.BackwardsTransfer.t -> Dataflow.BackwardsTransfer.t
      val doStmt :
        Cil_types.stmt -> Dataflow.BackwardsTransfer.t Dataflow.action
      val doInstr :
        Cil_types.stmt ->
        Cil_types.instr ->
        Dataflow.BackwardsTransfer.t ->
        Dataflow.BackwardsTransfer.t Dataflow.action
      val filterStmt : Cil_types.stmt -> Cil_types.stmt -> bool
      module StmtStartData :
        sig
          type data = t
          type key
          val clear : unit -> unit
          val mem : key -> bool
          val find : key -> data
          val replace : key -> data -> unit
          val add : key -> data -> unit
          val iter : (key -> data -> unit) -> unit
          val length : unit -> int
        end
    end
  module Backwards :
    functor
      (T : sig
             val name : string
             val debug : bool ref
             type t
             val pretty : Format.formatter -> t -> unit
             val funcExitData : t
             val combineStmtStartData :
               Cil_types.stmt -> old:t -> t -> t option
             val combineSuccessors : t -> t -> t
             val doStmt : Cil_types.stmt -> t action
             val doInstr : Cil_types.stmt -> Cil_types.instr -> t -> t action
             val filterStmt : Cil_types.stmt -> Cil_types.stmt -> bool
             module StmtStartData :
               sig
                 type data = t
                 type key = Cil_types.stmt
                 val clear : unit -> unit
                 val mem : key -> bool
                 val find : key -> data
                 val replace : key -> data -> unit
                 val add : key -> data -> unit
                 val iter : (key -> data -> unit) -> unit
                 val length : unit -> int
               end
           end->
      sig val compute : Cil_types.stmt list -> unit end
  module BackwardsDataFlow :
    functor
      (T : sig
             val name : string
             val debug : bool ref
             type t
             val pretty : Format.formatter -> t -> unit
             val funcExitData : t
             val combineStmtStartData :
               Cil_types.stmt -> old:t -> t -> t option
             val combineSuccessors : t -> t -> t
             val doStmt : Cil_types.stmt -> t action
             val doInstr : Cil_types.stmt -> Cil_types.instr -> t -> t action
             val filterStmt : Cil_types.stmt -> Cil_types.stmt -> bool
             module StmtStartData :
               sig
                 type data = t
                 type key = int
                 val clear : unit -> unit
                 val mem : key -> bool
                 val find : key -> data
                 val replace : key -> data -> unit
                 val add : key -> data -> unit
                 val iter : (key -> data -> unit) -> unit
                 val length : unit -> int
               end
           end->
      sig val compute : Cil_types.stmt list -> unit end
  val find_stmts :
    Cil_types.fundec -> Cil_types.stmt list * Cil_types.stmt list
  val stmt_of_sid : (int -> Cil_types.stmt) Pervasives.ref
end