X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvalue.h;h=db4dcc1dd43c42e9577b864d33da813837e648b0;hb=3b7538c0317072d430eca4e808b183dac5bd5e45;hp=d9627c2be932616552ea758ddf3ef7ffea81c64a;hpb=9b254dd1ce46c19dde1dde5b8d1e22e862dfacce;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/value.h b/gdb/value.h index d9627c2be9..db4dcc1dd4 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -2,7 +2,7 @@ Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, - 2008 Free Software Foundation, Inc. + 2008, 2009 Free Software Foundation, Inc. This file is part of GDB. @@ -31,6 +31,8 @@ struct regcache; 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 @@ -39,9 +41,15 @@ struct ui_file; 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 *); @@ -62,8 +70,8 @@ extern int value_bitsize (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); @@ -134,10 +142,64 @@ extern void set_value_pointed_to_offset (struct value *value, int val); 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 @@ -197,6 +259,11 @@ extern void set_value_optimized_out (struct value *value, int val); 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. */ @@ -205,11 +272,18 @@ extern void set_value_initialized (struct value *, int); extern enum lval_type *deprecated_value_lval_hack (struct value *); #define VALUE_LVAL(val) (*deprecated_value_lval_hack (val)) -/* If lval == lval_memory, this is the address in the inferior. If - lval == lval_register, this is the byte offset into the registers - structure. */ -extern CORE_ADDR *deprecated_value_address_hack (struct value *); -#define VALUE_ADDRESS(val) (*deprecated_value_address_hack (val)) +/* 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. */ +extern CORE_ADDR value_address (struct value *); + +/* Like value_address, except the result does not include value's + offset. */ +extern CORE_ADDR value_raw_address (struct value *); + +/* Set the address of a value. */ +extern void set_value_address (struct value *, CORE_ADDR); /* Pointer to internal variable. */ extern struct internalvar **deprecated_value_internalvar_hack (struct value *); @@ -229,28 +303,11 @@ extern short *deprecated_value_regnum_hack (struct value *); 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. */ - -struct internalvar -{ - struct internalvar *next; - char *name; - struct value *value; - int endian; -}; @@ -280,14 +337,16 @@ 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_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_string (char *string); +extern struct value *value_from_decfloat (struct type *type, + const gdb_byte *decbytes); 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); @@ -300,17 +359,20 @@ extern CORE_ADDR address_from_register (struct type *type, int regnum, 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); @@ -318,7 +380,10 @@ extern struct value *value_mark (void); extern void value_free_to_mark (struct value *mark); -extern struct value *value_string (char *ptr, int len); +extern struct value *value_cstring (char *ptr, int len, + struct type *char_type); +extern struct value *value_string (char *ptr, int len, + struct type *char_type); extern struct value *value_bitstring (char *ptr, int len); extern struct value *value_array (int lowbound, int highbound, @@ -329,9 +394,15 @@ 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_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 struct value *value_sub (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_coerce_to_target (struct value *arg1); extern struct value *value_coerce_array (struct value *arg1); @@ -393,24 +464,37 @@ extern struct value *value_cast (struct type *type, struct value *arg2); 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 gdbarch *gdbarch, + 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); @@ -426,22 +510,41 @@ extern CORE_ADDR parse_and_eval_address_1 (char **expptr); 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); +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 clear_internalvar (struct internalvar *var); + extern void set_internalvar_component (struct internalvar *var, int offset, 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); +typedef struct value * (*internalvar_make_value) (struct internalvar *); -extern struct internalvar *lookup_internalvar (char *name); +extern struct internalvar * + create_internalvar_type_lazy (char *name, internalvar_make_value fun); + +extern struct internalvar *lookup_internalvar (const char *name); extern int value_equal (struct value *arg1, struct value *arg2); @@ -471,7 +574,7 @@ extern int unop_user_defined_p (enum exp_opcode op, struct value *arg1); 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); @@ -485,6 +588,8 @@ extern void modify_field (gdb_byte *addr, LONGEST fieldval, int bitpos, 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); @@ -498,8 +603,8 @@ extern void print_floating (const gdb_byte *valaddr, struct type *type, 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, @@ -509,23 +614,26 @@ extern struct value *value_release_to_mark (struct value *mark); 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); @@ -547,10 +655,28 @@ extern struct value *value_slice (struct value *, int, int); 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) */