diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2003-05-25 18:50:55 +0000 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2003-05-25 18:50:55 +0000 |
commit | eb2e12d711192f4fffab8ae75ed40701b42e0bc9 (patch) | |
tree | ea6d060eda7c4928dc82b27a71b0c7bbcd7855cd /gdb/m68k-tdep.c | |
parent | eb2c22dc71e524e1230c61c55a35b98a27edce85 (diff) | |
download | gdb-eb2e12d711192f4fffab8ae75ed40701b42e0bc9.zip gdb-eb2e12d711192f4fffab8ae75ed40701b42e0bc9.tar.gz gdb-eb2e12d711192f4fffab8ae75ed40701b42e0bc9.tar.bz2 |
* m68k-tdep.c (m68k_register_raw_size): Remove cast.
(m68k_register_virtual_size): Likewise.
(altos_skip_prologue): Remove obsolete function.
(isi_frame_num_args): Likewise.
(news_frame_num_args): Likewise.
(m68k_fix_call_dummy): Make static.
(m68k_push_dummy_frame): Likewise.
(m68k_pop_frame): Likewise.
(m68k_skip_prologue): Likewise.
(m68k_frame_init_saved_regs): Likewise.
(m68k_saved_pc_after_call): Likewise.
(m68k_get_longjmp_target): Make multi-arch.
(m68k_gdbarch_init): Allocate and initialize gdbarch_tdep
structure. Register m68k_get_longjmp_target if enabled.
* m68k-tdep.h (struct gdbarch_tdep): Define.
* config/m68k/tm-m68k.h: Don't include "regcache.h".
* Makefile.in (config.status): Also depend on configure.tgt
and configure.host.
(m68klinux-tdep.o): Update dependencies.
* configure.tgt (m68*-*-linux*): Set gdb_multi_arch to 1.
* m68klinux-tdep.c (M68K_LINUX_JB_ELEMENT_SIZE): Define.
(M68K_LINUX_JB_PC): Define.
(m68k_linux_pc_in_sigtramp): Renamed from m68k_linux_in_sigtramp
and take additional parameter.
(m68k_linux_sigtramp_saved_pc): Update.
(m68k_linux_init_abi): Set jb_pc and jb_elt_size. Register
m68k_linux_pc_in_sigtramp, in_plt_section,
find_solib_trampoline_target.
* config/m68k/tm-linux.h: Don't include any tm headers.
(START_INFERIOR_TRAPS_EXPECTED): Remove definition.
(JB_ELEMENT_SIZE): Likewise.
(JB_PC): Likewise.
(GET_LONGJMP_TARGET): Likewise.
(IN_SIGTRAMP): Likewise.
(SVR4_SHARED_LIBS): Define this and include "solib.h".
Diffstat (limited to 'gdb/m68k-tdep.c')
-rw-r--r-- | gdb/m68k-tdep.c | 138 |
1 files changed, 38 insertions, 100 deletions
diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index 087d0bb..81973a1 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -77,13 +77,13 @@ #endif -void m68k_frame_init_saved_regs (struct frame_info *frame_info); +static void m68k_frame_init_saved_regs (struct frame_info *frame_info); /* gdbarch_breakpoint_from_pc is set to m68k_local_breakpoint_from_pc so m68k_remote_breakpoint_from_pc is currently not used. */ -const static unsigned char * +static const unsigned char * m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr) { static unsigned char break_insn[] = {0x4e, (0x40 | REMOTE_BPT_VECTOR)}; @@ -91,7 +91,7 @@ m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr) return break_insn; } -const static unsigned char * +static const unsigned char * m68k_local_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr) { static unsigned char break_insn[] = {0x4e, (0x40 | BPT_VECTOR)}; @@ -110,13 +110,11 @@ m68k_register_bytes_ok (long numbytes) /* Number of bytes of storage in the actual machine representation for register regnum. On the 68000, all regs are 4 bytes except the floating point regs which are 12 bytes. */ -/* Note that the unsigned cast here forces the result of the - subtraction to very high positive values if regnum < FP0_REGNUM */ static int m68k_register_raw_size (int regnum) { - return (((unsigned) (regnum) - FP0_REGNUM) < 8 ? 12 : 4); + return (regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 8 ? 12 : 4); } /* Number of bytes of storage in the program's representation @@ -126,7 +124,7 @@ m68k_register_raw_size (int regnum) static int m68k_register_virtual_size (int regnum) { - return (((unsigned) (regnum) - FP0_REGNUM) < 8 ? 12 : 4); + return (regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 8 ? 12 : 4); } /* Return the GDB type object for the "standard" data type of data in @@ -296,28 +294,6 @@ m68k_frame_saved_pc (struct frame_info *frame) } -/* The only reason this is here is the tm-altos.h reference below. It - was moved back here from tm-m68k.h. FIXME? */ - -extern CORE_ADDR -altos_skip_prologue (CORE_ADDR pc) -{ - register int op = read_memory_unsigned_integer (pc, 2); - if (op == P_LINKW_FP) - pc += 4; /* Skip link #word */ - else if (op == P_LINKL_FP) - pc += 6; /* Skip link #long */ - /* Not sure why branches are here. */ - /* From tm-altos.h */ - else if (op == 0060000) - pc += 4; /* Skip bra #word */ - else if (op == 00600377) - pc += 6; /* skip bra #long */ - else if ((op & 0177400) == 0060000) - pc += 2; /* skip bra #char */ - return pc; -} - int delta68_in_sigtramp (CORE_ADDR pc, char *name) { @@ -353,31 +329,6 @@ delta68_frame_saved_pc (struct frame_info *frame_info) + 4, 4); } -/* Return number of args passed to a frame. - Can return -1, meaning no way to tell. */ - -int -isi_frame_num_args (struct frame_info *fi) -{ - int val; - CORE_ADDR pc = DEPRECATED_FRAME_SAVED_PC (fi); - int insn = read_memory_unsigned_integer (pc, 2); - val = 0; - if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */ - val = read_memory_integer (pc + 2, 2); - else if ((insn & 0170777) == 0050217 /* addql #N, sp */ - || (insn & 0170777) == 0050117) /* addqw */ - { - val = (insn >> 9) & 7; - if (val == 0) - val = 8; - } - else if (insn == 0157774) /* addal #WW, sp */ - val = read_memory_integer (pc + 2, 4); - val >>= 2; - return val; -} - int delta68_frame_num_args (struct frame_info *fi) { @@ -400,33 +351,11 @@ delta68_frame_num_args (struct frame_info *fi) return val; } -int -news_frame_num_args (struct frame_info *fi) -{ - int val; - CORE_ADDR pc = DEPRECATED_FRAME_SAVED_PC (fi); - int insn = read_memory_unsigned_integer (pc, 2); - val = 0; - if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */ - val = read_memory_integer (pc + 2, 2); - else if ((insn & 0170777) == 0050217 /* addql #N, sp */ - || (insn & 0170777) == 0050117) /* addqw */ - { - val = (insn >> 9) & 7; - if (val == 0) - val = 8; - } - else if (insn == 0157774) /* addal #WW, sp */ - val = read_memory_integer (pc + 2, 4); - val >>= 2; - return val; -} - /* Insert the specified number of args and function address into a call sequence of the above form stored at DUMMYNAME. We use the BFD routines to store a big-endian value of known size. */ -void +static void m68k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, struct value **args, struct type *type, int gcc_p) { @@ -438,7 +367,7 @@ m68k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, /* Push an empty stack frame, to record the current PC, etc. */ -void +static void m68k_push_dummy_frame (void) { register CORE_ADDR sp = read_register (SP_REGNUM); @@ -468,7 +397,7 @@ m68k_push_dummy_frame (void) /* Discard from the stack the innermost frame, restoring all saved registers. */ -void +static void m68k_pop_frame (void) { register struct frame_info *frame = get_current_frame (); @@ -539,7 +468,7 @@ m68k_pop_frame (void) */ -CORE_ADDR +static CORE_ADDR m68k_skip_prologue (CORE_ADDR ip) { register CORE_ADDR limit; @@ -580,7 +509,7 @@ m68k_skip_prologue (CORE_ADDR ip) ways in the stack frame. sp is even more special: the address we return for it IS the sp for the next frame. */ -void +static void m68k_frame_init_saved_regs (struct frame_info *frame_info) { register int regnum; @@ -905,17 +834,19 @@ fill_fpregset (fpregset_t *fpregsetp, int regno) we extract the pc (JB_PC) that we will land at. The pc is copied into PC. This routine returns true on success. */ -/* NOTE: cagney/2000-11-08: For this function to be fully multi-arched - the macro's JB_PC and JB_ELEMENT_SIZE would need to be moved into - the ``struct gdbarch_tdep'' object and then set on a target ISA/ABI - dependant basis. */ - int m68k_get_longjmp_target (CORE_ADDR *pc) { -#if defined (JB_PC) && defined (JB_ELEMENT_SIZE) char *buf; CORE_ADDR sp, jb_addr; + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + + if (tdep->jb_pc < 0) + { + internal_error (__FILE__, __LINE__, + "m68k_get_longjmp_target: not implemented"); + return 0; + } buf = alloca (TARGET_PTR_BIT / TARGET_CHAR_BIT); sp = read_register (SP_REGNUM); @@ -926,18 +857,12 @@ m68k_get_longjmp_target (CORE_ADDR *pc) jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT); - if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf, + if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf, TARGET_PTR_BIT / TARGET_CHAR_BIT)) return 0; *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT); - return 1; -#else - internal_error (__FILE__, __LINE__, - "m68k_get_longjmp_target: not implemented"); - return 0; -#endif } /* Immediately after a function call, return the saved pc before the frame @@ -945,7 +870,7 @@ m68k_get_longjmp_target (CORE_ADDR *pc) system call, and if so, we know that Sun pushes the call # on the stack prior to doing the trap. */ -CORE_ADDR +static CORE_ADDR m68k_saved_pc_after_call (struct frame_info *frame) { #ifdef SYSCALL_TRAP @@ -979,11 +904,8 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) if (arches != NULL) return (arches->gdbarch); -#if 0 - tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep)); -#endif - - gdbarch = gdbarch_alloc (&info, 0); + tdep = xmalloc (sizeof (struct gdbarch_tdep)); + gdbarch = gdbarch_alloc (&info, tdep); /* NOTE: cagney/2002-12-06: This can be deleted when this arch is ready to unwind the PC first (see frame.c:get_prev_frame()). */ @@ -1053,9 +975,22 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Should be using push_dummy_call. */ set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp); +#if defined JB_PC && defined JB_ELEMENT_SIZE + tdep->jb_pc = JB_PC; + tdep->jb_elt_size = JB_ELEMENT_SIZE; +#else + tdep->jb_pc = -1; +#endif + /* Hook in ABI-specific overrides, if they have been registered. */ gdbarch_init_osabi (info, gdbarch); + /* Now we have tuned the configuration, set a few final things, + based on what the OS ABI has told us. */ + + if (tdep->jb_pc >= 0) + set_gdbarch_get_longjmp_target (gdbarch, m68k_get_longjmp_target); + return gdbarch; } @@ -1063,7 +998,10 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) static void m68k_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file) { + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + if (tdep == NULL) + return; } void |