From patchwork Tue May 26 15:31:30 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 6920 Received: (qmail 68201 invoked by alias); 26 May 2015 15:31:41 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 68161 invoked by uid 89); 26 May 2015 15:31:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-pd0-f169.google.com Received: from mail-pd0-f169.google.com (HELO mail-pd0-f169.google.com) (209.85.192.169) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 26 May 2015 15:31:36 +0000 Received: by pdfh10 with SMTP id h10so93215435pdf.3 for ; Tue, 26 May 2015 08:31:35 -0700 (PDT) X-Received: by 10.70.25.37 with SMTP id z5mr50061092pdf.36.1432654294929; Tue, 26 May 2015 08:31:34 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by mx.google.com with ESMTPSA id mb4sm13433622pdb.63.2015.05.26.08.31.33 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 26 May 2015 08:31:34 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 1/2] Remove global variable arm_linux_vfp_register_count in arm-linux-nat.c Date: Tue, 26 May 2015 16:31:30 +0100 Message-Id: <1432654291-25436-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes 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-26 Yao Qi * 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) : Rename field to vfp_register_count. All users updated. --- gdb/arm-linux-nat.c | 46 +++++++++++++++++++++------------------------- gdb/arm-linux-tdep.c | 2 +- gdb/arm-tdep.c | 9 ++++++--- gdb/arm-tdep.h | 4 +++- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c index afc5817..5c0ede6 100644 --- a/gdb/arm-linux-nat.c +++ b/gdb/arm-linux-nat.c @@ -64,10 +64,6 @@ /* A flag for whether the WMMX registers are available. */ 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; /* 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]; 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. */ tid = GET_THREAD_ID (inferior_ptid); @@ -471,7 +469,7 @@ fetch_vfp_regs (struct regcache *regcache) 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, (char *) regbuf + regno * 8); @@ -484,6 +482,8 @@ store_vfp_regs (const struct regcache *regcache) { char regbuf[VFP_REGS_SIZE]; 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. */ tid = GET_THREAD_ID (inferior_ptid); @@ -495,7 +495,7 @@ store_vfp_regs (const struct regcache *regcache) 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, (char *) regbuf + regno * 8); @@ -519,13 +519,16 @@ static void arm_linux_fetch_inferior_registers (struct target_ops *ops, struct regcache *regcache, int regno) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + if (-1 == regno) { fetch_regs (regcache); fetch_fpregs (regcache); if (arm_linux_has_wmmx_registers) fetch_wmmx_regs (regcache); - if (arm_linux_vfp_register_count > 0) + if (tdep->vfp_register_count > 0) fetch_vfp_regs (regcache); } else @@ -537,9 +540,9 @@ arm_linux_fetch_inferior_registers (struct target_ops *ops, else if (arm_linux_has_wmmx_registers && regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM) 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 + arm_linux_vfp_register_count) + && regno <= ARM_D0_REGNUM + tdep->vfp_register_count) fetch_vfp_regs (regcache); } } @@ -552,13 +555,16 @@ static void arm_linux_store_inferior_registers (struct target_ops *ops, struct regcache *regcache, int regno) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + if (-1 == regno) { store_regs (regcache); store_fpregs (regcache); if (arm_linux_has_wmmx_registers) store_wmmx_regs (regcache); - if (arm_linux_vfp_register_count > 0) + if (tdep->vfp_register_count > 0) store_vfp_regs (regcache); } else @@ -570,9 +576,9 @@ arm_linux_store_inferior_registers (struct target_ops *ops, else if (arm_linux_has_wmmx_registers && regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM) 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 + arm_linux_vfp_register_count) + && regno <= ARM_D0_REGNUM + tdep->vfp_register_count) store_vfp_regs (regcache); } } @@ -631,7 +637,6 @@ arm_linux_read_description (struct target_ops *ops) { CORE_ADDR arm_hwcap = 0; arm_linux_has_wmmx_registers = 0; - arm_linux_vfp_register_count = 0; 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 with VFPv3-D32. */ if (arm_hwcap & HWCAP_NEON) - { - arm_linux_vfp_register_count = 32; - result = tdesc_arm_with_neon; - } + result = tdesc_arm_with_neon; else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3) - { - arm_linux_vfp_register_count = 32; - result = tdesc_arm_with_vfpv3; - } + result = tdesc_arm_with_vfpv3; else - { - arm_linux_vfp_register_count = 16; - result = tdesc_arm_with_vfpv2; - } + result = tdesc_arm_with_vfpv2; /* Now make sure that the kernel supports reading these registers. Support was added in 2.6.30. */ diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c index b6757bd..fd0ef5b 100644 --- a/gdb/arm-linux-tdep.c +++ b/gdb/arm-linux-tdep.c @@ -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); - if (tdep->have_vfp_registers) + if (tdep->vfp_register_count > 0) cb (".reg-arm-vfp", ARM_LINUX_SIZEOF_VFP, &arm_linux_vfpregset, "VFP floating-point", cb_data); else if (tdep->have_fpa_registers) diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 638855b..1d755e5 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -9914,7 +9914,7 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) enum arm_float_model fp_model = arm_fp_model; struct tdesc_arch_data *tdesc_data = NULL; 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_fpa_registers = 1; 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) have_vfp_pseudos = 1; - have_vfp_registers = 1; + vfp_register_count = i; /* If we have VFP, also check for NEON. The architecture allows 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->is_m = is_m; 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_neon_pseudos = have_neon_pseudos; tdep->have_neon = have_neon; diff --git a/gdb/arm-tdep.h b/gdb/arm-tdep.h index bd01ec9..06658a0 100644 --- a/gdb/arm-tdep.h +++ b/gdb/arm-tdep.h @@ -161,7 +161,9 @@ struct gdbarch_tdep enum arm_float_model fp_model; /* Floating point calling conventions. */ 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 VFP registers? */ int have_neon_pseudos; /* Are we synthesizing the quad precision