2000-07-19 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
Multiarch the sh target. * sh-tdep.c: (sh_generic_reg_names, sh_reg_names,sh3_reg_names, sh3e_reg_names, sh_dsp_reg_names, sh3_dsp_reg_names, sh_processor_type_table): Remove. (XMALLOC): Define. (struct frame_extra_info): Define. (sh_register_raw_size, sh_register_virtual_size, sh_register_virtual_type, sh_register_byte, sh_breakpoint_from_pc, sh_frame_saved_pc, sh_skip_prologue, sh_nofp_frame_init_saved_regs, sh_fp_frame_init_saved_regs, sh_extract_struct_value_address, sh_use_struct_convention, sh_store_struct_return, sh_push_arguments, sh_push_return_address, sh_saved_pc_after_call, sh_generic_register_name, sh_sh_register_name, sh_sh3_register_name, sh_sh3e_register_name, sh_sh_dsp_register_name, sh_sh3_dsp_register_name, sh_frame_args_address, sh_frame_locals_address, sh_coerce_float_to_double, sh_default_store_return_value, sh3e_sh4_store_return_value, sh_generic_show_regs, sh3_show_regs,sh3e_show_regs, sh3_dsp_show_regs, sh4_show_regs, sh_dsp_show_regs, sh_register_byte, sh_register_raw_size, sh_register_virtual_size, sh_sh3e_register_virtual_type, sh_default_register_virtual_type, sh_gdbarch_init): New functions. (sh_target_architecture_hook, sh_frame_find_saved_regs, sh_show_regs): Delete functions. (sh_frame_chain, sh_find_callers_reg, sh_init_extra_frame_info, sh_pop_frame, sh_extract_return_value): Update * config/sh/tm-sh.h (GDB_MULTI_ARCH): Define to 1. (struct gdbarch_tdep): Define. Remove all unnecessary defines. * remote-e7000.c ({PR,GBR,SR,MACL,VBR,MACH}_REGNUM): Define to -1, for h8300 case. (want_sh,want_nopc_sh,want_nopc_sh3): Make nomenclature consistent. (e7000_fetch_registers): Remove ifdef GDB_TARGET_IS_SH, use runtime check instead. (e7000_wait): Ditto. * sh3-rom.c (sh3_supply_register): Use gdbarch_tdep to get the SSR and SPC register numbers. (sh3_regnames, sh3e_regnames): Don't specify a size. * config/h8300/tm-h8300.h: Add comment.
This commit is contained in:
parent
25a8b2508d
commit
cc17453a58
6 changed files with 1288 additions and 677 deletions
|
@ -1,3 +1,51 @@
|
|||
2000-07-19 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||
|
||||
Multiarch the sh target.
|
||||
* sh-tdep.c:
|
||||
(sh_generic_reg_names, sh_reg_names,sh3_reg_names, sh3e_reg_names,
|
||||
sh_dsp_reg_names, sh3_dsp_reg_names, sh_processor_type_table):
|
||||
Remove.
|
||||
(XMALLOC): Define.
|
||||
(struct frame_extra_info): Define.
|
||||
(sh_register_raw_size, sh_register_virtual_size,
|
||||
sh_register_virtual_type, sh_register_byte, sh_breakpoint_from_pc,
|
||||
sh_frame_saved_pc, sh_skip_prologue,
|
||||
sh_nofp_frame_init_saved_regs, sh_fp_frame_init_saved_regs,
|
||||
sh_extract_struct_value_address, sh_use_struct_convention,
|
||||
sh_store_struct_return, sh_push_arguments, sh_push_return_address,
|
||||
sh_saved_pc_after_call, sh_generic_register_name,
|
||||
sh_sh_register_name, sh_sh3_register_name, sh_sh3e_register_name,
|
||||
sh_sh_dsp_register_name, sh_sh3_dsp_register_name,
|
||||
sh_frame_args_address, sh_frame_locals_address,
|
||||
sh_coerce_float_to_double, sh_default_store_return_value,
|
||||
sh3e_sh4_store_return_value, sh_generic_show_regs,
|
||||
sh3_show_regs,sh3e_show_regs, sh3_dsp_show_regs, sh4_show_regs,
|
||||
sh_dsp_show_regs, sh_register_byte, sh_register_raw_size,
|
||||
sh_register_virtual_size, sh_sh3e_register_virtual_type,
|
||||
sh_default_register_virtual_type, sh_gdbarch_init): New functions.
|
||||
(sh_target_architecture_hook, sh_frame_find_saved_regs,
|
||||
sh_show_regs): Delete functions.
|
||||
(sh_frame_chain, sh_find_callers_reg, sh_init_extra_frame_info,
|
||||
sh_pop_frame, sh_extract_return_value): Update
|
||||
|
||||
* config/sh/tm-sh.h (GDB_MULTI_ARCH): Define to 1.
|
||||
(struct gdbarch_tdep): Define.
|
||||
Remove all unnecessary defines.
|
||||
|
||||
* remote-e7000.c ({PR,GBR,SR,MACL,VBR,MACH}_REGNUM): Define to -1,
|
||||
for h8300 case.
|
||||
(want_sh,want_nopc_sh,want_nopc_sh3): Make nomenclature
|
||||
consistent.
|
||||
(e7000_fetch_registers): Remove ifdef GDB_TARGET_IS_SH, use
|
||||
runtime check instead.
|
||||
(e7000_wait): Ditto.
|
||||
|
||||
* sh3-rom.c (sh3_supply_register): Use gdbarch_tdep to get the SSR
|
||||
and SPC register numbers.
|
||||
(sh3_regnames, sh3e_regnames): Don't specify a size.
|
||||
|
||||
* config/h8300/tm-h8300.h: Add comment.
|
||||
|
||||
Wed Jul 19 12:50:16 2000 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* solib.c (elf_locate_base, info_sharedlibrary_command): Rename
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Parameters for execution on a H8/300 series machine.
|
||||
Copyright 1992, 1993 Free Software Foundation, Inc.
|
||||
Copyright 1992, 1993, 2000 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
|
@ -25,7 +25,12 @@ struct frame_saved_regs;
|
|||
struct value;
|
||||
struct type;
|
||||
|
||||
/* 1 if debugging H8/300H application */
|
||||
/* 1 if debugging H8/300H application */
|
||||
|
||||
/* NOTE: ezannoni 2000-07-18: these variables are part of sim, defined
|
||||
in sim/h8300/compile.c. They really should not be used this
|
||||
way. Because of this we cannot get rid of the macro
|
||||
GDB_TARGET_IS_H8300 in remote-e7000.c */
|
||||
extern int h8300hmode;
|
||||
extern int h8300smode;
|
||||
|
||||
|
|
|
@ -20,274 +20,53 @@
|
|||
|
||||
/* Contributed by Steve Chamberlain sac@cygnus.com */
|
||||
|
||||
struct frame_info;
|
||||
struct frame_saved_regs;
|
||||
struct value;
|
||||
struct type;
|
||||
#define GDB_MULTI_ARCH 1
|
||||
|
||||
/* Information that is dependent on the processor variant. */
|
||||
struct gdbarch_tdep
|
||||
{
|
||||
int FPUL_REGNUM; /* sh3e, sh4 */
|
||||
int FPSCR_REGNUM; /* sh3e, sh4 */
|
||||
int DSR_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int FP15_REGNUM; /* sh3e, sh4 */
|
||||
int A0G_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int A0_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int A1G_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int A1_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int M0_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int M1_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int X0_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int X1_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int Y0_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int Y1_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int MOD_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int SSR_REGNUM; /* sh3, sh3-dsp, sh3e, sh4 */
|
||||
int SPC_REGNUM; /* sh3, sh3-dsp, sh3e, sh4 */
|
||||
int RS_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
int RE_REGNUM; /* sh-dsp, sh3-dsp */
|
||||
};
|
||||
|
||||
/* Registers common to all the SH variants. */
|
||||
enum
|
||||
{
|
||||
R0_REGNUM = 0,
|
||||
STRUCT_RETURN_REGNUM = 2,
|
||||
ARG0_REGNUM = 4,
|
||||
ARGLAST_REGNUM = 7,
|
||||
PR_REGNUM = 17,
|
||||
GBR_REGNUM = 18,
|
||||
VBR_REGNUM = 19,
|
||||
MACH_REGNUM = 20,
|
||||
MACL_REGNUM = 21,
|
||||
SR_REGNUM = 22
|
||||
};
|
||||
|
||||
#define NUM_REALREGS 59 /* used in remote-e7000.c which is not multiarched. */
|
||||
|
||||
#define REGISTER_TYPE long /* used in standalone.c */
|
||||
|
||||
#define BIG_REMOTE_BREAKPOINT { 0xc3, 0x20 } /* Used in remote.c */
|
||||
#define LITTLE_REMOTE_BREAKPOINT { 0x20, 0xc3 } /* Used in remote.c */
|
||||
|
||||
/*#define NOP {0x20, 0x0b}*/ /* Who uses this???*/
|
||||
|
||||
#define GDB_TARGET_IS_SH
|
||||
|
||||
#define IEEE_FLOAT (1)
|
||||
|
||||
/* Define the bit, byte, and word ordering of the machine. */
|
||||
|
||||
#define TARGET_BYTE_ORDER_SELECTABLE
|
||||
|
||||
|
||||
/* Offset from address of function to start of its code.
|
||||
Zero on most machines. */
|
||||
|
||||
#define FUNCTION_START_OFFSET 0
|
||||
|
||||
/* Advance PC across any function entry prologue instructions
|
||||
to reach some "real" code. */
|
||||
|
||||
extern CORE_ADDR sh_skip_prologue (CORE_ADDR);
|
||||
#define SKIP_PROLOGUE(ip) (sh_skip_prologue (ip))
|
||||
|
||||
/* Immediately after a function call, return the saved pc.
|
||||
Can't always go through the frames for this because on some machines
|
||||
the new frame is not set up until the new function executes
|
||||
some instructions.
|
||||
|
||||
The return address is the value saved in the PR register + 4 */
|
||||
|
||||
#define SAVED_PC_AFTER_CALL(frame) (ADDR_BITS_REMOVE(read_register(PR_REGNUM)))
|
||||
|
||||
/* Stack grows downward. */
|
||||
|
||||
#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
|
||||
|
||||
/* Illegal instruction - used by the simulator for breakpoint
|
||||
detection */
|
||||
|
||||
#define BREAKPOINT {0xc3, 0xc3} /* 0xc3c3 is trapa #c3, and it works in big
|
||||
and little endian modes */
|
||||
|
||||
#define BIG_REMOTE_BREAKPOINT { 0xc3, 0x20 }
|
||||
#define LITTLE_REMOTE_BREAKPOINT { 0x20, 0xc3 }
|
||||
|
||||
/* If your kernel resets the pc after the trap happens you may need to
|
||||
define this before including this file. */
|
||||
#define DECR_PC_AFTER_BREAK 0
|
||||
|
||||
/* Say how long registers are. */
|
||||
#define REGISTER_TYPE long
|
||||
|
||||
/* Say how much memory is needed to store a copy of the register set */
|
||||
#define REGISTER_BYTES (NUM_REGS*4)
|
||||
|
||||
/* Index within `registers' of the first byte of the space for
|
||||
register N. */
|
||||
|
||||
#define REGISTER_BYTE(N) ((N)*4)
|
||||
|
||||
/* Number of bytes of storage in the actual machine representation
|
||||
for register N. */
|
||||
|
||||
#define REGISTER_RAW_SIZE(N) 4
|
||||
|
||||
#define REGISTER_VIRTUAL_SIZE(N) 4
|
||||
|
||||
/* Largest value REGISTER_RAW_SIZE can have. */
|
||||
|
||||
#define MAX_REGISTER_RAW_SIZE 4
|
||||
|
||||
/* Largest value REGISTER_VIRTUAL_SIZE can have. */
|
||||
|
||||
#define MAX_REGISTER_VIRTUAL_SIZE 4
|
||||
|
||||
/* Return the GDB type object for the "standard" data type
|
||||
of data in register N. */
|
||||
|
||||
#define REGISTER_VIRTUAL_TYPE(N) \
|
||||
(((((N) >= FP0_REGNUM && (N) <= FP15_REGNUM) \
|
||||
|| (N) == FPUL_REGNUM) \
|
||||
&& TARGET_ARCHITECTURE->mach != bfd_mach_sh_dsp \
|
||||
&& TARGET_ARCHITECTURE->mach != bfd_mach_sh3_dsp) \
|
||||
? builtin_type_float : builtin_type_int)
|
||||
|
||||
/* Initializer for an array of names of registers.
|
||||
Entries beyond the first NUM_REGS are ignored. */
|
||||
|
||||
extern char **sh_register_names;
|
||||
#define REGISTER_NAME(i) sh_register_names[i]
|
||||
|
||||
#define NUM_REGS 59
|
||||
|
||||
/* Register numbers of various important registers. Note that some of
|
||||
these values are "real" register numbers, and correspond to the
|
||||
general registers of the machine, and some are "phony" register
|
||||
numbers which are too large to be actual register numbers as far as
|
||||
the user is concerned but do serve to get the desired values when
|
||||
passed to read_register. */
|
||||
|
||||
#define R0_REGNUM 0
|
||||
#define STRUCT_RETURN_REGNUM 2
|
||||
#define ARG0_REGNUM 4
|
||||
#define ARGLAST_REGNUM 7
|
||||
#define FP_REGNUM 14
|
||||
#define SP_REGNUM 15
|
||||
#define PC_REGNUM 16
|
||||
#define PR_REGNUM 17
|
||||
#define GBR_REGNUM 18
|
||||
#define VBR_REGNUM 19
|
||||
#define MACH_REGNUM 20
|
||||
#define MACL_REGNUM 21
|
||||
#define SR_REGNUM 22
|
||||
#define FPUL_REGNUM 23
|
||||
#define FPSCR_REGNUM 24
|
||||
#define DSR_REGNUM 24
|
||||
#define FP0_REGNUM 25
|
||||
#define FP15_REGNUM 40
|
||||
#define A0G_REGNUM 25
|
||||
#define A0_REGNUM 26
|
||||
#define A1G_REGNUM 27
|
||||
#define A1_REGNUM 28
|
||||
#define M0_REGNUM 29
|
||||
#define M1_REGNUM 30
|
||||
#define X0_REGNUM 31
|
||||
#define X1_REGNUM 32
|
||||
#define Y0_REGNUM 33
|
||||
#define Y1_REGNUM 34
|
||||
#define MOD_REGNUM 40
|
||||
#define SSR_REGNUM 41
|
||||
#define SPC_REGNUM 42
|
||||
#define R0B0_REGNUM 43
|
||||
#define R0B1_REGNUM 51
|
||||
#define RS_REGNUM 43
|
||||
#define RE_REGNUM 44
|
||||
#define R0B_REGNUM 51
|
||||
|
||||
#define NUM_REALREGS 59
|
||||
|
||||
/* Store the address of the place in which to copy the structure the
|
||||
subroutine will return. This is called from call_function.
|
||||
|
||||
We store structs through a pointer passed in R0 */
|
||||
|
||||
#define STORE_STRUCT_RETURN(ADDR, SP) \
|
||||
{ write_register (STRUCT_RETURN_REGNUM, (ADDR)); }
|
||||
|
||||
extern use_struct_convention_fn sh_use_struct_convention;
|
||||
#define USE_STRUCT_CONVENTION(gcc_p, type) sh_use_struct_convention (gcc_p, type)
|
||||
|
||||
/* Extract from an array REGBUF containing the (raw) register state
|
||||
a function return value of type TYPE, and copy that, in virtual format,
|
||||
into VALBUF. */
|
||||
|
||||
extern void sh_extract_return_value (struct type *, void *, void *);
|
||||
#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
|
||||
sh_extract_return_value (TYPE, REGBUF, VALBUF)
|
||||
|
||||
/* Write into appropriate registers a function return value
|
||||
of type TYPE, given in virtual format. */
|
||||
|
||||
extern void sh_store_return_value (struct type *, void *);
|
||||
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
|
||||
sh_store_return_value (TYPE, VALBUF)
|
||||
|
||||
/* Extract from an array REGBUF containing the (raw) register state
|
||||
the address in which a function should return its structure value,
|
||||
as a CORE_ADDR (or an expression that can be used as one). */
|
||||
|
||||
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
|
||||
extract_address (REGBUF, REGISTER_RAW_SIZE (0))
|
||||
|
||||
|
||||
/* Define other aspects of the stack frame.
|
||||
we keep a copy of the worked out return pc lying around, since it
|
||||
is a useful bit of info */
|
||||
|
||||
#define EXTRA_FRAME_INFO \
|
||||
CORE_ADDR return_pc; \
|
||||
int leaf_function; \
|
||||
int f_offset;
|
||||
|
||||
#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
|
||||
sh_init_extra_frame_info(fromleaf, fi)
|
||||
extern void sh_init_extra_frame_info (int, struct frame_info *);
|
||||
|
||||
/* A macro that tells us whether the function invocation represented
|
||||
by FI does not have a frame on the stack associated with it. If it
|
||||
does not, FRAMELESS is set to 1, else 0. */
|
||||
|
||||
#define FRAMELESS_FUNCTION_INVOCATION(FI) \
|
||||
(frameless_look_for_prologue(FI))
|
||||
|
||||
#define FRAME_SAVED_PC(FRAME) ((FRAME)->return_pc)
|
||||
#define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
|
||||
#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
|
||||
|
||||
/* Set VAL to the number of args passed to frame described by FI.
|
||||
Can set VAL to -1, meaning no way to tell. */
|
||||
|
||||
/* We can't tell how many args there are */
|
||||
|
||||
#define FRAME_NUM_ARGS(fi) (-1)
|
||||
|
||||
/* Return number of bytes at start of arglist that are not really args. */
|
||||
|
||||
#define FRAME_ARGS_SKIP 0
|
||||
|
||||
extern void sh_frame_find_saved_regs (struct frame_info *fi,
|
||||
struct frame_saved_regs *fsr);
|
||||
|
||||
/* Put here the code to store, into a struct frame_saved_regs,
|
||||
the addresses of the saved registers of frame described by FRAME_INFO.
|
||||
This includes special registers such as pc and fp saved in special
|
||||
ways in the stack frame. sp is even more special:
|
||||
the address we return for it IS the sp for the next frame. */
|
||||
|
||||
#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
|
||||
sh_frame_find_saved_regs(frame_info, &(frame_saved_regs))
|
||||
|
||||
typedef unsigned short INSN_WORD;
|
||||
|
||||
extern CORE_ADDR sh_push_arguments (int nargs,
|
||||
struct value **args,
|
||||
CORE_ADDR sp,
|
||||
unsigned char struct_return,
|
||||
CORE_ADDR struct_addr);
|
||||
|
||||
#define USE_GENERIC_DUMMY_FRAMES 1
|
||||
#define CALL_DUMMY {0}
|
||||
#define CALL_DUMMY_LENGTH (0)
|
||||
#define CALL_DUMMY_START_OFFSET (0)
|
||||
#define CALL_DUMMY_BREAKPOINT_OFFSET (0)
|
||||
#define FIX_CALL_DUMMY(DUMMY, STARTADDR, FUNADDR, NARGS, ARGS, TYPE, GCCP)
|
||||
#define CALL_DUMMY_LOCATION AT_ENTRY_POINT
|
||||
#define CALL_DUMMY_ADDRESS() entry_point_address ()
|
||||
extern CORE_ADDR sh_push_return_address (CORE_ADDR, CORE_ADDR);
|
||||
#define PUSH_RETURN_ADDRESS(PC, SP) sh_push_return_address (PC, SP)
|
||||
|
||||
|
||||
extern CORE_ADDR sh_frame_chain (struct frame_info *);
|
||||
#define FRAME_CHAIN(FRAME) sh_frame_chain(FRAME)
|
||||
#define PUSH_DUMMY_FRAME generic_push_dummy_frame ()
|
||||
#define FRAME_CHAIN_VALID(FP, FRAME) generic_file_frame_chain_valid (FP, FRAME)
|
||||
#define PC_IN_CALL_DUMMY(PC, SP, FP) generic_pc_in_call_dummy (PC, SP, FP)
|
||||
#define PUSH_ARGUMENTS(NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR) \
|
||||
(sh_push_arguments (NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR))
|
||||
|
||||
/* override the standard get_saved_register function with
|
||||
one that takes account of generic CALL_DUMMY frames */
|
||||
#define GET_SAVED_REGISTER(raw_buffer, optimized, addrp, frame, regnum, lval) \
|
||||
generic_get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval)
|
||||
|
||||
/* Discard from the stack the innermost frame, restoring all saved
|
||||
registers. */
|
||||
|
||||
extern void sh_pop_frame (void);
|
||||
#define POP_FRAME sh_pop_frame();
|
||||
|
||||
#define NOP {0x20, 0x0b}
|
||||
|
||||
#define REGISTER_SIZE 4
|
||||
|
||||
#define COERCE_FLOAT_TO_DOUBLE(formal, actual) (1)
|
||||
|
||||
#define BELIEVE_PCC_PROMOTION 1
|
||||
|
||||
/* Need this for WinGDB. See gdb/mswin/{regdoc.h, gdbwin.c, gui.cpp}. */
|
||||
#define TARGET_SH
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Remote debugging interface for Hitachi E7000 ICE, for GDB
|
||||
Copyright 1993, 1994, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
Copyright 1993, 1994, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
|
||||
Contributed by Cygnus Support.
|
||||
|
||||
Written by Steve Chamberlain for Cygnus Support.
|
||||
|
@ -61,6 +61,31 @@
|
|||
#define ACK 0x06
|
||||
#define CTRLZ 0x1a
|
||||
|
||||
/* This file is used by 2 different targets, sh-elf and h8300. The
|
||||
h8300 is not multiarched and doesn't use the registers defined in
|
||||
tm-sh.h. To avoid using a macro GDB_TARGET_IS_SH, we do runtime check
|
||||
of the target, which requires that these namse below are always
|
||||
defined also in the h8300 case. */
|
||||
|
||||
#if !defined (PR_REGNUM)
|
||||
#define PR_REGNUM -1
|
||||
#endif
|
||||
#if !defined (GBR_REGNUM)
|
||||
#define GBR_REGNUM -1
|
||||
#endif
|
||||
#if !defined (VBR_REGNUM)
|
||||
#define VBR_REGNUM -1
|
||||
#endif
|
||||
#if !defined (MACH_REGNUM)
|
||||
#define MACH_REGNUM -1
|
||||
#endif
|
||||
#if !defined (MACL_REGNUM)
|
||||
#define MACL_REGNUM -1
|
||||
#endif
|
||||
#if !defined (SR_REGNUM)
|
||||
#define SR_REGNUM -1
|
||||
#endif
|
||||
|
||||
extern void notice_quit (void);
|
||||
|
||||
extern void report_transfer_performance (unsigned long, time_t, time_t);
|
||||
|
@ -732,8 +757,6 @@ e7000_resume (pid, step, sig)
|
|||
BREAK POINT
|
||||
*/
|
||||
|
||||
#ifdef GDB_TARGET_IS_H8300
|
||||
|
||||
char *want_h8300h = "PC=%p CCR=%c\n\
|
||||
ER0 - ER3 %0 %1 %2 %3\n\
|
||||
ER4 - ER7 %4 %5 %6 %7\n";
|
||||
|
@ -751,17 +774,13 @@ char *want_nopc_h8300s = "%p CCR=%c EXR=%9\n\
|
|||
ER0 - ER3 %0 %1 %2 %3\n\
|
||||
ER4 - ER7 %4 %5 %6 %7";
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef GDB_TARGET_IS_SH
|
||||
|
||||
char *want = "PC=%16 SR=%22\n\
|
||||
char *want_sh = "PC=%16 SR=%22\n\
|
||||
PR=%17 GBR=%18 VBR=%19\n\
|
||||
MACH=%20 MACL=%21\n\
|
||||
R0-7 %0 %1 %2 %3 %4 %5 %6 %7\n\
|
||||
R8-15 %8 %9 %10 %11 %12 %13 %14 %15\n";
|
||||
|
||||
char *want_nopc = "%16 SR=%22\n\
|
||||
char *want_nopc_sh = "%16 SR=%22\n\
|
||||
PR=%17 GBR=%18 VBR=%19\n\
|
||||
MACH=%20 MACL=%21\n\
|
||||
R0-7 %0 %1 %2 %3 %4 %5 %6 %7\n\
|
||||
|
@ -777,7 +796,7 @@ R4_BANK0-R7_BANK0 %29 %30 %31 %32\n\
|
|||
R0_BANK1-R3_BANK1 %33 %34 %35 %36\n\
|
||||
R4_BANK1-R7_BANK1 %37 %38 %39 %40";
|
||||
|
||||
char *want_sh3_nopc = "%16 SR=%22\n\
|
||||
char *want_nopc_sh3 = "%16 SR=%22\n\
|
||||
PR=%17 GBR=%18 VBR=%19\n\
|
||||
MACH=%20 MACL=%21 SSR=%22 SPC=%23\n\
|
||||
R0-7 %0 %1 %2 %3 %4 %5 %6 %7\n\
|
||||
|
@ -787,8 +806,6 @@ char *want_sh3_nopc = "%16 SR=%22\n\
|
|||
R0_BANK1-R3_BANK1 %33 %34 %35 %36\n\
|
||||
R4_BANK1-R7_BANK1 %37 %38 %39 %40";
|
||||
|
||||
#endif
|
||||
|
||||
static int
|
||||
gch ()
|
||||
{
|
||||
|
@ -920,22 +937,27 @@ e7000_fetch_registers ()
|
|||
|
||||
puts_e7000debug ("R\r");
|
||||
|
||||
#ifdef GDB_TARGET_IS_SH
|
||||
wanted = want;
|
||||
if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
|
||||
switch (TARGET_ARCHITECTURE->mach)
|
||||
{
|
||||
case bfd_mach_sh3:
|
||||
case bfd_mach_sh3e:
|
||||
case bfd_mach_sh4:
|
||||
wanted = want_sh3;
|
||||
}
|
||||
#else
|
||||
if (h8300smode)
|
||||
wanted = want_h8300s;
|
||||
else
|
||||
wanted = want_h8300h;
|
||||
{
|
||||
wanted = want_sh;
|
||||
switch (TARGET_ARCHITECTURE->mach)
|
||||
{
|
||||
case bfd_mach_sh3:
|
||||
case bfd_mach_sh3e:
|
||||
case bfd_mach_sh4:
|
||||
wanted = want_sh3;
|
||||
}
|
||||
}
|
||||
#ifdef GDB_TARGET_IS_H8300
|
||||
if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
|
||||
{
|
||||
if (h8300smode)
|
||||
wanted = want_h8300s;
|
||||
else
|
||||
wanted = want_h8300h;
|
||||
}
|
||||
#endif
|
||||
|
||||
fetch_regs_from_dump (gch, wanted);
|
||||
|
||||
/* And supply the extra ones the simulator uses */
|
||||
|
@ -984,69 +1006,76 @@ e7000_store_register (regno)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef GDB_TARGET_IS_H8300
|
||||
if (regno <= 7)
|
||||
if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
|
||||
{
|
||||
sprintf (buf, ".ER%d %x\r", regno, read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
else if (regno == PC_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".PC %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
else if (regno == CCR_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".CCR %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
#endif /* GDB_TARGET_IS_H8300 */
|
||||
|
||||
#ifdef GDB_TARGET_IS_SH
|
||||
switch (regno)
|
||||
{
|
||||
default:
|
||||
sprintf (buf, ".R%d %x\r", regno, read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
break;
|
||||
|
||||
case PC_REGNUM:
|
||||
sprintf (buf, ".PC %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
break;
|
||||
|
||||
case SR_REGNUM:
|
||||
sprintf (buf, ".SR %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
break;
|
||||
|
||||
case PR_REGNUM:
|
||||
sprintf (buf, ".PR %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
break;
|
||||
|
||||
case GBR_REGNUM:
|
||||
sprintf (buf, ".GBR %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
break;
|
||||
|
||||
case VBR_REGNUM:
|
||||
sprintf (buf, ".VBR %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
break;
|
||||
|
||||
case MACH_REGNUM:
|
||||
sprintf (buf, ".MACH %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
break;
|
||||
|
||||
case MACL_REGNUM:
|
||||
sprintf (buf, ".MACL %x\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
break;
|
||||
if (regno <= 7)
|
||||
{
|
||||
sprintf (buf, ".ER%d %lx\r", regno, read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
else if (regno == PC_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".PC %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
#ifdef CCR_REGNUM
|
||||
else if (regno == CCR_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".CCR %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* GDB_TARGET_IS_SH */
|
||||
else if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
|
||||
{
|
||||
if (regno == PC_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".PC %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
|
||||
else if (regno == SR_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".SR %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
|
||||
else if (regno == PR_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".PR %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
|
||||
else if (regno == GBR_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".GBR %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
|
||||
else if (regno == VBR_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".VBR %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
|
||||
else if (regno == MACH_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".MACH %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
|
||||
else if (regno == MACL_REGNUM)
|
||||
{
|
||||
sprintf (buf, ".MACL %lx\r", read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (buf, ".R%d %lx\r", regno, read_register (regno));
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
}
|
||||
|
||||
expect_prompt ();
|
||||
}
|
||||
|
@ -1098,7 +1127,7 @@ write_small (memaddr, myaddr, len)
|
|||
if (((memaddr + i) & 3) == 0 && (i + 3 < len))
|
||||
{
|
||||
/* Can be done with a long word */
|
||||
sprintf (buf, "m %x %x%02x%02x%02x;l\r",
|
||||
sprintf (buf, "m %lx %x%02x%02x%02x;l\r",
|
||||
memaddr + i,
|
||||
myaddr[i], myaddr[i + 1], myaddr[i + 2], myaddr[i + 3]);
|
||||
puts_e7000debug (buf);
|
||||
|
@ -1106,7 +1135,7 @@ write_small (memaddr, myaddr, len)
|
|||
}
|
||||
else
|
||||
{
|
||||
sprintf (buf, "m %x %x\r", memaddr + i, myaddr[i]);
|
||||
sprintf (buf, "m %lx %x\r", memaddr + i, myaddr[i]);
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
}
|
||||
|
@ -1268,7 +1297,7 @@ e7000_read_inferior_memory (memaddr, myaddr, len)
|
|||
return 0;
|
||||
}
|
||||
|
||||
sprintf (buf, "m %x;l\r", memaddr);
|
||||
sprintf (buf, "m %lx;l\r", memaddr);
|
||||
puts_e7000debug (buf);
|
||||
|
||||
for (count = 0; count < len; count += 4)
|
||||
|
@ -1349,7 +1378,7 @@ e7000_read_inferior_memory_large (memaddr, myaddr, len)
|
|||
return 0;
|
||||
}
|
||||
|
||||
sprintf (buf, "d %x %x\r", memaddr, memaddr + len - 1);
|
||||
sprintf (buf, "d %lx %lx\r", memaddr, memaddr + len - 1);
|
||||
puts_e7000debug (buf);
|
||||
|
||||
count = 0;
|
||||
|
@ -1603,7 +1632,7 @@ e7000_load (args, from_tty)
|
|||
section_size = bfd_get_section_size_before_reloc (section);
|
||||
|
||||
if (!quiet)
|
||||
printf_filtered ("[Loading section %s at 0x%x (%d bytes)]\n",
|
||||
printf_filtered ("[Loading section %s at 0x%x (%ud bytes)]\n",
|
||||
bfd_get_section_name (pbfd, section),
|
||||
section_address,
|
||||
section_size);
|
||||
|
@ -1736,12 +1765,12 @@ e7000_insert_breakpoint (addr, shadow)
|
|||
#ifdef HARD_BREAKPOINTS
|
||||
if (BC_BREAKPOINTS)
|
||||
{
|
||||
sprintf (buf, "BC%d A=%x\r", i + 1, addr);
|
||||
sprintf (buf, "BC%d A=%lx\r", i + 1, addr);
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (buf, "B %x\r", addr);
|
||||
sprintf (buf, "B %lx\r", addr);
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
#else
|
||||
|
@ -1782,12 +1811,12 @@ e7000_remove_breakpoint (addr, shadow)
|
|||
}
|
||||
else
|
||||
{
|
||||
sprintf (buf, "B - %x\r", addr);
|
||||
sprintf (buf, "B - %lx\r", addr);
|
||||
puts_e7000debug (buf);
|
||||
}
|
||||
expect_prompt ();
|
||||
#else
|
||||
sprintf (buf, "B - %x\r", addr);
|
||||
sprintf (buf, "B - %lx\r", addr);
|
||||
puts_e7000debug (buf);
|
||||
expect_prompt ();
|
||||
|
||||
|
@ -1800,7 +1829,7 @@ e7000_remove_breakpoint (addr, shadow)
|
|||
return 0;
|
||||
}
|
||||
|
||||
warning ("Can't find breakpoint associated with 0x%x\n", addr);
|
||||
warning ("Can't find breakpoint associated with 0x%lx\n", addr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2008,7 +2037,7 @@ sub2_from_pc ()
|
|||
REGISTER_RAW_SIZE (PC_REGNUM),
|
||||
read_register (PC_REGNUM) - 2);
|
||||
supply_register (PC_REGNUM, buf);
|
||||
sprintf (buf2, ".PC %x\r", read_register (PC_REGNUM));
|
||||
sprintf (buf2, ".PC %lx\r", read_register (PC_REGNUM));
|
||||
puts_e7000debug (buf2);
|
||||
}
|
||||
|
||||
|
@ -2078,21 +2107,25 @@ e7000_wait (pid, status)
|
|||
/* Skip till the PC= */
|
||||
expect ("=");
|
||||
|
||||
#ifdef GDB_TARGET_IS_SH
|
||||
wanted_nopc = want_nopc;
|
||||
if (TARGET_ARCHITECTURE->arch == bfd_arch_sh)
|
||||
switch (TARGET_ARCHITECTURE->mach)
|
||||
{
|
||||
case bfd_mach_sh3:
|
||||
case bfd_mach_sh3e:
|
||||
case bfd_mach_sh4:
|
||||
wanted_nopc = want_sh3_nopc;
|
||||
}
|
||||
#else
|
||||
if (h8300smode)
|
||||
wanted_nopc = want_nopc_h8300s;
|
||||
else
|
||||
wanted_nopc = want_nopc_h8300h;
|
||||
{
|
||||
wanted_nopc = want_nopc_sh;
|
||||
switch (TARGET_ARCHITECTURE->mach)
|
||||
{
|
||||
case bfd_mach_sh3:
|
||||
case bfd_mach_sh3e:
|
||||
case bfd_mach_sh4:
|
||||
wanted_nopc = want_nopc_sh3;
|
||||
}
|
||||
}
|
||||
#ifdef GDB_TARGET_IS_H8300
|
||||
if (TARGET_ARCHITECTURE->arch == bfd_arch_h8300)
|
||||
{
|
||||
if (h8300smode)
|
||||
wanted_nopc = want_nopc_h8300s;
|
||||
else
|
||||
wanted_nopc = want_nopc_h8300h;
|
||||
}
|
||||
#endif
|
||||
fetch_regs_from_dump (gch, wanted_nopc);
|
||||
|
||||
|
|
1326
gdb/sh-tdep.c
1326
gdb/sh-tdep.c
File diff suppressed because it is too large
Load diff
|
@ -76,9 +76,9 @@ sh3_supply_register (regname, regnamelen, val, vallen)
|
|||
break;
|
||||
case 'S':
|
||||
if (regname[1] == 'S' && regname[2] == 'R')
|
||||
regno = SSR_REGNUM;
|
||||
regno = gdbarch_tdep (current_gdbarch)->SSR_REGNUM;
|
||||
else if (regname[1] == 'P' && regname[2] == 'C')
|
||||
regno = SPC_REGNUM;
|
||||
regno = gdbarch_tdep (current_gdbarch)->SPC_REGNUM;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ sh3_load (desc, file, hashmark)
|
|||
than does GDB, and don't necessarily support all the registers
|
||||
either. So, typing "info reg sp" becomes a "r30". */
|
||||
|
||||
static char *sh3_regnames[NUM_REGS] =
|
||||
static char *sh3_regnames[] =
|
||||
{
|
||||
"R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
|
||||
"R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
|
||||
|
@ -168,7 +168,7 @@ static char *sh3_regnames[NUM_REGS] =
|
|||
"R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1"
|
||||
};
|
||||
|
||||
static char *sh3e_regnames[NUM_REGS] =
|
||||
static char *sh3e_regnames[] =
|
||||
{
|
||||
"R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
|
||||
"R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
|
||||
|
|
Loading…
Reference in a new issue