mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-01 13:26:47 +08:00
* m68k-tdep.c (P_LINKL_FP, P_LINKW_FP): Macros renamed from P_LINK_L
and P_LINK_W. (P_PEA_FP, P_MOVL_SP_FP): New macros. (P_MOVL, P_LEAL, P_MOVML): Macros renamed from P_MOV_L, P_LEA_L and P_MOVM_L. (altos_skip_prologue, isi_skip_prologue): Use P_* macros, not octal constants. (delta68_in_sigtramp): New function. (delta68_frame_args_address, delta68_frame_saved_pc): Ditto. (m68k_skip_prologue): Use P_* macros, not hex constants. (m68k_find_saved_regs): Do not expect a fixed sequence of register save instructions, but accept them in any order; use P_* macros, not octal or hex constants; recognize also `fmovemx to (fp + displacement)' and `moveml to (fp + displacement)'. * m68/tm-delta68.h (IN_SIGTRAMP): New macro. (FRAME_SAVED_PC, FRAME_ARGS_ADDRESS): Ditto.
This commit is contained in:
parent
b9deaee7a0
commit
89c3b6d36d
@ -1,3 +1,22 @@
|
||||
Thu Mar 23 13:18:26 2000 Philippe De Muyter <phdm@macqel.be>
|
||||
|
||||
* m68k-tdep.c (P_LINKL_FP, P_LINKW_FP): Macros renamed from P_LINK_L
|
||||
and P_LINK_W.
|
||||
(P_PEA_FP, P_MOVL_SP_FP): New macros.
|
||||
(P_MOVL, P_LEAL, P_MOVML): Macros renamed from P_MOV_L, P_LEA_L and
|
||||
P_MOVM_L.
|
||||
(altos_skip_prologue, isi_skip_prologue): Use P_* macros, not octal
|
||||
constants.
|
||||
(delta68_in_sigtramp): New function.
|
||||
(delta68_frame_args_address, delta68_frame_saved_pc): Ditto.
|
||||
(m68k_skip_prologue): Use P_* macros, not hex constants.
|
||||
(m68k_find_saved_regs): Do not expect a fixed sequence of register save
|
||||
instructions, but accept them in any order; use P_* macros, not octal
|
||||
or hex constants; recognize also `fmovemx to (fp + displacement)' and
|
||||
`moveml to (fp + displacement)'.
|
||||
* m68/tm-delta68.h (IN_SIGTRAMP): New macro.
|
||||
(FRAME_SAVED_PC, FRAME_ARGS_ADDRESS): Ditto.
|
||||
|
||||
Fri Mar 24 13:44:57 2000 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* MAINTAINERS: Add Fernando Nasser to testsuite maintainers.
|
||||
|
@ -92,3 +92,14 @@ extern int delta68_frame_num_args PARAMS ((struct frame_info * fi));
|
||||
#undef EXTRACT_STRUCT_VALUE_ADDRESS
|
||||
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF)\
|
||||
(*(CORE_ADDR *)((char*)(REGBUF) + 8 * 4))
|
||||
|
||||
extern int delta68_in_sigtramp PARAMS ((CORE_ADDR pc, char * name));
|
||||
#define IN_SIGTRAMP(pc,name) delta68_in_sigtramp (pc, name)
|
||||
|
||||
extern CORE_ADDR delta68_frame_saved_pc PARAMS ((struct frame_info * fi));
|
||||
#undef FRAME_SAVED_PC
|
||||
#define FRAME_SAVED_PC(fi) delta68_frame_saved_pc (fi)
|
||||
|
||||
extern CORE_ADDR delta68_frame_args_address PARAMS ((struct frame_info * fi));
|
||||
#undef FRAME_ARGS_ADDRESS
|
||||
#define FRAME_ARGS_ADDRESS(fi) delta68_frame_args_address (fi)
|
||||
|
259
gdb/m68k-tdep.c
259
gdb/m68k-tdep.c
@ -27,6 +27,18 @@
|
||||
#include "inferior.h"
|
||||
|
||||
|
||||
#define P_LINKL_FP 0x480e
|
||||
#define P_LINKW_FP 0x4e56
|
||||
#define P_PEA_FP 0x4856
|
||||
#define P_MOVL_SP_FP 0x2c4f
|
||||
#define P_MOVL 0x207c
|
||||
#define P_JSR 0x4eb9
|
||||
#define P_BSR 0x61ff
|
||||
#define P_LEAL 0x43fb
|
||||
#define P_MOVML 0x48ef
|
||||
#define P_FMOVM 0xf237
|
||||
#define P_TRAP 0x4e40
|
||||
|
||||
/* The only reason this is here is the tm-altos.h reference below. It
|
||||
was moved back here from tm-m68k.h. FIXME? */
|
||||
|
||||
@ -35,9 +47,9 @@ altos_skip_prologue (pc)
|
||||
CORE_ADDR pc;
|
||||
{
|
||||
register int op = read_memory_integer (pc, 2);
|
||||
if (op == 0047126)
|
||||
if (op == P_LINKW_FP)
|
||||
pc += 4; /* Skip link #word */
|
||||
else if (op == 0044016)
|
||||
else if (op == P_LINKL_FP)
|
||||
pc += 6; /* Skip link #long */
|
||||
/* Not sure why branches are here. */
|
||||
/* From tm-isi.h, tm-altos.h */
|
||||
@ -58,9 +70,9 @@ isi_skip_prologue (pc)
|
||||
CORE_ADDR pc;
|
||||
{
|
||||
register int op = read_memory_integer (pc, 2);
|
||||
if (op == 0047126)
|
||||
if (op == P_LINKW_FP)
|
||||
pc += 4; /* Skip link #word */
|
||||
else if (op == 0044016)
|
||||
else if (op == P_LINKL_FP)
|
||||
pc += 6; /* Skip link #long */
|
||||
/* Not sure why branches are here. */
|
||||
/* From tm-isi.h, tm-altos.h */
|
||||
@ -73,6 +85,41 @@ isi_skip_prologue (pc)
|
||||
return pc;
|
||||
}
|
||||
|
||||
int
|
||||
delta68_in_sigtramp (pc, name)
|
||||
CORE_ADDR pc;
|
||||
char *name;
|
||||
{
|
||||
return strcmp (name, "_sigcode") == 0;
|
||||
}
|
||||
|
||||
CORE_ADDR
|
||||
delta68_frame_args_address (frame_info)
|
||||
struct frame_info * frame_info;
|
||||
{
|
||||
/* we assume here that the only frameless functions are the system calls
|
||||
or other functions who do not put anything on the stack. */
|
||||
if (frame_info->signal_handler_caller)
|
||||
return frame_info->frame + 12;
|
||||
else if (frameless_look_for_prologue (frame_info))
|
||||
{
|
||||
/* Check for an interrupted system call */
|
||||
if (frame_info->next && frame_info->next->signal_handler_caller)
|
||||
return frame_info->next->frame + 16;
|
||||
else
|
||||
return frame_info->frame + 4;
|
||||
}
|
||||
else
|
||||
return frame_info->frame;
|
||||
}
|
||||
|
||||
CORE_ADDR
|
||||
delta68_frame_saved_pc (frame_info)
|
||||
struct frame_info * frame_info;
|
||||
{
|
||||
return read_memory_integer (delta68_frame_args_address (frame_info) + 4, 4);
|
||||
}
|
||||
|
||||
/* Return number of args passed to a frame.
|
||||
Can return -1, meaning no way to tell. */
|
||||
|
||||
@ -246,16 +293,6 @@ m68k_pop_frame ()
|
||||
|
||||
*/
|
||||
|
||||
#define P_LINK_L 0x480e
|
||||
#define P_LINK_W 0x4e56
|
||||
#define P_MOV_L 0x207c
|
||||
#define P_JSR 0x4eb9
|
||||
#define P_BSR 0x61ff
|
||||
#define P_LEA_L 0x43fb
|
||||
#define P_MOVM_L 0x48ef
|
||||
#define P_FMOVM 0xf237
|
||||
#define P_TRAP 0x4e40
|
||||
|
||||
CORE_ADDR
|
||||
m68k_skip_prologue (ip)
|
||||
CORE_ADDR ip;
|
||||
@ -275,30 +312,20 @@ m68k_skip_prologue (ip)
|
||||
op = read_memory_integer (ip, 2);
|
||||
op &= 0xFFFF;
|
||||
|
||||
if (op == P_LINK_W)
|
||||
{
|
||||
ip += 4; /* Skip link.w */
|
||||
}
|
||||
else if (op == 0x4856)
|
||||
if (op == P_LINKW_FP)
|
||||
ip += 4; /* Skip link.w */
|
||||
else if (op == P_PEA_FP)
|
||||
ip += 2; /* Skip pea %fp */
|
||||
else if (op == 0x2c4f)
|
||||
else if (op == P_MOVL_SP_FP)
|
||||
ip += 2; /* Skip move.l %sp, %fp */
|
||||
else if (op == P_LINK_L)
|
||||
{
|
||||
ip += 6; /* Skip link.l */
|
||||
}
|
||||
else if (op == P_MOVM_L)
|
||||
{
|
||||
ip += 6; /* Skip movm.l */
|
||||
}
|
||||
else if (op == P_LINKL_FP)
|
||||
ip += 6; /* Skip link.l */
|
||||
else if (op == P_MOVML)
|
||||
ip += 6; /* Skip movm.l */
|
||||
else if (op == P_FMOVM)
|
||||
{
|
||||
ip += 10; /* Skip fmovm */
|
||||
}
|
||||
ip += 10; /* Skip fmovm */
|
||||
else
|
||||
{
|
||||
break; /* Found unknown code, bail out. */
|
||||
}
|
||||
break; /* Found unknown code, bail out. */
|
||||
}
|
||||
return (ip);
|
||||
}
|
||||
@ -335,26 +362,31 @@ m68k_find_saved_regs (frame_info, saved_regs)
|
||||
{
|
||||
pc = get_pc_function_start ((frame_info)->pc);
|
||||
|
||||
if (0x4856 == read_memory_integer (pc, 2)
|
||||
&& 0x2c4f == read_memory_integer (pc + 2, 2))
|
||||
nextinsn = read_memory_integer (pc, 2);
|
||||
if (P_PEA_FP == nextinsn
|
||||
&& P_MOVL_SP_FP == read_memory_integer (pc + 2, 2))
|
||||
{
|
||||
/*
|
||||
pea %fp
|
||||
/* pea %fp
|
||||
move.l %sp, %fp */
|
||||
|
||||
pc += 4;
|
||||
next_addr = frame_info->frame;
|
||||
pc += 4;
|
||||
}
|
||||
else if (044016 == read_memory_integer (pc, 2))
|
||||
else if (P_LINKL_FP == nextinsn)
|
||||
/* link.l %fp */
|
||||
/* Find the address above the saved
|
||||
regs using the amount of storage from the link instruction. */
|
||||
next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 4), pc += 4;
|
||||
else if (047126 == read_memory_integer (pc, 2))
|
||||
{
|
||||
next_addr = (frame_info)->frame + read_memory_integer (pc + 2, 4);
|
||||
pc += 6;
|
||||
}
|
||||
else if (P_LINKW_FP == nextinsn)
|
||||
/* link.w %fp */
|
||||
/* Find the address above the saved
|
||||
regs using the amount of storage from the link instruction. */
|
||||
next_addr = (frame_info)->frame + read_memory_integer (pc += 2, 2), pc += 2;
|
||||
{
|
||||
next_addr = (frame_info)->frame + read_memory_integer (pc + 2, 2);
|
||||
pc += 4;
|
||||
}
|
||||
else
|
||||
goto lose;
|
||||
|
||||
@ -362,66 +394,99 @@ m68k_find_saved_regs (frame_info, saved_regs)
|
||||
if ((0177777 & read_memory_integer (pc, 2)) == 0157774)
|
||||
next_addr += read_memory_integer (pc += 2, 4), pc += 4;
|
||||
}
|
||||
regmask = read_memory_integer (pc + 2, 2);
|
||||
|
||||
/* Here can come an fmovem. Check for it. */
|
||||
nextinsn = 0xffff & read_memory_integer (pc, 2);
|
||||
if (0xf227 == nextinsn
|
||||
&& (regmask & 0xff00) == 0xe000)
|
||||
for ( ; ; )
|
||||
{
|
||||
pc += 4; /* Regmask's low bit is for register fp7, the first pushed */
|
||||
for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
saved_regs->regs[regnum] = (next_addr -= 12);
|
||||
nextinsn = 0xffff & read_memory_integer (pc, 2);
|
||||
regmask = read_memory_integer (pc + 2, 2);
|
||||
}
|
||||
|
||||
/* next should be a moveml to (sp) or -(sp) or a movl r,-(sp) */
|
||||
if (0044327 == read_memory_integer (pc, 2))
|
||||
{
|
||||
pc += 4; /* Regmask's low bit is for register 0, the first written */
|
||||
for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
saved_regs->regs[regnum] = (next_addr += 4) - 4;
|
||||
}
|
||||
else if (0044347 == read_memory_integer (pc, 2))
|
||||
{
|
||||
pc += 4; /* Regmask's low bit is for register 15, the first pushed */
|
||||
for (regnum = 15; regnum >= 0; regnum--, regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
saved_regs->regs[regnum] = (next_addr -= 4);
|
||||
}
|
||||
else if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2)))
|
||||
{
|
||||
regnum = 0xf & read_memory_integer (pc, 2);
|
||||
pc += 2;
|
||||
saved_regs->regs[regnum] = (next_addr -= 4);
|
||||
/* gcc, at least, may use a pair of movel instructions when saving
|
||||
exactly 2 registers. */
|
||||
if (0x2f00 == (0xfff0 & read_memory_integer (pc, 2)))
|
||||
/* fmovemx to -(sp) */
|
||||
if (0xf227 == nextinsn && (regmask & 0xff00) == 0xe000)
|
||||
{
|
||||
regnum = 0xf & read_memory_integer (pc, 2);
|
||||
pc += 2;
|
||||
saved_regs->regs[regnum] = (next_addr -= 4);
|
||||
/* Regmask's low bit is for register fp7, the first pushed */
|
||||
for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
saved_regs->regs[regnum] = (next_addr -= 12);
|
||||
pc += 4;
|
||||
}
|
||||
}
|
||||
/* fmovemx to (fp + displacement) */
|
||||
else if (0171056 == nextinsn && (regmask & 0xff00) == 0xf000)
|
||||
{
|
||||
register CORE_ADDR addr;
|
||||
|
||||
/* fmovemx to index of sp may follow. */
|
||||
regmask = read_memory_integer (pc + 2, 2);
|
||||
nextinsn = 0xffff & read_memory_integer (pc, 2);
|
||||
if (0xf236 == nextinsn
|
||||
&& (regmask & 0xff00) == 0xf000)
|
||||
{
|
||||
pc += 10; /* Regmask's low bit is for register fp0, the first written */
|
||||
for (regnum = FP0_REGNUM + 7; regnum >= FP0_REGNUM; regnum--, regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
saved_regs->regs[regnum] = (next_addr += 12) - 12;
|
||||
regmask = read_memory_integer (pc + 2, 2);
|
||||
}
|
||||
addr = (frame_info)->frame + read_memory_integer (pc + 4, 2);
|
||||
/* Regmask's low bit is for register fp7, the first pushed */
|
||||
for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
{
|
||||
saved_regs->regs[regnum] = addr;
|
||||
addr += 12;
|
||||
}
|
||||
pc += 6;
|
||||
}
|
||||
/* moveml to (sp) */
|
||||
else if (0044327 == nextinsn)
|
||||
{
|
||||
/* Regmask's low bit is for register 0, the first written */
|
||||
for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
{
|
||||
saved_regs->regs[regnum] = next_addr;
|
||||
next_addr += 4;
|
||||
}
|
||||
pc += 4;
|
||||
}
|
||||
/* moveml to (fp + displacement) */
|
||||
else if (0044356 == nextinsn)
|
||||
{
|
||||
register CORE_ADDR addr;
|
||||
|
||||
/* clrw -(sp); movw ccr,-(sp) may follow. */
|
||||
if (0x426742e7 == read_memory_integer (pc, 4))
|
||||
saved_regs->regs[PS_REGNUM] = (next_addr -= 4);
|
||||
addr = (frame_info)->frame + read_memory_integer (pc + 4, 2);
|
||||
/* Regmask's low bit is for register 0, the first written */
|
||||
for (regnum = 0; regnum < 16; regnum++, regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
{
|
||||
saved_regs->regs[regnum] = addr;
|
||||
addr += 4;
|
||||
}
|
||||
pc += 6;
|
||||
}
|
||||
/* moveml to -(sp) */
|
||||
else if (0044347 == nextinsn)
|
||||
{
|
||||
/* Regmask's low bit is for register 15, the first pushed */
|
||||
for (regnum = 16; --regnum >= 0; regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
saved_regs->regs[regnum] = (next_addr -= 4);
|
||||
pc += 4;
|
||||
}
|
||||
/* movl r,-(sp) */
|
||||
else if (0x2f00 == (0xfff0 & nextinsn))
|
||||
{
|
||||
regnum = 0xf & nextinsn;
|
||||
saved_regs->regs[regnum] = (next_addr -= 4);
|
||||
pc += 2;
|
||||
}
|
||||
/* fmovemx to index of sp */
|
||||
else if (0xf236 == nextinsn && (regmask & 0xff00) == 0xf000)
|
||||
{
|
||||
/* Regmask's low bit is for register fp0, the first written */
|
||||
for (regnum = FP0_REGNUM + 8; --regnum >= FP0_REGNUM; regmask >>= 1)
|
||||
if (regmask & 1)
|
||||
{
|
||||
saved_regs->regs[regnum] = next_addr;
|
||||
next_addr += 12;
|
||||
}
|
||||
pc += 10;
|
||||
}
|
||||
/* clrw -(sp); movw ccr,-(sp) */
|
||||
else if (0x4267 == nextinsn && 0x42e7 == regmask)
|
||||
{
|
||||
saved_regs->regs[PS_REGNUM] = (next_addr -= 4);
|
||||
pc += 4;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
lose:;
|
||||
saved_regs->regs[SP_REGNUM] = (frame_info)->frame + 8;
|
||||
saved_regs->regs[FP_REGNUM] = (frame_info)->frame;
|
||||
|
Loading…
Reference in New Issue
Block a user