Re: PING: Re: [PATCH] Print for unavailable registers

Andrew Burgess
2013-10-16T14:26:31Z

On 18/09/2013 5:06 PM, Pedro Alves wrote:

>> Index: ./gdb/infcmd.c
>> ===================================================================
>> RCS file: /cvs/src/src/gdb/infcmd.c,v
>> retrieving revision 1.335
>> diff -u -p -r1.335 infcmd.c
>> --- ./gdb/infcmd.c 18 Sep 2013 14:02:31 -0000 1.335
>> +++ ./gdb/infcmd.c 18 Sep 2013 14:43:13 -0000
>> @@ -2030,7 +2030,8 @@ default_print_one_register_info (struct
>>
>> if (!value_entirely_available (val))
>> {
>> - fprintf_filtered (file, "*value not available*\n");
>> + val_print_unavailable (file);
>> + fprintf_filtered (file, "\n");
>> return;
>> }
>> else if (value_optimized_out (val))
>
> Why do we do this instead of just deferring to val_print though?
> val_print would be able to print partially available registers,
> for instance.
>
> (We'd need to do something about the "raw" printing bits below
> though.)

OK that's a reasonable point. I've rewritten this patch to make use
of the val_print call to print the <not-saved> / <unavailable>.

For now I unconditionally skip the second attempt to print the value,
the "raw" form, for optimized-out and unavailable values, we might
be able to do better in the future but I was keen to avoid output
like this: "rax: <unavailable> <unavailable>" with the
<unavailable> being repeated. If the value of a register is
partially unavailable, and so we did manage to print something then
it might make sense to try and print the raw form...

Is this OK to apply?

Thanks,
Andrew

gdb/ChangeLog

2013-10-16 Andrew Burgess <aburgess@broadcom.com>

* infcmd.c (default_print_one_register_info): Use val_print to
print all values even optimized out or unavailable ones. Don't
try to print a raw form of optimized out or unavailable values.

gdb/testsuite/ChangeLog

2013-10-16 Andrew Burgess <aburgess@broadcom.com>

* gdb.trace/unavailable.exp (gdb_unavailable_registers_test):
Expect <unavailable> pattern.

diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 20f8857..3b41837 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -2024,21 +2024,13 @@ default_print_one_register_info (struct ui_file *file,
struct value *val)
{
struct type *regtype = value_type (val);
+ int print_raw_format;

fputs_filtered (name, file);
print_spaces_filtered (15 - strlen (name), file);

- if (!value_entirely_available (val))
- {
- fprintf_filtered (file, "*value not available*\n");
- return;
- }
- else if (value_optimized_out (val))
- {
- val_print_optimized_out (val, file);
- fprintf_filtered (file, "\n");
- return;
- }
+ print_raw_format = (value_entirely_available (val)
+ && !value_optimized_out (val));

/* If virtual format is floating, print it that way, and in raw
hex. */
@@ -2058,9 +2050,12 @@ default_print_one_register_info (struct ui_file *file,
value_embedded_offset (val), 0,
file, 0, val, &opts, current_language);

- fprintf_filtered (file, "\t(raw ");
- print_hex_chars (file, valaddr, TYPE_LENGTH (regtype), byte_order);
- fprintf_filtered (file, ")");
+ if (print_raw_format)
+ {
+ fprintf_filtered (file, "\t(raw ");
+ print_hex_chars (file, valaddr, TYPE_LENGTH (regtype), byte_order);
+ fprintf_filtered (file, ")");
+ }
}
else
{
@@ -2075,7 +2070,7 @@ default_print_one_register_info (struct ui_file *file,
file, 0, val, &opts, current_language);
/* If not a vector register, print it also according to its
natural format. */
- if (TYPE_VECTOR (regtype) == 0)
+ if (print_raw_format && TYPE_VECTOR (regtype) == 0)
{
get_user_print_options (&opts);
opts.deref_ref = 1;
diff --git a/gdb/testsuite/gdb.trace/unavailable.exp b/gdb/testsuite/gdb.trace/unavailable.exp
index 8e2e105..ed14798 100644
--- a/gdb/testsuite/gdb.trace/unavailable.exp
+++ b/gdb/testsuite/gdb.trace/unavailable.exp
@@ -297,11 +297,11 @@ proc gdb_unavailable_registers_test { } {