* [RFA] stabs: octal negative numbers
@ 2004-10-26 17:39 Jerome Guitton
2004-10-26 17:50 ` Joel Brobecker
2004-11-23 14:10 ` Jerome Guitton
0 siblings, 2 replies; 14+ messages in thread
From: Jerome Guitton @ 2004-10-26 17:39 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 892 bytes --]
The patch in attachment adds support for parsing stabs that contains
negative numbers in octal, two's complement form. I have never
experienced the problem with C programs, but GCC generates those kind
of numbers for some Ada subtypes:
procedure Test_Case is
type Base_Fixed_Point_Type is
delta 1.0 / 16.0
range (System.Min_Int / 2) * 1.0 / 16.0 ..
(System.Max_Int / 2) * 1.0 / 16.0;
subtype Fixed_Point_Subtype is
Base_Fixed_Point_Type range -50.0 .. 50.0;
begin
null;
end Test_Case;
The stabs generated for Fixed_Point_Subtype is:
.stabs "test_case__fixed_point_subtype___XF_1_16:t(0,14)=@s64;r(0,12);01777777777777777776340;0000000001440;",128,0,10,0
(01777777777777777776340 is -800 on 64-bits).
Tested on an i686-linux host, with stabs+ format, no regressions.
Worth submitting an Ada test case, I guess.
Comments? OK to apply?
--
Jerome
[-- Attachment #2: stabsread.dif --]
[-- Type: text/plain, Size: 11149 bytes --]
2004-10-26 Jerome Guitton <guitton@gnat.com>
* stabsread.c (read_huge_number): Add support for reading octal
signed number in twos complement, based on the size of this
number.
(read_range_type): Add support for reading octal signed bounds
in twos complements, based on the size of the type.
(read_type_number, read_cpp_abbrev, read_member_functions,
read_cpp_abbrev, read_one_struct_field, read_baseclasses,
read_struct_type, read_array_type, read_enum_type,
read_sun_builtin_type, read_sun_floating_type): Update calls to
read_huge_number.
(read_type): Update call to read_range_type.
Index: stabsread.c
===================================================================
RCS file: /cvs/src/src/gdb/stabsread.c,v
retrieving revision 1.77
diff -u -p -r1.77 stabsread.c
--- stabsread.c 30 Apr 2004 14:40:54 -0000 1.77
+++ stabsread.c 26 Oct 2004 17:11:31 -0000
@@ -92,7 +92,7 @@ read_one_struct_field (struct field_info
static struct type *dbx_alloc_type (int[2], struct objfile *);
-static long read_huge_number (char **, int, int *);
+static long read_huge_number (char **, int, int *, int);
static struct type *error_type (char **, struct objfile *);
@@ -106,7 +106,7 @@ static int read_type_number (char **, in
static struct type *read_type (char **, struct objfile *);
-static struct type *read_range_type (char **, int[2], struct objfile *);
+static struct type *read_range_type (char **, int[2], int, struct objfile *);
static struct type *read_sun_builtin_type (char **, int[2], struct objfile *);
@@ -435,17 +435,17 @@ read_type_number (char **pp, int *typenu
if (**pp == '(')
{
(*pp)++;
- typenums[0] = read_huge_number (pp, ',', &nbits);
+ typenums[0] = read_huge_number (pp, ',', &nbits, 0);
if (nbits != 0)
return -1;
- typenums[1] = read_huge_number (pp, ')', &nbits);
+ typenums[1] = read_huge_number (pp, ')', &nbits, 0);
if (nbits != 0)
return -1;
}
else
{
typenums[0] = 0;
- typenums[1] = read_huge_number (pp, 0, &nbits);
+ typenums[1] = read_huge_number (pp, 0, &nbits, 0);
if (nbits != 0)
return -1;
}
@@ -1811,7 +1811,7 @@ again:
break;
case 'r': /* Range type */
- type = read_range_type (pp, typenums, objfile);
+ type = read_range_type (pp, typenums, type_size, objfile);
if (typenums[0] != -1)
*dbx_lookup_type (typenums) = type;
break;
@@ -2291,7 +2291,7 @@ read_member_functions (struct field_info
the sign bit out, and usable as a valid index into
the array. Remove the sign bit here. */
new_sublist->fn_field.voffset =
- (0x7fffffff & read_huge_number (pp, ';', &nbits)) + 2;
+ (0x7fffffff & read_huge_number (pp, ';', &nbits, 0)) + 2;
if (nbits != 0)
return 0;
@@ -2656,7 +2656,8 @@ read_cpp_abbrev (struct field_info *fip,
{
int nbits;
- FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ';', &nbits);
+ FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ';', &nbits,
+ 0);
if (nbits != 0)
return 0;
}
@@ -2729,13 +2730,13 @@ read_one_struct_field (struct field_info
{
int nbits;
- FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ',', &nbits);
+ FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ',', &nbits, 0);
if (nbits != 0)
{
stabs_general_complaint ("bad structure-type format");
return;
}
- FIELD_BITSIZE (fip->list->field) = read_huge_number (pp, ';', &nbits);
+ FIELD_BITSIZE (fip->list->field) = read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
{
stabs_general_complaint ("bad structure-type format");
@@ -2931,7 +2932,7 @@ read_baseclasses (struct field_info *fip
ALLOCATE_CPLUS_STRUCT_TYPE (type);
{
int nbits;
- TYPE_N_BASECLASSES (type) = read_huge_number (pp, ',', &nbits);
+ TYPE_N_BASECLASSES (type) = read_huge_number (pp, ',', &nbits, 0);
if (nbits != 0)
return 0;
}
@@ -3005,7 +3006,7 @@ read_baseclasses (struct field_info *fip
corresponding to this baseclass. Always zero in the absence of
multiple inheritance. */
- FIELD_BITPOS (new->field) = read_huge_number (pp, ',', &nbits);
+ FIELD_BITPOS (new->field) = read_huge_number (pp, ',', &nbits, 0);
if (nbits != 0)
return 0;
}
@@ -3310,7 +3311,7 @@ read_struct_type (char **pp, struct type
{
int nbits;
- TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits);
+ TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
}
@@ -3368,7 +3369,7 @@ read_array_type (char **pp, struct type
(*pp)++;
adjustable = 1;
}
- lower = read_huge_number (pp, ';', &nbits);
+ lower = read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
@@ -3378,7 +3379,7 @@ read_array_type (char **pp, struct type
(*pp)++;
adjustable = 1;
}
- upper = read_huge_number (pp, ';', &nbits);
+ upper = read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
@@ -3452,7 +3453,7 @@ read_enum_type (char **pp, struct type *
p++;
name = obsavestring (*pp, p - *pp, &objfile->objfile_obstack);
*pp = p + 1;
- n = read_huge_number (pp, ',', &nbits);
+ n = read_huge_number (pp, ',', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
@@ -3564,17 +3565,17 @@ read_sun_builtin_type (char **pp, int ty
by this type, except that unsigned short is 4 instead of 2.
Since this information is redundant with the third number,
we will ignore it. */
- read_huge_number (pp, ';', &nbits);
+ read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
/* The second number is always 0, so ignore it too. */
- read_huge_number (pp, ';', &nbits);
+ read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
/* The third number is the number of bits for this type. */
- type_bits = read_huge_number (pp, 0, &nbits);
+ type_bits = read_huge_number (pp, 0, &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
/* The type *should* end with a semicolon. If it are embedded
@@ -3607,12 +3608,12 @@ read_sun_floating_type (char **pp, int t
/* The first number has more details about the type, for example
FN_COMPLEX. */
- details = read_huge_number (pp, ';', &nbits);
+ details = read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
/* The second number is the number of bytes occupied by this type */
- nbytes = read_huge_number (pp, ';', &nbits);
+ nbytes = read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
@@ -3635,22 +3636,30 @@ read_sun_floating_type (char **pp, int t
and that character is skipped if it does match.
If END is zero, *PP is left pointing to that character.
+ If TWOS_COMPLEMENT_BITS is set to a strictly positive value and if
+ the number is represented in an octal representation, assume that
+ it is represented in a 2's complement representation with a size of
+ TWOS_COMPLEMENT_BITS.
+
If the number fits in a long, set *BITS to 0 and return the value.
If not, set *BITS to be the number of bits in the number and return 0.
If encounter garbage, set *BITS to -1 and return 0. */
static long
-read_huge_number (char **pp, int end, int *bits)
+read_huge_number (char **pp, int end, int *bits, int twos_complement_bits)
{
char *p = *pp;
int sign = 1;
+ int sign_bit;
long n = 0;
+ long sn = 0;
int radix = 10;
char overflow = 0;
int nbits = 0;
int c;
long upper_limit;
+ int twos_complement_representation = radix == 8 && twos_complement_bits > 0;
if (*p == '-')
{
@@ -3671,12 +3680,36 @@ read_huge_number (char **pp, int end, in
while ((c = *p++) >= '0' && c < ('0' + radix))
{
if (n <= upper_limit)
- {
- n *= radix;
- n += c - '0'; /* FIXME this overflows anyway */
- }
+ {
+ if (twos_complement_representation)
+ {
+ /* Octal, signed, twos complement representation. In this case,
+ sn is the signed value, n is the corresponding absolute
+ value. signed_bit is the position of the sign bit in the
+ first three bits. */
+ if (sn == 0)
+ {
+ sign_bit = (twos_complement_bits % 3 + 2) % 3;
+ sn = c - '0' - ((2 * (c - '0')) | (2 << sign_bit));
+ }
+ else
+ {
+ sn *= radix;
+ sn += c - '0';
+ }
+
+ if (sn < 0)
+ n = -sn;
+ }
+ else
+ {
+ /* unsigned representation */
+ n *= radix;
+ n += c - '0'; /* FIXME this overflows anyway */
+ }
+ }
else
- overflow = 1;
+ overflow = 1;
/* This depends on large values being output in octal, which is
what GCC does. */
@@ -3733,14 +3766,18 @@ read_huge_number (char **pp, int end, in
{
if (bits)
*bits = 0;
- return n * sign;
+ if (twos_complement_representation)
+ return sn;
+ else
+ return n * sign;
}
/* It's *BITS which has the interesting information. */
return 0;
}
static struct type *
-read_range_type (char **pp, int typenums[2], struct objfile *objfile)
+read_range_type (char **pp, int typenums[2], int type_size,
+ struct objfile *objfile)
{
char *orig_pp = *pp;
int rangenums[2];
@@ -3769,8 +3806,8 @@ read_range_type (char **pp, int typenums
/* The remaining two operands are usually lower and upper bounds
of the range. But in some special cases they mean something else. */
- n2 = read_huge_number (pp, ';', &n2bits);
- n3 = read_huge_number (pp, ';', &n3bits);
+ n2 = read_huge_number (pp, ';', &n2bits, type_size);
+ n3 = read_huge_number (pp, ';', &n3bits, type_size);
if (n2bits == -1 || n3bits == -1)
return error_type (pp, objfile);
@@ -3786,8 +3823,19 @@ read_range_type (char **pp, int typenums
/* Number of bits in the type. */
int nbits = 0;
+ /* If a type size attribute has been specified, the bounds of
+ the range should fit in this size. If the lower bounds needs
+ more bits than the upper bound, then the type is signed. */
+ if (n2bits <= type_size && n3bits <= type_size)
+ {
+ if (n2bits == type_size && n2bits > n3bits)
+ got_signed = 1;
+ else
+ got_unsigned = 1;
+ nbits = type_size;
+ }
/* Range from 0 to <large number> is an unsigned large integral type. */
- if ((n2bits == 0 && n2 == 0) && n3bits != 0)
+ else if ((n2bits == 0 && n2 == 0) && n3bits != 0)
{
got_unsigned = 1;
nbits = n3bits;
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA] stabs: octal negative numbers
2004-10-26 17:39 [RFA] stabs: octal negative numbers Jerome Guitton
@ 2004-10-26 17:50 ` Joel Brobecker
2004-11-23 14:10 ` Jerome Guitton
1 sibling, 0 replies; 14+ messages in thread
From: Joel Brobecker @ 2004-10-26 17:50 UTC (permalink / raw)
To: Jerome Guitton; +Cc: gdb-patches
> Tested on an i686-linux host, with stabs+ format, no regressions.
> Worth submitting an Ada test case, I guess.
Speaking of Ada testcases, it might be time now to revisit how we
organize the gdb.ada subdirectory, because the current approach is
not going to scale well. I had a short private discussion with
Michael C about this, just to let him know that I was thinking
about this. I'll add this task on my TODO list.
--
Joel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA] stabs: octal negative numbers
2004-10-26 17:39 [RFA] stabs: octal negative numbers Jerome Guitton
2004-10-26 17:50 ` Joel Brobecker
@ 2004-11-23 14:10 ` Jerome Guitton
2004-11-23 14:32 ` Elena Zannoni
1 sibling, 1 reply; 14+ messages in thread
From: Jerome Guitton @ 2004-11-23 14:10 UTC (permalink / raw)
To: gdb-patches
Ping?
Jerome Guitton (guitton@act-europe.fr):
> The patch in attachment adds support for parsing stabs that contains
> negative numbers in octal, two's complement form. I have never
> experienced the problem with C programs, but GCC generates those kind
> of numbers for some Ada subtypes:
>
> procedure Test_Case is
>
> type Base_Fixed_Point_Type is
> delta 1.0 / 16.0
> range (System.Min_Int / 2) * 1.0 / 16.0 ..
> (System.Max_Int / 2) * 1.0 / 16.0;
>
> subtype Fixed_Point_Subtype is
> Base_Fixed_Point_Type range -50.0 .. 50.0;
>
> begin
> null;
> end Test_Case;
>
> The stabs generated for Fixed_Point_Subtype is:
>
> .stabs "test_case__fixed_point_subtype___XF_1_16:t(0,14)=@s64;r(0,12);01777777777777777776340;0000000001440;",128,0,10,0
>
> (01777777777777777776340 is -800 on 64-bits).
>
> Tested on an i686-linux host, with stabs+ format, no regressions.
> Worth submitting an Ada test case, I guess.
>
> Comments? OK to apply?
>
> --
> Jerome
> 2004-10-26 Jerome Guitton <guitton@gnat.com>
>
> * stabsread.c (read_huge_number): Add support for reading octal
> signed number in twos complement, based on the size of this
> number.
> (read_range_type): Add support for reading octal signed bounds
> in twos complements, based on the size of the type.
> (read_type_number, read_cpp_abbrev, read_member_functions,
> read_cpp_abbrev, read_one_struct_field, read_baseclasses,
> read_struct_type, read_array_type, read_enum_type,
> read_sun_builtin_type, read_sun_floating_type): Update calls to
> read_huge_number.
> (read_type): Update call to read_range_type.
>
> Index: stabsread.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/stabsread.c,v
> retrieving revision 1.77
> diff -u -p -r1.77 stabsread.c
> --- stabsread.c 30 Apr 2004 14:40:54 -0000 1.77
> +++ stabsread.c 26 Oct 2004 17:11:31 -0000
> @@ -92,7 +92,7 @@ read_one_struct_field (struct field_info
>
> static struct type *dbx_alloc_type (int[2], struct objfile *);
>
> -static long read_huge_number (char **, int, int *);
> +static long read_huge_number (char **, int, int *, int);
>
> static struct type *error_type (char **, struct objfile *);
>
> @@ -106,7 +106,7 @@ static int read_type_number (char **, in
>
> static struct type *read_type (char **, struct objfile *);
>
> -static struct type *read_range_type (char **, int[2], struct objfile *);
> +static struct type *read_range_type (char **, int[2], int, struct objfile *);
>
> static struct type *read_sun_builtin_type (char **, int[2], struct objfile *);
>
> @@ -435,17 +435,17 @@ read_type_number (char **pp, int *typenu
> if (**pp == '(')
> {
> (*pp)++;
> - typenums[0] = read_huge_number (pp, ',', &nbits);
> + typenums[0] = read_huge_number (pp, ',', &nbits, 0);
> if (nbits != 0)
> return -1;
> - typenums[1] = read_huge_number (pp, ')', &nbits);
> + typenums[1] = read_huge_number (pp, ')', &nbits, 0);
> if (nbits != 0)
> return -1;
> }
> else
> {
> typenums[0] = 0;
> - typenums[1] = read_huge_number (pp, 0, &nbits);
> + typenums[1] = read_huge_number (pp, 0, &nbits, 0);
> if (nbits != 0)
> return -1;
> }
> @@ -1811,7 +1811,7 @@ again:
> break;
>
> case 'r': /* Range type */
> - type = read_range_type (pp, typenums, objfile);
> + type = read_range_type (pp, typenums, type_size, objfile);
> if (typenums[0] != -1)
> *dbx_lookup_type (typenums) = type;
> break;
> @@ -2291,7 +2291,7 @@ read_member_functions (struct field_info
> the sign bit out, and usable as a valid index into
> the array. Remove the sign bit here. */
> new_sublist->fn_field.voffset =
> - (0x7fffffff & read_huge_number (pp, ';', &nbits)) + 2;
> + (0x7fffffff & read_huge_number (pp, ';', &nbits, 0)) + 2;
> if (nbits != 0)
> return 0;
>
> @@ -2656,7 +2656,8 @@ read_cpp_abbrev (struct field_info *fip,
>
> {
> int nbits;
> - FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ';', &nbits);
> + FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ';', &nbits,
> + 0);
> if (nbits != 0)
> return 0;
> }
> @@ -2729,13 +2730,13 @@ read_one_struct_field (struct field_info
>
> {
> int nbits;
> - FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ',', &nbits);
> + FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ',', &nbits, 0);
> if (nbits != 0)
> {
> stabs_general_complaint ("bad structure-type format");
> return;
> }
> - FIELD_BITSIZE (fip->list->field) = read_huge_number (pp, ';', &nbits);
> + FIELD_BITSIZE (fip->list->field) = read_huge_number (pp, ';', &nbits, 0);
> if (nbits != 0)
> {
> stabs_general_complaint ("bad structure-type format");
> @@ -2931,7 +2932,7 @@ read_baseclasses (struct field_info *fip
> ALLOCATE_CPLUS_STRUCT_TYPE (type);
> {
> int nbits;
> - TYPE_N_BASECLASSES (type) = read_huge_number (pp, ',', &nbits);
> + TYPE_N_BASECLASSES (type) = read_huge_number (pp, ',', &nbits, 0);
> if (nbits != 0)
> return 0;
> }
> @@ -3005,7 +3006,7 @@ read_baseclasses (struct field_info *fip
> corresponding to this baseclass. Always zero in the absence of
> multiple inheritance. */
>
> - FIELD_BITPOS (new->field) = read_huge_number (pp, ',', &nbits);
> + FIELD_BITPOS (new->field) = read_huge_number (pp, ',', &nbits, 0);
> if (nbits != 0)
> return 0;
> }
> @@ -3310,7 +3311,7 @@ read_struct_type (char **pp, struct type
>
> {
> int nbits;
> - TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits);
> + TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits, 0);
> if (nbits != 0)
> return error_type (pp, objfile);
> }
> @@ -3368,7 +3369,7 @@ read_array_type (char **pp, struct type
> (*pp)++;
> adjustable = 1;
> }
> - lower = read_huge_number (pp, ';', &nbits);
> + lower = read_huge_number (pp, ';', &nbits, 0);
>
> if (nbits != 0)
> return error_type (pp, objfile);
> @@ -3378,7 +3379,7 @@ read_array_type (char **pp, struct type
> (*pp)++;
> adjustable = 1;
> }
> - upper = read_huge_number (pp, ';', &nbits);
> + upper = read_huge_number (pp, ';', &nbits, 0);
> if (nbits != 0)
> return error_type (pp, objfile);
>
> @@ -3452,7 +3453,7 @@ read_enum_type (char **pp, struct type *
> p++;
> name = obsavestring (*pp, p - *pp, &objfile->objfile_obstack);
> *pp = p + 1;
> - n = read_huge_number (pp, ',', &nbits);
> + n = read_huge_number (pp, ',', &nbits, 0);
> if (nbits != 0)
> return error_type (pp, objfile);
>
> @@ -3564,17 +3565,17 @@ read_sun_builtin_type (char **pp, int ty
> by this type, except that unsigned short is 4 instead of 2.
> Since this information is redundant with the third number,
> we will ignore it. */
> - read_huge_number (pp, ';', &nbits);
> + read_huge_number (pp, ';', &nbits, 0);
> if (nbits != 0)
> return error_type (pp, objfile);
>
> /* The second number is always 0, so ignore it too. */
> - read_huge_number (pp, ';', &nbits);
> + read_huge_number (pp, ';', &nbits, 0);
> if (nbits != 0)
> return error_type (pp, objfile);
>
> /* The third number is the number of bits for this type. */
> - type_bits = read_huge_number (pp, 0, &nbits);
> + type_bits = read_huge_number (pp, 0, &nbits, 0);
> if (nbits != 0)
> return error_type (pp, objfile);
> /* The type *should* end with a semicolon. If it are embedded
> @@ -3607,12 +3608,12 @@ read_sun_floating_type (char **pp, int t
>
> /* The first number has more details about the type, for example
> FN_COMPLEX. */
> - details = read_huge_number (pp, ';', &nbits);
> + details = read_huge_number (pp, ';', &nbits, 0);
> if (nbits != 0)
> return error_type (pp, objfile);
>
> /* The second number is the number of bytes occupied by this type */
> - nbytes = read_huge_number (pp, ';', &nbits);
> + nbytes = read_huge_number (pp, ';', &nbits, 0);
> if (nbits != 0)
> return error_type (pp, objfile);
>
> @@ -3635,22 +3636,30 @@ read_sun_floating_type (char **pp, int t
> and that character is skipped if it does match.
> If END is zero, *PP is left pointing to that character.
>
> + If TWOS_COMPLEMENT_BITS is set to a strictly positive value and if
> + the number is represented in an octal representation, assume that
> + it is represented in a 2's complement representation with a size of
> + TWOS_COMPLEMENT_BITS.
> +
> If the number fits in a long, set *BITS to 0 and return the value.
> If not, set *BITS to be the number of bits in the number and return 0.
>
> If encounter garbage, set *BITS to -1 and return 0. */
>
> static long
> -read_huge_number (char **pp, int end, int *bits)
> +read_huge_number (char **pp, int end, int *bits, int twos_complement_bits)
> {
> char *p = *pp;
> int sign = 1;
> + int sign_bit;
> long n = 0;
> + long sn = 0;
> int radix = 10;
> char overflow = 0;
> int nbits = 0;
> int c;
> long upper_limit;
> + int twos_complement_representation = radix == 8 && twos_complement_bits > 0;
>
> if (*p == '-')
> {
> @@ -3671,12 +3680,36 @@ read_huge_number (char **pp, int end, in
> while ((c = *p++) >= '0' && c < ('0' + radix))
> {
> if (n <= upper_limit)
> - {
> - n *= radix;
> - n += c - '0'; /* FIXME this overflows anyway */
> - }
> + {
> + if (twos_complement_representation)
> + {
> + /* Octal, signed, twos complement representation. In this case,
> + sn is the signed value, n is the corresponding absolute
> + value. signed_bit is the position of the sign bit in the
> + first three bits. */
> + if (sn == 0)
> + {
> + sign_bit = (twos_complement_bits % 3 + 2) % 3;
> + sn = c - '0' - ((2 * (c - '0')) | (2 << sign_bit));
> + }
> + else
> + {
> + sn *= radix;
> + sn += c - '0';
> + }
> +
> + if (sn < 0)
> + n = -sn;
> + }
> + else
> + {
> + /* unsigned representation */
> + n *= radix;
> + n += c - '0'; /* FIXME this overflows anyway */
> + }
> + }
> else
> - overflow = 1;
> + overflow = 1;
>
> /* This depends on large values being output in octal, which is
> what GCC does. */
> @@ -3733,14 +3766,18 @@ read_huge_number (char **pp, int end, in
> {
> if (bits)
> *bits = 0;
> - return n * sign;
> + if (twos_complement_representation)
> + return sn;
> + else
> + return n * sign;
> }
> /* It's *BITS which has the interesting information. */
> return 0;
> }
>
> static struct type *
> -read_range_type (char **pp, int typenums[2], struct objfile *objfile)
> +read_range_type (char **pp, int typenums[2], int type_size,
> + struct objfile *objfile)
> {
> char *orig_pp = *pp;
> int rangenums[2];
> @@ -3769,8 +3806,8 @@ read_range_type (char **pp, int typenums
>
> /* The remaining two operands are usually lower and upper bounds
> of the range. But in some special cases they mean something else. */
> - n2 = read_huge_number (pp, ';', &n2bits);
> - n3 = read_huge_number (pp, ';', &n3bits);
> + n2 = read_huge_number (pp, ';', &n2bits, type_size);
> + n3 = read_huge_number (pp, ';', &n3bits, type_size);
>
> if (n2bits == -1 || n3bits == -1)
> return error_type (pp, objfile);
> @@ -3786,8 +3823,19 @@ read_range_type (char **pp, int typenums
> /* Number of bits in the type. */
> int nbits = 0;
>
> + /* If a type size attribute has been specified, the bounds of
> + the range should fit in this size. If the lower bounds needs
> + more bits than the upper bound, then the type is signed. */
> + if (n2bits <= type_size && n3bits <= type_size)
> + {
> + if (n2bits == type_size && n2bits > n3bits)
> + got_signed = 1;
> + else
> + got_unsigned = 1;
> + nbits = type_size;
> + }
> /* Range from 0 to <large number> is an unsigned large integral type. */
> - if ((n2bits == 0 && n2 == 0) && n3bits != 0)
> + else if ((n2bits == 0 && n2 == 0) && n3bits != 0)
> {
> got_unsigned = 1;
> nbits = n3bits;
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA] stabs: octal negative numbers
2004-11-23 14:10 ` Jerome Guitton
@ 2004-11-23 14:32 ` Elena Zannoni
2004-11-23 14:38 ` Jerome Guitton
0 siblings, 1 reply; 14+ messages in thread
From: Elena Zannoni @ 2004-11-23 14:32 UTC (permalink / raw)
To: Jerome Guitton; +Cc: gdb-patches
I have no problems with this as long as a testcase is added.
>
> Jerome Guitton (guitton@act-europe.fr):
>
> > The patch in attachment adds support for parsing stabs that contains
> > negative numbers in octal, two's complement form. I have never
> > experienced the problem with C programs, but GCC generates those kind
> > of numbers for some Ada subtypes:
> >
> > procedure Test_Case is
> >
> > type Base_Fixed_Point_Type is
> > delta 1.0 / 16.0
> > range (System.Min_Int / 2) * 1.0 / 16.0 ..
> > (System.Max_Int / 2) * 1.0 / 16.0;
> >
> > subtype Fixed_Point_Subtype is
> > Base_Fixed_Point_Type range -50.0 .. 50.0;
> >
> > begin
> > null;
> > end Test_Case;
> >
> > The stabs generated for Fixed_Point_Subtype is:
> >
> > .stabs "test_case__fixed_point_subtype___XF_1_16:t(0,14)=@s64;r(0,12);01777777777777777776340;0000000001440;",128,0,10,0
> >
> > (01777777777777777776340 is -800 on 64-bits).
> >
> > Tested on an i686-linux host, with stabs+ format, no regressions.
> > Worth submitting an Ada test case, I guess.
> >
> > Comments? OK to apply?
> >
> > --
> > Jerome
>
> > 2004-10-26 Jerome Guitton <guitton@gnat.com>
> >
> > * stabsread.c (read_huge_number): Add support for reading octal
> > signed number in twos complement, based on the size of this
> > number.
> > (read_range_type): Add support for reading octal signed bounds
> > in twos complements, based on the size of the type.
> > (read_type_number, read_cpp_abbrev, read_member_functions,
> > read_cpp_abbrev, read_one_struct_field, read_baseclasses,
> > read_struct_type, read_array_type, read_enum_type,
> > read_sun_builtin_type, read_sun_floating_type): Update calls to
> > read_huge_number.
> > (read_type): Update call to read_range_type.
> >
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA] stabs: octal negative numbers
2004-11-23 14:32 ` Elena Zannoni
@ 2004-11-23 14:38 ` Jerome Guitton
2004-11-25 19:20 ` [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers] Jerome Guitton
0 siblings, 1 reply; 14+ messages in thread
From: Jerome Guitton @ 2004-11-23 14:38 UTC (permalink / raw)
To: Elena Zannoni; +Cc: gdb-patches
Elena Zannoni (ezannoni@redhat.com):
> I have no problems with this as long as a testcase is added.
OK, I will allocate some time to work on it this week, and I will
commit this change when the testcase is accepted.
Thank you for your review.
--
Jerome
^ permalink raw reply [flat|nested] 14+ messages in thread
* [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-11-23 14:38 ` Jerome Guitton
@ 2004-11-25 19:20 ` Jerome Guitton
2004-11-28 17:49 ` Daniel Jacobowitz
0 siblings, 1 reply; 14+ messages in thread
From: Jerome Guitton @ 2004-11-25 19:20 UTC (permalink / raw)
To: gdb-patches; +Cc: Elena Zannoni
[-- Attachment #1: Type: text/plain, Size: 323 bytes --]
Jerome Guitton (guitton@act-europe.fr):
> OK, I will allocate some time to work on it this week, and I will
> commit this change when the testcase is accepted.
Test in attachement. OK to commit?
2004-11-25 Jerome Guitton <guitton@gnat.com>
* gdb.ada/fixed_points.c: New file.
* gdb.ada/fixed_points.exp: New file.
[-- Attachment #2: fixed_points.exp --]
[-- Type: text/plain, Size: 1572 bytes --]
# Copyright 2004 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
# USA.
if $tracelevel then {
strace $tracelevel
}
load_lib "ada.exp"
set testfile "fixed_points"
set srcfile ${testfile}.adb
set binfile ${objdir}/${subdir}/${testfile}
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
set bp_location [gdb_get_line_number "Set breakpoint here"]
send_gdb "break ${srcfile}:$bp_location\n"; gdb_expect -re "$gdb_prompt $"
send_gdb "run\n"; gdb_expect -re "$gdb_prompt $"
gdb_test "print base_object" \
".* = -50" \
"p on a fixed point type"
gdb_test "print subtype_object" \
".* = -50" \
"p on a subtype fixed point type"
gdb_test "print new_type_object" \
".* = -50" \
"p on a new fixed point type"
[-- Attachment #3: fixed_points.adb --]
[-- Type: text/plain, Size: 688 bytes --]
with System;
procedure Fixed_Points is
type Base_Fixed_Point_Type is
delta 1.0 / 16.0
range (System.Min_Int / 2) * 1.0 / 16.0 ..
(System.Max_Int / 2) * 1.0 / 16.0;
subtype Fixed_Point_Subtype is
Base_Fixed_Point_Type range -50.0 .. 50.0;
type New_Fixed_Point_Type is
new Base_Fixed_Point_Type range -50.0 .. 50.0;
Base_Object : Base_Fixed_Point_Type := -50.0;
Subtype_Object : Fixed_Point_Subtype := -50.0;
New_Type_Object : New_Fixed_Point_Type := -50.0;
begin
Base_Object := 1.0/16.0; -- Set breakpoint here
Subtype_Object := 1.0/16.0;
New_Type_Object := 1.0/16.0;
end Fixed_Points;
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-11-25 19:20 ` [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers] Jerome Guitton
@ 2004-11-28 17:49 ` Daniel Jacobowitz
2004-11-29 10:24 ` Jerome Guitton
0 siblings, 1 reply; 14+ messages in thread
From: Daniel Jacobowitz @ 2004-11-28 17:49 UTC (permalink / raw)
To: Jerome Guitton; +Cc: gdb-patches, Elena Zannoni
On Thu, Nov 25, 2004 at 08:20:38PM +0100, Jerome Guitton wrote:
> Jerome Guitton (guitton@act-europe.fr):
>
> > OK, I will allocate some time to work on it this week, and I will
> > commit this change when the testcase is accepted.
>
> Test in attachement. OK to commit?
Couple of problems...
> send_gdb "break ${srcfile}:$bp_location\n"; gdb_expect -re "$gdb_prompt $"
> send_gdb "run\n"; gdb_expect -re "$gdb_prompt $"
Please don't hardcode "run". Can you use
"runto ${srcfile}:$bp_location"
instead of these two lines?
> with System;
>
> procedure Fixed_Points is
Please add a copyright notice to this file.
--
Daniel Jacobowitz
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-11-28 17:49 ` Daniel Jacobowitz
@ 2004-11-29 10:24 ` Jerome Guitton
2004-11-29 13:42 ` Daniel Jacobowitz
0 siblings, 1 reply; 14+ messages in thread
From: Jerome Guitton @ 2004-11-29 10:24 UTC (permalink / raw)
To: gdb-patches, Elena Zannoni
[-- Attachment #1: Type: text/plain, Size: 303 bytes --]
Daniel Jacobowitz (drow@false.org):
> Please don't hardcode "run". Can you use
> "runto ${srcfile}:$bp_location"
> instead of these two lines?
> Please add a copyright notice to this file.
Daniel,
Thank you for your review. I fixed these two problems; new files in
attachment. OK now?
--
Jerome
[-- Attachment #2: fixed_points.exp --]
[-- Type: text/plain, Size: 1480 bytes --]
# Copyright 2004 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
# USA.
if $tracelevel then {
strace $tracelevel
}
load_lib "ada.exp"
set testfile "fixed_points"
set srcfile ${testfile}.adb
set binfile ${objdir}/${subdir}/${testfile}
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
set bp_location [gdb_get_line_number "Set breakpoint here"]
runto "${srcfile}:$bp_location"
gdb_test "print base_object" \
".* = -50" \
"p on a fixed point type"
gdb_test "print subtype_object" \
".* = -50" \
"p on a subtype fixed point type"
gdb_test "print new_type_object" \
".* = -50" \
"p on a new fixed point type"
[-- Attachment #3: fixed_points.adb --]
[-- Type: text/plain, Size: 1467 bytes --]
-- Copyright 2004 Free Software Foundation, Inc.
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
with System;
procedure Fixed_Points is
type Base_Fixed_Point_Type is
delta 1.0 / 16.0
range (System.Min_Int / 2) * 1.0 / 16.0 ..
(System.Max_Int / 2) * 1.0 / 16.0;
subtype Fixed_Point_Subtype is
Base_Fixed_Point_Type range -50.0 .. 50.0;
type New_Fixed_Point_Type is
new Base_Fixed_Point_Type range -50.0 .. 50.0;
Base_Object : Base_Fixed_Point_Type := -50.0;
Subtype_Object : Fixed_Point_Subtype := -50.0;
New_Type_Object : New_Fixed_Point_Type := -50.0;
begin
Base_Object := 1.0/16.0; -- Set breakpoint here
Subtype_Object := 1.0/16.0;
New_Type_Object := 1.0/16.0;
end Fixed_Points;
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-11-29 10:24 ` Jerome Guitton
@ 2004-11-29 13:42 ` Daniel Jacobowitz
2004-11-29 15:21 ` Andrew Cagney
0 siblings, 1 reply; 14+ messages in thread
From: Daniel Jacobowitz @ 2004-11-29 13:42 UTC (permalink / raw)
To: Jerome Guitton; +Cc: gdb-patches, Elena Zannoni
On Mon, Nov 29, 2004 at 11:24:24AM +0100, Jerome Guitton wrote:
> Daniel Jacobowitz (drow@false.org):
>
> > Please don't hardcode "run". Can you use
> > "runto ${srcfile}:$bp_location"
> > instead of these two lines?
>
> > Please add a copyright notice to this file.
>
> Daniel,
>
> Thank you for your review. I fixed these two problems; new files in
> attachment. OK now?
Yes, this testcase is OK. Thanks!
>
--
Daniel Jacobowitz
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-11-29 13:42 ` Daniel Jacobowitz
@ 2004-11-29 15:21 ` Andrew Cagney
2004-11-29 15:26 ` Daniel Jacobowitz
2004-11-29 17:24 ` Jerome Guitton
0 siblings, 2 replies; 14+ messages in thread
From: Andrew Cagney @ 2004-11-29 15:21 UTC (permalink / raw)
To: Daniel Jacobowitz, Jerome Guitton; +Cc: gdb-patches, Elena Zannoni
Daniel Jacobowitz wrote:
> On Mon, Nov 29, 2004 at 11:24:24AM +0100, Jerome Guitton wrote:
>
>>Daniel Jacobowitz (drow@false.org):
>>
>>
>>>Please don't hardcode "run". Can you use
>>> "runto ${srcfile}:$bp_location"
>>>instead of these two lines?
>>
>>>Please add a copyright notice to this file.
>>
>>Daniel,
>>
>>Thank you for your review. I fixed these two problems; new files in
>>attachment. OK now?
>
>
> Yes, this testcase is OK. Thanks!
Sigh.
Jerome, Daniel,
If this test is instead added to the gdb.stabs directory we'll get far
better mileage - few, if anyone, has an Ada compiler, yet almost
everyone has the ability to build/run the gdb.stabs testsuite.
Andrew
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-11-29 15:21 ` Andrew Cagney
@ 2004-11-29 15:26 ` Daniel Jacobowitz
2004-11-29 17:24 ` Jerome Guitton
1 sibling, 0 replies; 14+ messages in thread
From: Daniel Jacobowitz @ 2004-11-29 15:26 UTC (permalink / raw)
To: Andrew Cagney; +Cc: Jerome Guitton, gdb-patches, Elena Zannoni
On Mon, Nov 29, 2004 at 10:19:57AM -0500, Andrew Cagney wrote:
> Daniel Jacobowitz wrote:
> >On Mon, Nov 29, 2004 at 11:24:24AM +0100, Jerome Guitton wrote:
> >
> >>Daniel Jacobowitz (drow@false.org):
> >>
> >>
> >>>Please don't hardcode "run". Can you use
> >>>"runto ${srcfile}:$bp_location"
> >>>instead of these two lines?
> >>
> >>>Please add a copyright notice to this file.
> >>
> >>Daniel,
> >>
> >>Thank you for your review. I fixed these two problems; new files in
> >>attachment. OK now?
> >
> >
> >Yes, this testcase is OK. Thanks!
>
> Sigh.
>
> Jerome, Daniel,
>
> If this test is instead added to the gdb.stabs directory we'll get far
> better mileage - few, if anyone, has an Ada compiler, yet almost
> everyone has the ability to build/run the gdb.stabs testsuite.
Personally, I run the Ada tests every time I build GDB. If you'd like
to hand-write a stabs test, of course, that'd be a nice complement to
the Ada test.
--
Daniel Jacobowitz
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-11-29 15:21 ` Andrew Cagney
2004-11-29 15:26 ` Daniel Jacobowitz
@ 2004-11-29 17:24 ` Jerome Guitton
2004-12-01 17:17 ` Jerome Guitton
1 sibling, 1 reply; 14+ messages in thread
From: Jerome Guitton @ 2004-11-29 17:24 UTC (permalink / raw)
To: Andrew Cagney; +Cc: Daniel Jacobowitz, gdb-patches, Elena Zannoni
Andrew Cagney (cagney@gnu.org):
> If this test is instead added to the gdb.stabs directory we'll get far
> better mileage - few, if anyone, has an Ada compiler, yet almost
> everyone has the ability to build/run the gdb.stabs testsuite.
Well, it is still interesting to have this Ada test, as it also tests
that Ada fixed points debugging works properly. I guess we can have a
stabs test too.
I had a look at the gdb.stabs directory, and I did not understand how it
works. What are the .sed files used for?
--
Jerome
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-11-29 17:24 ` Jerome Guitton
@ 2004-12-01 17:17 ` Jerome Guitton
2004-12-13 17:21 ` Jerome Guitton
0 siblings, 1 reply; 14+ messages in thread
From: Jerome Guitton @ 2004-12-01 17:17 UTC (permalink / raw)
To: Andrew Cagney; +Cc: Daniel Jacobowitz, gdb-patches, Elena Zannoni
Jerome Guitton (guitton@act-europe.fr):
> > If this test is instead added to the gdb.stabs directory we'll get far
> > better mileage - few, if anyone, has an Ada compiler, yet almost
> > everyone has the ability to build/run the gdb.stabs testsuite.
>
> Well, it is still interesting to have this Ada test, as it also tests
> that Ada fixed points debugging works properly. I guess we can have a
> stabs test too.
So here is my plan:
- I will check in my fix, now that it has been approved;
- I will check in the Ada test case, now that it has been approved;
- I will work on a stabs test.
OK? I don't know how to work a stabs test, so I need some help. Can someone
explain me how the ones in gdb.stabs work?
--
Jerome
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers]
2004-12-01 17:17 ` Jerome Guitton
@ 2004-12-13 17:21 ` Jerome Guitton
0 siblings, 0 replies; 14+ messages in thread
From: Jerome Guitton @ 2004-12-13 17:21 UTC (permalink / raw)
To: gdb-patches; +Cc: Daniel Jacobowitz, Andrew Cagney, Elena Zannoni
Jerome Guitton (guitton@act-europe.fr):
> So here is my plan:
> - I will check in my fix, now that it has been approved;
> - I will check in the Ada test case, now that it has been approved;
> - I will work on a stabs test.
FYI:
The stabs fix and the Ada test are now checked in. I will allocate
some days on January to understand how the tests in gdb.stabs work.
--
Jerome
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2004-12-13 16:09 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-10-26 17:39 [RFA] stabs: octal negative numbers Jerome Guitton
2004-10-26 17:50 ` Joel Brobecker
2004-11-23 14:10 ` Jerome Guitton
2004-11-23 14:32 ` Elena Zannoni
2004-11-23 14:38 ` Jerome Guitton
2004-11-25 19:20 ` [RFA/testsuite] Ada fixed points [was stabs: octal negative numbers] Jerome Guitton
2004-11-28 17:49 ` Daniel Jacobowitz
2004-11-29 10:24 ` Jerome Guitton
2004-11-29 13:42 ` Daniel Jacobowitz
2004-11-29 15:21 ` Andrew Cagney
2004-11-29 15:26 ` Daniel Jacobowitz
2004-11-29 17:24 ` Jerome Guitton
2004-12-01 17:17 ` Jerome Guitton
2004-12-13 17:21 ` Jerome Guitton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox