mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-03 05:12:28 +08:00
Remove global variable arm_linux_vfp_register_count in arm-linux-nat.c
This patch is to remove the global variable arm_linux_vfp_register_count from arm-linux-nat.c. This global variable is set when native gdb looks for the right target description according HWCAP. However, 'struct gdbarch_tdep' has already had a field have_vfp_registers, which is a boolean about whether target has vfp registers or not. This patch converts this boolean field to a numeric counter to replace global variable arm_linux_vfp_register_count. gdb: 2015-05-28 Yao Qi <yao.qi@linaro.org> * arm-linux-nat.c (arm_linux_vfp_register_count): Remove. (fetch_vfp_regs): Use vfp_register_count from gdbarch_tdep instead of arm_linux_vfp_register_count. (store_vfp_regs): Likewise. (arm_linux_fetch_inferior_registers): Likewise. (arm_linux_store_inferior_registers): Likewise. (arm_linux_read_description): Don't set arm_linux_vfp_register_count. * arm-linux-tdep.c (arm_linux_iterate_over_regset_sections): Adjust. * arm-tdep.c (arm_gdbarch_init): Add assert on vfp_register_count. * arm-tdep.h (struct gdbarch_tdep) <have_vfp_registers>: Rename field to vfp_register_count. All users updated.
This commit is contained in:
@ -1,3 +1,20 @@
|
|||||||
|
2015-05-28 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* arm-linux-nat.c (arm_linux_vfp_register_count): Remove.
|
||||||
|
(fetch_vfp_regs): Use vfp_register_count from gdbarch_tdep
|
||||||
|
instead of arm_linux_vfp_register_count.
|
||||||
|
(store_vfp_regs): Likewise.
|
||||||
|
(arm_linux_fetch_inferior_registers): Likewise.
|
||||||
|
(arm_linux_store_inferior_registers): Likewise.
|
||||||
|
(arm_linux_read_description): Don't set
|
||||||
|
arm_linux_vfp_register_count.
|
||||||
|
* arm-linux-tdep.c (arm_linux_iterate_over_regset_sections):
|
||||||
|
Adjust.
|
||||||
|
* arm-tdep.c (arm_gdbarch_init): Add assert on
|
||||||
|
vfp_register_count.
|
||||||
|
* arm-tdep.h (struct gdbarch_tdep) <have_vfp_registers>: Rename
|
||||||
|
field to vfp_register_count. All users updated.
|
||||||
|
|
||||||
2015-05-28 Kyle Huey <me@kylehuey.com> (tiny patch)
|
2015-05-28 Kyle Huey <me@kylehuey.com> (tiny patch)
|
||||||
|
|
||||||
* gdb/arm-tdep.c (arm_gdbarch_init): Perform arm_abi detection on
|
* gdb/arm-tdep.c (arm_gdbarch_init): Perform arm_abi detection on
|
||||||
|
@ -64,10 +64,6 @@
|
|||||||
/* A flag for whether the WMMX registers are available. */
|
/* A flag for whether the WMMX registers are available. */
|
||||||
static int arm_linux_has_wmmx_registers;
|
static int arm_linux_has_wmmx_registers;
|
||||||
|
|
||||||
/* The number of 64-bit VFP registers we have (expect this to be 0,
|
|
||||||
16, or 32). */
|
|
||||||
static int arm_linux_vfp_register_count;
|
|
||||||
|
|
||||||
extern int arm_apcs_32;
|
extern int arm_apcs_32;
|
||||||
|
|
||||||
/* On GNU/Linux, threads are implemented as pseudo-processes, in which
|
/* On GNU/Linux, threads are implemented as pseudo-processes, in which
|
||||||
@ -460,6 +456,8 @@ fetch_vfp_regs (struct regcache *regcache)
|
|||||||
{
|
{
|
||||||
char regbuf[VFP_REGS_SIZE];
|
char regbuf[VFP_REGS_SIZE];
|
||||||
int ret, regno, tid;
|
int ret, regno, tid;
|
||||||
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
||||||
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||||
|
|
||||||
/* Get the thread id for the ptrace call. */
|
/* Get the thread id for the ptrace call. */
|
||||||
tid = GET_THREAD_ID (inferior_ptid);
|
tid = GET_THREAD_ID (inferior_ptid);
|
||||||
@ -471,7 +469,7 @@ fetch_vfp_regs (struct regcache *regcache)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (regno = 0; regno < arm_linux_vfp_register_count; regno++)
|
for (regno = 0; regno < tdep->vfp_register_count; regno++)
|
||||||
regcache_raw_supply (regcache, regno + ARM_D0_REGNUM,
|
regcache_raw_supply (regcache, regno + ARM_D0_REGNUM,
|
||||||
(char *) regbuf + regno * 8);
|
(char *) regbuf + regno * 8);
|
||||||
|
|
||||||
@ -484,6 +482,8 @@ store_vfp_regs (const struct regcache *regcache)
|
|||||||
{
|
{
|
||||||
char regbuf[VFP_REGS_SIZE];
|
char regbuf[VFP_REGS_SIZE];
|
||||||
int ret, regno, tid;
|
int ret, regno, tid;
|
||||||
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
||||||
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||||
|
|
||||||
/* Get the thread id for the ptrace call. */
|
/* Get the thread id for the ptrace call. */
|
||||||
tid = GET_THREAD_ID (inferior_ptid);
|
tid = GET_THREAD_ID (inferior_ptid);
|
||||||
@ -495,7 +495,7 @@ store_vfp_regs (const struct regcache *regcache)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (regno = 0; regno < arm_linux_vfp_register_count; regno++)
|
for (regno = 0; regno < tdep->vfp_register_count; regno++)
|
||||||
regcache_raw_collect (regcache, regno + ARM_D0_REGNUM,
|
regcache_raw_collect (regcache, regno + ARM_D0_REGNUM,
|
||||||
(char *) regbuf + regno * 8);
|
(char *) regbuf + regno * 8);
|
||||||
|
|
||||||
@ -519,13 +519,16 @@ static void
|
|||||||
arm_linux_fetch_inferior_registers (struct target_ops *ops,
|
arm_linux_fetch_inferior_registers (struct target_ops *ops,
|
||||||
struct regcache *regcache, int regno)
|
struct regcache *regcache, int regno)
|
||||||
{
|
{
|
||||||
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
||||||
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||||
|
|
||||||
if (-1 == regno)
|
if (-1 == regno)
|
||||||
{
|
{
|
||||||
fetch_regs (regcache);
|
fetch_regs (regcache);
|
||||||
fetch_fpregs (regcache);
|
fetch_fpregs (regcache);
|
||||||
if (arm_linux_has_wmmx_registers)
|
if (arm_linux_has_wmmx_registers)
|
||||||
fetch_wmmx_regs (regcache);
|
fetch_wmmx_regs (regcache);
|
||||||
if (arm_linux_vfp_register_count > 0)
|
if (tdep->vfp_register_count > 0)
|
||||||
fetch_vfp_regs (regcache);
|
fetch_vfp_regs (regcache);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -537,9 +540,9 @@ arm_linux_fetch_inferior_registers (struct target_ops *ops,
|
|||||||
else if (arm_linux_has_wmmx_registers
|
else if (arm_linux_has_wmmx_registers
|
||||||
&& regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
|
&& regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
|
||||||
fetch_wmmx_regs (regcache);
|
fetch_wmmx_regs (regcache);
|
||||||
else if (arm_linux_vfp_register_count > 0
|
else if (tdep->vfp_register_count > 0
|
||||||
&& regno >= ARM_D0_REGNUM
|
&& regno >= ARM_D0_REGNUM
|
||||||
&& regno <= ARM_D0_REGNUM + arm_linux_vfp_register_count)
|
&& regno <= ARM_D0_REGNUM + tdep->vfp_register_count)
|
||||||
fetch_vfp_regs (regcache);
|
fetch_vfp_regs (regcache);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -552,13 +555,16 @@ static void
|
|||||||
arm_linux_store_inferior_registers (struct target_ops *ops,
|
arm_linux_store_inferior_registers (struct target_ops *ops,
|
||||||
struct regcache *regcache, int regno)
|
struct regcache *regcache, int regno)
|
||||||
{
|
{
|
||||||
|
struct gdbarch *gdbarch = get_regcache_arch (regcache);
|
||||||
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||||
|
|
||||||
if (-1 == regno)
|
if (-1 == regno)
|
||||||
{
|
{
|
||||||
store_regs (regcache);
|
store_regs (regcache);
|
||||||
store_fpregs (regcache);
|
store_fpregs (regcache);
|
||||||
if (arm_linux_has_wmmx_registers)
|
if (arm_linux_has_wmmx_registers)
|
||||||
store_wmmx_regs (regcache);
|
store_wmmx_regs (regcache);
|
||||||
if (arm_linux_vfp_register_count > 0)
|
if (tdep->vfp_register_count > 0)
|
||||||
store_vfp_regs (regcache);
|
store_vfp_regs (regcache);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -570,9 +576,9 @@ arm_linux_store_inferior_registers (struct target_ops *ops,
|
|||||||
else if (arm_linux_has_wmmx_registers
|
else if (arm_linux_has_wmmx_registers
|
||||||
&& regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
|
&& regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
|
||||||
store_wmmx_regs (regcache);
|
store_wmmx_regs (regcache);
|
||||||
else if (arm_linux_vfp_register_count > 0
|
else if (tdep->vfp_register_count > 0
|
||||||
&& regno >= ARM_D0_REGNUM
|
&& regno >= ARM_D0_REGNUM
|
||||||
&& regno <= ARM_D0_REGNUM + arm_linux_vfp_register_count)
|
&& regno <= ARM_D0_REGNUM + tdep->vfp_register_count)
|
||||||
store_vfp_regs (regcache);
|
store_vfp_regs (regcache);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -631,7 +637,6 @@ arm_linux_read_description (struct target_ops *ops)
|
|||||||
{
|
{
|
||||||
CORE_ADDR arm_hwcap = 0;
|
CORE_ADDR arm_hwcap = 0;
|
||||||
arm_linux_has_wmmx_registers = 0;
|
arm_linux_has_wmmx_registers = 0;
|
||||||
arm_linux_vfp_register_count = 0;
|
|
||||||
|
|
||||||
if (target_auxv_search (ops, AT_HWCAP, &arm_hwcap) != 1)
|
if (target_auxv_search (ops, AT_HWCAP, &arm_hwcap) != 1)
|
||||||
{
|
{
|
||||||
@ -653,20 +658,11 @@ arm_linux_read_description (struct target_ops *ops)
|
|||||||
/* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support
|
/* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support
|
||||||
Neon with VFPv3-D32. */
|
Neon with VFPv3-D32. */
|
||||||
if (arm_hwcap & HWCAP_NEON)
|
if (arm_hwcap & HWCAP_NEON)
|
||||||
{
|
result = tdesc_arm_with_neon;
|
||||||
arm_linux_vfp_register_count = 32;
|
|
||||||
result = tdesc_arm_with_neon;
|
|
||||||
}
|
|
||||||
else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
|
else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
|
||||||
{
|
result = tdesc_arm_with_vfpv3;
|
||||||
arm_linux_vfp_register_count = 32;
|
|
||||||
result = tdesc_arm_with_vfpv3;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
result = tdesc_arm_with_vfpv2;
|
||||||
arm_linux_vfp_register_count = 16;
|
|
||||||
result = tdesc_arm_with_vfpv2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now make sure that the kernel supports reading these
|
/* Now make sure that the kernel supports reading these
|
||||||
registers. Support was added in 2.6.30. */
|
registers. Support was added in 2.6.30. */
|
||||||
|
@ -743,7 +743,7 @@ arm_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
|
|||||||
|
|
||||||
cb (".reg", ARM_LINUX_SIZEOF_GREGSET, &arm_linux_gregset, NULL, cb_data);
|
cb (".reg", ARM_LINUX_SIZEOF_GREGSET, &arm_linux_gregset, NULL, cb_data);
|
||||||
|
|
||||||
if (tdep->have_vfp_registers)
|
if (tdep->vfp_register_count > 0)
|
||||||
cb (".reg-arm-vfp", ARM_LINUX_SIZEOF_VFP, &arm_linux_vfpregset,
|
cb (".reg-arm-vfp", ARM_LINUX_SIZEOF_VFP, &arm_linux_vfpregset,
|
||||||
"VFP floating-point", cb_data);
|
"VFP floating-point", cb_data);
|
||||||
else if (tdep->have_fpa_registers)
|
else if (tdep->have_fpa_registers)
|
||||||
|
@ -9914,7 +9914,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||||||
enum arm_float_model fp_model = arm_fp_model;
|
enum arm_float_model fp_model = arm_fp_model;
|
||||||
struct tdesc_arch_data *tdesc_data = NULL;
|
struct tdesc_arch_data *tdesc_data = NULL;
|
||||||
int i, is_m = 0;
|
int i, is_m = 0;
|
||||||
int have_vfp_registers = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
|
int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
|
||||||
int have_neon = 0;
|
int have_neon = 0;
|
||||||
int have_fpa_registers = 1;
|
int have_fpa_registers = 1;
|
||||||
const struct target_desc *tdesc = info.target_desc;
|
const struct target_desc *tdesc = info.target_desc;
|
||||||
@ -10220,7 +10220,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||||||
if (tdesc_unnumbered_register (feature, "s0") == 0)
|
if (tdesc_unnumbered_register (feature, "s0") == 0)
|
||||||
have_vfp_pseudos = 1;
|
have_vfp_pseudos = 1;
|
||||||
|
|
||||||
have_vfp_registers = 1;
|
vfp_register_count = i;
|
||||||
|
|
||||||
/* If we have VFP, also check for NEON. The architecture allows
|
/* If we have VFP, also check for NEON. The architecture allows
|
||||||
NEON without VFP (integer vector operations only), but GDB
|
NEON without VFP (integer vector operations only), but GDB
|
||||||
@ -10289,7 +10289,10 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||||||
tdep->fp_model = fp_model;
|
tdep->fp_model = fp_model;
|
||||||
tdep->is_m = is_m;
|
tdep->is_m = is_m;
|
||||||
tdep->have_fpa_registers = have_fpa_registers;
|
tdep->have_fpa_registers = have_fpa_registers;
|
||||||
tdep->have_vfp_registers = have_vfp_registers;
|
gdb_assert (vfp_register_count == 0
|
||||||
|
|| vfp_register_count == 16
|
||||||
|
|| vfp_register_count == 32);
|
||||||
|
tdep->vfp_register_count = vfp_register_count;
|
||||||
tdep->have_vfp_pseudos = have_vfp_pseudos;
|
tdep->have_vfp_pseudos = have_vfp_pseudos;
|
||||||
tdep->have_neon_pseudos = have_neon_pseudos;
|
tdep->have_neon_pseudos = have_neon_pseudos;
|
||||||
tdep->have_neon = have_neon;
|
tdep->have_neon = have_neon;
|
||||||
|
@ -161,7 +161,9 @@ struct gdbarch_tdep
|
|||||||
enum arm_float_model fp_model; /* Floating point calling conventions. */
|
enum arm_float_model fp_model; /* Floating point calling conventions. */
|
||||||
|
|
||||||
int have_fpa_registers; /* Does the target report the FPA registers? */
|
int have_fpa_registers; /* Does the target report the FPA registers? */
|
||||||
int have_vfp_registers; /* Does the target report the VFP registers? */
|
/* The number of VFP registers reported by the target. It is zero
|
||||||
|
if VFP registers are not supported. */
|
||||||
|
int vfp_register_count;
|
||||||
int have_vfp_pseudos; /* Are we synthesizing the single precision
|
int have_vfp_pseudos; /* Are we synthesizing the single precision
|
||||||
VFP registers? */
|
VFP registers? */
|
||||||
int have_neon_pseudos; /* Are we synthesizing the quad precision
|
int have_neon_pseudos; /* Are we synthesizing the quad precision
|
||||||
|
Reference in New Issue
Block a user