From patchwork Wed Jun 7 08:27:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 20818 Received: (qmail 100775 invoked by alias); 7 Jun 2017 08:27:48 -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 100742 invoked by uid 89); 7 Jun 2017 08:27:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, MIME_BASE64_BLANKS, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=H*RU:15.01.1157.012, 16398, H*r:15.01.1157.012, Hx-spam-relays-external:15.01.1157.012 X-HELO: EUR01-VE1-obe.outbound.protection.outlook.com Received: from mail-ve1eur01on0071.outbound.protection.outlook.com (HELO EUR01-VE1-obe.outbound.protection.outlook.com) (104.47.1.71) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 07 Jun 2017 08:27:44 +0000 Received: from AM3PR08MB0101.eurprd08.prod.outlook.com (10.160.211.19) by AM3PR08MB0102.eurprd08.prod.outlook.com (10.160.211.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1157.12; Wed, 7 Jun 2017 08:27:44 +0000 Received: from AM3PR08MB0101.eurprd08.prod.outlook.com ([fe80::f0a8:fd0f:69e1:e280]) by AM3PR08MB0101.eurprd08.prod.outlook.com ([fe80::f0a8:fd0f:69e1:e280%17]) with mapi id 15.01.1157.012; Wed, 7 Jun 2017 08:27:44 +0000 From: Alan Hayward To: Yao Qi CC: "gdb-patches@sourceware.org" , nd Subject: Re: [PATCH 11/11] Add SH_MAX_REGISTER_SIZE and SH64_MAX_REGISTER_SIZE Date: Wed, 7 Jun 2017 08:27:44 +0000 Message-ID: <399A28D6-56DA-47DA-9030-EAA143B38175@arm.com> References: <8637dfw5kl.fsf@gmail.com> <45FE08DA-87EC-48FB-97EC-8463A473126F@arm.com> <44AA3E84-BCF8-4A36-ADF5-83C0DE7771BE@arm.com> <86poeh192v.fsf@gmail.com> In-Reply-To: <86poeh192v.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-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; AM3PR08MB0102; 7:LHujTNYXIW/YD+eyaEVaNMa5EcByHNZ2Cls2ywcpa6cTHZhc0oszR7cXHA0oCia4vhflrUQwsh2AaHB8yZhoxaxbG6QG00WvbACMX2w3iPOMzRLs1fmklVMmQlIfQ6ZTSgWqEWLmnUu156nihRxvQbS0tq9Sh9crrV/kd11LZ++ZAfhT2upMa8u1ZrCNstVHbTmLW+M8M/c+RcU0l0yshDTFAGnKXOU2dqEoYKGRBIbXR0C9WWeScJwy3T4Es6GEqRT3N1yIeJyb7IdC1MAbU7teXf1FGFKm010/PYolhMHMuY2sgGKB3q6EM33Amj2NVay+H/IX8b/aSVk+0bHESA== x-ms-traffictypediagnostic: AM3PR08MB0102: x-ms-office365-filtering-correlation-id: ed71fc11-ec2c-4470-b465-08d4ad7f1234 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(48565401081)(201703131423075)(201703031133081)(201702281549075); SRVR:AM3PR08MB0102; nodisclaimer: True x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(180628864354917)(788757137089); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(10201501046)(100000703101)(100105400095)(6055026)(6041248)(201703131423075)(201703011903075)(201702281528075)(201703061421075)(20161123558100)(20161123564025)(20161123555025)(20161123560025)(20161123562025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:AM3PR08MB0102; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:AM3PR08MB0102; x-forefront-prvs: 03319F6FEF x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(39850400002)(39840400002)(39400400002)(39860400002)(39450400003)(39410400002)(24454002)(377424004)(7736002)(54356999)(4326008)(508600001)(72206003)(6246003)(6916009)(305945005)(6486002)(39060400002)(6506006)(53546009)(3280700002)(25786009)(229853002)(3660700001)(76176999)(6436002)(99286003)(36756003)(54906002)(6512007)(38730400002)(189998001)(110136004)(2950100002)(81166006)(93886004)(50986999)(53936002)(8936002)(2900100001)(66066001)(6116002)(1411001)(102836003)(3846002)(106356001)(33656002)(8676002)(2906002)(5250100002)(5660300001)(83716003)(82746002)(86362001)(14454004)(15760500002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM3PR08MB0102; H:AM3PR08MB0101.eurprd08.prod.outlook.com; FPR:; SPF:None; MLV:ovrnspm; PTR:InfoNoRecords; LANG:en; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-ID: <2DD6896A9C1D3642B8B9F2455FF36B95@eurprd08.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-originalarrivaltime: 07 Jun 2017 08:27:44.2415 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR08MB0102 > On 6 Jun 2017, at 15:31, Yao Qi wrote: > > Alan Hayward writes: > >> @@ -1528,7 +1531,7 @@ sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, >> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); >> int base_regnum; >> int offset = 0; >> - gdb_byte temp_buffer[MAX_REGISTER_SIZE]; >> + gdb_byte temp_buffer[SH64_MAX_REGISTER_SIZE]; >> enum register_status status; >> >> if (reg_nr >= DR0_REGNUM >> @@ -1704,7 +1707,7 @@ sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, >> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); >> int base_regnum, portion; >> int offset; >> - gdb_byte temp_buffer[MAX_REGISTER_SIZE]; >> + gdb_byte temp_buffer[SH64_MAX_REGISTER_SIZE]; > > Could you define temp_buffer in each block where it is used? The size > of register is known at each place. In some places, we don't need to > use temp_buffer, instead, we can use regcache_raw_read_unsigned to > replace regcache_raw_read+extract_unsigned_integer. Then, we don't need > SH64_MAX_REGISTER_SIZE at all. > > -- > Yao (齐尧) That makes sense. I originally avoided it because it resulted in lots of temp_buffers. Updated below. I don't have a SH machine to test on. Tested on a --enable-targets=all and asan build using make check with board files unix, native-gdbserver and unittest Ok to commit? Alan. 2017-06-07 Alan Hayward * gdb/sh-tdep.c (sh_pseudo_register_read): Remove MAX_REGISTER_SIZE. (sh_pseudo_register_write): Likewise. * gdb/sh64-tdep.c (sh64_pseudo_register_read): Remove MAX_REGISTER_SIZE. (sh64_pseudo_register_write): Likewise diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c index 2c2b26847d58808ef912ed4969bc28c799ad9bbd..a87547d4ceda1b6db4157d181ae1b982444a867c 100644 --- a/gdb/sh-tdep.c +++ b/gdb/sh-tdep.c @@ -1648,13 +1648,14 @@ sh_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int reg_nr, gdb_byte *buffer) { int base_regnum; - gdb_byte temp_buffer[MAX_REGISTER_SIZE]; enum register_status status; if (reg_nr == PSEUDO_BANK_REGNUM) return regcache_raw_read (regcache, BANK_REGNUM, buffer); else if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) { + /* Enough space for two float registers. */ + gdb_byte temp_buffer[4 * 2]; base_regnum = dr_reg_base_num (gdbarch, reg_nr); /* Build the value in the provided buffer. */ @@ -1687,7 +1688,6 @@ sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, int reg_nr, const gdb_byte *buffer) { int base_regnum, portion; - gdb_byte temp_buffer[MAX_REGISTER_SIZE]; if (reg_nr == PSEUDO_BANK_REGNUM) { @@ -1703,6 +1703,8 @@ sh_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, } else if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) { + /* Enough space for two float registers. */ + gdb_byte temp_buffer[4 * 2]; base_regnum = dr_reg_base_num (gdbarch, reg_nr); /* We must pay attention to the endiannes. */ diff --git a/gdb/sh64-tdep.c b/gdb/sh64-tdep.c index 06ae04e9da1eff6e2b9e3e977e4f52fa398f69f2..4eb8947f74a5d3a5be33ca68e34194d6ac9f983c 100644 --- a/gdb/sh64-tdep.c +++ b/gdb/sh64-tdep.c @@ -1528,12 +1528,12 @@ sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int base_regnum; int offset = 0; - gdb_byte temp_buffer[MAX_REGISTER_SIZE]; enum register_status status; if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) { + gdb_byte temp_buffer[8]; base_regnum = sh64_dr_reg_base_num (gdbarch, reg_nr); /* Build the value in the provided buffer. */ @@ -1580,6 +1580,7 @@ sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, else if (reg_nr >= R0_C_REGNUM && reg_nr <= T_C_REGNUM) { + gdb_byte temp_buffer[8]; base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr); /* Build the value in the provided buffer. */ @@ -1607,6 +1608,7 @@ sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, else if (reg_nr >= DR0_C_REGNUM && reg_nr <= DR_LAST_C_REGNUM) { + gdb_byte temp_buffer[8]; base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr); /* DR_C regs are double precision registers obtained by @@ -1639,8 +1641,8 @@ sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, { int fpscr_base_regnum; int sr_base_regnum; - unsigned int fpscr_value; - unsigned int sr_value; + ULONGEST fpscr_value; + ULONGEST sr_value; unsigned int fpscr_c_value; unsigned int fpscr_c_part1_value; unsigned int fpscr_c_part2_value; @@ -1662,18 +1664,14 @@ sh64_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, 21-31 reserved */ /* *INDENT-ON* */ - /* Get FPSCR into a local buffer. */ - status = regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer); + /* Get FPSCR as an int. */ + status = regcache->raw_read_unsigned (fpscr_base_regnum, &fpscr_value); if (status != REG_VALID) return status; - /* Get value as an int. */ - fpscr_value = extract_unsigned_integer (temp_buffer, 4, byte_order); - /* Get SR into a local buffer */ - status = regcache_raw_read (regcache, sr_base_regnum, temp_buffer); + /* Get SR as an int. */ + status = regcache->raw_read_unsigned (sr_base_regnum, &sr_value); if (status != REG_VALID) return status; - /* Get value as an int. */ - sr_value = extract_unsigned_integer (temp_buffer, 4, byte_order); /* Build the new value. */ fpscr_c_part1_value = fpscr_value & 0x3fffd; fpscr_c_part2_value = (sr_value & 0x7000) << 6; @@ -1704,11 +1702,11 @@ sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int base_regnum, portion; int offset; - gdb_byte temp_buffer[MAX_REGISTER_SIZE]; if (reg_nr >= DR0_REGNUM && reg_nr <= DR_LAST_REGNUM) { + gdb_byte temp_buffer[8]; base_regnum = sh64_dr_reg_base_num (gdbarch, reg_nr); /* We must pay attention to the endianness. */ sh64_register_convert_to_raw (gdbarch, register_type (gdbarch, reg_nr), @@ -1752,6 +1750,7 @@ sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, else if (reg_nr >= R0_C_REGNUM && reg_nr <= T_C_REGNUM) { + gdb_byte temp_buffer[8]; base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr); /* reg_nr is 32 bit here, and base_regnum is 64 bits. */ if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) @@ -1779,6 +1778,7 @@ sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, else if (reg_nr >= DR0_C_REGNUM && reg_nr <= DR_LAST_C_REGNUM) { + gdb_byte temp_buffer[8]; base_regnum = sh64_compact_reg_base_num (gdbarch, reg_nr); for (portion = 0; portion < 2; portion++) { @@ -1813,10 +1813,10 @@ sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, { int fpscr_base_regnum; int sr_base_regnum; - unsigned int fpscr_value; - unsigned int sr_value; - unsigned int old_fpscr_value; - unsigned int old_sr_value; + ULONGEST fpscr_value; + ULONGEST sr_value; + ULONGEST old_fpscr_value; + ULONGEST old_sr_value; unsigned int fpscr_c_value; unsigned int fpscr_mask; unsigned int sr_mask; @@ -1847,19 +1847,15 @@ sh64_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, fpscr_value = fpscr_c_value & fpscr_mask; sr_value = (fpscr_value & sr_mask) >> 6; - regcache_raw_read (regcache, fpscr_base_regnum, temp_buffer); - old_fpscr_value = extract_unsigned_integer (temp_buffer, 4, byte_order); + regcache->raw_read_unsigned (fpscr_base_regnum, &old_fpscr_value); old_fpscr_value &= 0xfffc0002; fpscr_value |= old_fpscr_value; - store_unsigned_integer (temp_buffer, 4, byte_order, fpscr_value); - regcache_raw_write (regcache, fpscr_base_regnum, temp_buffer); - - regcache_raw_read (regcache, sr_base_regnum, temp_buffer); - old_sr_value = extract_unsigned_integer (temp_buffer, 4, byte_order); + regcache->raw_write_unsigned (fpscr_base_regnum, fpscr_value); + + regcache->raw_read_unsigned (sr_base_regnum, &old_sr_value); old_sr_value &= 0xffff8fff; sr_value |= old_sr_value; - store_unsigned_integer (temp_buffer, 4, byte_order, sr_value); - regcache_raw_write (regcache, sr_base_regnum, temp_buffer); + regcache->raw_write_unsigned (sr_base_regnum, sr_value); } else if (reg_nr == FPUL_C_REGNUM)