From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ed Satterthwaite To: gdb-patches@sources.redhat.com Cc: msnyder@cygnus.com (Michael Snyder), cagney@cygnus.com, ehs@sibyte.com Subject: Re: [RFA] info breakpoints: handle 64-bit addresses Date: Thu, 15 Mar 2001 17:34:00 -0000 Message-id: <20010316013348.A6253DF21@wagner.sibyte.com> X-SW-Source: 2001-03/msg00262.html As written, this patch has a slightly unfortunate side effect for MIPS targets. Michael Snyder wrote > 2001-03-14 Michael Snyder > > * breakpoint.c (print_one_breakpoint): Handle 64-bit addresses. In the code below, b->address is a CORE_ADDR, which is 64 bits when gdb is configured to support 64-bit MIPS targets. TARGET_ADDR_BIT is implicitly set in mips-tdep.c according to the ABI deduced from the object file. For 32-bit or unknown ABI's, that will be 32. In the MIPS architecture, a 64-bit CPU sign-extends 32-bit addresses. At least on some hosts, the output conversion is done by sprintf. Thus 32-bit addresses with bit 31 clear will print as 8 hex digits, while those with bit 31 set (e.g., kseg0 and kseg1) will spill into 16 hex digits, thereby spoiling the intended column alignment. Here's a possible alternative for the first arm of the new conditional. It's similar to usage in mips-tdep.c. It avoids the cast to unsigned long in the original code but does assume ANSI C. tmp = longest_local_hex_string_custom ((b->address & (CORE_ADDR) 0xffffffff), "08l"); > *** 3330,3341 **** > #else > if (addressprint) > { > annotate_field (4); > ! /* FIXME-32x64: need a print_address_numeric with > ! field width */ > ! printf_filtered ("%s ", > ! local_hex_string_custom > ! ((unsigned long) b->address, "08l")); > } > annotate_field (5); > *last_addr = b->address; > --- 3335,3350 ---- > #else > if (addressprint) > { > + char *tmp; > + > annotate_field (4); > ! > ! if (TARGET_ADDR_BIT <= 32) > ! tmp = longest_local_hex_string_custom (b->address, "08l"); > ! else > ! tmp = longest_local_hex_string_custom (b->address, "016l"); > ! > ! printf_filtered ("%s ", tmp); > } > annotate_field (5); > *last_addr = b->address;