From 7d5697f9e27f79e1decc1215f33088cee9f7d863 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 30 Oct 2016 20:45:08 -0600 Subject: Fix dwarf_expr_context method regressions This fixes some regressions found in the patch to convert dwarf_expr_context to use methods. Specifically: * get_base_type could erroneously throw; this was rewritten to move the size checks into the only spot needing them. * Previously the "symbol needs frame" implementation reused th "cfa" function for the get_frame_pc slot; this reimplements it under the correct name. * Not enough members were saved and restored in one implementation of push_dwarf_reg_entry_value; this patch fixes this oversight and also takes the opportunity to remove an extraneous structure definition. 2016-11-02 Tom Tromey * dwarf2loc.c (dwarf_evaluate_loc_desc::get_base_type): Rename from impl_get_base_type. Rewrite. (struct dwarf_expr_baton): Remove. (dwarf_evaluate_loc_desc::push_dwarf_reg_entry_value): Save and restore more fields. (symbol_needs_eval_context::get_frame_pc): New method. * dwarf2expr.h (dwarf_expr_context::get_base_type): Now public, virtual. (dwarf_expr_context::impl_get_base_type): Remove. * dwarf2expr.c (dwarf_expr_context::get_base_type): Remove. --- gdb/dwarf2loc.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'gdb/dwarf2loc.c') diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 6f25314..93aec1f 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -515,10 +515,14 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context per_cu_dwarf_call (this, die_offset, per_cu); } - /* Callback function for dwarf2_evaluate_loc_desc. */ - struct type *impl_get_base_type (cu_offset die_offset) OVERRIDE + struct type *get_base_type (cu_offset die_offset, int size) OVERRIDE { - return dwarf2_get_die_type (die_offset, per_cu); + struct type *result = dwarf2_get_die_type (die_offset, per_cu); + if (result == NULL) + error (_("Could not find type for DW_OP_GNU_const_type")); + if (size != 0 && TYPE_LENGTH (result) != size) + error (_("DW_OP_GNU_const_type has different sizes for type and data")); + return result; } /* Callback function for dwarf2_evaluate_loc_desc. @@ -553,7 +557,6 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context { struct frame_info *caller_frame; struct dwarf2_per_cu_data *caller_per_cu; - struct dwarf_expr_baton baton_local; struct call_site_parameter *parameter; const gdb_byte *data_src; size_t size; @@ -570,17 +573,20 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context throw_error (NO_ENTRY_VALUE_ERROR, _("Cannot resolve DW_AT_GNU_call_site_data_value")); - baton_local.frame = caller_frame; - baton_local.per_cu = caller_per_cu; - baton_local.obj_address = 0; + scoped_restore save_frame = make_scoped_restore (&this->frame, + caller_frame); + scoped_restore save_per_cu = make_scoped_restore (&this->per_cu, + caller_per_cu); + scoped_restore save_obj_addr = make_scoped_restore (&this->obj_address, + (CORE_ADDR) 0); scoped_restore save_arch = make_scoped_restore (&this->gdbarch); this->gdbarch - = get_objfile_arch (dwarf2_per_cu_objfile (baton_local.per_cu)); + = get_objfile_arch (dwarf2_per_cu_objfile (per_cu)); scoped_restore save_addr_size = make_scoped_restore (&this->addr_size); - this->addr_size = dwarf2_per_cu_addr_size (baton_local.per_cu); + this->addr_size = dwarf2_per_cu_addr_size (per_cu); scoped_restore save_offset = make_scoped_restore (&this->offset); - this->offset = dwarf2_per_cu_text_offset (baton_local.per_cu); + this->offset = dwarf2_per_cu_text_offset (per_cu); this->eval (data_src, size); } @@ -2707,6 +2713,12 @@ class symbol_needs_eval_context : public dwarf_expr_context return 1; } + CORE_ADDR get_frame_pc () OVERRIDE + { + needs = SYMBOL_NEEDS_FRAME; + return 1; + } + /* Thread-local accesses require registers, but not a frame. */ CORE_ADDR get_tls_address (CORE_ADDR offset) OVERRIDE { -- cgit v1.1