From patchwork Fri May 5 08:04:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 20291 Received: (qmail 60672 invoked by alias); 5 May 2017 08:04:08 -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 60656 invoked by uid 89); 5 May 2017 08:04:07 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LOTSOFHASH, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: EUR03-DB5-obe.outbound.protection.outlook.com Received: from mail-eopbgr40041.outbound.protection.outlook.com (HELO EUR03-DB5-obe.outbound.protection.outlook.com) (40.107.4.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 05 May 2017 08:04:06 +0000 Received: from AM3PR08MB0101.eurprd08.prod.outlook.com (10.160.211.19) by AM3PR08MB0104.eurprd08.prod.outlook.com (10.160.211.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1061.12; Fri, 5 May 2017 08:04:04 +0000 Received: from AM3PR08MB0101.eurprd08.prod.outlook.com ([fe80::b823:64c1:afc5:3a08]) by AM3PR08MB0101.eurprd08.prod.outlook.com ([fe80::b823:64c1:afc5:3a08%17]) with mapi id 15.01.1061.022; Fri, 5 May 2017 08:04:04 +0000 From: Alan Hayward To: Yao Qi CC: "gdb-patches@sourceware.org" , nd Subject: Re: [PATCH 3/11] Add MIPS_MAX_REGISTER_SIZE (2/4) Date: Fri, 5 May 2017 08:04:04 +0000 Message-ID: <806B436F-EFA1-4200-AC54-9036D166C9B9@arm.com> References: <3C00280E-37C9-4C0A-9DA6-F3B9DB1A6E8F@arm.com> <86y3v7uf9j.fsf@gmail.com> In-Reply-To: <86y3v7uf9j.fsf@gmail.com> authentication-results: gmail.com; dkim=none (message not signed) header.d=none; gmail.com; dmarc=none action=none header.from=arm.com; x-microsoft-exchange-diagnostics: 1; AM3PR08MB0104; 7:NgSsj+HNr6SV3AhISuorymKztz3/vZOLSGQS4pR4mpEDIH2Lp1rreUgqTdi4LHghBM4Y2E5i52GqTrNi6QBMe+QQmHFD2AAHoljdRxCQ8kh2FOApgIpJWlHH9SUdrEeDNYxGthVNuUz9LA7ktC8cSRKU7iPQsyJhvR9gUlBiw5ZWGmXhtaLzqAR02KB2xaHzqBkpu5+rEPcU+CgTUmaZoUaQbX4rd/nJItIx//UnMYU5KnWOLaTtGCocNgf7mhjbHa+3pSTGUxMGEBaY5f2CQUT3YakUolXOPAGaZjHMiobWjVZImyG9+wHYvAeZj7RGGGqySJ3KFErs9lPEd1BrJg== x-ms-office365-filtering-correlation-id: 4e962392-30f8-4c4e-b54c-08d4938d4c4b x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(48565401081)(201703131423075)(201703031133081)(201702281549075); SRVR:AM3PR08MB0104; nodisclaimer: True x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(180628864354917); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(93001095)(6055026)(6041248)(20161123555025)(20161123562025)(20161123560025)(20161123564025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148); SRVR:AM3PR08MB0104; BCL:0; PCL:0; RULEID:; SRVR:AM3PR08MB0104; x-forefront-prvs: 02981BE340 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(39850400002)(39840400002)(39400400002)(39860400002)(39450400003)(39410400002)(377424004)(24454002)(82746002)(478600001)(66066001)(2900100001)(54906002)(36756003)(8676002)(50986999)(81166006)(8936002)(99286003)(54356999)(76176999)(53936002)(6512007)(6506006)(6436002)(6486002)(3846002)(5250100002)(102836003)(6116002)(33656002)(53546009)(39060400002)(83716003)(6246003)(38730400002)(110136004)(4326008)(1411001)(3660700001)(3280700002)(7736002)(86362001)(575784001)(2906002)(189998001)(305945005)(2950100002)(6916009)(229853002)(5660300001)(25786009); DIR:OUT; SFP:1101; SCL:1; SRVR:AM3PR08MB0104; H:AM3PR08MB0101.eurprd08.prod.outlook.com; FPR:; SPF:None; MLV:ovrnspm; PTR:InfoNoRecords; LANG:en; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-ID: <3191C07F19BAEE46BBBDA6A1928E69ED@eurprd08.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-originalarrivaltime: 05 May 2017 08:04:04.4083 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR08MB0104 > On 11 Apr 2017, at 16:37, Yao Qi wrote: > > Alan Hayward writes: > > Hi Alan, > There are different ways of getting rid of MAX_REGISTER_SIZE, let us try > some simple approaches first. Some uses of MAX_REGISTER_SIZE still > can't be removed, but let us start from easy part. > Patch split into multiple parts. This part adds two new regcache functions: raw_supply_signed and raw_collect_signed. Tested on a --enable-targets=all build using make check with board files unix and native-gdbserver. I do not have a MIPS machine to test on. Ok to commit? 2017-05-05 Alan Hayward * mips-fbsd-tdep.c (mips_fbsd_supply_reg): Use raw_supply_signed. (mips_fbsd_collect_reg): Use raw_collect_signed. * mips-linux-tdep.c (supply_32bit_reg): Use raw_supply_signed. (mips64_fill_gregset): Use raw_collect_signed. (mips64_fill_fpregset): Use raw_supply_signed. * regcache.c (regcache::raw_supply_signed): New function. (regcache::raw_collect_signed): New function. * regcache.h (regcache::raw_supply_signed): New declaration. (regcache::raw_collect_signed): New declaration. Last login: Fri May 5 08:55:03 on ttys000 alahay01@C02N40NHFH04:~ [08:56:55] $ cat Downloads/rb7439.patch diff --git a/gdb/mips-fbsd-tdep.c b/gdb/mips-fbsd-tdep.c index 00fae0ec60ddc9e645d3236efe29f2f9e9ceab5c..4785bf9a115fa74fb7f48eac388a7e3df2f0304d 100644 --- a/gdb/mips-fbsd-tdep.c +++ b/gdb/mips-fbsd-tdep.c @@ -63,13 +63,10 @@ mips_fbsd_supply_reg (struct regcache *regcache, int regnum, const void *addr, else { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - gdb_byte buf[MAX_REGISTER_SIZE]; LONGEST val; val = extract_signed_integer ((const gdb_byte *) addr, len, byte_order); - store_signed_integer (buf, register_size (gdbarch, regnum), byte_order, - val); - regcache_raw_supply (regcache, regnum, buf); + regcache->raw_supply_signed (regnum, val); } } @@ -90,12 +87,7 @@ mips_fbsd_collect_reg (const struct regcache *regcache, int regnum, void *addr, else { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - regcache_raw_collect (regcache, regnum, buf); - val = extract_signed_integer (buf, register_size (gdbarch, regnum), - byte_order); + LONGEST val = regcache->raw_collect_signed (regnum); store_signed_integer ((gdb_byte *) addr, len, byte_order, val); } } diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c index 48a582a16c934abe6e8f87c46a6009649c606d49..5325d75420a71451b63cbadbf4e33d4fcf233fa4 100644 --- a/gdb/mips-linux-tdep.c +++ b/gdb/mips-linux-tdep.c @@ -118,11 +118,10 @@ supply_32bit_reg (struct regcache *regcache, int regnum, const void *addr) { struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - gdb_byte buf[MAX_REGISTER_SIZE]; - store_signed_integer (buf, register_size (gdbarch, regnum), byte_order, - extract_signed_integer ((const gdb_byte *) addr, 4, - byte_order)); - regcache_raw_supply (regcache, regnum, buf); + LONGEST val; + + val = extract_signed_integer ((const gdb_byte *) addr, 4, byte_order); + regcache->raw_supply_signed (regnum, val); } /* Unpack an elf_gregset_t into GDB's register cache. */ @@ -460,12 +459,7 @@ mips64_fill_gregset (const struct regcache *regcache, if (regaddr != -1) { - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - regcache_raw_collect (regcache, regno, buf); - val = extract_signed_integer (buf, register_size (gdbarch, regno), - byte_order); + LONGEST val = regcache->raw_collect_signed (regno); dst = regp + regaddr; store_signed_integer ((gdb_byte *) dst, 8, byte_order, val); } @@ -564,23 +558,13 @@ mips64_fill_fpregset (const struct regcache *regcache, } else if (regno == mips_regnum (gdbarch)->fp_control_status) { - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - regcache_raw_collect (regcache, regno, buf); - val = extract_signed_integer (buf, register_size (gdbarch, regno), - byte_order); + LONGEST val = regcache->raw_collect_signed (regno); to = (gdb_byte *) (*fpregsetp + 32); store_signed_integer (to, 4, byte_order, val); } else if (regno == mips_regnum (gdbarch)->fp_implementation_revision) { - gdb_byte buf[MAX_REGISTER_SIZE]; - LONGEST val; - - regcache_raw_collect (regcache, regno, buf); - val = extract_signed_integer (buf, register_size (gdbarch, regno), - byte_order); + LONGEST val = regcache->raw_collect_signed (regno); to = (gdb_byte *) (*fpregsetp + 32) + 4; store_signed_integer (to, 4, byte_order, val); } diff --git a/gdb/regcache.h b/gdb/regcache.h index 4dcfccbac70f0f962bf5e5596d035fda42322795..76f5bdfdf6cefd6d963be950aefcc275de7a820b 100644 --- a/gdb/regcache.h +++ b/gdb/regcache.h @@ -294,10 +294,14 @@ public: void raw_collect (int regnum, void *buf) const; + LONGEST raw_collect_signed (int regnum) const; + void raw_supply (int regnum, const void *buf); void raw_supply_zeroed (int regnum); + void raw_supply_signed (int regnum, LONGEST val); + void raw_copy (int regnum, struct regcache *src_regcache); enum register_status get_register_status (int regnum) const; diff --git a/gdb/regcache.c b/gdb/regcache.c index 957b265c28d929376c3b7d8c100ea355d8292b94..c9fbc997a3fa33fb576db7f57da4501043ff4e9d 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -1228,6 +1228,26 @@ regcache::raw_supply_zeroed (int regnum) m_register_status[regnum] = REG_VALID; } +/* Supply register REGNUM, whose contents are stored in signed VAL, to + REGCACHE. */ + +void +regcache::raw_supply_signed (int regnum, LONGEST val) +{ + enum bfd_endian byte_order = gdbarch_byte_order (m_descr->gdbarch); + gdb_byte *regbuf; + size_t size; + + gdb_assert (regnum >= 0 && regnum < m_descr->nr_raw_registers); + gdb_assert (!m_readonly_p); + + regbuf = register_buffer (regnum); + size = m_descr->sizeof_register[regnum]; + + store_signed_integer (regbuf, size, byte_order, val); + m_register_status[regnum] = REG_VALID; +} + /* Collect register REGNUM from REGCACHE and store its contents in BUF. */ void @@ -1251,6 +1271,23 @@ regcache::raw_collect (int regnum, void *buf) const memcpy (buf, regbuf, size); } +/* Collect register REGNUM from REGCACHE and extract its contents into a signed + LONGEST. */ + +LONGEST +regcache::raw_collect_signed (int regnum) const +{ + enum bfd_endian byte_order = gdbarch_byte_order (m_descr->gdbarch); + const gdb_byte *regbuf; + size_t size; + + gdb_assert (regnum >= 0 && regnum < m_descr->nr_raw_registers); + + regbuf = register_buffer (regnum); + size = m_descr->sizeof_register[regnum]; + return extract_signed_integer (regbuf, size, byte_order); +} + void regcache::raw_copy (int regnum, struct regcache *src_regcache) {