Next: , Up: Traditional Builtin Types


5.1.1.1 Traditional Integer Types

Often types are defined as subranges of themselves. If the bounding values fit within an int, then they are given normally. For example:

     .stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0    # 128 is N_LSYM
     .stabs "char:t2=r2;0;127;",128,0,0,0

Builtin types can also be described as subranges of int:

     .stabs "unsigned short:t6=r1;0;65535;",128,0,0,0

If the lower bound of a subrange is 0 and the upper bound is -1, the type is an unsigned integral type whose bounds are too big to describe in an int. Traditionally this is only used for unsigned int and unsigned long:

     .stabs "unsigned int:t4=r1;0;-1;",128,0,0,0

For larger types, GCC 2.4.5 puts out bounds in octal, with one or more leading zeroes. In this case a negative bound consists of a number which is a 1 bit (for the sign bit) followed by a 0 bit for each bit in the number (except the sign bit), and a positive bound is one which is a 1 bit for each bit in the number (except possibly the sign bit). All known versions of dbx and GDB version 4 accept this (at least in the sense of not refusing to process the file), but GDB 3.5 refuses to read the whole file containing such symbols. So GCC 2.3.3 did not output the proper size for these types. As an example of octal bounds, the string fields of the stabs for 64 bit integer types look like:

     long int:t3=r1;001000000000000000000000;000777777777777777777777;
     long unsigned int:t5=r1;000000000000000000000000;001777777777777777777777;

If the lower bound of a subrange is 0 and the upper bound is negative, the type is an unsigned integral type whose size in bytes is the absolute value of the upper bound. I believe this is a Convex convention for unsigned long long.

If the lower bound of a subrange is negative and the upper bound is 0, the type is a signed integral type whose size in bytes is the absolute value of the lower bound. I believe this is a Convex convention for long long. To distinguish this from a legitimate subrange, the type should be a subrange of itself. I'm not sure whether this is the case for Convex.