X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvalue.h;h=67f1d048508a41685fcca626ba3fd6285b4bca7f;hb=45a466b578083a05f1138eff9232254b1a30f683;hp=65d0a0249a05ca8c8dd05187729978ed2b295037;hpb=8a9b8146fd539229c51c6a4e5a4f682df2a630b0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/value.h b/gdb/value.h index 65d0a0249a..67f1d04850 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -1,8 +1,6 @@ /* 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, - 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1986-2013 Free Software Foundation, Inc. This file is part of GDB. @@ -76,6 +74,7 @@ extern void set_value_bitpos (struct value *, int bit); bitfields. */ struct value *value_parent (struct value *); +extern void set_value_parent (struct value *value, struct value *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 @@ -139,6 +138,22 @@ extern struct type *value_enclosing_type (struct value *); extern void set_value_enclosing_type (struct value *val, struct type *new_type); +/* 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); + extern int value_pointed_to_offset (struct value *value); extern void set_value_pointed_to_offset (struct value *value, int val); extern int value_embedded_offset (struct value *value); @@ -156,13 +171,15 @@ 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'. */ + 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'. */ + 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); /* Check the validity of some bits in VALUE. This should return 1 @@ -178,6 +195,11 @@ struct lval_funcs 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. */ int (*check_synthetic_pointer) (const struct value *value, @@ -204,12 +226,28 @@ struct lval_funcs and closure CLOSURE. */ extern struct value *allocate_computed_value (struct type *type, - struct lval_funcs *funcs, - void *closure); + const struct lval_funcs *funcs, + void *closure); + +/* Helper function to check the validity of some bits of a value. + + If TYPE represents some aggregate type (e.g., a structure), return 1. + + Otherwise, any of the bytes starting at OFFSET and extending for + TYPE_LENGTH(TYPE) bytes are invalid, print a message to STREAM and + return 0. The checking is done using FUNCS. + + Otherwise, return 1. */ + +extern int valprint_check_validity (struct ui_file *stream, struct type *type, + int embedded_offset, + const struct value *val); + +extern struct value *allocate_optimized_out_value (struct type *type); /* If VALUE is lval_computed, return its lval_funcs structure. */ -extern struct lval_funcs *value_computed_funcs (struct value *value); +extern const struct lval_funcs *value_computed_funcs (const struct value *); /* If VALUE is lval_computed, return its closure. The meaning of the returned value depends on the functions VALUE uses. */ @@ -310,6 +348,9 @@ 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)) +/* Like VALUE_LVAL, except the parameter can be const. */ +extern enum lval_type value_lval_const (const struct value *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 @@ -336,6 +377,24 @@ extern struct frame_id *deprecated_value_frame_id_hack (struct value *); extern short *deprecated_value_regnum_hack (struct value *); #define VALUE_REGNUM(val) (*deprecated_value_regnum_hack (val)) +/* 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. + + 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, + struct type *original_type, + struct value *original_val); + /* Convert a REF to the object referenced. */ extern struct value *coerce_ref (struct value *value); @@ -432,8 +491,9 @@ extern void read_value_memory (struct value *val, int embedded_offset, struct frame_info; struct fn_field; -extern void print_address_demangle (struct gdbarch *, CORE_ADDR, - struct ui_file *, int); +extern int print_address_demangle (const struct value_print_options *, + struct gdbarch *, CORE_ADDR, + struct ui_file *, int); extern LONGEST value_as_long (struct value *val); extern DOUBLEST value_as_double (struct value *val); @@ -485,15 +545,20 @@ extern struct value *default_value_from_register (struct type *type, int regnum, struct frame_info *frame); +extern void read_frame_register_value (struct value *value, + struct frame_info *frame); + extern struct value *value_from_register (struct type *type, int regnum, struct frame_info *frame); extern CORE_ADDR address_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 *value_of_variable (struct symbol *var, + const struct block *b); -extern struct value *address_of_variable (struct symbol *var, struct block *b); +extern struct value *address_of_variable (struct symbol *var, + const struct block *b); extern struct value *value_of_register (int regnum, struct frame_info *frame); @@ -504,6 +569,9 @@ extern int symbol_read_needs_frame (struct symbol *); extern struct value *read_var_value (struct symbol *var, struct frame_info *frame); +extern struct value *default_read_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); @@ -520,12 +588,10 @@ extern struct value *value_mark (void); extern void value_free_to_mark (struct value *mark); -extern struct value *value_cstring (char *ptr, int len, +extern struct value *value_cstring (char *ptr, ssize_t len, struct type *char_type); -extern struct value *value_string (char *ptr, int len, +extern struct value *value_string (char *ptr, ssize_t 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); @@ -575,14 +641,9 @@ extern struct value *value_aggregate_elt (struct type *curtype, extern struct value *value_static_field (struct type *type, int fieldno); -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, +extern int find_overload_match (struct value **args, int nargs, const char *name, enum oload_search_type method, int lax, struct value **objp, struct symbol *fsym, @@ -596,13 +657,13 @@ extern struct value *value_primitive_field (struct value *arg1, int offset, struct type *arg_type); -extern struct type *value_rtti_target_type (struct value *, int *, int *, - int *); +extern struct type *value_rtti_indirect_type (struct value *, int *, int *, + int *); extern struct value *value_full_object (struct value *, struct type *, int, int, int); -extern struct value *value_cast_pointers (struct type *, struct value *); +extern struct value *value_cast_pointers (struct type *, struct value *, int); extern struct value *value_cast (struct type *type, struct value *arg2); @@ -613,7 +674,7 @@ 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_one (struct type *type); extern struct value *value_repeat (struct value *arg1, int count); @@ -632,7 +693,7 @@ extern int value_bit_index (struct type *type, const gdb_byte *addr, int index); extern int using_struct_return (struct gdbarch *gdbarch, - struct type *func_type, + struct value *function, struct type *value_type); extern struct value *evaluate_expression (struct expression *exp); @@ -698,10 +759,54 @@ extern struct internalvar *lookup_only_internalvar (const char *name); extern struct internalvar *create_internalvar (const char *name); -typedef struct value * (*internalvar_make_value) (struct gdbarch *, - struct internalvar *); +extern VEC (char_ptr) *complete_internalvar (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); + + /* If non-NULL, this is called to destroy DATA. The DATA argument + passed to this function is the same argument that was passed to + `create_internalvar_type_lazy'. */ + + void (*destroy) (void *data); +}; + extern struct internalvar * - create_internalvar_type_lazy (char *name, internalvar_make_value fun); +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); @@ -715,7 +820,9 @@ extern int value_logical_not (struct value *arg1); /* C++ */ -extern struct value *value_of_this (int complain); +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, @@ -749,12 +856,14 @@ extern void free_value_chain (struct value *v); extern void release_value (struct value *val); +extern void release_value_or_incref (struct value *val); + extern int record_latest_value (struct value *val); 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, +extern void type_print (struct type *type, const char *varstring, struct ui_file *stream, int show); extern char *type_to_string (struct type *type); @@ -772,8 +881,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, - const struct value_print_options *options); +extern void 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, @@ -781,17 +890,17 @@ extern void value_print_array_elements (struct value *val, 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); +extern void 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); -extern int common_val_print (struct value *val, - struct ui_file *stream, int recurse, - const struct value_print_options *options, - const struct language_defn *language); +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, @@ -804,8 +913,6 @@ extern void print_variable_and_value (const char *name, struct ui_file *stream, int indent); -extern int check_field (struct type *, const char *); - extern void typedef_print (struct type *type, struct symbol *news, struct ui_file *stream); @@ -835,8 +942,6 @@ extern struct value *find_function_in_inferior (const char *, 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, LONGEST index, int lowerbound);