2004-02-10 Andrew Cagney <cagney@redhat.com>

* mips-tdep.c (mips_gdbarch_init): Delete deprecated frame code.
	(mips_init_frame_pc_first): Delete function.
	(mips_frame_saved_pc): Delete function.
	(mips_frame_chain): Delete function.
	(mips_init_extra_frame_info): Delete function.
	(mips_xfer_register): Delete unused variable "reg".
	(mips_n32n64_push_dummy_call): Delete unused variable "valbuf".
	(mips_n32n64_return_value): Delete unused variable "reg".
	(mips_n32n64_return_value): Delete unused variable "pos".
	(mips_o32_push_dummy_call): Delete unused variable "valbuf".
	(mips_o32_return_value): Delete unused variable "pos".
	(mips_o64_push_dummy_call): Delete unused variable "valbuf".
	(mips_print_fp_register): Delete unused variable "namelen"
	(mips_print_fp_register): Delete unused variable "flt2"
	(get_frame_pointer): Delete function.
	(cached_proc_desc): Delete static variable.
	(mips_pop_frame): Delete function.
	(mips_find_saved_regs): Delete function.
	(mips_get_saved_register): Delete function.
	(mips_saved_pc_after_call): Delete function.
	(SIGFRAME_BASE): Delete macro.
	(SIGFRAME_FPREGSAVE_OFF): Delete macro.
	(SIGFRAME_PC_OFF): Delete macro.
	(SIGFRAME_REGSAVE_OFF): Delete macro.
	(mips_dump_tdep): Do not print deleted macro definitions.
This commit is contained in:
Andrew Cagney 2004-02-11 00:02:52 +00:00
parent 20ede57d1a
commit 3903d4379d
2 changed files with 30 additions and 602 deletions

View File

@ -1,3 +1,31 @@
2004-02-10 Andrew Cagney <cagney@redhat.com>
* mips-tdep.c (mips_gdbarch_init): Delete deprecated frame code.
(mips_init_frame_pc_first): Delete function.
(mips_frame_saved_pc): Delete function.
(mips_frame_chain): Delete function.
(mips_init_extra_frame_info): Delete function.
(mips_xfer_register): Delete unused variable "reg".
(mips_n32n64_push_dummy_call): Delete unused variable "valbuf".
(mips_n32n64_return_value): Delete unused variable "reg".
(mips_n32n64_return_value): Delete unused variable "pos".
(mips_o32_push_dummy_call): Delete unused variable "valbuf".
(mips_o32_return_value): Delete unused variable "pos".
(mips_o64_push_dummy_call): Delete unused variable "valbuf".
(mips_print_fp_register): Delete unused variable "namelen"
(mips_print_fp_register): Delete unused variable "flt2"
(get_frame_pointer): Delete function.
(cached_proc_desc): Delete static variable.
(mips_pop_frame): Delete function.
(mips_find_saved_regs): Delete function.
(mips_get_saved_register): Delete function.
(mips_saved_pc_after_call): Delete function.
(SIGFRAME_BASE): Delete macro.
(SIGFRAME_FPREGSAVE_OFF): Delete macro.
(SIGFRAME_PC_OFF): Delete macro.
(SIGFRAME_REGSAVE_OFF): Delete macro.
(mips_dump_tdep): Do not print deleted macro definitions.
2004-02-10 Andrew Cagney <cagney@redhat.com>
* Makefile.in (SFILES): Remove explictly listed tui files.

View File

@ -289,7 +289,6 @@ mips_xfer_register (struct regcache *regcache, int reg_num, int length,
enum bfd_endian endian, bfd_byte * in,
const bfd_byte * out, int buf_offset)
{
bfd_byte reg[MAX_REGISTER_SIZE];
int reg_offset = 0;
gdb_assert (reg_num >= NUM_REGS);
/* Need to transfer the left or right part of the register, based on
@ -1476,230 +1475,6 @@ mips_next_pc (CORE_ADDR pc)
return mips32_next_pc (pc);
}
/* Set up the 'saved_regs' array. This is a data structure containing
the addresses on the stack where each register has been saved, for
each stack frame. Registers that have not been saved will have
zero here. The stack pointer register is special: rather than the
address where the stack register has been saved,
saved_regs[SP_REGNUM] will have the actual value of the previous
frame's stack register. */
static void
mips_find_saved_regs (struct frame_info *fci)
{
int ireg;
/* r0 bit means kernel trap */
int kernel_trap;
/* What registers have been saved? Bitmasks. */
unsigned long gen_mask, float_mask;
mips_extra_func_info_t proc_desc;
t_inst inst;
CORE_ADDR *saved_regs;
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
if (deprecated_get_frame_saved_regs (fci) != NULL)
return;
saved_regs = frame_saved_regs_zalloc (fci);
/* If it is the frame for sigtramp, the saved registers are located
in a sigcontext structure somewhere on the stack. If the stack
layout for sigtramp changes we might have to change these
constants and the companion fixup_sigtramp in mdebugread.c */
#ifndef SIGFRAME_BASE
/* To satisfy alignment restrictions, sigcontext is located 4 bytes
above the sigtramp frame. */
#define SIGFRAME_BASE mips_regsize (current_gdbarch)
/* FIXME! Are these correct?? */
#define SIGFRAME_PC_OFF (SIGFRAME_BASE + 2 * mips_regsize (current_gdbarch))
#define SIGFRAME_REGSAVE_OFF (SIGFRAME_BASE + 3 * mips_regsize (current_gdbarch))
#define SIGFRAME_FPREGSAVE_OFF \
(SIGFRAME_REGSAVE_OFF + MIPS_NUMREGS * mips_regsize (current_gdbarch) + 3 * mips_regsize (current_gdbarch))
#endif
if ((get_frame_type (fci) == SIGTRAMP_FRAME))
{
for (ireg = 0; ireg < MIPS_NUMREGS; ireg++)
{
CORE_ADDR reg_position =
(get_frame_base (fci) + SIGFRAME_REGSAVE_OFF +
ireg * mips_regsize (current_gdbarch));
set_reg_offset (saved_regs, ireg, reg_position);
}
for (ireg = 0; ireg < MIPS_NUMREGS; ireg++)
{
CORE_ADDR reg_position = (get_frame_base (fci)
+ SIGFRAME_FPREGSAVE_OFF
+ ireg * mips_regsize (current_gdbarch));
set_reg_offset (saved_regs,
mips_regnum (current_gdbarch)->fp0 + ireg,
reg_position);
}
set_reg_offset (saved_regs, mips_regnum (current_gdbarch)->pc,
get_frame_base (fci) + SIGFRAME_PC_OFF);
/* SP_REGNUM, contains the value and not the address. */
set_reg_offset (saved_regs, SP_REGNUM, get_frame_base (fci));
return;
}
proc_desc = get_frame_extra_info (fci)->proc_desc;
if (proc_desc == NULL)
/* I'm not sure how/whether this can happen. Normally when we
can't find a proc_desc, we "synthesize" one using
heuristic_proc_desc and set the saved_regs right away. */
return;
kernel_trap = PROC_REG_MASK (proc_desc) & 1;
gen_mask = kernel_trap ? 0xFFFFFFFF : PROC_REG_MASK (proc_desc);
float_mask = kernel_trap ? 0xFFFFFFFF : PROC_FREG_MASK (proc_desc);
if ( /* In any frame other than the innermost or a frame interrupted
by a signal, we assume that all registers have been saved.
This assumes that all register saves in a function happen
before the first function call. */
(get_next_frame (fci) == NULL
|| (get_frame_type (get_next_frame (fci)) == SIGTRAMP_FRAME))
/* In a dummy frame we know exactly where things are saved. */
&& !PROC_DESC_IS_DUMMY (proc_desc)
/* Don't bother unless we are inside a function prologue.
Outside the prologue, we know where everything is. */
&& in_prologue (get_frame_pc (fci), PROC_LOW_ADDR (proc_desc))
/* Not sure exactly what kernel_trap means, but if it means the
kernel saves the registers without a prologue doing it, we
better not examine the prologue to see whether registers
have been saved yet. */
&& !kernel_trap)
{
/* We need to figure out whether the registers that the
proc_desc claims are saved have been saved yet. */
CORE_ADDR addr;
/* Bitmasks; set if we have found a save for the register. */
unsigned long gen_save_found = 0;
unsigned long float_save_found = 0;
int instlen;
/* If the address is odd, assume this is MIPS16 code. */
addr = PROC_LOW_ADDR (proc_desc);
instlen = pc_is_mips16 (addr) ? MIPS16_INSTLEN : MIPS_INSTLEN;
/* Scan through this function's instructions preceding the
current PC, and look for those that save registers. */
while (addr < get_frame_pc (fci))
{
inst = mips_fetch_instruction (addr);
if (pc_is_mips16 (addr))
mips16_decode_reg_save (inst, &gen_save_found);
else
mips32_decode_reg_save (inst, &gen_save_found, &float_save_found);
addr += instlen;
}
gen_mask = gen_save_found;
float_mask = float_save_found;
}
/* Fill in the offsets for the registers which gen_mask says were
saved. */
{
CORE_ADDR reg_position = (get_frame_base (fci)
+ PROC_REG_OFFSET (proc_desc));
for (ireg = MIPS_NUMREGS - 1; gen_mask; --ireg, gen_mask <<= 1)
if (gen_mask & 0x80000000)
{
set_reg_offset (saved_regs, ireg, reg_position);
reg_position -= mips_saved_regsize (tdep);
}
}
/* The MIPS16 entry instruction saves $s0 and $s1 in the reverse
order of that normally used by gcc. Therefore, we have to fetch
the first instruction of the function, and if it's an entry
instruction that saves $s0 or $s1, correct their saved addresses. */
if (pc_is_mips16 (PROC_LOW_ADDR (proc_desc)))
{
inst = mips_fetch_instruction (PROC_LOW_ADDR (proc_desc));
if ((inst & 0xf81f) == 0xe809 && (inst & 0x700) != 0x700)
/* entry */
{
int reg;
int sreg_count = (inst >> 6) & 3;
/* Check if the ra register was pushed on the stack. */
CORE_ADDR reg_position = (get_frame_base (fci)
+ PROC_REG_OFFSET (proc_desc));
if (inst & 0x20)
reg_position -= mips_saved_regsize (tdep);
/* Check if the s0 and s1 registers were pushed on the
stack. */
for (reg = 16; reg < sreg_count + 16; reg++)
{
set_reg_offset (saved_regs, reg, reg_position);
reg_position -= mips_saved_regsize (tdep);
}
}
}
/* Fill in the offsets for the registers which float_mask says were
saved. */
{
CORE_ADDR reg_position = (get_frame_base (fci)
+ PROC_FREG_OFFSET (proc_desc));
/* Fill in the offsets for the float registers which float_mask
says were saved. */
for (ireg = MIPS_NUMREGS - 1; float_mask; --ireg, float_mask <<= 1)
if (float_mask & 0x80000000)
{
if (mips_saved_regsize (tdep) == 4
&& TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
{
/* On a big endian 32 bit ABI, floating point registers
are paired to form doubles such that the most
significant part is in $f[N+1] and the least
significant in $f[N] vis: $f[N+1] ||| $f[N]. The
registers are also spilled as a pair and stored as a
double.
When little-endian the least significant part is
stored first leading to the memory order $f[N] and
then $f[N+1].
Unfortunately, when big-endian the most significant
part of the double is stored first, and the least
significant is stored second. This leads to the
registers being ordered in memory as firt $f[N+1] and
then $f[N].
For the big-endian case make certain that the
addresses point at the correct (swapped) locations
$f[N] and $f[N+1] pair (keep in mind that
reg_position is decremented each time through the
loop). */
if ((ireg & 1))
set_reg_offset (saved_regs,
mips_regnum (current_gdbarch)->fp0 + ireg,
reg_position - mips_saved_regsize (tdep));
else
set_reg_offset (saved_regs,
mips_regnum (current_gdbarch)->fp0 + ireg,
reg_position + mips_saved_regsize (tdep));
}
else
set_reg_offset (saved_regs,
mips_regnum (current_gdbarch)->fp0 + ireg,
reg_position);
reg_position -= mips_saved_regsize (tdep);
}
set_reg_offset (saved_regs, mips_regnum (current_gdbarch)->pc,
saved_regs[RA_REGNUM]);
}
/* SP_REGNUM, contains the value and not the address. */
set_reg_offset (saved_regs, SP_REGNUM, get_frame_base (fci));
}
struct mips_frame_cache
{
CORE_ADDR base;
@ -2024,52 +1799,6 @@ mips_software_single_step (enum target_signal sig, int insert_breakpoints_p)
target_remove_breakpoint (next_pc, break_mem);
}
static CORE_ADDR
mips_init_frame_pc_first (int fromleaf, struct frame_info *prev)
{
CORE_ADDR pc, tmp;
pc = ((fromleaf)
? DEPRECATED_SAVED_PC_AFTER_CALL (get_next_frame (prev))
: get_next_frame (prev)
? DEPRECATED_FRAME_SAVED_PC (get_next_frame (prev)) : read_pc ());
tmp = SKIP_TRAMPOLINE_CODE (pc);
return tmp ? tmp : pc;
}
static CORE_ADDR
mips_frame_saved_pc (struct frame_info *frame)
{
CORE_ADDR saved_pc;
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), 0, 0))
{
/* Always unwind the cooked PC register value. */
saved_pc = frame_unwind_register_signed (frame, NUM_REGS + mips_regnum (current_gdbarch)->pc);
}
else
{
mips_extra_func_info_t proc_desc
= get_frame_extra_info (frame)->proc_desc;
if (proc_desc && PROC_DESC_IS_DUMMY (proc_desc))
saved_pc = read_memory_integer ((get_frame_base (frame)
- mips_saved_regsize (tdep)),
mips_saved_regsize (tdep));
else
{
/* We have to get the saved pc from the sigcontext if it is
a signal handler frame. */
int pcreg = (get_frame_type (frame) == SIGTRAMP_FRAME
? mips_regnum (current_gdbarch)->pc
: proc_desc ? PROC_PC_REG (proc_desc) : RA_REGNUM);
saved_pc = read_next_frame_reg (frame, NUM_REGS + pcreg);
}
}
return ADDR_BITS_REMOVE (saved_pc);
}
static struct mips_extra_func_info temp_proc_desc;
/* This hack will go away once the get_prev_frame() code has been
@ -2769,154 +2498,6 @@ find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame, int cur_frame)
return proc_desc;
}
static CORE_ADDR
get_frame_pointer (struct frame_info *frame, mips_extra_func_info_t proc_desc)
{
return (read_next_frame_reg (frame, NUM_REGS + PROC_FRAME_REG (proc_desc))
+ PROC_FRAME_OFFSET (proc_desc) - PROC_FRAME_ADJUST (proc_desc));
}
static mips_extra_func_info_t cached_proc_desc;
static CORE_ADDR
mips_frame_chain (struct frame_info *frame)
{
mips_extra_func_info_t proc_desc;
CORE_ADDR tmp;
CORE_ADDR saved_pc = DEPRECATED_FRAME_SAVED_PC (frame);
/* Check if the PC is inside a call stub. If it is, fetch the
PC of the caller of that stub. */
if ((tmp = SKIP_TRAMPOLINE_CODE (saved_pc)) != 0)
saved_pc = tmp;
if (DEPRECATED_PC_IN_CALL_DUMMY (saved_pc, 0, 0))
{
/* A dummy frame, uses SP not FP. Get the old SP value. If all
is well, frame->frame the bottom of the current frame will
contain that value. */
return get_frame_base (frame);
}
/* Look up the procedure descriptor for this PC. */
proc_desc = find_proc_desc (saved_pc, frame, 1);
if (!proc_desc)
return 0;
cached_proc_desc = proc_desc;
/* If no frame pointer and frame size is zero, we must be at end
of stack (or otherwise hosed). If we don't check frame size,
we loop forever if we see a zero size frame. */
if (PROC_FRAME_REG (proc_desc) == SP_REGNUM
&& PROC_FRAME_OFFSET (proc_desc) == 0
/* The previous frame from a sigtramp frame might be frameless
and have frame size zero. */
&& !(get_frame_type (frame) == SIGTRAMP_FRAME)
/* For a generic dummy frame, let get_frame_pointer() unwind a
register value saved as part of the dummy frame call. */
&& !(DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), 0, 0)))
return 0;
else
return get_frame_pointer (frame, proc_desc);
}
static void
mips_init_extra_frame_info (int fromleaf, struct frame_info *fci)
{
int regnum;
mips_extra_func_info_t proc_desc;
if (get_frame_type (fci) == DUMMY_FRAME)
return;
/* Use proc_desc calculated in frame_chain. When there is no
next frame, i.e, get_next_frame (fci) == NULL, we call
find_proc_desc () to calculate it, passing an explicit
NULL as the frame parameter. */
proc_desc =
get_next_frame (fci)
? cached_proc_desc
: find_proc_desc (get_frame_pc (fci),
NULL /* i.e, get_next_frame (fci) */ ,
1);
frame_extra_info_zalloc (fci, sizeof (struct frame_extra_info));
get_frame_extra_info (fci)->proc_desc =
proc_desc == &temp_proc_desc ? 0 : proc_desc;
if (proc_desc)
{
/* Fixup frame-pointer - only needed for top frame */
/* This may not be quite right, if proc has a real frame register.
Get the value of the frame relative sp, procedure might have been
interrupted by a signal at it's very start. */
if (get_frame_pc (fci) == PROC_LOW_ADDR (proc_desc)
&& !PROC_DESC_IS_DUMMY (proc_desc))
deprecated_update_frame_base_hack (fci,
read_next_frame_reg (get_next_frame
(fci),
NUM_REGS +
SP_REGNUM));
else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fci), 0, 0))
/* Do not ``fix'' fci->frame. It will have the value of the
generic dummy frame's top-of-stack (since the draft
fci->frame is obtained by returning the unwound stack
pointer) and that is what we want. That way the fci->frame
value will match the top-of-stack value that was saved as
part of the dummy frames data. */
/* Do nothing. */ ;
else
deprecated_update_frame_base_hack (fci,
get_frame_pointer (get_next_frame
(fci),
proc_desc));
if (proc_desc == &temp_proc_desc)
{
char *name;
/* Do not set the saved registers for a sigtramp frame,
mips_find_saved_registers will do that for us. We can't
use (get_frame_type (fci) == SIGTRAMP_FRAME), it is not
yet set. */
/* FIXME: cagney/2002-11-18: This problem will go away once
frame.c:get_prev_frame() is modified to set the frame's
type before calling functions like this. */
find_pc_partial_function (get_frame_pc (fci), &name,
(CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
if (!PC_IN_SIGTRAMP (get_frame_pc (fci), name))
{
frame_saved_regs_zalloc (fci);
/* Set value of previous frame's stack pointer.
Remember that saved_regs[SP_REGNUM] is special in
that it contains the value of the stack pointer
register. The other saved_regs values are addresses
(in the inferior) at which a given register's value
may be found. */
set_reg_offset (temp_saved_regs, SP_REGNUM,
get_frame_base (fci));
set_reg_offset (temp_saved_regs, mips_regnum (current_gdbarch)->pc,
temp_saved_regs[RA_REGNUM]);
memcpy (deprecated_get_frame_saved_regs (fci), temp_saved_regs,
SIZEOF_FRAME_SAVED_REGS);
}
}
/* hack: if argument regs are saved, guess these contain args */
/* assume we can't tell how many args for now */
get_frame_extra_info (fci)->num_args = -1;
for (regnum = MIPS_LAST_ARG_REGNUM; regnum >= A0_REGNUM; regnum--)
{
if (PROC_REG_MASK (proc_desc) & (1 << regnum))
{
get_frame_extra_info (fci)->num_args = regnum - A0_REGNUM + 1;
break;
}
}
}
}
/* MIPS stack frames are almost impenetrable. When execution stops,
we basically have to look at symbol information for the function
that we stopped in, which tells us *which* register (if any) is
@ -3513,7 +3094,6 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
for (argnum = 0; argnum < nargs; argnum++)
{
char *val;
char valbuf[MAX_REGISTER_SIZE];
struct value *arg = args[argnum];
struct type *arg_type = check_typedef (VALUE_TYPE (arg));
int len = TYPE_LENGTH (arg_type);
@ -3727,7 +3307,6 @@ mips_n32n64_return_value (struct gdbarch *gdbarch,
/* A struct that contains one or two floats. Each value is part
in the least significant part of their floating point
register.. */
bfd_byte reg[MAX_REGISTER_SIZE];
int regnum;
int field;
for (field = 0, regnum = mips_regnum (current_gdbarch)->fp0;
@ -3778,7 +3357,6 @@ mips_n32n64_return_value (struct gdbarch *gdbarch,
offset += register_size (current_gdbarch, regnum), regnum++)
{
int xfer = register_size (current_gdbarch, regnum);
int pos = 0;
if (offset + xfer > TYPE_LENGTH (type))
xfer = TYPE_LENGTH (type) - offset;
if (mips_debug)
@ -3855,7 +3433,6 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
for (argnum = 0; argnum < nargs; argnum++)
{
char *val;
char valbuf[MAX_REGISTER_SIZE];
struct value *arg = args[argnum];
struct type *arg_type = check_typedef (VALUE_TYPE (arg));
int len = TYPE_LENGTH (arg_type);
@ -4230,7 +3807,6 @@ mips_o32_return_value (struct gdbarch *gdbarch, struct type *type,
offset += mips_stack_argsize (tdep), regnum++)
{
int xfer = mips_stack_argsize (tdep);
int pos = 0;
if (offset + xfer > TYPE_LENGTH (type))
xfer = TYPE_LENGTH (type) - offset;
if (mips_debug)
@ -4309,7 +3885,6 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
for (argnum = 0; argnum < nargs; argnum++)
{
char *val;
char valbuf[MAX_REGISTER_SIZE];
struct value *arg = args[argnum];
struct type *arg_type = check_typedef (VALUE_TYPE (arg));
int len = TYPE_LENGTH (arg_type);
@ -4600,87 +4175,6 @@ mips_o64_store_return_value (struct type *valtype, char *valbuf)
}
}
static void
mips_pop_frame (void)
{
int regnum;
struct frame_info *frame = get_current_frame ();
CORE_ADDR new_sp = get_frame_base (frame);
mips_extra_func_info_t proc_desc;
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), 0, 0))
{
generic_pop_dummy_frame ();
flush_cached_frames ();
return;
}
proc_desc = get_frame_extra_info (frame)->proc_desc;
write_register (mips_regnum (current_gdbarch)->pc,
DEPRECATED_FRAME_SAVED_PC (frame));
mips_find_saved_regs (frame);
for (regnum = 0; regnum < NUM_REGS; regnum++)
if (regnum != SP_REGNUM && regnum != mips_regnum (current_gdbarch)->pc
&& deprecated_get_frame_saved_regs (frame)[regnum])
{
/* Floating point registers must not be sign extended, in case
mips_saved_regsize() = 4 but sizeof (FP0_REGNUM) == 8. */
if (mips_regnum (current_gdbarch)->fp0 <= regnum
&& regnum < mips_regnum (current_gdbarch)->fp0 + 32)
write_register (regnum,
read_memory_unsigned_integer
(deprecated_get_frame_saved_regs (frame)[regnum],
mips_saved_regsize (tdep)));
else
write_register (regnum,
read_memory_integer (deprecated_get_frame_saved_regs
(frame)[regnum],
mips_saved_regsize (tdep)));
}
write_register (SP_REGNUM, new_sp);
flush_cached_frames ();
if (proc_desc && PROC_DESC_IS_DUMMY (proc_desc))
{
struct linked_proc_info *pi_ptr, *prev_ptr;
for (pi_ptr = linked_proc_desc_table, prev_ptr = NULL;
pi_ptr != NULL; prev_ptr = pi_ptr, pi_ptr = pi_ptr->next)
{
if (&pi_ptr->info == proc_desc)
break;
}
if (pi_ptr == NULL)
error ("Can't locate dummy extra frame info\n");
if (prev_ptr != NULL)
prev_ptr->next = pi_ptr->next;
else
linked_proc_desc_table = pi_ptr->next;
xfree (pi_ptr);
write_register (mips_regnum (current_gdbarch)->hi,
read_memory_integer ((new_sp
- 2 * mips_saved_regsize (tdep)),
mips_saved_regsize (tdep)));
write_register (mips_regnum (current_gdbarch)->lo,
read_memory_integer ((new_sp
- 3 * mips_saved_regsize (tdep)),
mips_saved_regsize (tdep)));
if (MIPS_FPU_TYPE != MIPS_FPU_NONE)
write_register (mips_regnum (current_gdbarch)->fp_control_status,
read_memory_integer ((new_sp
-
4 * mips_saved_regsize (tdep)),
mips_saved_regsize (tdep)));
}
}
/* Floating point register management.
Background: MIPS1 & 2 fp registers are 32 bits wide. To support
@ -4804,8 +4298,8 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame,
int regnum)
{ /* do values for FP (float) regs */
char *raw_buffer;
double doub, flt1, flt2; /* doubles extracted from raw hex data */
int inv1, inv2, namelen;
double doub, flt1; /* doubles extracted from raw hex data */
int inv1, inv2;
raw_buffer =
(char *) alloca (2 *
@ -5796,65 +5290,6 @@ mips_ignore_helper (CORE_ADDR pc)
}
/* When debugging a 64 MIPS target running a 32 bit ABI, the size of
the register stored on the stack (32) is different to its real raw
size (64). The below ensures that registers are fetched from the
stack using their ABI size and then stored into the RAW_BUFFER
using their raw size.
The alternative to adding this function would be to add an ABI
macro - REGISTER_STACK_SIZE(). */
static void
mips_get_saved_register (char *raw_buffer,
int *optimizedp,
CORE_ADDR *addrp,
struct frame_info *frame,
int regnum, enum lval_type *lvalp)
{
CORE_ADDR addrx;
enum lval_type lvalx;
int optimizedx;
int realnumx;
/* Always a pseudo. */
gdb_assert (regnum >= NUM_REGS);
/* Make certain that all needed parameters are present. */
if (addrp == NULL)
addrp = &addrx;
if (lvalp == NULL)
lvalp = &lvalx;
if (optimizedp == NULL)
optimizedp = &optimizedx;
if ((regnum % NUM_REGS) == SP_REGNUM)
/* The SP_REGNUM is special, its value is stored in saved_regs.
In fact, it is so special that it can even only be fetched
using a raw register number! Once this code as been converted
to frame-unwind the problem goes away. */
frame_register_unwind (deprecated_get_next_frame_hack (frame),
regnum % NUM_REGS, optimizedp, lvalp, addrp,
&realnumx, raw_buffer);
else
/* Get it from the next frame. */
frame_register_unwind (deprecated_get_next_frame_hack (frame),
regnum, optimizedp, lvalp, addrp,
&realnumx, raw_buffer);
}
/* 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. */
static CORE_ADDR
mips_saved_pc_after_call (struct frame_info *frame)
{
return read_signed_register (RA_REGNUM);
}
/* Convert a dbx stab register number (from `r' declaration) to a GDB
[1 * NUM_REGS .. 2 * NUM_REGS) REGNUM. */
@ -6328,35 +5763,11 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
ensure that all 32 bit addresses are sign extended to 64 bits. */
set_gdbarch_addr_bits_remove (gdbarch, mips_addr_bits_remove);
#if 1
/* Unwind the frame. */
set_gdbarch_unwind_pc (gdbarch, mips_unwind_pc);
frame_unwind_append_sniffer (gdbarch, mips_mdebug_frame_sniffer);
set_gdbarch_unwind_dummy_id (gdbarch, mips_unwind_dummy_id);
frame_base_append_sniffer (gdbarch, mips_mdebug_frame_base_sniffer);
#else
set_gdbarch_deprecated_target_read_fp (gdbarch, mips_read_sp); /* Draft FRAME base. */
/* Initialize a frame */
set_gdbarch_deprecated_frame_init_saved_regs (gdbarch,
mips_find_saved_regs);
set_gdbarch_deprecated_init_extra_frame_info (gdbarch,
mips_init_extra_frame_info);
/* There's a mess in stack frame creation. See comments in
blockframe.c near reference to DEPRECATED_INIT_FRAME_PC_FIRST. */
set_gdbarch_deprecated_init_frame_pc_first (gdbarch,
mips_init_frame_pc_first);
set_gdbarch_deprecated_pop_frame (gdbarch, mips_pop_frame);
set_gdbarch_deprecated_save_dummy_frame_tos (gdbarch,
generic_save_dummy_frame_tos);
set_gdbarch_deprecated_frame_chain (gdbarch, mips_frame_chain);
set_gdbarch_frameless_function_invocation (gdbarch,
generic_frameless_function_invocation_not);
set_gdbarch_deprecated_frame_saved_pc (gdbarch, mips_frame_saved_pc);
set_gdbarch_deprecated_get_saved_register (gdbarch,
mips_get_saved_register);
set_gdbarch_deprecated_saved_pc_after_call (gdbarch,
mips_saved_pc_after_call);
#endif
/* Map debug register numbers onto internal register numbers. */
set_gdbarch_stab_reg_to_regnum (gdbarch, mips_stab_reg_to_regnum);
@ -6624,17 +6035,6 @@ mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
XSTRING (SETUP_ARBITRARY_FRAME (NUMARGS, ARGS)));
fprintf_unfiltered (file,
"mips_dump_tdep: SET_PROC_DESC_IS_DUMMY = function?\n");
fprintf_unfiltered (file,
"mips_dump_tdep: SIGFRAME_BASE = %d\n", SIGFRAME_BASE);
fprintf_unfiltered (file,
"mips_dump_tdep: SIGFRAME_FPREGSAVE_OFF = %d\n",
SIGFRAME_FPREGSAVE_OFF);
fprintf_unfiltered (file,
"mips_dump_tdep: SIGFRAME_PC_OFF = %d\n",
SIGFRAME_PC_OFF);
fprintf_unfiltered (file,
"mips_dump_tdep: SIGFRAME_REGSAVE_OFF = %d\n",
SIGFRAME_REGSAVE_OFF);
fprintf_unfiltered (file,
"mips_dump_tdep: SKIP_TRAMPOLINE_CODE # %s\n",
XSTRING (SKIP_TRAMPOLINE_CODE (PC)));