From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30368 invoked by alias); 16 Nov 2005 15:54:12 -0000 Received: (qmail 30044 invoked by uid 22791); 16 Nov 2005 15:54:06 -0000 Received: from lon-del-01.spheriq.net (HELO lon-del-01.spheriq.net) (195.46.50.97) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Wed, 16 Nov 2005 15:54:06 +0000 Received: from lon-out-01.spheriq.net ([195.46.50.129]) by lon-del-01.spheriq.net with ESMTP id jAGFrsHk030699 for ; Wed, 16 Nov 2005 15:53:54 GMT Received: from lon-cus-01.spheriq.net (lon-cus-01.spheriq.net [195.46.50.37]) by lon-out-01.spheriq.net with ESMTP id jAGFrrlh023744 for ; Wed, 16 Nov 2005 15:53:53 GMT Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by lon-cus-01.spheriq.net with ESMTP id jAGFrpvf001829 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=OK) for ; Wed, 16 Nov 2005 15:53:52 GMT Received: from zeta.dmz-eu.st.com (ns2.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 313C8DA49 for ; Wed, 16 Nov 2005 15:53:44 +0000 (GMT) Received: by zeta.dmz-eu.st.com (STMicroelectronics, from userid 60012) id E4368475A4; Wed, 16 Nov 2005 15:56:42 +0000 (GMT) Received: from zeta.dmz-eu.st.com (localhost [127.0.0.1]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 82CDC75994 for ; Wed, 16 Nov 2005 15:56:42 +0000 (UTC) Received: from mail1.bri.st.com (mail1.bri.st.com [164.129.8.218]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 0A5424759B for ; Wed, 16 Nov 2005 15:56:41 +0000 (GMT) Received: from [164.129.15.13] (terrorhawk.bri.st.com [164.129.15.13]) by mail1.bri.st.com (MOS 3.5.8-GR) with ESMTP id CGZ38246 (AUTH "andrew stubbs"); Wed, 16 Nov 2005 15:53:42 GMT Message-ID: <437B556D.2050202@st.com> Date: Wed, 16 Nov 2005 16:48:00 -0000 From: Andrew STUBBS User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317) MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [PATCH][SH] info registers Content-Type: multipart/mixed; boundary="------------020409050609010902050508" X-O-Spoofed: Not Scanned X-O-General-Status: No X-O-Spam1-Status: Not Scanned X-O-Spam2-Status: Not Scanned X-O-URL-Status: Not Scanned X-O-Virus1-Status: No X-O-Virus2-Status: Not Scanned X-O-Virus3-Status: No X-O-Virus4-Status: No X-O-Virus5-Status: Not Scanned X-O-Image-Status: Not Scanned X-O-Attach-Status: Not Scanned X-SpheriQ-Ver: 4.1.07 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2005-11/txt/msg00234.txt.bz2 This is a multi-part message in MIME format. --------------020409050609010902050508 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 5913 Hi, sh-tdep.c contains quite a lot of code to implement the 'info registers' command (and friends). It has a number of issues: - The double and vector registers are only in hex. - Invalid registers are still printed for some types (not that GDB knows which registers are invalid - that's my next patch). - The double registers are incorrectly named dr0..dr7, and the vector registers incorrectly named fv0..fv3. They should be dr0,dr2,dr4... and fv0,fv4,... I have discovered that the default code (when the architecture may override) does everything the SH code does right and yet does not do everything it does wrong. Specifically all the above problems are addressed. I therefore propose removing all this garbage entirely. Before (gdb) info all-registers r0 0x0 0 r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 r13 0x0 0 r14 0x0 0 r15 0x0 0 pc 0x0 0 pr 0x0 0 gbr 0x0 0 vbr 0x0 0 mach 0x0 0 macl 0x0 0 sr 0x0 0 fpul 0 (raw 0x00000000) fpscr 0x0 0 fr0 0 (raw 0x00000000) fr1 0 (raw 0x00000000) fr2 0 (raw 0x00000000) fr3 0 (raw 0x00000000) fr4 0 (raw 0x00000000) fr5 0 (raw 0x00000000) fr6 0 (raw 0x00000000) fr7 0 (raw 0x00000000) fr8 0 (raw 0x00000000) fr9 0 (raw 0x00000000) fr10 0 (raw 0x00000000) fr11 0 (raw 0x00000000) fr12 0 (raw 0x00000000) fr13 0 (raw 0x00000000) fr14 0 (raw 0x00000000) fr15 0 (raw 0x00000000) ssr 0x0 0 spc 0x0 0 r0b0 0x0 0 r1b0 0x0 0 r2b0 0x0 0 r3b0 0x0 0 r4b0 0x0 0 r5b0 0x0 0 r6b0 0x0 0 r7b0 0x0 0 r0b1 0x0 0 r1b1 0x0 0 r2b1 0x0 0 r3b1 0x0 0 r4b1 0x0 0 r5b1 0x0 0 r6b1 0x0 0 r7b1 0x0 0 bank 0 dr0 0x0000000000000000 dr1 0x0000000000000000 dr2 0x0000000000000000 dr3 0x0000000000000000 dr4 0x0000000000000000 dr5 0x0000000000000000 dr6 0x0000000000000000 dr7 0x0000000000000000 fv0 0x00000000 0x00000000 0x00000000 0x00000000 fv1 0x00000000 0x00000000 0x00000000 0x00000000 fv2 0x00000000 0x00000000 0x00000000 0x00000000 fv3 0x00000000 0x00000000 0x00000000 0x00000000 After (gdb) info all-registers r0 0x0 0 r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 r13 0x0 0 r14 0x0 0 r15 0x0 0 pc 0x0 0 pr 0x0 0 gbr 0x0 0 vbr 0x0 0 mach 0x0 0 macl 0x0 0 sr 0x0 0 fpul 0 (raw 0x00000000) fpscr 0x0 0 fr0 0 (raw 0x00000000) fr1 0 (raw 0x00000000) fr2 0 (raw 0x00000000) fr3 0 (raw 0x00000000) fr4 0 (raw 0x00000000) fr5 0 (raw 0x00000000) fr6 0 (raw 0x00000000) fr7 0 (raw 0x00000000) fr8 0 (raw 0x00000000) fr9 0 (raw 0x00000000) fr10 0 (raw 0x00000000) fr11 0 (raw 0x00000000) fr12 0 (raw 0x00000000) fr13 0 (raw 0x00000000) fr14 0 (raw 0x00000000) fr15 0 (raw 0x00000000) ssr 0x0 0 spc 0x0 0 r0b0 0x0 0 r1b0 0x0 0 r2b0 0x0 0 r3b0 0x0 0 r4b0 0x0 0 r5b0 0x0 0 r6b0 0x0 0 r7b0 0x0 0 r0b1 0x0 0 r1b1 0x0 0 r2b1 0x0 0 r3b1 0x0 0 r4b1 0x0 0 r5b1 0x0 0 r6b1 0x0 0 r7b1 0x0 0 dr0 0 (raw 0x0000000000000000) dr2 0 (raw 0x0000000000000000) dr4 0 (raw 0x0000000000000000) dr6 0 (raw 0x0000000000000000) dr8 0 (raw 0x0000000000000000) dr10 0 (raw 0x0000000000000000) dr12 0 (raw 0x0000000000000000) dr14 0 (raw 0x0000000000000000) fv0 {0x0, 0x0, 0x0, 0x0} {0, 0, 0, 0} fv4 {0x0, 0x0, 0x0, 0x0} {0, 0, 0, 0} fv8 {0x0, 0x0, 0x0, 0x0} {0, 0, 0, 0} fv12 {0x0, 0x0, 0x0, 0x0} {0, 0, 0, 0} Thanks Andrew Stubbs --------------020409050609010902050508 Content-Type: text/plain; name="info_register.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="info_register.patch" Content-length: 6901 2005-11-16 Andrew Stubbs * sh-tdep.c (do_fv_register_info, do_dr_register_info): Delete function. (do_bank_register_info, do_bank_register_info): Likewise. (sh_print_pseudo_register, sh_do_fp_register): Likewise. (sh_do_register, sh_print_register, sh_print_registers_info): Likewise. (sh_gdbarch_init): Remove call to set_gdbarch_print_registers_info(). Index: src/gdb/sh-tdep.c =================================================================== --- src.orig/gdb/sh-tdep.c 2005-11-04 14:20:18.000000000 +0000 +++ src/gdb/sh-tdep.c 2005-11-04 16:57:00.000000000 +0000 @@ -2071,184 +2071,6 @@ sh_pseudo_register_write (struct gdbarch } } -/* Floating point vector of 4 float registers. */ -static void -do_fv_register_info (struct gdbarch *gdbarch, struct ui_file *file, - int fv_regnum) -{ - int first_fp_reg_num = fv_reg_base_num (fv_regnum); - fprintf_filtered (file, "fv%d\t0x%08x\t0x%08x\t0x%08x\t0x%08x\n", - fv_regnum - FV0_REGNUM, - (int) read_register (first_fp_reg_num), - (int) read_register (first_fp_reg_num + 1), - (int) read_register (first_fp_reg_num + 2), - (int) read_register (first_fp_reg_num + 3)); -} - -/* Double precision registers. */ -static void -do_dr_register_info (struct gdbarch *gdbarch, struct ui_file *file, - int dr_regnum) -{ - int first_fp_reg_num = dr_reg_base_num (dr_regnum); - - fprintf_filtered (file, "dr%d\t0x%08x%08x\n", - dr_regnum - DR0_REGNUM, - (int) read_register (first_fp_reg_num), - (int) read_register (first_fp_reg_num + 1)); -} -static void -do_bank_register_info (struct gdbarch *gdbarch, struct ui_file *file) -{ - fprintf_filtered (file, "bank %d\n", - (int) read_register (BANK_REGNUM)); -} - -static void -sh_print_pseudo_register (struct gdbarch *gdbarch, struct ui_file *file, - int regnum) -{ - if (regnum < NUM_REGS || regnum >= NUM_REGS + NUM_PSEUDO_REGS) - internal_error (__FILE__, __LINE__, - _("Invalid pseudo register number %d\n"), regnum); - else if (regnum == PSEUDO_BANK_REGNUM) - do_bank_register_info (gdbarch, file); - else if (regnum >= DR0_REGNUM && regnum <= DR_LAST_REGNUM) - do_dr_register_info (gdbarch, file, regnum); - else if (regnum >= FV0_REGNUM && regnum <= FV_LAST_REGNUM) - do_fv_register_info (gdbarch, file, regnum); -} - -static void -sh_do_fp_register (struct gdbarch *gdbarch, struct ui_file *file, int regnum) -{ /* do values for FP (float) regs */ - char *raw_buffer; - double flt; /* double extracted from raw hex data */ - int inv; - int j; - - /* Allocate space for the float. */ - raw_buffer = (char *) alloca (register_size (gdbarch, FP0_REGNUM)); - - /* Get the data in raw format. */ - if (!frame_register_read (get_selected_frame (NULL), regnum, raw_buffer)) - error (_("can't read register %d (%s)"), regnum, REGISTER_NAME (regnum)); - - /* Get the register as a number */ - flt = unpack_double (builtin_type_float, raw_buffer, &inv); - - /* Print the name and some spaces. */ - fputs_filtered (REGISTER_NAME (regnum), file); - print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), file); - - /* Print the value. */ - if (inv) - fprintf_filtered (file, ""); - else - fprintf_filtered (file, "%-10.9g", flt); - - /* Print the fp register as hex. */ - fprintf_filtered (file, "\t(raw 0x"); - for (j = 0; j < register_size (gdbarch, regnum); j++) - { - int idx = (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG - ? j - : register_size (gdbarch, regnum) - 1 - j); - fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]); - } - fprintf_filtered (file, ")"); - fprintf_filtered (file, "\n"); -} - -static void -sh_do_register (struct gdbarch *gdbarch, struct ui_file *file, int regnum) -{ - char raw_buffer[MAX_REGISTER_SIZE]; - - fputs_filtered (REGISTER_NAME (regnum), file); - print_spaces_filtered (15 - strlen (REGISTER_NAME (regnum)), file); - - /* Get the data in raw format. */ - if (!frame_register_read (get_selected_frame (NULL), regnum, raw_buffer)) - fprintf_filtered (file, "*value not available*\n"); - - val_print (gdbarch_register_type (gdbarch, regnum), raw_buffer, 0, 0, - file, 'x', 1, 0, Val_pretty_default); - fprintf_filtered (file, "\t"); - val_print (gdbarch_register_type (gdbarch, regnum), raw_buffer, 0, 0, - file, 0, 1, 0, Val_pretty_default); - fprintf_filtered (file, "\n"); -} - -static void -sh_print_register (struct gdbarch *gdbarch, struct ui_file *file, int regnum) -{ - if (regnum < 0 || regnum >= NUM_REGS + NUM_PSEUDO_REGS) - internal_error (__FILE__, __LINE__, - _("Invalid register number %d\n"), regnum); - - else if (regnum >= 0 && regnum < NUM_REGS) - { - if (TYPE_CODE (gdbarch_register_type (gdbarch, regnum)) == - TYPE_CODE_FLT) - sh_do_fp_register (gdbarch, file, regnum); /* FP regs */ - else - sh_do_register (gdbarch, file, regnum); /* All other regs */ - } - - else if (regnum < NUM_REGS + NUM_PSEUDO_REGS) - { - sh_print_pseudo_register (gdbarch, file, regnum); - } -} - -static void -sh_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file, - struct frame_info *frame, int regnum, int fpregs) -{ - if (regnum != -1) /* do one specified register */ - { - if (*(REGISTER_NAME (regnum)) == '\0') - error (_("Not a valid register for the current processor type")); - - sh_print_register (gdbarch, file, regnum); - } - else - /* do all (or most) registers */ - { - for (regnum = 0; regnum < NUM_REGS; ++regnum) - { - /* If the register name is empty, it is undefined for this - processor, so don't display anything. */ - if (REGISTER_NAME (regnum) == NULL - || *(REGISTER_NAME (regnum)) == '\0') - continue; - - if (TYPE_CODE (gdbarch_register_type (gdbarch, regnum)) == - TYPE_CODE_FLT) - { - /* true for "INFO ALL-REGISTERS" command */ - if (fpregs) - sh_do_fp_register (gdbarch, file, regnum); /* FP regs */ - } - else - sh_do_register (gdbarch, file, regnum); /* All other regs */ - } - - if (regnum == PSEUDO_BANK_REGNUM - && REGISTER_NAME (regnum) - && *REGISTER_NAME (regnum)) - sh_print_pseudo_register (gdbarch, file, regnum++); - - if (fpregs) - while (regnum < NUM_REGS + NUM_PSEUDO_REGS) - { - sh_print_pseudo_register (gdbarch, file, regnum); - regnum++; - } - } -} - static int sh_dsp_register_sim_regno (int nr) { @@ -2654,8 +2476,6 @@ sh_gdbarch_init (struct gdbarch_info inf set_gdbarch_register_type (gdbarch, sh_default_register_type); set_gdbarch_register_reggroup_p (gdbarch, sh_register_reggroup_p); - set_gdbarch_print_registers_info (gdbarch, sh_print_registers_info); - set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc); set_gdbarch_print_insn (gdbarch, gdb_print_insn_sh); --------------020409050609010902050508--