* 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.
This commit is contained in:
Andrew Cagney 2002-05-29 01:51:17 +00:00
parent 4c7aad1c75
commit 8238d0bfe4
10 changed files with 164 additions and 48 deletions

View file

@ -1,3 +1,23 @@
2002-05-28 Andrew Cagney <ac131313@redhat.com>
* 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.
2002-05-28 Jason Thorpe <thorpej@wasabisystems.com>
* ppcnbsd-nat.c: Rewrite.

View file

@ -652,6 +652,7 @@ remote_utils_h = remote-utils.h $(target_h)
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 @@ dcache.o: dcache.c $(dcache_h) $(defs_h) $(gdbcmd_h) $(gdb_string_h) \
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-sds.o: remote-sds.c $(bfd_h) $(defs_h) $(gdbcmd_h) \
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)

View file

@ -267,13 +267,6 @@ generic_cannot_extract_struct_value_address (char *dummy)
return 0;
}
int
default_register_sim_regno (int num)
{
return num;
}
CORE_ADDR
core_addr_identity (CORE_ADDR addr)
{

View file

@ -94,11 +94,6 @@ extern void set_architecture_from_arch_mach (enum bfd_architecture, unsigned lon
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);

View file

@ -41,6 +41,7 @@
#include "floatformat.h"
#include "gdb/sim-d10v.h"
#include "sim-regno.h"
struct frame_extra_info
{
@ -296,6 +297,8 @@ d10v_imap_register (int reg_nr)
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 @@ d10v_ts2_register_sim_regno (int nr)
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;

View file

@ -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 @@ gdbarch_alloc (const struct gdbarch_info *info,
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;

View file

@ -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 @@ extern void set_gdbarch_print_float_info (struct gdbarch *gdbarch, gdbarch_print
/* 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);

View file

@ -471,7 +471,7 @@ f:2:DO_REGISTERS_INFO:void:do_registers_info:int reg_nr, int fpregs:reg_nr, fpre
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 @@ cat <<EOF
/* 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 @@ cat <<EOF
#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. */

View file

@ -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 @@ gdb_os_error (host_callback * p, const char *format,...)
}
}
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 @@ gdbsim_store_register (int regno)
{
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 @@ gdbsim_store_register (int regno)
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);

50
gdb/sim-regno.h Normal file
View file

@ -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