This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Consistent display of "<optimized out>"
- From: "Andrew Burgess" <aburgess at broadcom dot com>
- To: "gdb-patches at sourceware dot org" <gdb-patches at sourceware dot org>
- Date: Tue, 6 Aug 2013 14:08:46 +0100
- Subject: [PATCH] Consistent display of "<optimized out>"
In some cases we report optimized out registers as "*value not available*"
rather than "<optimized out>", the patch below makes this more consistent
in the case I've spotted.
Here's an example:
(gdb) up
#1 0x0000000000400800 in first_frame () at dw2-reg-undefined.c:27
27 in dw2-reg-undefined.c
(gdb) info registers rax
rax *value not available*
(gdb) p/x $rax
$1 = <optimized out>
After the patch the behaviour is now:
(gdb) up
#1 0x0000000000400800 in first_frame () at dw2-reg-undefined.c:27
27 in dw2-reg-undefined.c
(gdb) info registers rax
rax <optimized out>
(gdb) p/x $rax
$1 = <optimized out>
The behaviour for values that are unavailable is currently unchanged,
though I have a follow up patch for this too.
OK to apply?
Thanks,
Andrew
gdb/ChangeLog
2013-08-06 Andrew Burgess <aburgess@broadcom.com>
* infcmd.c (default_print_one_register_info): Add detection of
optimized out values.
(default_print_registers_info): Switch to using
get_frame_register_value.
gdb/testsuite/ChangeLog
2013-08-06 Andrew Burgess <aburgess@broadcom.com>
* gdb.dwarf2/dw2-reg-undefined.exp: Change pattern for info
register to "<optimized out>", and also print the registers.
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 154cde2..f6a5290 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -2033,6 +2033,12 @@ default_print_one_register_info (struct ui_file *file,
fprintf_filtered (file, "*value not available*\n");
return;
}
+ else if (value_optimized_out (val))
+ {
+ val_print_optimized_out (file);
+ fprintf_filtered (file, "\n");
+ return;
+ }
/* If virtual format is floating, print it that way, and in raw
hex. */
@@ -2107,9 +2113,6 @@ default_print_registers_info (struct gdbarch *gdbarch,
for (i = 0; i < numregs; i++)
{
- struct type *regtype;
- struct value *val;
-
/* Decide between printing all regs, non-float / vector regs, or
specific reg. */
if (regnum == -1)
@@ -2137,16 +2140,9 @@ default_print_registers_info (struct gdbarch *gdbarch,
|| *(gdbarch_register_name (gdbarch, i)) == '\0')
continue;
- regtype = register_type (gdbarch, i);
- val = allocate_value (regtype);
-
- /* Get the data in raw format. */
- if (! deprecated_frame_register_read (frame, i, value_contents_raw (val)))
- mark_value_bytes_unavailable (val, 0, TYPE_LENGTH (value_type (val)));
-
default_print_one_register_info (file,
gdbarch_register_name (gdbarch, i),
- val);
+ get_frame_register_value (frame, i));
}
}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-reg-undefined.exp b/gdb/testsuite/gdb.dwarf2/dw2-reg-undefined.exp
index 7b7b4d1..4686648 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-reg-undefined.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-reg-undefined.exp
@@ -38,22 +38,34 @@ if ![runto stop_frame] {
gdb_test "bt" "#0 (0x\[0-9a-f\]+ in )?stop_frame \[^\r\n\]*\r\n#1 \[^\r\n\]*first_frame \[^\r\n\]*\r\n#2 \[^\r\n\]*main\[^\r\n\]*" \
"backtrace from stop_frame"
-set value_pattern "0x\[0-9a-f\]+\\s+\[0-9\]+"
-set opt_out_pattern "\\*value not available\\*"
-
for {set f 0} {$f < 3} {incr f} {
if {${f} == 0} {
- set pattern_rax_rbx_rcx ${value_pattern}
- set pattern_r8_r9 ${value_pattern}
+ set pattern_rax_rbx_rcx_print "$hex"
+ set pattern_rax_rbx_rcx_info "$hex\\s+$decimal"
+ set pattern_r8_r9_print "$hex"
+ set pattern_r8_r9_info "$hex\\s+$decimal"
} else {
- set pattern_rax_rbx_rcx ${opt_out_pattern}
- set pattern_r8_r9 ${value_pattern}
+ set pattern_rax_rbx_rcx_print "<optimized out>"
+ set pattern_rax_rbx_rcx_info "<optimized out>"
+ set pattern_r8_r9_print "$hex"
+ set pattern_r8_r9_info "$hex\\s+$decimal"
}
# Select frame.
gdb_test "frame ${f}" "#${f}.*" "Switch to frame ${f}"
+ gdb_test "p/x \$rax" ".*$pattern_rax_rbx_rcx_print.*" \
+ "print \$rax in frame ${f}"
+ gdb_test "p/x \$rbx" "$pattern_rax_rbx_rcx_print" \
+ "print \$rbx in frame ${f}"
+ gdb_test "p/x \$rcx" "$pattern_rax_rbx_rcx_print" \
+ "print \$rcx in frame ${f}"
+
+ gdb_test "p/x \$r8" "$pattern_r8_r9_print" "print \$r8 in frame ${f}"
+ gdb_test "p/x \$r9" "$pattern_r8_r9_print" "print \$r9 in frame ${f}"
+
+
# Display register values.
- gdb_test "info registers rax rbx rcx r8 r9" "rax\\s+${pattern_rax_rbx_rcx}\\s*\r\nrbx\\s+${pattern_rax_rbx_rcx}\\s*\r\nrcx\\s+${pattern_rax_rbx_rcx}\\s*\r\nr8\\s+${pattern_r8_r9}\\s*\r\nr9\\s+${pattern_r8_r9}\\s*" \
+ gdb_test "info registers rax rbx rcx r8 r9" "rax\\s+${pattern_rax_rbx_rcx_info}\\s*\r\nrbx\\s+${pattern_rax_rbx_rcx_info}\\s*\r\nrcx\\s+${pattern_rax_rbx_rcx_info}\\s*\r\nr8\\s+${pattern_r8_r9_info}\\s*\r\nr9\\s+${pattern_r8_r9_info}\\s*" \
"Check values of rax, rbx, rcx, r8, r9 in frame ${f}"
}