Pulselib.PulseBaseStack
module type S = sig ... end
Values are ValueOrigin.t
, which should always be Unknown
for program variables, and always be not Unknown
for logical variables, as we record what was loaded into each logical variable. For example, after n$1 = *&p
, n$1
should have p
as its value origin.
include S with type value = Pulselib.PulseBasicInterface.ValueOrigin.t
include IStdlib.PrettyPrintable.PPMonoMap
with type key = IR.Var.t
with type value = Pulselib.PulseBasicInterface.ValueOrigin.t
include IStdlib.PrettyPrintable.MonoMap
with type key = IR.Var.t
with type value = Pulselib.PulseBasicInterface.ValueOrigin.t
type key = IR.Var.t
type value = Pulselib.PulseBasicInterface.ValueOrigin.t
val empty : t
val is_empty : t -> bool
val cardinal : t -> int
val is_singleton_or_more :
t ->
(key * value) IStdlib.IContainer.singleton_or_more
include IStdlib.PrettyPrintable.PrintableType with type t := t
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val pp_key : IStdlib.PrettyPrintable.F.formatter -> key -> unit
val yojson_of_t : t -> Yojson.Safe.t
val canonicalize :
get_var_repr:
(Pulselib.PulseBasicInterface.AbstractValue.t ->
Pulselib.PulseBasicInterface.AbstractValue.t) ->
t ->
t Pulselib.PulseBasicInterface.SatUnsat.t
replace each address in the stack by its canonical representative according to the current equality relation, represented by get_var_repr