diff options
author | Tom Tromey <tom@tromey.com> | 2016-10-30 20:45:08 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2016-11-02 16:01:38 -0600 |
commit | 7d5697f9e27f79e1decc1215f33088cee9f7d863 (patch) | |
tree | 7ed7870c449ffcde146aaa2f559a1a72c82698ab /gdb/dwarf2loc.c | |
parent | 47acf0bd9faef8634d242e19ec3b7f784d10ba76 (diff) | |
download | gdb-7d5697f9e27f79e1decc1215f33088cee9f7d863.zip gdb-7d5697f9e27f79e1decc1215f33088cee9f7d863.tar.gz gdb-7d5697f9e27f79e1decc1215f33088cee9f7d863.tar.bz2 |
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 <tom@tromey.com>
* 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.
Diffstat (limited to 'gdb/dwarf2loc.c')
-rw-r--r-- | gdb/dwarf2loc.c | 32 |
1 files changed, 22 insertions, 10 deletions
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 { |