[4/9] Introduce value_at_non_lval

Message ID 20221007180120.1866772-5-tromey@adacore.com
State Committed
Commit 7f22044a6b7ce968aacd8b26f608370940ec158d
Series Fix "finish" with variably-sized types |

Commit Message

Tom Tromey Oct. 7, 2022, 6:01 p.m. UTC
  In some cases, while a value might be read from memory, gdb should not
record the value as being equivalent to that memory.

In Ada, the inferior call code will call ada_convert_actual -- and
here, if the argument is already in memory, that address will simply
be reused.  However, for a call like "f(g())", the result of "g" might
be on the stack and thus overwritten by the call to "f".

This patch introduces a new function that is like value_at but that
ensures that the result is non-lvalue.
 gdb/valops.c | 10 ++++++++++
 gdb/value.h  |  4 ++++
 2 files changed, 14 insertions(+)


diff --git a/gdb/valops.c b/gdb/valops.c
index de8a68888e4..be4ce025c89 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -1018,6 +1018,16 @@  value_at (struct type *type, CORE_ADDR addr)
   return get_value_at (type, addr, 0);
+/* See value.h.  */
+struct value *
+value_at_non_lval (struct type *type, CORE_ADDR addr)
+  struct value *result = value_at (type, addr);
+  VALUE_LVAL (result) = not_lval;
+  return result;
 /* Return a lazy value with type TYPE located at ADDR (cf. value_at).
    The type of the created value may differ from the passed type TYPE.
    Make sure to retrieve the returned values's new type after this call
diff --git a/gdb/value.h b/gdb/value.h
index 52752df1f4c..86e06a54d7d 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -690,6 +690,10 @@  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);
+/* Like value_at, but ensures that the result is marked not_lval.
+   This can be important if the memory is "volatile".  */
+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 *,