X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdwarf2loc.c;h=99cac03a54745c35f979de1dba349d475598291f;hb=452f10a186cdb18091f590315c55488b871812e3;hp=12951f546f88de331501207a1d4ac44cafad7a36;hpb=230d2906b9d1d009b22fd526181bf43e1084ed59;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 12951f546f..99cac03a54 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -1,6 +1,6 @@ /* DWARF 2 location expression support for GDB. - Copyright (C) 2003-2019 Free Software Foundation, Inc. + Copyright (C) 2003-2020 Free Software Foundation, Inc. Contributed by Daniel Jacobowitz, MontaVista Software, Inc. @@ -36,16 +36,15 @@ #include "dwarf2.h" #include "dwarf2expr.h" #include "dwarf2loc.h" +#include "dwarf2read.h" #include "dwarf2-frame.h" #include "compile/compile.h" -#include "common/selftest.h" +#include "gdbsupport/selftest.h" #include #include #include -#include "common/underlying.h" -#include "common/byte-vector.h" - -extern int dwarf_always_disassemble; +#include "gdbsupport/underlying.h" +#include "gdbsupport/byte-vector.h" static struct value *dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, @@ -525,7 +524,7 @@ func_get_frame_base_dwarf_block (struct symbol *framefunc, CORE_ADDR pc, if (*length == 0) error (_("Could not find the frame base for \"%s\"."), - SYMBOL_NATURAL_NAME (framefunc)); + framefunc->natural_name ()); } static CORE_ADDR @@ -636,7 +635,7 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context } /* Callback function for dwarf2_evaluate_loc_desc. - Fetch the address indexed by DW_OP_GNU_addr_index. */ + Fetch the address indexed by DW_OP_addrx or DW_OP_GNU_addr_index. */ CORE_ADDR get_addr_index (unsigned int index) override { @@ -801,7 +800,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch, _("DW_AT_call_target is not specified at %s in %s"), paddress (call_site_gdbarch, call_site->pc), (msym.minsym == NULL ? "???" - : MSYMBOL_PRINT_NAME (msym.minsym))); + : msym.minsym->print_name ())); } if (caller_frame == NULL) @@ -815,7 +814,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch, "available at %s in %s"), paddress (call_site_gdbarch, call_site->pc), (msym.minsym == NULL ? "???" - : MSYMBOL_PRINT_NAME (msym.minsym))); + : msym.minsym->print_name ())); } caller_arch = get_frame_arch (caller_frame); @@ -847,7 +846,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch, "at %s in %s"), physname, paddress (call_site_gdbarch, call_site->pc), (msym.minsym == NULL ? "???" - : MSYMBOL_PRINT_NAME (msym.minsym))); + : msym.minsym->print_name ())); } return BMSYMBOL_VALUE_ADDRESS (msym); @@ -935,7 +934,7 @@ func_verify_no_selftailcall (struct gdbarch *gdbarch, CORE_ADDR verify_addr) "function \"%s\" at %s can call itself via tail " "calls"), (msym.minsym == NULL ? "???" - : MSYMBOL_PRINT_NAME (msym.minsym)), + : msym.minsym->print_name ()), paddress (gdbarch, verify_addr)); } @@ -956,7 +955,7 @@ tailcall_dump (struct gdbarch *gdbarch, const struct call_site *call_site) fprintf_unfiltered (gdb_stdlog, " %s(%s)", paddress (gdbarch, addr), (msym.minsym == NULL ? "???" - : MSYMBOL_PRINT_NAME (msym.minsym))); + : msym.minsym->print_name ())); } @@ -1174,10 +1173,10 @@ call_site_find_chain_1 (struct gdbarch *gdbarch, CORE_ADDR caller_pc, "callers or callees between caller function \"%s\" at %s " "and callee function \"%s\" at %s"), (msym_caller.minsym == NULL - ? "???" : MSYMBOL_PRINT_NAME (msym_caller.minsym)), + ? "???" : msym_caller.minsym->print_name ()), paddress (gdbarch, caller_pc), (msym_callee.minsym == NULL - ? "???" : MSYMBOL_PRINT_NAME (msym_callee.minsym)), + ? "???" : msym_callee.minsym->print_name ()), paddress (gdbarch, callee_pc)); } @@ -1209,7 +1208,7 @@ call_site_find_chain (struct gdbarch *gdbarch, CORE_ADDR caller_pc, return NULL; } else - throw_exception (e); + throw; } return retval; @@ -1277,7 +1276,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, gdbarch_bfd_arch_info (gdbarch)->printable_name, paddress (gdbarch, func_addr), (msym.minsym == NULL ? "???" - : MSYMBOL_PRINT_NAME (msym.minsym)), + : msym.minsym->print_name ()), gdbarch_bfd_arch_info (caller_gdbarch)->printable_name); } @@ -1290,7 +1289,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, "requires caller of %s (%s)"), paddress (gdbarch, func_addr), (msym.minsym == NULL ? "???" - : MSYMBOL_PRINT_NAME (msym.minsym))); + : msym.minsym->print_name ())); } caller_pc = get_frame_pc (caller_frame); call_site = call_site_for_pc (gdbarch, caller_pc); @@ -1306,9 +1305,9 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, _("DW_OP_entry_value resolving expects callee %s at %s " "but the called frame is for %s at %s"), (target_msym == NULL ? "???" - : MSYMBOL_PRINT_NAME (target_msym)), + : target_msym->print_name ()), paddress (gdbarch, target_addr), - func_msym == NULL ? "???" : MSYMBOL_PRINT_NAME (func_msym), + func_msym == NULL ? "???" : func_msym->print_name (), paddress (gdbarch, func_addr)); } @@ -1332,7 +1331,7 @@ dwarf_expr_reg_to_entry_parameter (struct frame_info *frame, throw_error (NO_ENTRY_VALUE_ERROR, _("Cannot find matching parameter " "at DW_TAG_call_site %s at %s"), paddress (gdbarch, caller_pc), - msym == NULL ? "???" : MSYMBOL_PRINT_NAME (msym)); + msym == NULL ? "???" : msym->print_name ()); } *per_cu_return = call_site->per_cu; @@ -1578,8 +1577,7 @@ rw_pieced_value (struct value *v, struct value *from) struct piece_closure *c = (struct piece_closure *) value_computed_closure (v); gdb::byte_vector buffer; - int bits_big_endian - = gdbarch_bits_big_endian (get_type_arch (value_type (v))); + bool bits_big_endian = type_byte_order (value_type (v)) == BFD_ENDIAN_BIG; if (from != NULL) { @@ -1602,7 +1600,7 @@ rw_pieced_value (struct value *v, struct value *from) bits_to_skip += (8 * value_offset (value_parent (v)) + value_bitpos (v)); if (from != NULL - && (gdbarch_byte_order (get_type_arch (value_type (from))) + && (type_byte_order (value_type (from)) == BFD_ENDIAN_BIG)) { /* Use the least significant bits of FROM. */ @@ -2185,7 +2183,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, return allocate_optimized_out_value (subobj_type); } else - throw_exception (ex); + throw; } if (ctx.pieces.size () > 0) @@ -2397,7 +2395,7 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton, return 0; } else - throw_exception (ex); + throw; } switch (ctx.location) @@ -2424,14 +2422,14 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton, /* See dwarf2loc.h. */ -int +bool dwarf2_evaluate_property (const struct dynamic_prop *prop, struct frame_info *frame, struct property_addr_info *addr_stack, CORE_ADDR *value) { if (prop == NULL) - return 0; + return false; if (frame == NULL && has_stack_frames ()) frame = get_selected_frame (NULL); @@ -2442,18 +2440,41 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, { const struct dwarf2_property_baton *baton = (const struct dwarf2_property_baton *) prop->data.baton; + gdb_assert (baton->property_type != NULL); if (dwarf2_locexpr_baton_eval (&baton->locexpr, frame, addr_stack ? addr_stack->addr : 0, value)) { - if (baton->referenced_type) + if (baton->locexpr.is_reference) { - struct value *val = value_at (baton->referenced_type, *value); - + struct value *val = value_at (baton->property_type, *value); *value = value_as_address (val); } - return 1; + else + { + gdb_assert (baton->property_type != NULL); + + struct type *type = check_typedef (baton->property_type); + if (TYPE_LENGTH (type) < sizeof (CORE_ADDR) + && !TYPE_UNSIGNED (type)) + { + /* If we have a valid return candidate and it's value + is signed, we have to sign-extend the value because + CORE_ADDR on 64bit machine has 8 bytes but address + size of an 32bit application is bytes. */ + const int addr_size + = (dwarf2_per_cu_addr_size (baton->locexpr.per_cu) + * TARGET_CHAR_BIT); + const CORE_ADDR neg_mask + = (~((CORE_ADDR) 0) << (addr_size - 1)); + + /* Check if signed bit is set and sign-extend values. */ + if (*value & neg_mask) + *value |= neg_mask; + } + } + return true; } } break; @@ -2470,12 +2491,12 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, data = dwarf2_find_location_expression (&baton->loclist, &size, pc); if (data != NULL) { - val = dwarf2_evaluate_loc_desc (baton->referenced_type, frame, data, + val = dwarf2_evaluate_loc_desc (baton->property_type, frame, data, size, baton->loclist.per_cu); if (!value_optimized_out (val)) { *value = value_as_address (val); - return 1; + return true; } } } @@ -2483,7 +2504,7 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, case PROP_CONST: *value = prop->data.const_val; - return 1; + return true; case PROP_ADDR_OFFSET: { @@ -2493,8 +2514,12 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, struct value *val; for (pinfo = addr_stack; pinfo != NULL; pinfo = pinfo->next) - if (pinfo->type == baton->referenced_type) - break; + { + /* This approach lets us avoid checking the qualifiers. */ + if (TYPE_MAIN_TYPE (pinfo->type) + == TYPE_MAIN_TYPE (baton->property_type)) + break; + } if (pinfo == NULL) error (_("cannot find reference address for offset property")); if (pinfo->valaddr != NULL) @@ -2505,11 +2530,11 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop, val = value_at (baton->offset_info.type, pinfo->addr + baton->offset_info.offset); *value = value_as_address (val); - return 1; + return true; } } - return 0; + return false; } /* See dwarf2loc.h. */ @@ -2642,7 +2667,7 @@ class symbol_needs_eval_context : public dwarf_expr_context push_address (0, 0); } - /* DW_OP_GNU_addr_index doesn't require a frame. */ + /* DW_OP_addrx and DW_OP_GNU_addr_index doesn't require a frame. */ CORE_ADDR get_addr_index (unsigned int index) override { @@ -2791,7 +2816,7 @@ access_memory (struct gdbarch *arch, struct agent_expr *expr, ULONGEST nbits) if (8 * nbytes == nbits) return; - if (gdbarch_bits_big_endian (arch)) + if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG) { /* On a bits-big-endian machine, we want the high-order NBITS. */ @@ -2841,7 +2866,7 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc, enum bfd_endian byte_order = gdbarch_byte_order (arch); ULONGEST bits_collected = 0; unsigned int addr_size_bits = 8 * addr_size; - int bits_big_endian = gdbarch_bits_big_endian (arch); + bool bits_big_endian = byte_order == BFD_ENDIAN_BIG; std::vector offsets (op_end - op_ptr, -1); @@ -3609,13 +3634,13 @@ locexpr_describe_location_piece (struct symbol *symbol, struct ui_file *stream, if (!b) error (_("No block found for address for symbol \"%s\"."), - SYMBOL_PRINT_NAME (symbol)); + symbol->print_name ()); framefunc = block_linkage_function (b); if (!framefunc) error (_("No function found for block for symbol \"%s\"."), - SYMBOL_PRINT_NAME (symbol)); + symbol->print_name ()); func_get_frame_base_dwarf_block (framefunc, addr, &base_data, &base_size); @@ -3629,7 +3654,7 @@ locexpr_describe_location_piece (struct symbol *symbol, struct ui_file *stream, if (buf_end != base_data + base_size) error (_("Unexpected opcode after " "DW_OP_breg%u for symbol \"%s\"."), - frame_reg, SYMBOL_PRINT_NAME (symbol)); + frame_reg, symbol->print_name ()); } else if (base_data[0] >= DW_OP_reg0 && base_data[0] <= DW_OP_reg31) { @@ -4086,6 +4111,7 @@ disassemble_dwarf_expression (struct ui_file *stream, fprintf_filtered (stream, " offset %s", phex_nz (ul, 4)); break; + case DW_OP_addrx: case DW_OP_GNU_addr_index: data = safe_read_uleb128 (data, end, &ul); ul = dwarf2_read_addr_index (per_cu, ul); @@ -4202,7 +4228,7 @@ locexpr_describe_location_1 (struct symbol *symbol, CORE_ADDR addr, if (bad || data > end) error (_("Corrupted DWARF2 expression for \"%s\"."), - SYMBOL_PRINT_NAME (symbol)); + symbol->print_name ()); } /* Print a natural-language description of SYMBOL to STREAM. This @@ -4255,7 +4281,7 @@ locexpr_generate_c_location (struct symbol *sym, string_file *stream, unsigned int addr_size = dwarf2_per_cu_addr_size (dlbaton->per_cu); if (dlbaton->size == 0) - error (_("symbol \"%s\" is optimized out"), SYMBOL_NATURAL_NAME (sym)); + error (_("symbol \"%s\" is optimized out"), sym->natural_name ()); compile_dwarf_expr_to_c (stream, result_name, sym, pc, gdbarch, registers_used, addr_size, @@ -4401,7 +4427,7 @@ loclist_describe_location (struct symbol *symbol, CORE_ADDR addr, case DEBUG_LOC_BUFFER_OVERFLOW: case DEBUG_LOC_INVALID_ENTRY: error (_("Corrupted DWARF expression for symbol \"%s\"."), - SYMBOL_PRINT_NAME (symbol)); + symbol->print_name ()); default: gdb_assert_not_reached ("bad debug_loc_kind"); } @@ -4468,7 +4494,7 @@ loclist_generate_c_location (struct symbol *sym, string_file *stream, data = dwarf2_find_location_expression (dlbaton, &size, pc); if (size == 0) - error (_("symbol \"%s\" is optimized out"), SYMBOL_NATURAL_NAME (sym)); + error (_("symbol \"%s\" is optimized out"), sym->natural_name ()); compile_dwarf_expr_to_c (stream, result_name, sym, pc, gdbarch, registers_used, addr_size,