X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fvalue.h;h=379cddafbe7fa8064110d7595cf296ca0b3127e1;hb=3d3a078e98caa5c9360cc35e4a5270bfd0545d24;hp=96c9c216e93ca0c42c353fb402a33986de440bb7;hpb=3ea16160a66e0e3bc59842e27e41890411729a86;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/value.h b/gdb/value.h index 96c9c216e9..379cddafbe 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -1,6 +1,6 @@ /* Definitions for values of C expressions, for GDB. - Copyright (C) 1986-2019 Free Software Foundation, Inc. + Copyright (C) 1986-2021 Free Software Foundation, Inc. This file is part of GDB. @@ -23,6 +23,7 @@ #include "frame.h" /* For struct frame_id. */ #include "extension.h" #include "gdbsupport/gdb_ref_ptr.h" +#include "gmp-utils.h" struct block; struct expression; @@ -146,8 +147,8 @@ extern LONGEST value_bitsize (const struct value *); extern void set_value_bitsize (struct value *, LONGEST 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. */ + little-endian targets, it is the position of the LSB. For + big-endian targets, it is the position of the MSB. */ extern LONGEST value_bitpos (const struct value *); extern void set_value_bitpos (struct value *, LONGEST bit); @@ -302,20 +303,6 @@ extern struct value *allocate_computed_value (struct type *type, 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, - LONGEST 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. */ @@ -434,7 +421,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, - const 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 @@ -488,7 +475,9 @@ 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. + ORIGINAL_VAL are the type and value of the original reference or + pointer. ORIGINAL_VALUE_ADDRESS is the address within VALUE, that is + the address that was dereferenced. Note, that VALUE is modified by this function. @@ -497,7 +486,8 @@ extern struct value *coerce_ref_if_computed (const struct value *arg); extern struct value * readjust_indirect_value_type (struct value *value, struct type *enc_type, const struct type *original_type, - const struct value *original_val); + struct value *original_val, + CORE_ADDR original_value_address); /* Convert a REF to the object referenced. */ @@ -651,6 +641,27 @@ extern CORE_ADDR unpack_pointer (struct type *type, const gdb_byte *valaddr); extern LONGEST unpack_field_as_long (struct type *type, const gdb_byte *valaddr, int fieldno); + +/* Unpack a bitfield of the specified FIELD_TYPE, from the object at + VALADDR, and store the result in *RESULT. + The bitfield starts at BITPOS bits and contains BITSIZE bits; if + BITSIZE is zero, then the length is taken from FIELD_TYPE. + + Extracting bits depends on endianness of the machine. Compute the + number of least significant bits to discard. For big endian machines, + we compute the total number of bits in the anonymous object, subtract + off the bit count from the MSB of the object to the MSB of the + bitfield, then the size of the bitfield, which leaves the LSB discard + count. For little endian machines, the discard count is simply the + number of bits from the LSB of the anonymous object to the LSB of the + bitfield. + + If the field is signed, we also do sign extension. */ + +extern LONGEST unpack_bits_as_long (struct type *field_type, + const gdb_byte *valaddr, + LONGEST bitpos, LONGEST bitsize); + extern int unpack_value_field_as_long (struct type *type, const gdb_byte *valaddr, LONGEST embedded_offset, int fieldno, const struct value *val, LONGEST *result); @@ -723,18 +734,11 @@ extern struct value *read_var_value (struct symbol *var, const struct block *var_block, struct frame_info *frame); -extern struct value *default_read_var_value (struct symbol *var, - const struct block *var_block, - struct frame_info *frame); - extern struct value *allocate_value (struct type *type); extern struct value *allocate_value_lazy (struct type *type); extern void value_contents_copy (struct value *dst, LONGEST dst_offset, struct value *src, LONGEST src_offset, LONGEST length); -extern void value_contents_copy_raw (struct value *dst, LONGEST dst_offset, - struct value *src, LONGEST src_offset, - LONGEST length); extern struct value *allocate_repeat_value (struct type *type, int count); @@ -822,7 +826,7 @@ extern struct value *value_neg (struct value *arg1); extern struct value *value_complement (struct value *arg1); extern struct value *value_struct_elt (struct value **argp, - struct value **args, + gdb::optional> args, const char *name, int *static_memfuncp, const char *err); @@ -899,16 +903,16 @@ extern int using_struct_return (struct gdbarch *gdbarch, struct value *function, struct type *value_type); -extern struct value *evaluate_expression (struct expression *exp); +/* Evaluate the expression EXP. If set, EXPECT_TYPE is passed to the + outermost operation's evaluation. This is ignored by most + operations, but may be used, e.g., to determine the type of an + otherwise untyped symbol. The caller should not assume that the + returned value has this type. */ -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_expression (struct expression *exp, + struct type *expect_type = nullptr); -extern struct value *evaluate_subexpression_type (struct expression *exp, - int subexp); +extern struct value *evaluate_type (struct expression *exp); extern value *evaluate_var_value (enum noside noside, const block *blk, symbol *var); @@ -917,23 +921,18 @@ extern value *evaluate_var_msym_value (enum noside noside, struct objfile *objfile, minimal_symbol *msymbol); -extern value *eval_skip_value (expression *exp); - -extern void fetch_subexp_value (struct expression *exp, int *pc, +namespace expr { class operation; }; +extern void fetch_subexp_value (struct expression *exp, + expr::operation *op, struct value **valp, struct value **resultp, std::vector *val_chain, - int preserve_errors); - -extern const char *extract_field_op (struct expression *exp, int *subexp); - -extern struct value *evaluate_subexp_with_coercion (struct expression *, - int *, enum noside); + bool preserve_errors); extern struct value *parse_and_eval (const char *exp); extern struct value *parse_to_comma_and_eval (const char **expp); -extern struct type *parse_and_eval_type (char *p, int length); +extern struct type *parse_and_eval_type (const char *p, int length); extern CORE_ADDR parse_and_eval_address (const char *exp); @@ -1097,13 +1096,6 @@ extern void value_print_array_elements (struct value *val, extern std::vector value_release_to_mark (const struct value *mark); -extern void val_print (struct type *type, - LONGEST embedded_offset, CORE_ADDR address, - struct ui_file *stream, int recurse, - struct value *val, - 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, @@ -1123,7 +1115,7 @@ extern void print_variable_and_value (const char *name, extern void typedef_print (struct type *type, struct symbol *news, struct ui_file *stream); -extern char *internalvar_name (const struct internalvar *var); +extern const char *internalvar_name (const struct internalvar *var); extern void preserve_values (struct objfile *); @@ -1145,9 +1137,21 @@ extern struct value *varying_to_slice (struct value *); extern struct value *value_slice (struct value *, int, int); +/* Create a complex number. The type is the complex type; the values + are cast to the underlying scalar type before the complex number is + created. */ + extern struct value *value_literal_complex (struct value *, struct value *, struct type *); +/* Return the real part of a complex value. */ + +extern struct value *value_real_part (struct value *value); + +/* Return the imaginary part of a complex value. */ + +extern struct value *value_imaginary_part (struct value *value); + extern struct value *find_function_in_inferior (const char *, struct objfile **); @@ -1187,7 +1191,7 @@ struct value *call_internal_function (struct gdbarch *gdbarch, struct value *function, int argc, struct value **argv); -char *value_internal_function_name (struct value *); +const char *value_internal_function_name (struct value *); /* Build a value wrapping and representing WORKER. The value takes ownership of the xmethod_worker object. */ @@ -1200,16 +1204,12 @@ extern struct type *result_type_of_xmethod (struct value *method, extern struct value *call_xmethod (struct value *method, gdb::array_view argv); -/* Given a discriminated union type and some corresponding value - contents, this will return the field index of the currently active - variant. This will throw an exception if no active variant can be - found. */ - -extern int value_union_variant (struct type *union_type, - const gdb_byte *contents); - /* Destroy the values currently allocated. This is called when GDB is exiting (e.g., on quit_force). */ extern void finalize_values (); +/* Convert VALUE to a gdb_mpq. The caller must ensure that VALUE is + of floating-point, fixed-point, or integer type. */ +extern gdb_mpq value_to_gdb_mpq (struct value *value); + #endif /* !defined (VALUE_H) */