X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=gdb%2Ffindvar.c;h=5cf1cd4137b8bdaf8621e03845a8ad9674cdc625;hb=6c2659886f7018fcca26ee0fc813bc9748fb8513;hp=2bc2095bf7bd8ef2787ed4a1a1db3292f06a7697;hpb=1841ee5d0300cf00022c8aadfe16725c5e86fe1d;p=thirdparty%2Fbinutils-gdb.git diff --git a/gdb/findvar.c b/gdb/findvar.c index 2bc2095bf7b..5cf1cd4137b 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -1,6 +1,6 @@ /* Find a variable's value in memory, for GDB, the GNU debugger. - Copyright (C) 1986-2017 Free Software Foundation, Inc. + Copyright (C) 1986-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -32,7 +32,7 @@ #include "objfiles.h" #include "language.h" #include "dwarf2loc.h" -#include "selftest.h" +#include "gdbsupport/selftest.h" /* Basic byte-swapping routines. All 'extract' functions return a host-format integer from a target-format integer at ADDR which is @@ -50,7 +50,7 @@ template T extract_integer (const gdb_byte *addr, int len, enum bfd_endian byte_order) { - T retval = 0; + typename std::make_unsigned::type retval = 0; const unsigned char *p; const unsigned char *startaddr = addr; const unsigned char *endaddr = startaddr + len; @@ -218,7 +218,7 @@ store_typed_address (gdb_byte *buf, struct type *type, CORE_ADDR addr) bytes. If SOURCE_SIZE is greater than DEST_SIZE, then truncate the most significant bytes. If SOURCE_SIZE is less than DEST_SIZE then either sign or zero extended according to IS_SIGNED. Values are stored in memory with - endianess BYTE_ORDER. */ + endianness BYTE_ORDER. */ void copy_integer_to_size (gdb_byte *dest, int dest_size, const gdb_byte *source, @@ -267,8 +267,7 @@ value_of_register (int regnum, struct frame_info *frame) /* User registers lie completely outside of the range of normal registers. Catch them early so that the target never sees them. */ - if (regnum >= gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch)) + if (regnum >= gdbarch_num_cooked_regs (gdbarch)) return value_of_user_reg (regnum, frame); reg_val = value_of_register_lazy (frame, regnum); @@ -287,8 +286,7 @@ value_of_register_lazy (struct frame_info *frame, int regnum) struct value *reg_val; struct frame_info *next_frame; - gdb_assert (regnum < (gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch))); + gdb_assert (regnum < gdbarch_num_cooked_regs (gdbarch)); gdb_assert (frame != NULL); @@ -311,7 +309,7 @@ CORE_ADDR unsigned_pointer_to_address (struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf) { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + enum bfd_endian byte_order = type_byte_order (type); return extract_unsigned_integer (buf, TYPE_LENGTH (type), byte_order); } @@ -320,7 +318,7 @@ CORE_ADDR signed_pointer_to_address (struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf) { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + enum bfd_endian byte_order = type_byte_order (type); return extract_signed_integer (buf, TYPE_LENGTH (type), byte_order); } @@ -331,7 +329,7 @@ void unsigned_address_to_pointer (struct gdbarch *gdbarch, struct type *type, gdb_byte *buf, CORE_ADDR addr) { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + enum bfd_endian byte_order = type_byte_order (type); store_unsigned_integer (buf, TYPE_LENGTH (type), byte_order, addr); } @@ -340,7 +338,7 @@ void address_to_signed_pointer (struct gdbarch *gdbarch, struct type *type, gdb_byte *buf, CORE_ADDR addr) { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + enum bfd_endian byte_order = type_byte_order (type); store_signed_integer (buf, TYPE_LENGTH (type), byte_order, addr); } @@ -448,7 +446,7 @@ follow_static_link (struct frame_info *frame, QUIT; /* If we don't know how to compute FRAME's base address, don't give up: - maybe the frame we are looking for is upper in the stace frame. */ + maybe the frame we are looking for is upper in the stack frame. */ if (framefunc != NULL && SYMBOL_BLOCK_OPS (framefunc) != NULL && SYMBOL_BLOCK_OPS (framefunc)->get_frame_base != NULL @@ -568,9 +566,9 @@ get_hosting_frame (struct symbol *var, const struct block *var_block, { if (BLOCK_FUNCTION (var_block) && !block_inlined_p (var_block) - && SYMBOL_PRINT_NAME (BLOCK_FUNCTION (var_block))) + && BLOCK_FUNCTION (var_block)->print_name ()) error (_("No frame is currently executing in block %s."), - SYMBOL_PRINT_NAME (BLOCK_FUNCTION (var_block))); + BLOCK_FUNCTION (var_block)->print_name ()); else error (_("No frame is currently executing in specified" " block")); @@ -603,7 +601,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, if (sym_need == SYMBOL_NEEDS_FRAME) gdb_assert (frame != NULL); else if (sym_need == SYMBOL_NEEDS_REGISTERS && !target_has_registers) - error (_("Cannot read `%s' without registers"), SYMBOL_PRINT_NAME (var)); + error (_("Cannot read `%s' without registers"), var->print_name ()); if (frame != NULL) frame = get_hosting_frame (var, var_block, frame); @@ -622,7 +620,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, /* Put the constant back in target format. */ v = allocate_value (type); store_signed_integer (value_contents_raw (v), TYPE_LENGTH (type), - gdbarch_byte_order (get_type_arch (type)), + type_byte_order (type), (LONGEST) SYMBOL_VALUE (var)); VALUE_LVAL (v) = not_lval; return v; @@ -632,7 +630,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, v = allocate_value (type); if (overlay_debugging) { - CORE_ADDR addr + addr = symbol_overlayed_address (SYMBOL_VALUE_ADDRESS (var), SYMBOL_OBJ_SECTION (symbol_objfile (var), var)); @@ -670,7 +668,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, addr = get_frame_args_address (frame); if (!addr) error (_("Unknown argument list address for `%s'."), - SYMBOL_PRINT_NAME (var)); + var->print_name ()); addr += SYMBOL_VALUE (var); break; @@ -682,7 +680,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, argref = get_frame_args_address (frame); if (!argref) error (_("Unknown argument list address for `%s'."), - SYMBOL_PRINT_NAME (var)); + var->print_name ()); argref += SYMBOL_VALUE (var); ref = value_at (lookup_pointer_type (type), argref); addr = value_as_address (ref); @@ -696,16 +694,16 @@ default_read_var_value (struct symbol *var, const struct block *var_block, case LOC_TYPEDEF: error (_("Cannot look up value of a typedef `%s'."), - SYMBOL_PRINT_NAME (var)); + var->print_name ()); break; case LOC_BLOCK: if (overlay_debugging) addr = symbol_overlayed_address - (BLOCK_START (SYMBOL_BLOCK_VALUE (var)), + (BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (var)), SYMBOL_OBJ_SECTION (symbol_objfile (var), var)); else - addr = BLOCK_START (SYMBOL_BLOCK_VALUE (var)); + addr = BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (var)); break; case LOC_REGISTER: @@ -723,7 +721,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, if (regval == NULL) error (_("Value of register variable not available for `%s'."), - SYMBOL_PRINT_NAME (var)); + var->print_name ()); addr = value_as_address (regval); } @@ -733,7 +731,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, if (regval == NULL) error (_("Value of register variable not available for `%s'."), - SYMBOL_PRINT_NAME (var)); + var->print_name ()); return regval; } } @@ -749,7 +747,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, struct obj_section *obj_section; memset (&lookup_data, 0, sizeof (lookup_data)); - lookup_data.name = SYMBOL_LINKAGE_NAME (var); + lookup_data.name = var->linkage_name (); gdbarch_iterate_over_objfiles_in_search_order (symbol_arch (var), @@ -769,7 +767,7 @@ default_read_var_value (struct symbol *var, const struct block *var_block, can't be NULL. */ gdb_assert (flavour_name != NULL); error (_("Missing %s symbol \"%s\"."), - flavour_name, SYMBOL_LINKAGE_NAME (var)); + flavour_name, var->linkage_name ()); } obj_section = MSYMBOL_OBJ_SECTION (lookup_data.result.objfile, msym); /* Relocate address, unless there is no section or the variable is @@ -789,11 +787,13 @@ default_read_var_value (struct symbol *var, const struct block *var_block, break; case LOC_OPTIMIZED_OUT: + if (is_dynamic_type (type)) + type = resolve_dynamic_type (type, NULL, /* Unused address. */ 0); return allocate_optimized_out_value (type); default: error (_("Cannot look up value of a botched symbol `%s'."), - SYMBOL_PRINT_NAME (var)); + var->print_name ()); break; } @@ -807,7 +807,7 @@ struct value * read_var_value (struct symbol *var, const struct block *var_block, struct frame_info *frame) { - const struct language_defn *lang = language_def (SYMBOL_LANGUAGE (var)); + const struct language_defn *lang = language_def (var->language ()); gdb_assert (lang != NULL); gdb_assert (lang->la_read_var_value != NULL); @@ -840,7 +840,7 @@ default_value_from_register (struct gdbarch *gdbarch, struct type *type, an integral number of registers. Otherwise, you need to do some fiddling with the last register copied here for little endian machines. */ - if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG + if (type_byte_order (type) == BFD_ENDIAN_BIG && len < register_size (gdbarch, regnum)) /* Big-endian, and we want less than full size. */ set_value_offset (value, register_size (gdbarch, regnum) - len); @@ -955,8 +955,7 @@ address_from_register (int regnum, struct frame_info *frame) struct type *type = builtin_type (gdbarch)->builtin_data_ptr; struct value *value; CORE_ADDR result; - int regnum_max_excl = (gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch)); + int regnum_max_excl = gdbarch_num_cooked_regs (gdbarch); if (regnum < 0 || regnum >= regnum_max_excl) error (_("Invalid register #%d, expecting 0 <= # < %d"), regnum, @@ -1004,7 +1003,6 @@ address_from_register (int regnum, struct frame_info *frame) result = value_as_address (value); release_value (value); - value_free (value); return result; } @@ -1090,8 +1088,9 @@ copy_integer_to_size_test () #endif +void _initialize_findvar (); void -_initialize_findvar (void) +_initialize_findvar () { #if GDB_SELF_TEST selftests::register_test