From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12625 invoked by alias); 23 Oct 2002 03:00:13 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 12607 invoked from network); 23 Oct 2002 03:00:11 -0000 Received: from unknown (HELO touchme.toronto.redhat.com) (216.138.202.10) by sources.redhat.com with SMTP; 23 Oct 2002 03:00:11 -0000 Received: from localhost.redhat.com (to-dhcp51.toronto.redhat.com [172.16.14.151]) by touchme.toronto.redhat.com (Postfix) with ESMTP id D93A180007A for ; Tue, 22 Oct 2002 23:00:10 -0400 (EDT) Received: from redhat.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id 3BD663C40 for ; Tue, 22 Oct 2002 23:00:09 -0400 (EDT) Message-ID: <3DB610B9.5040906@redhat.com> Date: Tue, 22 Oct 2002 20:00:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0.0) Gecko/20020824 X-Accept-Language: en-us, en MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [patch/rfc] Add frame_read_signed/unsigned_register(); convert h8300 to print_registers_info() Content-Type: multipart/mixed; boundary="------------090601060106050807080900" X-SW-Source: 2002-10/txt/msg00451.txt.bz2 This is a multi-part message in MIME format. --------------090601060106050807080900 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1010 Hmm, (I think I might split this in two) The attached adds the methods: +extern void frame_read_signed_register (struct frame_info *frame, + int regnum, LONGEST *val); +extern void frame_read_unsigned_register (struct frame_info *frame, + int regnum, ULONGEST *val); These correspond to the frame_unwind_XXXX methods() except that they return the value of a register in THIS frame rather than the value of the register in the PREVIOUS frame. They are simply convenience functions to make it easier to obtain a specified frame's register value. Thoughts? -- The h8300-tdep.c target's ``info registers'' routines are then updated so that: - Use the frame_read_XXX_register() instead of read_register(). `info registers' displays the registers of the selected frame and not the inner most frame. - Implement the current print_registers_info() interface Not sure how to test it though. Anyone want to try this? Andrew --------------090601060106050807080900 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 7994 2002-10-22 Andrew Cagney * frame.c (frame_read_unsigned_register): New function. (frame_read_signed_register): New function. * frame.h (frame_read_unsigned_register): Declare. (frame_read_signed_register): Declare. * h8300-tdep.c: Include "gdb_assert.h". (h8300_print_register): Add gdbarch, file and frame parameters. Use frame_read_unsigned_register to read the register's value. Use fprintf_filtered to display output. (h8300_print_registers_info): Replace h8300_do_registers_info. (h8300_gdbarch_init): Set print_registers_info. Index: frame.c =================================================================== RCS file: /cvs/src/src/gdb/frame.c,v retrieving revision 1.18 diff -u -r1.18 frame.c --- frame.c 25 Sep 2002 20:30:37 -0000 1.18 +++ frame.c 23 Oct 2002 02:43:21 -0000 @@ -153,6 +153,20 @@ } void +frame_read_unsigned_register (struct frame_info *frame, int regnum, + ULONGEST *val) +{ + frame_unwind_unsigned_register (get_next_frame (frame), regnum, val); +} + +void +frame_read_signed_register (struct frame_info *frame, int regnum, + LONGEST *val) +{ + frame_unwind_signed_register (get_next_frame (frame), regnum, val); +} + +void generic_unwind_get_saved_register (char *raw_buffer, int *optimizedp, CORE_ADDR *addrp, Index: frame.h =================================================================== RCS file: /cvs/src/src/gdb/frame.h,v retrieving revision 1.26 diff -u -r1.26 frame.h --- frame.h 2 Oct 2002 21:33:58 -0000 1.26 +++ frame.h 23 Oct 2002 02:43:21 -0000 @@ -365,6 +366,17 @@ register could not be found. */ extern int frame_register_read (struct frame_info *frame, int regnum, void *buf); + +/* Return the value of register REGNUM in FRAME. The value is + obtained by unwinding the register from the next inner most frame. + These are wrapper functions to the call ``frame_unwind_X_register + (get_next_frame (FRAME), ...)''. */ +/* NOTE: cagney/2002-09-13: Return void as one day these functions may + be changed to return an indication that the read succeeded. */ +extern void frame_read_signed_register (struct frame_info *frame, + int regnum, LONGEST *val); +extern void frame_read_unsigned_register (struct frame_info *frame, + int regnum, ULONGEST *val); /* Map between a frame register number and its name. A frame register space is a superset of the cooked register space --- it also Index: h8300-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/h8300-tdep.c,v retrieving revision 1.21 diff -u -r1.21 h8300-tdep.c --- h8300-tdep.c 20 Sep 2002 14:22:44 -0000 1.21 +++ h8300-tdep.c 23 Oct 2002 02:43:21 -0000 @@ -34,6 +34,7 @@ #include "gdbcore.h" #include "objfiles.h" #include "gdbcmd.h" +#include "gdb_assert.h" /* Extra info which is saved in each frame_info. */ struct frame_extra_info @@ -864,28 +865,38 @@ } static void -h8300_print_register (int regno) +h8300_print_register (struct gdbarch *gdbarch, struct ui_file *file, + struct frame_info *frame, int regno) { - long val = read_register (regno); + ULONGEST rval; + long val; const char *name = h8300_register_name (regno); if (!name || !*name) return; - printf_filtered ("%-14s ", name); + /* FIXME: cagney/2002-10-22: The code below assumes that VAL is at + least 4 bytes (32 bits) in size and hence is large enough to hold + the largest h8300 register. Should instead be using ULONGEST and + the phex() functions. */ + gdb_assert (sizeof (val) >= 4); + frame_read_unsigned_register (frame, regno, &rval); + val = rval; + + fprintf_filtered (file, "%-14s ", name); if (h8300hmode) { if (val) - printf_filtered ("0x%08lx %-8ld", val, val); + fprintf_filtered (file, "0x%08lx %-8ld", val, val); else - printf_filtered ("0x%-8lx %-8ld", val, val); + fprintf_filtered (file, "0x%-8lx %-8ld", val, val); } else { if (val) - printf_filtered ("0x%04lx %-4ld", val, val); + fprintf_filtered (file, "0x%04lx %-4ld", val, val); else - printf_filtered ("0x%-4lx %-4ld", val, val); + fprintf_filtered (file, "0x%-4lx %-4ld", val, val); } if (regno == E_CCR_REGNUM) { @@ -895,39 +906,39 @@ unsigned char l; frame_register_read (selected_frame, regno, b); l = b[REGISTER_VIRTUAL_SIZE (E_CCR_REGNUM) - 1]; - printf_unfiltered ("\t"); - printf_unfiltered ("I-%d ", (l & 0x80) != 0); - printf_unfiltered ("UI-%d ", (l & 0x40) != 0); - printf_unfiltered ("H-%d ", (l & 0x20) != 0); - printf_unfiltered ("U-%d ", (l & 0x10) != 0); + fprintf_filtered (file, "\t"); + fprintf_filtered (file, "I-%d ", (l & 0x80) != 0); + fprintf_filtered (file, "UI-%d ", (l & 0x40) != 0); + fprintf_filtered (file, "H-%d ", (l & 0x20) != 0); + fprintf_filtered (file, "U-%d ", (l & 0x10) != 0); N = (l & 0x8) != 0; Z = (l & 0x4) != 0; V = (l & 0x2) != 0; C = (l & 0x1) != 0; - printf_unfiltered ("N-%d ", N); - printf_unfiltered ("Z-%d ", Z); - printf_unfiltered ("V-%d ", V); - printf_unfiltered ("C-%d ", C); + fprintf_filtered (file, "N-%d ", N); + fprintf_filtered (file, "Z-%d ", Z); + fprintf_filtered (file, "V-%d ", V); + fprintf_filtered (file, "C-%d ", C); if ((C | Z) == 0) - printf_unfiltered ("u> "); + fprintf_filtered (file, "u> "); if ((C | Z) == 1) - printf_unfiltered ("u<= "); + fprintf_filtered (file, "u<= "); if ((C == 0)) - printf_unfiltered ("u>= "); + fprintf_filtered (file, "u>= "); if (C == 1) - printf_unfiltered ("u< "); + fprintf_filtered (file, "u< "); if (Z == 0) - printf_unfiltered ("!= "); + fprintf_filtered (file, "!= "); if (Z == 1) - printf_unfiltered ("== "); + fprintf_filtered (file, "== "); if ((N ^ V) == 0) - printf_unfiltered (">= "); + fprintf_filtered (file, ">= "); if ((N ^ V) == 1) - printf_unfiltered ("< "); + fprintf_filtered (file, "< "); if ((Z | (N ^ V)) == 0) - printf_unfiltered ("> "); + fprintf_filtered (file, "> "); if ((Z | (N ^ V)) == 1) - printf_unfiltered ("<= "); + fprintf_filtered (file, "<= "); } else if (regno == E_EXR_REGNUM && h8300smode) { @@ -936,23 +947,24 @@ unsigned char l; frame_register_read (selected_frame, regno, b); l = b[REGISTER_VIRTUAL_SIZE (E_EXR_REGNUM) - 1]; - printf_unfiltered ("\t"); - printf_unfiltered ("T-%d - - - ", (l & 0x80) != 0); - printf_unfiltered ("I2-%d ", (l & 4) != 0); - printf_unfiltered ("I1-%d ", (l & 2) != 0); - printf_unfiltered ("I0-%d", (l & 1) != 0); + fprintf_filtered (file, "\t"); + fprintf_filtered (file, "T-%d - - - ", (l & 0x80) != 0); + fprintf_filtered (file, "I2-%d ", (l & 4) != 0); + fprintf_filtered (file, "I1-%d ", (l & 2) != 0); + fprintf_filtered (file, "I0-%d", (l & 1) != 0); } - printf_filtered ("\n"); + fprintf_filtered (file, "\n"); } static void -h8300_do_registers_info (int regno, int cpregs) +h8300_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file, + struct frame_info *frame, int regno, int cpregs) { if (regno < 0) for (regno = 0; regno < E_NUM_REGS; ++regno) - h8300_print_register (regno); + h8300_print_register (gdbarch, file, frame, regno); else - h8300_print_register (regno); + h8300_print_register (gdbarch, file, frame, regno); } static CORE_ADDR @@ -1085,7 +1097,7 @@ set_gdbarch_register_virtual_size (gdbarch, h8300_register_raw_size); set_gdbarch_max_register_virtual_size (gdbarch, h8300h_reg_size); set_gdbarch_register_virtual_type (gdbarch, h8300_register_virtual_type); - set_gdbarch_do_registers_info (gdbarch, h8300_do_registers_info); + set_gdbarch_print_registers_info (gdbarch, h8300_print_registers_info); set_gdbarch_print_float_info (gdbarch, h8300_print_float_info); /* --------------090601060106050807080900--