113 lines
3.5 KiB
OCaml
113 lines
3.5 KiB
OCaml
(**************************************************************************)
|
|
(* *)
|
|
(* OCaml *)
|
|
(* *)
|
|
(* Mark Shinwell, Jane Street Europe *)
|
|
(* *)
|
|
(* Copyright 2016--2017 Jane Street Group LLC *)
|
|
(* *)
|
|
(* All rights reserved. This file is distributed under the terms of *)
|
|
(* the GNU Lesser General Public License version 2.1, with the *)
|
|
(* special exception on linking described in the file LICENSE. *)
|
|
(* *)
|
|
(**************************************************************************)
|
|
|
|
(** Registers equipped with information used for generating debugging
|
|
information. *)
|
|
|
|
module Debug_info : sig
|
|
type t
|
|
|
|
val compare : t -> t -> int
|
|
|
|
val holds_value_of : t -> Backend_var.t
|
|
(** The identifier that the register holds (part of) the value of. *)
|
|
|
|
val part_of_value : t -> int
|
|
val num_parts_of_value : t -> int
|
|
|
|
val which_parameter : t -> int option
|
|
(** If the register corresponds to a function parameter, the value returned
|
|
is the zero-based index of said parameter; otherwise it is [None]. *)
|
|
|
|
val provenance : t -> unit option
|
|
end
|
|
|
|
type t
|
|
|
|
type reg_with_debug_info = t
|
|
|
|
val create
|
|
: reg:Reg.t
|
|
-> holds_value_of:Backend_var.t
|
|
-> part_of_value:int
|
|
-> num_parts_of_value:int
|
|
-> which_parameter:int option
|
|
-> provenance:unit option
|
|
-> t
|
|
|
|
val create_with_debug_info : reg:Reg.t -> debug_info:Debug_info.t option -> t
|
|
|
|
val create_without_debug_info : reg:Reg.t -> t
|
|
|
|
val create_copying_debug_info : reg:Reg.t -> debug_info_from:t -> t
|
|
|
|
val reg : t -> Reg.t
|
|
val location : t -> Reg.location
|
|
val debug_info : t -> Debug_info.t option
|
|
|
|
val at_same_location : t -> Reg.t -> register_class:(Reg.t -> int) -> bool
|
|
(** [at_same_location t reg] holds iff the register [t] corresponds to
|
|
the same (physical or pseudoregister) location as the register [reg],
|
|
which is not equipped with debugging information.
|
|
[register_class] should be [Proc.register_class].
|
|
*)
|
|
|
|
val holds_pointer : t -> bool
|
|
val holds_non_pointer : t -> bool
|
|
|
|
val assigned_to_stack : t -> bool
|
|
(** [assigned_to_stack t] holds iff the location of [t] is a hard stack
|
|
slot. *)
|
|
|
|
val clear_debug_info : t -> t
|
|
|
|
module Set_distinguishing_names_and_locations
|
|
: Set.S with type elt = t
|
|
|
|
module Map_distinguishing_names_and_locations
|
|
: Map.S with type key = t
|
|
|
|
module Set : sig
|
|
include Set.S with type elt = t
|
|
|
|
val of_array : reg_with_debug_info array -> t
|
|
|
|
val mem_reg : t -> Reg.t -> bool
|
|
|
|
val find_reg_exn : t -> Reg.t -> reg_with_debug_info
|
|
|
|
val filter_reg : t -> Reg.t -> t
|
|
|
|
val forget_debug_info : t -> Reg.Set.t
|
|
|
|
val without_debug_info : Reg.Set.t -> t
|
|
|
|
val made_unavailable_by_clobber
|
|
: t
|
|
-> regs_clobbered:Reg.t array
|
|
-> register_class:(Reg.t -> int)
|
|
-> t
|
|
(** [made_unavailable_by_clobber t ~regs_clobbered ~register_class] returns
|
|
the largest subset of [t] whose locations do not overlap with any
|
|
registers in [regs_clobbered]. (Think of [t] as a set of available
|
|
registers.)
|
|
[register_class] should always be [Proc.register_class]. *)
|
|
end
|
|
|
|
val print
|
|
: print_reg:(Format.formatter -> Reg.t -> unit)
|
|
-> Format.formatter
|
|
-> t
|
|
-> unit
|