Control-flow graph for a single procedure (as opposed to cfg.ml, which represents a cfg for a file). Defines useful wrappers that allows us to do tricks like turn a forward cfg to into a backward one, or view a cfg as having a single instruction per block
module type Node : sig ... end
module type S : sig ... end
module DefaultNode : Node with type t = InferIR.Procdesc.Node.t and type id = InferIR.Procdesc.Node.id
module InstrNode : sig ... end
module Normal : S with type t = InferIR.Procdesc.t and module Node = DefaultNode and type instrs_dir = InferIR.Instrs.not_reversed
Forward CFG with no exceptional control-flow
module Exceptional : S with type t = InferIR.Procdesc.t * DefaultNode.t list InferIR.Procdesc.IdMap.t and module Node = DefaultNode and type instrs_dir = InferIR.Instrs.not_reversed
Forward CFG with exceptional control-flow
module Backward : functor (Base : S with type instrs_dir = InferIR.Instrs.not_reversed) -> S with type t = Base.t and module Node = Base.Node and type instrs_dir = InferIR.Instrs.reversed
Wrapper that reverses the direction of the CFG
module OneInstrPerNode : functor (Base : S with module Node = DefaultNode) -> sig ... end
module NormalOneInstrPerNode : module type of sig ... end