[2/3] Pass a frame to value_at_lazy and value_from_contents_and_address

Message ID 20230309-submit-static-link-fix-v1-2-23af27781fd2@adacore.com
State New
Headers
Series Handle dynamic properties and static link |

Commit Message

Tom Tromey March 9, 2023, 5:50 p.m. UTC
  This patch adds a 'frame' parameter to value_at_lazy and ensures that
it is passed down to the call to resolve_dynamic_type.  This required
also adding a frame parameter to value_from_contents_and_address.

Nothing passes this parameter to value_at_lazy yet, so this patch
should have no visible effect.
---
 gdb/valops.c | 11 ++++++-----
 gdb/value.c  |  6 ++++--
 gdb/value.h  | 14 ++++++++++----
 3 files changed, 20 insertions(+), 11 deletions(-)
  

Patch

diff --git a/gdb/valops.c b/gdb/valops.c
index 3a1b14c3d44..e14c5d05c06 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -982,14 +982,15 @@  value_one (struct type *type)
    e.g. in case the type is a variable length array.  */
 
 static struct value *
-get_value_at (struct type *type, CORE_ADDR addr, int lazy)
+get_value_at (struct type *type, CORE_ADDR addr, frame_info_ptr frame,
+	      int lazy)
 {
   struct value *val;
 
   if (check_typedef (type)->code () == TYPE_CODE_VOID)
     error (_("Attempt to dereference a generic pointer."));
 
-  val = value_from_contents_and_address (type, NULL, addr);
+  val = value_from_contents_and_address (type, NULL, addr, frame);
 
   if (!lazy)
     val->fetch_lazy ();
@@ -1015,7 +1016,7 @@  get_value_at (struct type *type, CORE_ADDR addr, int lazy)
 struct value *
 value_at (struct type *type, CORE_ADDR addr)
 {
-  return get_value_at (type, addr, 0);
+  return get_value_at (type, addr, nullptr, 0);
 }
 
 /* See value.h.  */
@@ -1034,9 +1035,9 @@  value_at_non_lval (struct type *type, CORE_ADDR addr)
    e.g. in case the type is a variable length array.  */
 
 struct value *
-value_at_lazy (struct type *type, CORE_ADDR addr)
+value_at_lazy (struct type *type, CORE_ADDR addr, frame_info_ptr frame)
 {
-  return get_value_at (type, addr, 1);
+  return get_value_at (type, addr, frame, 1);
 }
 
 void
diff --git a/gdb/value.c b/gdb/value.c
index 7b4df338304..253ed3d596d 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -3438,12 +3438,14 @@  value_from_contents_and_address_unresolved (struct type *type,
 struct value *
 value_from_contents_and_address (struct type *type,
 				 const gdb_byte *valaddr,
-				 CORE_ADDR address)
+				 CORE_ADDR address,
+				 frame_info_ptr frame)
 {
   gdb::array_view<const gdb_byte> view;
   if (valaddr != nullptr)
     view = gdb::make_array_view (valaddr, type->length ());
-  struct type *resolved_type = resolve_dynamic_type (type, view, address);
+  struct type *resolved_type = resolve_dynamic_type (type, view, address,
+						     &frame);
   struct type *resolved_type_no_typedef = check_typedef (resolved_type);
   struct value *v;
 
diff --git a/gdb/value.h b/gdb/value.h
index d83c4ab3674..02d66a80ef8 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -1077,7 +1077,13 @@  extern struct value *value_from_component (struct value *, struct type *,
 
 
 extern struct value *value_at (struct type *type, CORE_ADDR addr);
-extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr);
+
+/* Return a new value given a type and an address.  The new value is
+   lazy.  If FRAME is given, it is used when resolving dynamic
+   properties.  */
+
+extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr,
+				    frame_info_ptr frame = nullptr);
 
 /* Like value_at, but ensures that the result is marked not_lval.
    This can be important if the memory is "volatile".  */
@@ -1085,9 +1091,9 @@  extern struct value *value_at_non_lval (struct type *type, CORE_ADDR addr);
 
 extern struct value *value_from_contents_and_address_unresolved
      (struct type *, const gdb_byte *, CORE_ADDR);
-extern struct value *value_from_contents_and_address (struct type *,
-						      const gdb_byte *,
-						      CORE_ADDR);
+extern struct value *value_from_contents_and_address
+     (struct type *, const gdb_byte *, CORE_ADDR,
+      frame_info_ptr frame = nullptr);
 extern struct value *value_from_contents (struct type *, const gdb_byte *);
 
 extern struct value *default_value_from_register (struct gdbarch *gdbarch,