From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26764 invoked by alias); 26 Feb 2004 22:16:10 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 26756 invoked from network); 26 Feb 2004 22:16:08 -0000 Received: from unknown (HELO touchme.toronto.redhat.com) (216.129.200.20) by sources.redhat.com with SMTP; 26 Feb 2004 22:16:08 -0000 Received: from redhat.com (toocool.toronto.redhat.com [172.16.14.72]) by touchme.toronto.redhat.com (Postfix) with ESMTP id DC87780001E; Thu, 26 Feb 2004 17:16:07 -0500 (EST) Message-ID: <403E7028.1020404@redhat.com> Date: Thu, 26 Feb 2004 22:16:00 -0000 From: Jeff Johnston User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 MIME-Version: 1.0 To: Jeff Johnston Cc: Andrew Cagney , Michael Elizabeth Chastain , gdb@sources.redhat.com Subject: [RFA]: Patch for regression with huge integer References: <20040223195548.B7CDD4B104@berman.michael-chastain.com> <403A7132.9020902@gnu.org> <403A7DEE.6090606@redhat.com> In-Reply-To: <403A7DEE.6090606@redhat.com> Content-Type: multipart/mixed; boundary="------------000107000108000106020907" X-SW-Source: 2004-02/txt/msg00403.txt.bz2 This is a multi-part message in MIME format. --------------000107000108000106020907 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-length: 3615 Jeff Johnston wrote: > Andrew Cagney wrote: > >> >>> (gdb) print /x int256var >>> $2 = >>> 0x0000002a0000002b0000002c0000002d0000002d0000002c0000002b0000002a >>> >>> But with the recent simplification to print_scalar_formatted, gdb >>> HEAD says: >>> >>> (gdb) print int256var >>> $1 = >>> 0x0000002a0000002b0000002c0000002d0000002d0000002c0000002b0000002a >>> (gdb) print /x int256var >>> $2 = That operation is not available on integers of more than 8 bytes. >>> >>> This causes a regression in the test results. >> >> >> >> >> Jeff and I looked at the problem. >> >> Given some sort of very large scalar _and_ a scalar format, I think >> GDB can correctly print it. Looking at the old 60 code, this: >> >> if (len > sizeof (LONGEST) >> && (format == 't' >> || format == 'c' >> || format == 'o' >> || format == 'u' >> || format == 'd' >> || format == 'x')) >> { >> if (!TYPE_UNSIGNED (type) >> || !extract_long_unsigned_integer (valaddr, len, &val_long)) >> { >> /* We can't print it normally, but we can print it in hex. >> Printing it in the wrong radix is more useful than saying >> "use /x, you dummy". */ >> /* FIXME: we could also do octal or binary if that was the >> desired format. */ >> /* FIXME: we should be using the size field to give us a >> minimum field width to print. */ >> >> if (format == 'o') >> print_octal_chars (stream, valaddr, len); >> else if (format == 'd') >> print_decimal_chars (stream, valaddr, len); >> else if (format == 't') >> print_binary_chars (stream, valaddr, len); >> else >> /* replace with call to print_hex_chars? Looks >> like val_print_type_code_int is redoing >> work. - edie */ >> >> val_print_type_code_int (type, valaddr, stream); >> >> would just need to be seriously reduced to something like: >> >> if (len > sizeof (LONGEST) >> && some sort of scalar (TYPE) >> && some sort of scalar (FORMAT)) >> if (format == ..) print_FORMAT_chars (...); >> ... >> else if (format == 'x') >> print_hex_chars (...); >> else >> we've botched it -- don't call val_print_type_code_int >> >> where each format is explicitly handled. ... >> >> The only one that appears to be missing is 'c', and there something >> very similar to print_hex_chars would do the trick (using LA_EMIT_CHAR). >> >> It might even, eventually, be possible to simplify this code to the >> point where all scalar formatted scalars are always printed directly >> from their byte buffer (no unpack longest call). >> >> Andrew >> >> >> > > I'll start working on a patch and submit it for review. > > -- Jeff J. > > Ok to commit? I added a function to print out the char format. It does not print out leading zero bytes. Thus, if you set some large integer value to 'a', it would print out just 'a'. I have verified this fixes the regression in gdb.stabs/weird.exp 2004-02-26 Jeff Johnston * valprint.h (print_hex_chars, print_char_chars): New prototypes. * valprint.c (print_hex_chars): Change from static to external. (print_char_chars): New function. * printcmd.c (print_scalar_formatted): For integer and enum types that are longer than LONGEST, perform processing via appropriate print_*_chars routines. --------------000107000108000106020907 Content-Type: text/plain; name="printcmd.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="printcmd.patch" Content-length: 3328 Index: valprint.h =================================================================== RCS file: /cvs/src/src/gdb/valprint.h,v retrieving revision 1.4 diff -u -p -r1.4 valprint.h --- valprint.h 6 Apr 2003 19:25:04 -0000 1.4 +++ valprint.h 26 Feb 2004 22:07:15 -0000 @@ -63,4 +63,10 @@ extern void print_octal_chars (struct ui extern void print_decimal_chars (struct ui_file *, unsigned char *, unsigned int); + +extern void print_hex_chars (struct ui_file *, unsigned char *, + unsigned int); + +extern void print_char_chars (struct ui_file *, unsigned char *, + unsigned int); #endif Index: valprint.c =================================================================== RCS file: /cvs/src/src/gdb/valprint.c,v retrieving revision 1.31 diff -u -p -r1.31 valprint.c --- valprint.c 21 Sep 2003 01:26:45 -0000 1.31 +++ valprint.c 26 Feb 2004 22:07:15 -0000 @@ -42,9 +42,6 @@ static int partial_memory_read (CORE_ADDR memaddr, char *myaddr, int len, int *errnoptr); -static void print_hex_chars (struct ui_file *, unsigned char *, - unsigned int); - static void show_print (char *, int); static void set_print (char *, int); @@ -846,7 +843,7 @@ print_decimal_chars (struct ui_file *str /* VALADDR points to an integer of LEN bytes. Print it in hex on stream. */ -static void +void print_hex_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len) { unsigned char *p; @@ -873,6 +870,40 @@ print_hex_chars (struct ui_file *stream, } } fputs_filtered (local_hex_format_suffix (), stream); +} + +/* VALADDR points to a char integer of LEN bytes. Print it out in appropriate language form on stream. + Omit any leading zero chars. */ + +void +print_char_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len) +{ + unsigned char *p; + + if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) + { + p = valaddr; + while (p < valaddr + len - 1 && *p == 0) + ++p; + + while (p < valaddr + len) + { + LA_EMIT_CHAR (*p, stream, '\''); + ++p; + } + } + else + { + p = valaddr + len - 1; + while (p > valaddr && *p == 0) + --p; + + while (p >= valaddr) + { + LA_EMIT_CHAR (*p, stream, '\''); + --p; + } + } } /* Called by various _val_print routines to print elements of an Index: printcmd.c =================================================================== RCS file: /cvs/src/src/gdb/printcmd.c,v retrieving revision 1.76 diff -u -p -r1.76 printcmd.c --- printcmd.c 23 Feb 2004 19:41:47 -0000 1.76 +++ printcmd.c 26 Feb 2004 22:07:15 -0000 @@ -350,6 +350,33 @@ print_scalar_formatted (void *valaddr, s LONGEST val_long = 0; unsigned int len = TYPE_LENGTH (type); + if (len > sizeof(LONGEST) && + (TYPE_CODE (type) == TYPE_CODE_INT || + TYPE_CODE (type) == TYPE_CODE_ENUM)) + { + switch (format) + { + case 'o': + print_octal_chars (stream, valaddr, len); + return; + case 'u': + case 'd': + print_decimal_chars (stream, valaddr, len); + return; + case 't': + print_binary_chars (stream, valaddr, len); + return; + case 'x': + print_hex_chars (stream, valaddr, len); + return; + case 'c': + print_char_chars (stream, valaddr, len); + return; + default: + break; + }; + } + if (format != 'f') val_long = unpack_long (type, valaddr); --------------000107000108000106020907--