\input texinfo
@setfilename stabs.info
@setchapternewpage odd
@settitle STABS

@c @finalout

@c This is a dir.info fragment to support semi-automated addition of
@c manuals to an info tree.
@dircategory Software development
@direntry
* Stabs: (stabs).                 The "stabs" debugging information format.   
@end direntry

@copying
Copyright @copyright{} 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001,
2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010
Free Software Foundation, Inc.
Contributed by Cygnus Support.  Written by Julia Menapace, Jim Kingdon,
and David MacKenzie.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts.  A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
@end copying

@ifnottex
This document describes the stabs debugging symbol tables.

@insertcopying
@end ifnottex

@titlepage
@title The ``stabs'' debug format
@author Julia Menapace, Jim Kingdon, David MacKenzie
@author Cygnus Support
@page
@tex
\def\$#1${{#1}}  % Kluge: collect RCS revision info without $...$
\xdef\manvers{\$Revision$}  % For use in headers, footers too
{\parskip=0pt
\hfill Cygnus Support\par
\hfill \manvers\par
\hfill \TeX{}info \texinfoversion\par
}
@end tex

@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@ifnottex
@node Top
@top The "stabs" representation of debugging information

This document describes the stabs debugging format.

@menu
* Overview::			Overview of stabs
* Program Structure::		Encoding of the structure of the program
* Constants::			Constants
* Variables::
* Types::			Type definitions
* Macro define and undefine::	Representation of #define and #undef
* Symbol Tables::		Symbol information in symbol tables
* Cplusplus::			Stabs specific to C++
* Stab Types::			Symbol types in a.out files
* Symbol Descriptors::		Table of symbol descriptors
* Type Descriptors::		Table of type descriptors
* Expanded Reference::		Reference information by stab type
* Questions::			Questions and anomalies
* Stab Sections::		In some object file formats, stabs are
                                in sections.
* Symbol Types Index::          Index of symbolic stab symbol type names.
* GNU Free Documentation License::  The license for this documentation
@end menu
@end ifnottex

@contents

@node Overview
@chapter Overview of Stabs

@dfn{Stabs} refers to a format for information that describes a program
to a debugger.  This format was apparently invented by
Peter Kessler at
the University of California at Berkeley, for the @code{pdx} Pascal
debugger; the format has spread widely since then.

This document is one of the few published sources of documentation on
stabs.  It is believed to be comprehensive for stabs used by C.  The
lists of symbol descriptors (@pxref{Symbol Descriptors}) and type
descriptors (@pxref{Type Descriptors}) are believed to be completely
comprehensive.  Stabs for COBOL-specific features and for variant
records (used by Pascal and Modula-2) are poorly documented here.

@c FIXME: Need to document all OS9000 stuff in GDB; see all references
@c to os9k_stabs in stabsread.c.

Other sources of information on stabs are @cite{Dbx and Dbxtool
Interfaces}, 2nd edition, by Sun, 1988, and @cite{AIX Version 3.2 Files
Reference}, Fourth Edition, September 1992, "dbx Stabstring Grammar" in
the a.out section, page 2-31.  This document is believed to incorporate
the information from those two sources except where it explicitly directs
you to them for more information.

@menu
* Flow::			Overview of debugging information flow
* Stabs Format::		Overview of stab format
* String Field::		The string field
* C Example::			A simple example in C source
* Assembly Code::		The simple example at the assembly level
@end menu

@node Flow
@section Overview of Debugging Information Flow

The GNU C compiler compiles C source in a @file{.c} file into assembly
language in a @file{.s} file, which the assembler translates into
a @file{.o} file, which the linker combines with other @file{.o} files and
libraries to produce an executable file.

With the @samp{-g} option, GCC puts in the @file{.s} file additional
debugging information, which is slightly transformed by the assembler
and linker, and carried through into the final executable.  This
debugging information describes features of the source file like line
numbers, the types and scopes of variables, and function names,
parameters, and scopes.

For some object file formats, the debugging information is encapsulated
in assembler directives known collectively as @dfn{stab} (symbol table)
directives, which are interspersed with the generated code.  Stabs are
the native format for debugging information in the a.out and XCOFF
object file formats.  The GNU tools can also emit stabs in the COFF and
ECOFF object file formats.

The assembler adds the information from stabs to the symbol information
it places by default in the symbol table and the string table of the
@file{.o} file it is building.  The linker consolidates the @file{.o}
files into one executable file, with one symbol table and one string
table.  Debuggers use the symbol and string tables in the executable as
a source of debugging information about the program.

@node Stabs Format
@section Overview of Stab Format

There are three overall formats for stab assembler directives,
differentiated by the first word of the stab.  The name of the directive
describes which combination of four possible data fields follows.  It is
either @code{.stabs} (string), @code{.stabn} (number), or @code{.stabd}
(dot).  IBM's XCOFF assembler uses @code{.stabx} (and some other
directives such as @code{.file} and @code{.bi}) instead of
@code{.stabs}, @code{.stabn} or @code{.stabd}.

The overall format of each class of stab is:

@example
.stabs "@var{string}",@var{type},@var{other},@var{desc},@var{value}
.stabn @var{type},@var{other},@var{desc},@var{value}
.stabd @var{type},@var{other},@var{desc}
.stabx "@var{string}",@var{value},@var{type},@var{sdb-type}
@end example

@c what is the correct term for "current file location"?  My AIX
@c assembler manual calls it "the value of the current location counter".
For @code{.stabn} and @code{.stabd}, there is no @var{string} (the
@code{n_strx} field is zero; see @ref{Symbol Tables}).  For
@code{.stabd}, the @var{value} field is implicit and has the value of
the current file location.  For @code{.stabx}, the @var{sdb-type} field
is unused for stabs and can always be set to zero.  The @var{other}
field is almost always unused and can be set to zero.

The number in the @var{type} field gives some basic information about
which type of stab this is (or whether it @emph{is} a stab, as opposed
to an ordinary symbol).  Each valid type number defines a different stab
type; further, the stab type defines the exact interpretation of, and
possible values for, any remaining @var{string}, @var{desc}, or
@var{value} fields present in the stab.  @xref{Stab Types}, for a list
in numeric order of the valid @var{type} field values for stab directives.

@node String Field
@section The String Field

For most stabs the string field holds the meat of the
debugging information.  The flexible nature of this field
is what makes stabs extensible.  For some stab types the string field
contains only a name.  For other stab types the contents can be a great
deal more complex.

The overall format of the string field for most stab types is:

@example
"@var{name}:@var{symbol-descriptor} @var{type-information}"
@end example

@var{name} is the name of the symbol represented by the stab; it can
contain a pair of colons (@pxref{Nested Symbols}).  @var{name} can be
omitted, which means the stab represents an unnamed object.  For
example, @samp{:t10=*2} defines type 10 as a pointer to type 2, but does
not give the type a name.  Omitting the @var{name} field is supported by
AIX dbx and GDB after about version 4.8, but not other debuggers.  GCC
sometimes uses a single space as the name instead of omitting the name
altogether; apparently that is supported by most debuggers.

The @var{symbol-descriptor} following the @samp{:} is an alphabetic
character that tells more specifically what kind of symbol the stab
represents. If the @var{symbol-descriptor} is omitted, but type
information follows, then the stab represents a local variable.  For a
list of symbol descriptors, see @ref{Symbol Descriptors}.  The @samp{c}
symbol descriptor is an exception in that it is not followed by type
information.  @xref{Constants}.

@var{type-information} is either a @var{type-number}, or
@samp{@var{type-number}=}.  A @var{type-number} alone is a type
reference, referring directly to a type that has already been defined.

The @samp{@var{type-number}=} form is a type definition, where the
number represents a new type which is about to be defined.  The type
definition may refer to other types by number, and those type numbers
may be followed by @samp{=} and nested definitions.  Also, the Lucid
compiler will repeat @samp{@var{type-number}=} more than once if it
wants to define several type numbers at once.

In a type definition, if the character that follows the equals sign is
non-numeric then it is a @var{type-descriptor}, and tells what kind of
type is about to be defined.  Any other values following the
@var{type-descriptor} vary, depending on the @var{type-descriptor}.
@xref{Type Descriptors}, for a list of @var{type-descriptor} values.  If
a number follows the @samp{=} then the number is a @var{type-reference}.
For a full description of types, @ref{Types}.

A @var{type-number} is often a single number.  The GNU and Sun tools
additionally permit a @var{type-number} to be a pair
(@var{file-number},@var{filetype-number}) (the parentheses appear in the
string, and serve to distinguish the two cases).  The @var{file-number}
is 0 for the base source file, 1 for the first included file, 2 for the
next, and so on.  The @var{filetype-number} is a number starting with
1 which is incremented for each new type defined in the file.
(Separating the file number and the type number permits the
@code{N_BINCL} optimization to succeed more often; see @ref{Include
Files}).

There is an AIX extension for type attributes.  Following the @samp{=}
are any number of type attributes.  Each one starts with @samp{@@} and
ends with @samp{;}.  Debuggers, including AIX's dbx and GDB 4.10, skip
any type attributes they do not recognize.  GDB 4.9 and other versions
of dbx may not do this.  Because of a conflict with C@t{++}
(@pxref{Cplusplus}), new attributes should not be defined which begin
with a digit, @samp{(}, or @samp{-}; GDB may be unable to distinguish
those from the C@t{++} type descriptor @samp{@@}.  The attributes are:

@table @code
@item a@var{boundary}
@var{boundary} is an integer specifying the alignment.  I assume it
applies to all variables of this type.

@item p@var{integer}
Pointer class (for checking).  Not sure what this means, or how
@var{integer} is interpreted.

@item P
Indicate this is a packed type, meaning that structure fields or array
elements are placed more closely in memory, to save memory at the
expense of speed.

@item s@var{size}
Size in bits of a variable of this type.  This is fully supported by GDB
4.11 and later.

@item S
Indicate that this type is a string instead of an array of characters,
or a bitstring instead of a set.  It doesn't change the layout of the
data being represented, but does enable the debugger to know which type
it is.

@item V
Indicate that this type is a vector instead of an array.  The only 
major difference between vectors and arrays is that vectors are
passed by value instead of by reference (vector coprocessor extension).

@end table

All of this can make the string field quite long.  All versions of GDB,
and some versions of dbx, can handle arbitrarily long strings.  But many
versions of dbx (or assemblers or linkers, I'm not sure which)
cretinously limit the strings to about 80 characters, so compilers which
must work with such systems need to split the @code{.stabs} directive
into several @code{.stabs} directives.  Each stab duplicates every field
except the string field.  The string field of every stab except the last
is marked as continued with a backslash at the end (in the assembly code
this may be written as a double backslash, depending on the assembler).
Removing the backslashes and concatenating the string fields of each
stab produces the original, long string.  Just to be incompatible (or so
they don't have to worry about what the assembler does with
backslashes), AIX can use @samp{?} instead of backslash.

@node C Example
@section A Simple Example in C Source

To get the flavor of how stabs describe source information for a C
program, let's look at the simple program:

@example
main()
@{
        printf("Hello world");
@}
@end example

When compiled with @samp{-g}, the program above yields the following
@file{.s} file.  Line numbers have been added to make it easier to refer
to parts of the @file{.s} file in the description of the stabs that
follows.

@node Assembly Code
@section The Simple Example at the Assembly Level

This simple ``hello world'' example demonstrates several of the stab
types used to describe C language source files.

@example
1  gcc2_compiled.:
2  .stabs "/cygint/s1/users/jcm/play/",100,0,0,Ltext0
3  .stabs "hello.c",100,0,0,Ltext0
4  .text
5  Ltext0:
6  .stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
7  .stabs "char:t2=r2;0;127;",128,0,0,0
8  .stabs "long int:t3=r1;-2147483648;2147483647;",128,0,0,0
9  .stabs "unsigned int:t4=r1;0;-1;",128,0,0,0
10 .stabs "long unsigned int:t5=r1;0;-1;",128,0,0,0
11 .stabs "short int:t6=r1;-32768;32767;",128,0,0,0
12 .stabs "long long int:t7=r1;0;-1;",128,0,0,0
13 .stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0
14 .stabs "long long unsigned int:t9=r1;0;-1;",128,0,0,0
15 .stabs "signed char:t10=r1;-128;127;",128,0,0,0
16 .stabs "unsigned char:t11=r1;0;255;",128,0,0,0
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
20 .stabs "void:t15=15",128,0,0,0
21      .align 4
22 LC0:
23      .ascii "Hello, world!\12\0"
24      .align 4
25      .global _main
26      .proc 1
27 _main:
28 .stabn 68,0,4,LM1
29 LM1:
30      !#PROLOGUE# 0
31      save %sp,-136,%sp
32      !#PROLOGUE# 1
33      call ___main,0
34      nop
35 .stabn 68,0,5,LM2
36 LM2:
37 LBB2:
38      sethi %hi(LC0),%o1
39      or %o1,%lo(LC0),%o0
40      call _printf,0
41      nop
42 .stabn 68,0,6,LM3
43 LM3:
44 LBE2:
45 .stabn 68,0,6,LM4
46 LM4:
47 L1:
48      ret
49      restore
50 .stabs "main:F1",36,0,0,_main
51 .stabn 192,0,0,LBB2
52 .stabn 224,0,0,LBE2
@end example

@node Program Structure
@chapter Encoding the Structure of the Program

The elements of the program structure that stabs encode include the name
of the main function, the names of the source and include files, the
line numbers, procedure names and types, and the beginnings and ends of
blocks of code.

@menu
* Main Program::		Indicate what the main program is
* Source Files::		The path and name of the source file
* Include Files::               Names of include files
* Line Numbers::
* Procedures::
* Nested Procedures::
* Block Structure::
* Alternate Entry Points::      Entering procedures except at the beginning.
@end menu

@node Main Program
@section Main Program

@findex N_MAIN
Most languages allow the main program to have any name.  The
@code{N_MAIN} stab type tells the debugger the name that is used in this
program.  Only the string field is significant; it is the name of
a function which is the main program.  Most C compilers do not use this
stab (they expect the debugger to assume that the name is @code{main}),
but some C compilers emit an @code{N_MAIN} stab for the @code{main}
function.  I'm not sure how XCOFF handles this.

@node Source Files
@section Paths and Names of the Source Files

@findex N_SO
Before any other stabs occur, there must be a stab specifying the source
file.  This information is contained in a symbol of stab type
@code{N_SO}; the string field contains the name of the file.  The
value of the symbol is the start address of the portion of the
text section corresponding to that file.

Some compilers use the desc field to indicate the language of the
source file.  Sun's compilers started this usage, and the first
constants are derived from their documentation.  Languages added
by gcc/gdb start at 0x32 to avoid conflict with languages Sun may
add in the future.  A desc field with a value 0 indicates that no
language has been specified via this mechanism.

@table @asis
@item @code{N_SO_AS} (0x1)
Assembly language
@item @code{N_SO_C}  (0x2)
K&R traditional C
@item @code{N_SO_ANSI_C} (0x3)
ANSI C
@item @code{N_SO_CC}  (0x4)
C++
@item @code{N_SO_FORTRAN} (0x5)
Fortran
@item @code{N_SO_PASCAL} (0x6)
Pascal
@item @code{N_SO_FORTRAN90} (0x7)
Fortran90
@item @code{N_SO_OBJC} (0x32)
Objective-C
@item @code{N_SO_OBJCPLUS} (0x33)
Objective-C++
@end table

Some compilers (for example, GCC2 and SunOS4 @file{/bin/cc}) also
include the directory in which the source was compiled, in a second
@code{N_SO} symbol preceding the one containing the file name.  This
symbol can be distinguished by the fact that it ends in a slash.  Code
from the @code{cfront} C@t{++} compiler can have additional @code{N_SO} symbols for
nonexistent source files after the @code{N_SO} for the real source file;
these are believed to contain no useful information.

For example:

@example
.stabs "/cygint/s1/users/jcm/play/",100,0,0,Ltext0     # @r{100 is N_SO}
.stabs "hello.c",100,0,0,Ltext0
        .text
Ltext0:
@end example

@findex C_FILE
Instead of @code{N_SO} symbols, XCOFF uses a @code{.file} assembler
directive which assembles to a @code{C_FILE} symbol; explaining this in
detail is outside the scope of this document.

@c FIXME: Exactly when should the empty N_SO be used?  Why?
If it is useful to indicate the end of a source file, this is done with
an @code{N_SO} symbol with an empty string for the name.  The value is
the address of the end of the text section for the file.  For some
systems, there is no indication of the end of a source file, and you
just need to figure it ended when you see an @code{N_SO} for a different
source file, or a symbol ending in @code{.o} (which at least some
linkers insert to mark the start of a new @code{.o} file).

@node Include Files
@section Names of Include Files

There are several schemes for dealing with include files: the
traditional @code{N_SOL} approach, Sun's @code{N_BINCL} approach, and the
XCOFF @code{C_BINCL} approach (which despite the similar name has little in
common with @code{N_BINCL}).

@findex N_SOL
An @code{N_SOL} symbol specifies which include file subsequent symbols
refer to.  The string field is the name of the file and the value is the
text address corresponding to the end of the previous include file and
the start of this one.  To specify the main source file again, use an
@code{N_SOL} symbol with the name of the main source file.

@findex N_BINCL
@findex N_EINCL
@findex N_EXCL
The @code{N_BINCL} approach works as follows.  An @code{N_BINCL} symbol
specifies the start of an include file.  In an object file, only the
string is significant; the linker puts data into some of the other
fields.  The end of the include file is marked by an @code{N_EINCL}
symbol (which has no string field).  In an object file, there is no
significant data in the @code{N_EINCL} symbol.  @code{N_BINCL} and
@code{N_EINCL} can be nested.

If the linker detects that two source files have identical stabs between
an @code{N_BINCL} and @code{N_EINCL} pair (as will generally be the case
for a header file), then it only puts out the stabs once.  Each
additional occurrence is replaced by an @code{N_EXCL} symbol.  I believe
the GNU linker and the Sun (both SunOS4 and Solaris) linker are the only
ones which supports this feature.

A linker which supports this feature will set the value of a
@code{N_BINCL} symbol to the total of all the characters in the stabs
strings included in the header file, omitting any file numbers.  The
value of an @code{N_EXCL} symbol is the same as the value of the
@code{N_BINCL} symbol it replaces.  This information can be used to
match up @code{N_EXCL} and @code{N_BINCL} symbols which have the same
filename.  The @code{N_EINCL} value, and the values of the other and
description fields for all three, appear to always be zero.

@findex C_BINCL
@findex C_EINCL
For the start of an include file in XCOFF, use the @file{.bi} assembler
directive, which generates a @code{C_BINCL} symbol.  A @file{.ei}
directive, which generates a @code{C_EINCL} symbol, denotes the end of
the include file.  Both directives are followed by the name of the
source file in quotes, which becomes the string for the symbol.
The value of each symbol, produced automatically by the assembler
and linker, is the offset into the executable of the beginning
(inclusive, as you'd expect) or end (inclusive, as you would not expect)
of the portion of the COFF line table that corresponds to this include
file.  @code{C_BINCL} and @code{C_EINCL} do not nest.

@node Line Numbers
@section Line Numbers

@findex N_SLINE
An @code{N_SLINE} symbol represents the start of a source line.  The
desc field contains the line number and the value contains the code
address for the start of that source line.  On most machines the address
is absolute; for stabs in sections (@pxref{Stab Sections}), it is
relative to the function in which the @code{N_SLINE} symbol occurs.

@findex N_DSLINE
@findex N_BSLINE
GNU documents @code{N_DSLINE} and @code{N_BSLINE} symbols for line
numbers in the data or bss segments, respectively.  They are identical
to @code{N_SLINE} but are relocated differently by the linker.  They
were intended to be used to describe the source location of a variable
declaration, but I believe that GCC2 actually puts the line number in
the desc field of the stab for the variable itself.  GDB has been
ignoring these symbols (unless they contain a string field) since
at least GDB 3.5.

For single source lines that generate discontiguous code, such as flow
of control statements, there may be more than one line number entry for
the same source line.  In this case there is a line number entry at the
start of each code range, each with the same line number.

XCOFF does not use stabs for line numbers.  Instead, it uses COFF line
numbers (which are outside the scope of this document).  Standard COFF
line numbers cannot deal with include files, but in XCOFF this is fixed
with the @code{C_BINCL} method of marking include files (@pxref{Include
Files}).

@node Procedures
@section Procedures

@findex N_FUN, for functions
@findex N_FNAME
@findex N_STSYM, for functions (Sun acc)
@findex N_GSYM, for functions (Sun acc)
All of the following stabs normally use the @code{N_FUN} symbol type.
However, Sun's @code{acc} compiler on SunOS4 uses @code{N_GSYM} and
@code{N_STSYM}, which means that the value of the stab for the function
is useless and the debugger must get the address of the function from
the non-stab symbols instead.  On systems where non-stab symbols have
leading underscores, the stabs will lack underscores and the debugger
needs to know about the leading underscore to match up the stab and the
non-stab symbol.  BSD Fortran is said to use @code{N_FNAME} with the
same restriction; the value of the symbol is not useful (I'm not sure it
really does use this, because GDB doesn't handle this and no one has
complained).

@findex C_FUN
A function is represented by an @samp{F} symbol descriptor for a global
(extern) function, and @samp{f} for a static (local) function.  For
a.out, the value of the symbol is the address of the start of the
function; it is already relocated.  For stabs in ELF, the SunPRO
compiler version 2.0.1 and GCC put out an address which gets relocated
by the linker.  In a future release SunPRO is planning to put out zero,
in which case the address can be found from the ELF (non-stab) symbol.
Because looking things up in the ELF symbols would probably be slow, I'm
not sure how to find which symbol of that name is the right one, and
this doesn't provide any way to deal with nested functions, it would
probably be better to make the value of the stab an address relative to
the start of the file, or just absolute.  See @ref{ELF Linker
Relocation} for more information on linker relocation of stabs in ELF
files.  For XCOFF, the stab uses the @code{C_FUN} storage class and the
value of the stab is meaningless; the address of the function can be
found from the csect symbol (XTY_LD/XMC_PR).

The type information of the stab represents the return type of the
function; thus @samp{foo:f5} means that foo is a function returning type
5.  There is no need to try to get the line number of the start of the
function from the stab for the function; it is in the next
@code{N_SLINE} symbol.

@c FIXME: verify whether the "I suspect" below is true or not.
Some compilers (such as Sun's Solaris compiler) support an extension for
specifying the types of the arguments.  I suspect this extension is not
used for old (non-prototyped) function definitions in C.  If the
extension is in use, the type information of the stab for the function
is followed by type information for each argument, with each argument
preceded by @samp{;}.  An argument type of 0 means that additional
arguments are being passed, whose types and number may vary (@samp{...}
in ANSI C).  GDB has tolerated this extension (parsed the syntax, if not
necessarily used the information) since at least version 4.8; I don't
know whether all versions of dbx tolerate it.  The argument types given
here are not redundant with the symbols for the formal parameters
(@pxref{Parameters}); they are the types of the arguments as they are
passed, before any conversions might take place.  For example, if a C
function which is declared without a prototype takes a @code{float}
argument, the value is passed as a @code{double} but then converted to a
@code{float}.  Debuggers need to use the types given in the arguments
when printing values, but when calling the function they need to use the
types given in the symbol defining the function.

If the return type and types of arguments of a function which is defined
in another source file are specified (i.e., a function prototype in ANSI
C), traditionally compilers emit no stab; the only way for the debugger
to find the information is if the source file where the function is
defined was also compiled with debugging symbols.  As an extension the
Solaris compiler uses symbol descriptor @samp{P} followed by the return
type of the function, followed by the arguments, each preceded by
@samp{;}, as in a stab with symbol descriptor @samp{f} or @samp{F}.
This use of symbol descriptor @samp{P} can be distinguished from its use
for register parameters (@pxref{Register Parameters}) by the fact that it has
symbol type @code{N_FUN}.

The AIX documentation also defines symbol descriptor @samp{J} as an
internal function.  I assume this means a function nested within another
function.  It also says symbol descriptor @samp{m} is a module in
Modula-2 or extended Pascal.

Procedures (functions which do not return values) are represented as
functions returning the @code{void} type in C.  I don't see why this couldn't
be used for all languages (inventing a @code{void} type for this purpose if
necessary), but the AIX documentation defines @samp{I}, @samp{P}, and
@samp{Q} for internal, global, and static procedures, respectively.
These symbol descriptors are unusual in that they are not followed by
type information.

The following example shows a stab for a function @code{main} which
returns type number @code{1}.  The @code{_main} specified for the value
is a reference to an assembler label which is used to fill in the start
address of the function.

@example
.stabs "main:F1",36,0,0,_main      # @r{36 is N_FUN}
@end example

The stab representing a procedure is located immediately following the
code of the procedure.  This stab is in turn directly followed by a
group of other stabs describing elements of the procedure.  These other
stabs describe the procedure's parameters, its block local variables, and
its block structure.

If functions can appear in different sections, then the debugger may not
be able to find the end of a function.  Recent versions of GCC will mark
the end of a function with an @code{N_FUN} symbol with an empty string
for the name.  The value is the address of the end of the current
function.  Without such a symbol, there is no indication of the address
of the end of a function, and you must assume that it ended at the
starting address of the next function or at the end of the text section
for the program.

@node Nested Procedures
@section Nested Procedures

For any of the symbol descriptors representing procedures, after the
symbol descriptor and the type information is optionally a scope
specifier.  This consists of a comma, the name of the procedure, another
comma, and the name of the enclosing procedure.  The first name is local
to the scope specified, and seems to be redundant with the name of the
symbol (before the @samp{:}).  This feature is used by GCC, and
presumably Pascal, Modula-2, etc., compilers, for nested functions.

If procedures are nested more than one level deep, only the immediately
containing scope is specified.  For example, this code:

@example
int
foo (int x)
@{
  int bar (int y)
    @{
      int baz (int z)
        @{
          return x + y + z;
        @}
      return baz (x + 2 * y);
    @}
  return x + bar (3 * x);
@}
@end example

@noindent
produces the stabs:

@example
.stabs "baz:f1,baz,bar",36,0,0,_baz.15         # @r{36 is N_FUN}
.stabs "bar:f1,bar,foo",36,0,0,_bar.12
.stabs "foo:F1",36,0,0,_foo
@end example

@node Block Structure
@section Block Structure

@findex N_LBRAC
@findex N_RBRAC
@c For GCC 2.5.8 or so stabs-in-coff, these are absolute instead of
@c function relative (as documented below).  But GDB has never been able
@c to deal with that (it had wanted them to be relative to the file, but
@c I just fixed that (between GDB 4.12 and 4.13)), so it is function
@c relative just like ELF and SOM and the below documentation.
The program's block structure is represented by the @code{N_LBRAC} (left
brace) and the @code{N_RBRAC} (right brace) stab types.  The variables
defined inside a block precede the @code{N_LBRAC} symbol for most
compilers, including GCC.  Other compilers, such as the Convex, Acorn
RISC machine, and Sun @code{acc} compilers, put the variables after the
@code{N_LBRAC} symbol.  The values of the @code{N_LBRAC} and
@code{N_RBRAC} symbols are the start and end addresses of the code of
the block, respectively.  For most machines, they are relative to the
starting address of this source file.  For the Gould NP1, they are
absolute.  For stabs in sections (@pxref{Stab Sections}), they are
relative to the function in which they occur.

The @code{N_LBRAC} and @code{N_RBRAC} stabs that describe the block
scope of a procedure are located after the @code{N_FUN} stab that
represents the procedure itself.

Sun documents the desc field of @code{N_LBRAC} and
@code{N_RBRAC} symbols as containing the nesting level of the block.
However, dbx seems to not care, and GCC always sets desc to
zero.

@findex .bb
@findex .be
@findex C_BLOCK
For XCOFF, block scope is indicated with @code{C_BLOCK} symbols.  If the
name of the symbol is @samp{.bb}, then it is the beginning of the block;
if the name of the symbol is @samp{.be}; it is the end of the block.

@node Alternate Entry Points
@section Alternate Entry Points

@findex N_ENTRY
@findex C_ENTRY
Some languages, like Fortran, have the ability to enter procedures at
some place other than the beginning.  One can declare an alternate entry
point.  The @code{N_ENTRY} stab is for this; however, the Sun FORTRAN
compiler doesn't use it.  According to AIX documentation, only the name
of a @code{C_ENTRY} stab is significant; the address of the alternate
entry point comes from the corresponding external symbol.  A previous
revision of this document said that the value of an @code{N_ENTRY} stab
was the address of the alternate entry point, but I don't know the
source for that information.

@node Constants
@chapter Constants

The @samp{c} symbol descriptor indicates that this stab represents a
constant.  This symbol descriptor is an exception to the general rule
that symbol descriptors are followed by type information.  Instead, it
is followed by @samp{=} and one of the following:

@table @code
@item b @var{value}
Boolean constant.  @var{value} is a numeric value; I assume it is 0 for
false or 1 for true.

@item c @var{value}
Character constant.  @var{value} is the numeric value of the constant.

@item e @var{type-information} , @var{value}
Constant whose value can be represented as integral.
@var{type-information} is the type of the constant, as it would appear
after a symbol descriptor (@pxref{String Field}).  @var{value} is the
numeric value of the constant.  GDB 4.9 does not actually get the right
value if @var{value} does not fit in a host @code{int}, but it does not
do anything violent, and future debuggers could be extended to accept
integers of any size (whether unsigned or not).  This constant type is
usually documented as being only for enumeration constants, but GDB has
never imposed that restriction; I don't know about other debuggers.

@item i @var{value}
Integer constant.  @var{value} is the numeric value.  The type is some
sort of generic integer type (for GDB, a host @code{int}); to specify
the type explicitly, use @samp{e} instead.

@item r @var{value}
Real constant.  @var{value} is the real value, which can be @samp{INF}
(optionally preceded by a sign) for infinity, @samp{QNAN} for a quiet
NaN (not-a-number), or @samp{SNAN} for a signalling NaN.  If it is a
normal number the format is that accepted by the C library function
@code{atof}.

@item s @var{string}
String constant.  @var{string} is a string enclosed in either @samp{'}
(in which case @samp{'} characters within the string are represented as
@samp{\'} or @samp{"} (in which case @samp{"} characters within the
string are represented as @samp{\"}).

@item S @var{type-information} , @var{elements} , @var{bits} , @var{pattern}
Set constant.  @var{type-information} is the type of the constant, as it
would appear after a symbol descriptor (@pxref{String Field}).
@var{elements} is the number of elements in the set (does this means
how many bits of @var{pattern} are actually used, which would be
redundant with the type, or perhaps the number of bits set in
@var{pattern}?  I don't get it), @var{bits} is the number of bits in the
constant (meaning it specifies the length of @var{pattern}, I think),
and @var{pattern} is a hexadecimal representation of the set.  AIX
documentation refers to a limit of 32 bytes, but I see no reason why
this limit should exist.  This form could probably be used for arbitrary
constants, not just sets; the only catch is that @var{pattern} should be
understood to be target, not host, byte order and format.
@end table

The boolean, character, string, and set constants are not supported by
GDB 4.9, but it ignores them.  GDB 4.8 and earlier gave an error
message and refused to read symbols from the file containing the
constants.

The above information is followed by @samp{;}.

@node Variables
@chapter Variables

Different types of stabs describe the various ways that variables can be
allocated: on the stack, globally, in registers, in common blocks,
statically, or as arguments to a function.

@menu
* Stack Variables::		Variables allocated on the stack.
* Global Variables::		Variables used by more than one source file.
* Register Variables::		Variables in registers.
* Common Blocks::		Variables statically allocated together.
* Statics::			Variables local to one source file.
* Based Variables::		Fortran pointer based variables.
* Parameters::			Variables for arguments to functions.
@end menu

@node Stack Variables
@section Automatic Variables Allocated on the Stack

If a variable's scope is local to a function and its lifetime is only as
long as that function executes (C calls such variables
@dfn{automatic}), it can be allocated in a register (@pxref{Register
Variables}) or on the stack.

@findex N_LSYM, for stack variables
@findex C_LSYM
Each variable allocated on the stack has a stab with the symbol
descriptor omitted.  Since type information should begin with a digit,
@samp{-}, or @samp{(}, only those characters precluded from being used
for symbol descriptors.  However, the Acorn RISC machine (ARM) is said
to get this wrong: it puts out a mere type definition here, without the
preceding @samp{@var{type-number}=}.  This is a bad idea; there is no
guarantee that type descriptors are distinct from symbol descriptors.
Stabs for stack variables use the @code{N_LSYM} stab type, or
@code{C_LSYM} for XCOFF.

The value of the stab is the offset of the variable within the
local variables.  On most machines this is an offset from the frame
pointer and is negative.  The location of the stab specifies which block
it is defined in; see @ref{Block Structure}.

For example, the following C code:

@example
int
main ()
@{
  int x;
@}
@end example

produces the following stabs:

@example
.stabs "main:F1",36,0,0,_main   # @r{36 is N_FUN}
.stabs "x:1",128,0,0,-12        # @r{128 is N_LSYM}
.stabn 192,0,0,LBB2             # @r{192 is N_LBRAC}
.stabn 224,0,0,LBE2             # @r{224 is N_RBRAC}
@end example

See @ref{Procedures} for more information on the @code{N_FUN} stab, and
@ref{Block Structure} for more information on the @code{N_LBRAC} and
@code{N_RBRAC} stabs.

@node Global Variables
@section Global Variables

@findex N_GSYM
@findex C_GSYM
@c FIXME: verify for sure that it really is C_GSYM on XCOFF
A variable whose scope is not specific to just one source file is
represented by the @samp{G} symbol descriptor.  These stabs use the
@code{N_GSYM} stab type (C_GSYM for XCOFF).  The type information for
the stab (@pxref{String Field}) gives the type of the variable.

For example, the following source code:

@example
char g_foo = 'c';
@end example

@noindent
yields the following assembly code:

@example
.stabs "g_foo:G2",32,0,0,0     # @r{32 is N_GSYM}
     .global _g_foo
     .data
_g_foo:
     .byte 99
@end example

The address of the variable represented by the @code{N_GSYM} is not
contained in the @code{N_GSYM} stab.  The debugger gets this information
from the external symbol for the global variable.  In the example above,
the @code{.global _g_foo} and @code{_g_foo:} lines tell the assembler to
produce an external symbol.

Some compilers, like GCC, output @code{N_GSYM} stabs only once, where
the variable is defined.  Other compilers, like SunOS4 /bin/cc, output a
@code{N_GSYM} stab for each compilation unit which references the
variable.

@node Register Variables
@section Register Variables

@findex N_RSYM
@findex C_RSYM
@c According to an old version of this manual, AIX uses C_RPSYM instead
@c of C_RSYM.  I am skeptical; this should be verified.
Register variables have their own stab type, @code{N_RSYM}
(@code{C_RSYM} for XCOFF), and their own symbol descriptor, @samp{r}.
The stab's value is the number of the register where the variable data
will be stored.
@c .stabs "name:type",N_RSYM,0,RegSize,RegNumber (Sun doc)

AIX defines a separate symbol descriptor @samp{d} for floating point
registers.  This seems unnecessary; why not just just give floating
point registers different register numbers?  I have not verified whether
the compiler actually uses @samp{d}.

If the register is explicitly allocated to a global variable, but not
initialized, as in:

@example
register int g_bar asm ("%g5");
@end example

@noindent
then the stab may be emitted at the end of the object file, with
the other bss symbols.

@node Common Blocks
@section Common Blocks

A common block is a statically allocated section of memory which can be
referred to by several source files.  It may contain several variables.
I believe Fortran is the only language with this feature.

@findex N_BCOMM
@findex N_ECOMM
@findex C_BCOMM
@findex C_ECOMM
A @code{N_BCOMM} stab begins a common block and an @code{N_ECOMM} stab
ends it.  The only field that is significant in these two stabs is the
string, which names a normal (non-debugging) symbol that gives the
address of the common block.  According to IBM documentation, only the
@code{N_BCOMM} has the name of the common block (even though their
compiler actually puts it both places).

@findex N_ECOML
@findex C_ECOML
The stabs for the members of the common block are between the
@code{N_BCOMM} and the @code{N_ECOMM}; the value of each stab is the
offset within the common block of that variable.  IBM uses the
@code{C_ECOML} stab type, and there is a corresponding @code{N_ECOML}
stab type, but Sun's Fortran compiler uses @code{N_GSYM} instead.  The
variables within a common block use the @samp{V} symbol descriptor (I
believe this is true of all Fortran variables).  Other stabs (at least
type declarations using @code{C_DECL}) can also be between the
@code{N_BCOMM} and the @code{N_ECOMM}.

@node Statics
@section Static Variables

Initialized static variables are represented by the @samp{S} and
@samp{V} symbol descriptors.  @samp{S} means file scope static, and
@samp{V} means procedure scope static.  One exception: in XCOFF, IBM's
xlc compiler always uses @samp{V}, and whether it is file scope or not
is distinguished by whether the stab is located within a function.

@c This is probably not worth mentioning; it is only true on the sparc
@c for `double' variables which although declared const are actually in
@c the data segment (the text segment can't guarantee 8 byte alignment).
@c (although GCC
@c 2.4.5 has a bug in that it uses @code{N_FUN}, so neither dbx nor GDB can
@c find the variables)
@findex N_STSYM
@findex N_LCSYM
@findex N_FUN, for variables
@findex N_ROSYM
In a.out files, @code{N_STSYM} means the data section, @code{N_FUN}
means the text section, and @code{N_LCSYM} means the bss section.  For
those systems with a read-only data section separate from the text
section (Solaris), @code{N_ROSYM} means the read-only data section.

For example, the source lines:

@example
static const int var_const = 5;
static int var_init = 2;
static int var_noinit;
@end example

@noindent
yield the following stabs:

@example
.stabs "var_const:S1",36,0,0,_var_const      # @r{36 is N_FUN}
@dots{}
.stabs "var_init:S1",38,0,0,_var_init        # @r{38 is N_STSYM}
@dots{}
.stabs "var_noinit:S1",40,0,0,_var_noinit    # @r{40 is N_LCSYM}
@end example

@findex C_STSYM
@findex C_BSTAT
@findex C_ESTAT
In XCOFF files, the stab type need not indicate the section;
@code{C_STSYM} can be used for all statics.  Also, each static variable
is enclosed in a static block.  A @code{C_BSTAT} (emitted with a
@samp{.bs} assembler directive) symbol begins the static block; its
value is the symbol number of the csect symbol whose value is the
address of the static block, its section is the section of the variables
in that static block, and its name is @samp{.bs}.  A @code{C_ESTAT}
(emitted with a @samp{.es} assembler directive) symbol ends the static
block; its name is @samp{.es} and its value and section are ignored.

In ECOFF files, the storage class is used to specify the section, so the
stab type need not indicate the section.

In ELF files, for the SunPRO compiler version 2.0.1, symbol descriptor
@samp{S} means that the address is absolute (the linker relocates it)
and symbol descriptor @samp{V} means that the address is relative to the
start of the relevant section for that compilation unit.  SunPRO has
plans to have the linker stop relocating stabs; I suspect that their the
debugger gets the address from the corresponding ELF (not stab) symbol.
I'm not sure how to find which symbol of that name is the right one.
The clean way to do all this would be to have the value of a symbol
descriptor @samp{S} symbol be an offset relative to the start of the
file, just like everything else, but that introduces obvious
compatibility problems.  For more information on linker stab relocation,
@xref{ELF Linker Relocation}.

@node Based Variables
@section Fortran Based Variables

Fortran (at least, the Sun and SGI dialects of FORTRAN-77) has a feature
which allows allocating arrays with @code{malloc}, but which avoids
blurring the line between arrays and pointers the way that C does.  In
stabs such a variable uses the @samp{b} symbol descriptor.

For example, the Fortran declarations

@example
real foo, foo10(10), foo10_5(10,5)
pointer (foop, foo)
pointer (foo10p, foo10)
pointer (foo105p, foo10_5)
@end example

produce the stabs

@example
foo:b6
foo10:bar3;1;10;6
foo10_5:bar3;1;5;ar3;1;10;6
@end example

In this example, @code{real} is type 6 and type 3 is an integral type
which is the type of the subscripts of the array (probably
@code{integer}).

The @samp{b} symbol descriptor is like @samp{V} in that it denotes a
statically allocated symbol whose scope is local to a function; see
@xref{Statics}.  The value of the symbol, instead of being the address
of the variable itself, is the address of a pointer to that variable.
So in the above example, the value of the @code{foo} stab is the address
of a pointer to a real, the value of the @code{foo10} stab is the
address of a pointer to a 10-element array of reals, and the value of
the @code{foo10_5} stab is the address of a pointer to a 5-element array
of 10-element arrays of reals.

@node Parameters
@section Parameters

Formal parameters to a function are represented by a stab (or sometimes
two; see below) for each parameter.  The stabs are in the order in which
the debugger should print the parameters (i.e., the order in which the
parameters are declared in the source file).  The exact form of the stab
depends on how the parameter is being passed.

@findex N_PSYM
@findex C_PSYM
Parameters passed on the stack use the symbol descriptor @samp{p} and
the @code{N_PSYM} symbol type (or @code{C_PSYM} for XCOFF).  The value
of the symbol is an offset used to locate the parameter on the stack;
its exact meaning is machine-dependent, but on most machines it is an
offset from the frame pointer.

As a simple example, the code:

@example
main (argc, argv)
     int argc;
     char **argv;
@end example

produces the stabs:

@example
.stabs "main:F1",36,0,0,_main                 # @r{36 is N_FUN}
.stabs "argc:p1",160,0,0,68                   # @r{160 is N_PSYM}
.stabs "argv:p20=*21=*2",160,0,0,72
@end example

The type definition of @code{argv} is interesting because it contains
several type definitions.  Type 21 is pointer to type 2 (char) and
@code{argv} (type 20) is pointer to type 21.

@c FIXME: figure out what these mean and describe them coherently.
The following symbol descriptors are also said to go with @code{N_PSYM}.
The value of the symbol is said to be an offset from the argument
pointer (I'm not sure whether this is true or not).

@example
pP (<<??>>)
pF Fortran function parameter
X  (function result variable)
@end example

@menu
* Register Parameters::
* Local Variable Parameters::
* Reference Parameters::
* Conformant Arrays::
@end menu

@node Register Parameters
@subsection Passing Parameters in Registers

If the parameter is passed in a register, then traditionally there are
two symbols for each argument:

@example
.stabs "arg:p1" . . .       ; N_PSYM
.stabs "arg:r1" . . .       ; N_RSYM
@end example

Debuggers use the second one to find the value, and the first one to
know that it is an argument.

@findex C_RPSYM
@findex N_RSYM, for parameters
Because that approach is kind of ugly, some compilers use symbol
descriptor @samp{P} or @samp{R} to indicate an argument which is in a
register.  Symbol type @code{C_RPSYM} is used in XCOFF and @code{N_RSYM}
is used otherwise.  The symbol's value is the register number.  @samp{P}
and @samp{R} mean the same thing; the difference is that @samp{P} is a
GNU invention and @samp{R} is an IBM (XCOFF) invention.  As of version
4.9, GDB should handle either one.

There is at least one case where GCC uses a @samp{p} and @samp{r} pair
rather than @samp{P}; this is where the argument is passed in the
argument list and then loaded into a register.

According to the AIX documentation, symbol descriptor @samp{D} is for a
parameter passed in a floating point register.  This seems
unnecessary---why not just use @samp{R} with a register number which
indicates that it's a floating point register?  I haven't verified
whether the system actually does what the documentation indicates.

@c FIXME: On the hppa this is for any type > 8 bytes, I think, and not
@c for small structures (investigate).
On the sparc and hppa, for a @samp{P} symbol whose type is a structure
or union, the register contains the address of the structure.  On the
sparc, this is also true of a @samp{p} and @samp{r} pair (using Sun
@code{cc}) or a @samp{p} symbol.  However, if a (small) structure is
really in a register, @samp{r} is used.  And, to top it all off, on the
hppa it might be a structure which was passed on the stack and loaded
into a register and for which there is a @samp{p} and @samp{r} pair!  I
believe that symbol descriptor @samp{i} is supposed to deal with this
case (it is said to mean "value parameter by reference, indirect
access"; I don't know the source for this information), but I don't know
details or what compilers or debuggers use it, if any (not GDB or GCC).
It is not clear to me whether this case needs to be dealt with
differently than parameters passed by reference (@pxref{Reference Parameters}).

@node Local Variable Parameters
@subsection Storing Parameters as Local Variables

There is a case similar to an argument in a register, which is an
argument that is actually stored as a local variable.  Sometimes this
happens when the argument was passed in a register and then the compiler
stores it as a local variable.  If possible, the compiler should claim
that it's in a register, but this isn't always done.

If a parameter is passed as one type and converted to a smaller type by
the prologue (for example, the parameter is declared as a @code{float},
but the calling conventions specify that it is passed as a
@code{double}), then GCC2 (sometimes) uses a pair of symbols.  The first
symbol uses symbol descriptor @samp{p} and the type which is passed.
The second symbol has the type and location which the parameter actually
has after the prologue.  For example, suppose the following C code
appears with no prototypes involved:

@example
void
subr (f)
     float f;
@{
@end example

if @code{f} is passed as a double at stack offset 8, and the prologue
converts it to a float in register number 0, then the stabs look like:

@example
.stabs "f:p13",160,0,3,8   # @r{160 is @code{N_PSYM}, here 13 is @code{double}}
.stabs "f:r12",64,0,3,0    # @r{64 is @code{N_RSYM}, here 12 is @code{float}}
@end example

In both stabs 3 is the line number where @code{f} is declared
(@pxref{Line Numbers}).

@findex N_LSYM, for parameter
GCC, at least on the 960, has another solution to the same problem.  It
uses a single @samp{p} symbol descriptor for an argument which is stored
as a local variable but uses @code{N_LSYM} instead of @code{N_PSYM}.  In
this case, the value of the symbol is an offset relative to the local
variables for that function, not relative to the arguments; on some
machines those are the same thing, but not on all.

@c This is mostly just background info; the part that logically belongs
@c here is the last sentence.  
On the VAX or on other machines in which the calling convention includes
the number of words of arguments actually passed, the debugger (GDB at
least) uses the parameter symbols to keep track of whether it needs to
print nameless arguments in addition to the formal parameters which it
has printed because each one has a stab.  For example, in 

@example
extern int fprintf (FILE *stream, char *format, @dots{});
@dots{}
fprintf (stdout, "%d\n", x);
@end example

there are stabs for @code{stream} and @code{format}.  On most machines,
the debugger can only print those two arguments (because it has no way
of knowing that additional arguments were passed), but on the VAX or
other machines with a calling convention which indicates the number of
words of arguments, the debugger can print all three arguments.  To do
so, the parameter symbol (symbol descriptor @samp{p}) (not necessarily
@samp{r} or symbol descriptor omitted symbols) needs to contain the
actual type as passed (for example, @code{double} not @code{float} if it
is passed as a double and converted to a float).

@node Reference Parameters
@subsection Passing Parameters by Reference

If the parameter is passed by reference (e.g., Pascal @code{VAR}
parameters), then the symbol descriptor is @samp{v} if it is in the
argument list, or @samp{a} if it in a register.  Other than the fact
that these contain the address of the parameter rather than the
parameter itself, they are identical to @samp{p} and @samp{R},
respectively.  I believe @samp{a} is an AIX invention; @samp{v} is
supported by all stabs-using systems as far as I know.

@node Conformant Arrays
@subsection Passing Conformant Array Parameters

@c Is this paragraph correct?  It is based on piecing together patchy
@c information and some guesswork
Conformant arrays are a feature of Modula-2, and perhaps other
languages, in which the size of an array parameter is not known to the
called function until run-time.  Such parameters have two stabs: a
@samp{x} for the array itself, and a @samp{C}, which represents the size
of the array.  The value of the @samp{x} stab is the offset in the
argument list where the address of the array is stored (it this right?
it is a guess); the value of the @samp{C} stab is the offset in the
argument list where the size of the array (in elements? in bytes?) is
stored.

@node Types
@chapter Defining Types

The examples so far have described types as references to previously
defined types, or defined in terms of subranges of or pointers to
previously defined types.  This chapter describes the other type
descriptors that may follow the @samp{=} in a type definition.

@menu
* Builtin Types::		Integers, floating point, void, etc.
* Miscellaneous Types::		Pointers, sets, files, etc.
* Cross-References::		Referring to a type not yet defined.
* Subranges::			A type with a specific range.
* Arrays::			An aggregate type of same-typed elements.
* Strings::			Like an array but also has a length.
* Enumerations::		Like an integer but the values have names.
* Structures::			An aggregate type of different-typed elements.
* Typedefs::			Giving a type a name.
* Unions::			Different types sharing storage.
* Function Types::
@end menu

@node Builtin Types
@section Builtin Types

Certain types are built in (@code{int}, @code{short}, @code{void},
@code{float}, etc.); the debugger recognizes these types and knows how
to handle them.  Thus, don't be surprised if some of the following ways
of specifying builtin types do not specify everything that a debugger
would need to know about the type---in some cases they merely specify
enough information to distinguish the type from other types.

The traditional way to define builtin types is convoluted, so new ways
have been invented to describe them.  Sun's @code{acc} uses special
builtin type descriptors (@samp{b} and @samp{R}), and IBM uses negative
type numbers.  GDB accepts all three ways, as of version 4.8; dbx just
accepts the traditional builtin types and perhaps one of the other two
formats.  The following sections describe each of these formats.

@menu
* Traditional Builtin Types::	Put on your seat belts and prepare for kludgery
* Builtin Type Descriptors::	Builtin types with special type descriptors
* Negative Type Numbers::	Builtin types using negative type numbers
@end menu

@node Traditional Builtin Types
@subsection Traditional Builtin Types

This is the traditional, convoluted method for defining builtin types.
There are several classes of such type definitions: integer, floating
point, and @code{void}.

@menu
* Traditional Integer Types::
* Traditional Other Types::
@end menu

@node Traditional Integer Types
@subsubsection Traditional Integer Types

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

@example
.stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0    # @r{128 is N_LSYM}
.stabs "char:t2=r2;0;127;",128,0,0,0
@end example

Builtin types can also be described as subranges of @code{int}:

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

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 @code{int}.  Traditionally this is only used for
@code{unsigned int} and @code{unsigned long}:

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

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:

@c .stabs directives, etc., omitted to make it fit on the page.
@example
long int:t3=r1;001000000000000000000000;000777777777777777777777;
long unsigned int:t5=r1;000000000000000000000000;001777777777777777777777;
@end example

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 @code{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 @code{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.

@node Traditional Other Types
@subsubsection Traditional Other Types

If the upper bound of a subrange is 0 and the lower bound is positive,
the type is a floating point type, and the lower bound of the subrange
indicates the number of bytes in the type:

@example
.stabs "float:t12=r1;4;0;",128,0,0,0
.stabs "double:t13=r1;8;0;",128,0,0,0
@end example

However, GCC writes @code{long double} the same way it writes
@code{double}, so there is no way to distinguish.

@example
.stabs "long double:t14=r1;8;0;",128,0,0,0
@end example

Complex types are defined the same way as floating-point types; there is
no way to distinguish a single-precision complex from a double-precision
floating-point type.

The C @code{void} type is defined as itself:

@example
.stabs "void:t15=15",128,0,0,0
@end example

I'm not sure how a boolean type is represented.

@node Builtin Type Descriptors
@subsection Defining Builtin Types Using Builtin Type Descriptors

This is the method used by Sun's @code{acc} for defining builtin types.
These are the type descriptors to define builtin types:

@table @code
@c FIXME: clean up description of width and offset, once we figure out
@c what they mean
@item b @var{signed} @var{char-flag} @var{width} ; @var{offset} ; @var{nbits} ;
Define an integral type.  @var{signed} is @samp{u} for unsigned or
@samp{s} for signed.  @var{char-flag} is @samp{c} which indicates this
is a character type, or is omitted.  I assume this is to distinguish an
integral type from a character type of the same size, for example it
might make sense to set it for the C type @code{wchar_t} so the debugger
can print such variables differently (Solaris does not do this).  Sun
sets it on the C types @code{signed char} and @code{unsigned char} which
arguably is wrong.  @var{width} and @var{offset} appear to be for small
objects stored in larger ones, for example a @code{short} in an
@code{int} register.  @var{width} is normally the number of bytes in the
type.  @var{offset} seems to always be zero.  @var{nbits} is the number
of bits in the type.

Note that type descriptor @samp{b} used for builtin types conflicts with
its use for Pascal space types (@pxref{Miscellaneous Types}); they can
be distinguished because the character following the type descriptor
will be a digit, @samp{(}, or @samp{-} for a Pascal space type, or
@samp{u} or @samp{s} for a builtin type.

@item w
Documented by AIX to define a wide character type, but their compiler
actually uses negative type numbers (@pxref{Negative Type Numbers}).

@item R @var{fp-type} ; @var{bytes} ;
Define a floating point type.  @var{fp-type} has one of the following values:

@table @code
@item 1 (NF_SINGLE)
IEEE 32-bit (single precision) floating point format.

@item 2 (NF_DOUBLE)
IEEE 64-bit (double precision) floating point format.

@item 3 (NF_COMPLEX)
@item 4 (NF_COMPLEX16)
@item 5 (NF_COMPLEX32)
@c "GDB source" really means @file{include/aout/stab_gnu.h}, but trying
@c to put that here got an overfull hbox.
These are for complex numbers.  A comment in the GDB source describes
them as Fortran @code{complex}, @code{double complex}, and
@code{complex*16}, respectively, but what does that mean?  (i.e., Single
precision?  Double precision?).

@item 6 (NF_LDOUBLE)
Long double.  This should probably only be used for Sun format
@code{long double}, and new codes should be used for other floating
point formats (@code{NF_DOUBLE} can be used if a @code{long double} is
really just an IEEE double, of course).
@end table

@var{bytes} is the number of bytes occupied by the type.  This allows a
debugger to perform some operations with the type even if it doesn't
understand @var{fp-type}.

@item g @var{type-information} ; @var{nbits}
Documented by AIX to define a floating type, but their compiler actually
uses negative type numbers (@pxref{Negative Type Numbers}).

@item c @var{type-information} ; @var{nbits}
Documented by AIX to define a complex type, but their compiler actually
uses negative type numbers (@pxref{Negative Type Numbers}).
@end table

The C @code{void} type is defined as a signed integral type 0 bits long:
@example
.stabs "void:t19=bs0;0;0",128,0,0,0
@end example
The Solaris compiler seems to omit the trailing semicolon in this case.
Getting sloppy in this way is not a swift move because if a type is
embedded in a more complex expression it is necessary to be able to tell
where it ends.

I'm not sure how a boolean type is represented.

@node Negative Type Numbers
@subsection Negative Type Numbers

This is the method used in XCOFF for defining builtin types.
Since the debugger knows about the builtin types anyway, the idea of
negative type numbers is simply to give a special type number which
indicates the builtin type.  There is no stab defining these types.

There are several subtle issues with negative type numbers.

One is the size of the type.  A builtin type (for example the C types
@code{int} or @code{long}) might have different sizes depending on
compiler options, the target architecture, the ABI, etc.  This issue
doesn't come up for IBM tools since (so far) they just target the
RS/6000; the sizes indicated below for each size are what the IBM
RS/6000 tools use.  To deal with differing sizes, either define separate
negative type numbers for each size (which works but requires changing
the debugger, and, unless you get both AIX dbx and GDB to accept the
change, introduces an incompatibility), or use a type attribute
(@pxref{String Field}) to define a new type with the appropriate size
(which merely requires a debugger which understands type attributes,
like AIX dbx or GDB).  For example,

@example
.stabs "boolean:t10=@@s8;-16",128,0,0,0
@end example

defines an 8-bit boolean type, and

@example
.stabs "boolean:t10=@@s64;-16",128,0,0,0
@end example

defines a 64-bit boolean type.

A similar issue is the format of the type.  This comes up most often for
floating-point types, which could have various formats (particularly
extended doubles, which vary quite a bit even among IEEE systems).
Again, it is best to define a new negative type number for each
different format; changing the format based on the target system has
various problems.  One such problem is that the Alpha has both VAX and
IEEE floating types.  One can easily imagine one library using the VAX
types and another library in the same executable using the IEEE types.
Another example is that the interpretation of whether a boolean is true
or false can be based on the least significant bit, most significant
bit, whether it is zero, etc., and different compilers (or different
options to the same compiler) might provide different kinds of boolean.

The last major issue is the names of the types.  The name of a given
type depends @emph{only} on the negative type number given; these do not
vary depending on the language, the target system, or anything else.
One can always define separate type numbers---in the following list you
will see for example separate @code{int} and @code{integer*4} types
which are identical except for the name.  But compatibility can be
maintained by not inventing new negative type numbers and instead just
defining a new type with a new name.  For example:

@example
.stabs "CARDINAL:t10=-8",128,0,0,0
@end example

Here is the list of negative type numbers.  The phrase @dfn{integral
type} is used to mean twos-complement (I strongly suspect that all
machines which use stabs use twos-complement; most machines use
twos-complement these days).

@table @code
@item -1
@code{int}, 32 bit signed integral type.

@item -2
@code{char}, 8 bit type holding a character.   Both GDB and dbx on AIX
treat this as signed.  GCC uses this type whether @code{char} is signed
or not, which seems like a bad idea.  The AIX compiler (@code{xlc}) seems to
avoid this type; it uses -5 instead for @code{char}.

@item -3
@code{short}, 16 bit signed integral type.

@item -4
@code{long}, 32 bit signed integral type.

@item -5
@code{unsigned char}, 8 bit unsigned integral type.

@item -6
@code{signed char}, 8 bit signed integral type.

@item -7
@code{unsigned short}, 16 bit unsigned integral type.

@item -8
@code{unsigned int}, 32 bit unsigned integral type.

@item -9
@code{unsigned}, 32 bit unsigned integral type.

@item -10
@code{unsigned long}, 32 bit unsigned integral type.

@item -11
@code{void}, type indicating the lack of a value.

@item -12
@code{float}, IEEE single precision.

@item -13
@code{double}, IEEE double precision.

@item -14
@code{long double}, IEEE double precision.  The compiler claims the size
will increase in a future release, and for binary compatibility you have
to avoid using @code{long double}.  I hope when they increase it they
use a new negative type number.

@item -15
@code{integer}.  32 bit signed integral type.

@item -16
@code{boolean}.  32 bit type.  GDB and GCC assume that zero is false,
one is true, and other values have unspecified meaning.  I hope this
agrees with how the IBM tools use the type.

@item -17
@code{short real}.  IEEE single precision.

@item -18
@code{real}.  IEEE double precision.

@item -19
@code{stringptr}.  @xref{Strings}.

@item -20
@code{character}, 8 bit unsigned character type.

@item -21
@code{logical*1}, 8 bit type.  This Fortran type has a split
personality in that it is used for boolean variables, but can also be
used for unsigned integers.  0 is false, 1 is true, and other values are
non-boolean.

@item -22
@code{logical*2}, 16 bit type.  This Fortran type has a split
personality in that it is used for boolean variables, but can also be
used for unsigned integers.  0 is false, 1 is true, and other values are
non-boolean.

@item -23
@code{logical*4}, 32 bit type.  This Fortran type has a split
personality in that it is used for boolean variables, but can also be
used for unsigned integers.  0 is false, 1 is true, and other values are
non-boolean.

@item -24
@code{logical}, 32 bit type.  This Fortran type has a split
personality in that it is used for boolean variables, but can also be
used for unsigned integers.  0 is false, 1 is true, and other values are
non-boolean.

@item -25
@code{complex}.  A complex type consisting of two IEEE single-precision
floating point values.

@item -26
@code{complex}.  A complex type consisting of two IEEE double-precision
floating point values.

@item -27
@code{integer*1}, 8 bit signed integral type.

@item -28
@code{integer*2}, 16 bit signed integral type.

@item -29
@code{integer*4}, 32 bit signed integral type.

@item -30
@code{wchar}.  Wide character, 16 bits wide, unsigned (what format?
Unicode?).

@item -31
@code{long long}, 64 bit signed integral type.

@item -32
@code{unsigned long long}, 64 bit unsigned integral type.

@item -33
@code{logical*8}, 64 bit unsigned integral type.

@item -34
@code{integer*8}, 64 bit signed integral type.
@end table

@node Miscellaneous Types
@section Miscellaneous Types

@table @code
@item b @var{type-information} ; @var{bytes}
Pascal space type.  This is documented by IBM; what does it mean?

This use of the @samp{b} type descriptor can be distinguished
from its use for builtin integral types (@pxref{Builtin Type
Descriptors}) because the character following the type descriptor is
always a digit, @samp{(}, or @samp{-}.

@item B @var{type-information}
A volatile-qualified version of @var{type-information}.  This is
a Sun extension.  References and stores to a variable with a
volatile-qualified type must not be optimized or cached; they
must occur as the user specifies them.

@item d @var{type-information}
File of type @var{type-information}.  As far as I know this is only used
by Pascal.

@item k @var{type-information}
A const-qualified version of @var{type-information}.  This is a Sun
extension.  A variable with a const-qualified type cannot be modified.

@item M @var{type-information} ; @var{length}
Multiple instance type.  The type seems to composed of @var{length}
repetitions of @var{type-information}, for example @code{character*3} is
represented by @samp{M-2;3}, where @samp{-2} is a reference to a
character type (@pxref{Negative Type Numbers}).  I'm not sure how this
differs from an array.  This appears to be a Fortran feature.
@var{length} is a bound, like those in range types; see @ref{Subranges}.

@item S @var{type-information}
Pascal set type.  @var{type-information} must be a small type such as an
enumeration or a subrange, and the type is a bitmask whose length is
specified by the number of elements in @var{type-information}.

In CHILL, if it is a bitstring instead of a set, also use the @samp{S}
type attribute (@pxref{String Field}).

@item * @var{type-information}
Pointer to @var{type-information}.
@end table

@node Cross-References
@section Cross-References to Other Types

A type can be used before it is defined; one common way to deal with
that situation is just to use a type reference to a type which has not
yet been defined.

Another way is with the @samp{x} type descriptor, which is followed by
@samp{s} for a structure tag, @samp{u} for a union tag, or @samp{e} for
a enumerator tag, followed by the name of the tag, followed by @samp{:}.
If the name contains @samp{::} between a @samp{<} and @samp{>} pair (for
C@t{++} templates), such a @samp{::} does not end the name---only a single
@samp{:} ends the name; see @ref{Nested Symbols}.

For example, the following C declarations:

@example
struct foo;
struct foo *bar;
@end example

@noindent
produce:

@example
.stabs "bar:G16=*17=xsfoo:",32,0,0,0
@end example

Not all debuggers support the @samp{x} type descriptor, so on some
machines GCC does not use it.  I believe that for the above example it
would just emit a reference to type 17 and never define it, but I
haven't verified that.

Modula-2 imported types, at least on AIX, use the @samp{i} type
descriptor, which is followed by the name of the module from which the
type is imported, followed by @samp{:}, followed by the name of the
type.  There is then optionally a comma followed by type information for
the type.  This differs from merely naming the type (@pxref{Typedefs}) in
that it identifies the module; I don't understand whether the name of
the type given here is always just the same as the name we are giving
it, or whether this type descriptor is used with a nameless stab
(@pxref{String Field}), or what.  The symbol ends with @samp{;}.

@node Subranges
@section Subrange Types

The @samp{r} type descriptor defines a type as a subrange of another
type.  It is followed by type information for the type of which it is a
subrange, a semicolon, an integral lower bound, a semicolon, an
integral upper bound, and a semicolon.  The AIX documentation does not
specify the trailing semicolon, in an effort to specify array indexes
more cleanly, but a subrange which is not an array index has always
included a trailing semicolon (@pxref{Arrays}).

Instead of an integer, either bound can be one of the following:

@table @code
@item A @var{offset}
The bound is passed by reference on the stack at offset @var{offset}
from the argument list.  @xref{Parameters}, for more information on such
offsets.

@item T @var{offset}
The bound is passed by value on the stack at offset @var{offset} from
the argument list.

@item a @var{register-number}
The bound is passed by reference in register number
@var{register-number}.

@item t @var{register-number}
The bound is passed by value in register number @var{register-number}.

@item J
There is no bound.
@end table

Subranges are also used for builtin types; see @ref{Traditional Builtin Types}.

@node Arrays
@section Array Types

Arrays use the @samp{a} type descriptor.  Following the type descriptor
is the type of the index and the type of the array elements.  If the
index type is a range type, it ends in a semicolon; otherwise
(for example, if it is a type reference), there does not
appear to be any way to tell where the types are separated.  In an
effort to clean up this mess, IBM documents the two types as being
separated by a semicolon, and a range type as not ending in a semicolon
(but this is not right for range types which are not array indexes,
@pxref{Subranges}).  I think probably the best solution is to specify
that a semicolon ends a range type, and that the index type and element
type of an array are separated by a semicolon, but that if the index
type is a range type, the extra semicolon can be omitted.  GDB (at least
through version 4.9) doesn't support any kind of index type other than a
range anyway; I'm not sure about dbx.

It is well established, and widely used, that the type of the index,
unlike most types found in the stabs, is merely a type definition, not
type information (@pxref{String Field}) (that is, it need not start with
@samp{@var{type-number}=} if it is defining a new type).  According to a
comment in GDB, this is also true of the type of the array elements; it
gives @samp{ar1;1;10;ar1;1;10;4} as a legitimate way to express a two
dimensional array.  According to AIX documentation, the element type
must be type information.  GDB accepts either.

The type of the index is often a range type, expressed as the type
descriptor @samp{r} and some parameters.  It defines the size of the
array.  In the example below, the range @samp{r1;0;2;} defines an index
type which is a subrange of type 1 (integer), with a lower bound of 0
and an upper bound of 2.  This defines the valid range of subscripts of
a three-element C array.

For example, the definition:

@example
char char_vec[3] = @{'a','b','c'@};
@end example

@noindent
produces the output:

@example
.stabs "char_vec:G19=ar1;0;2;2",32,0,0,0
     .global _char_vec
     .align 4
_char_vec:
     .byte 97
     .byte 98
     .byte 99
@end example

If an array is @dfn{packed}, the elements are spaced more
closely than normal, saving memory at the expense of speed.  For
example, an array of 3-byte objects might, if unpacked, have each
element aligned on a 4-byte boundary, but if packed, have no padding.
One way to specify that something is packed is with type attributes
(@pxref{String Field}).  In the case of arrays, another is to use the
@samp{P} type descriptor instead of @samp{a}.  Other than specifying a
packed array, @samp{P} is identical to @samp{a}.

@c FIXME-what is it?  A pointer?
An open array is represented by the @samp{A} type descriptor followed by
type information specifying the type of the array elements.

@c FIXME: what is the format of this type?  A pointer to a vector of pointers?
An N-dimensional dynamic array is represented by

@example
D @var{dimensions} ; @var{type-information}
@end example

@c Does dimensions really have this meaning?  The AIX documentation
@c doesn't say.
@var{dimensions} is the number of dimensions; @var{type-information}
specifies the type of the array elements.

@c FIXME: what is the format of this type?  A pointer to some offsets in
@c another array?
A subarray of an N-dimensional array is represented by

@example
E @var{dimensions} ; @var{type-information}
@end example

@c Does dimensions really have this meaning?  The AIX documentation
@c doesn't say.
@var{dimensions} is the number of dimensions; @var{type-information}
specifies the type of the array elements.

@node Strings
@section Strings

Some languages, like C or the original Pascal, do not have string types,
they just have related things like arrays of characters.  But most
Pascals and various other languages have string types, which are
indicated as follows:

@table @code
@item n @var{type-information} ; @var{bytes}
@var{bytes} is the maximum length.  I'm not sure what
@var{type-information} is; I suspect that it means that this is a string
of @var{type-information} (thus allowing a string of integers, a string
of wide characters, etc., as well as a string of characters).  Not sure
what the format of this type is.  This is an AIX feature.

@item z @var{type-information} ; @var{bytes}
Just like @samp{n} except that this is a gstring, not an ordinary
string.  I don't know the difference.

@item N
Pascal Stringptr.  What is this?  This is an AIX feature.
@end table

Languages, such as CHILL which have a string type which is basically
just an array of characters use the @samp{S} type attribute
(@pxref{String Field}).

@node Enumerations
@section Enumerations

Enumerations are defined with the @samp{e} type descriptor.

@c FIXME: Where does this information properly go?  Perhaps it is
@c redundant with something we already explain.
The source line below declares an enumeration type at file scope.
The type definition is located after the @code{N_RBRAC} that marks the end of
the previous procedure's block scope, and before the @code{N_FUN} that marks
the beginning of the next procedure's block scope.  Therefore it does not
describe a block local symbol, but a file local one.

The source line:

@example
enum e_places @{first,second=3,last@};
@end example

@noindent
generates the following stab:

@example
.stabs "e_places:T22=efirst:0,second:3,last:4,;",128,0,0,0
@end example

The symbol descriptor (@samp{T}) says that the stab describes a
structure, enumeration, or union tag.  The type descriptor @samp{e},
following the @samp{22=} of the type definition narrows it down to an
enumeration type.  Following the @samp{e} is a list of the elements of
the enumeration.  The format is @samp{@var{name}:@var{value},}.  The
list of elements ends with @samp{;}.  The fact that @var{value} is
specified as an integer can cause problems if the value is large.  GCC
2.5.2 tries to output it in octal in that case with a leading zero,
which is probably a good thing, although GDB 4.11 supports octal only in
cases where decimal is perfectly good.  Negative decimal values are
supported by both GDB and dbx.

There is no standard way to specify the size of an enumeration type; it
is determined by the architecture (normally all enumerations types are
32 bits).  Type attributes can be used to specify an enumeration type of
another size for debuggers which support them; see @ref{String Field}.

Enumeration types are unusual in that they define symbols for the
enumeration values (@code{first}, @code{second}, and @code{third} in the
above example), and even though these symbols are visible in the file as
a whole (rather than being in a more local namespace like structure
member names), they are defined in the type definition for the
enumeration type rather than each having their own symbol.  In order to
be fast, GDB will only get symbols from such types (in its initial scan
of the stabs) if the type is the first thing defined after a @samp{T} or
@samp{t} symbol descriptor (the above example fulfills this
requirement).  If the type does not have a name, the compiler should
emit it in a nameless stab (@pxref{String Field}); GCC does this.

@node Structures
@section Structures

The encoding of structures in stabs can be shown with an example.

The following source code declares a structure tag and defines an
instance of the structure in global scope. Then a @code{typedef} equates the
structure tag with a new type.  Separate stabs are generated for the
structure tag, the structure @code{typedef}, and the structure instance.  The
stabs for the tag and the @code{typedef} are emitted when the definitions are
encountered.  Since the structure elements are not initialized, the
stab and code for the structure variable itself is located at the end
of the program in the bss section.

@example
struct s_tag @{
  int   s_int;
  float s_float;
  char  s_char_vec[8];
  struct s_tag* s_next;
@} g_an_s;

typedef struct s_tag s_typedef;
@end example

The structure tag has an @code{N_LSYM} stab type because, like the
enumeration, the symbol has file scope.  Like the enumeration, the
symbol descriptor is @samp{T}, for enumeration, structure, or tag type.
The type descriptor @samp{s} following the @samp{16=} of the type
definition narrows the symbol type to structure.

Following the @samp{s} type descriptor is the number of bytes the
structure occupies, followed by a description of each structure element.
The structure element descriptions are of the form
@samp{@var{name}:@var{type}, @var{bit offset from the start of the
struct}, @var{number of bits in the element}}.

@c FIXME: phony line break.  Can probably be fixed by using an example
@c with fewer fields.
@example
# @r{128 is N_LSYM}
.stabs "s_tag:T16=s20s_int:1,0,32;s_float:12,32,32;
        s_char_vec:17=ar1;0;7;2,64,64;s_next:18=*16,128,32;;",128,0,0,0
@end example

In this example, the first two structure elements are previously defined
types.  For these, the type following the @samp{@var{name}:} part of the
element description is a simple type reference.  The other two structure
elements are new types.  In this case there is a type definition
embedded after the @samp{@var{name}:}.  The type definition for the
array element looks just like a type definition for a stand-alone array.
The @code{s_next} field is a pointer to the same kind of structure that
the field is an element of.  So the definition of structure type 16
contains a type definition for an element which is a pointer to type 16.

If a field is a static member (this is a C@t{++} feature in which a single
variable appears to be a field of every structure of a given type) it
still starts out with the field name, a colon, and the type, but then
instead of a comma, bit position, comma, and bit size, there is a colon
followed by the name of the variable which each such field refers to.

If the structure has methods (a C@t{++} feature), they follow the non-method
fields; see @ref{Cplusplus}.

@node Typedefs
@section Giving a Type a Name

@findex N_LSYM, for types
@findex C_DECL, for types
To give a type a name, use the @samp{t} symbol descriptor.  The type
is specified by the type information (@pxref{String Field}) for the stab.
For example,

@example
.stabs "s_typedef:t16",128,0,0,0     # @r{128 is N_LSYM}
@end example

specifies that @code{s_typedef} refers to type number 16.  Such stabs
have symbol type @code{N_LSYM} (or @code{C_DECL} for XCOFF).  (The Sun
documentation mentions using @code{N_GSYM} in some cases).

If you are specifying the tag name for a structure, union, or
enumeration, use the @samp{T} symbol descriptor instead.  I believe C is
the only language with this feature.

If the type is an opaque type (I believe this is a Modula-2 feature),
AIX provides a type descriptor to specify it.  The type descriptor is
@samp{o} and is followed by a name.  I don't know what the name
means---is it always the same as the name of the type, or is this type
descriptor used with a nameless stab (@pxref{String Field})?  There
optionally follows a comma followed by type information which defines
the type of this type.  If omitted, a semicolon is used in place of the
comma and the type information, and the type is much like a generic
pointer type---it has a known size but little else about it is
specified.

@node Unions
@section Unions

@example
union u_tag @{
  int  u_int;
  float u_float;
  char* u_char;
@} an_u;
@end example

This code generates a stab for a union tag and a stab for a union
variable.  Both use the @code{N_LSYM} stab type.  If a union variable is
scoped locally to the procedure in which it is defined, its stab is
located immediately preceding the @code{N_LBRAC} for the procedure's block
start.

The stab for the union tag, however, is located preceding the code for
the procedure in which it is defined.  The stab type is @code{N_LSYM}.  This
would seem to imply that the union type is file scope, like the struct
type @code{s_tag}.  This is not true.  The contents and position of the stab
for @code{u_type} do not convey any information about its procedure local
scope.

@c FIXME: phony line break.  Can probably be fixed by using an example
@c with fewer fields.
@smallexample
# @r{128 is N_LSYM}
.stabs "u_tag:T23=u4u_int:1,0,32;u_float:12,0,32;u_char:21,0,32;;",
       128,0,0,0
@end smallexample

The symbol descriptor @samp{T}, following the @samp{name:} means that
the stab describes an enumeration, structure, or union tag.  The type
descriptor @samp{u}, following the @samp{23=} of the type definition,
narrows it down to a union type definition.  Following the @samp{u} is
the number of bytes in the union.  After that is a list of union element
descriptions.  Their format is @samp{@var{name}:@var{type}, @var{bit
offset into the union}, @var{number of bytes for the element};}.

The stab for the union variable is:

@example
.stabs "an_u:23",128,0,0,-20     # @r{128 is N_LSYM}
@end example

@samp{-20} specifies where the variable is stored (@pxref{Stack
Variables}).

@node Function Types
@section Function Types

Various types can be defined for function variables.  These types are
not used in defining functions (@pxref{Procedures}); they are used for
things like pointers to functions.

The simple, traditional, type is type descriptor @samp{f} is followed by
type information for the return type of the function, followed by a
semicolon.

This does not deal with functions for which the number and types of the
parameters are part of the type, as in Modula-2 or ANSI C.  AIX provides
extensions to specify these, using the @samp{f}, @samp{F}, @samp{p}, and
@samp{R} type descriptors.

First comes the type descriptor.  If it is @samp{f} or @samp{F}, this
type involves a function rather than a procedure, and the type
information for the return type of the function follows, followed by a
comma.  Then comes the number of parameters to the function and a
semicolon.  Then, for each parameter, there is the name of the parameter
followed by a colon (this is only present for type descriptors @samp{R}
and @samp{F} which represent Pascal function or procedure parameters),
type information for the parameter, a comma, 0 if passed by reference or
1 if passed by value, and a semicolon.  The type definition ends with a
semicolon.

For example, this variable definition:

@example
int (*g_pf)();
@end example

@noindent
generates the following code:

@example
.stabs "g_pf:G24=*25=f1",32,0,0,0
    .common _g_pf,4,"bss"
@end example

The variable defines a new type, 24, which is a pointer to another new
type, 25, which is a function returning @code{int}.

@node Macro define and undefine
@chapter Representation of #define and #undef

This section describes the stabs support for macro define and undefine
information, supported on some systems.  (e.g., with @option{-g3}
@option{-gstabs} when using GCC).

A @code{#define @var{macro-name} @var{macro-body}} is represented with
an @code{N_MAC_DEFINE} stab with a string field of
@code{@var{macro-name} @var{macro-body}}.
@findex N_MAC_DEFINE

An @code{#undef @var{macro-name}} is represented with an
@code{N_MAC_UNDEF} stabs with a string field of simply
@code{@var{macro-name}}.
@findex N_MAC_UNDEF

For both @code{N_MAC_DEFINE} and @code{N_MAC_UNDEF}, the desc field is
the line number within the file where the corresponding @code{#define}
or @code{#undef} occurred.

For example, the following C code:

@example
    #define NONE	42
    #define TWO(a, b)	(a + (a) + 2 * b)
    #define ONE(c)	(c + 19)

    main(int argc, char *argv[])
    @{
      func(NONE, TWO(10, 11));
      func(NONE, ONE(23));

    #undef ONE
    #define ONE(c)	(c + 23)

      func(NONE, ONE(-23));

      return (0);
    @}

    int global;

    func(int arg1, int arg2)
    @{
      global = arg1 + arg2;
    @}
@end example

@noindent
produces the following stabs (as well as many others):

@example
    .stabs	"NONE 42",54,0,1,0
    .stabs	"TWO(a,b) (a + (a) + 2 * b)",54,0,2,0
    .stabs	"ONE(c) (c + 19)",54,0,3,0
    .stabs	"ONE",58,0,10,0
    .stabs	"ONE(c) (c + 23)",54,0,11,0
@end example

@noindent
NOTE: In the above example, @code{54} is @code{N_MAC_DEFINE} and
@code{58} is @code{N_MAC_UNDEF}.

@node Symbol Tables
@chapter Symbol Information in Symbol Tables

This chapter describes the format of symbol table entries
and how stab assembler directives map to them.  It also describes the
transformations that the assembler and linker make on data from stabs.

@menu
* Symbol Table Format::
* Transformations On Symbol Tables::
@end menu

@node Symbol Table Format
@section Symbol Table Format

Each time the assembler encounters a stab directive, it puts
each field of the stab into a corresponding field in a symbol table
entry of its output file.  If the stab contains a string field, the
symbol table entry for that stab points to a string table entry
containing the string data from the stab.  Assembler labels become
relocatable addresses.  Symbol table entries in a.out have the format:

@c FIXME: should refer to external, not internal.
@example
struct internal_nlist @{
  unsigned long n_strx;         /* index into string table of name */
  unsigned char n_type;         /* type of symbol */
  unsigned char n_other;        /* misc info (usually empty) */
  unsigned short n_desc;        /* description field */
  bfd_vma n_value;              /* value of symbol */
@};
@end example

If the stab has a string, the @code{n_strx} field holds the offset in
bytes of the string within the string table.  The string is terminated
by a NUL character.  If the stab lacks a string (for example, it was
produced by a @code{.stabn} or @code{.stabd} directive), the
@code{n_strx} field is zero.

Symbol table entries with @code{n_type} field values greater than 0x1f
originated as stabs generated by the compiler (with one random
exception).  The other entries were placed in the symbol table of the
executable by the assembler or the linker.

@node Transformations On Symbol Tables
@section Transformations on Symbol Tables

The linker concatenates object files and does fixups of externally
defined symbols.

You can see the transformations made on stab data by the assembler and
linker by examining the symbol table after each pass of the build.  To
do this, use @samp{nm -ap}, which dumps the symbol table, including
debugging information, unsorted.  For stab entries the columns are:
@var{value}, @var{other}, @var{desc}, @var{type}, @var{string}.  For
assembler and linker symbols, the columns are: @var{value}, @var{type},
@var{string}.

The low 5 bits of the stab type tell the linker how to relocate the
value of the stab.  Thus for stab types like @code{N_RSYM} and
@code{N_LSYM}, where the value is an offset or a register number, the
low 5 bits are @code{N_ABS}, which tells the linker not to relocate the
value.

Where the value of a stab contains an assembly language label,
it is transformed by each build step.  The assembler turns it into a
relocatable address and the linker turns it into an absolute address.

@menu
* Transformations On Static Variables::
* Transformations On Global Variables::
* Stab Section Transformations::	   For some object file formats,
                                           things are a bit different.
@end menu

@node Transformations On Static Variables
@subsection Transformations on Static Variables

This source line defines a static variable at file scope:

@example
static int s_g_repeat
@end example

@noindent
The following stab describes the symbol:

@example
.stabs "s_g_repeat:S1",38,0,0,_s_g_repeat
@end example

@noindent
The assembler transforms the stab into this symbol table entry in the
@file{.o} file.  The location is expressed as a data segment offset.

@example
00000084 - 00 0000 STSYM s_g_repeat:S1
@end example

@noindent
In the symbol table entry from the executable, the linker has made the
relocatable address absolute.

@example
0000e00c - 00 0000 STSYM s_g_repeat:S1
@end example

@node Transformations On Global Variables
@subsection Transformations on Global Variables

Stabs for global variables do not contain location information. In
this case, the debugger finds location information in the assembler or
linker symbol table entry describing the variable.  The source line:

@example
char g_foo = 'c';
@end example

@noindent
generates the stab:

@example
.stabs "g_foo:G2",32,0,0,0
@end example

The variable is represented by two symbol table entries in the object
file (see below).  The first one originated as a stab.  The second one
is an external symbol.  The upper case @samp{D} signifies that the
@code{n_type} field of the symbol table contains 7, @code{N_DATA} with
local linkage.  The stab's value is zero since the value is not used for
@code{N_GSYM} stabs.  The value of the linker symbol is the relocatable
address corresponding to the variable.

@example
00000000 - 00 0000  GSYM g_foo:G2
00000080 D _g_foo
@end example

@noindent
These entries as transformed by the linker.  The linker symbol table
entry now holds an absolute address:

@example
00000000 - 00 0000  GSYM g_foo:G2
@dots{}
0000e008 D _g_foo
@end example

@node Stab Section Transformations
@subsection Transformations of Stabs in separate sections

For object file formats using stabs in separate sections (@pxref{Stab
Sections}), use @code{objdump --stabs} instead of @code{nm} to show the
stabs in an object or executable file.  @code{objdump} is a GNU utility;
Sun does not provide any equivalent.

The following example is for a stab whose value is an address is
relative to the compilation unit (@pxref{ELF Linker Relocation}).  For
example, if the source line

@example
static int ld = 5;
@end example

appears within a function, then the assembly language output from the
compiler contains:

@example
.Ddata.data:
@dots{}
        .stabs "ld:V(0,3)",0x26,0,4,.L18-Ddata.data    # @r{0x26 is N_STSYM}
@dots{}
.L18:
        .align 4
        .word 0x5
@end example

Because the value is formed by subtracting one symbol from another, the
value is absolute, not relocatable, and so the object file contains

@example
Symnum n_type n_othr n_desc n_value  n_strx String
31     STSYM  0      4      00000004 680    ld:V(0,3)
@end example

without any relocations, and the executable file also contains

@example
Symnum n_type n_othr n_desc n_value  n_strx String
31     STSYM  0      4      00000004 680    ld:V(0,3)
@end example

@node Cplusplus
@chapter GNU C@t{++} Stabs

@menu
* Class Names::			C++ class names are both tags and typedefs.
* Nested Symbols::		C++ symbol names can be within other types.
* Basic Cplusplus Types::
* Simple Classes::
* Class Instance::
* Methods::			Method definition
* Method Type Descriptor::      The @samp{#} type descriptor
* Member Type Descriptor::      The @samp{@@} type descriptor
* Protections::
* Method Modifiers::
* Virtual Methods::
* Inheritance::
* Virtual Base Classes::
* Static Members::
@end menu

@node Class Names
@section C@t{++} Class Names

In C@t{++}, a class name which is declared with @code{class}, @code{struct},
or @code{union}, is not only a tag, as in C, but also a type name.  Thus
there should be stabs with both @samp{t} and @samp{T} symbol descriptors
(@pxref{Typedefs}).

To save space, there is a special abbreviation for this case.  If the
@samp{T} symbol descriptor is followed by @samp{t}, then the stab
defines both a type name and a tag.

For example, the C@t{++} code

@example
struct foo @{int x;@};
@end example

can be represented as either

@example
.stabs "foo:T19=s4x:1,0,32;;",128,0,0,0       # @r{128 is N_LSYM}
.stabs "foo:t19",128,0,0,0
@end example

or

@example
.stabs "foo:Tt19=s4x:1,0,32;;",128,0,0,0
@end example

@node Nested Symbols
@section Defining a Symbol Within Another Type

In C@t{++}, a symbol (such as a type name) can be defined within another type.
@c FIXME: Needs example.

In stabs, this is sometimes represented by making the name of a symbol
which contains @samp{::}.  Such a pair of colons does not end the name
of the symbol, the way a single colon would (@pxref{String Field}).  I'm
not sure how consistently used or well thought out this mechanism is.
So that a pair of colons in this position always has this meaning,
@samp{:} cannot be used as a symbol descriptor.

For example, if the string for a stab is @samp{foo::bar::baz:t5=*6},
then @code{foo::bar::baz} is the name of the symbol, @samp{t} is the
symbol descriptor, and @samp{5=*6} is the type information.

@node Basic Cplusplus Types
@section Basic Types For C@t{++}

<< the examples that follow are based on a01.C >>


C@t{++} adds two more builtin types to the set defined for C.  These are
the unknown type and the vtable record type.  The unknown type, type
16, is defined in terms of itself like the void type.

The vtable record type, type 17, is defined as a structure type and
then as a structure tag.  The structure has four fields: delta, index,
pfn, and delta2.  pfn is the function pointer.

<< In boilerplate $vtbl_ptr_type, what are the fields delta,
index, and delta2 used for? >>

This basic type is present in all C@t{++} programs even if there are no
virtual methods defined.

@display
.stabs "struct_name:sym_desc(type)type_def(17)=type_desc(struct)struct_bytes(8)
        elem_name(delta):type_ref(short int),bit_offset(0),field_bits(16);
        elem_name(index):type_ref(short int),bit_offset(16),field_bits(16);
        elem_name(pfn):type_def(18)=type_desc(ptr to)type_ref(void),
                                    bit_offset(32),field_bits(32);
        elem_name(delta2):type_def(short int);bit_offset(32),field_bits(16);;"
        N_LSYM, NIL, NIL
@end display

@smallexample
.stabs "$vtbl_ptr_type:t17=s8
        delta:6,0,16;index:6,16,16;pfn:18=*15,32,32;delta2:6,32,16;;"
        ,128,0,0,0
@end smallexample

@display
.stabs "name:sym_dec(struct tag)type_ref($vtbl_ptr_type)",N_LSYM,NIL,NIL,NIL
@end display

@example
.stabs "$vtbl_ptr_type:T17",128,0,0,0
@end example

@node Simple Classes
@section Simple Class Definition

The stabs describing C@t{++} language features are an extension of the
stabs describing C.  Stabs representing C@t{++} class types elaborate
extensively on the stab format used to describe structure types in C.
Stabs representing class type variables look just like stabs
representing C language variables.

Consider the following very simple class definition.

@example
class baseA @{
public:
        int Adat;
        int Ameth(int in, char other);
@};
@end example

The class @code{baseA} is represented by two stabs.  The first stab describes
the class as a structure type.  The second stab describes a structure
tag of the class type.  Both stabs are of stab type @code{N_LSYM}.  Since the
stab is not located between an @code{N_FUN} and an @code{N_LBRAC} stab this indicates
that the class is defined at file scope.  If it were, then the @code{N_LSYM}
would signify a local variable.

A stab describing a C@t{++} class type is similar in format to a stab
describing a C struct, with each class member shown as a field in the
structure.  The part of the struct format describing fields is
expanded to include extra information relevant to C@t{++} class members.
In addition, if the class has multiple base classes or virtual
functions the struct format outside of the field parts is also
augmented.

In this simple example the field part of the C@t{++} class stab
representing member data looks just like the field part of a C struct
stab.  The section on protections describes how its format is
sometimes extended for member data.

The field part of a C@t{++} class stab representing a member function
differs substantially from the field part of a C struct stab.  It
still begins with @samp{name:} but then goes on to define a new type number
for the member function, describe its return type, its argument types,
its protection level, any qualifiers applied to the method definition,
and whether the method is virtual or not.  If the method is virtual
then the method description goes on to give the vtable index of the
method, and the type number of the first base class defining the
method.

When the field name is a method name it is followed by two colons rather
than one.  This is followed by a new type definition for the method.
This is a number followed by an equal sign and the type of the method.
Normally this will be a type declared using the @samp{#} type
descriptor; see @ref{Method Type Descriptor}; static member functions
are declared using the @samp{f} type descriptor instead; see
@ref{Function Types}.

The format of an overloaded operator method name differs from that of
other methods.  It is @samp{op$::@var{operator-name}.} where
@var{operator-name} is the operator name such as @samp{+} or @samp{+=}.
The name ends with a period, and any characters except the period can
occur in the @var{operator-name} string.

The next part of the method description represents the arguments to the
method, preceded by a colon and ending with a semi-colon.  The types of
the arguments are expressed in the same way argument types are expressed
in C@t{++} name mangling.  In this example an @code{int} and a @code{char}
map to @samp{ic}.

This is followed by a number, a letter, and an asterisk or period,
followed by another semicolon.  The number indicates the protections
that apply to the member function.  Here the 2 means public.  The
letter encodes any qualifier applied to the method definition.  In
this case, @samp{A} means that it is a normal function definition.  The dot
shows that the method is not virtual.  The sections that follow
elaborate further on these fields and describe the additional
information present for virtual methods.


@display
.stabs "class_name:sym_desc(type)type_def(20)=type_desc(struct)struct_bytes(4)
        field_name(Adat):type(int),bit_offset(0),field_bits(32);

        method_name(Ameth)::type_def(21)=type_desc(method)return_type(int);
        :arg_types(int char);
        protection(public)qualifier(normal)virtual(no);;"
        N_LSYM,NIL,NIL,NIL
@end display

@smallexample
.stabs "baseA:t20=s4Adat:1,0,32;Ameth::21=##1;:ic;2A.;;",128,0,0,0

.stabs "class_name:sym_desc(struct tag)",N_LSYM,NIL,NIL,NIL

.stabs "baseA:T20",128,0,0,0
@end smallexample

@node Class Instance
@section Class Instance

As shown above, describing even a simple C@t{++} class definition is
accomplished by massively extending the stab format used in C to
describe structure types.  However, once the class is defined, C stabs
with no modifications can be used to describe class instances.  The
following source:

@example
main () @{
        baseA AbaseA;
@}
@end example

@noindent
yields the following stab describing the class instance.  It looks no
different from a standard C stab describing a local variable.

@display
.stabs "name:type_ref(baseA)", N_LSYM, NIL, NIL, frame_ptr_offset
@end display

@example
.stabs "AbaseA:20",128,0,0,-20
@end example

@node Methods
@section Method Definition

The class definition shown above declares Ameth.  The C@t{++} source below
defines Ameth:

@example
int
baseA::Ameth(int in, char other)
@{
        return in;
@};
@end example


This method definition yields three stabs following the code of the
method.  One stab describes the method itself and following two describe
its parameters.  Although there is only one formal argument all methods
have an implicit argument which is the @code{this} pointer.  The @code{this}
pointer is a pointer to the object on which the method was called.  Note
that the method name is mangled to encode the class name and argument
types.  Name mangling is described in the @sc{arm} (@cite{The Annotated
C++ Reference Manual}, by Ellis and Stroustrup, @sc{isbn}
0-201-51459-1); @file{gpcompare.texi} in Cygnus GCC distributions
describes the differences between GNU mangling and @sc{arm}
mangling.
@c FIXME: Use @xref, especially if this is generally installed in the
@c info tree.
@c FIXME: This information should be in a net release, either of GCC or
@c GDB.  But gpcompare.texi doesn't seem to be in the FSF GCC.

@example
.stabs "name:symbol_descriptor(global function)return_type(int)",
        N_FUN, NIL, NIL, code_addr_of_method_start

.stabs "Ameth__5baseAic:F1",36,0,0,_Ameth__5baseAic
@end example

Here is the stab for the @code{this} pointer implicit argument.  The
name of the @code{this} pointer is always @code{this}.  Type 19, the
@code{this} pointer is defined as a pointer to type 20, @code{baseA},
but a stab defining @code{baseA} has not yet been emitted.  Since the
compiler knows it will be emitted shortly, here it just outputs a cross
reference to the undefined symbol, by prefixing the symbol name with
@samp{xs}.

@example
.stabs "name:sym_desc(register param)type_def(19)=
        type_desc(ptr to)type_ref(baseA)=
        type_desc(cross-reference to)baseA:",N_RSYM,NIL,NIL,register_number

.stabs "this:P19=*20=xsbaseA:",64,0,0,8
@end example

The stab for the explicit integer argument looks just like a parameter
to a C function.  The last field of the stab is the offset from the
argument pointer, which in most systems is the same as the frame
pointer.

@example
.stabs "name:sym_desc(value parameter)type_ref(int)",
        N_PSYM,NIL,NIL,offset_from_arg_ptr

.stabs "in:p1",160,0,0,72
@end example

<< The examples that follow are based on A1.C >>

@node Method Type Descriptor
@section The @samp{#} Type Descriptor

This is used to describe a class method.  This is a function which takes
an extra argument as its first argument, for the @code{this} pointer.

If the @samp{#} is immediately followed by another @samp{#}, the second
one will be followed by the return type and a semicolon.  The class and
argument types are not specified, and must be determined by demangling
the name of the method if it is available.

Otherwise, the single @samp{#} is followed by the class type, a comma,
the return type, a comma, and zero or more parameter types separated by
commas.  The list of arguments is terminated by a semicolon.  In the
debugging output generated by gcc, a final argument type of @code{void}
indicates a method which does not take a variable number of arguments.
If the final argument type of @code{void} does not appear, the method
was declared with an ellipsis.

Note that although such a type will normally be used to describe fields
in structures, unions, or classes, for at least some versions of the
compiler it can also be used in other contexts.

@node Member Type Descriptor
@section The @samp{@@} Type Descriptor

The @samp{@@} type descriptor is used for a
pointer-to-non-static-member-data type.  It is followed
by type information for the class (or union), a comma, and type
information for the member data.

The following C@t{++} source:

@smallexample
typedef int A::*int_in_a;
@end smallexample

generates the following stab:

@smallexample
.stabs "int_in_a:t20=21=@@19,1",128,0,0,0
@end smallexample

Note that there is a conflict between this and type attributes
(@pxref{String Field}); both use type descriptor @samp{@@}.
Fortunately, the @samp{@@} type descriptor used in this C@t{++} sense always
will be followed by a digit, @samp{(}, or @samp{-}, and type attributes
never start with those things.

@node Protections
@section Protections

In the simple class definition shown above all member data and
functions were publicly accessible.  The example that follows
contrasts public, protected and privately accessible fields and shows
how these protections are encoded in C@t{++} stabs.

If the character following the @samp{@var{field-name}:} part of the
string is @samp{/}, then the next character is the visibility.  @samp{0}
means private, @samp{1} means protected, and @samp{2} means public.
Debuggers should ignore visibility characters they do not recognize, and
assume a reasonable default (such as public) (GDB 4.11 does not, but
this should be fixed in the next GDB release).  If no visibility is
specified the field is public.  The visibility @samp{9} means that the
field has been optimized out and is public (there is no way to specify
an optimized out field with a private or protected visibility).
Visibility @samp{9} is not supported by GDB 4.11; this should be fixed
in the next GDB release.

The following C@t{++} source:

@example
class vis @{
private:
        int   priv;
protected:
        char  prot;
public:
        float pub;
@};
@end example

@noindent
generates the following stab:

@example
# @r{128 is N_LSYM}
.stabs "vis:T19=s12priv:/01,0,32;prot:/12,32,8;pub:12,64,32;;",128,0,0,0
@end example

@samp{vis:T19=s12} indicates that type number 19 is a 12 byte structure
named @code{vis} The @code{priv} field has public visibility
(@samp{/0}), type int (@samp{1}), and offset and size @samp{,0,32;}.
The @code{prot} field has protected visibility (@samp{/1}), type char
(@samp{2}) and offset and size @samp{,32,8;}.  The @code{pub} field has
type float (@samp{12}), and offset and size @samp{,64,32;}.

Protections for member functions are signified by one digit embedded in
the field part of the stab describing the method.  The digit is 0 if
private, 1 if protected and 2 if public.  Consider the C@t{++} class
definition below:

@example
class all_methods @{
private:
        int   priv_meth(int in)@{return in;@};
protected:
        char  protMeth(char in)@{return in;@};
public:
        float pubMeth(float in)@{return in;@};
@};
@end example

It generates the following stab.  The digit in question is to the left
of an @samp{A} in each case.  Notice also that in this case two symbol
descriptors apply to the class name struct tag and struct type.

@display
.stabs "class_name:sym_desc(struct tag&type)type_def(21)=
        sym_desc(struct)struct_bytes(1)
        meth_name::type_def(22)=sym_desc(method)returning(int);
        :args(int);protection(private)modifier(normal)virtual(no);
        meth_name::type_def(23)=sym_desc(method)returning(char);
        :args(char);protection(protected)modifier(normal)virtual(no);
        meth_name::type_def(24)=sym_desc(method)returning(float);
        :args(float);protection(public)modifier(normal)virtual(no);;",
        N_LSYM,NIL,NIL,NIL
@end display

@smallexample
.stabs "all_methods:Tt21=s1priv_meth::22=##1;:i;0A.;protMeth::23=##2;:c;1A.;
        pubMeth::24=##12;:f;2A.;;",128,0,0,0
@end smallexample

@node Method Modifiers
@section Method Modifiers (@code{const}, @code{volatile}, @code{const volatile})

<< based on a6.C >>

In the class example described above all the methods have the normal
modifier.  This method modifier information is located just after the
protection information for the method.  This field has four possible
character values.  Normal methods use @samp{A}, const methods use
@samp{B}, volatile methods use @samp{C}, and const volatile methods use
@samp{D}.  Consider the class definition below:

@example
class A @{
public:
        int ConstMeth (int arg) const @{ return arg; @};
        char VolatileMeth (char arg) volatile @{ return arg; @};
        float ConstVolMeth (float arg) const volatile @{return arg; @};
@};
@end example

This class is described by the following stab:

@display
.stabs "class(A):sym_desc(struct)type_def(20)=type_desc(struct)struct_bytes(1)
        meth_name(ConstMeth)::type_def(21)sym_desc(method)
        returning(int);:arg(int);protection(public)modifier(const)virtual(no);
        meth_name(VolatileMeth)::type_def(22)=sym_desc(method)
        returning(char);:arg(char);protection(public)modifier(volatile)virt(no)
        meth_name(ConstVolMeth)::type_def(23)=sym_desc(method)
        returning(float);:arg(float);protection(public)modifier(const volatile)
        virtual(no);;", @dots{}
@end display

@example
.stabs "A:T20=s1ConstMeth::21=##1;:i;2B.;VolatileMeth::22=##2;:c;2C.;
             ConstVolMeth::23=##12;:f;2D.;;",128,0,0,0
@end example

@node Virtual Methods
@section Virtual Methods

<< The following examples are based on a4.C >>

The presence of virtual methods in a class definition adds additional
data to the class description.  The extra data is appended to the
description of the virtual method and to the end of the class
description.  Consider the class definition below:

@example
class A @{
public:
        int Adat;
        virtual int A_virt (int arg) @{ return arg; @};
@};
@end example

This results in the stab below describing class A.  It defines a new
type (20) which is an 8 byte structure.  The first field of the class
struct is @samp{Adat}, an integer, starting at structure offset 0 and
occupying 32 bits.

The second field in the class struct is not explicitly defined by the
C@t{++} class definition but is implied by the fact that the class
contains a virtual method.  This field is the vtable pointer.  The
name of the vtable pointer field starts with @samp{$vf} and continues with a
type reference to the class it is part of.  In this example the type
reference for class A is 20 so the name of its vtable pointer field is
@samp{$vf20}, followed by the usual colon.

Next there is a type definition for the vtable pointer type (21).
This is in turn defined as a pointer to another new type (22).

Type 22 is the vtable itself, which is defined as an array, indexed by
a range of integers between 0 and 1, and whose elements are of type
17.  Type 17 was the vtable record type defined by the boilerplate C@t{++}
type definitions, as shown earlier.

The bit offset of the vtable pointer field is 32.  The number of bits
in the field are not specified when the field is a vtable pointer.

Next is the method definition for the virtual member function @code{A_virt}.
Its description starts out using the same format as the non-virtual
member functions described above, except instead of a dot after the
@samp{A} there is an asterisk, indicating that the function is virtual.
Since is is virtual some addition information is appended to the end
of the method description.

The first number represents the vtable index of the method.  This is a
32 bit unsigned number with the high bit set, followed by a
semi-colon.

The second number is a type reference to the first base class in the
inheritance hierarchy defining the virtual member function.  In this
case the class stab describes a base class so the virtual function is
not overriding any other definition of the method.  Therefore the
reference is to the type number of the class that the stab is
describing (20).

This is followed by three semi-colons.  One marks the end of the
current sub-section, one marks the end of the method field, and the
third marks the end of the struct definition.

For classes containing virtual functions the very last section of the
string part of the stab holds a type reference to the first base
class.  This is preceded by @samp{~%} and followed by a final semi-colon.

@display
.stabs "class_name(A):type_def(20)=sym_desc(struct)struct_bytes(8)
        field_name(Adat):type_ref(int),bit_offset(0),field_bits(32);
        field_name(A virt func ptr):type_def(21)=type_desc(ptr to)type_def(22)=
        sym_desc(array)index_type_ref(range of int from 0 to 1);
        elem_type_ref(vtbl elem type),
        bit_offset(32);
        meth_name(A_virt)::typedef(23)=sym_desc(method)returning(int);
        :arg_type(int),protection(public)normal(yes)virtual(yes)
        vtable_index(1);class_first_defining(A);;;~%first_base(A);",
        N_LSYM,NIL,NIL,NIL
@end display

@c FIXME: bogus line break.
@example
.stabs "A:t20=s8Adat:1,0,32;$vf20:21=*22=ar1;0;1;17,32;
        A_virt::23=##1;:i;2A*-2147483647;20;;;~%20;",128,0,0,0
@end example

@node Inheritance
@section Inheritance

Stabs describing C@t{++} derived classes include additional sections that
describe the inheritance hierarchy of the class.  A derived class stab
also encodes the number of base classes.  For each base class it tells
if the base class is virtual or not, and if the inheritance is private
or public.  It also gives the offset into the object of the portion of
the object corresponding to each base class.

This additional information is embedded in the class stab following the
number of bytes in the struct.  First the number of base classes
appears bracketed by an exclamation point and a comma.

Then for each base type there repeats a series: a virtual character, a
visibility character, a number, a comma, another number, and a
semi-colon.

The virtual character is @samp{1} if the base class is virtual and
@samp{0} if not.  The visibility character is @samp{2} if the derivation
is public, @samp{1} if it is protected, and @samp{0} if it is private.
Debuggers should ignore virtual or visibility characters they do not
recognize, and assume a reasonable default (such as public and
non-virtual) (GDB 4.11 does not, but this should be fixed in the next
GDB release).

The number following the virtual and visibility characters is the offset
from the start of the object to the part of the object pertaining to the
base class.

After the comma, the second number is a type_descriptor for the base
type.  Finally a semi-colon ends the series, which repeats for each
base class.

The source below defines three base classes @code{A}, @code{B}, and
@code{C} and the derived class @code{D}.


@example
class A @{
public:
        int Adat;
        virtual int A_virt (int arg) @{ return arg; @};
@};

class B @{
public:
        int B_dat;
        virtual int B_virt (int arg) @{return arg; @};
@};

class C @{
public:
        int Cdat;
        virtual int C_virt (int arg) @{return arg; @};
@};

class D : A, virtual B, public C @{
public:
        int Ddat;
        virtual int A_virt (int arg ) @{ return arg+1; @};
        virtual int B_virt (int arg)  @{ return arg+2; @};
        virtual int C_virt (int arg)  @{ return arg+3; @};
        virtual int D_virt (int arg)  @{ return arg; @};
@};
@end example

Class stabs similar to the ones described earlier are generated for
each base class.

@c FIXME!!! the linebreaks in the following example probably make the
@c examples literally unusable, but I don't know any other way to get
@c them on the page.
@c One solution would be to put some of the type definitions into
@c separate stabs, even if that's not exactly what the compiler actually
@c emits.
@smallexample
.stabs "A:T20=s8Adat:1,0,32;$vf20:21=*22=ar1;0;1;17,32;
        A_virt::23=##1;:i;2A*-2147483647;20;;;~%20;",128,0,0,0

.stabs "B:Tt25=s8Bdat:1,0,32;$vf25:21,32;B_virt::26=##1;
        :i;2A*-2147483647;25;;;~%25;",128,0,0,0

.stabs "C:Tt28=s8Cdat:1,0,32;$vf28:21,32;C_virt::29=##1;
        :i;2A*-2147483647;28;;;~%28;",128,0,0,0
@end smallexample

In the stab describing derived class @code{D} below, the information about
the derivation of this class is encoded as follows.

@display
.stabs "derived_class_name:symbol_descriptors(struct tag&type)=
        type_descriptor(struct)struct_bytes(32)!num_bases(3),
        base_virtual(no)inheritance_public(no)base_offset(0),
        base_class_type_ref(A);
        base_virtual(yes)inheritance_public(no)base_offset(NIL),
        base_class_type_ref(B);
        base_virtual(no)inheritance_public(yes)base_offset(64),
        base_class_type_ref(C); @dots{}
@end display

@c FIXME! fake linebreaks.
@smallexample
.stabs "D:Tt31=s32!3,000,20;100,25;0264,28;$vb25:24,128;Ddat:
        1,160,32;A_virt::32=##1;:i;2A*-2147483647;20;;B_virt:
        :32:i;2A*-2147483647;25;;C_virt::32:i;2A*-2147483647;
        28;;D_virt::32:i;2A*-2147483646;31;;;~%20;",128,0,0,0
@end smallexample

@node Virtual Base Classes
@section Virtual Base Classes

A derived class object consists of a concatenation in memory of the data
areas defined by each base class, starting with the leftmost and ending
with the rightmost in the list of base classes.  The exception to this
rule is for virtual inheritance.  In the example above, class @code{D}
inherits virtually from base class @code{B}.  This means that an
instance of a @code{D} object will not contain its own @code{B} part but
merely a pointer to a @code{B} part, known as a virtual base pointer.

In a derived class stab, the base offset part of the derivation
information, described above, shows how the base class parts are
ordered.  The base offset for a virtual base class is always given as 0.
Notice that the base offset for @code{B} is given as 0 even though
@code{B} is not the first base class.  The first base class @code{A}
starts at offset 0.

The field information part of the stab for class @code{D} describes the field
which is the pointer to the virtual base class @code{B}. The vbase pointer
name is @samp{$vb} followed by a type reference to the virtual base class.
Since the type id for @code{B} in this example is 25, the vbase pointer name
is @samp{$vb25}.

@c FIXME!! fake linebreaks below
@smallexample
.stabs "D:Tt31=s32!3,000,20;100,25;0264,28;$vb25:24,128;Ddat:1,
       160,32;A_virt::32=##1;:i;2A*-2147483647;20;;B_virt::32:i;
       2A*-2147483647;25;;C_virt::32:i;2A*-2147483647;28;;D_virt:
       :32:i;2A*-2147483646;31;;;~%20;",128,0,0,0
@end smallexample

Following the name and a semicolon is a type reference describing the
type of the virtual base class pointer, in this case 24.  Type 24 was
defined earlier as the type of the @code{B} class @code{this} pointer.  The
@code{this} pointer for a class is a pointer to the class type.

@example
.stabs "this:P24=*25=xsB:",64,0,0,8
@end example

Finally the field offset part of the vbase pointer field description
shows that the vbase pointer is the first field in the @code{D} object,
before any data fields defined by the class.  The layout of a @code{D}
class object is a follows, @code{Adat} at 0, the vtable pointer for
@code{A} at 32, @code{Cdat} at 64, the vtable pointer for C at 96, the
virtual base pointer for @code{B} at 128, and @code{Ddat} at 160.


@node Static Members
@section Static Members

The data area for a class is a concatenation of the space used by the
data members of the class.  If the class has virtual methods, a vtable
pointer follows the class data.  The field offset part of each field
description in the class stab shows this ordering.

<< How is this reflected in stabs?  See Cygnus bug #677 for some info.  >>

@node Stab Types
@appendix Table of Stab Types

The following are all the possible values for the stab type field, for
a.out files, in numeric order.  This does not apply to XCOFF, but
it does apply to stabs in sections (@pxref{Stab Sections}).  Stabs in
ECOFF use these values but add 0x8f300 to distinguish them from non-stab
symbols.

The symbolic names are defined in the file @file{include/aout/stabs.def}.

@menu
* Non-Stab Symbol Types::	Types from 0 to 0x1f
* Stab Symbol Types::		Types from 0x20 to 0xff
@end menu

@node Non-Stab Symbol Types
@appendixsec Non-Stab Symbol Types

The following types are used by the linker and assembler, not by stab
directives.  Since this document does not attempt to describe aspects of
object file format other than the debugging format, no details are
given.

@c Try to get most of these to fit on a single line.
@iftex
@tableindent=1.5in
@end iftex

@table @code
@item 0x0     N_UNDF
Undefined symbol

@item 0x2     N_ABS
File scope absolute symbol

@item 0x3     N_ABS | N_EXT
External absolute symbol

@item 0x4     N_TEXT
File scope text symbol

@item 0x5     N_TEXT | N_EXT
External text symbol

@item 0x6     N_DATA
File scope data symbol

@item 0x7     N_DATA | N_EXT
External data symbol

@item 0x8     N_BSS
File scope BSS symbol

@item 0x9     N_BSS | N_EXT
External BSS symbol

@item 0x0c    N_FN_SEQ
Same as @code{N_FN}, for Sequent compilers

@item 0x0a    N_INDR
Symbol is indirected to another symbol

@item 0x12    N_COMM
Common---visible after shared library dynamic link

@item 0x14 N_SETA
@itemx 0x15 N_SETA | N_EXT
Absolute set element

@item 0x16 N_SETT
@itemx 0x17 N_SETT | N_EXT
Text segment set element

@item 0x18 N_SETD
@itemx 0x19 N_SETD | N_EXT
Data segment set element

@item 0x1a N_SETB
@itemx 0x1b N_SETB | N_EXT
BSS segment set element

@item 0x1c N_SETV
@itemx 0x1d N_SETV | N_EXT
Pointer to set vector

@item 0x1e N_WARNING
Print a warning message during linking

@item 0x1f    N_FN
File name of a @file{.o} file
@end table

@node Stab Symbol Types
@appendixsec Stab Symbol Types

The following symbol types indicate that this is a stab.  This is the
full list of stab numbers, including stab types that are used in
languages other than C.

@table @code
@item 0x20     N_GSYM
Global symbol; see @ref{Global Variables}.

@item 0x22     N_FNAME
Function name (for BSD Fortran); see @ref{Procedures}.

@item 0x24     N_FUN
Function name (@pxref{Procedures}) or text segment variable
(@pxref{Statics}).

@item 0x26 N_STSYM
Data segment file-scope variable; see @ref{Statics}.

@item 0x28 N_LCSYM
BSS segment file-scope variable; see @ref{Statics}.

@item 0x2a N_MAIN
Name of main routine; see @ref{Main Program}.

@item 0x2c N_ROSYM
Variable in @code{.rodata} section; see @ref{Statics}.

@item 0x30     N_PC
Global symbol (for Pascal); see @ref{N_PC}.

@item 0x32     N_NSYMS
Number of symbols (according to Ultrix V4.0); see @ref{N_NSYMS}.

@item 0x34     N_NOMAP
No DST map; see @ref{N_NOMAP}.

@item 0x36     N_MAC_DEFINE
Name and body of a @code{#define}d macro; see @ref{Macro define and undefine}.

@c FIXME: describe this solaris feature in the body of the text (see
@c comments in include/aout/stab.def).
@item 0x38 N_OBJ
Object file (Solaris2).

@item 0x3a     N_MAC_UNDEF
Name of an @code{#undef}ed macro; see @ref{Macro define and undefine}.

@c See include/aout/stab.def for (a little) more info.
@item 0x3c N_OPT
Debugger options (Solaris2).

@item 0x40     N_RSYM
Register variable; see @ref{Register Variables}.

@item 0x42     N_M2C
Modula-2 compilation unit; see @ref{N_M2C}.

@item 0x44     N_SLINE
Line number in text segment; see @ref{Line Numbers}.

@item 0x46     N_DSLINE
Line number in data segment; see @ref{Line Numbers}.

@item 0x48     N_BSLINE
Line number in bss segment; see @ref{Line Numbers}.

@item 0x48     N_BROWS
Sun source code browser, path to @file{.cb} file; see @ref{N_BROWS}.

@item 0x4a     N_DEFD
GNU Modula2 definition module dependency; see @ref{N_DEFD}.

@item 0x4c N_FLINE
Function start/body/end line numbers (Solaris2).

@item 0x50     N_EHDECL
GNU C@t{++} exception variable; see @ref{N_EHDECL}.

@item 0x50     N_MOD2
Modula2 info "for imc" (according to Ultrix V4.0); see @ref{N_MOD2}.

@item 0x54     N_CATCH
GNU C@t{++} @code{catch} clause; see @ref{N_CATCH}.

@item 0x60     N_SSYM
Structure of union element; see @ref{N_SSYM}.

@item 0x62 N_ENDM
Last stab for module (Solaris2).

@item 0x64     N_SO
Path and name of source file; see @ref{Source Files}.

@item 0x80 N_LSYM
Stack variable (@pxref{Stack Variables}) or type (@pxref{Typedefs}).

@item 0x82     N_BINCL
Beginning of an include file (Sun only); see @ref{Include Files}.

@item 0x84     N_SOL
Name of include file; see @ref{Include Files}.

@item 0xa0     N_PSYM
Parameter variable; see @ref{Parameters}.

@item 0xa2     N_EINCL
End of an include file; see @ref{Include Files}.

@item 0xa4     N_ENTRY
Alternate entry point; see @ref{Alternate Entry Points}.

@item 0xc0     N_LBRAC
Beginning of a lexical block; see @ref{Block Structure}.

@item 0xc2     N_EXCL
Place holder for a deleted include file; see @ref{Include Files}.

@item 0xc4     N_SCOPE
Modula2 scope information (Sun linker); see @ref{N_SCOPE}.

@item 0xe0     N_RBRAC
End of a lexical block; see @ref{Block Structure}.

@item 0xe2     N_BCOMM
Begin named common block; see @ref{Common Blocks}.

@item 0xe4     N_ECOMM
End named common block; see @ref{Common Blocks}.

@item 0xe8     N_ECOML
Member of a common block; see @ref{Common Blocks}.

@c FIXME: How does this really work?  Move it to main body of document.
@item 0xea N_WITH
Pascal @code{with} statement: type,,0,0,offset (Solaris2).

@item 0xf0     N_NBTEXT
Gould non-base registers; see @ref{Gould}.

@item 0xf2     N_NBDATA
Gould non-base registers; see @ref{Gould}.

@item 0xf4     N_NBBSS
Gould non-base registers; see @ref{Gould}.

@item 0xf6     N_NBSTS
Gould non-base registers; see @ref{Gould}.

@item 0xf8     N_NBLCS
Gould non-base registers; see @ref{Gould}.
@end table

@c Restore the default table indent
@iftex
@tableindent=.8in
@end iftex

@node Symbol Descriptors
@appendix Table of Symbol Descriptors

The symbol descriptor is the character which follows the colon in many
stabs, and which tells what kind of stab it is.  @xref{String Field},
for more information about their use.

@c Please keep this alphabetical
@table @code
@c In TeX, this looks great, digit is in italics.  But makeinfo insists
@c on putting it in `', not realizing that @var should override @code.
@c I don't know of any way to make makeinfo do the right thing.  Seems
@c like a makeinfo bug to me.
@item @var{digit}
@itemx (
@itemx -
Variable on the stack; see @ref{Stack Variables}.

@item :
C@t{++} nested symbol; see @xref{Nested Symbols}.

@item a
Parameter passed by reference in register; see @ref{Reference Parameters}.

@item b
Based variable; see @ref{Based Variables}.

@item c
Constant; see @ref{Constants}.

@item C
Conformant array bound (Pascal, maybe other languages); @ref{Conformant
Arrays}.  Name of a caught exception (GNU C@t{++}).  These can be
distinguished because the latter uses @code{N_CATCH} and the former uses
another symbol type.

@item d
Floating point register variable; see @ref{Register Variables}.

@item D
Parameter in floating point register; see @ref{Register Parameters}.

@item f
File scope function; see @ref{Procedures}.

@item F
Global function; see @ref{Procedures}.

@item G
Global variable; see @ref{Global Variables}.

@item i
@xref{Register Parameters}.

@item I
Internal (nested) procedure; see @ref{Nested Procedures}.

@item J
Internal (nested) function; see @ref{Nested Procedures}.

@item L
Label name (documented by AIX, no further information known).

@item m
Module; see @ref{Procedures}.

@item p
Argument list parameter; see @ref{Parameters}.

@item pP
@xref{Parameters}.

@item pF
Fortran Function parameter; see @ref{Parameters}.

@item P
Unfortunately, three separate meanings have been independently invented
for this symbol descriptor.  At least the GNU and Sun uses can be
distinguished by the symbol type.  Global Procedure (AIX) (symbol type
used unknown); see @ref{Procedures}.  Register parameter (GNU) (symbol
type @code{N_PSYM}); see @ref{Parameters}.  Prototype of function
referenced by this file (Sun @code{acc}) (symbol type @code{N_FUN}).

@item Q
Static Procedure; see @ref{Procedures}.

@item R
Register parameter; see @ref{Register Parameters}.

@item r
Register variable; see @ref{Register Variables}.

@item S
File scope variable; see @ref{Statics}.

@item s
Local variable (OS9000).

@item t
Type name; see @ref{Typedefs}.

@item T
Enumeration, structure, or union tag; see @ref{Typedefs}.

@item v
Parameter passed by reference; see @ref{Reference Parameters}.

@item V
Procedure scope static variable; see @ref{Statics}.

@item x
Conformant array; see @ref{Conformant Arrays}.

@item X
Function return variable; see @ref{Parameters}.
@end table

@node Type Descriptors
@appendix Table of Type Descriptors

The type descriptor is the character which follows the type number and
an equals sign.  It specifies what kind of type is being defined.
@xref{String Field}, for more information about their use.

@table @code
@item @var{digit}
@itemx (
Type reference; see @ref{String Field}.

@item -
Reference to builtin type; see @ref{Negative Type Numbers}.

@item #
Method (C@t{++}); see @ref{Method Type Descriptor}.

@item *
Pointer; see @ref{Miscellaneous Types}.

@item &
Reference (C@t{++}).

@item @@
Type Attributes (AIX); see @ref{String Field}.  Member (class and variable)
type (GNU C@t{++}); see @ref{Member Type Descriptor}.

@item a
Array; see @ref{Arrays}.

@item A
Open array; see @ref{Arrays}.

@item b
Pascal space type (AIX); see @ref{Miscellaneous Types}.  Builtin integer
type (Sun); see @ref{Builtin Type Descriptors}.  Const and volatile
qualified type (OS9000).

@item B
Volatile-qualified type; see @ref{Miscellaneous Types}.

@item c
Complex builtin type (AIX); see @ref{Builtin Type Descriptors}.
Const-qualified type (OS9000).

@item C
COBOL Picture type.  See AIX documentation for details.

@item d
File type; see @ref{Miscellaneous Types}.

@item D
N-dimensional dynamic array; see @ref{Arrays}.

@item e
Enumeration type; see @ref{Enumerations}.

@item E
N-dimensional subarray; see @ref{Arrays}.

@item f
Function type; see @ref{Function Types}.

@item F
Pascal function parameter; see @ref{Function Types}

@item g
Builtin floating point type; see @ref{Builtin Type Descriptors}.

@item G
COBOL Group.  See AIX documentation for details.

@item i
Imported type (AIX); see @ref{Cross-References}.  Volatile-qualified
type (OS9000).

@item k
Const-qualified type; see @ref{Miscellaneous Types}.

@item K
COBOL File Descriptor.  See AIX documentation for details.

@item M
Multiple instance type; see @ref{Miscellaneous Types}.

@item n
String type; see @ref{Strings}.

@item N
Stringptr; see @ref{Strings}.

@item o
Opaque type; see @ref{Typedefs}.

@item p
Procedure; see @ref{Function Types}.

@item P
Packed array; see @ref{Arrays}.

@item r
Range type; see @ref{Subranges}.

@item R
Builtin floating type; see @ref{Builtin Type Descriptors} (Sun).  Pascal
subroutine parameter; see @ref{Function Types} (AIX).  Detecting this
conflict is possible with careful parsing (hint: a Pascal subroutine
parameter type will always contain a comma, and a builtin type
descriptor never will).

@item s
Structure type; see @ref{Structures}.

@item S
Set type; see @ref{Miscellaneous Types}.

@item u
Union; see @ref{Unions}.

@item v
Variant record.  This is a Pascal and Modula-2 feature which is like a
union within a struct in C.  See AIX documentation for details.

@item w
Wide character; see @ref{Builtin Type Descriptors}.

@item x
Cross-reference; see @ref{Cross-References}.

@item Y
Used by IBM's xlC C@t{++} compiler (for structures, I think).

@item z
gstring; see @ref{Strings}.
@end table

@node Expanded Reference
@appendix Expanded Reference by Stab Type

@c FIXME: This appendix should go away; see N_PSYM or N_SO for an example.

For a full list of stab types, and cross-references to where they are
described, see @ref{Stab Types}.  This appendix just covers certain
stabs which are not yet described in the main body of this document;
eventually the information will all be in one place.

Format of an entry:

The first line is the symbol type (see @file{include/aout/stab.def}).

The second line describes the language constructs the symbol type
represents.

The third line is the stab format with the significant stab fields
named and the rest NIL.

Subsequent lines expand upon the meaning and possible values for each
significant stab field.

Finally, any further information.

@menu
* N_PC::			Pascal global symbol
* N_NSYMS::			Number of symbols
* N_NOMAP::			No DST map
* N_M2C::			Modula-2 compilation unit
* N_BROWS::			Path to .cb file for Sun source code browser
* N_DEFD::			GNU Modula2 definition module dependency
* N_EHDECL::			GNU C++ exception variable
* N_MOD2::			Modula2 information "for imc"
* N_CATCH::			GNU C++ "catch" clause
* N_SSYM::			Structure or union element
* N_SCOPE::			Modula2 scope information (Sun only)
* Gould::			non-base register symbols used on Gould systems
* N_LENG::			Length of preceding entry
@end menu

@node N_PC
@section N_PC

@deffn @code{.stabs} N_PC
@findex N_PC
Global symbol (for Pascal).

@example
"name" -> "symbol_name"  <<?>>
value  -> supposedly the line number (stab.def is skeptical)
@end example

@display
@file{stabdump.c} says:

global pascal symbol: name,,0,subtype,line
<< subtype? >>
@end display
@end deffn

@node N_NSYMS
@section N_NSYMS

@deffn @code{.stabn} N_NSYMS
@findex N_NSYMS
Number of symbols (according to Ultrix V4.0).

@display
        0, files,,funcs,lines (stab.def)
@end display
@end deffn

@node N_NOMAP
@section N_NOMAP

@deffn @code{.stabs} N_NOMAP
@findex N_NOMAP
No DST map for symbol (according to Ultrix V4.0).  I think this means a
variable has been optimized out.

@display
        name, ,0,type,ignored (stab.def)
@end display
@end deffn

@node N_M2C
@section N_M2C

@deffn @code{.stabs} N_M2C
@findex N_M2C
Modula-2 compilation unit.

@example
"string" -> "unit_name,unit_time_stamp[,code_time_stamp]"
desc   -> unit_number
value  -> 0 (main unit)
          1 (any other unit)
@end example

See @cite{Dbx and Dbxtool Interfaces}, 2nd edition, by Sun, 1988, for
more information.

@end deffn

@node N_BROWS
@section N_BROWS

@deffn @code{.stabs} N_BROWS
@findex N_BROWS
Sun source code browser, path to @file{.cb} file

<<?>>
"path to associated @file{.cb} file"

Note: N_BROWS has the same value as N_BSLINE.
@end deffn

@node N_DEFD
@section N_DEFD

@deffn @code{.stabn} N_DEFD
@findex N_DEFD
GNU Modula2 definition module dependency.

GNU Modula-2 definition module dependency.  The value is the
modification time of the definition file.  The other field is non-zero
if it is imported with the GNU M2 keyword @code{%INITIALIZE}.  Perhaps
@code{N_M2C} can be used if there are enough empty fields?
@end deffn

@node N_EHDECL
@section N_EHDECL

@deffn @code{.stabs} N_EHDECL
@findex N_EHDECL
GNU C@t{++} exception variable <<?>>.

"@var{string} is variable name"

Note: conflicts with @code{N_MOD2}.
@end deffn

@node N_MOD2
@section N_MOD2

@deffn @code{.stab?} N_MOD2
@findex N_MOD2
Modula2 info "for imc" (according to Ultrix V4.0)

Note: conflicts with @code{N_EHDECL}  <<?>>
@end deffn

@node N_CATCH
@section N_CATCH

@deffn @code{.stabn} N_CATCH
@findex N_CATCH
GNU C@t{++} @code{catch} clause

GNU C@t{++} @code{catch} clause.  The value is its address.  The desc field
is nonzero if this entry is immediately followed by a @code{CAUGHT} stab
saying what exception was caught.  Multiple @code{CAUGHT} stabs means
that multiple exceptions can be caught here.  If desc is 0, it means all
exceptions are caught here.
@end deffn

@node N_SSYM
@section N_SSYM

@deffn @code{.stabn} N_SSYM
@findex N_SSYM
Structure or union element.

The value is the offset in the structure.

<<?looking at structs and unions in C I didn't see these>>
@end deffn

@node N_SCOPE
@section N_SCOPE

@deffn @code{.stab?} N_SCOPE
@findex N_SCOPE
Modula2 scope information (Sun linker)
<<?>>
@end deffn

@node Gould
@section Non-base registers on Gould systems

@deffn @code{.stab?} N_NBTEXT
@deffnx @code{.stab?} N_NBDATA
@deffnx @code{.stab?} N_NBBSS
@deffnx @code{.stab?} N_NBSTS
@deffnx @code{.stab?} N_NBLCS
@findex N_NBTEXT
@findex N_NBDATA
@findex N_NBBSS
@findex N_NBSTS
@findex N_NBLCS
These are used on Gould systems for non-base registers syms.

However, the following values are not the values used by Gould; they are
the values which GNU has been documenting for these values for a long
time, without actually checking what Gould uses.  I include these values
only because perhaps some someone actually did something with the GNU
information (I hope not, why GNU knowingly assigned wrong values to
these in the header file is a complete mystery to me).

@example
240    0xf0     N_NBTEXT  ??
242    0xf2     N_NBDATA  ??
244    0xf4     N_NBBSS   ??
246    0xf6     N_NBSTS   ??
248    0xf8     N_NBLCS   ??
@end example
@end deffn

@node N_LENG
@section N_LENG

@deffn @code{.stabn} N_LENG
@findex N_LENG
Second symbol entry containing a length-value for the preceding entry.
The value is the length.
@end deffn

@node Questions
@appendix Questions and Anomalies

@itemize @bullet
@item
@c I think this is changed in GCC 2.4.5 to put the line number there.
For GNU C stabs defining local and global variables (@code{N_LSYM} and
@code{N_GSYM}), the desc field is supposed to contain the source
line number on which the variable is defined.  In reality the desc
field is always 0.  (This behavior is defined in @file{dbxout.c} and
putting a line number in desc is controlled by @samp{#ifdef
WINNING_GDB}, which defaults to false). GDB supposedly uses this
information if you say @samp{list @var{var}}.  In reality, @var{var} can
be a variable defined in the program and GDB says @samp{function
@var{var} not defined}.

@item
In GNU C stabs, there seems to be no way to differentiate tag types:
structures, unions, and enums (symbol descriptor @samp{T}) and typedefs
(symbol descriptor @samp{t}) defined at file scope from types defined locally
to a procedure or other more local scope.  They all use the @code{N_LSYM}
stab type.  Types defined at procedure scope are emitted after the
@code{N_RBRAC} of the preceding function and before the code of the
procedure in which they are defined.  This is exactly the same as
types defined in the source file between the two procedure bodies.
GDB over-compensates by placing all types in block #1, the block for
symbols of file scope.  This is true for default, @samp{-ansi} and
@samp{-traditional} compiler options. (Bugs gcc/1063, gdb/1066.)

@item
What ends the procedure scope?  Is it the proc block's @code{N_RBRAC} or the
next @code{N_FUN}?  (I believe its the first.)
@end itemize

@node Stab Sections
@appendix Using Stabs in Their Own Sections

Many object file formats allow tools to create object files with custom
sections containing any arbitrary data.  For any such object file
format, stabs can be embedded in special sections.  This is how stabs
are used with ELF and SOM, and aside from ECOFF and XCOFF, is how stabs
are used with COFF.

@menu
* Stab Section Basics::    How to embed stabs in sections
* ELF Linker Relocation::  Sun ELF hacks
@end menu

@node Stab Section Basics
@appendixsec How to Embed Stabs in Sections

The assembler creates two custom sections, a section named @code{.stab}
which contains an array of fixed length structures, one struct per stab,
and a section named @code{.stabstr} containing all the variable length
strings that are referenced by stabs in the @code{.stab} section.  The
byte order of the stabs binary data depends on the object file format.
For ELF, it matches the byte order of the ELF file itself, as determined
from the @code{EI_DATA} field in the @code{e_ident} member of the ELF
header.  For SOM, it is always big-endian (is this true??? FIXME).  For
COFF, it matches the byte order of the COFF headers.  The meaning of the
fields is the same as for a.out (@pxref{Symbol Table Format}), except
that the @code{n_strx} field is relative to the strings for the current
compilation unit (which can be found using the synthetic N_UNDF stab
described below), rather than the entire string table.

The first stab in the @code{.stab} section for each compilation unit is
synthetic, generated entirely by the assembler, with no corresponding
@code{.stab} directive as input to the assembler.  This stab contains
the following fields:

@table @code
@item n_strx
Offset in the @code{.stabstr} section to the source filename.

@item n_type
@code{N_UNDF}.

@item n_other
Unused field, always zero.
This may eventually be used to hold overflows from the count in
the @code{n_desc} field.

@item n_desc
Count of upcoming symbols, i.e., the number of remaining stabs for this
source file.

@item n_value
Size of the string table fragment associated with this source file, in
bytes.
@end table

The @code{.stabstr} section always starts with a null byte (so that string
offsets of zero reference a null string), followed by random length strings,
each of which is null byte terminated.

The ELF section header for the @code{.stab} section has its
@code{sh_link} member set to the section number of the @code{.stabstr}
section, and the @code{.stabstr} section has its ELF section
header @code{sh_type} member set to @code{SHT_STRTAB} to mark it as a
string table.  SOM and COFF have no way of linking the sections together
or marking them as string tables.

For COFF, the @code{.stab} and @code{.stabstr} sections may be simply
concatenated by the linker.  GDB then uses the @code{n_desc} fields to
figure out the extent of the original sections.  Similarly, the
@code{n_value} fields of the header symbols are added together in order
to get the actual position of the strings in a desired @code{.stabstr}
section.  Although this design obviates any need for the linker to
relocate or otherwise manipulate @code{.stab} and @code{.stabstr}
sections, it also requires some care to ensure that the offsets are
calculated correctly.  For instance, if the linker were to pad in
between the @code{.stabstr} sections before concatenating, then the
offsets to strings in the middle of the executable's @code{.stabstr}
section would be wrong.

The GNU linker is able to optimize stabs information by merging
duplicate strings and removing duplicate header file information
(@pxref{Include Files}).  When some versions of the GNU linker optimize
stabs in sections, they remove the leading @code{N_UNDF} symbol and
arranges for all the @code{n_strx} fields to be relative to the start of
the @code{.stabstr} section.

@node ELF Linker Relocation
@appendixsec Having the Linker Relocate Stabs in ELF 

This section describes some Sun hacks for Stabs in ELF; it does not
apply to COFF or SOM.

To keep linking fast, you don't want the linker to have to relocate very
many stabs.  Making sure this is done for @code{N_SLINE},
@code{N_RBRAC}, and @code{N_LBRAC} stabs is the most important thing
(see the descriptions of those stabs for more information).  But Sun's
stabs in ELF has taken this further, to make all addresses in the
@code{n_value} field (functions and static variables) relative to the
source file.  For the @code{N_SO} symbol itself, Sun simply omits the
address.  To find the address of each section corresponding to a given
source file, the compiler puts out symbols giving the address of each
section for a given source file.  Since these are ELF (not stab)
symbols, the linker relocates them correctly without having to touch the
stabs section.  They are named @code{Bbss.bss} for the bss section,
@code{Ddata.data} for the data section, and @code{Drodata.rodata} for
the rodata section.  For the text section, there is no such symbol (but
there should be, see below).  For an example of how these symbols work,
@xref{Stab Section Transformations}.  GCC does not provide these symbols;
it instead relies on the stabs getting relocated.  Thus addresses which
would normally be relative to @code{Bbss.bss}, etc., are already
relocated.  The Sun linker provided with Solaris 2.2 and earlier
relocates stabs using normal ELF relocation information, as it would do
for any section.  Sun has been threatening to kludge their linker to not
do this (to speed up linking), even though the correct way to avoid
having the linker do these relocations is to have the compiler no longer
output relocatable values.  Last I heard they had been talked out of the
linker kludge.  See Sun point patch 101052-01 and Sun bug 1142109.  With
the Sun compiler this affects @samp{S} symbol descriptor stabs
(@pxref{Statics}) and functions (@pxref{Procedures}).  In the latter
case, to adopt the clean solution (making the value of the stab relative
to the start of the compilation unit), it would be necessary to invent a
@code{Ttext.text} symbol, analogous to the @code{Bbss.bss}, etc.,
symbols.  I recommend this rather than using a zero value and getting
the address from the ELF symbols.

Finding the correct @code{Bbss.bss}, etc., symbol is difficult, because
the linker simply concatenates the @code{.stab} sections from each
@file{.o} file without including any information about which part of a
@code{.stab} section comes from which @file{.o} file.  The way GDB does
this is to look for an ELF @code{STT_FILE} symbol which has the same
name as the last component of the file name from the @code{N_SO} symbol
in the stabs (for example, if the file name is @file{../../gdb/main.c},
it looks for an ELF @code{STT_FILE} symbol named @code{main.c}).  This
loses if different files have the same name (they could be in different
directories, a library could have been copied from one system to
another, etc.).  It would be much cleaner to have the @code{Bbss.bss}
symbols in the stabs themselves.  Having the linker relocate them there
is no more work than having the linker relocate ELF symbols, and it
solves the problem of having to associate the ELF and stab symbols.
However, no one has yet designed or implemented such a scheme.

@node GNU Free Documentation License
@appendix GNU Free Documentation License
@include fdl.texi

@node Symbol Types Index
@unnumbered Symbol Types Index

@printindex fn

@bye
