mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-17 21:03:55 +08:00
* mips-tdep.c (fp_register_arg_p): Add gdbarch as paramter.
(mips_n32n64_push_dummy_call, mips_o64_return_value) (mips_eabi_push_dummy_call): Update call to fp_register_arg_p. (MIPS_FPU_TYPE): Add gdbarch as parameter and replace current_gdbarch. (fp_register_arg_p, mips_dump_tdep, show_mipsfpu_command) (mips_n32n64_fp_arg_chunk_p): Update caller. (mips_n32n64_fp_arg_chunk_p): Add gdbarch as paramter. (mips_n32n64_push_dummy_call): Update caller. (MIPS_LAST_ARG_REGNUM): Add gdbarch as parameter and replace current_gdbarch. (mips_eabi_push_dummy_call, mips_n32n64_push_dummy_call) (mips_o32_push_dummy_call, mips_o64_push_dummy_call): Update caller. (MIPS_LAST_FP_ARG_REGNUM): Add gdbarch as parameter and replace current_gdbarch. (mips_eabi_push_dummy_call, mips_o32_push_dummy_call) (mips_o64_push_dummy_call): Update caller. (MIPS_EABI): Add gdbarch as parameter and replace current_gdbarch. (fp_register_arg_p, mips_dump_tdep): Update caller. (set_reg_offset): Add gdbarch as parameter and replace current_gdbarch. (mips16_scan_prologue, mips32_scan_prologue): Update caller. (reset_saved_regs): Make static. Add gdbarch as parameter. Replace current_gdbarch. (mips32_scan_prologue): Update caller. (heuristic_proc_start): Add gdbarch as parameter. Replace current_gdbarch. (mips_insn16_frame_cache, mips_insn32_frame_cache): Update caller. * mipsnbsd-nat.c (mipsnbsd_fetch_inferior_registers) (mipsnbsd_store_inferior_registers): Use get_regcache_arch to get at the current architecture. Update call to getregs_supplies. (getregs_supplies): Add gdbarch as parameter and replace current_gdbarch. * mipsnbsd-tdep.c (mipsnbsd_get_longjmp_target): Use get_frame_arch to get at the current architecture. Update call to NBSD_MIPS_JB_OFFSET and NBSD_MIPS_JB_ELEMENT_SIZE. (NBSD_MIPS_JB_ELEMENT_SIZE, NBSD_MIPS_JB_OFFSET): Add gdbarch and replace current_gdbarch. * remote-mips.c (mips_map_regno): Add gdbarch as parameter and replace current_gdbarch. (mips_fetch_registers, mips_store_registers): Update call to mips_map_regno. (mips_load): Use get_regcache_arch to get at the current_architecture and replace current_gdbarch.
This commit is contained in:
@ -1,3 +1,60 @@
|
|||||||
|
2008-07-14 Markus Deuling <deuling@de.ibm.com>
|
||||||
|
|
||||||
|
* mips-tdep.c (fp_register_arg_p): Add gdbarch as paramter.
|
||||||
|
(mips_n32n64_push_dummy_call, mips_o64_return_value)
|
||||||
|
(mips_eabi_push_dummy_call): Update call to fp_register_arg_p.
|
||||||
|
|
||||||
|
(MIPS_FPU_TYPE): Add gdbarch as parameter and replace current_gdbarch.
|
||||||
|
(fp_register_arg_p, mips_dump_tdep, show_mipsfpu_command)
|
||||||
|
(mips_n32n64_fp_arg_chunk_p): Update caller.
|
||||||
|
|
||||||
|
(mips_n32n64_fp_arg_chunk_p): Add gdbarch as paramter.
|
||||||
|
(mips_n32n64_push_dummy_call): Update caller.
|
||||||
|
|
||||||
|
(MIPS_LAST_ARG_REGNUM): Add gdbarch as parameter and replace
|
||||||
|
current_gdbarch.
|
||||||
|
(mips_eabi_push_dummy_call, mips_n32n64_push_dummy_call)
|
||||||
|
(mips_o32_push_dummy_call, mips_o64_push_dummy_call): Update caller.
|
||||||
|
|
||||||
|
|
||||||
|
(MIPS_LAST_FP_ARG_REGNUM): Add gdbarch as parameter and replace
|
||||||
|
current_gdbarch.
|
||||||
|
(mips_eabi_push_dummy_call, mips_o32_push_dummy_call)
|
||||||
|
(mips_o64_push_dummy_call): Update caller.
|
||||||
|
|
||||||
|
(MIPS_EABI): Add gdbarch as parameter and replace current_gdbarch.
|
||||||
|
(fp_register_arg_p, mips_dump_tdep): Update caller.
|
||||||
|
|
||||||
|
(set_reg_offset): Add gdbarch as parameter and replace current_gdbarch.
|
||||||
|
(mips16_scan_prologue, mips32_scan_prologue): Update caller.
|
||||||
|
|
||||||
|
(reset_saved_regs): Make static. Add gdbarch as parameter. Replace
|
||||||
|
current_gdbarch.
|
||||||
|
(mips32_scan_prologue): Update caller.
|
||||||
|
|
||||||
|
(heuristic_proc_start): Add gdbarch as parameter. Replace
|
||||||
|
current_gdbarch.
|
||||||
|
(mips_insn16_frame_cache, mips_insn32_frame_cache): Update caller.
|
||||||
|
|
||||||
|
* mipsnbsd-nat.c (mipsnbsd_fetch_inferior_registers)
|
||||||
|
(mipsnbsd_store_inferior_registers): Use get_regcache_arch to get at
|
||||||
|
the current architecture. Update call to getregs_supplies.
|
||||||
|
(getregs_supplies): Add gdbarch as parameter and replace
|
||||||
|
current_gdbarch.
|
||||||
|
|
||||||
|
* mipsnbsd-tdep.c (mipsnbsd_get_longjmp_target): Use get_frame_arch to
|
||||||
|
get at the current architecture. Update call to NBSD_MIPS_JB_OFFSET and
|
||||||
|
NBSD_MIPS_JB_ELEMENT_SIZE.
|
||||||
|
(NBSD_MIPS_JB_ELEMENT_SIZE, NBSD_MIPS_JB_OFFSET): Add gdbarch and
|
||||||
|
replace current_gdbarch.
|
||||||
|
|
||||||
|
* remote-mips.c (mips_map_regno): Add gdbarch as parameter and replace
|
||||||
|
current_gdbarch.
|
||||||
|
(mips_fetch_registers, mips_store_registers): Update call
|
||||||
|
to mips_map_regno.
|
||||||
|
(mips_load): Use get_regcache_arch to get at the current_architecture
|
||||||
|
and replace current_gdbarch.
|
||||||
|
|
||||||
2008-07-13 Pedro Alves <pedro@codesourcery.com>
|
2008-07-13 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
* thread.c (restore_selected_frame): On fail to restore, select
|
* thread.c (restore_selected_frame): On fail to restore, select
|
||||||
|
162
gdb/mips-tdep.c
162
gdb/mips-tdep.c
@ -211,14 +211,15 @@ mips_fpa0_regnum (struct gdbarch *gdbarch)
|
|||||||
return mips_regnum (gdbarch)->fp0 + 12;
|
return mips_regnum (gdbarch)->fp0 + 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MIPS_EABI (gdbarch_tdep (current_gdbarch)->mips_abi == MIPS_ABI_EABI32 \
|
#define MIPS_EABI(gdbarch) (gdbarch_tdep (gdbarch)->mips_abi \
|
||||||
|| gdbarch_tdep (current_gdbarch)->mips_abi == MIPS_ABI_EABI64)
|
== MIPS_ABI_EABI32 \
|
||||||
|
|| gdbarch_tdep (gdbarch)->mips_abi == MIPS_ABI_EABI64)
|
||||||
|
|
||||||
#define MIPS_LAST_FP_ARG_REGNUM (gdbarch_tdep (current_gdbarch)->mips_last_fp_arg_regnum)
|
#define MIPS_LAST_FP_ARG_REGNUM(gdbarch) (gdbarch_tdep (gdbarch)->mips_last_fp_arg_regnum)
|
||||||
|
|
||||||
#define MIPS_LAST_ARG_REGNUM (gdbarch_tdep (current_gdbarch)->mips_last_arg_regnum)
|
#define MIPS_LAST_ARG_REGNUM(gdbarch) (gdbarch_tdep (gdbarch)->mips_last_arg_regnum)
|
||||||
|
|
||||||
#define MIPS_FPU_TYPE (gdbarch_tdep (current_gdbarch)->mips_fpu_type)
|
#define MIPS_FPU_TYPE(gdbarch) (gdbarch_tdep (gdbarch)->mips_fpu_type)
|
||||||
|
|
||||||
/* MIPS16 function addresses are odd (bit 0 is set). Here are some
|
/* MIPS16 function addresses are odd (bit 0 is set). Here are some
|
||||||
functions to test, set, or clear bit 0 of addresses. */
|
functions to test, set, or clear bit 0 of addresses. */
|
||||||
@ -391,7 +392,7 @@ mips2_fp_compat (struct frame_info *frame)
|
|||||||
|
|
||||||
#define VM_MIN_ADDRESS (CORE_ADDR)0x400000
|
#define VM_MIN_ADDRESS (CORE_ADDR)0x400000
|
||||||
|
|
||||||
static CORE_ADDR heuristic_proc_start (CORE_ADDR);
|
static CORE_ADDR heuristic_proc_start (struct gdbarch *, CORE_ADDR);
|
||||||
|
|
||||||
static void reinit_frame_cache_sfunc (char *, int, struct cmd_list_element *);
|
static void reinit_frame_cache_sfunc (char *, int, struct cmd_list_element *);
|
||||||
|
|
||||||
@ -1431,18 +1432,16 @@ struct mips_frame_cache
|
|||||||
saved registers in a frame. */
|
saved registers in a frame. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_reg_offset (struct mips_frame_cache *this_cache, int regnum,
|
set_reg_offset (struct gdbarch *gdbarch, struct mips_frame_cache *this_cache,
|
||||||
CORE_ADDR offset)
|
int regnum, CORE_ADDR offset)
|
||||||
{
|
{
|
||||||
if (this_cache != NULL
|
if (this_cache != NULL
|
||||||
&& this_cache->saved_regs[regnum].addr == -1)
|
&& this_cache->saved_regs[regnum].addr == -1)
|
||||||
{
|
{
|
||||||
this_cache->saved_regs[regnum
|
this_cache->saved_regs[regnum + 0 * gdbarch_num_regs (gdbarch)].addr
|
||||||
+ 0 * gdbarch_num_regs (current_gdbarch)].addr
|
= offset;
|
||||||
= offset;
|
this_cache->saved_regs[regnum + 1 * gdbarch_num_regs (gdbarch)].addr
|
||||||
this_cache->saved_regs[regnum
|
= offset;
|
||||||
+ 1 * gdbarch_num_regs (current_gdbarch)].addr
|
|
||||||
= offset;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1559,23 +1558,23 @@ mips16_scan_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
|
|||||||
{
|
{
|
||||||
offset = mips16_get_imm (prev_inst, inst, 8, 4, 0);
|
offset = mips16_get_imm (prev_inst, inst, 8, 4, 0);
|
||||||
reg = mips16_to_32_reg[(inst & 0x700) >> 8];
|
reg = mips16_to_32_reg[(inst & 0x700) >> 8];
|
||||||
set_reg_offset (this_cache, reg, sp + offset);
|
set_reg_offset (gdbarch, this_cache, reg, sp + offset);
|
||||||
}
|
}
|
||||||
else if ((inst & 0xff00) == 0xf900) /* sd reg,n($sp) */
|
else if ((inst & 0xff00) == 0xf900) /* sd reg,n($sp) */
|
||||||
{
|
{
|
||||||
offset = mips16_get_imm (prev_inst, inst, 5, 8, 0);
|
offset = mips16_get_imm (prev_inst, inst, 5, 8, 0);
|
||||||
reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
|
reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
|
||||||
set_reg_offset (this_cache, reg, sp + offset);
|
set_reg_offset (gdbarch, this_cache, reg, sp + offset);
|
||||||
}
|
}
|
||||||
else if ((inst & 0xff00) == 0x6200) /* sw $ra,n($sp) */
|
else if ((inst & 0xff00) == 0x6200) /* sw $ra,n($sp) */
|
||||||
{
|
{
|
||||||
offset = mips16_get_imm (prev_inst, inst, 8, 4, 0);
|
offset = mips16_get_imm (prev_inst, inst, 8, 4, 0);
|
||||||
set_reg_offset (this_cache, MIPS_RA_REGNUM, sp + offset);
|
set_reg_offset (gdbarch, this_cache, MIPS_RA_REGNUM, sp + offset);
|
||||||
}
|
}
|
||||||
else if ((inst & 0xff00) == 0xfa00) /* sd $ra,n($sp) */
|
else if ((inst & 0xff00) == 0xfa00) /* sd $ra,n($sp) */
|
||||||
{
|
{
|
||||||
offset = mips16_get_imm (prev_inst, inst, 8, 8, 0);
|
offset = mips16_get_imm (prev_inst, inst, 8, 8, 0);
|
||||||
set_reg_offset (this_cache, MIPS_RA_REGNUM, sp + offset);
|
set_reg_offset (gdbarch, this_cache, MIPS_RA_REGNUM, sp + offset);
|
||||||
}
|
}
|
||||||
else if (inst == 0x673d) /* move $s1, $sp */
|
else if (inst == 0x673d) /* move $s1, $sp */
|
||||||
{
|
{
|
||||||
@ -1593,13 +1592,13 @@ mips16_scan_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
|
|||||||
{
|
{
|
||||||
offset = mips16_get_imm (prev_inst, inst, 5, 4, 0);
|
offset = mips16_get_imm (prev_inst, inst, 5, 4, 0);
|
||||||
reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
|
reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
|
||||||
set_reg_offset (this_cache, reg, frame_addr + offset);
|
set_reg_offset (gdbarch, this_cache, reg, frame_addr + offset);
|
||||||
}
|
}
|
||||||
else if ((inst & 0xFF00) == 0x7900) /* sd reg,offset($s1) */
|
else if ((inst & 0xFF00) == 0x7900) /* sd reg,offset($s1) */
|
||||||
{
|
{
|
||||||
offset = mips16_get_imm (prev_inst, inst, 5, 8, 0);
|
offset = mips16_get_imm (prev_inst, inst, 5, 8, 0);
|
||||||
reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
|
reg = mips16_to_32_reg[(inst & 0xe0) >> 5];
|
||||||
set_reg_offset (this_cache, reg, frame_addr + offset);
|
set_reg_offset (gdbarch, this_cache, reg, frame_addr + offset);
|
||||||
}
|
}
|
||||||
else if ((inst & 0xf81f) == 0xe809
|
else if ((inst & 0xf81f) == 0xe809
|
||||||
&& (inst & 0x700) != 0x700) /* entry */
|
&& (inst & 0x700) != 0x700) /* entry */
|
||||||
@ -1648,7 +1647,7 @@ mips16_scan_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
|
|||||||
/* Check if a0-a3 were saved in the caller's argument save area. */
|
/* Check if a0-a3 were saved in the caller's argument save area. */
|
||||||
for (reg = 4, offset = 0; reg < areg_count + 4; reg++)
|
for (reg = 4, offset = 0; reg < areg_count + 4; reg++)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, reg, sp + offset);
|
set_reg_offset (gdbarch, this_cache, reg, sp + offset);
|
||||||
offset += mips_abi_regsize (gdbarch);
|
offset += mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1656,14 +1655,14 @@ mips16_scan_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
|
|||||||
offset = -4;
|
offset = -4;
|
||||||
if (entry_inst & 0x20)
|
if (entry_inst & 0x20)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, MIPS_RA_REGNUM, sp + offset);
|
set_reg_offset (gdbarch, this_cache, MIPS_RA_REGNUM, sp + offset);
|
||||||
offset -= mips_abi_regsize (gdbarch);
|
offset -= mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the s0 and s1 registers were pushed on the stack. */
|
/* Check if the s0 and s1 registers were pushed on the stack. */
|
||||||
for (reg = 16; reg < sreg_count + 16; reg++)
|
for (reg = 16; reg < sreg_count + 16; reg++)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, reg, sp + offset);
|
set_reg_offset (gdbarch, this_cache, reg, sp + offset);
|
||||||
offset -= mips_abi_regsize (gdbarch);
|
offset -= mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1715,7 +1714,7 @@ mips16_scan_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
|
|||||||
/* Check if A0-A3 were saved in the caller's argument save area. */
|
/* Check if A0-A3 were saved in the caller's argument save area. */
|
||||||
for (reg = MIPS_A0_REGNUM, offset = 0; reg < args + 4; reg++)
|
for (reg = MIPS_A0_REGNUM, offset = 0; reg < args + 4; reg++)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, reg, sp + offset);
|
set_reg_offset (gdbarch, this_cache, reg, sp + offset);
|
||||||
offset += mips_abi_regsize (gdbarch);
|
offset += mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1724,41 +1723,41 @@ mips16_scan_prologue (CORE_ADDR start_pc, CORE_ADDR limit_pc,
|
|||||||
/* Check if the RA register was pushed on the stack. */
|
/* Check if the RA register was pushed on the stack. */
|
||||||
if (save_inst & 0x40)
|
if (save_inst & 0x40)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, MIPS_RA_REGNUM, sp + offset);
|
set_reg_offset (gdbarch, this_cache, MIPS_RA_REGNUM, sp + offset);
|
||||||
offset -= mips_abi_regsize (gdbarch);
|
offset -= mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the S8 register was pushed on the stack. */
|
/* Check if the S8 register was pushed on the stack. */
|
||||||
if (xsregs > 6)
|
if (xsregs > 6)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, 30, sp + offset);
|
set_reg_offset (gdbarch, this_cache, 30, sp + offset);
|
||||||
offset -= mips_abi_regsize (gdbarch);
|
offset -= mips_abi_regsize (gdbarch);
|
||||||
xsregs--;
|
xsregs--;
|
||||||
}
|
}
|
||||||
/* Check if S2-S7 were pushed on the stack. */
|
/* Check if S2-S7 were pushed on the stack. */
|
||||||
for (reg = 18 + xsregs - 1; reg > 18 - 1; reg--)
|
for (reg = 18 + xsregs - 1; reg > 18 - 1; reg--)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, reg, sp + offset);
|
set_reg_offset (gdbarch, this_cache, reg, sp + offset);
|
||||||
offset -= mips_abi_regsize (gdbarch);
|
offset -= mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the S1 register was pushed on the stack. */
|
/* Check if the S1 register was pushed on the stack. */
|
||||||
if (save_inst & 0x10)
|
if (save_inst & 0x10)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, 17, sp + offset);
|
set_reg_offset (gdbarch, this_cache, 17, sp + offset);
|
||||||
offset -= mips_abi_regsize (gdbarch);
|
offset -= mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
/* Check if the S0 register was pushed on the stack. */
|
/* Check if the S0 register was pushed on the stack. */
|
||||||
if (save_inst & 0x20)
|
if (save_inst & 0x20)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, 16, sp + offset);
|
set_reg_offset (gdbarch, this_cache, 16, sp + offset);
|
||||||
offset -= mips_abi_regsize (gdbarch);
|
offset -= mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if A0-A3 were pushed on the stack. */
|
/* Check if A0-A3 were pushed on the stack. */
|
||||||
for (reg = MIPS_A0_REGNUM + 3; reg > MIPS_A0_REGNUM + 3 - astatic; reg--)
|
for (reg = MIPS_A0_REGNUM + 3; reg > MIPS_A0_REGNUM + 3 - astatic; reg--)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, reg, sp + offset);
|
set_reg_offset (gdbarch, this_cache, reg, sp + offset);
|
||||||
offset -= mips_abi_regsize (gdbarch);
|
offset -= mips_abi_regsize (gdbarch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1808,7 +1807,7 @@ mips_insn16_frame_cache (struct frame_info *this_frame, void **this_cache)
|
|||||||
|
|
||||||
find_pc_partial_function (pc, NULL, &start_addr, NULL);
|
find_pc_partial_function (pc, NULL, &start_addr, NULL);
|
||||||
if (start_addr == 0)
|
if (start_addr == 0)
|
||||||
start_addr = heuristic_proc_start (pc);
|
start_addr = heuristic_proc_start (get_frame_arch (this_frame), pc);
|
||||||
/* We can't analyze the prologue if we couldn't find the begining
|
/* We can't analyze the prologue if we couldn't find the begining
|
||||||
of the function. */
|
of the function. */
|
||||||
if (start_addr == 0)
|
if (start_addr == 0)
|
||||||
@ -1893,14 +1892,14 @@ mips_insn16_frame_base_sniffer (struct frame_info *this_frame)
|
|||||||
/* Mark all the registers as unset in the saved_regs array
|
/* Mark all the registers as unset in the saved_regs array
|
||||||
of THIS_CACHE. Do nothing if THIS_CACHE is null. */
|
of THIS_CACHE. Do nothing if THIS_CACHE is null. */
|
||||||
|
|
||||||
void
|
static void
|
||||||
reset_saved_regs (struct mips_frame_cache *this_cache)
|
reset_saved_regs (struct gdbarch *gdbarch, struct mips_frame_cache *this_cache)
|
||||||
{
|
{
|
||||||
if (this_cache == NULL || this_cache->saved_regs == NULL)
|
if (this_cache == NULL || this_cache->saved_regs == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
{
|
{
|
||||||
const int num_regs = gdbarch_num_regs (current_gdbarch);
|
const int num_regs = gdbarch_num_regs (gdbarch);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < num_regs; i++)
|
for (i = 0; i < num_regs; i++)
|
||||||
@ -1975,13 +1974,13 @@ restart:
|
|||||||
else if (((high_word & 0xFFE0) == 0xafa0) /* sw reg,offset($sp) */
|
else if (((high_word & 0xFFE0) == 0xafa0) /* sw reg,offset($sp) */
|
||||||
&& !regsize_is_64_bits)
|
&& !regsize_is_64_bits)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, reg, sp + low_word);
|
set_reg_offset (gdbarch, this_cache, reg, sp + low_word);
|
||||||
}
|
}
|
||||||
else if (((high_word & 0xFFE0) == 0xffa0) /* sd reg,offset($sp) */
|
else if (((high_word & 0xFFE0) == 0xffa0) /* sd reg,offset($sp) */
|
||||||
&& regsize_is_64_bits)
|
&& regsize_is_64_bits)
|
||||||
{
|
{
|
||||||
/* Irix 6.2 N32 ABI uses sd instructions for saving $gp and $ra. */
|
/* Irix 6.2 N32 ABI uses sd instructions for saving $gp and $ra. */
|
||||||
set_reg_offset (this_cache, reg, sp + low_word);
|
set_reg_offset (gdbarch, this_cache, reg, sp + low_word);
|
||||||
}
|
}
|
||||||
else if (high_word == 0x27be) /* addiu $30,$sp,size */
|
else if (high_word == 0x27be) /* addiu $30,$sp,size */
|
||||||
{
|
{
|
||||||
@ -2007,7 +2006,7 @@ restart:
|
|||||||
we will hit a guard that prevents the new address
|
we will hit a guard that prevents the new address
|
||||||
for each register to be recomputed during the second
|
for each register to be recomputed during the second
|
||||||
pass. */
|
pass. */
|
||||||
reset_saved_regs (this_cache);
|
reset_saved_regs (gdbarch, this_cache);
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2037,7 +2036,7 @@ restart:
|
|||||||
we will hit a guard that prevents the new address
|
we will hit a guard that prevents the new address
|
||||||
for each register to be recomputed during the second
|
for each register to be recomputed during the second
|
||||||
pass. */
|
pass. */
|
||||||
reset_saved_regs (this_cache);
|
reset_saved_regs (gdbarch, this_cache);
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2045,7 +2044,7 @@ restart:
|
|||||||
else if ((high_word & 0xFFE0) == 0xafc0 /* sw reg,offset($30) */
|
else if ((high_word & 0xFFE0) == 0xafc0 /* sw reg,offset($30) */
|
||||||
&& !regsize_is_64_bits)
|
&& !regsize_is_64_bits)
|
||||||
{
|
{
|
||||||
set_reg_offset (this_cache, reg, frame_addr + low_word);
|
set_reg_offset (gdbarch, this_cache, reg, frame_addr + low_word);
|
||||||
}
|
}
|
||||||
else if ((high_word & 0xFFE0) == 0xE7A0 /* swc1 freg,n($sp) */
|
else if ((high_word & 0xFFE0) == 0xE7A0 /* swc1 freg,n($sp) */
|
||||||
|| (high_word & 0xF3E0) == 0xA3C0 /* sx reg,n($s8) */
|
|| (high_word & 0xF3E0) == 0xA3C0 /* sx reg,n($s8) */
|
||||||
@ -2145,7 +2144,7 @@ mips_insn32_frame_cache (struct frame_info *this_frame, void **this_cache)
|
|||||||
|
|
||||||
find_pc_partial_function (pc, NULL, &start_addr, NULL);
|
find_pc_partial_function (pc, NULL, &start_addr, NULL);
|
||||||
if (start_addr == 0)
|
if (start_addr == 0)
|
||||||
start_addr = heuristic_proc_start (pc);
|
start_addr = heuristic_proc_start (get_frame_arch (this_frame), pc);
|
||||||
/* We can't analyze the prologue if we couldn't find the begining
|
/* We can't analyze the prologue if we couldn't find the begining
|
||||||
of the function. */
|
of the function. */
|
||||||
if (start_addr == 0)
|
if (start_addr == 0)
|
||||||
@ -2517,14 +2516,14 @@ mips_about_to_return (CORE_ADDR pc)
|
|||||||
lines. */
|
lines. */
|
||||||
|
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
heuristic_proc_start (CORE_ADDR pc)
|
heuristic_proc_start (struct gdbarch *gdbarch, CORE_ADDR pc)
|
||||||
{
|
{
|
||||||
CORE_ADDR start_pc;
|
CORE_ADDR start_pc;
|
||||||
CORE_ADDR fence;
|
CORE_ADDR fence;
|
||||||
int instlen;
|
int instlen;
|
||||||
int seen_adjsp = 0;
|
int seen_adjsp = 0;
|
||||||
|
|
||||||
pc = gdbarch_addr_bits_remove (current_gdbarch, pc);
|
pc = gdbarch_addr_bits_remove (gdbarch, pc);
|
||||||
start_pc = pc;
|
start_pc = pc;
|
||||||
fence = start_pc - heuristic_fence_post;
|
fence = start_pc - heuristic_fence_post;
|
||||||
if (start_pc == 0)
|
if (start_pc == 0)
|
||||||
@ -2633,16 +2632,17 @@ struct mips_objfile_private
|
|||||||
arguments into integer registers. */
|
arguments into integer registers. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
fp_register_arg_p (enum type_code typecode, struct type *arg_type)
|
fp_register_arg_p (struct gdbarch *gdbarch, enum type_code typecode,
|
||||||
|
struct type *arg_type)
|
||||||
{
|
{
|
||||||
return ((typecode == TYPE_CODE_FLT
|
return ((typecode == TYPE_CODE_FLT
|
||||||
|| (MIPS_EABI
|
|| (MIPS_EABI (gdbarch)
|
||||||
&& (typecode == TYPE_CODE_STRUCT
|
&& (typecode == TYPE_CODE_STRUCT
|
||||||
|| typecode == TYPE_CODE_UNION)
|
|| typecode == TYPE_CODE_UNION)
|
||||||
&& TYPE_NFIELDS (arg_type) == 1
|
&& TYPE_NFIELDS (arg_type) == 1
|
||||||
&& TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (arg_type, 0)))
|
&& TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (arg_type, 0)))
|
||||||
== TYPE_CODE_FLT))
|
== TYPE_CODE_FLT))
|
||||||
&& MIPS_FPU_TYPE != MIPS_FPU_NONE);
|
&& MIPS_FPU_TYPE(gdbarch) != MIPS_FPU_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* On o32, argument passing in GPRs depends on the alignment of the type being
|
/* On o32, argument passing in GPRs depends on the alignment of the type being
|
||||||
@ -2777,7 +2777,7 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
up before the check to see if there are any FP registers
|
up before the check to see if there are any FP registers
|
||||||
left. Non MIPS_EABI targets also pass the FP in the integer
|
left. Non MIPS_EABI targets also pass the FP in the integer
|
||||||
registers so also round up normal registers. */
|
registers so also round up normal registers. */
|
||||||
if (regsize < 8 && fp_register_arg_p (typecode, arg_type))
|
if (regsize < 8 && fp_register_arg_p (gdbarch, typecode, arg_type))
|
||||||
{
|
{
|
||||||
if ((float_argreg & 1))
|
if ((float_argreg & 1))
|
||||||
float_argreg++;
|
float_argreg++;
|
||||||
@ -2795,8 +2795,8 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
/* MIPS_EABI squeezes a struct that contains a single floating
|
/* MIPS_EABI squeezes a struct that contains a single floating
|
||||||
point value into an FP register instead of pushing it onto the
|
point value into an FP register instead of pushing it onto the
|
||||||
stack. */
|
stack. */
|
||||||
if (fp_register_arg_p (typecode, arg_type)
|
if (fp_register_arg_p (gdbarch, typecode, arg_type)
|
||||||
&& float_argreg <= MIPS_LAST_FP_ARG_REGNUM)
|
&& float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
|
||||||
{
|
{
|
||||||
/* EABI32 will pass doubles in consecutive registers, even on
|
/* EABI32 will pass doubles in consecutive registers, even on
|
||||||
64-bit cores. At one time, we used to check the size of
|
64-bit cores. At one time, we used to check the size of
|
||||||
@ -2861,9 +2861,9 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
partial_len);
|
partial_len);
|
||||||
|
|
||||||
/* Write this portion of the argument to the stack. */
|
/* Write this portion of the argument to the stack. */
|
||||||
if (argreg > MIPS_LAST_ARG_REGNUM
|
if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
|
||||||
|| odd_sized_struct
|
|| odd_sized_struct
|
||||||
|| fp_register_arg_p (typecode, arg_type))
|
|| fp_register_arg_p (gdbarch, typecode, arg_type))
|
||||||
{
|
{
|
||||||
/* Should shorter than int integer values be
|
/* Should shorter than int integer values be
|
||||||
promoted to int before being stored? */
|
promoted to int before being stored? */
|
||||||
@ -2912,8 +2912,8 @@ mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
arguments will not. */
|
arguments will not. */
|
||||||
/* Write this portion of the argument to a general
|
/* Write this portion of the argument to a general
|
||||||
purpose register. */
|
purpose register. */
|
||||||
if (argreg <= MIPS_LAST_ARG_REGNUM
|
if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch)
|
||||||
&& !fp_register_arg_p (typecode, arg_type))
|
&& !fp_register_arg_p (gdbarch, typecode, arg_type))
|
||||||
{
|
{
|
||||||
LONGEST regval =
|
LONGEST regval =
|
||||||
extract_unsigned_integer (val, partial_len);
|
extract_unsigned_integer (val, partial_len);
|
||||||
@ -3020,14 +3020,15 @@ mips_eabi_return_value (struct gdbarch *gdbarch, struct type *func_type,
|
|||||||
registers. */
|
registers. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mips_n32n64_fp_arg_chunk_p (struct type *arg_type, int offset)
|
mips_n32n64_fp_arg_chunk_p (struct gdbarch *gdbarch, struct type *arg_type,
|
||||||
|
int offset)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (TYPE_CODE (arg_type) != TYPE_CODE_STRUCT)
|
if (TYPE_CODE (arg_type) != TYPE_CODE_STRUCT)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (MIPS_FPU_TYPE != MIPS_FPU_DOUBLE)
|
if (MIPS_FPU_TYPE (gdbarch) != MIPS_FPU_DOUBLE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (TYPE_LENGTH (arg_type) < offset + MIPS64_REGSIZE)
|
if (TYPE_LENGTH (arg_type) < offset + MIPS64_REGSIZE)
|
||||||
@ -3062,7 +3063,7 @@ mips_n32n64_fp_arg_chunk_p (struct type *arg_type, int offset)
|
|||||||
|
|
||||||
/* This field starts at or before the requested offset, and
|
/* This field starts at or before the requested offset, and
|
||||||
overlaps it. If it is a structure, recurse inwards. */
|
overlaps it. If it is a structure, recurse inwards. */
|
||||||
return mips_n32n64_fp_arg_chunk_p (field_type, offset - pos);
|
return mips_n32n64_fp_arg_chunk_p (gdbarch, field_type, offset - pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -3141,8 +3142,8 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
|
|
||||||
val = value_contents (arg);
|
val = value_contents (arg);
|
||||||
|
|
||||||
if (fp_register_arg_p (typecode, arg_type)
|
if (fp_register_arg_p (gdbarch, typecode, arg_type)
|
||||||
&& argreg <= MIPS_LAST_ARG_REGNUM)
|
&& argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
|
||||||
{
|
{
|
||||||
/* This is a floating point value that fits entirely
|
/* This is a floating point value that fits entirely
|
||||||
in a single register. */
|
in a single register. */
|
||||||
@ -3184,11 +3185,11 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
fprintf_unfiltered (gdb_stdlog, " -- partial=%d",
|
fprintf_unfiltered (gdb_stdlog, " -- partial=%d",
|
||||||
partial_len);
|
partial_len);
|
||||||
|
|
||||||
if (fp_register_arg_p (typecode, arg_type))
|
if (fp_register_arg_p (gdbarch, typecode, arg_type))
|
||||||
gdb_assert (argreg > MIPS_LAST_ARG_REGNUM);
|
gdb_assert (argreg > MIPS_LAST_ARG_REGNUM (gdbarch));
|
||||||
|
|
||||||
/* Write this portion of the argument to the stack. */
|
/* Write this portion of the argument to the stack. */
|
||||||
if (argreg > MIPS_LAST_ARG_REGNUM)
|
if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch))
|
||||||
{
|
{
|
||||||
/* Should shorter than int integer values be
|
/* Should shorter than int integer values be
|
||||||
promoted to int before being stored? */
|
promoted to int before being stored? */
|
||||||
@ -3232,7 +3233,7 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
structs may go thru BOTH paths. */
|
structs may go thru BOTH paths. */
|
||||||
/* Write this portion of the argument to a general
|
/* Write this portion of the argument to a general
|
||||||
purpose register. */
|
purpose register. */
|
||||||
if (argreg <= MIPS_LAST_ARG_REGNUM)
|
if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
|
||||||
{
|
{
|
||||||
LONGEST regval;
|
LONGEST regval;
|
||||||
|
|
||||||
@ -3272,7 +3273,7 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
phex (regval, MIPS64_REGSIZE));
|
phex (regval, MIPS64_REGSIZE));
|
||||||
regcache_cooked_write_unsigned (regcache, argreg, regval);
|
regcache_cooked_write_unsigned (regcache, argreg, regval);
|
||||||
|
|
||||||
if (mips_n32n64_fp_arg_chunk_p (arg_type,
|
if (mips_n32n64_fp_arg_chunk_p (gdbarch, arg_type,
|
||||||
TYPE_LENGTH (arg_type) - len))
|
TYPE_LENGTH (arg_type) - len))
|
||||||
{
|
{
|
||||||
if (mips_debug)
|
if (mips_debug)
|
||||||
@ -3552,7 +3553,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
up before the check to see if there are any FP registers
|
up before the check to see if there are any FP registers
|
||||||
left. O32/O64 targets also pass the FP in the integer
|
left. O32/O64 targets also pass the FP in the integer
|
||||||
registers so also round up normal registers. */
|
registers so also round up normal registers. */
|
||||||
if (fp_register_arg_p (typecode, arg_type))
|
if (fp_register_arg_p (gdbarch, typecode, arg_type))
|
||||||
{
|
{
|
||||||
if ((float_argreg & 1))
|
if ((float_argreg & 1))
|
||||||
float_argreg++;
|
float_argreg++;
|
||||||
@ -3568,8 +3569,8 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
arguments in general registers can't hurt non-MIPS16 functions
|
arguments in general registers can't hurt non-MIPS16 functions
|
||||||
because those registers are normally skipped. */
|
because those registers are normally skipped. */
|
||||||
|
|
||||||
if (fp_register_arg_p (typecode, arg_type)
|
if (fp_register_arg_p (gdbarch, typecode, arg_type)
|
||||||
&& float_argreg <= MIPS_LAST_FP_ARG_REGNUM)
|
&& float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
|
||||||
{
|
{
|
||||||
if (register_size (gdbarch, float_argreg) < 8 && len == 8)
|
if (register_size (gdbarch, float_argreg) < 8 && len == 8)
|
||||||
{
|
{
|
||||||
@ -3657,7 +3658,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
partial_len);
|
partial_len);
|
||||||
|
|
||||||
/* Write this portion of the argument to the stack. */
|
/* Write this portion of the argument to the stack. */
|
||||||
if (argreg > MIPS_LAST_ARG_REGNUM
|
if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
|
||||||
|| odd_sized_struct)
|
|| odd_sized_struct)
|
||||||
{
|
{
|
||||||
/* Should shorter than int integer values be
|
/* Should shorter than int integer values be
|
||||||
@ -3694,7 +3695,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
structs may go thru BOTH paths. */
|
structs may go thru BOTH paths. */
|
||||||
/* Write this portion of the argument to a general
|
/* Write this portion of the argument to a general
|
||||||
purpose register. */
|
purpose register. */
|
||||||
if (argreg <= MIPS_LAST_ARG_REGNUM)
|
if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
|
||||||
{
|
{
|
||||||
LONGEST regval = extract_signed_integer (val, partial_len);
|
LONGEST regval = extract_signed_integer (val, partial_len);
|
||||||
/* Value may need to be sign extended, because
|
/* Value may need to be sign extended, because
|
||||||
@ -3741,7 +3742,7 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
|
|
||||||
/* Prevent subsequent floating point arguments from
|
/* Prevent subsequent floating point arguments from
|
||||||
being passed in floating point registers. */
|
being passed in floating point registers. */
|
||||||
float_argreg = MIPS_LAST_FP_ARG_REGNUM + 1;
|
float_argreg = MIPS_LAST_FP_ARG_REGNUM (gdbarch) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
len -= partial_len;
|
len -= partial_len;
|
||||||
@ -4016,8 +4017,8 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
arguments in general registers can't hurt non-MIPS16 functions
|
arguments in general registers can't hurt non-MIPS16 functions
|
||||||
because those registers are normally skipped. */
|
because those registers are normally skipped. */
|
||||||
|
|
||||||
if (fp_register_arg_p (typecode, arg_type)
|
if (fp_register_arg_p (gdbarch, typecode, arg_type)
|
||||||
&& float_argreg <= MIPS_LAST_FP_ARG_REGNUM)
|
&& float_argreg <= MIPS_LAST_FP_ARG_REGNUM (gdbarch))
|
||||||
{
|
{
|
||||||
LONGEST regval = extract_unsigned_integer (val, len);
|
LONGEST regval = extract_unsigned_integer (val, len);
|
||||||
if (mips_debug)
|
if (mips_debug)
|
||||||
@ -4054,7 +4055,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
partial_len);
|
partial_len);
|
||||||
|
|
||||||
/* Write this portion of the argument to the stack. */
|
/* Write this portion of the argument to the stack. */
|
||||||
if (argreg > MIPS_LAST_ARG_REGNUM
|
if (argreg > MIPS_LAST_ARG_REGNUM (gdbarch)
|
||||||
|| odd_sized_struct)
|
|| odd_sized_struct)
|
||||||
{
|
{
|
||||||
/* Should shorter than int integer values be
|
/* Should shorter than int integer values be
|
||||||
@ -4099,7 +4100,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
structs may go thru BOTH paths. */
|
structs may go thru BOTH paths. */
|
||||||
/* Write this portion of the argument to a general
|
/* Write this portion of the argument to a general
|
||||||
purpose register. */
|
purpose register. */
|
||||||
if (argreg <= MIPS_LAST_ARG_REGNUM)
|
if (argreg <= MIPS_LAST_ARG_REGNUM (gdbarch))
|
||||||
{
|
{
|
||||||
LONGEST regval = extract_signed_integer (val, partial_len);
|
LONGEST regval = extract_signed_integer (val, partial_len);
|
||||||
/* Value may need to be sign extended, because
|
/* Value may need to be sign extended, because
|
||||||
@ -4130,7 +4131,7 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
|
|
||||||
/* Prevent subsequent floating point arguments from
|
/* Prevent subsequent floating point arguments from
|
||||||
being passed in floating point registers. */
|
being passed in floating point registers. */
|
||||||
float_argreg = MIPS_LAST_FP_ARG_REGNUM + 1;
|
float_argreg = MIPS_LAST_FP_ARG_REGNUM (gdbarch) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
len -= partial_len;
|
len -= partial_len;
|
||||||
@ -4168,7 +4169,7 @@ mips_o64_return_value (struct gdbarch *gdbarch, struct type *func_type,
|
|||||||
|| TYPE_CODE (type) == TYPE_CODE_UNION
|
|| TYPE_CODE (type) == TYPE_CODE_UNION
|
||||||
|| TYPE_CODE (type) == TYPE_CODE_ARRAY)
|
|| TYPE_CODE (type) == TYPE_CODE_ARRAY)
|
||||||
return RETURN_VALUE_STRUCT_CONVENTION;
|
return RETURN_VALUE_STRUCT_CONVENTION;
|
||||||
else if (fp_register_arg_p (TYPE_CODE (type), type))
|
else if (fp_register_arg_p (gdbarch, TYPE_CODE (type), type))
|
||||||
{
|
{
|
||||||
/* A floating-point value. It fits in the least significant
|
/* A floating-point value. It fits in the least significant
|
||||||
part of FP0. */
|
part of FP0. */
|
||||||
@ -4785,7 +4786,7 @@ show_mipsfpu_command (char *args, int from_tty)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (MIPS_FPU_TYPE)
|
switch (MIPS_FPU_TYPE (current_gdbarch))
|
||||||
{
|
{
|
||||||
case MIPS_FPU_SINGLE:
|
case MIPS_FPU_SINGLE:
|
||||||
fpu = "single-precision";
|
fpu = "single-precision";
|
||||||
@ -6032,13 +6033,14 @@ mips_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
|
|||||||
: MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_SINGLE ? "single"
|
: MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_SINGLE ? "single"
|
||||||
: MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_DOUBLE ? "double"
|
: MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_DOUBLE ? "double"
|
||||||
: "???"));
|
: "???"));
|
||||||
fprintf_unfiltered (file, "mips_dump_tdep: MIPS_EABI = %d\n", MIPS_EABI);
|
fprintf_unfiltered (file, "mips_dump_tdep: MIPS_EABI = %d\n",
|
||||||
|
MIPS_EABI (gdbarch));
|
||||||
fprintf_unfiltered (file,
|
fprintf_unfiltered (file,
|
||||||
"mips_dump_tdep: MIPS_FPU_TYPE = %d (%s)\n",
|
"mips_dump_tdep: MIPS_FPU_TYPE = %d (%s)\n",
|
||||||
MIPS_FPU_TYPE,
|
MIPS_FPU_TYPE (gdbarch),
|
||||||
(MIPS_FPU_TYPE == MIPS_FPU_NONE ? "none"
|
(MIPS_FPU_TYPE (gdbarch) == MIPS_FPU_NONE ? "none"
|
||||||
: MIPS_FPU_TYPE == MIPS_FPU_SINGLE ? "single"
|
: MIPS_FPU_TYPE (gdbarch) == MIPS_FPU_SINGLE ? "single"
|
||||||
: MIPS_FPU_TYPE == MIPS_FPU_DOUBLE ? "double"
|
: MIPS_FPU_TYPE (gdbarch) == MIPS_FPU_DOUBLE ? "double"
|
||||||
: "???"));
|
: "???"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,16 +33,17 @@
|
|||||||
|
|
||||||
/* Determine if PT_GETREGS fetches this register. */
|
/* Determine if PT_GETREGS fetches this register. */
|
||||||
static int
|
static int
|
||||||
getregs_supplies (int regno)
|
getregs_supplies (struct gdbarch *gdbarch, int regno)
|
||||||
{
|
{
|
||||||
return ((regno) >= MIPS_ZERO_REGNUM
|
return ((regno) >= MIPS_ZERO_REGNUM
|
||||||
&& (regno) <= gdbarch_pc_regnum (current_gdbarch));
|
&& (regno) <= gdbarch_pc_regnum (gdbarch));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno)
|
mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno)
|
||||||
{
|
{
|
||||||
if (regno == -1 || getregs_supplies (regno))
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
||||||
|
if (regno == -1 || getregs_supplies (gdbarch, regno))
|
||||||
{
|
{
|
||||||
struct reg regs;
|
struct reg regs;
|
||||||
|
|
||||||
@ -70,7 +71,8 @@ mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno)
|
|||||||
static void
|
static void
|
||||||
mipsnbsd_store_inferior_registers (struct regcache *regcache, int regno)
|
mipsnbsd_store_inferior_registers (struct regcache *regcache, int regno)
|
||||||
{
|
{
|
||||||
if (regno == -1 || getregs_supplies (regno))
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
||||||
|
if (regno == -1 || getregs_supplies (gdbarch, regno))
|
||||||
{
|
{
|
||||||
struct reg regs;
|
struct reg regs;
|
||||||
|
|
||||||
|
@ -286,25 +286,26 @@ mipsnbsd_sigtramp_offset (struct frame_info *this_frame)
|
|||||||
success. */
|
success. */
|
||||||
|
|
||||||
#define NBSD_MIPS_JB_PC (2 * 4)
|
#define NBSD_MIPS_JB_PC (2 * 4)
|
||||||
#define NBSD_MIPS_JB_ELEMENT_SIZE mips_isa_regsize (current_gdbarch)
|
#define NBSD_MIPS_JB_ELEMENT_SIZE(gdbarch) mips_isa_regsize (gdbarch)
|
||||||
#define NBSD_MIPS_JB_OFFSET (NBSD_MIPS_JB_PC * \
|
#define NBSD_MIPS_JB_OFFSET(gdbarch) (NBSD_MIPS_JB_PC * \
|
||||||
NBSD_MIPS_JB_ELEMENT_SIZE)
|
NBSD_MIPS_JB_ELEMENT_SIZE (gdbarch))
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mipsnbsd_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
|
mipsnbsd_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
|
||||||
{
|
{
|
||||||
|
struct gdbarch *gdbarch = get_frame_arch (frame);
|
||||||
CORE_ADDR jb_addr;
|
CORE_ADDR jb_addr;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
buf = alloca (NBSD_MIPS_JB_ELEMENT_SIZE);
|
buf = alloca (NBSD_MIPS_JB_ELEMENT_SIZE (gdbarch));
|
||||||
|
|
||||||
jb_addr = get_frame_register_unsigned (frame, MIPS_A0_REGNUM);
|
jb_addr = get_frame_register_unsigned (frame, MIPS_A0_REGNUM);
|
||||||
|
|
||||||
if (target_read_memory (jb_addr + NBSD_MIPS_JB_OFFSET, buf,
|
if (target_read_memory (jb_addr + NBSD_MIPS_JB_OFFSET (gdbarch), buf,
|
||||||
NBSD_MIPS_JB_ELEMENT_SIZE))
|
NBSD_MIPS_JB_ELEMENT_SIZE (gdbarch)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
*pc = extract_unsigned_integer (buf, NBSD_MIPS_JB_ELEMENT_SIZE);
|
*pc = extract_unsigned_integer (buf, NBSD_MIPS_JB_ELEMENT_SIZE (gdbarch));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ static void mips_resume (ptid_t ptid, int step,
|
|||||||
static ptid_t mips_wait (ptid_t ptid,
|
static ptid_t mips_wait (ptid_t ptid,
|
||||||
struct target_waitstatus *status);
|
struct target_waitstatus *status);
|
||||||
|
|
||||||
static int mips_map_regno (int regno);
|
static int mips_map_regno (struct gdbarch *, int);
|
||||||
|
|
||||||
static void mips_fetch_registers (struct regcache *regcache, int regno);
|
static void mips_fetch_registers (struct regcache *regcache, int regno);
|
||||||
|
|
||||||
@ -1875,24 +1875,24 @@ mips_wait (ptid_t ptid, struct target_waitstatus *status)
|
|||||||
#define REGNO_OFFSET 96
|
#define REGNO_OFFSET 96
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mips_map_regno (int regno)
|
mips_map_regno (struct gdbarch *gdbarch, int regno)
|
||||||
{
|
{
|
||||||
if (regno < 32)
|
if (regno < 32)
|
||||||
return regno;
|
return regno;
|
||||||
if (regno >= mips_regnum (current_gdbarch)->fp0
|
if (regno >= mips_regnum (gdbarch)->fp0
|
||||||
&& regno < mips_regnum (current_gdbarch)->fp0 + 32)
|
&& regno < mips_regnum (gdbarch)->fp0 + 32)
|
||||||
return regno - mips_regnum (current_gdbarch)->fp0 + 32;
|
return regno - mips_regnum (gdbarch)->fp0 + 32;
|
||||||
else if (regno == mips_regnum (current_gdbarch)->pc)
|
else if (regno == mips_regnum (gdbarch)->pc)
|
||||||
return REGNO_OFFSET + 0;
|
return REGNO_OFFSET + 0;
|
||||||
else if (regno == mips_regnum (current_gdbarch)->cause)
|
else if (regno == mips_regnum (gdbarch)->cause)
|
||||||
return REGNO_OFFSET + 1;
|
return REGNO_OFFSET + 1;
|
||||||
else if (regno == mips_regnum (current_gdbarch)->hi)
|
else if (regno == mips_regnum (gdbarch)->hi)
|
||||||
return REGNO_OFFSET + 2;
|
return REGNO_OFFSET + 2;
|
||||||
else if (regno == mips_regnum (current_gdbarch)->lo)
|
else if (regno == mips_regnum (gdbarch)->lo)
|
||||||
return REGNO_OFFSET + 3;
|
return REGNO_OFFSET + 3;
|
||||||
else if (regno == mips_regnum (current_gdbarch)->fp_control_status)
|
else if (regno == mips_regnum (gdbarch)->fp_control_status)
|
||||||
return REGNO_OFFSET + 4;
|
return REGNO_OFFSET + 4;
|
||||||
else if (regno == mips_regnum (current_gdbarch)->fp_implementation_revision)
|
else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
|
||||||
return REGNO_OFFSET + 5;
|
return REGNO_OFFSET + 5;
|
||||||
else
|
else
|
||||||
/* FIXME: Is there a way to get the status register? */
|
/* FIXME: Is there a way to get the status register? */
|
||||||
@ -1924,7 +1924,7 @@ mips_fetch_registers (struct regcache *regcache, int regno)
|
|||||||
{
|
{
|
||||||
/* If PMON doesn't support this register, don't waste serial
|
/* If PMON doesn't support this register, don't waste serial
|
||||||
bandwidth trying to read it. */
|
bandwidth trying to read it. */
|
||||||
int pmon_reg = mips_map_regno (regno);
|
int pmon_reg = mips_map_regno (gdbarch, regno);
|
||||||
if (regno != 0 && pmon_reg == 0)
|
if (regno != 0 && pmon_reg == 0)
|
||||||
val = 0;
|
val = 0;
|
||||||
else
|
else
|
||||||
@ -1979,7 +1979,7 @@ mips_store_registers (struct regcache *regcache, int regno)
|
|||||||
}
|
}
|
||||||
|
|
||||||
regcache_cooked_read_unsigned (regcache, regno, &val);
|
regcache_cooked_read_unsigned (regcache, regno, &val);
|
||||||
mips_request ('R', mips_map_regno (regno), val,
|
mips_request ('R', mips_map_regno (gdbarch, regno), val,
|
||||||
&err, mips_receive_wait, NULL);
|
&err, mips_receive_wait, NULL);
|
||||||
if (err)
|
if (err)
|
||||||
mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
|
mips_error ("Can't write register %d: %s", regno, safe_strerror (errno));
|
||||||
@ -3281,8 +3281,10 @@ mips_load (char *file, int from_tty)
|
|||||||
/* Work around problem where PMON monitor updates the PC after a load
|
/* Work around problem where PMON monitor updates the PC after a load
|
||||||
to a different value than GDB thinks it has. The following ensures
|
to a different value than GDB thinks it has. The following ensures
|
||||||
that the write_pc() WILL update the PC value: */
|
that the write_pc() WILL update the PC value: */
|
||||||
regcache_set_valid_p (get_current_regcache (),
|
struct regcache *regcache = get_current_regcache ();
|
||||||
gdbarch_pc_regnum (current_gdbarch), 0);
|
regcache_set_valid_p (regcache,
|
||||||
|
gdbarch_pc_regnum (get_regcache_arch (regcache)),
|
||||||
|
0);
|
||||||
}
|
}
|
||||||
if (exec_bfd)
|
if (exec_bfd)
|
||||||
write_pc (bfd_get_start_address (exec_bfd));
|
write_pc (bfd_get_start_address (exec_bfd));
|
||||||
|
Reference in New Issue
Block a user