(* * Copyright (c) 2016-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. *) open! IStd type debug = Default | DefaultNoExecInstr_UseFromLowerHilAbstractInterpreterOnly module VisitCount : sig type t end module State : sig type 'a t = {pre: 'a; post: 'a; visit_count: VisitCount.t} end (** type of an intraprocedural abstract interpreter *) module type S = sig module TransferFunctions : TransferFunctions.SIL module InvariantMap = TransferFunctions.CFG.Node.IdMap (** invariant map from node id -> state representing postcondition for node id *) type invariant_map = TransferFunctions.Domain.astate State.t InvariantMap.t val compute_post : ?do_narrowing:bool -> ?debug:debug -> TransferFunctions.extras ProcData.t -> initial:TransferFunctions.Domain.astate -> TransferFunctions.Domain.astate option (** compute and return the postcondition for the given procedure starting from [initial]. *) val exec_cfg : ?do_narrowing:bool -> TransferFunctions.CFG.t -> TransferFunctions.extras ProcData.t -> initial:TransferFunctions.Domain.astate -> invariant_map (** compute and return invariant map for the given CFG/procedure starting from [initial]. *) val exec_pdesc : ?do_narrowing:bool -> TransferFunctions.extras ProcData.t -> initial:TransferFunctions.Domain.astate -> invariant_map (** compute and return invariant map for the given procedure starting from [initial] *) val extract_post : InvariantMap.key -> 'a State.t InvariantMap.t -> 'a option (** extract the postcondition for a node id from the given invariant map *) val extract_pre : InvariantMap.key -> 'a State.t InvariantMap.t -> 'a option (** extract the precondition for a node id from the given invariant map *) val extract_state : InvariantMap.key -> 'a InvariantMap.t -> 'a option (** extract the state for a node id from the given invariant map *) end module type Make = functor (TransferFunctions : TransferFunctions.SIL) -> S with module TransferFunctions = TransferFunctions (** create an intraprocedural abstract interpreter from transfer functions using the reverse post-order scheduler *) module MakeRPO : Make (** create an intraprocedural abstract interpreter from transfer functions using Bourdoncle's strongly connected component weak topological order *) module MakeWTO : Make