From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9562 invoked by alias); 29 May 2002 01:49:50 -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 9554 invoked from network); 29 May 2002 01:49:47 -0000 Received: from unknown (HELO localhost.redhat.com) (24.112.240.27) by sources.redhat.com with SMTP; 29 May 2002 01:49:47 -0000 Received: from cygnus.com (localhost [127.0.0.1]) by localhost.redhat.com (Postfix) with ESMTP id B86BB3D06; Tue, 28 May 2002 21:49:58 -0400 (EDT) Message-ID: <3CF433C6.6030803@cygnus.com> Date: Tue, 28 May 2002 19:19:00 -0000 From: Andrew Cagney User-Agent: Mozilla/5.0 (X11; U; NetBSD macppc; en-US; rv:1.0rc2) Gecko/20020518 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andrew Cagney Cc: gdb-patches@sources.redhat.com Subject: Re: [patch/rfc] Revise REGISTER_SIM_REGNO() References: <3CE19430.8030201@cygnus.com> <3CE87D0C.7020704@cygnus.com> Content-Type: multipart/mixed; boundary="------------020304070009080904030003" X-SW-Source: 2002-05/txt/msg00994.txt.bz2 This is a multi-part message in MIME format. --------------020304070009080904030003 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 637 > +enum { > + /* Normal sane architecture. The corresponding register cache > + entry is zero filled and the register is marked as unavailable. */ > + SIM_REGNO_UNAVAILABLE = -1, > > Does: > SIM_REGNO_DNE = -1, > sound better? (I spelt it out - SIM_REGNO_DOES_NOT_EXIST) > For the moment remote-sim.c would mark the register as unavailable (fixme comment). At least, though, the name is right. > > + /* For possible backward compatibility. The register cache doesn't > + have a corresponding name. Skip the register entirely. */ > + LEGACY_SIM_REGNO_IGNORE = -2 > +}; as per the attached. Committed. Andrew --------------020304070009080904030003 Content-Type: text/plain; name="diffs" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs" Content-length: 14691 2002-05-28 Andrew Cagney * sim-regno.h: New file. * Makefile.in (sim_regno_h): Define. (d10v-tdep.o, remote-sim.o): Add dependency on $(sim_regno_h). * remote-sim.c: Include "sim-regno.h" and "gdb_assert.h". (legacy_register_sim_regno): New function. (one2one_register_sim_regno): New function. (gdbsim_fetch_register): Rewrite. (gdbsim_store_register): Only store a register when REGISTER_SIM_REGNO is valid. * d10v-tdep.c: Include "sim-regno.h". (d10v_ts2_register_sim_regno): Add legacy_regiter_sim_regno check. (d10v_ts3_register_sim_regno): Ditto. * gdbarch.sh: Include "sim-regno.h". (REGISTER_SIM_REGNO): Set default to legacy_register_sim_regno. * gdbarch.h, gdbarch.c: Regenerate. * arch-utils.h (default_register_sim_regno): Delete declaration. * arch-utils.c (default_register_sim_regno): Delete function. Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.200 diff -u -r1.200 Makefile.in --- Makefile.in 24 May 2002 00:12:16 -0000 1.200 +++ Makefile.in 29 May 2002 01:22:55 -0000 @@ -652,6 +652,7 @@ ser_unix_h = ser-unix.h serial_h = serial.h sh_tdep_h = sh-tdep.h osabi.h +sim_regno_h = sim-regno.h solist_h = solist.h source_h = source.h stabsread_h = stabsread.h @@ -1405,7 +1406,8 @@ d10v-tdep.o: d10v-tdep.c $(defs_h) $(frame_h) $(obstack_h) $(symtab_h) \ $(gdbtypes_h) $(gdbcmd_h) $(gdbcore_h) $(gdb_string_h) $(value_h) \ $(inferior_h) $(dis-asm_h) $(symfile_h) $(objfiles_h) $(language_h) \ - $(arch_utils_h) $(regcache_h) $(floatformat_h) $(sim_d10v_h) + $(arch_utils_h) $(regcache_h) $(floatformat_h) $(sim_d10v_h) \ + $(sim_regno_h) dbxread.o: dbxread.c $(breakpoint_h) $(buildsym_h) $(command_h) \ $(complaints_h) $(defs_h) $(expression_h) $(gdb_stabs_h) $(gdbcore_h) \ @@ -1998,7 +2000,8 @@ remote-sim.o: remote-sim.c $(defs_h) $(inferior_h) $(value_h) $(gdb_string_h) \ $(terminal_h) $(target_h) $(gdbcore_h) $(INCLUDE_DIR)/callback.h \ - $(remote_sim_h) $(remote_utils_h) $(command_h) $(regcache_h) + $(remote_sim_h) $(remote_utils_h) $(command_h) $(regcache_h) \ + $(sim_regno_h) remote-st.o: remote-st.c $(defs_h) $(gdbcore_h) $(serial_h) \ $(target_h) $(gdb_string_h) $(regcache_h) Index: arch-utils.c =================================================================== RCS file: /cvs/src/src/gdb/arch-utils.c,v retrieving revision 1.57 diff -u -r1.57 arch-utils.c --- arch-utils.c 12 May 2002 03:09:11 -0000 1.57 +++ arch-utils.c 29 May 2002 01:22:56 -0000 @@ -267,13 +267,6 @@ return 0; } -int -default_register_sim_regno (int num) -{ - return num; -} - - CORE_ADDR core_addr_identity (CORE_ADDR addr) { Index: arch-utils.h =================================================================== RCS file: /cvs/src/src/gdb/arch-utils.h,v retrieving revision 1.32 diff -u -r1.32 arch-utils.h --- arch-utils.h 12 May 2002 03:09:11 -0000 1.32 +++ arch-utils.h 29 May 2002 01:22:56 -0000 @@ -94,11 +94,6 @@ extern int (*target_architecture_hook) (const struct bfd_arch_info *); - -/* Default raw->sim register re-numbering - does nothing. */ - -extern int default_register_sim_regno (int reg_nr); - /* Identity function on a CORE_ADDR. Just returns its parameter. */ extern CORE_ADDR core_addr_identity (CORE_ADDR addr); Index: d10v-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/d10v-tdep.c,v retrieving revision 1.42 diff -u -r1.42 d10v-tdep.c --- d10v-tdep.c 24 May 2002 00:12:16 -0000 1.42 +++ d10v-tdep.c 29 May 2002 01:22:57 -0000 @@ -41,6 +41,7 @@ #include "floatformat.h" #include "gdb/sim-d10v.h" +#include "sim-regno.h" struct frame_extra_info { @@ -296,6 +297,8 @@ static int d10v_ts2_register_sim_regno (int nr) { + if (legacy_register_sim_regno (nr) < 0) + return legacy_register_sim_regno (nr); if (nr >= TS2_IMAP0_REGNUM && nr < TS2_IMAP0_REGNUM + NR_IMAP_REGS) return nr - TS2_IMAP0_REGNUM + SIM_D10V_IMAP0_REGNUM; @@ -310,6 +313,8 @@ static int d10v_ts3_register_sim_regno (int nr) { + if (legacy_register_sim_regno (nr) < 0) + return legacy_register_sim_regno (nr); if (nr >= TS3_IMAP0_REGNUM && nr < TS3_IMAP0_REGNUM + NR_IMAP_REGS) return nr - TS3_IMAP0_REGNUM + SIM_D10V_IMAP0_REGNUM; Index: gdbarch.c =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.c,v retrieving revision 1.127 diff -u -r1.127 gdbarch.c --- gdbarch.c 13 May 2002 17:20:57 -0000 1.127 +++ gdbarch.c 29 May 2002 01:22:58 -0000 @@ -39,6 +39,7 @@ #if GDB_MULTI_ARCH #include "gdbcmd.h" #include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */ +#include "sim-regno.h" /* For legacy_register_sim_regno(). */ #else /* Just include everything in sight so that the every old definition of macro is visible. */ @@ -488,7 +489,7 @@ current_gdbarch->max_register_virtual_size = -1; current_gdbarch->do_registers_info = do_registers_info; current_gdbarch->print_float_info = default_print_float_info; - current_gdbarch->register_sim_regno = default_register_sim_regno; + current_gdbarch->register_sim_regno = legacy_register_sim_regno; current_gdbarch->cannot_fetch_register = cannot_register_not; current_gdbarch->cannot_store_register = cannot_register_not; current_gdbarch->use_generic_dummy_frames = -1; Index: gdbarch.h =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.h,v retrieving revision 1.95 diff -u -r1.95 gdbarch.h --- gdbarch.h 13 May 2002 17:20:58 -0000 1.95 +++ gdbarch.h 29 May 2002 01:22:59 -0000 @@ -40,6 +40,7 @@ /* Pull in function declarations refered to, indirectly, via macros. */ #include "value.h" /* For default_coerce_float_to_double which is referenced by a macro. */ #include "inferior.h" /* For unsigned_address_to_pointer(). */ +#include "sim-regno.h" /* For legacy_register_sim_regno(). */ #endif struct frame_info; @@ -811,7 +812,7 @@ /* Default (function) for non- multi-arch platforms. */ #if (!GDB_MULTI_ARCH) && !defined (REGISTER_SIM_REGNO) -#define REGISTER_SIM_REGNO(reg_nr) (default_register_sim_regno (reg_nr)) +#define REGISTER_SIM_REGNO(reg_nr) (legacy_register_sim_regno (reg_nr)) #endif typedef int (gdbarch_register_sim_regno_ftype) (int reg_nr); Index: gdbarch.sh =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.sh,v retrieving revision 1.138 diff -u -r1.138 gdbarch.sh --- gdbarch.sh 13 May 2002 17:20:58 -0000 1.138 +++ gdbarch.sh 29 May 2002 01:23:01 -0000 @@ -471,7 +471,7 @@ f:2:PRINT_FLOAT_INFO:void:print_float_info:void::::default_print_float_info::0 # MAP a GDB RAW register number onto a simulator register number. See # also include/...-sim.h. -f:2:REGISTER_SIM_REGNO:int:register_sim_regno:int reg_nr:reg_nr:::default_register_sim_regno::0 +f:2:REGISTER_SIM_REGNO:int:register_sim_regno:int reg_nr:reg_nr:::legacy_register_sim_regno::0 F:2:REGISTER_BYTES_OK:int:register_bytes_ok:long nr_bytes:nr_bytes::0:0 f:2:CANNOT_FETCH_REGISTER:int:cannot_fetch_register:int regnum:regnum:::cannot_register_not::0 f:2:CANNOT_STORE_REGISTER:int:cannot_store_register:int regnum:regnum:::cannot_register_not::0 @@ -759,6 +759,7 @@ /* Pull in function declarations refered to, indirectly, via macros. */ #include "value.h" /* For default_coerce_float_to_double which is referenced by a macro. */ #include "inferior.h" /* For unsigned_address_to_pointer(). */ +#include "sim-regno.h" /* For legacy_register_sim_regno(). */ #endif struct frame_info; @@ -1220,6 +1221,7 @@ #if GDB_MULTI_ARCH #include "gdbcmd.h" #include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */ +#include "sim-regno.h" /* For legacy_register_sim_regno(). */ #else /* Just include everything in sight so that the every old definition of macro is visible. */ Index: remote-sim.c =================================================================== RCS file: /cvs/src/src/gdb/remote-sim.c,v retrieving revision 1.21 diff -u -r1.21 remote-sim.c --- remote-sim.c 20 Jan 2002 19:26:48 -0000 1.21 +++ remote-sim.c 29 May 2002 01:23:01 -0000 @@ -40,6 +40,8 @@ #include "remote-utils.h" #include "command.h" #include "regcache.h" +#include "gdb_assert.h" +#include "sim-regno.h" /* Prototypes */ @@ -276,46 +278,88 @@ } } +int +legacy_register_sim_regno (int regnum) +{ + /* Only makes sense to supply raw registers. */ + gdb_assert (regnum >= 0 && regnum < NUM_REGS); + /* NOTE: cagney/2002-05-13: The old code did it this way and it is + suspected that some GDB/SIM combinations may rely on this + behavour. The default should be one2one_register_sim_regno + (below). */ + if (REGISTER_NAME (regnum) != NULL + && REGISTER_NAME (regnum)[0] != '\0') + return regnum; + else + return LEGACY_SIM_REGNO_IGNORE; +} + +int +one2one_register_sim_regno (int regnum) +{ + /* Only makes sense to supply raw registers. */ + gdb_assert (regnum >= 0 && regnum < NUM_REGS); + return regnum; +} + static void gdbsim_fetch_register (int regno) { - static int warn_user = 1; if (regno == -1) { for (regno = 0; regno < NUM_REGS; regno++) gdbsim_fetch_register (regno); + return; } - else if (REGISTER_NAME (regno) != NULL - && *REGISTER_NAME (regno) != '\0') + + switch (REGISTER_SIM_REGNO (regno)) { - char buf[MAX_REGISTER_RAW_SIZE]; - int nr_bytes; - if (REGISTER_SIM_REGNO (regno) >= 0) + case LEGACY_SIM_REGNO_IGNORE: + break; + case SIM_REGNO_DOES_NOT_EXIST: + { + /* For moment treat a `does not exist' register the same way + as an ``unavailable'' register. */ + char *buf = alloca (MAX_REGISTER_RAW_SIZE); + int nr_bytes; + memset (buf, 0, MAX_REGISTER_RAW_SIZE); + supply_register (regno, buf); + set_register_cached (regno, -1); + break; + } + default: + { + static int warn_user = 1; + char *buf = alloca (MAX_REGISTER_RAW_SIZE); + int nr_bytes; + gdb_assert (regno >= 0 && regno < NUM_REGS); + memset (buf, 0, MAX_REGISTER_RAW_SIZE); nr_bytes = sim_fetch_register (gdbsim_desc, REGISTER_SIM_REGNO (regno), buf, REGISTER_RAW_SIZE (regno)); - else - nr_bytes = 0; - if (nr_bytes == 0) - /* register not applicable, supply zero's */ - memset (buf, 0, MAX_REGISTER_RAW_SIZE); - else if (nr_bytes > 0 && nr_bytes != REGISTER_RAW_SIZE (regno) - && warn_user) - { - fprintf_unfiltered (gdb_stderr, - "Size of register %s (%d/%d) incorrect (%d instead of %d))", - REGISTER_NAME (regno), - regno, REGISTER_SIM_REGNO (regno), - nr_bytes, REGISTER_RAW_SIZE (regno)); - warn_user = 0; - } - supply_register (regno, buf); - if (sr_get_debug ()) - { - printf_filtered ("gdbsim_fetch_register: %d", regno); - /* FIXME: We could print something more intelligible. */ - dump_mem (buf, REGISTER_RAW_SIZE (regno)); - } + if (nr_bytes > 0 && nr_bytes != REGISTER_RAW_SIZE (regno) && warn_user) + { + fprintf_unfiltered (gdb_stderr, + "Size of register %s (%d/%d) incorrect (%d instead of %d))", + REGISTER_NAME (regno), + regno, REGISTER_SIM_REGNO (regno), + nr_bytes, REGISTER_RAW_SIZE (regno)); + warn_user = 0; + } + /* FIXME: cagney/2002-05-27: Should check `nr_bytes == 0' + indicatingthat GDB and the SIM have different ideas about + which registers are fetchable. */ + /* Else if (nr_bytes < 0): an old simulator, that doesn't + think to return the register size. Just assume all is ok. */ + supply_register (regno, buf); + if (sr_get_debug ()) + { + printf_filtered ("gdbsim_fetch_register: %d", regno); + /* FIXME: We could print something more intelligible. */ + dump_mem (buf, REGISTER_RAW_SIZE (regno)); + } + break; + } } } @@ -327,10 +371,9 @@ { for (regno = 0; regno < NUM_REGS; regno++) gdbsim_store_register (regno); + return; } - else if (REGISTER_NAME (regno) != NULL - && *REGISTER_NAME (regno) != '\0' - && REGISTER_SIM_REGNO (regno) >= 0) + else if (REGISTER_SIM_REGNO (regno) >= 0) { char tmp[MAX_REGISTER_RAW_SIZE]; int nr_bytes; @@ -341,6 +384,9 @@ if (nr_bytes > 0 && nr_bytes != REGISTER_RAW_SIZE (regno)) internal_error (__FILE__, __LINE__, "Register size different to expected"); + /* FIXME: cagney/2002-05-27: Should check `nr_bytes == 0' + indicatingthat GDB and the SIM have different ideas about + which registers are fetchable. */ if (sr_get_debug ()) { printf_filtered ("gdbsim_store_register: %d", regno); Index: sim-regno.h =================================================================== RCS file: sim-regno.h diff -N sim-regno.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sim-regno.h 29 May 2002 01:23:01 -0000 @@ -0,0 +1,50 @@ +/* Generic remote debugging interface for simulators. + + Copyright 2002 Free Software Foundation, Inc. + + Contributed by Red Hat, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef SIM_REGNO_H +#define SIM_REGNO_H + +/* The REGISTER_SIM_REGNO(REGNUM) method, when there is a + corresponding simulator register, returns that register number as a + cardinal. When there is no corresponding register, it returns a + negative value. */ + +enum sim_regno { + /* Normal sane architecture. The simulator is known to not model + this register. */ + SIM_REGNO_DOES_NOT_EXIST = -1, + /* For possible backward compatibility. The register cache doesn't + have a corresponding name. Skip the register entirely. */ + LEGACY_SIM_REGNO_IGNORE = -2 +}; + +/* For compatibility with older architectures, returns + (LEGACY_SIM_REGNO_IGNORE) when a register doesn't have. */ + +extern int legacy_register_sim_regno (int regnum); + +/* Treat all raw registers as valid. */ + +extern int one2one_register_sim_regno (int regnum); + +#endif --------------020304070009080904030003--