From patchwork Wed Apr 12 13:41:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Hayward X-Patchwork-Id: 19994 Received: (qmail 77461 invoked by alias); 12 Apr 2017 13:41:23 -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 76482 invoked by uid 89); 12 Apr 2017 13:41:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: EUR02-AM5-obe.outbound.protection.outlook.com Received: from mail-eopbgr00078.outbound.protection.outlook.com (HELO EUR02-AM5-obe.outbound.protection.outlook.com) (40.107.0.78) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 12 Apr 2017 13:41:18 +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.1019.17; Wed, 12 Apr 2017 13:41:16 +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.026; Wed, 12 Apr 2017 13:41:15 +0000 From: Alan Hayward To: Yao Qi CC: "gdb-patches@sourceware.org" , nd Subject: Re: [PATCH 2/11] Add IA64_MAX_REGISTER_SIZE Date: Wed, 12 Apr 2017 13:41:15 +0000 Message-ID: <0CAAE3E4-1860-40FF-895E-6C6A54A4EAB6@arm.com> References: <8637dnqils.fsf@gmail.com> <90F5717F-8685-4C74-B2E4-7317AF228034@arm.com> <86pogivp7m.fsf@gmail.com> In-Reply-To: <86pogivp7m.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; AM3PR08MB0102; 7:Ll2i/5BoAKOlC187Cjuw0DefXsWsyRvw+BJC98C3M42gVOak0Uy4wOJuwyYvom3YQM5WtS1LeEbMfDHnTWzQkkSb8GLTA863vCwOx5y97+DBuhApRZU4azB5Qx6SR2BHiJH1mC7i4EgP6B25dUH2n1cFXjCa8xu6qjnvc642Be1jBYypmKZJDnoetFvb5w2fjpJutRNvEM8sXWrQDvvDE7Q4+uNzx6cJOuyeyURHy8px4Os8mWEeiw/5s2Bwble3QlzODMKgbG5eV3P8vTgfjZfTk06G6tfQQuMLXlU0QdI9rNFGBQ8ntnIKAthCOqOI0/d/qnVSh0EAtU2PUHqYaA== x-ms-office365-filtering-correlation-id: 76bbd4a5-49b2-404d-545d-08d481a99795 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(48565401081)(201703131423075)(201703031133081); SRVR:AM3PR08MB0102; 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)(8121501046)(5005006)(3002001)(10201501046)(93006095)(93001095)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(20161123564025)(20161123560025)(20161123555025)(20161123562025)(6072148); SRVR:AM3PR08MB0102; BCL:0; PCL:0; RULEID:; SRVR:AM3PR08MB0102; x-forefront-prvs: 027578BB13 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(39840400002)(39860400002)(39850400002)(39410400002)(39400400002)(39450400003)(377424004)(24454002)(6916009)(2950100002)(3280700002)(1411001)(6512007)(110136004)(38730400002)(305945005)(99286003)(54906002)(6436002)(7736002)(2900100001)(36756003)(189998001)(102836003)(3846002)(6116002)(2906002)(76176999)(33656002)(54356999)(3660700001)(50986999)(229853002)(66066001)(81166006)(53936002)(8936002)(5250100002)(6506006)(6486002)(5660300001)(93886004)(8676002)(575784001)(4326008)(86362001)(82746002)(83716003)(25786009)(53546009)(6246003)(39060400002)(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: <70D66B67DC2C054EB69ABB6684BCF5F5@eurprd08.prod.outlook.com> MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Apr 2017 13:41:15.3520 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR08MB0102 > On 11 Apr 2017, at 18:17, Yao Qi wrote: > > Alan Hayward writes: > >> @@ -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); > > I just realize that we can use read_memory_unsigned_integer. > >> } >> pc &= ~0xf; >> return frame_unwind_got_constant (this_frame, regnum, pc); > >> @@ -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); > > In my last review, I suggested, > > regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip); > > but you still use get_frame_register_unsigned. There is no variable > "this_frame" at all. > Didn't spot this because a large section of this file is wrapped in ifdef HAVE_LIBUNWIND_IA64_H I faked myself a libunwind setup (by adding the headers to my system and building with --with-libunwind-ia64) and fixed the code. It's worth noting that in order to build the existing head with libunwind, I had to comment out an error in ia64-vms-tdep.c and add -Wno-write-strings to gdb/configure. No idea if this happens on a real ia64 libunwind build, but it might be worth raising as a bug. Updated patch below. Tested on a --enable-targets=all build using make check with board files unix and native-gdbserver. As mentioned previously, I do not have an IA64 machine to test on. Ok to commit? Alan. 2017-04-12 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): Use read_memory_unsigned_integer. (ia64_access_reg): Use get_frame_register_unsigned. (ia64_access_rse_reg): Use regcache_cooked_read_unsigned. (ia64_libunwind_frame_prev_register): Use get_frame_register_unsigned. (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..4604aba8e99cb9933b4573ef82ce0ad8f6a26e8d 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 a FP register in bytes. */ +#define IA64_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_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_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,9 @@ 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); + struct gdbarch *gdbarch = get_frame_arch (this_frame); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + pc = read_memory_unsigned_integer (addr, 8, byte_order); } pc &= ~0xf; return frame_unwind_got_constant (this_frame, regnum, pc); @@ -2490,12 +2488,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 +2502,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 +2512,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 +2521,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 +2561,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 +2575,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); + regcache_cooked_read_unsigned (regcache, IA64_IP_REGNUM, &ip); + regcache_cooked_read_unsigned (regcache, IA64_PSR_REGNUM, &psr); *val = ip | ((psr >> 41) & 0x3); break; @@ -2597,10 +2585,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); + regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, &bsp); + regcache_cooked_read_unsigned (regcache, IA64_CFM_REGNUM, &cfm); sof = (cfm & 0x7f); *val = ia64_rse_skip_regs (bsp, -sof); break; @@ -2608,14 +2594,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); + regcache_cooked_read_unsigned (regcache, IA64_BSP_REGNUM, val); 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); + regcache_cooked_read_unsigned (regcache, regnum, val); break; } @@ -2982,12 +2966,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 +3211,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_FP_REGISTER_SIZE]; int offset = 0; int regnum = IA64_FR8_REGNUM; int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type); @@ -3294,7 +3276,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_FP_REGISTER_SIZE]; int offset = 0; int regnum = IA64_FR8_REGNUM; int n = TYPE_LENGTH (type) / TYPE_LENGTH (float_elt_type); @@ -3856,7 +3838,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_FP_REGISTER_SIZE]; convert_typed_floating (value_contents (arg) + argoffset, float_elt_type, to, ia64_ext_type (gdbarch));