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.
34 lines
919 B
34 lines
919 B
(*
|
|
* 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.
|
|
*)
|
|
|
|
(** Global variables *)
|
|
|
|
type t = {reg: Reg.t; init: Exp.t option; typ: Typ.t; loc: Loc.t}
|
|
[@@deriving compare, equal, hash, sexp]
|
|
|
|
let pp fs {reg} =
|
|
let name = Reg.name reg in
|
|
let pf pp =
|
|
Format.pp_open_box fs 2 ;
|
|
Format.kfprintf (fun fs -> Format.pp_close_box fs ()) fs pp
|
|
in
|
|
pf "@%s%a" name Reg.pp_demangled reg
|
|
|
|
let pp_defn fs {reg; init; typ; loc} =
|
|
Format.fprintf fs "@[<2>%a %a%a%a@]" Typ.pp typ Reg.pp reg Loc.pp loc
|
|
(Option.pp "@ = @[%a@]" Exp.pp)
|
|
init
|
|
|
|
let invariant g =
|
|
Invariant.invariant [%here] g [%sexp_of: t]
|
|
@@ fun () ->
|
|
let {reg; typ} = g in
|
|
assert (Typ.is_sized typ) ;
|
|
assert (Var.is_global (Reg.var reg))
|
|
|
|
let mk ?init reg typ loc = {reg; init; typ; loc} |> check invariant
|