/* Definitions for values of C expressions, for GDB.
- Copyright 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 2000, 2001
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
This file is part of GDB.
#if !defined (VALUE_H)
#define VALUE_H 1
+#include "doublest.h"
+
/*
* The structure which defines the type of a value. It should never
* be possible for a program lval value to survive over a call to the inferior
at the same place in memory. This will be described in the
lval enum above as "lval_reg_frame_relative". */
CORE_ADDR frame_addr;
+
/* Type of the value. */
struct type *type;
- /* Type of the enclosing object if this is an embedded subobject.
- The member embedded_offset gives the real position of the subobject
- if type is not the same as enclosing_type.
- If the type field is a pointer type, then enclosing_type is
- a pointer type pointing to the real (enclosing) type of the target
- object. */
+ /* 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
+ VALUE_CONTENTS macro 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;
+ int embedded_offset;
+ int pointed_to_offset;
+
/* Values are stored in a chain, so that they can be deleted
easily over calls to the inferior. Values assigned to internal
variables or put into the value history are taken off this
/* If nonzero, this is the value of a variable which does not
actually exist in the program. */
char optimized_out;
- /* If this value represents an object that is embedded inside a
- larger object (e.g., a base subobject in C++), this gives the
- offset (in bytes) from the start of the contents buffer where
- the embedded object begins. This is required because some C++
- runtime implementations lay out objects (especially virtual bases
- with possibly negative offsets to ancestors).
- Note: This may be positive or negative! Also note that this offset
- is not used when retrieving contents from target memory; the entire
- enclosing object has to be retrieved always, and the offset for
- that is given by the member offset above. */
- int embedded_offset;
- /* If this value represents a pointer to an object that is embedded
- in another object, this gives the embedded_offset of the object
- that is pointed to. */
- int pointed_to_offset;
/* The BFD section associated with this value. */
asection *bfd_section;
/* Actual contents of the value. For use of this value; setting
extern DOUBLEST value_as_double (value_ptr val);
-extern CORE_ADDR value_as_pointer (value_ptr val);
+extern CORE_ADDR value_as_address (value_ptr val);
extern LONGEST unpack_long (struct type *type, char *valaddr);
extern value_ptr allocate_repeat_value (struct type *type, int count);
+extern value_ptr value_change_enclosing_type (value_ptr val, struct type *new_type);
+
extern value_ptr value_mark (void);
extern void value_free_to_mark (value_ptr mark);
extern value_ptr value_primitive_field (value_ptr arg1, int offset,
int fieldno, struct type *arg_type);
-extern struct type *value_rtti_type (value_ptr, int *, int *, int *);
extern struct type *value_rtti_target_type (value_ptr, int *, int *, int *);
extern value_ptr value_fn_field (value_ptr * arg1p, struct fn_field *f,
int j, struct type *type, int offset);
-extern value_ptr value_virtual_fn_field (value_ptr * arg1p,
- struct fn_field *f, int j,
- struct type *type, int offset);
-
extern int binop_user_defined_p (enum exp_opcode op,
value_ptr arg1, value_ptr arg2);
extern int record_latest_value (value_ptr val);
-extern void registers_changed (void);
-
-extern void read_register_bytes (int regbyte, char *myaddr, int len);
-
-extern void write_register_bytes (int regbyte, char *myaddr, int len);
-
-extern void read_register_gen (int regnum, char *myaddr);
-
-extern void write_register_gen (int regnum, char *myaddr);
-
-/* Rename to read_unsigned_register()? */
-extern ULONGEST read_register (int regnum);
-
-extern LONGEST read_signed_register (int regnum);
-
-/* Rename to read_unsigned_register_pid()? */
-extern ULONGEST read_register_pid (int regnum, int pid);
-
-extern LONGEST read_signed_register_pid (int regnum, int pid);
-
-extern void write_register (int regnum, LONGEST val);
-
-extern void write_register_pid (int regnum, CORE_ADDR val, int pid);
-
-extern void supply_register (int regnum, char *val);
-
-extern int register_cached (int regnum);
-
-extern void set_register_cached (int regnum, int state);
-
-extern void register_changed (int regnum);
-
-extern char *register_buffer (int regnum);
-
-extern void get_saved_register (char *raw_buffer, int *optimized,
- CORE_ADDR * addrp,
- struct frame_info *frame,
- int regnum, enum lval_type *lval);
-
extern void
modify_field (char *addr, LONGEST fieldval, int bitpos, int bitsize);