aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2020-04-24 13:40:31 -0600
committerTom Tromey <tromey@adacore.com>2020-04-24 13:40:31 -0600
commit61122aa9ed4096c3d85b01d52a0c0f67fb441533 (patch)
treee34746e3c11ec6021d3031212d77aa38ef4c969d
parentef83a141a291474f1364d6c64ee7a207b96b8e19 (diff)
downloadbinutils-61122aa9ed4096c3d85b01d52a0c0f67fb441533.zip
binutils-61122aa9ed4096c3d85b01d52a0c0f67fb441533.tar.gz
binutils-61122aa9ed4096c3d85b01d52a0c0f67fb441533.tar.bz2
Allow DWARF expression to push the initial address
Some DWARF expressions must be evaluated by first pushing the object address onto the evaluation stack. This patch adds this ability. This functionality is not used yet, but it will be used in a later patch. This is split out for easier review and also because it improved the patch series ordering. gdb/ChangeLog 2020-04-24 Tom Tromey <tromey@adacore.com> * dwarf2/loc.c (dwarf2_locexpr_baton_eval): Add "push_initial_value" parameter. (dwarf2_evaluate_property): Likewise. * dwarf2/loc.h (dwarf2_evaluate_property): Update.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/dwarf2/loc.c15
-rw-r--r--gdb/dwarf2/loc.h8
3 files changed, 24 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b512880..5db26a6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2020-04-24 Tom Tromey <tromey@adacore.com>
+ * dwarf2/loc.c (dwarf2_locexpr_baton_eval): Add
+ "push_initial_value" parameter.
+ (dwarf2_evaluate_property): Likewise.
+ * dwarf2/loc.h (dwarf2_evaluate_property): Update.
+
+2020-04-24 Tom Tromey <tromey@adacore.com>
+
* gdbtypes.c (is_dynamic_type_internal): Check for variant parts.
(variant::matches, compute_variant_fields_recurse)
(compute_variant_fields_inner, compute_variant_fields): New
diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c
index b9456bc..8df655f 100644
--- a/gdb/dwarf2/loc.c
+++ b/gdb/dwarf2/loc.c
@@ -2388,13 +2388,16 @@ dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame,
that the dwarf expression only produces a single CORE_ADDR. FRAME is the
frame in which the expression is evaluated. ADDR is a context (location of
a variable) and might be needed to evaluate the location expression.
- Returns 1 on success, 0 otherwise. */
+ PUSH_INITIAL_VALUE is true if ADDR should be pushed on the stack
+ before evaluating the expression; this is required by certain
+ forms of DWARF expression. Returns 1 on success, 0 otherwise. */
static int
dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
struct frame_info *frame,
CORE_ADDR addr,
- CORE_ADDR *valp)
+ CORE_ADDR *valp,
+ bool push_initial_value)
{
struct objfile *objfile;
@@ -2414,6 +2417,9 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
ctx.ref_addr_size = dlbaton->per_cu->ref_addr_size ();
ctx.offset = dlbaton->per_cu->text_offset ();
+ if (push_initial_value)
+ ctx.push_address (addr, false);
+
try
{
ctx.eval (dlbaton->data, dlbaton->size);
@@ -2462,7 +2468,8 @@ bool
dwarf2_evaluate_property (const struct dynamic_prop *prop,
struct frame_info *frame,
const struct property_addr_info *addr_stack,
- CORE_ADDR *value)
+ CORE_ADDR *value,
+ bool push_initial_value)
{
if (prop == NULL)
return false;
@@ -2480,7 +2487,7 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop,
if (dwarf2_locexpr_baton_eval (&baton->locexpr, frame,
addr_stack ? addr_stack->addr : 0,
- value))
+ value, push_initial_value))
{
if (baton->locexpr.is_reference)
{
diff --git a/gdb/dwarf2/loc.h b/gdb/dwarf2/loc.h
index a59d3f9..6ff9b79 100644
--- a/gdb/dwarf2/loc.h
+++ b/gdb/dwarf2/loc.h
@@ -92,12 +92,16 @@ struct property_addr_info
be NULL.
Returns true if PROP could be converted and the static value is passed
- back into VALUE, otherwise returns false. */
+ back into VALUE, otherwise returns false.
+
+ If PUSH_INITIAL_VALUE is true, then the top value of ADDR_STACK
+ will be pushed before evaluating a location expression. */
bool dwarf2_evaluate_property (const struct dynamic_prop *prop,
struct frame_info *frame,
const struct property_addr_info *addr_stack,
- CORE_ADDR *value);
+ CORE_ADDR *value,
+ bool push_initial_value = false);
/* A helper for the compiler interface that compiles a single dynamic
property to C code.