[PATCH 07/43] Move get_object_address to dwarf_expr_context

Zoran Zaric via Gdb-patches
2021-03-01T14:46:58Z

Following the idea of merging the evaluators, the get_object_address
and can be moved from dwarf_expr_executor and dwarf_evaluate_loc_desc
classes to their base class dwarf_expr_context.

gdb/ChangeLog:

* dwarf2/expr.c (dwarf_expr_context::get_object_address): Move
from dwarf_evaluate_loc_desc.
(class dwarf_expr_context): Add object address member to
dwarf_expr_context.
* dwarf2/expr.h (dwarf_expr_context::get_frame_pc): Remove
method.
* dwarf2/frame.c (dwarf_expr_executor::get_object_address):
Remove method.
* dwarf2/loc.c (dwarf_evaluate_loc_desc::get_object_address):
move to dwarf_expr_context.
(class dwarf_evaluate_loc_desc): Move object address member to
dwarf_expr_context.
---
gdb/dwarf2/expr.h | 10 +++++++++-
gdb/dwarf2/frame.c | 5 -----
gdb/dwarf2/loc.c | 12 ------------
3 files changed, 9 insertions(+), 18 deletions(-)

diff --git a/gdb/dwarf2/expr.h b/gdb/dwarf2/expr.h
index 9510dfe33d4..b25b2315dd9 100644
--- a/gdb/dwarf2/expr.h
+++ b/gdb/dwarf2/expr.h
@@ -192,6 +192,9 @@ struct dwarf_expr_context
/* Compilation unit used for the evaluation. */
struct dwarf2_per_cu_data *per_cu = nullptr;

+ /* Object address used for the evaluation. */
+ CORE_ADDR obj_address = 0;
+
/* Read LENGTH bytes at ADDR into BUF. */
virtual void read_mem (gdb_byte *buf, CORE_ADDR addr, size_t length) = 0;

@@ -204,7 +207,12 @@ struct dwarf_expr_context
int deref_size) = 0;

/* Return the `object address' for DW_OP_push_object_address. */
- virtual CORE_ADDR get_object_address () = 0;
+ virtual CORE_ADDR get_object_address ()
+ {
+ if (obj_address == 0)
+ error (_("Location address is not set."));
+ return obj_address;
+ }

private:

diff --git a/gdb/dwarf2/frame.c b/gdb/dwarf2/frame.c
index f9f78f472cb..b3f0888e239 100644
--- a/gdb/dwarf2/frame.c
+++ b/gdb/dwarf2/frame.c
@@ -243,11 +243,6 @@ class dwarf_expr_executor : public dwarf_expr_context
invalid ("DW_OP_entry_value");
}

- CORE_ADDR get_object_address () override
- {
- invalid ("DW_OP_push_object_address");
- }
-
private:

void invalid (const char *op) ATTRIBUTE_NORETURN
diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c
index 6b0fd4c8a02..c716c3a7858 100644
--- a/gdb/dwarf2/loc.c
+++ b/gdb/dwarf2/loc.c
@@ -632,18 +632,6 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context
: dwarf_expr_context (per_objfile)
{}

- CORE_ADDR obj_address;
-
- /* Callback function for get_object_address. Return the address of the VLA
- object. */
-
- CORE_ADDR get_object_address () override
- {
- if (obj_address == 0)
- error (_("Location address is not set."));
- return obj_address;
- }
-
/* Execute DWARF block of call_site_parameter which matches KIND and
KIND_U. Choose DEREF_SIZE value of that parameter. Search
caller of this objects's frame.
--
2.17.1