Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Jeff Johnston <jjohnstn@redhat.com>
To: Andrew Cagney <cagney@gnu.org>
Cc: Michael Elizabeth Chastain <mec.gnu@mindspring.com>,
	gdb@sources.redhat.com
Subject: Re: regression with huge integer
Date: Mon, 23 Feb 2004 22:25:00 -0000	[thread overview]
Message-ID: <403A7DEE.6090606@redhat.com> (raw)
In-Reply-To: <403A7132.9020902@gnu.org>

Andrew Cagney wrote:
>> gdb.stabs/weird.def has this huge integer:
>>
>>   # 256-bit integer.  The point is obviously not that GDB should have a
>>   # special case for this size, but that an integer of any size should
>>   # work (at least for printing in hex, not necessarily for 
>> arithmetic.    .stabs "int256var:G203=bu32;0;256;", N_GSYM,0,0, 0
>>   # The value is palindromic, so it works whether words are big or little
>>   # endian.    .globl int256var
>>   .data
>>   .align_it
>>        int256var:
>>   .long 42
>>        .long 0x2b, 0x2c, 0x2d, 0x2d, 0x2c, 0x2b, 0x2a
>>
>> gdb 6.0 can print this just fine:
>>
>>   (gdb) print int256var
>>   $1 = 0x0000002a0000002b0000002c0000002d0000002d0000002c0000002b0000002a
> 
> 
> That should be decimal :-/
> 
>>   (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.
> 
> 
> Hmm, two steps forward, one step back.
> 
>> I would like to just accept this output and change the test script.
>> Specifically, in gdb.stabs/weird.exp:
>>
>>       # This big number needs to be kept as one piece
>>   -     gdb_test "p/x int256var" " = 
>> 0x0*2a0000002b0000002c0000002d0000002d0000002c0000002b0000002a" "print 
>> very big integer"
>>   +     gdb_test "print int256var" " = 
>> 0x0*2a0000002b0000002c0000002d0000002d0000002c0000002b0000002a" "print 
>> very big integer"
>>     Is this a good idea?  Or should I file a bug that "print /x" does 
>> not work
>> in this case?
> 
> 
> 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.


  reply	other threads:[~2004-02-23 22:25 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-02-23 19:55 Michael Elizabeth Chastain
2004-02-23 20:44 ` Andreas Schwab
2004-02-23 21:27   ` Mark Kettenis
2004-02-23 21:31 ` Andrew Cagney
2004-02-23 22:25   ` Jeff Johnston [this message]
2004-02-26 22:16     ` [RFA]: Patch for " Jeff Johnston
2004-02-26 23:09       ` Andrew Cagney
2004-02-26 23:17       ` Daniel Jacobowitz
2004-02-26 23:48         ` Jeff Johnston

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=403A7DEE.6090606@redhat.com \
    --to=jjohnstn@redhat.com \
    --cc=cagney@gnu.org \
    --cc=gdb@sources.redhat.com \
    --cc=mec.gnu@mindspring.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox