aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2loc.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2016-10-30 20:45:08 -0600
committerTom Tromey <tom@tromey.com>2016-11-02 16:01:38 -0600
commit7d5697f9e27f79e1decc1215f33088cee9f7d863 (patch)
tree7ed7870c449ffcde146aaa2f559a1a72c82698ab /gdb/dwarf2loc.c
parent47acf0bd9faef8634d242e19ec3b7f784d10ba76 (diff)
downloadgdb-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.c32
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
{