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

   Copyright (C) 1986-2025 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 reused 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);

/* Unpack a field FIELDNO of the specified TYPE, from the anonymous
   object at VALADDR.  See unpack_bits_as_long for more details.  */

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

/* Unpack a field, FIELD, from the anonymous object at VALADDR.  See
   unpack_bits_as_long for more details.  */

extern LONGEST unpack_field_as_long (const gdb_byte *valaddr,
				     struct field *field);

/* 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.  If TYPE is
   non-nullptr, use it as the value type.  Otherwise, 'register_type'
   will be used to obtain the type.  */

extern value *value_of_register_lazy (const frame_info_ptr &next_frame,
				      int regnum, struct type *type = nullptr);

/* 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 *val,
					      int bitpos,
					      struct type *field_type);

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 *, LONGEST, LONGEST);

/* 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 */
