X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fvalue.h;h=4727755f06455e033539a5d606ff4cdcba2f300e;hb=7fda53d583bf5baaa15ccdea78c48bf57b205dad;hp=aa8ff3ca52c5b208e62673beb954b7bcc264af43;hpb=de4127a3b22abd0e9e69f61f6e52b5f891050ffd;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/value.h b/gdb/value.h index aa8ff3ca52..4727755f06 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-2012 Free Software Foundation, Inc. This file is part of GDB. @@ -156,13 +154,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 +178,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 +209,14 @@ 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); + +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 +317,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 +346,11 @@ 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); + /* Convert a REF to the object referenced. */ extern struct value *coerce_ref (struct value *value); @@ -360,6 +375,69 @@ extern int value_bits_valid (const struct value *value, extern int value_bits_synthetic_pointer (const struct value *value, int offset, int length); +/* Given a value, determine whether the contents bytes starting at + OFFSET and extending for LENGTH bytes are available. This returns + nonzero if all bytes in the given range are available, zero if any + byte is unavailable. */ + +extern int value_bytes_available (const struct value *value, + int offset, int length); + +/* Like value_bytes_available, but return false if any byte in the + whole object is unavailable. */ +extern int value_entirely_available (struct value *value); + +/* Mark VALUE's content bytes starting at OFFSET and extending for + LENGTH bytes as unavailable. */ + +extern void mark_value_bytes_unavailable (struct value *value, + int offset, int length); + +/* Compare LENGTH bytes of VAL1's contents starting at OFFSET1 with + LENGTH bytes of VAL2's contents starting at OFFSET2. + + Note that "contents" refers to the whole value's contents + (value_contents_all), without any embedded offset adjustment. For + example, to compare a complete object value with itself, including + its enclosing type chunk, you'd do: + + int len = TYPE_LENGTH (check_typedef (value_enclosing_type (val))); + value_available_contents (val, 0, val, 0, len); + + Returns true iff the set of available contents match. Unavailable + contents compare equal with unavailable contents, and different + with any available byte. For example, if 'x's represent an + unavailable byte, and 'V' and 'Z' represent different available + bytes, in a value with length 16: + + offset: 0 4 8 12 16 + contents: xxxxVVVVxxxxVVZZ + + then: + + value_available_contents_eq(val, 0, val, 8, 6) => 1 + value_available_contents_eq(val, 0, val, 4, 4) => 1 + value_available_contents_eq(val, 0, val, 8, 8) => 0 + value_available_contents_eq(val, 4, val, 12, 2) => 1 + value_available_contents_eq(val, 4, val, 12, 4) => 0 + value_available_contents_eq(val, 3, val, 4, 4) => 0 +*/ + +extern int value_available_contents_eq (const struct value *val1, int offset1, + const struct value *val2, int offset2, + int length); + +/* Read LENGTH bytes of memory starting at MEMADDR into BUFFER, which + is (or will be copied to) VAL's contents buffer offset by + EMBEDDED_OFFSET (that is, to &VAL->contents[EMBEDDED_OFFSET]). + Marks value contents ranges as unavailable if the corresponding + memory is likewise unavailable. STACK indicates whether the memory + is known to be stack memory. */ + +extern void read_value_memory (struct value *val, int embedded_offset, + int stack, CORE_ADDR memaddr, + gdb_byte *buffer, size_t length); + #include "symtab.h" @@ -380,11 +458,25 @@ 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 int unpack_value_bits_as_long (struct type *field_type, + const gdb_byte *valaddr, + int embedded_offset, int bitpos, + int bitsize, + const struct value *original_value, + LONGEST *result); + extern LONGEST unpack_field_as_long (struct type *type, const gdb_byte *valaddr, int fieldno); +extern int unpack_value_field_as_long (struct type *type, const gdb_byte *valaddr, + int embedded_offset, int fieldno, + const struct value *val, LONGEST *result); + +extern struct value *value_field_bitfield (struct type *type, int fieldno, + const gdb_byte *valaddr, + int embedded_offset, + const struct value *val); extern void pack_long (gdb_byte *buf, struct type *type, LONGEST num); @@ -394,6 +486,7 @@ 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_history_ref (char *, char **); extern struct value *value_at (struct type *type, CORE_ADDR addr); extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr); @@ -401,18 +494,23 @@ 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 *value_from_contents (struct type *, const gdb_byte *); 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); @@ -428,6 +526,12 @@ extern struct value *read_var_value (struct symbol *var, 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 void value_contents_copy (struct value *dst, int dst_offset, + struct value *src, int src_offset, + int length); +extern void value_contents_copy_raw (struct value *dst, int dst_offset, + struct value *src, int src_offset, + int length); extern struct value *allocate_repeat_value (struct type *type, int count); @@ -497,7 +601,7 @@ extern struct fn_field *value_find_oload_method_list (struct value **, 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, @@ -528,7 +632,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); @@ -578,8 +682,6 @@ extern struct type *parse_and_eval_type (char *p, int length); extern CORE_ADDR parse_and_eval_address (char *exp); -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, @@ -632,7 +734,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, @@ -654,7 +758,7 @@ extern int binop_user_defined_p (enum exp_opcode op, struct value *arg1, 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 int destructor_name_p (const char *name, struct type *type); extern void value_incref (struct value *val); @@ -666,6 +770,8 @@ 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, @@ -752,8 +858,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);