This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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}"
 }



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]