You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.7 KiB
101 lines
3.7 KiB
(*
|
|
* Copyright (c) 2009-2013, Monoidics ltd.
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*)
|
|
|
|
(** The Smallfoot Intermediate Language *)
|
|
|
|
open! IStd
|
|
module F = Format
|
|
|
|
(** {2 Programs and Types} *)
|
|
|
|
(** Kind of prune instruction *)
|
|
type if_kind =
|
|
| Ik_bexp (** boolean expressions, and exp ? exp : exp *)
|
|
| Ik_dowhile
|
|
| Ik_for
|
|
| Ik_if
|
|
| Ik_land_lor (** obtained from translation of && or || *)
|
|
| Ik_while
|
|
| Ik_switch
|
|
[@@deriving compare]
|
|
|
|
type instr_metadata =
|
|
| Abstract of Location.t
|
|
(** a good place to apply abstraction, mostly used in the biabduction analysis *)
|
|
| ExitScope of Var.t list * Location.t (** remove temporaries and dead program variables *)
|
|
| Nullify of Pvar.t * Location.t (** nullify stack variable *)
|
|
| Skip (** no-op *)
|
|
| VariableLifetimeBegins of Pvar.t * Typ.t * Location.t (** stack variable declared *)
|
|
[@@deriving compare]
|
|
|
|
(** An instruction. *)
|
|
type instr =
|
|
(* Note for frontend writers:
|
|
[x] must be used in a subsequent instruction, otherwise the entire
|
|
`Load` instruction may be eliminated by copy-propagation. *)
|
|
| Load of {id: Ident.t; e: Exp.t; root_typ: Typ.t; typ: Typ.t; loc: Location.t}
|
|
(** Load a value from the heap into an identifier.
|
|
|
|
[id = *exp:typ(root_typ)] where
|
|
|
|
- [exp] is an expression denoting a heap address
|
|
- [typ] is typ of [exp] and [id]
|
|
- [root_typ] is the root type of [exp]
|
|
|
|
The [root_typ] is deprecated: it is broken in C/C++. We are removing [root_typ] in the
|
|
future, so please use [typ] instead. *)
|
|
| Store of {e1: Exp.t; root_typ: Typ.t; typ: Typ.t; e2: Exp.t; loc: Location.t}
|
|
(** Store the value of an expression into the heap.
|
|
|
|
[*exp1:typ(root_typ) = exp2] where
|
|
|
|
- [exp1] is an expression denoting a heap address
|
|
- [typ] is typ of [*exp1] and [exp2]
|
|
- [root_typ] is the root type of [exp1]
|
|
- [exp2] is the expression whose value is stored.
|
|
|
|
The [root_typ] is deprecated: it is broken in C/C++. We are removing [root_typ] in the
|
|
future, so please use [typ] instead. *)
|
|
| Prune of Exp.t * Location.t * bool * if_kind
|
|
(** prune the state based on [exp=1], the boolean indicates whether true branch *)
|
|
| Call of (Ident.t * Typ.t) * Exp.t * (Exp.t * Typ.t) list * Location.t * CallFlags.t
|
|
(** [Call ((ret_id, ret_typ), e_fun, arg_ts, loc, call_flags)] represents an instruction
|
|
[ret_id = e_fun(arg_ts);] *)
|
|
| Metadata of instr_metadata
|
|
(** hints about the program that are not strictly needed to understand its semantics, for
|
|
instance information about its original syntactic structure *)
|
|
[@@deriving compare]
|
|
|
|
val equal_instr : instr -> instr -> bool
|
|
|
|
val skip_instr : instr
|
|
|
|
val instr_is_auxiliary : instr -> bool
|
|
(** Check if an instruction is auxiliary, or if it comes from source instructions. *)
|
|
|
|
val add_with_block_parameters_flag : instr -> instr
|
|
(** Adds a with_blocks_parameters flag to a method call, when the arguments contain an Objective-C
|
|
block, and the method is an Objective-C method (to be extended to other methods) *)
|
|
|
|
val location_of_instr : instr -> Location.t
|
|
(** Get the location of the instruction *)
|
|
|
|
val exps_of_instr : instr -> Exp.t list
|
|
(** get the expressions occurring in the instruction *)
|
|
|
|
val if_kind_to_string : if_kind -> string
|
|
(** Pretty print an if_kind *)
|
|
|
|
val pp_instr_metadata : Pp.env -> F.formatter -> instr_metadata -> unit
|
|
|
|
val pp_instr : print_types:bool -> Pp.env -> F.formatter -> instr -> unit
|
|
(** Pretty print an instruction. *)
|
|
|
|
val d_instr : instr -> unit
|
|
(** Dump an instruction. *)
|