regression with huge integer

Jeff Johnston jjohnstn@redhat.com
Mon Feb 23 22:25:00 GMT 2004


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.



More information about the Gdb mailing list