(*
 * Copyright (c) 2018-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.
 *)

(** Abstract domain *)

type t

val pp : t pp
val init : Global.t vector -> t
val join : t -> t -> t
val assume : t -> Exp.t -> t option
val exec_inst : t -> Llair.inst -> (t, unit) result

val exec_intrinsic :
  t -> Var.t option -> Var.t -> Exp.t list -> (t, unit) result option

type from_call [@@deriving compare, equal, sexp]

val call : t -> Exp.t list -> Var.t list -> Var.Set.t -> t * from_call
val retn : Var.Set.t -> from_call -> t -> t

val resolve_callee :
  (Var.t -> Llair.func list) -> Exp.t -> t -> Llair.func list
