/* Definitions for values of C expressions, for GDB.

   Copyright (C) 1986-2024 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef GDB_VALUE_H
#define GDB_VALUE_H

#include "frame.h"
#include "extension.h"
#include "gdbsupport/gdb_ref_ptr.h"
#include "gmp-utils.h"
#include "gdbtypes.h"

struct block;
struct expression;
struct regcache;
struct symbol;
struct ui_file;
struct language_defn;
struct value_print_options;

/* Values can be partially 'optimized out' and/or 'unavailable'.
   These are distinct states and have different string representations
   and related error strings.

   'unavailable' has a specific meaning in this context.  It means the
   value exists in the program (at the machine level), but GDB has no
   means to get to it.  Such a value is normally printed as
   <unavailable>.  Examples of how to end up with an unavailable value
   would be:

    - We're inspecting a traceframe, and the memory or registers the
      debug information says the value lives on haven't been collected.

    - We're inspecting a core dump, the memory or registers the debug
      information says the value lives aren't present in the dump
      (that is, we have a partial/trimmed core dump, or we don't fully
      understand/handle the core dump's format).

    - We're doing live debugging, but the debug API has no means to
      get at where the value lives in the machine, like e.g., ptrace
      not having access to some register or register set.

    - Any other similar scenario.

  OTOH, "optimized out" is about what the compiler decided to generate
  (or not generate).  A chunk of a value that was optimized out does
  not actually exist in the program.  There's no way to get at it
  short of compiling the program differently.

  A register that has not been saved in a frame is likewise considered
  optimized out, except not-saved registers have a different string
  representation and related error strings.  E.g., we'll print them as
  <not-saved> instead of <optimized out>, as in:

    (gdb) p/x $rax
    $1 = <not saved>
    (gdb) info registers rax
    rax            <not saved>

  If the debug info describes a variable as being in such a register,
  we'll still print the variable as <optimized out>.  IOW, <not saved>
  is reserved for inspecting registers at the machine level.

  When comparing value contents, optimized out chunks, unavailable
  chunks, and valid contents data are all considered different.  See
  value_contents_eq for more info.
*/

extern bool overload_resolution;

/* Defines an [OFFSET, OFFSET + LENGTH) range.  */

struct range
{
  /* Lowest offset in the range.  */
  LONGEST offset;

  /* Length of the range.  */
  ULONGEST length;

  /* Returns true if THIS is strictly less than OTHER, useful for
     searching.  We keep ranges sorted by offset and coalesce
     overlapping and contiguous ranges, so this just compares the
     starting offset.  */

  bool operator< (const range &other) const
  {
    return offset < other.offset;
  }

  /* Returns true if THIS is equal to OTHER.  */
  bool operator== (const range &other) const
  {
    return offset == other.offset && length == other.length;
  }
};

/* A policy class to interface gdb::ref_ptr with struct value.  */

struct value_ref_policy
{
  static void incref (struct value *ptr);
  static void decref (struct value *ptr);
};

/* A gdb:;ref_ptr pointer to a struct value.  */

typedef gdb::ref_ptr<struct value, value_ref_policy> value_ref_ptr;

/* Note that the fields in this structure are arranged to save a bit
   of memory.  */

struct value
{
private:

  /* Values can only be created via "static constructors".  */
  explicit value (struct type *type_)
    : m_modifiable (true),
      m_lazy (true),
      m_initialized (true),
      m_stack (false),
      m_is_zero (false),
      m_in_history (false),
      m_type (type_),
      m_enclosing_type (type_)
  {
  }

  /* Values can only be destroyed via the reference-counting
     mechanism.  */
  ~value ();

  DISABLE_COPY_AND_ASSIGN (value);

public:

  /* Allocate a lazy value for type TYPE.  Its actual content is
     "lazily" allocated too: the content field of the return value is
     NULL; it will be allocated when it is fetched from the target.  */
  static struct value *allocate_lazy (struct type *type);

  /* Allocate a value and its contents for type TYPE.  */
  static struct value *allocate (struct type *type);

  /* Allocate a lazy value representing register REGNUM in the frame previous
     to NEXT_FRAME.  If TYPE is non-nullptr, use it as the value type.
     Otherwise, use `register_type` to obtain the type.  */
  static struct value *allocate_register_lazy (const frame_info_ptr &next_frame,
					       int regnum,
					       type *type = nullptr);

  /* Same as `allocate_register_lazy`, but make the value non-lazy.
  
     The caller is responsible for filling the value's contents.  */
  static struct value *allocate_register (const frame_info_ptr &next_frame,
					  int regnum, type *type = nullptr);

  /* Create a computed lvalue, with type TYPE, function pointers
     FUNCS, and closure CLOSURE.  */
  static struct value *allocate_computed (struct type *type,
					  const struct lval_funcs *funcs,
					  void *closure);

  /* Allocate NOT_LVAL value for type TYPE being OPTIMIZED_OUT.  */
  static struct value *allocate_optimized_out (struct type *type);

  /* Create a value of type TYPE that is zero, and return it.  */
  static struct value *zero (struct type *type, enum lval_type lv);

  /* Return a copy of the value.  It contains the same contents, for
     the same memory address, but it's a different block of
     storage.  */
  struct value *copy () const;

  /* Type of the value.  */
  struct type *type () const
  { return m_type; }

  /* This is being used to change the type of an existing value, that
     code should instead be creating a new value with the changed type
     (but possibly shared content).  */
  void deprecated_set_type (struct type *type)
  { m_type = type; }

  /* Return the gdbarch associated with the value. */
  struct gdbarch *arch () const;

  /* Only used for bitfields; number of bits contained in them.  */
  LONGEST bitsize () const
  { return m_bitsize; }

  void set_bitsize (LONGEST bit)
  { m_bitsize = bit; }

  /* Only used for bitfields; position of start of field.  For
     little-endian targets, it is the position of the LSB.  For
     big-endian targets, it is the position of the MSB.  */
  LONGEST bitpos () const
  { return m_bitpos; }

  void set_bitpos (LONGEST bit)
  { m_bitpos = bit; }

  /* Only used for bitfields; the containing value.  This allows a
     single read from the target when displaying multiple
     bitfields.  */
  value *parent () const
  { return m_parent.get (); }

  void set_parent (struct value *parent)
  {  m_parent = value_ref_ptr::new_reference (parent); }

  /* Describes offset of a value within lval of a structure in bytes.
     If lval == lval_memory, this is an offset to the address.  If
     lval == lval_register, this is a further offset from
     location.address within the registers structure.  Note also the
     member embedded_offset below.  */
  LONGEST offset () const
  { return m_offset; }

  void set_offset (LONGEST offset)
  { m_offset = offset; }

  /* The comment from "struct value" reads: ``Is it modifiable?  Only
     relevant if lval != not_lval.''.  Shouldn't the value instead be
     not_lval and be done with it?  */
  bool deprecated_modifiable () const
  { return m_modifiable; }

  /* Set or clear the modifiable flag.  */
  void set_modifiable (bool val)
  { m_modifiable = val; }

  LONGEST pointed_to_offset () const
  { return m_pointed_to_offset; }

  void set_pointed_to_offset (LONGEST val)
  { m_pointed_to_offset = val; }

  LONGEST embedded_offset () const
  { return m_embedded_offset; }

  void set_embedded_offset (LONGEST val)
  { m_embedded_offset = val; }

  /* If false, contents of this value are in the contents field.  If
     true, contents are in inferior.  If the lval field is lval_memory,
     the contents are in inferior memory at location.address plus offset.
     The lval field may also be lval_register.

     WARNING: This field is used by the code which handles watchpoints
     (see breakpoint.c) to decide whether a particular value can be
     watched by hardware watchpoints.  If the lazy flag is set for some
     member of a value chain, it is assumed that this member of the
     chain doesn't need to be watched as part of watching the value
     itself.  This is how GDB avoids watching the entire struct or array
     when the user wants to watch a single struct member or array
     element.  If you ever change the way lazy flag is set and reset, be
     sure to consider this use as well!  */

  bool lazy () const
  { return m_lazy; }

  void set_lazy (bool val)
  { m_lazy = val; }

  /* If a value represents a C++ object, then the `type' field gives the
     object's compile-time type.  If the object actually belongs to some
     class derived from `type', perhaps with other base classes and
     additional members, then `type' is just a subobject of the real
     thing, and the full object is probably larger than `type' would
     suggest.

     If `type' is a dynamic class (i.e. one with a vtable), then GDB can
     actually determine the object's run-time type by looking at the
     run-time type information in the vtable.  When this information is
     available, we may elect to read in the entire object, for several
     reasons:

     - When printing the value, the user would probably rather see the
     full object, not just the limited portion apparent from the
     compile-time type.

     - If `type' has virtual base classes, then even printing `type'
     alone may require reaching outside the `type' portion of the
     object to wherever the virtual base class has been stored.

     When we store the entire object, `enclosing_type' is the run-time
     type -- the complete object -- and `embedded_offset' is the offset
     of `type' within that larger type, in bytes.  The contents()
     method takes `embedded_offset' into account, so most GDB code
     continues to see the `type' portion of the value, just as the
     inferior would.

     If `type' is a pointer to an object, then `enclosing_type' is a
     pointer to the object's run-time type, and `pointed_to_offset' is
     the offset in bytes from the full object to the pointed-to object
     -- that is, the value `embedded_offset' would have if we followed
     the pointer and fetched the complete object.  (I don't really see
     the point.  Why not just determine the run-time type when you
     indirect, and avoid the special case?  The contents don't matter
     until you indirect anyway.)

     If we're not doing anything fancy, `enclosing_type' is equal to
     `type', and `embedded_offset' is zero, so everything works
     normally.  */

  struct type *enclosing_type  () const
  { return m_enclosing_type; }

  void set_enclosing_type (struct type *new_type);

  bool stack () const
  { return m_stack; }

  void set_stack (bool val)
  { m_stack = val; }

  /* If this value is lval_computed, return its lval_funcs
     structure.  */
  const struct lval_funcs *computed_funcs () const;

  /* If this value is lval_computed, return its closure.  The meaning
     of the returned value depends on the functions this value
     uses.  */
  void *computed_closure () const;

  enum lval_type lval () const
  { return m_lval; }

  /* Set the 'lval' of this value.  */
  void set_lval (lval_type val)
  { m_lval = val; }

  /* Set or return field indicating whether a variable is initialized or
     not, based on debugging information supplied by the compiler.
     true = initialized; false = uninitialized.  */
  bool initialized () const
  { return m_initialized; }

  void set_initialized (bool value)
  { m_initialized = value; }

  /* If lval == lval_memory, return the address in the inferior.  If
     lval == lval_register, return the byte offset into the registers
     structure.  Otherwise, return 0.  The returned address
     includes the offset, if any.  */
  CORE_ADDR address () const;

  /* Like address, except the result does not include value's
     offset.  */
  CORE_ADDR raw_address () const;

  /* Set the address of a value.  */
  void set_address (CORE_ADDR);

  struct internalvar **deprecated_internalvar_hack ()
  { return &m_location.internalvar; }

  /* Return this value's next frame id.

     The value must be of lval == lval_register.  */
  frame_id next_frame_id ()
  {
    gdb_assert (m_lval == lval_register);

    return m_location.reg.next_frame_id;
  }

  /* Return this value's register number.

     The value must be of lval == lval_register.  */
  int regnum ()
  {
    gdb_assert (m_lval == lval_register);

    return m_location.reg.regnum;
  }


  /* contents() and contents_raw() both return the address of the gdb
     buffer used to hold a copy of the contents of the lval.
     contents() is used when the contents of the buffer are needed --
     it uses fetch_lazy() to load the buffer from the process being
     debugged if it hasn't already been loaded (contents_writeable()
     is used when a writeable but fetched buffer is required)..
     contents_raw() is used when data is being stored into the buffer,
     or when it is certain that the contents of the buffer are valid.

     Note: The contents pointer is adjusted by the offset required to
     get to the real subobject, if the value happens to represent
     something embedded in a larger run-time object.  */
  gdb::array_view<gdb_byte> contents_raw ();

  /* Actual contents of the value.  For use of this value; setting it
     uses the stuff above.  Not valid if lazy is nonzero.  Target
     byte-order.  We force it to be aligned properly for any possible
     value.  Note that a value therefore extends beyond what is
     declared here.  */
  gdb::array_view<const gdb_byte> contents ();

  /* The ALL variants of the above two methods do not adjust the
     returned pointer by the embedded_offset value.  */
  gdb::array_view<const gdb_byte> contents_all ();
  gdb::array_view<gdb_byte> contents_all_raw ();

  gdb::array_view<gdb_byte> contents_writeable ();

  /* Like contents_all, but does not require that the returned bits be
     valid.  This should only be used in situations where you plan to
     check the validity manually.  */
  gdb::array_view<const gdb_byte> contents_for_printing ();

  /* Like contents_for_printing, but accepts a constant value pointer.
     Unlike contents_for_printing however, the pointed value must
     _not_ be lazy.  */
  gdb::array_view<const gdb_byte> contents_for_printing () const;

  /* Load the actual content of a lazy value.  Fetch the data from the
     user's process and clear the lazy flag to indicate that the data in
     the buffer is valid.

     If the value is zero-length, we avoid calling read_memory, which
     would abort.  We mark the value as fetched anyway -- all 0 bytes of
     it.  */
  void fetch_lazy ();

  /* Compare LENGTH bytes of this value's contents starting at OFFSET1
     with LENGTH bytes of VAL2's contents starting at OFFSET2.

     Note that "contents" refers to the whole value's contents
     (value_contents_all), without any embedded offset adjustment.  For
     example, to compare a complete object value with itself, including
     its enclosing type chunk, you'd do:

     int len = check_typedef (val->enclosing_type ())->length ();
     val->contents_eq (0, val, 0, len);

     Returns true iff the set of available/valid contents match.

     Optimized-out contents are equal to optimized-out contents, and are
     not equal to non-optimized-out contents.

     Unavailable contents are equal to unavailable contents, and are not
     equal to non-unavailable contents.

     For example, if 'x's represent an unavailable byte, and 'V' and 'Z'
     represent different available/valid bytes, in a value with length
     16:

     offset:   0   4   8   12  16
     contents: xxxxVVVVxxxxVVZZ

     then:

     val->contents_eq(0, val, 8, 6) => true
     val->contents_eq(0, val, 4, 4) => false
     val->contents_eq(0, val, 8, 8) => false
     val->contents_eq(4, val, 12, 2) => true
     val->contents_eq(4, val, 12, 4) => true
     val->contents_eq(3, val, 4, 4) => true

     If 'x's represent an unavailable byte, 'o' represents an optimized
     out byte, in a value with length 8:

     offset:   0   4   8
     contents: xxxxoooo

     then:

     val->contents_eq(0, val, 2, 2) => true
     val->contents_eq(4, val, 6, 2) => true
     val->contents_eq(0, val, 4, 4) => true

     We only know whether a value chunk is unavailable or optimized out
     if we've tried to read it.  As this routine is used by printing
     routines, which may be printing values in the value history, long
     after the inferior is gone, it works with const values.  Therefore,
     this routine must not be called with lazy values.  */

  bool contents_eq (LONGEST offset1, const struct value *val2, LONGEST offset2,
		    LONGEST length) const;

  /* An overload of contents_eq that compares the entirety of both
     values.  */
  bool contents_eq (const struct value *val2) const;

  /* Given a value, determine whether the bits starting at OFFSET and
     extending for LENGTH bits are a synthetic pointer.  */

  bool bits_synthetic_pointer (LONGEST offset, LONGEST length) const;

  /* Increase this value's reference count.  */
  void incref ()
  { ++m_reference_count; }

  /* Decrease this value's reference count.  When the reference count
     drops to 0, it will be freed.  */
  void decref ();

  /* Given a value, determine whether the contents bytes starting at
     OFFSET and extending for LENGTH bytes are available.  This returns
     true if all bytes in the given range are available, false if any
     byte is unavailable.  */
  bool bytes_available (LONGEST offset, ULONGEST length) const;

  /* Given a value, determine whether the contents bits starting at
     OFFSET and extending for LENGTH bits are available.  This returns
     true if all bits in the given range are available, false if any
     bit is unavailable.  */
  bool bits_available (LONGEST offset, ULONGEST length) const;

  /* Like bytes_available, but return false if any byte in the
     whole object is unavailable.  */
  bool entirely_available ();

  /* Like entirely_available, but return false if any byte in the
     whole object is available.  */
  bool entirely_unavailable ()
  { return entirely_covered_by_range_vector (m_unavailable); }

  /* Mark this value's content bytes starting at OFFSET and extending
     for LENGTH bytes as unavailable.  */
  void mark_bytes_unavailable (LONGEST offset, ULONGEST length);

  /* Mark this value's content bits starting at OFFSET and extending
     for LENGTH bits as unavailable.  */
  void mark_bits_unavailable (LONGEST offset, ULONGEST length);

  /* If true, this is the value of a variable which does not actually
     exist in the program, at least partially.  If the value is lazy,
     this may fetch it now.  */
  bool optimized_out ();

  /* Given a value, return true if any of the contents bits starting at
     OFFSET and extending for LENGTH bits is optimized out, false
     otherwise.  */
  bool bits_any_optimized_out (int bit_offset, int bit_length) const;

  /* Like optimized_out, but return true iff the whole value is
     optimized out.  */
  bool entirely_optimized_out ()
  {
    return entirely_covered_by_range_vector (m_optimized_out);
  }

  /* Mark this value's content bytes starting at OFFSET and extending
     for LENGTH bytes as optimized out.  */
  void mark_bytes_optimized_out (int offset, int length);

  /* Mark this value's content bits starting at OFFSET and extending
     for LENGTH bits as optimized out.  */
  void mark_bits_optimized_out (LONGEST offset, LONGEST length);

  /* Return a version of this that is non-lvalue.  */
  struct value *non_lval ();

  /* Write contents of this value at ADDR and set its lval type to be
     LVAL_MEMORY.  */
  void force_lval (CORE_ADDR);

  /* Set this values's location as appropriate for a component of
     WHOLE --- regardless of what kind of lvalue WHOLE is.  */
  void set_component_location (const struct value *whole);

  /* Build a value wrapping and representing WORKER.  The value takes
     ownership of the xmethod_worker object.  */
  static struct value *from_xmethod (xmethod_worker_up &&worker);

  /* Return the type of the result of TYPE_CODE_XMETHOD value METHOD.  */
  struct type *result_type_of_xmethod (gdb::array_view<value *> argv);

  /* Call the xmethod corresponding to the TYPE_CODE_XMETHOD value
     METHOD.  */
  struct value *call_xmethod (gdb::array_view<value *> argv);

  /* Update this value before discarding OBJFILE.  COPIED_TYPES is
     used to prevent cycles / duplicates.  */
  void preserve (struct objfile *objfile, copied_types_hash_t &copied_types);

  /* Unpack a bitfield of BITSIZE bits found at BITPOS in the object
     at VALADDR + EMBEDDEDOFFSET that has the type of DEST_VAL and
     store the contents in DEST_VAL, zero or sign extending if the
     type of DEST_VAL is wider than BITSIZE.  VALADDR points to the
     contents of this value.  If this value's contents required to
     extract the bitfield from are unavailable/optimized out, DEST_VAL
     is correspondingly marked unavailable/optimized out.  */
  void unpack_bitfield (struct value *dest_val,
			LONGEST bitpos, LONGEST bitsize,
			const gdb_byte *valaddr, LONGEST embedded_offset)
    const;

  /* Copy LENGTH bytes of this value's (all) contents
     (value_contents_all) starting at SRC_OFFSET byte, into DST
     value's (all) contents, starting at DST_OFFSET.  If unavailable
     contents are being copied from this value, the corresponding DST
     contents are marked unavailable accordingly.  DST must not be
     lazy.  If this value is lazy, it will be fetched now.

     It is assumed the contents of DST in the [DST_OFFSET,
     DST_OFFSET+LENGTH) range are wholly available.  */
  void contents_copy (struct value *dst, LONGEST dst_offset,
		      LONGEST src_offset, LONGEST length);

  /* Given a value (offset by OFFSET bytes)
     of a struct or union type ARG_TYPE,
     extract and return the value of one of its (non-static) fields.
     FIELDNO says which field.  */
  struct value *primitive_field (LONGEST offset, int fieldno,
				 struct type *arg_type);

  /* Create a new value by extracting it from this value.  TYPE is the
     type of the new value.  BIT_OFFSET and BIT_LENGTH describe the
     offset and field width of the value to extract from this value --
     BIT_LENGTH may differ from TYPE's length in the case where this
     value's type is packed.

     When the value does come from a non-byte-aligned offset or field
     width, it will be marked non_lval.  */
  struct value *from_component_bitsize (struct type *type,
					LONGEST bit_offset,
					LONGEST bit_length);

  /* Record this value on the value history, and return its location
     in the history.  The value is removed from the value chain.  */
  int record_latest ();

private:

  /* Type of value; either not an lval, or one of the various
     different possible kinds of lval.  */
  enum lval_type m_lval = not_lval;

  /* Is it modifiable?  Only relevant if lval != not_lval.  */
  bool m_modifiable : 1;

  /* If false, contents of this value are in the contents field.  If
     true, contents are in inferior.  If the lval field is lval_memory,
     the contents are in inferior memory at location.address plus offset.
     The lval field may also be lval_register.

     WARNING: This field is used by the code which handles watchpoints
     (see breakpoint.c) to decide whether a particular value can be
     watched by hardware watchpoints.  If the lazy flag is set for
     some member of a value chain, it is assumed that this member of
     the chain doesn't need to be watched as part of watching the
     value itself.  This is how GDB avoids watching the entire struct
     or array when the user wants to watch a single struct member or
     array element.  If you ever change the way lazy flag is set and
     reset, be sure to consider this use as well!  */
  bool m_lazy : 1;

  /* If value is a variable, is it initialized or not.  */
  bool m_initialized : 1;

  /* If value is from the stack.  If this is set, read_stack will be
     used instead of read_memory to enable extra caching.  */
  bool m_stack : 1;

  /* True if this is a zero value, created by 'value::zero'; false
     otherwise.  */
  bool m_is_zero : 1;

  /* True if this a value recorded in value history; false otherwise.  */
  bool m_in_history : 1;

  /* Location of value (if lval).  */
  union
  {
    /* If lval == lval_memory, this is the address in the inferior  */
    CORE_ADDR address;

    /*If lval == lval_register, the value is from a register.  */
    struct
    {
      /* Register number.  */
      int regnum;

      /* Frame ID of the next physical (non-inline) frame to which a register
	 value is relative.  */
      frame_id next_frame_id;
    } reg;

    /* Pointer to internal variable.  */
    struct internalvar *internalvar;

    /* Pointer to xmethod worker.  */
    struct xmethod_worker *xm_worker;

    /* If lval == lval_computed, this is a set of function pointers
       to use to access and describe the value, and a closure pointer
       for them to use.  */
    struct
    {
      /* Functions to call.  */
      const struct lval_funcs *funcs;

      /* Closure for those functions to use.  */
      void *closure;
    } computed;
  } m_location {};

  /* Describes offset of a value within lval of a structure in target
     addressable memory units.  Note also the member embedded_offset
     below.  */
  LONGEST m_offset = 0;

  /* Only used for bitfields; number of bits contained in them.  */
  LONGEST m_bitsize = 0;

  /* Only used for bitfields; position of start of field.  For
     little-endian targets, it is the position of the LSB.  For
     big-endian targets, it is the position of the MSB.  */
  LONGEST m_bitpos = 0;

  /* The number of references to this value.  When a value is created,
     the value chain holds a reference, so REFERENCE_COUNT is 1.  If
     release_value is called, this value is removed from the chain but
     the caller of release_value now has a reference to this value.
     The caller must arrange for a call to value_free later.  */
  int m_reference_count = 1;

  /* Only used for bitfields; the containing value.  This allows a
     single read from the target when displaying multiple
     bitfields.  */
  value_ref_ptr m_parent;

  /* Type of the value.  */
  struct type *m_type;

  /* If a value represents a C++ object, then the `type' field gives
     the object's compile-time type.  If the object actually belongs
     to some class derived from `type', perhaps with other base
     classes and additional members, then `type' is just a subobject
     of the real thing, and the full object is probably larger than
     `type' would suggest.

     If `type' is a dynamic class (i.e. one with a vtable), then GDB
     can actually determine the object's run-time type by looking at
     the run-time type information in the vtable.  When this
     information is available, we may elect to read in the entire
     object, for several reasons:

     - When printing the value, the user would probably rather see the
     full object, not just the limited portion apparent from the
     compile-time type.

     - If `type' has virtual base classes, then even printing `type'
     alone may require reaching outside the `type' portion of the
     object to wherever the virtual base class has been stored.

     When we store the entire object, `enclosing_type' is the run-time
     type -- the complete object -- and `embedded_offset' is the
     offset of `type' within that larger type, in target addressable memory
     units.  The contents() method takes `embedded_offset' into account,
     so most GDB code continues to see the `type' portion of the value, just
     as the inferior would.

     If `type' is a pointer to an object, then `enclosing_type' is a
     pointer to the object's run-time type, and `pointed_to_offset' is
     the offset in target addressable memory units from the full object
     to the pointed-to object -- that is, the value `embedded_offset' would
     have if we followed the pointer and fetched the complete object.
     (I don't really see the point.  Why not just determine the
     run-time type when you indirect, and avoid the special case?  The
     contents don't matter until you indirect anyway.)

     If we're not doing anything fancy, `enclosing_type' is equal to
     `type', and `embedded_offset' is zero, so everything works
     normally.  */
  struct type *m_enclosing_type;
  LONGEST m_embedded_offset = 0;
  LONGEST m_pointed_to_offset = 0;

  /* Actual contents of the value.  Target byte-order.

     May be nullptr if the value is lazy or is entirely optimized out.
     Guaranteed to be non-nullptr otherwise.  */
  gdb::unique_xmalloc_ptr<gdb_byte> m_contents;

  /* Unavailable ranges in CONTENTS.  We mark unavailable ranges,
     rather than available, since the common and default case is for a
     value to be available.  This is filled in at value read time.
     The unavailable ranges are tracked in bits.  Note that a contents
     bit that has been optimized out doesn't really exist in the
     program, so it can't be marked unavailable either.  */
  std::vector<range> m_unavailable;

  /* Likewise, but for optimized out contents (a chunk of the value of
     a variable that does not actually exist in the program).  If LVAL
     is lval_register, this is a register ($pc, $sp, etc., never a
     program variable) that has not been saved in the frame.  Not
     saved registers and optimized-out program variables values are
     treated pretty much the same, except not-saved registers have a
     different string representation and related error strings.  */
  std::vector<range> m_optimized_out;

  /* This is only non-zero for values of TYPE_CODE_ARRAY and if the size of
     the array in inferior memory is greater than max_value_size.  If these
     conditions are met then, when the value is loaded from the inferior
     GDB will only load a portion of the array into memory, and
     limited_length will be set to indicate the length in octets that were
     loaded from the inferior.  */
  ULONGEST m_limited_length = 0;

  /* Allocate a value and its contents for type TYPE.  If CHECK_SIZE
     is true, then apply the usual max-value-size checks.  */
  static struct value *allocate (struct type *type, bool check_size);

  /* Helper for fetch_lazy when the value is a bitfield.  */
  void fetch_lazy_bitfield ();

  /* Helper for fetch_lazy when the value is in memory.  */
  void fetch_lazy_memory ();

  /* Helper for fetch_lazy when the value is in a register.  */
  void fetch_lazy_register ();

  /* Try to limit ourselves to only fetching the limited number of
     elements.  However, if this limited number of elements still
     puts us over max_value_size, then we still refuse it and
     return failure here, which will ultimately throw an error.  */
  bool set_limited_array_length ();

  /* Allocate the contents of this value if it has not been allocated
     yet.  If CHECK_SIZE is true, then apply the usual max-value-size
     checks.  */
  void allocate_contents (bool check_size);

  /* Helper function for value_contents_eq.  The only difference is that
     this function is bit rather than byte based.

     Compare LENGTH bits of this value's contents starting at OFFSET1
     bits with LENGTH bits of VAL2's contents starting at OFFSET2
     bits.  Return true if the available bits match.  */
  bool contents_bits_eq (int offset1, const struct value *val2, int offset2,
			 int length) const;

  void require_not_optimized_out () const;
  void require_available () const;

  /* Returns true if this value is entirely covered by RANGES.  If the
     value is lazy, it'll be read now.  Note that RANGE is a pointer
     to pointer because reading the value might change *RANGE.  */
  bool entirely_covered_by_range_vector (const std::vector<range> &ranges);

  /* Copy the ranges metadata from this value that overlaps
     [SRC_BIT_OFFSET, SRC_BIT_OFFSET+BIT_LENGTH) into DST,
     adjusted.  */
  void ranges_copy_adjusted (struct value *dst, int dst_bit_offset,
			     int src_bit_offset, int bit_length) const;

  /* Copy LENGTH target addressable memory units of this value's (all)
     contents (value_contents_all) starting at SRC_OFFSET, into DST
     value's (all) contents, starting at DST_OFFSET.  If unavailable
     contents are being copied from this, the corresponding DST
     contents are marked unavailable accordingly.  Neither DST nor
     this value may be lazy values.

     It is assumed the contents of DST in the [DST_OFFSET,
     DST_OFFSET+LENGTH) range are wholly available.  */
  void contents_copy_raw (struct value *dst, LONGEST dst_offset,
			  LONGEST src_offset, LONGEST length);

  /* A helper for value_from_component_bitsize that copies bits from
     this value to DEST.  */
  void contents_copy_raw_bitwise (struct value *dst, LONGEST dst_bit_offset,
				  LONGEST src_bit_offset, LONGEST bit_length);
};

inline void
value_ref_policy::incref (struct value *ptr)
{
  ptr->incref ();
}

inline void
value_ref_policy::decref (struct value *ptr)
{
  ptr->decref ();
}

/* Returns value_type or value_enclosing_type depending on
   value_print_options.objectprint.

   If RESOLVE_SIMPLE_TYPES is 0 the enclosing type will be resolved
   only for pointers and references, else it will be returned
   for all the types (e.g. structures).  This option is useful
   to prevent retrieving enclosing type for the base classes fields.

   REAL_TYPE_FOUND is used to inform whether the real type was found
   (or just static type was used).  The NULL may be passed if it is not
   necessary. */

extern struct type *value_actual_type (struct value *value,
				       int resolve_simple_types,
				       int *real_type_found);

/* For lval_computed values, this structure holds functions used to
   retrieve and set the value (or portions of the value).

   For each function, 'V' is the 'this' pointer: an lval_funcs
   function F may always assume that the V it receives is an
   lval_computed value, and has F in the appropriate slot of its
   lval_funcs structure.  */

struct lval_funcs
{
  /* Fill in VALUE's contents.  This is used to "un-lazy" values.  If
     a problem arises in obtaining VALUE's bits, this function should
     call 'error'.  If it is NULL value_fetch_lazy on "un-lazy"
     non-optimized-out value is an internal error.  */
  void (*read) (struct value *v);

  /* Handle an assignment TOVAL = FROMVAL by writing the value of
     FROMVAL to TOVAL's location.  The contents of TOVAL have not yet
     been updated.  If a problem arises in doing so, this function
     should call 'error'.  If it is NULL such TOVAL assignment is an error as
     TOVAL is not considered as an lvalue.  */
  void (*write) (struct value *toval, struct value *fromval);

  /* Return true if any part of V is optimized out, false otherwise.
     This will only be called for lazy values -- if the value has been
     fetched, then the value's optimized-out bits are consulted
     instead.  */
  bool (*is_optimized_out) (struct value *v);

  /* If non-NULL, this is used to implement pointer indirection for
     this value.  This method may return NULL, in which case value_ind
     will fall back to ordinary indirection.  */
  struct value *(*indirect) (struct value *value);

  /* If non-NULL, this is used to implement reference resolving for
     this value.  This method may return NULL, in which case coerce_ref
     will fall back to ordinary references resolving.  */
  struct value *(*coerce_ref) (const struct value *value);

  /* If non-NULL, this is used to determine whether the indicated bits
     of VALUE are a synthetic pointer.  */
  bool (*check_synthetic_pointer) (const struct value *value,
				   LONGEST offset, int length);

  /* Return a duplicate of VALUE's closure, for use in a new value.
     This may simply return the same closure, if VALUE's is
     reference-counted or statically allocated.

     This may be NULL, in which case VALUE's closure is re-used in the
     new value.  */
  void *(*copy_closure) (const struct value *v);

  /* Drop VALUE's reference to its closure.  Maybe this frees the
     closure; maybe this decrements a reference count; maybe the
     closure is statically allocated and this does nothing.

     This may be NULL, in which case no action is taken to free
     VALUE's closure.  */
  void (*free_closure) (struct value *v);
};

/* Throw an error complaining that the value has been optimized
   out.  */

extern void error_value_optimized_out (void);

/* Pointer to internal variable.  */
#define VALUE_INTERNALVAR(val) (*((val)->deprecated_internalvar_hack ()))

/* Return value after lval_funcs->coerce_ref (after check_typedef).  Return
   NULL if lval_funcs->coerce_ref is not applicable for whatever reason.  */

extern struct value *coerce_ref_if_computed (const struct value *arg);

/* Setup a new value type and enclosing value type for dereferenced value VALUE.
   ENC_TYPE is the new enclosing type that should be set.  ORIGINAL_TYPE and
   ORIGINAL_VAL are the type and value of the original reference or
   pointer.  ORIGINAL_VALUE_ADDRESS is the address within VALUE, that is
   the address that was dereferenced.

   Note, that VALUE is modified by this function.

   It is a common implementation for coerce_ref and value_ind.  */

extern struct value * readjust_indirect_value_type (struct value *value,
						    struct type *enc_type,
						    const struct type *original_type,
						    struct value *original_val,
						    CORE_ADDR original_value_address);

/* Convert a REF to the object referenced.  */

extern struct value *coerce_ref (struct value *value);

/* If ARG is an array, convert it to a pointer.
   If ARG is a function, convert it to a function pointer.

   References are dereferenced.  */

extern struct value *coerce_array (struct value *value);

/* Read LENGTH addressable memory units starting at MEMADDR into BUFFER,
   which is (or will be copied to) VAL's contents buffer offset by
   BIT_OFFSET bits.  Marks value contents ranges as unavailable if
   the corresponding memory is likewise unavailable.  STACK indicates
   whether the memory is known to be stack memory.  */

extern void read_value_memory (struct value *val, LONGEST bit_offset,
			       bool stack, CORE_ADDR memaddr,
			       gdb_byte *buffer, size_t length);

/* Cast SCALAR_VALUE to the element type of VECTOR_TYPE, then replicate
   into each element of a new vector value with VECTOR_TYPE.  */

struct value *value_vector_widen (struct value *scalar_value,
				  struct type *vector_type);



#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"

class frame_info_ptr;
struct fn_field;

extern int print_address_demangle (const struct value_print_options *,
				   struct gdbarch *, CORE_ADDR,
				   struct ui_file *, int);

/* Returns true if VAL is of floating-point type.  In addition,
   throws an error if the value is an invalid floating-point value.  */
extern bool is_floating_value (struct value *val);

extern LONGEST value_as_long (struct value *val);
extern CORE_ADDR value_as_address (struct value *val);

/* Extract the value from VAL as a MPZ.  This coerces arrays and
   handles various integer-like types as well.  */

extern gdb_mpz value_as_mpz (struct value *val);

extern LONGEST unpack_long (struct type *type, const gdb_byte *valaddr);
extern CORE_ADDR unpack_pointer (struct type *type, const gdb_byte *valaddr);

extern LONGEST unpack_field_as_long (struct type *type,
				     const gdb_byte *valaddr,
				     int fieldno);

/* Unpack a bitfield of the specified FIELD_TYPE, from the object at
   VALADDR, and store the result in *RESULT.
   The bitfield starts at BITPOS bits and contains BITSIZE bits; if
   BITSIZE is zero, then the length is taken from FIELD_TYPE.

   Extracting bits depends on endianness of the machine.  Compute the
   number of least significant bits to discard.  For big endian machines,
   we compute the total number of bits in the anonymous object, subtract
   off the bit count from the MSB of the object to the MSB of the
   bitfield, then the size of the bitfield, which leaves the LSB discard
   count.  For little endian machines, the discard count is simply the
   number of bits from the LSB of the anonymous object to the LSB of the
   bitfield.

   If the field is signed, we also do sign extension.  */

extern LONGEST unpack_bits_as_long (struct type *field_type,
				    const gdb_byte *valaddr,
				    LONGEST bitpos, LONGEST bitsize);

extern int unpack_value_field_as_long (struct type *type, const gdb_byte *valaddr,
				LONGEST embedded_offset, int fieldno,
				const struct value *val, LONGEST *result);

extern struct value *value_field_bitfield (struct type *type, int fieldno,
					   const gdb_byte *valaddr,
					   LONGEST embedded_offset,
					   const struct value *val);

extern void pack_long (gdb_byte *buf, struct type *type, LONGEST num);

extern struct value *value_from_longest (struct type *type, LONGEST num);
extern struct value *value_from_ulongest (struct type *type, ULONGEST num);
extern struct value *value_from_pointer (struct type *type, CORE_ADDR addr);
extern struct value *value_from_host_double (struct type *type, double d);
extern struct value *value_from_history_ref (const char *, const char **);
extern struct value *value_from_component (struct value *, struct type *,
					   LONGEST);

/* Convert the value V into a newly allocated value.  */
extern struct value *value_from_mpz (struct type *type, const gdb_mpz &v);

extern struct value *value_at (struct type *type, CORE_ADDR addr);

/* Return a new value given a type and an address.  The new value is
   lazy.  If FRAME is given, it is used when resolving dynamic
   properties.  */

extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr,
				    const frame_info_ptr &frame = nullptr);

/* Like value_at, but ensures that the result is marked not_lval.
   This can be important if the memory is "volatile".  */
extern struct value *value_at_non_lval (struct type *type, CORE_ADDR addr);

extern struct value *value_from_contents_and_address_unresolved
     (struct type *, const gdb_byte *, CORE_ADDR);
extern struct value *value_from_contents_and_address
     (struct type *, const gdb_byte *, CORE_ADDR,
      const frame_info_ptr &frame = nullptr);
extern struct value *value_from_contents (struct type *, const gdb_byte *);

extern value *default_value_from_register (gdbarch *gdbarch, type *type,
					   int regnum,
					   const frame_info_ptr &this_frame);

extern ULONGEST default_dwarf2_reg_piece_offset (gdbarch *gdbarch, int regnum, ULONGEST size);

extern struct value *value_from_register (struct type *type, int regnum,
					  const frame_info_ptr &frame);

extern CORE_ADDR address_from_register (int regnum,
					const frame_info_ptr &frame);

extern struct value *value_of_variable (struct symbol *var,
					const struct block *b);

extern struct value *address_of_variable (struct symbol *var,
					  const struct block *b);

/* Return a value with the contents of register REGNUM as found in the frame
   previous to NEXT_FRAME.  */

extern value *value_of_register (int regnum, const frame_info_ptr &next_frame);

/* Same as the above, but the value is not fetched.  */

extern value *value_of_register_lazy (const frame_info_ptr &next_frame, int regnum);

/* Return the symbol's reading requirement.  */

extern enum symbol_needs_kind symbol_read_needs (struct symbol *);

/* Return true if the symbol needs a frame.  This is a wrapper for
   symbol_read_needs that simply checks for SYMBOL_NEEDS_FRAME.  */

extern int symbol_read_needs_frame (struct symbol *);

extern struct value *read_var_value (struct symbol *var,
				     const struct block *var_block,
				     const frame_info_ptr &frame);

extern struct value *allocate_repeat_value (struct type *type, int count);

extern struct value *value_mark (void);

extern void value_free_to_mark (const struct value *mark);

/* A helper class that uses value_mark at construction time and calls
   value_free_to_mark in the destructor.  This is used to clear out
   temporary values created during the lifetime of this object.  */
class scoped_value_mark
{
 public:

  scoped_value_mark ()
    : m_value (value_mark ())
  {
  }

  ~scoped_value_mark ()
  {
    free_to_mark ();
  }

  scoped_value_mark (scoped_value_mark &&other) = default;

  DISABLE_COPY_AND_ASSIGN (scoped_value_mark);

  /* Free the values currently on the value stack.  */
  void free_to_mark ()
  {
    if (!m_freed)
      {
	value_free_to_mark (m_value);
	m_freed = true;
      }
  }

 private:

  const struct value *m_value;
  bool m_freed = false;
};

/* Create not_lval value representing a NULL-terminated C string.  The
   resulting value has type TYPE_CODE_ARRAY.  The string passed in should
   not include embedded null characters.

   PTR points to the string data; COUNT is number of characters (does
   not include the NULL terminator) pointed to by PTR, each character is of
   type (and size of) CHAR_TYPE.  */

extern struct value *value_cstring (const gdb_byte *ptr, ssize_t count,
				    struct type *char_type);

/* Specialisation of value_cstring above.  In this case PTR points to
   single byte characters.  CHAR_TYPE must have a length of 1.  */
inline struct value *value_cstring (const char *ptr, ssize_t count,
				    struct type *char_type)
{
  gdb_assert (char_type->length () == 1);
  return value_cstring ((const gdb_byte *) ptr, count, char_type);
}

/* Create a not_lval value with type TYPE_CODE_STRING, the resulting value
   has type TYPE_CODE_STRING.

   PTR points to the string data; COUNT is number of characters pointed to
   by PTR, each character has the type (and size of) CHAR_TYPE.

   Note that string types are like array of char types with a lower bound
   defined by the language (usually zero or one).  Also the string may
   contain embedded null characters.  */

extern struct value *value_string (const gdb_byte *ptr, ssize_t count,
				   struct type *char_type);

/* Specialisation of value_string above.  In this case PTR points to
   single byte characters.  CHAR_TYPE must have a length of 1.  */
inline struct value *value_string (const char *ptr, ssize_t count,
				   struct type *char_type)
{
  gdb_assert (char_type->length () == 1);
  return value_string ((const gdb_byte *) ptr, count, char_type);
}

extern struct value *value_array (int lowbound,
				  gdb::array_view<struct value *> elemvec);

extern struct value *value_concat (struct value *arg1, struct value *arg2);

extern struct value *value_binop (struct value *arg1, struct value *arg2,
				  enum exp_opcode op);

extern struct value *value_ptradd (struct value *arg1, LONGEST arg2);

extern LONGEST value_ptrdiff (struct value *arg1, struct value *arg2);

/* Return true if VAL does not live in target memory, but should in order
   to operate on it.  Otherwise return false.  */

extern bool value_must_coerce_to_target (struct value *arg1);

extern struct value *value_coerce_to_target (struct value *arg1);

extern struct value *value_coerce_array (struct value *arg1);

extern struct value *value_coerce_function (struct value *arg1);

extern struct value *value_ind (struct value *arg1);

extern struct value *value_addr (struct value *arg1);

extern struct value *value_ref (struct value *arg1, enum type_code refcode);

extern struct value *value_assign (struct value *toval,
				   struct value *fromval);

/* The unary + operation.  */
extern struct value *value_pos (struct value *arg1);

/* The unary - operation.  */
extern struct value *value_neg (struct value *arg1);

/* The unary ~ operation -- but note that it also implements the GCC
   extension, where ~ of a complex number is the complex
   conjugate.  */
extern struct value *value_complement (struct value *arg1);

extern struct value *value_struct_elt (struct value **argp,
				       std::optional<gdb::array_view <value *>> args,
				       const char *name, int *static_memfuncp,
				       const char *err);

extern struct value *value_struct_elt_bitpos (struct value **argp,
					      int bitpos,
					      struct type *field_type,
					      const char *err);

extern struct value *value_aggregate_elt (struct type *curtype,
					  const char *name,
					  struct type *expect_type,
					  int want_address,
					  enum noside noside);

extern struct value *value_static_field (struct type *type, int fieldno);

enum oload_search_type { NON_METHOD, METHOD, BOTH };

extern int find_overload_match (gdb::array_view<value *> args,
				const char *name,
				enum oload_search_type method,
				struct value **objp, struct symbol *fsym,
				struct value **valp, struct symbol **symp,
				int *staticp, const int no_adl,
				enum noside noside);

extern struct value *value_field (struct value *arg1, int fieldno);

extern struct type *value_rtti_indirect_type (struct value *, int *, LONGEST *,
					      int *);

extern struct value *value_full_object (struct value *, struct type *, int,
					int, int);

extern struct value *value_cast_pointers (struct type *, struct value *, int);

extern struct value *value_cast (struct type *type, struct value *arg2);

extern struct value *value_reinterpret_cast (struct type *type,
					     struct value *arg);

extern struct value *value_dynamic_cast (struct type *type, struct value *arg);

extern struct value *value_one (struct type *type);

extern struct value *value_repeat (struct value *arg1, int count);

extern struct value *value_subscript (struct value *array, LONGEST index);

/* Assuming VAL is array-like (see type::is_array_like), return an
   array form of VAL.  */
extern struct value *value_to_array (struct value *val);

extern struct value *value_bitstring_subscript (struct type *type,
						struct value *bitstring,
						LONGEST index);

extern struct value *register_value_being_returned (struct type *valtype,
						    struct regcache *retbuf);

extern int value_bit_index (struct type *type, const gdb_byte *addr,
			    int index);

extern enum return_value_convention
struct_return_convention (struct gdbarch *gdbarch, struct value *function,
			  struct type *value_type);

extern int using_struct_return (struct gdbarch *gdbarch,
				struct value *function,
				struct type *value_type);

extern value *evaluate_var_value (enum noside noside, const block *blk,
				  symbol *var);

extern value *evaluate_var_msym_value (enum noside noside,
				       struct objfile *objfile,
				       minimal_symbol *msymbol);

namespace expr { class operation; };
extern void fetch_subexp_value (struct expression *exp,
				expr::operation *op,
				struct value **valp, struct value **resultp,
				std::vector<value_ref_ptr> *val_chain,
				bool preserve_errors);

extern struct value *parse_and_eval (const char *exp, parser_flags flags = 0);

extern struct value *parse_to_comma_and_eval (const char **expp);

extern struct type *parse_and_eval_type (const char *p, int length);

extern CORE_ADDR parse_and_eval_address (const char *exp);

extern LONGEST parse_and_eval_long (const char *exp);

extern void unop_promote (const struct language_defn *language,
			  struct gdbarch *gdbarch,
			  struct value **arg1);

extern void binop_promote (const struct language_defn *language,
			   struct gdbarch *gdbarch,
			   struct value **arg1, struct value **arg2);

extern struct value *access_value_history (int num);

/* Return the number of items in the value history.  */

extern ULONGEST value_history_count ();

extern struct value *value_of_internalvar (struct gdbarch *gdbarch,
					   struct internalvar *var);

extern int get_internalvar_integer (struct internalvar *var, LONGEST *l);

extern void set_internalvar (struct internalvar *var, struct value *val);

extern void set_internalvar_integer (struct internalvar *var, LONGEST l);

extern void set_internalvar_string (struct internalvar *var,
				    const char *string);

extern void clear_internalvar (struct internalvar *var);

extern void set_internalvar_component (struct internalvar *var,
				       LONGEST offset,
				       LONGEST bitpos, LONGEST bitsize,
				       struct value *newvalue);

extern struct internalvar *lookup_only_internalvar (const char *name);

extern struct internalvar *create_internalvar (const char *name);

extern void complete_internalvar (completion_tracker &tracker,
				  const char *name);

/* An internalvar can be dynamically computed by supplying a vector of
   function pointers to perform various operations.  */

struct internalvar_funcs
{
  /* Compute the value of the variable.  The DATA argument passed to
     the function is the same argument that was passed to
     `create_internalvar_type_lazy'.  */

  struct value *(*make_value) (struct gdbarch *arch,
			       struct internalvar *var,
			       void *data);

  /* Update the agent expression EXPR with bytecode to compute the
     value.  VALUE is the agent value we are updating.  The DATA
     argument passed to this function is the same argument that was
     passed to `create_internalvar_type_lazy'.  If this pointer is
     NULL, then the internalvar cannot be compiled to an agent
     expression.  */

  void (*compile_to_ax) (struct internalvar *var,
			 struct agent_expr *expr,
			 struct axs_value *value,
			 void *data);
};

extern struct internalvar *create_internalvar_type_lazy (const char *name,
				const struct internalvar_funcs *funcs,
				void *data);

/* Compile an internal variable to an agent expression.  VAR is the
   variable to compile; EXPR and VALUE are the agent expression we are
   updating.  This will return 0 if there is no known way to compile
   VAR, and 1 if VAR was successfully compiled.  It may also throw an
   exception on error.  */

extern int compile_internalvar_to_ax (struct internalvar *var,
				      struct agent_expr *expr,
				      struct axs_value *value);

extern struct internalvar *lookup_internalvar (const char *name);

extern int value_equal (struct value *arg1, struct value *arg2);

extern int value_equal_contents (struct value *arg1, struct value *arg2);

extern int value_less (struct value *arg1, struct value *arg2);

/* Simulate the C operator ! -- return true if ARG1 contains zero.  */
extern bool value_logical_not (struct value *arg1);

/* Returns true if the value VAL represents a true value.  */
static inline bool
value_true (struct value *val)
{
  return !value_logical_not (val);
}

/* C++ */

extern struct value *value_of_this (const struct language_defn *lang);

extern struct value *value_of_this_silent (const struct language_defn *lang);

extern struct value *value_x_binop (struct value *arg1, struct value *arg2,
				    enum exp_opcode op,
				    enum exp_opcode otherop,
				    enum noside noside);

extern struct value *value_x_unop (struct value *arg1, enum exp_opcode op,
				   enum noside noside);

extern struct value *value_fn_field (struct value **arg1p, struct fn_field *f,
				     int j, struct type *type, LONGEST offset);

extern int binop_types_user_defined_p (enum exp_opcode op,
				       struct type *type1,
				       struct type *type2);

extern int binop_user_defined_p (enum exp_opcode op, struct value *arg1,
				 struct value *arg2);

extern int unop_user_defined_p (enum exp_opcode op, struct value *arg1);

extern int destructor_name_p (const char *name, struct type *type);

extern value_ref_ptr release_value (struct value *val);

extern void modify_field (struct type *type, gdb_byte *addr,
			  LONGEST fieldval, LONGEST bitpos, LONGEST bitsize);

extern void type_print (struct type *type, const char *varstring,
			struct ui_file *stream, int show);

extern std::string type_to_string (struct type *type);

extern gdb_byte *baseclass_addr (struct type *type, int index,
				 gdb_byte *valaddr,
				 struct value **valuep, int *errp);

extern void print_longest (struct ui_file *stream, int format,
			   int use_local, LONGEST val);

extern void print_floating (const gdb_byte *valaddr, struct type *type,
			    struct ui_file *stream);

extern void value_print (struct value *val, struct ui_file *stream,
			 const struct value_print_options *options);

/* Release values from the value chain and return them.  Values
   created after MARK are released.  If MARK is nullptr, or if MARK is
   not found on the value chain, then all values are released.  Values
   are returned in reverse order of creation; that is, newest
   first.  */

extern std::vector<value_ref_ptr> value_release_to_mark
    (const struct value *mark);

extern void common_val_print (struct value *val,
			      struct ui_file *stream, int recurse,
			      const struct value_print_options *options,
			      const struct language_defn *language);

extern int val_print_string (struct type *elttype, const char *encoding,
			     CORE_ADDR addr, int len,
			     struct ui_file *stream,
			     const struct value_print_options *options);

extern void print_variable_and_value (const char *name,
				      struct symbol *var,
				      const frame_info_ptr &frame,
				      struct ui_file *stream,
				      int indent);

extern void typedef_print (struct type *type, struct symbol *news,
			   struct ui_file *stream);

extern const char *internalvar_name (const struct internalvar *var);

extern void preserve_values (struct objfile *);

/* From values.c */

extern struct value *make_cv_value (int, int, struct value *);

/* From valops.c */

extern struct value *varying_to_slice (struct value *);

extern struct value *value_slice (struct value *, int, int);

/* Create a complex number.  The type is the complex type; the values
   are cast to the underlying scalar type before the complex number is
   created.  */

extern struct value *value_literal_complex (struct value *, struct value *,
					    struct type *);

/* Return the real part of a complex value.  */

extern struct value *value_real_part (struct value *value);

/* Return the imaginary part of a complex value.  */

extern struct value *value_imaginary_part (struct value *value);

extern struct value *find_function_in_inferior (const char *,
						struct objfile **);

extern struct value *value_allocate_space_in_inferior (int);

/* User function handler.  The internal_function_fn variant assumes return
   type int.  The internal_function_fn_noside returns some value with the
   return type when passed noside == EVAL_AVOID_SIDE_EFFECTS.  */

using internal_function_fn
  = std::function<struct value *(struct gdbarch *gdbarch,
				 const struct language_defn *language,
				 void *cookie,
				 int argc,
				 struct value **argv)>;

using internal_function_fn_noside
  = std::function<struct value *(struct gdbarch *gdbarch,
				 const struct language_defn *language,
				 void *cookie,
				 int argc,
				 struct value **argv,
				 enum noside noside)>;

/* Add a new internal function.  NAME is the name of the function; DOC
   is a documentation string describing the function.  HANDLER is
   called when the function is invoked.  COOKIE is an arbitrary
   pointer which is passed to HANDLER and is intended for "user
   data".  */

extern void add_internal_function (const char *name, const char *doc,
				   internal_function_fn handler,
				   void *cookie);
extern void add_internal_function (const char *name, const char *doc,
				   internal_function_fn_noside handler,
				   void *cookie);

/* This overload takes an allocated documentation string.  */

extern void add_internal_function (gdb::unique_xmalloc_ptr<char> &&name,
				   gdb::unique_xmalloc_ptr<char> &&doc,
				   internal_function_fn handler,
				   void *cookie);
extern void add_internal_function (gdb::unique_xmalloc_ptr<char> &&name,
				   gdb::unique_xmalloc_ptr<char> &&doc,
				   internal_function_fn_noside handler,
				   void *cookie);

struct value *call_internal_function (struct gdbarch *gdbarch,
				      const struct language_defn *language,
				      struct value *function,
				      int argc, struct value **argv,
				      enum noside noside);

const char *value_internal_function_name (struct value *);

/* Convert VALUE to a gdb_mpq.  The caller must ensure that VALUE is
   of floating-point, fixed-point, or integer type.  */
extern gdb_mpq value_to_gdb_mpq (struct value *value);

/* Return true if LEN (in bytes) exceeds the max-value-size setting,
   otherwise, return false.  If the user has disabled (set to unlimited)
   the max-value-size setting then this function will always return false.  */
extern bool exceeds_max_value_size (ULONGEST length);

/* While an instance of this class is live, and array values that are
   created, that are larger than max_value_size, will be restricted in size
   to a particular number of elements.  */

struct scoped_array_length_limiting
{
  /* Limit any large array values to only contain ELEMENTS elements.  */
  scoped_array_length_limiting (int elements);

  /* Restore the previous array value limit.  */
  ~scoped_array_length_limiting ();

private:
  /* Used to hold the previous array value element limit.  */
  std::optional<int> m_old_value;
};

/* Helpers for building pseudo register values from raw registers.  */

/* Create a value for pseudo register PSEUDO_REG_NUM by using bytes from
   raw register RAW_REG_NUM starting at RAW_OFFSET.

   The size of the pseudo register specifies how many bytes to use.  The
   offset plus the size must not overflow the raw register's size.  */

value *pseudo_from_raw_part (const frame_info_ptr &next_frame, int pseudo_reg_num,
			     int raw_reg_num, int raw_offset);

/* Write PSEUDO_BUF, the contents of a pseudo register, to part of raw register
   RAW_REG_NUM starting at RAW_OFFSET.  */

void pseudo_to_raw_part (const frame_info_ptr &next_frame,
			 gdb::array_view<const gdb_byte> pseudo_buf,
			 int raw_reg_num, int raw_offset);

/* Create a value for pseudo register PSEUDO_REG_NUM by concatenating raw
   registers RAW_REG_1_NUM and RAW_REG_2_NUM.

   The sum of the sizes of raw registers must be equal to the size of the
   pseudo register.  */

value *pseudo_from_concat_raw (const frame_info_ptr &next_frame, int pseudo_reg_num,
			       int raw_reg_1_num, int raw_reg_2_num);

/* Write PSEUDO_BUF, the contents of a pseudo register, to the two raw registers
   RAW_REG_1_NUM and RAW_REG_2_NUM.  */

void pseudo_to_concat_raw (const frame_info_ptr &next_frame,
			   gdb::array_view<const gdb_byte> pseudo_buf,
			   int raw_reg_1_num, int raw_reg_2_num);

/* Same as the above, but with three raw registers.  */

value *pseudo_from_concat_raw (const frame_info_ptr &next_frame, int pseudo_reg_num,
			       int raw_reg_1_num, int raw_reg_2_num,
			       int raw_reg_3_num);

/* Write PSEUDO_BUF, the contents of a pseudo register, to the three raw
   registers RAW_REG_1_NUM, RAW_REG_2_NUM and RAW_REG_3_NUM.  */

void pseudo_to_concat_raw (const frame_info_ptr &next_frame,
			   gdb::array_view<const gdb_byte> pseudo_buf,
			   int raw_reg_1_num, int raw_reg_2_num,
			   int raw_reg_3_num);

#endif /* GDB_VALUE_H */
