From patchwork Tue Nov 3 14:26:33 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 9528 Received: (qmail 38780 invoked by alias); 3 Nov 2015 14:26:54 -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 38763 invoked by uid 89); 3 Nov 2015 14:26:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: usevmg21.ericsson.net Received: from usevmg21.ericsson.net (HELO usevmg21.ericsson.net) (198.24.6.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Tue, 03 Nov 2015 14:26:52 +0000 Received: from EUSAAHC005.ericsson.se (Unknown_Domain [147.117.188.87]) by usevmg21.ericsson.net (Symantec Mail Security) with SMTP id 4F.D6.26730.7C658365; Tue, 3 Nov 2015 07:40:07 +0100 (CET) Received: from elxcz23q12-y4.dyn.mo.ca.am.ericsson.se (147.117.188.8) by smtps-am.internal.ericsson.com (147.117.188.87) with Microsoft SMTP Server (TLS) id 14.3.248.2; Tue, 3 Nov 2015 09:26:49 -0500 From: Simon Marchi To: CC: Simon Marchi Subject: [PATCH c++ 01/12] linux-ppc-low.c: Remove forward declaration, move ppc_arch_setup lower Date: Tue, 3 Nov 2015 09:26:33 -0500 Message-ID: <1446560804-18858-1-git-send-email-simon.marchi@ericsson.com> MIME-Version: 1.0 X-IsSubscribed: yes From: Simon Marchi g++ doesn't like that we forward-declare a variable that is initialized later in the file. It's easy enough to re-order things to fix it. Fixes /home/simark/src/binutils-gdb/gdb/gdbserver/linux-ppc-low.c:663:28: error: redefinition of ‘usrregs_info ppc_usrregs_info’ static struct usrregs_info ppc_usrregs_info = ^ /home/simark/src/binutils-gdb/gdb/gdbserver/linux-ppc-low.c:381:28: note: ‘usrregs_info ppc_usrregs_info’ previously declared here static struct usrregs_info ppc_usrregs_info; ^ gdb/gdbserver/ChangeLog: * linux-ppc-low.c (ppc_usrregs_info): Remove forward-declaration. (ppc_arch_setup): Move lower in file. --- gdb/gdbserver/linux-ppc-low.c | 195 +++++++++++++++++++++--------------------- 1 file changed, 97 insertions(+), 98 deletions(-) diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c index 9e223ea..3840e40 100644 --- a/gdb/gdbserver/linux-ppc-low.c +++ b/gdb/gdbserver/linux-ppc-low.c @@ -377,108 +377,10 @@ ppc_get_hwcap (unsigned long *valp) return 0; } -/* Forward declaration. */ -static struct usrregs_info ppc_usrregs_info; #ifndef __powerpc64__ static int ppc_regmap_adjusted; #endif -static void -ppc_arch_setup (void) -{ - const struct target_desc *tdesc; -#ifdef __powerpc64__ - long msr; - struct regcache *regcache; - - /* On a 64-bit host, assume 64-bit inferior process with no - AltiVec registers. Reset ppc_hwcap to ensure that the - collect_register call below does not fail. */ - tdesc = tdesc_powerpc_64l; - current_process ()->tdesc = tdesc; - ppc_hwcap = 0; - - regcache = new_register_cache (tdesc); - fetch_inferior_registers (regcache, find_regno (tdesc, "msr")); - collect_register_by_name (regcache, "msr", &msr); - free_register_cache (regcache); - if (ppc64_64bit_inferior_p (msr)) - { - ppc_get_hwcap (&ppc_hwcap); - if (ppc_hwcap & PPC_FEATURE_CELL) - tdesc = tdesc_powerpc_cell64l; - else if (ppc_hwcap & PPC_FEATURE_HAS_VSX) - { - /* Power ISA 2.05 (implemented by Power 6 and newer processors) - increases the FPSCR from 32 bits to 64 bits. Even though Power 7 - supports this ISA version, it doesn't have PPC_FEATURE_ARCH_2_05 - set, only PPC_FEATURE_ARCH_2_06. Since for now the only bits - used in the higher half of the register are for Decimal Floating - Point, we check if that feature is available to decide the size - of the FPSCR. */ - if (ppc_hwcap & PPC_FEATURE_HAS_DFP) - tdesc = tdesc_powerpc_isa205_vsx64l; - else - tdesc = tdesc_powerpc_vsx64l; - } - else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC) - { - if (ppc_hwcap & PPC_FEATURE_HAS_DFP) - tdesc = tdesc_powerpc_isa205_altivec64l; - else - tdesc = tdesc_powerpc_altivec64l; - } - - current_process ()->tdesc = tdesc; - return; - } -#endif - - /* OK, we have a 32-bit inferior. */ - tdesc = tdesc_powerpc_32l; - current_process ()->tdesc = tdesc; - - ppc_get_hwcap (&ppc_hwcap); - if (ppc_hwcap & PPC_FEATURE_CELL) - tdesc = tdesc_powerpc_cell32l; - else if (ppc_hwcap & PPC_FEATURE_HAS_VSX) - { - if (ppc_hwcap & PPC_FEATURE_HAS_DFP) - tdesc = tdesc_powerpc_isa205_vsx32l; - else - tdesc = tdesc_powerpc_vsx32l; - } - else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC) - { - if (ppc_hwcap & PPC_FEATURE_HAS_DFP) - tdesc = tdesc_powerpc_isa205_altivec32l; - else - tdesc = tdesc_powerpc_altivec32l; - } - - /* On 32-bit machines, check for SPE registers. - Set the low target's regmap field as appropriately. */ -#ifndef __powerpc64__ - if (ppc_hwcap & PPC_FEATURE_HAS_SPE) - tdesc = tdesc_powerpc_e500l; - - if (!ppc_regmap_adjusted) - { - if (ppc_hwcap & PPC_FEATURE_HAS_SPE) - ppc_usrregs_info.regmap = ppc_regmap_e500; - - /* If the FPSCR is 64-bit wide, we need to fetch the whole - 64-bit slot and not just its second word. The PT_FPSCR - supplied in a 32-bit GDB compilation doesn't reflect - this. */ - if (register_size (tdesc, 70) == 8) - ppc_regmap[70] = (48 + 2*32) * sizeof (long); - - ppc_regmap_adjusted = 1; - } -#endif - current_process ()->tdesc = tdesc; -} /* Correct in either endianness. This instruction is "twge r2, r2", which GDB uses as a software @@ -686,6 +588,103 @@ ppc_regs_info (void) return ®s_info; } +static void +ppc_arch_setup (void) +{ + const struct target_desc *tdesc; +#ifdef __powerpc64__ + long msr; + struct regcache *regcache; + + /* On a 64-bit host, assume 64-bit inferior process with no + AltiVec registers. Reset ppc_hwcap to ensure that the + collect_register call below does not fail. */ + tdesc = tdesc_powerpc_64l; + current_process ()->tdesc = tdesc; + ppc_hwcap = 0; + + regcache = new_register_cache (tdesc); + fetch_inferior_registers (regcache, find_regno (tdesc, "msr")); + collect_register_by_name (regcache, "msr", &msr); + free_register_cache (regcache); + if (ppc64_64bit_inferior_p (msr)) + { + ppc_get_hwcap (&ppc_hwcap); + if (ppc_hwcap & PPC_FEATURE_CELL) + tdesc = tdesc_powerpc_cell64l; + else if (ppc_hwcap & PPC_FEATURE_HAS_VSX) + { + /* Power ISA 2.05 (implemented by Power 6 and newer processors) + increases the FPSCR from 32 bits to 64 bits. Even though Power 7 + supports this ISA version, it doesn't have PPC_FEATURE_ARCH_2_05 + set, only PPC_FEATURE_ARCH_2_06. Since for now the only bits + used in the higher half of the register are for Decimal Floating + Point, we check if that feature is available to decide the size + of the FPSCR. */ + if (ppc_hwcap & PPC_FEATURE_HAS_DFP) + tdesc = tdesc_powerpc_isa205_vsx64l; + else + tdesc = tdesc_powerpc_vsx64l; + } + else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC) + { + if (ppc_hwcap & PPC_FEATURE_HAS_DFP) + tdesc = tdesc_powerpc_isa205_altivec64l; + else + tdesc = tdesc_powerpc_altivec64l; + } + + current_process ()->tdesc = tdesc; + return; + } +#endif + + /* OK, we have a 32-bit inferior. */ + tdesc = tdesc_powerpc_32l; + current_process ()->tdesc = tdesc; + + ppc_get_hwcap (&ppc_hwcap); + if (ppc_hwcap & PPC_FEATURE_CELL) + tdesc = tdesc_powerpc_cell32l; + else if (ppc_hwcap & PPC_FEATURE_HAS_VSX) + { + if (ppc_hwcap & PPC_FEATURE_HAS_DFP) + tdesc = tdesc_powerpc_isa205_vsx32l; + else + tdesc = tdesc_powerpc_vsx32l; + } + else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC) + { + if (ppc_hwcap & PPC_FEATURE_HAS_DFP) + tdesc = tdesc_powerpc_isa205_altivec32l; + else + tdesc = tdesc_powerpc_altivec32l; + } + + /* On 32-bit machines, check for SPE registers. + Set the low target's regmap field as appropriately. */ +#ifndef __powerpc64__ + if (ppc_hwcap & PPC_FEATURE_HAS_SPE) + tdesc = tdesc_powerpc_e500l; + + if (!ppc_regmap_adjusted) + { + if (ppc_hwcap & PPC_FEATURE_HAS_SPE) + ppc_usrregs_info.regmap = ppc_regmap_e500; + + /* If the FPSCR is 64-bit wide, we need to fetch the whole + 64-bit slot and not just its second word. The PT_FPSCR + supplied in a 32-bit GDB compilation doesn't reflect + this. */ + if (register_size (tdesc, 70) == 8) + ppc_regmap[70] = (48 + 2*32) * sizeof (long); + + ppc_regmap_adjusted = 1; + } +#endif + current_process ()->tdesc = tdesc; +} + struct linux_target_ops the_low_target = { ppc_arch_setup, ppc_regs_info,