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.
80 lines
2.8 KiB
80 lines
2.8 KiB
(*
|
|
* 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.
|
|
*)
|
|
|
|
(** Types *)
|
|
|
|
type t = private
|
|
| Function of {return: t option; args: t vector}
|
|
(** (Global) function names have type Pointer to Function. *)
|
|
| Integer of {bits: int; byts: int} (** Integer of given bitwidth. *)
|
|
| Float of {bits: int; byts: int; enc: [`IEEE | `Extended | `Pair]}
|
|
(** Floating-point numbers of given bitwidth and encoding. *)
|
|
| Pointer of {elt: t} (** Pointer to element type. *)
|
|
| Array of {elt: t; len: int; bits: int; byts: int}
|
|
(** Statically-sized array of [len] elements of type [elt]. *)
|
|
| Tuple of {elts: t vector; bits: int; byts: int; packed: bool}
|
|
(** Anonymous aggregate of heterogeneous types. *)
|
|
| Struct of
|
|
{name: string; elts: t vector; bits: int; byts: int; packed: bool}
|
|
(** Uniquely named aggregate of heterogeneous types. Every cycle of
|
|
recursive types contains a [Struct]. NOTE: recursive [Struct]
|
|
types are represented by cyclic values. *)
|
|
| Opaque of {name: string}
|
|
(** Uniquely named aggregate type whose definition is hidden. *)
|
|
[@@deriving compare, equal, hash, sexp]
|
|
|
|
val pp : t pp
|
|
val pp_defn : t pp
|
|
|
|
include Invariant.S with type t := t
|
|
|
|
(** Constructors *)
|
|
|
|
val bool : t
|
|
val byt : t
|
|
val int : t
|
|
val siz : t
|
|
val ptr : t
|
|
val function_ : return:t option -> args:t vector -> t
|
|
val integer : bits:int -> byts:int -> t
|
|
val float : bits:int -> byts:int -> enc:[`Extended | `IEEE | `Pair] -> t
|
|
val pointer : elt:t -> t
|
|
val array : elt:t -> len:int -> bits:int -> byts:int -> t
|
|
val tuple : t vector -> bits:int -> byts:int -> packed:bool -> t
|
|
|
|
val struct_ :
|
|
name:string -> bits:int -> byts:int -> packed:bool -> t lazy_t vector -> t
|
|
|
|
val opaque : name:string -> t
|
|
|
|
(** Queries *)
|
|
|
|
val is_sized : t -> bool
|
|
(** Holds of types which are first-class and have a statically-known size. *)
|
|
|
|
val bit_size_of : t -> int
|
|
(** The number of bits required to hold a value of the given type. Raises
|
|
unless [is_sized] holds. *)
|
|
|
|
val size_of : t -> int
|
|
(** The number of bytes between adjacent values of the given type, including
|
|
alignment padding. Raises unless is_sized holds. *)
|
|
|
|
val equivalent : t -> t -> bool
|
|
(** Equivalent types are those that denote the same sets of values in the
|
|
semantic model. An equivalence relation. *)
|
|
|
|
val castable : t -> t -> bool
|
|
(** Castable types are those that can be cast between without loss of
|
|
information. An equivalence relation. *)
|
|
|
|
val convertible : t -> t -> bool
|
|
(** Convertible types are those that can be converted between, perhaps with
|
|
some loss of information. Not transitive: some admissible conversions
|
|
must be performed in multiple steps, such as from [Pointer] to [Integer]
|
|
to [Array]. *)
|