.stabs
N_LSYM
t
The basic types for the language are described using the N_LSYM stab
type. They are boilerplate and are emited by the compiler for each
compilation unit. Basic type definitions are not always a complete
description of the type and are sometimes circular. The debugger
recognizes the type anyway, and knows how to read bits as that type.
Each language and compiler defines a slightly different set of basic types. In this example we are looking at the basic types for C emited by the GNU compiler targeting the Sun4. Here the basic types are mostly defined as range types.
r
When defining a range type, if the number after the first semicolon is smaller than the number after the second one, then the two numbers represent the smallest and the largest values in the range.
4 .text
5 Ltext0:
.stabs "name:
descriptor (type)
type-def=
type-desc
type-ref;
low-bound;
high-bound;
",
N_LSYM, NIL, NIL, NIL
6 .stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
7 .stabs "char:t2=r2;0;127;",128,0,0,0
Here the integer type (1) is defined as a range of the integer
type (1). Likewise char is a range of char. This
part of the definition is circular, but at least the high and low bound
values of the range hold more information about the type.
Here short unsigned int is defined as type number 8 and described as a
range of type int, with a minimum value of 0 and a maximum of 65535.
13 .stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0
r
In a range definition, if the number after the second semicolon is 0, then the number after the first semicolon is the number of bits needed to represent the type.
.stabs "name:
desc
type-def=
type-desc
type-ref;
bit-count;
0;
",
N_LSYM, NIL, NIL, NIL
17 .stabs "float:t12=r1;4;0;",128,0,0,0
18 .stabs "double:t13=r1;8;0;",128,0,0,0
19 .stabs "long double:t14=r1;8;0;",128,0,0,0
Cosmically enough, the void type is defined directly in terms of
itself.
.stabs "name:
symbol-desc
type-def=
type-ref
",N_LSYM,NIL,NIL,NIL
20 .stabs "void:t15=15",128,0,0,0