Module Backend.ClosuresSubstitution

module L = IBase.Logging
module ExpClosure : sig ... end

value domain, with the following concretization function gamma:

module VDom : sig ... end
module CFG = Absint.ProcCfg.Normal
module Domain : sig ... end
val get_var : Domain.t -> IR.Var.t -> Domain.value
val eval_expr : Domain.t -> IR.Exp.t -> Domain.value
val eval_instr : Domain.t -> IR.Sil.instr -> Domain.t
module TransferFunctions : sig ... end
module Analyzer : sig ... end
val get_invariant_at_node : Analyzer.invariant_map -> IR.Procdesc.Node.t -> Domain.t
val replace_closure_call : CFG.Node.t -> Domain.t -> IR.Sil.instr -> IR.Sil.instr
val replace_closure_param : CFG.Node.t -> Domain.t -> IR.Sil.instr -> IR.Sil.instr

replace_closure_param propagates closures to function parameters, so that more functions are specialized by CCallSpecializedWithClosures.process. Note that unlike replace_closure_call running at the analysis phase, replace_closure_param should run before CCallSpecializedWithClosures.process at the capture phase.

val process_common : (IR.Procdesc.Node.t -> Domain.t -> IR.Sil.instr -> IR.Sil.instr) -> IR.Procdesc.t -> unit
val process_closure_call : Summary.t -> unit
val process_closure_param : IR.Procdesc.t -> unit