X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fvalue.h;h=c3dfb17276f22ce20e2e9324e9ec0c445fabb1e5;hb=6cc55c64eda17f5c5f1816b60f8960134939d450;hp=aa43365efe575b316515b26a63ce71e20f7a9e50;hpb=4aa995e123f47a4aca553ae4ed4fdebe2d00e316;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/value.h b/gdb/value.h index aa43365efe..c3dfb17276 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, 2009 Free Software Foundation, Inc. + 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GDB. @@ -41,11 +41,6 @@ struct value_print_options; 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, put into the value history or exposed to Python are taken off this @@ -55,7 +50,7 @@ struct value *value_next (struct value *); /* Type of the value. */ -extern struct type *value_type (struct value *); +extern struct type *value_type (const struct value *); /* 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 @@ -66,23 +61,29 @@ extern void deprecated_set_value_type (struct value *value, /* Only used for bitfields; number of bits contained in them. */ -extern int value_bitsize (struct value *); +extern int value_bitsize (const struct value *); extern void set_value_bitsize (struct value *, int bit); /* Only used for bitfields; position of start of field. For 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 int value_bitpos (const struct value *); extern void set_value_bitpos (struct value *, int bit); +/* Only used for bitfields; the containing value. This allows a + single read from the target when displaying multiple + bitfields. */ + +struct value *value_parent (struct value *); + /* 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. */ -extern int value_offset (struct value *); +extern int value_offset (const struct value *); extern void set_value_offset (struct value *, int offset); /* The comment from "struct value" reads: ``Is it modifiable? Only @@ -163,13 +164,21 @@ struct lval_funcs should call 'error'. */ void (*write) (struct value *toval, struct value *fromval); + /* Check the validity of some bits in VALUE. This should return 1 + if all the bits starting at OFFSET and extending for LENGTH bits + are valid, or 0 if any bit is invalid. */ + int (*check_validity) (const struct value *value, int offset, int length); + + /* Return 1 if any bit in VALUE is valid, 0 if they are all invalid. */ + int (*check_all_valid) (const struct value *value); + /* 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); + 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 @@ -194,7 +203,7 @@ 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); +extern void *value_computed_closure (const struct value *value); /* If zero, contents of this value are in the contents field. If nonzero, contents are in inferior. If the lval field is lval_memory, @@ -214,6 +223,9 @@ extern void *value_computed_closure (struct value *value); extern int value_lazy (struct value *); extern void set_value_lazy (struct value *value, int val); +extern int value_stack (struct value *); +extern void set_value_stack (struct value *value, int val); + /* value_contents() and value_contents_raw() both return the address of the gdb buffer used to hold a copy of the contents of the lval. value_contents() is used when the contents of the buffer are needed @@ -245,6 +257,11 @@ extern gdb_byte *value_contents_writeable (struct value *); extern gdb_byte *value_contents_all_raw (struct value *); extern const gdb_byte *value_contents_all (struct value *); +/* Like value_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. */ +extern const gdb_byte *value_contents_for_printing (struct value *value); + extern int value_fetch_lazy (struct value *val); extern int value_contents_equal (struct value *val1, struct value *val2); @@ -253,6 +270,10 @@ extern int value_contents_equal (struct value *val1, struct value *val2); extern int value_optimized_out (struct value *value); extern void set_value_optimized_out (struct value *value, int val); +/* Like value_optimized_out, but return false if any bit in the object + is valid. */ +extern int value_entirely_optimized_out (const struct value *value); + /* Set or return field indicating whether a variable is initialized or not, based on debugging information supplied by the compiler. 1 = initialized; 0 = uninitialized. */ @@ -262,7 +283,7 @@ 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); + const 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 @@ -272,11 +293,18 @@ extern void set_value_component_location (struct value *component, 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 *); @@ -302,19 +330,12 @@ extern struct value *coerce_ref (struct value *value); extern struct value *coerce_array (struct value *value); -/* Internal variables (variables for convenience of use of debugger) - are recorded as a chain of these structures. */ +/* Given a value, determine whether the bits starting at OFFSET and + extending for LENGTH bits are valid. This returns nonzero if all + bits in the given range are valid, zero if any bit is invalid. */ -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; -}; +extern int value_bits_valid (const struct value *value, + int offset, int length); @@ -325,7 +346,8 @@ struct internalvar struct frame_info; struct fn_field; -extern void print_address_demangle (CORE_ADDR, struct ui_file *, int); +extern void print_address_demangle (struct gdbarch *, CORE_ADDR, + struct ui_file *, int); extern LONGEST value_as_long (struct value *val); extern DOUBLEST value_as_double (struct value *val); @@ -335,6 +357,8 @@ extern LONGEST unpack_long (struct type *type, const gdb_byte *valaddr); extern DOUBLEST unpack_double (struct type *type, const gdb_byte *valaddr, int *invp); extern CORE_ADDR unpack_pointer (struct type *type, const gdb_byte *valaddr); +LONGEST unpack_bits_as_long (struct type *field_type, const gdb_byte *valaddr, + int bitpos, int bitsize); extern LONGEST unpack_field_as_long (struct type *type, const gdb_byte *valaddr, int fieldno); @@ -346,7 +370,6 @@ 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 *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); @@ -388,8 +411,12 @@ 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_bitstring (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, + struct type *index_type); extern struct value *value_array (int lowbound, int highbound, struct value **elemvec); @@ -399,9 +426,7 @@ 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, struct value *arg2); - -extern struct value *value_ptrsub (struct value *arg1, struct value *arg2); +extern struct value *value_ptradd (struct value *arg1, LONGEST arg2); extern LONGEST value_ptrdiff (struct value *arg1, struct value *arg2); @@ -430,25 +455,30 @@ extern struct value *value_complement (struct value *arg1); extern struct value *value_struct_elt (struct value **argp, struct value **args, - char *name, int *static_memfuncp, - char *err); + const char *name, int *static_memfuncp, + const char *err); extern struct value *value_aggregate_elt (struct type *curtype, char *name, + struct type *expect_type, int want_address, enum noside noside); extern struct value *value_static_field (struct type *type, int fieldno); -extern struct fn_field *value_find_oload_method_list (struct value **, char *, +extern struct fn_field *value_find_oload_method_list (struct value **, + const char *, int, int *, struct type **, int *); +enum oload_search_type { NON_METHOD, METHOD, BOTH }; + extern int find_overload_match (struct type **arg_types, int nargs, - char *name, int method, int lax, + const char *name, + enum oload_search_type method, int lax, struct value **objp, struct symbol *fsym, struct value **valp, struct symbol **symp, - int *staticp); + int *staticp, const int no_adl); extern struct value *value_field (struct value *arg1, int fieldno); @@ -467,17 +497,22 @@ extern struct value *value_cast_pointers (struct type *, struct value *); 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_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_subscript (struct value *array, LONGEST index); extern struct value *value_bitstring_subscript (struct type *type, struct value *bitstring, - struct value *idx); + LONGEST index); extern struct value *register_value_being_returned (struct type *valtype, struct regcache *retbuf); @@ -487,13 +522,18 @@ 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 *func_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_subexp (struct type *expect_type, + struct expression *exp, + int *pos, enum noside noside); + extern struct value *evaluate_subexpression_type (struct expression *exp, int subexp); @@ -524,26 +564,40 @@ extern void binop_promote (const struct language_defn *language, extern struct value *access_value_history (int num); -extern struct value *value_of_internalvar (struct internalvar *var); +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, 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 (char *name); +extern struct internalvar *create_internalvar (const char *name); +typedef struct value * (*internalvar_make_value) (struct gdbarch *, + struct internalvar *); 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 value_equal_contents (struct value *arg1, struct value *arg2); + extern int value_less (struct value *arg1, struct value *arg2); extern int value_logical_not (struct value *arg1); @@ -563,6 +617,10 @@ extern struct value *value_x_unop (struct value *arg1, enum exp_opcode op, extern struct value *value_fn_field (struct value **arg1p, struct fn_field *f, int j, struct type *type, int 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); @@ -570,6 +628,8 @@ 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); +extern void value_incref (struct value *val); + extern void value_free (struct value *val); extern void free_all_values (void); @@ -578,8 +638,8 @@ extern void release_value (struct value *val); extern int record_latest_value (struct value *val); -extern void modify_field (gdb_byte *addr, LONGEST fieldval, int bitpos, - int bitsize); +extern void modify_field (struct type *type, gdb_byte *addr, + LONGEST fieldval, int bitpos, int bitsize); extern void type_print (struct type *type, char *varstring, struct ui_file *stream, int show); @@ -611,6 +671,7 @@ 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 recurse, + const struct value *val, const struct value_print_options *options, const struct language_defn *language); @@ -619,7 +680,7 @@ extern int common_val_print (struct value *val, const struct value_print_options *options, const struct language_defn *language); -extern int val_print_string (CORE_ADDR addr, int len, int width, +extern int val_print_string (struct type *elttype, CORE_ADDR addr, int len, struct ui_file *stream, const struct value_print_options *options); @@ -642,6 +703,8 @@ extern void preserve_values (struct objfile *); extern struct value *value_copy (struct value *); +extern void preserve_one_value (struct value *, struct objfile *, htab_t); + /* From valops.c */ extern struct value *varying_to_slice (struct value *); @@ -658,5 +721,26 @@ 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); +extern struct value *value_subscripted_rvalue (struct value *array, + LONGEST index, int lowerbound); + +/* User function handler. */ + +typedef struct value *(*internal_function_fn) (struct gdbarch *gdbarch, + const struct language_defn *language, + 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 gdbarch *gdbarch, + const struct language_defn *language, + struct value *function, + int argc, struct value **argv); + +char *value_internal_function_name (struct value *); + #endif /* !defined (VALUE_H) */