From 7f22044a6b7ce968aacd8b26f608370940ec158d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 9 Sep 2022 12:50:33 -0600 Subject: [PATCH] Introduce value_at_non_lval 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 5b817179df7..c5b16f8d400 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1019,6 +1019,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 089af59fbd8..1e80b74b41f 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -711,6 +711,10 @@ extern struct value *value_from_component_bitsize (struct value *whole, 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 *, -- 2.30.2