diff options
author | Pedro Alves <palves@redhat.com> | 2012-08-28 09:05:35 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2012-08-28 09:05:35 +0000 |
commit | 1292279a4ef1c77bd8e6ffb26346ebc0592e1a8d (patch) | |
tree | 51c556aecb30fb9eb57cccf733fd5c467ef470d5 | |
parent | 663b5850121926ab9d7685c4c4f2961ab65adcb8 (diff) | |
download | gdb-1292279a4ef1c77bd8e6ffb26346ebc0592e1a8d.zip gdb-1292279a4ef1c77bd8e6ffb26346ebc0592e1a8d.tar.gz gdb-1292279a4ef1c77bd8e6ffb26346ebc0592e1a8d.tar.bz2 |
2012-08-28 Pedro Alves <palves@redhat.com>
PR gdb/14428
gdb/
* infcmd.c (default_print_one_register_info): New, factored out
from default_print_registers_info.
(default_print_registers_info): Use it. Mark value unavailable if
necessary.
(registers_info): Print user registers with
default_print_one_register_info.
gdb/testsuite/
* gdb.base/pc-fp.exp: Adjust expected output of 'info registers pc fp'.
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/infcmd.c | 167 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/pc-fp.exp | 2 |
4 files changed, 110 insertions, 76 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 71014b9..9273658 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2012-08-28 Pedro Alves <palves@redhat.com> + + PR gdb/14428 + + * infcmd.c (default_print_one_register_info): New, factored out + from default_print_registers_info. + (default_print_registers_info): Use it. Mark value unavailable if + necessary. + (registers_info): Print user registers with + default_print_one_register_info. + 2010-08-27 H.J. Lu <hongjiu.lu@intel.com> PR tui/14486 diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 9d43193..8e2f74e 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -2015,6 +2015,84 @@ path_command (char *dirname, int from_tty) } +/* Print out the register NAME with value VAL, to FILE, in the default + fashion. */ + +static void +default_print_one_register_info (struct ui_file *file, + const char *name, + struct value *val) +{ + struct type *regtype = value_type (val); + + fputs_filtered (name, file); + print_spaces_filtered (15 - strlen (name), file); + + if (!value_entirely_available (val)) + { + fprintf_filtered (file, "*value not available*\n"); + return; + } + + /* If virtual format is floating, print it that way, and in raw + hex. */ + if (TYPE_CODE (regtype) == TYPE_CODE_FLT + || TYPE_CODE (regtype) == TYPE_CODE_DECFLOAT) + { + int j; + struct value_print_options opts; + const gdb_byte *valaddr = value_contents_for_printing (val); + enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (regtype)); + + get_user_print_options (&opts); + opts.deref_ref = 1; + + val_print (regtype, + value_contents_for_printing (val), + value_embedded_offset (val), 0, + file, 0, val, &opts, current_language); + + fprintf_filtered (file, "\t(raw 0x"); + for (j = 0; j < TYPE_LENGTH (regtype); j++) + { + int idx; + + if (byte_order == BFD_ENDIAN_BIG) + idx = j; + else + idx = TYPE_LENGTH (regtype) - 1 - j; + fprintf_filtered (file, "%02x", (unsigned char) valaddr[idx]); + } + fprintf_filtered (file, ")"); + } + else + { + struct value_print_options opts; + + /* Print the register in hex. */ + get_formatted_print_options (&opts, 'x'); + opts.deref_ref = 1; + val_print (regtype, + value_contents_for_printing (val), + value_embedded_offset (val), 0, + file, 0, val, &opts, current_language); + /* If not a vector register, print it also according to its + natural format. */ + if (TYPE_VECTOR (regtype) == 0) + { + get_user_print_options (&opts); + opts.deref_ref = 1; + fprintf_filtered (file, "\t"); + val_print (regtype, + value_contents_for_printing (val), + value_embedded_offset (val), 0, + file, 0, val, &opts, current_language); + } + } + + fprintf_filtered (file, "\n"); +} + /* Print out the machine register regnum. If regnum is -1, print all registers (print_all == 1) or all non-float and non-vector registers (print_all == 0). @@ -2068,76 +2146,16 @@ default_print_registers_info (struct gdbarch *gdbarch, || *(gdbarch_register_name (gdbarch, i)) == '\0') continue; - fputs_filtered (gdbarch_register_name (gdbarch, i), file); - print_spaces_filtered (15 - strlen (gdbarch_register_name - (gdbarch, i)), file); - regtype = register_type (gdbarch, i); val = allocate_value (regtype); /* Get the data in raw format. */ if (! frame_register_read (frame, i, value_contents_raw (val))) - { - fprintf_filtered (file, "*value not available*\n"); - continue; - } - - /* If virtual format is floating, print it that way, and in raw - hex. */ - if (TYPE_CODE (regtype) == TYPE_CODE_FLT - || TYPE_CODE (regtype) == TYPE_CODE_DECFLOAT) - { - int j; - struct value_print_options opts; - const gdb_byte *valaddr = value_contents_for_printing (val); - - get_user_print_options (&opts); - opts.deref_ref = 1; - - val_print (regtype, - value_contents_for_printing (val), - value_embedded_offset (val), 0, - file, 0, val, &opts, current_language); - - fprintf_filtered (file, "\t(raw 0x"); - for (j = 0; j < register_size (gdbarch, i); j++) - { - int idx; - - if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) - idx = j; - else - idx = register_size (gdbarch, i) - 1 - j; - fprintf_filtered (file, "%02x", (unsigned char) valaddr[idx]); - } - fprintf_filtered (file, ")"); - } - else - { - struct value_print_options opts; - - /* Print the register in hex. */ - get_formatted_print_options (&opts, 'x'); - opts.deref_ref = 1; - val_print (regtype, - value_contents_for_printing (val), - value_embedded_offset (val), 0, - file, 0, val, &opts, current_language); - /* If not a vector register, print it also according to its - natural format. */ - if (TYPE_VECTOR (regtype) == 0) - { - get_user_print_options (&opts); - opts.deref_ref = 1; - fprintf_filtered (file, "\t"); - val_print (regtype, - value_contents_for_printing (val), - value_embedded_offset (val), 0, - file, 0, val, &opts, current_language); - } - } + mark_value_bytes_unavailable (val, 0, TYPE_LENGTH (value_type (val))); - fprintf_filtered (file, "\n"); + default_print_one_register_info (file, + gdbarch_register_name (gdbarch, i), + val); } } @@ -2198,17 +2216,16 @@ registers_info (char *addr_exp, int fpregs) if (regnum >= gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch)) { - struct value_print_options opts; - struct value *val = value_of_user_reg (regnum, frame); - - printf_filtered ("%.*s: ", (int) (end - start), start); - get_formatted_print_options (&opts, 'x'); - val_print_scalar_formatted (check_typedef (value_type (val)), - value_contents_for_printing (val), - value_embedded_offset (val), - val, - &opts, 0, gdb_stdout); - printf_filtered ("\n"); + struct value *regval = value_of_user_reg (regnum, frame); + const char *regname = user_reg_map_regnum_to_name (gdbarch, + regnum); + + /* Print in the same fashion + gdbarch_print_registers_info's default + implementation prints. */ + default_print_one_register_info (gdb_stdout, + regname, + regval); } else gdbarch_print_registers_info (gdbarch, gdb_stdout, diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0a3d01a..3be01db 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-08-28 Pedro Alves <palves@redhat.com> + + PR gdb/14428 + + * gdb.base/pc-fp.exp: Adjust expected output of 'info registers pc fp'. + 2012-08-27 Jan Kratochvil <jan.kratochvil@redhat.com> * gdb.base/break-caller-line.c: New file. diff --git a/gdb/testsuite/gdb.base/pc-fp.exp b/gdb/testsuite/gdb.base/pc-fp.exp index beb5087..685e2d9 100644 --- a/gdb/testsuite/gdb.base/pc-fp.exp +++ b/gdb/testsuite/gdb.base/pc-fp.exp @@ -66,4 +66,4 @@ gdb_test "info register \$fp" "${valueof_fp}.*" # Regression test for # http://sourceware.org/bugzilla/show_bug.cgi?id=12659 gdb_test "info register pc fp" \ - "pc(:)?( |\t)+${valueof_pc}(( |\t)+${valueof_pc} <.*>)?\[\r\n\]+fp(:)?( |\t)+${valueof_fp}(( |\t)+${valueof_fp})?\[\r\n\]+" + "pc +${valueof_pc}\t${valueof_pc} <.*>\[\r\n\]+fp +${valueof_fp}\t${valueof_fp}\[\r\n\]+" |