summaryrefslogtreecommitdiff
path: root/gdb/findvar.c
diff options
context:
space:
mode:
authoraburgess <aburgess>2012-09-21 17:17:18 +0000
committeraburgess <aburgess>2012-09-21 17:17:18 +0000
commit6f8aebfd5e1ee271e6546d15f567d75aa092aefd (patch)
treee321d1e4cdbedf32a35b72efc0d1672ab4c826f2 /gdb/findvar.c
parent2807575223e4d2d0fe4aa0239b7e61a9988bc081 (diff)
downloadgdb-6f8aebfd5e1ee271e6546d15f567d75aa092aefd.tar.gz
http://sourceware.org/ml/gdb-patches/2012-08/msg00715.html
gdb/ChangeLog * findvar.c (read_frame_register_value): Mark the result value as optimized out if any of the input registers have been optimized out. gdb/testsuite/ChangeLog * gdb.dwarf2/dw2-op-out-param.S: New file. * gdb.dwarf2/dw2-op-out-param.exp: New file.
Diffstat (limited to 'gdb/findvar.c')
-rw-r--r--gdb/findvar.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 66bcebee348..ec9dde7810d 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -677,7 +677,10 @@ default_value_from_register (struct type *type, int regnum,
/* VALUE must be an lval_register value. If regnum is the value's
associated register number, and len the length of the values type,
read one or more registers in FRAME, starting with register REGNUM,
- until we've read LEN bytes. */
+ until we've read LEN bytes.
+
+ If any of the registers we try to read are optimized out, then mark the
+ complete resulting value as optimized out. */
void
read_frame_register_value (struct value *value, struct frame_info *frame)
@@ -703,6 +706,12 @@ read_frame_register_value (struct value *value, struct frame_info *frame)
struct value *regval = get_frame_register_value (frame, regnum);
int reg_len = TYPE_LENGTH (value_type (regval)) - reg_offset;
+ if (value_optimized_out (regval))
+ {
+ set_value_optimized_out (value, 1);
+ break;
+ }
+
/* If the register length is larger than the number of bytes
remaining to copy, then only copy the appropriate bytes. */
if (reg_len > len)