(*
 * Copyright (c) 2016 - present Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 *)

open! Utils

(** Transfer functions that push abstract states across instructions. A typical client should
    implement the Make signature to allow the transfer functions to be used with any kind of CFG. *)

module type S = sig
  module CFG : ProcCfg.S
  module Domain : AbstractDomain.S (* abstract domain whose state we propagate *)
  type extras (* read-only extra state (results of previous analyses, globals, etc.) *)

  (* {A} instr {A'}. [node] is the node of the current instruction *)
  val exec_instr : Domain.astate -> extras ProcData.t -> CFG.node -> Sil.instr -> Domain.astate
end

module type Make = functor (C : ProcCfg.S) -> sig
  include (S with module CFG = C)
end
