From patchwork Tue Apr 11 12:47:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 19951 Received: (qmail 84196 invoked by alias); 11 Apr 2017 12:47:16 -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 84178 invoked by uid 89); 11 Apr 2017 12:47:15 -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, MIME_BASE64_BLANKS, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=sol, sof, 15167 X-HELO: EUR02-VE1-obe.outbound.protection.outlook.com Received: from mail-eopbgr20042.outbound.protection.outlook.com (HELO EUR02-VE1-obe.outbound.protection.outlook.com) (40.107.2.42) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 11 Apr 2017 12:47:13 +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.1019.17; Tue, 11 Apr 2017 12:47:09 +0000 Received: from AM3PR08MB0101.eurprd08.prod.outlook.com ([fe80::c065:778f:9924:8660]) by AM3PR08MB0101.eurprd08.prod.outlook.com ([fe80::c065:778f:9924:8660%14]) with mapi id 15.01.1019.025; Tue, 11 Apr 2017 12:47:08 +0000 From: Alan Hayward To: Yao Qi CC: "gdb-patches@sourceware.org" , nd Subject: Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE Date: Tue, 11 Apr 2017 12:47:08 +0000 Message-ID: <90F5717F-8685-4C74-B2E4-7317AF228034@arm.com> References: <8637dnqils.fsf@gmail.com> In-Reply-To: <8637dnqils.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-exchange-messagesentrepresentingtype: 1 x-microsoft-exchange-diagnostics: 1; AM3PR08MB0104; 7:phx7bP3CGyMftneDUNdLkQib6roRqZ0ziVkHX4T/+eDDYbQMx65+wXHJ+Su9eLk6gbFJeHOdjkaFxWRNv3im/YeCSsRViq0VtuhOrsg1ofSGSn93B/B+tWpibDBBGELucrQLeHt47uinbosZ0fkJhTC1Wr80kCpoJr0oFHqYP5Vc3iSXEkSwZT/Gu9kNusE3zn4OjYfbeX38o0/CycwoIer/erOS8N5fVT398kYYA5SmrbK1sdJBboQGHJ9OtexMyrT0wOgCsCMR9i8fxGw1Y7ocCHDNi61mC+upqzmJVdqW0tyeBFTG9oHRq5i4bsQyqI2zAtz1PunFjFRUMuBWHQ== x-ms-office365-filtering-correlation-id: 3469d99f-ed56-4a54-6af3-08d480d8ddd1 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)(788757137089); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3002001)(6055026)(6041248)(20161123562025)(20161123560025)(20161123555025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(6072148); SRVR:AM3PR08MB0104; BCL:0; PCL:0; RULEID:; SRVR:AM3PR08MB0104; x-forefront-prvs: 0274272F87 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(39840400002)(39400400002)(39850400002)(39450400003)(39860400002)(39410400002)(24454002)(377424004)(2950100002)(6916009)(305945005)(189998001)(39060400002)(54906002)(6512007)(53936002)(575784001)(86362001)(3280700002)(6246003)(110136004)(6486002)(38730400002)(99286003)(6116002)(6506006)(5660300001)(6436002)(3660700001)(3846002)(102836003)(229853002)(33656002)(4326008)(97736004)(2906002)(2900100001)(36756003)(8676002)(7736002)(81166006)(8936002)(1411001)(5250100002)(82746002)(66066001)(25786009)(76176999)(50986999)(53546009)(83716003)(54356999)(15760500002); 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: <56E1B3D6084BA1419E29FA45BEF71094@eurprd08.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Apr 2017 12:47:08.4609 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR08MB0104 > On 5 Apr 2017, at 11:00, Yao Qi wrote: > > Alan Hayward writes: > > Hi Alan, > We have to define such macro if we have no other ways to remove > MAX_REGISTER_SIZE. AFAIK, there are some ways to remove many usages of > MAX_REGISTER_SIZE. > >> @@ -1516,7 +1516,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, >> else if (qp == 0 && rN == 2 >> && ((rM == fp_reg && fp_reg != 0) || rM == 12)) >> { >> - gdb_byte buf[MAX_REGISTER_SIZE]; >> + gdb_byte buf[IA64_MAX_REGISTER_SIZE]; >> CORE_ADDR saved_sp = 0; >> /* adds r2, spilloffset, rFramePointer >> or > > "buf" is used in the code below, > > get_frame_register (this_frame, sp_regnum, buf); > saved_sp = extract_unsigned_integer (buf, 8, byte_order); > > why don't we use get_frame_register_unsigned, so the "buf" can be > removed completely. > > saved_sp = get_frame_register_unsigned (this_frame, sp_regnum); > >> @@ -2289,7 +2289,7 @@ static struct value * >> ia64_sigtramp_frame_prev_register (struct frame_info *this_frame, >> void **this_cache, int regnum) >> { >> - gdb_byte buf[MAX_REGISTER_SIZE]; >> + gdb_byte buf[IA64_MAX_REGISTER_SIZE]; >> > > "buf" is used in the code below, > > read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM)); > pc = extract_unsigned_integer (buf, 8, byte_order); > > so it is for IP register. Its size is 8-byte, so we can move "buf" > here, > > gdb_byte buf[8]; > > read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM)); > pc = extract_unsigned_integer (buf, sizeof (buf), byte_order); > > >> struct gdbarch *gdbarch = get_frame_arch (this_frame); >> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); >> @@ -2495,7 +2495,7 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val, >> struct gdbarch *gdbarch = get_frame_arch (this_frame); >> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); >> long new_sof, old_sof; >> - gdb_byte buf[MAX_REGISTER_SIZE]; >> + gdb_byte buf[IA64_MAX_REGISTER_SIZE]; >> > > Use get_frame_register_{,un}signed, so we can remove "buf" completely. > >> /* We never call any libunwind routines that need to write registers. */ >> gdb_assert (!write); >> @@ -2575,7 +2575,7 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, >> struct gdbarch *gdbarch = get_regcache_arch (regcache); >> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); >> long new_sof, old_sof; >> - gdb_byte buf[MAX_REGISTER_SIZE]; >> + gdb_byte buf[IA64_MAX_REGISTER_SIZE]; >> > > "buf" is used > > regcache_cooked_read (regcache, IA64_IP_REGNUM, buf); > ip = extract_unsigned_integer (buf, 8, byte_order); > > so we can use regcache_cooked_read_unsigned, > > regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip); > >> /* We never call any libunwind routines that need to write registers. */ >> gdb_assert (!write); >> @@ -2982,7 +2982,7 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame, >> { >> int rrb_pr = 0; >> ULONGEST cfm; >> - gdb_byte buf[MAX_REGISTER_SIZE]; >> + gdb_byte buf[IA64_MAX_REGISTER_SIZE]; >> > > Use get_frame_register_unsigned. > >> /* Fetch predicate register rename base from current frame >> marker for this frame. */ > > The only leftover of MAX_REGISTER_SIZE is about floating type > conversion, in ia64_register_to_value, ia64_push_dummy_call, etc. Then, > we can define an macro for the size of floating types, and replace > MAX_REGISTER_SIZE with it. > > -- > Yao (齐尧) Patch updated to match all the changes suggested above. Tested on a --enable-targets=all build using make check with board files unix and native-gdbserver. I do not have an IA64 machine to test on. If there is any doubt of the validity of the changes then I'd suggest applying the previous version of the patch (which just replaced a define). Ok to commit? Alan. 2017-04-11 Alan Hayward * ia64-tdep.c (IA64_MAX_FP_REGISTER_SIZE) Add. (ia64_register_to_value): Use IA64_MAX_FP_REGISTER_SIZE. (ia64_value_to_register): Likewise. (examine_prologue): Use get_frame_register_unsigned. (ia64_sigtramp_frame_prev_register): Likewise. (ia64_access_reg): Likewise. (ia64_access_rse_reg): Likewise. (ia64_libunwind_frame_prev_register): Likewise. (ia64_extract_return_value): Use IA64_MAX_FP_REGISTER_SIZE. (ia64_store_return_value): Likewise. (ia64_push_dummy_call): Likewise. diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c index 22e158866bbbf0d9457737ac973027521e2c1655..a0d33fea63dc0738bed2f73ba893d61bac770242 100644 --- a/gdb/ia64-tdep.c +++ b/gdb/ia64-tdep.c @@ -125,6 +125,9 @@ static CORE_ADDR ia64_find_global_pointer (struct gdbarch *gdbarch, #define NUM_IA64_RAW_REGS 462 +/* Big enough to hold the size of the largest FP register in bytes. */ +#define IA64_MAX_FP_REGISTER_SIZE 16 + static int sp_regnum = IA64_GR12_REGNUM; /* NOTE: we treat the register stack registers r32-r127 as @@ -1227,7 +1230,7 @@ ia64_register_to_value (struct frame_info *frame, int regnum, int *optimizedp, int *unavailablep) { struct gdbarch *gdbarch = get_frame_arch (frame); - gdb_byte in[MAX_REGISTER_SIZE]; + gdb_byte in[IA64_MAX_FP_REGISTER_SIZE]; /* Convert to TYPE. */ if (!get_frame_register_bytes (frame, regnum, 0, @@ -1245,7 +1248,7 @@ ia64_value_to_register (struct frame_info *frame, int regnum, struct type *valtype, const gdb_byte *in) { struct gdbarch *gdbarch = get_frame_arch (frame); - gdb_byte out[MAX_REGISTER_SIZE]; + gdb_byte out[IA64_MAX_FP_REGISTER_SIZE]; convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch)); put_frame_register (frame, regnum, out); } @@ -1516,8 +1519,7 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, else if (qp == 0 && rN == 2 && ((rM == fp_reg && fp_reg != 0) || rM == 12)) { - gdb_byte buf[MAX_REGISTER_SIZE]; - CORE_ADDR saved_sp = 0; + ULONGEST saved_sp = 0; /* adds r2, spilloffset, rFramePointer or adds r2, spilloffset, r12 @@ -1533,9 +1535,8 @@ examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, if (this_frame) { struct gdbarch *gdbarch = get_frame_arch (this_frame); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - get_frame_register (this_frame, sp_regnum, buf); - saved_sp = extract_unsigned_integer (buf, 8, byte_order); + saved_sp = get_frame_register_unsigned (this_frame, + sp_regnum); } spill_addr = saved_sp + (rM == 12 ? 0 : mem_stack_frame_size) @@ -2289,10 +2290,6 @@ static struct value * ia64_sigtramp_frame_prev_register (struct frame_info *this_frame, void **this_cache, int regnum) { - gdb_byte buf[MAX_REGISTER_SIZE]; - - struct gdbarch *gdbarch = get_frame_arch (this_frame); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); struct ia64_frame_cache *cache = ia64_sigtramp_frame_cache (this_frame, this_cache); @@ -2308,8 +2305,11 @@ ia64_sigtramp_frame_prev_register (struct frame_info *this_frame, if (addr != 0) { - read_memory (addr, buf, register_size (gdbarch, IA64_IP_REGNUM)); - pc = extract_unsigned_integer (buf, 8, byte_order); + gdb_byte buf[8]; + struct gdbarch *gdbarch = get_frame_arch (this_frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + read_memory (addr, buf, sizeof (buf)); + pc = extract_unsigned_integer (buf, sizeof (buf), byte_order); } pc &= ~0xf; return frame_unwind_got_constant (this_frame, regnum, pc); @@ -2490,12 +2490,11 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val, int write, void *arg) { int regnum = ia64_uw2gdb_regnum (uw_regnum); - unw_word_t bsp, sof, sol, cfm, psr, ip; + ULONGEST bsp, sof, cfm, psr, ip; struct frame_info *this_frame = (struct frame_info *) arg; struct gdbarch *gdbarch = get_frame_arch (this_frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); long new_sof, old_sof; - gdb_byte buf[MAX_REGISTER_SIZE]; /* We never call any libunwind routines that need to write registers. */ gdb_assert (!write); @@ -2505,10 +2504,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val, case UNW_REG_IP: /* Libunwind expects to see the pc value which means the slot number from the psr must be merged with the ip word address. */ - get_frame_register (this_frame, IA64_IP_REGNUM, buf); - ip = extract_unsigned_integer (buf, 8, byte_order); - get_frame_register (this_frame, IA64_PSR_REGNUM, buf); - psr = extract_unsigned_integer (buf, 8, byte_order); + ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM); + psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM); *val = ip | ((psr >> 41) & 0x3); break; @@ -2517,10 +2514,8 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val, register frame so we must account for the fact that ptrace() will return a value for bsp that points *after* the current register frame. */ - get_frame_register (this_frame, IA64_BSP_REGNUM, buf); - bsp = extract_unsigned_integer (buf, 8, byte_order); - get_frame_register (this_frame, IA64_CFM_REGNUM, buf); - cfm = extract_unsigned_integer (buf, 8, byte_order); + bsp = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM); + cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM); sof = gdbarch_tdep (gdbarch)->size_of_register_frame (this_frame, cfm); *val = ia64_rse_skip_regs (bsp, -sof); break; @@ -2528,14 +2523,12 @@ ia64_access_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val, case UNW_IA64_AR_BSPSTORE: /* Libunwind wants bspstore to be after the current register frame. This is what ptrace() and gdb treats as the regular bsp value. */ - get_frame_register (this_frame, IA64_BSP_REGNUM, buf); - *val = extract_unsigned_integer (buf, 8, byte_order); + *val = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM); break; default: /* For all other registers, just unwind the value directly. */ - get_frame_register (this_frame, regnum, buf); - *val = extract_unsigned_integer (buf, 8, byte_order); + *val = get_frame_register_unsigned (this_frame, regnum); break; } @@ -2570,12 +2563,11 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, unw_word_t *val, int write, void *arg) { int regnum = ia64_uw2gdb_regnum (uw_regnum); - unw_word_t bsp, sof, sol, cfm, psr, ip; + ULONGEST bsp, sof, cfm, psr, ip; struct regcache *regcache = (struct regcache *) arg; struct gdbarch *gdbarch = get_regcache_arch (regcache); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); long new_sof, old_sof; - gdb_byte buf[MAX_REGISTER_SIZE]; /* We never call any libunwind routines that need to write registers. */ gdb_assert (!write); @@ -2585,10 +2577,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, case UNW_REG_IP: /* Libunwind expects to see the pc value which means the slot number from the psr must be merged with the ip word address. */ - regcache_cooked_read (regcache, IA64_IP_REGNUM, buf); - ip = extract_unsigned_integer (buf, 8, byte_order); - regcache_cooked_read (regcache, IA64_PSR_REGNUM, buf); - psr = extract_unsigned_integer (buf, 8, byte_order); + ip = get_frame_register_unsigned (this_frame, IA64_IP_REGNUM); + psr = get_frame_register_unsigned (this_frame, IA64_PSR_REGNUM); *val = ip | ((psr >> 41) & 0x3); break; @@ -2597,10 +2587,8 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, register frame so we must account for the fact that ptrace() will return a value for bsp that points *after* the current register frame. */ - regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf); - bsp = extract_unsigned_integer (buf, 8, byte_order); - regcache_cooked_read (regcache, IA64_CFM_REGNUM, buf); - cfm = extract_unsigned_integer (buf, 8, byte_order); + bsp = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM); + cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM); sof = (cfm & 0x7f); *val = ia64_rse_skip_regs (bsp, -sof); break; @@ -2608,14 +2596,12 @@ ia64_access_rse_reg (unw_addr_space_t as, unw_regnum_t uw_regnum, case UNW_IA64_AR_BSPSTORE: /* Libunwind wants bspstore to be after the current register frame. This is what ptrace() and gdb treats as the regular bsp value. */ - regcache_cooked_read (regcache, IA64_BSP_REGNUM, buf); - *val = extract_unsigned_integer (buf, 8, byte_order); + *val = get_frame_register_unsigned (this_frame, IA64_BSP_REGNUM); break; default: /* For all other registers, just unwind the value directly. */ - regcache_cooked_read (regcache, regnum, buf); - *val = extract_unsigned_integer (buf, 8, byte_order); + *val = get_frame_register_unsigned (this_frame, regnum); break; } @@ -2982,12 +2968,10 @@ ia64_libunwind_frame_prev_register (struct frame_info *this_frame, { int rrb_pr = 0; ULONGEST cfm; - gdb_byte buf[MAX_REGISTER_SIZE]; /* Fetch predicate register rename base from current frame marker for this frame. */ - get_frame_register (this_frame, IA64_CFM_REGNUM, buf); - cfm = extract_unsigned_integer (buf, 8, byte_order); + cfm = get_frame_register_unsigned (this_frame, IA64_CFM_REGNUM); rrb_pr = (cfm >> 32) & 0x3f; /* Adjust the register number to account for register rotation. */ @@ -3229,7 +3213,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache, float_elt_type = is_float_or_hfa_type (type); if (float_elt_type != NULL) { - gdb_byte from[MAX_REGISTER_SIZE]; + gdb_byte from[IA64_MAX_FP_REGISTER_SIZE]; int offset = 0; int regnum = IA64_FR8_REGNUM; int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type); @@ -3294,7 +3278,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache, float_elt_type = is_float_or_hfa_type (type); if (float_elt_type != NULL) { - gdb_byte to[MAX_REGISTER_SIZE]; + gdb_byte to[IA64_MAX_FP_REGISTER_SIZE]; int offset = 0; int regnum = IA64_FR8_REGNUM; int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type); @@ -3856,7 +3840,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, len = TYPE_LENGTH (type); while (len > 0 && floatreg < IA64_FR16_REGNUM) { - gdb_byte to[MAX_REGISTER_SIZE]; + gdb_byte to[IA64_MAX_FP_REGISTER_SIZE]; convert_typed_floating (value_contents (arg) + argoffset, float_elt_type, to, ia64_ext_type (gdbarch));