/* Definitions for values of C expressions, for GDB.
Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
- 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
- Free Software Foundation, Inc.
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+ 2008, 2009 Free Software Foundation, Inc.
This file is part of GDB.
struct symbol;
struct type;
struct ui_file;
+struct language_defn;
+struct value_print_options;
/* 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
struct value;
+/* Needed if another module needs to maintain its own list of values. */
+
+void value_prepend_to_list (struct value **head, struct value *val);
+void value_remove_from_list (struct value **head, struct value *val);
+
/* 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 list. */
+ over calls to the inferior. Values assigned to internal variables,
+ put into the value history or exposed to Python are taken off this
+ list. */
struct value *value_next (struct value *);
extern void set_value_bitsize (struct value *, int bit);
/* Only used for bitfields; position of start of field. For
- BITS_BIG_ENDIAN=0 targets, it is the position of the LSB. For
- BITS_BIG_ENDIAN=1 targets, it is the position of the MSB. */
+ gdbarch_bits_big_endian=0 targets, it is the position of the LSB. For
+ gdbarch_bits_big_endian=1 targets, it is the position of the MSB. */
extern int value_bitpos (struct value *);
extern void set_value_bitpos (struct value *, int bit);
extern int value_embedded_offset (struct value *value);
extern void set_value_embedded_offset (struct value *value, int val);
+/* 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'. */
+ 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'. */
+ void (*write) (struct value *toval, struct value *fromval);
+
+ /* 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) (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);
+};
+
+/* Create a computed lvalue, with type TYPE, function pointers FUNCS,
+ and closure CLOSURE. */
+
+extern struct value *allocate_computed_value (struct type *type,
+ struct lval_funcs *funcs,
+ void *closure);
+
+/* If VALUE is lval_computed, return its lval_funcs structure. */
+
+extern struct lval_funcs *value_computed_funcs (struct value *value);
+
+/* If VALUE is lval_computed, return its closure. The meaning of the
+ returned value depends on the functions VALUE uses. */
+
+extern void *value_computed_closure (struct value *value);
+
/* If zero, contents of this value are in the contents field. If
- nonzero, contents are in inferior memory at address in the
- location.address field plus the offset field (and the lval field
- should be lval_memory).
+ nonzero, 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
extern int value_initialized (struct value *);
extern void set_value_initialized (struct value *, int);
+/* Set COMPONENT's location as appropriate for a component of WHOLE
+ --- regardless of what kind of lvalue WHOLE is. */
+extern void set_value_component_location (struct value *component,
+ struct value *whole);
+
/* While the following fields are per- VALUE .CONTENT .PIECE (i.e., a
single value might have multiple LVALs), this hacked interface is
limited to just the first PIECE. Expect further change. */
extern struct value *coerce_ref (struct value *value);
/* If ARG is an array, convert it to a pointer.
- If ARG is an enum, convert it to an integer.
If ARG is a function, convert it to a function pointer.
References are dereferenced. */
extern struct value *coerce_array (struct value *value);
-extern struct value *coerce_number (struct value *value);
-
-/* If ARG is an enum, convert it to an integer. */
-
-extern struct value *coerce_enum (struct value *value);
/* Internal variables (variables for convenience of use of debugger)
are recorded as a chain of these structures. */
+typedef struct value * (*internalvar_make_value) (struct internalvar *);
+
struct internalvar
{
struct internalvar *next;
char *name;
struct value *value;
+ internalvar_make_value make_value;
int endian;
+ /* True if this internalvar is the canonical name for a convenience
+ function. */
+ int canonical;
};
\f
extern struct value *value_from_longest (struct type *type, LONGEST num);
extern struct value *value_from_pointer (struct type *type, CORE_ADDR addr);
extern struct value *value_from_double (struct type *type, DOUBLEST num);
-extern struct value *value_from_decfloat (struct type *expect_type,
- struct type *type,
- gdb_byte decbytes[16]);
+extern struct value *value_from_decfloat (struct type *type,
+ const gdb_byte *decbytes);
extern struct value *value_from_string (char *string);
extern struct value *value_at (struct type *type, CORE_ADDR addr);
extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr);
+extern struct value *value_from_contents_and_address (struct type *,
+ const gdb_byte *,
+ CORE_ADDR);
+
extern struct value *default_value_from_register (struct type *type,
int regnum,
struct frame_info *frame);
extern struct value *value_of_variable (struct symbol *var, struct block *b);
+extern struct value *address_of_variable (struct symbol *var, struct block *b);
+
extern struct value *value_of_register (int regnum, struct frame_info *frame);
+struct value *value_of_register_lazy (struct frame_info *frame, int regnum);
+
extern int symbol_read_needs_frame (struct symbol *);
extern struct value *read_var_value (struct symbol *var,
struct frame_info *frame);
-extern struct value *locate_var_value (struct symbol *var,
- struct frame_info *frame);
-
extern struct value *allocate_value (struct type *type);
+extern struct value *allocate_value_lazy (struct type *type);
+extern void allocate_value_contents (struct value *value);
extern struct value *allocate_repeat_value (struct type *type, int count);
extern void value_free_to_mark (struct value *mark);
+extern struct value *value_typed_string (char *ptr, int len,
+ struct type *char_type);
extern struct value *value_string (char *ptr, int len);
extern struct value *value_bitstring (char *ptr, int len);
extern struct value *value_binop (struct value *arg1, struct value *arg2,
enum exp_opcode op);
-extern struct value *value_add (struct value *arg1, struct value *arg2);
+extern struct value *value_ptradd (struct value *arg1, struct value *arg2);
+
+extern struct value *value_ptrsub (struct value *arg1, struct value *arg2);
+
+extern LONGEST value_ptrdiff (struct value *arg1, struct value *arg2);
+
+extern int value_must_coerce_to_target (struct value *arg1);
-extern struct value *value_sub (struct value *arg1, struct value *arg2);
+extern struct value *value_coerce_to_target (struct value *arg1);
extern struct value *value_coerce_array (struct value *arg1);
extern struct value *value_zero (struct type *type, enum lval_type lv);
+extern struct value *value_one (struct type *type, enum lval_type lv);
+
extern struct value *value_repeat (struct value *arg1, int count);
extern struct value *value_subscript (struct value *array, struct value *idx);
+extern struct value *value_bitstring_subscript (struct type *type,
+ struct value *bitstring,
+ struct value *idx);
+
extern struct value *register_value_being_returned (struct type *valtype,
struct regcache *retbuf);
-extern struct value *value_in (struct value *element, struct value *set);
+extern int value_in (struct value *element, struct value *set);
extern int value_bit_index (struct type *type, const gdb_byte *addr,
int index);
-extern int using_struct_return (struct type *value_type);
+extern int using_struct_return (struct type *func_type,
+ struct type *value_type);
extern struct value *evaluate_expression (struct expression *exp);
extern struct value *evaluate_type (struct expression *exp);
+extern struct value *evaluate_subexpression_type (struct expression *exp,
+ int subexp);
+
+extern char *extract_field_op (struct expression *exp, int *subexp);
+
extern struct value *evaluate_subexp_with_coercion (struct expression *,
int *, enum noside);
extern LONGEST parse_and_eval_long (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);
extern struct value *value_of_internalvar (struct internalvar *var);
int bitpos, int bitsize,
struct value *newvalue);
-extern struct internalvar *lookup_only_internalvar (char *name);
+extern struct internalvar *lookup_only_internalvar (const char *name);
+
+extern struct internalvar *create_internalvar (const char *name);
-extern struct internalvar *create_internalvar (char *name);
+extern struct internalvar *
+ create_internalvar_type_lazy (char *name, internalvar_make_value fun);
-extern struct internalvar *lookup_internalvar (char *name);
+extern struct internalvar *lookup_internalvar (const char *name);
extern int value_equal (struct value *arg1, struct value *arg2);
extern int destructor_name_p (const char *name, const struct type *type);
-#define value_free(val) xfree (val)
+extern void value_free (struct value *val);
extern void free_all_values (void);
extern void type_print (struct type *type, char *varstring,
struct ui_file *stream, int show);
+extern char *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_decimal_floating (const gdb_byte *valaddr, struct type *type,
struct ui_file *stream);
-extern int value_print (struct value *val, struct ui_file *stream, int format,
- enum val_prettyprint pretty);
+extern int value_print (struct value *val, struct ui_file *stream,
+ const struct value_print_options *options);
extern void value_print_array_elements (struct value *val,
struct ui_file *stream, int format,
extern int val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int format,
- int deref_ref, int recurse,
- enum val_prettyprint pretty);
+ struct ui_file *stream, int recurse,
+ const struct value_print_options *options,
+ const struct language_defn *language);
extern int common_val_print (struct value *val,
- struct ui_file *stream, int format,
- int deref_ref, int recurse,
- enum val_prettyprint pretty);
+ struct ui_file *stream, int recurse,
+ const struct value_print_options *options,
+ const struct language_defn *language);
-extern int val_print_string (CORE_ADDR addr, int len, int width,
- struct ui_file *stream);
+extern int val_print_string (struct type *elttype, CORE_ADDR addr, int len,
+ struct ui_file *stream,
+ const struct value_print_options *options);
-extern void print_variable_value (struct symbol *var,
- struct frame_info *frame,
- struct ui_file *stream);
+extern void print_variable_and_value (const char *name,
+ struct symbol *var,
+ struct frame_info *frame,
+ struct ui_file *stream,
+ int indent);
-extern int check_field (struct value *, const char *);
+extern int check_field (struct type *, const char *);
extern void typedef_print (struct type *type, struct symbol *news,
struct ui_file *stream);
extern struct value *value_literal_complex (struct value *, struct value *,
struct type *);
-extern struct value *find_function_in_inferior (const char *);
+extern struct value *find_function_in_inferior (const char *,
+ struct objfile **);
extern struct value *value_allocate_space_in_inferior (int);
extern struct value *value_of_local (const char *name, int complain);
+extern struct value * value_subscripted_rvalue (struct value *array, struct value *idx, int lowerbound);
+
+/* User function handler. */
+
+typedef struct value *(*internal_function_fn) (void *cookie,
+ int argc,
+ struct value **argv);
+
+void add_internal_function (const char *name, const char *doc,
+ internal_function_fn handler,
+ void *cookie);
+
+struct value *call_internal_function (struct value *function,
+ int argc, struct value **argv);
+
+char *value_internal_function_name (struct value *);
+
#endif /* !defined (VALUE_H) */