This is stabs.info, produced by makeinfo version 4.11 from
/home/gccbuilder/work/mgcc-4.6/Release/build/arm-marvell-linux-uclibcgnueabi/gdb-tmp-src/gdb/doc/stabs.texinfo.

INFO-DIR-SECTION Software development
START-INFO-DIR-ENTRY
* Stabs: (stabs).                 The "stabs" debugging information format.
END-INFO-DIR-ENTRY

   Copyright (C) 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002,
2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 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".

   This document describes the stabs debugging symbol tables.

   Copyright (C) 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002,
2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 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".


File: stabs.info,  Node: Top,  Next: Overview,  Up: (dir)

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


File: stabs.info,  Node: Overview,  Next: Program Structure,  Prev: Top,  Up: Top

1 Overview of Stabs
*******************

"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 `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 (*note Symbol Descriptors::) and type
descriptors (*note 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.

   Other sources of information on stabs are `Dbx and Dbxtool
Interfaces', 2nd edition, by Sun, 1988, and `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


File: stabs.info,  Node: Flow,  Next: Stabs Format,  Up: Overview

1.1 Overview of Debugging Information Flow
==========================================

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

   With the `-g' option, GCC puts in the `.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 "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 `.o' file it is building.  The linker consolidates the `.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.


File: stabs.info,  Node: Stabs Format,  Next: String Field,  Prev: Flow,  Up: Overview

1.2 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 `.stabs' (string), `.stabn' (number), or `.stabd' (dot).  IBM's
XCOFF assembler uses `.stabx' (and some other directives such as
`.file' and `.bi') instead of `.stabs', `.stabn' or `.stabd'.

   The overall format of each class of stab is:

     .stabs "STRING",TYPE,OTHER,DESC,VALUE
     .stabn TYPE,OTHER,DESC,VALUE
     .stabd TYPE,OTHER,DESC
     .stabx "STRING",VALUE,TYPE,SDB-TYPE

   For `.stabn' and `.stabd', there is no STRING (the `n_strx' field is
zero; see *note Symbol Tables::).  For `.stabd', the VALUE field is
implicit and has the value of the current file location.  For `.stabx',
the SDB-TYPE field is unused for stabs and can always be set to zero.
The OTHER field is almost always unused and can be set to zero.

   The number in the TYPE field gives some basic information about
which type of stab this is (or whether it _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 STRING, DESC, or VALUE fields
present in the stab.  *Note Stab Types::, for a list in numeric order
of the valid TYPE field values for stab directives.


File: stabs.info,  Node: String Field,  Next: C Example,  Prev: Stabs Format,  Up: Overview

1.3 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:

     "NAME:SYMBOL-DESCRIPTOR TYPE-INFORMATION"

   NAME is the name of the symbol represented by the stab; it can
contain a pair of colons (*note Nested Symbols::).  NAME can be
omitted, which means the stab represents an unnamed object.  For
example, `:t10=*2' defines type 10 as a pointer to type 2, but does not
give the type a name.  Omitting the 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 SYMBOL-DESCRIPTOR following the `:' is an alphabetic character
that tells more specifically what kind of symbol the stab represents.
If the SYMBOL-DESCRIPTOR is omitted, but type information follows, then
the stab represents a local variable.  For a list of symbol
descriptors, see *note Symbol Descriptors::.  The `c' symbol descriptor
is an exception in that it is not followed by type information.  *Note
Constants::.

   TYPE-INFORMATION is either a TYPE-NUMBER, or `TYPE-NUMBER='.  A
TYPE-NUMBER alone is a type reference, referring directly to a type
that has already been defined.

   The `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 `=' and nested definitions.  Also, the Lucid
compiler will repeat `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 TYPE-DESCRIPTOR, and tells what kind of
type is about to be defined.  Any other values following the
TYPE-DESCRIPTOR vary, depending on the TYPE-DESCRIPTOR.  *Note Type
Descriptors::, for a list of TYPE-DESCRIPTOR values.  If a number
follows the `=' then the number is a TYPE-REFERENCE.  For a full
description of types, *note Types::.

   A TYPE-NUMBER is often a single number.  The GNU and Sun tools
additionally permit a TYPE-NUMBER to be a pair
(FILE-NUMBER,FILETYPE-NUMBER) (the parentheses appear in the string,
and serve to distinguish the two cases).  The FILE-NUMBER is 0 for the
base source file, 1 for the first included file, 2 for the next, and so
on.  The 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 `N_BINCL' optimization to
succeed more often; see *note Include Files::).

   There is an AIX extension for type attributes.  Following the `='
are any number of type attributes.  Each one starts with `@' and ends
with `;'.  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++ (*note Cplusplus::),
new attributes should not be defined which begin with a digit, `(', or
`-'; GDB may be unable to distinguish those from the C++ type
descriptor `@'.  The attributes are:

`aBOUNDARY'
     BOUNDARY is an integer specifying the alignment.  I assume it
     applies to all variables of this type.

`pINTEGER'
     Pointer class (for checking).  Not sure what this means, or how
     INTEGER is interpreted.

`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.

`sSIZE'
     Size in bits of a variable of this type.  This is fully supported
     by GDB 4.11 and later.

`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.

`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).


   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 `.stabs' directive into
several `.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 `?' instead of backslash.


File: stabs.info,  Node: C Example,  Next: Assembly Code,  Prev: String Field,  Up: Overview

1.4 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:

     main()
     {
             printf("Hello world");
     }

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


File: stabs.info,  Node: Assembly Code,  Prev: C Example,  Up: Overview

1.5 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.

     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


File: stabs.info,  Node: Program Structure,  Next: Constants,  Prev: Overview,  Up: Top

2 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.


File: stabs.info,  Node: Main Program,  Next: Source Files,  Up: Program Structure

2.1 Main Program
================

Most languages allow the main program to have any name.  The `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 `main'), but some C
compilers emit an `N_MAIN' stab for the `main' function.  I'm not sure
how XCOFF handles this.


File: stabs.info,  Node: Source Files,  Next: Include Files,  Prev: Main Program,  Up: Program Structure

2.2 Paths and Names of the Source Files
=======================================

Before any other stabs occur, there must be a stab specifying the source
file.  This information is contained in a symbol of stab type `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.

`N_SO_AS' (0x1)
     Assembly language

`N_SO_C'  (0x2)
     K&R traditional C

`N_SO_ANSI_C' (0x3)
     ANSI C

`N_SO_CC'  (0x4)
     C++

`N_SO_FORTRAN' (0x5)
     Fortran

`N_SO_PASCAL' (0x6)
     Pascal

`N_SO_FORTRAN90' (0x7)
     Fortran90

`N_SO_OBJC' (0x32)
     Objective-C

`N_SO_OBJCPLUS' (0x33)
     Objective-C++

   Some compilers (for example, GCC2 and SunOS4 `/bin/cc') also include
the directory in which the source was compiled, in a second `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
`cfront' C++ compiler can have additional `N_SO' symbols for
nonexistent source files after the `N_SO' for the real source file;
these are believed to contain no useful information.

   For example:

     .stabs "/cygint/s1/users/jcm/play/",100,0,0,Ltext0     # 100 is N_SO
     .stabs "hello.c",100,0,0,Ltext0
             .text
     Ltext0:

   Instead of `N_SO' symbols, XCOFF uses a `.file' assembler directive
which assembles to a `C_FILE' symbol; explaining this in detail is
outside the scope of this document.

   If it is useful to indicate the end of a source file, this is done
with an `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 `N_SO' for a different
source file, or a symbol ending in `.o' (which at least some linkers
insert to mark the start of a new `.o' file).


File: stabs.info,  Node: Include Files,  Next: Line Numbers,  Prev: Source Files,  Up: Program Structure

2.3 Names of Include Files
==========================

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

   An `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
`N_SOL' symbol with the name of the main source file.

   The `N_BINCL' approach works as follows.  An `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 `N_EINCL' symbol
(which has no string field).  In an object file, there is no
significant data in the `N_EINCL' symbol.  `N_BINCL' and `N_EINCL' can
be nested.

   If the linker detects that two source files have identical stabs
between an `N_BINCL' and `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 `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
`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 `N_EXCL' symbol is the same as the value of the `N_BINCL'
symbol it replaces.  This information can be used to match up `N_EXCL'
and `N_BINCL' symbols which have the same filename.  The `N_EINCL'
value, and the values of the other and description fields for all
three, appear to always be zero.

   For the start of an include file in XCOFF, use the `.bi' assembler
directive, which generates a `C_BINCL' symbol.  A `.ei' directive,
which generates a `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.  `C_BINCL'
and `C_EINCL' do not nest.


File: stabs.info,  Node: Line Numbers,  Next: Procedures,  Prev: Include Files,  Up: Program Structure

2.4 Line Numbers
================

An `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 (*note Stab Sections::), it is relative
to the function in which the `N_SLINE' symbol occurs.

   GNU documents `N_DSLINE' and `N_BSLINE' symbols for line numbers in
the data or bss segments, respectively.  They are identical to
`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 `C_BINCL' method of marking include files (*note Include
Files::).


File: stabs.info,  Node: Procedures,  Next: Nested Procedures,  Prev: Line Numbers,  Up: Program Structure

2.5 Procedures
==============

All of the following stabs normally use the `N_FUN' symbol type.
However, Sun's `acc' compiler on SunOS4 uses `N_GSYM' and `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 `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).

   A function is represented by an `F' symbol descriptor for a global
(extern) function, and `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 *note ELF Linker
Relocation:: for more information on linker relocation of stabs in ELF
files.  For XCOFF, the stab uses the `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 `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 `N_SLINE'
symbol.

   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 `;'.  An argument type of 0 means that additional arguments
are being passed, whose types and number may vary (`...' 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 (*note
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 `float' argument, the
value is passed as a `double' but then converted to a `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 `P'
followed by the return type of the function, followed by the arguments,
each preceded by `;', as in a stab with symbol descriptor `f' or `F'.
This use of symbol descriptor `P' can be distinguished from its use for
register parameters (*note Register Parameters::) by the fact that it
has symbol type `N_FUN'.

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

   Procedures (functions which do not return values) are represented as
functions returning the `void' type in C.  I don't see why this couldn't
be used for all languages (inventing a `void' type for this purpose if
necessary), but the AIX documentation defines `I', `P', and `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 `main' which
returns type number `1'.  The `_main' specified for the value is a
reference to an assembler label which is used to fill in the start
address of the function.

     .stabs "main:F1",36,0,0,_main      # 36 is N_FUN

   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 `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.


File: stabs.info,  Node: Nested Procedures,  Next: Block Structure,  Prev: Procedures,  Up: Program Structure

2.6 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 `:').  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:

     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);
     }

produces the stabs:

     .stabs "baz:f1,baz,bar",36,0,0,_baz.15         # 36 is N_FUN
     .stabs "bar:f1,bar,foo",36,0,0,_bar.12
     .stabs "foo:F1",36,0,0,_foo


File: stabs.info,  Node: Block Structure,  Next: Alternate Entry Points,  Prev: Nested Procedures,  Up: Program Structure

2.7 Block Structure
===================

The program's block structure is represented by the `N_LBRAC' (left
brace) and the `N_RBRAC' (right brace) stab types.  The variables
defined inside a block precede the `N_LBRAC' symbol for most compilers,
including GCC.  Other compilers, such as the Convex, Acorn RISC
machine, and Sun `acc' compilers, put the variables after the `N_LBRAC'
symbol.  The values of the `N_LBRAC' and `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
(*note Stab Sections::), they are relative to the function in which
they occur.

   The `N_LBRAC' and `N_RBRAC' stabs that describe the block scope of a
procedure are located after the `N_FUN' stab that represents the
procedure itself.

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

   For XCOFF, block scope is indicated with `C_BLOCK' symbols.  If the
name of the symbol is `.bb', then it is the beginning of the block; if
the name of the symbol is `.be'; it is the end of the block.


File: stabs.info,  Node: Alternate Entry Points,  Prev: Block Structure,  Up: Program Structure

2.8 Alternate Entry Points
==========================

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 `N_ENTRY' stab is for this; however, the Sun FORTRAN
compiler doesn't use it.  According to AIX documentation, only the name
of a `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 `N_ENTRY' stab was
the address of the alternate entry point, but I don't know the source
for that information.


File: stabs.info,  Node: Constants,  Next: Variables,  Prev: Program Structure,  Up: Top

3 Constants
***********

The `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 `=' and one of the following:

`b VALUE'
     Boolean constant.  VALUE is a numeric value; I assume it is 0 for
     false or 1 for true.

`c VALUE'
     Character constant.  VALUE is the numeric value of the constant.

`e TYPE-INFORMATION , VALUE'
     Constant whose value can be represented as integral.
     TYPE-INFORMATION is the type of the constant, as it would appear
     after a symbol descriptor (*note String Field::).  VALUE is the
     numeric value of the constant.  GDB 4.9 does not actually get the
     right value if VALUE does not fit in a host `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.

`i VALUE'
     Integer constant.  VALUE is the numeric value.  The type is some
     sort of generic integer type (for GDB, a host `int'); to specify
     the type explicitly, use `e' instead.

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

`s STRING'
     String constant.  STRING is a string enclosed in either `'' (in
     which case `'' characters within the string are represented as
     `\'' or `"' (in which case `"' characters within the string are
     represented as `\"').

`S TYPE-INFORMATION , ELEMENTS , BITS , PATTERN'
     Set constant.  TYPE-INFORMATION is the type of the constant, as it
     would appear after a symbol descriptor (*note String Field::).
     ELEMENTS is the number of elements in the set (does this means how
     many bits of PATTERN are actually used, which would be redundant
     with the type, or perhaps the number of bits set in PATTERN?  I
     don't get it), BITS is the number of bits in the constant (meaning
     it specifies the length of PATTERN, I think), and 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 PATTERN should be understood
     to be target, not host, byte order and format.

   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 `;'.


File: stabs.info,  Node: Variables,  Next: Types,  Prev: Constants,  Up: Top

4 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.


File: stabs.info,  Node: Stack Variables,  Next: Global Variables,  Up: Variables

4.1 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 "automatic"), it
can be allocated in a register (*note Register Variables::) or on the
stack.

   Each variable allocated on the stack has a stab with the symbol
descriptor omitted.  Since type information should begin with a digit,
`-', or `(', 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
`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 `N_LSYM' stab type, or `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 *note Block Structure::.

   For example, the following C code:

     int
     main ()
     {
       int x;
     }

   produces the following stabs:

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

   See *note Procedures:: for more information on the `N_FUN' stab, and
*note Block Structure:: for more information on the `N_LBRAC' and
`N_RBRAC' stabs.


File: stabs.info,  Node: Global Variables,  Next: Register Variables,  Prev: Stack Variables,  Up: Variables

4.2 Global Variables
====================

A variable whose scope is not specific to just one source file is
represented by the `G' symbol descriptor.  These stabs use the `N_GSYM'
stab type (C_GSYM for XCOFF).  The type information for the stab (*note
String Field::) gives the type of the variable.

   For example, the following source code:

     char g_foo = 'c';

yields the following assembly code:

     .stabs "g_foo:G2",32,0,0,0     # 32 is N_GSYM
          .global _g_foo
          .data
     _g_foo:
          .byte 99

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

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


File: stabs.info,  Node: Register Variables,  Next: Common Blocks,  Prev: Global Variables,  Up: Variables

4.3 Register Variables
======================

Register variables have their own stab type, `N_RSYM' (`C_RSYM' for
XCOFF), and their own symbol descriptor, `r'.  The stab's value is the
number of the register where the variable data will be stored.

   AIX defines a separate symbol descriptor `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 `d'.

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

     register int g_bar asm ("%g5");

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


File: stabs.info,  Node: Common Blocks,  Next: Statics,  Prev: Register Variables,  Up: Variables

4.4 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.

   A `N_BCOMM' stab begins a common block and an `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
`N_BCOMM' has the name of the common block (even though their compiler
actually puts it both places).

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


File: stabs.info,  Node: Statics,  Next: Based Variables,  Prev: Common Blocks,  Up: Variables

4.5 Static Variables
====================

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

   In a.out files, `N_STSYM' means the data section, `N_FUN' means the
text section, and `N_LCSYM' means the bss section.  For those systems
with a read-only data section separate from the text section (Solaris),
`N_ROSYM' means the read-only data section.

   For example, the source lines:

     static const int var_const = 5;
     static int var_init = 2;
     static int var_noinit;

yield the following stabs:

     .stabs "var_const:S1",36,0,0,_var_const      # 36 is N_FUN
     ...
     .stabs "var_init:S1",38,0,0,_var_init        # 38 is N_STSYM
     ...
     .stabs "var_noinit:S1",40,0,0,_var_noinit    # 40 is N_LCSYM

   In XCOFF files, the stab type need not indicate the section;
`C_STSYM' can be used for all statics.  Also, each static variable is
enclosed in a static block.  A `C_BSTAT' (emitted with a `.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 `.bs'.  A `C_ESTAT' (emitted with a `.es'
assembler directive) symbol ends the static block; its name is `.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 `S' means that the address is absolute (the linker relocates
it) and symbol descriptor `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 `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, *Note ELF
Linker Relocation::.


File: stabs.info,  Node: Based Variables,  Next: Parameters,  Prev: Statics,  Up: Variables

4.6 Fortran Based Variables
===========================

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

   For example, the Fortran declarations

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

   produce the stabs

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

   In this example, `real' is type 6 and type 3 is an integral type
which is the type of the subscripts of the array (probably `integer').

   The `b' symbol descriptor is like `V' in that it denotes a
statically allocated symbol whose scope is local to a function; see
*Note 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 `foo' stab is the address of
a pointer to a real, the value of the `foo10' stab is the address of a
pointer to a 10-element array of reals, and the value of the `foo10_5'
stab is the address of a pointer to a 5-element array of 10-element
arrays of reals.


File: stabs.info,  Node: Parameters,  Prev: Based Variables,  Up: Variables

4.7 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.

   Parameters passed on the stack use the symbol descriptor `p' and the
`N_PSYM' symbol type (or `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:

     main (argc, argv)
          int argc;
          char **argv;

   produces the stabs:

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

   The type definition of `argv' is interesting because it contains
several type definitions.  Type 21 is pointer to type 2 (char) and
`argv' (type 20) is pointer to type 21.

   The following symbol descriptors are also said to go with `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).

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

* Menu:

* Register Parameters::
* Local Variable Parameters::
* Reference Parameters::
* Conformant Arrays::


File: stabs.info,  Node: Register Parameters,  Next: Local Variable Parameters,  Up: Parameters

4.7.1 Passing Parameters in Registers
-------------------------------------

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

     .stabs "arg:p1" . . .       ; N_PSYM
     .stabs "arg:r1" . . .       ; N_RSYM

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

   Because that approach is kind of ugly, some compilers use symbol
descriptor `P' or `R' to indicate an argument which is in a register.
Symbol type `C_RPSYM' is used in XCOFF and `N_RSYM' is used otherwise.
The symbol's value is the register number.  `P' and `R' mean the same
thing; the difference is that `P' is a GNU invention and `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 `p' and `r' pair rather
than `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 `D' is for a
parameter passed in a floating point register.  This seems
unnecessary--why not just use `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.

   On the sparc and hppa, for a `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 `p' and `r' pair (using Sun `cc') or a
`p' symbol.  However, if a (small) structure is really in a register,
`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 `p' and `r' pair!  I believe that symbol
descriptor `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 (*note Reference Parameters::).


File: stabs.info,  Node: Local Variable Parameters,  Next: Reference Parameters,  Prev: Register Parameters,  Up: Parameters

4.7.2 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 `float',
but the calling conventions specify that it is passed as a `double'),
then GCC2 (sometimes) uses a pair of symbols.  The first symbol uses
symbol descriptor `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:

     void
     subr (f)
          float f;
     {

   if `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:

     .stabs "f:p13",160,0,3,8   # 160 is `N_PSYM', here 13 is `double'
     .stabs "f:r12",64,0,3,0    # 64 is `N_RSYM', here 12 is `float'

   In both stabs 3 is the line number where `f' is declared (*note Line
Numbers::).

   GCC, at least on the 960, has another solution to the same problem.
It uses a single `p' symbol descriptor for an argument which is stored
as a local variable but uses `N_LSYM' instead of `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.

   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

     extern int fprintf (FILE *stream, char *format, ...);
     ...
     fprintf (stdout, "%d\n", x);

   there are stabs for `stream' and `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 `p') (not necessarily `r' or
symbol descriptor omitted symbols) needs to contain the actual type as
passed (for example, `double' not `float' if it is passed as a double
and converted to a float).


File: stabs.info,  Node: Reference Parameters,  Next: Conformant Arrays,  Prev: Local Variable Parameters,  Up: Parameters

4.7.3 Passing Parameters by Reference
-------------------------------------

If the parameter is passed by reference (e.g., Pascal `VAR'
parameters), then the symbol descriptor is `v' if it is in the argument
list, or `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 `p' and `R', respectively.  I believe `a' is an
AIX invention; `v' is supported by all stabs-using systems as far as I
know.


File: stabs.info,  Node: Conformant Arrays,  Prev: Reference Parameters,  Up: Parameters

4.7.4 Passing Conformant Array Parameters
-----------------------------------------

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 `x'
for the array itself, and a `C', which represents the size of the
array.  The value of the `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 `C' stab is the offset in the argument list
where the size of the array (in elements? in bytes?) is stored.


File: stabs.info,  Node: Types,  Next: Macro define and undefine,  Prev: Variables,  Up: Top

5 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 `=' 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::


File: stabs.info,  Node: Builtin Types,  Next: Miscellaneous Types,  Up: Types

5.1 Builtin Types
=================

Certain types are built in (`int', `short', `void', `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 `acc' uses special
builtin type descriptors (`b' and `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


File: stabs.info,  Node: Traditional Builtin Types,  Next: Builtin Type Descriptors,  Up: Builtin Types

5.1.1 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 `void'.

* Menu:

* Traditional Integer Types::
* Traditional Other Types::


File: stabs.info,  Node: Traditional Integer Types,  Next: Traditional Other Types,  Up: Traditional Builtin Types

5.1.1.1 Traditional Integer Types
.................................

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

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

   Builtin types can also be described as subranges of `int':

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

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

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

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

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

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

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


File: stabs.info,  Node: Traditional Other Types,  Prev: Traditional Integer Types,  Up: Traditional Builtin Types

5.1.1.2 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:

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

   However, GCC writes `long double' the same way it writes `double',
so there is no way to distinguish.

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

   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 `void' type is defined as itself:

     .stabs "void:t15=15",128,0,0,0

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


File: stabs.info,  Node: Builtin Type Descriptors,  Next: Negative Type Numbers,  Prev: Traditional Builtin Types,  Up: Builtin Types

5.1.2 Defining Builtin Types Using Builtin Type Descriptors
-----------------------------------------------------------

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

`b SIGNED CHAR-FLAG WIDTH ; OFFSET ; NBITS ;'
     Define an integral type.  SIGNED is `u' for unsigned or `s' for
     signed.  CHAR-FLAG is `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 `wchar_t' so the debugger can
     print such variables differently (Solaris does not do this).  Sun
     sets it on the C types `signed char' and `unsigned char' which
     arguably is wrong.  WIDTH and OFFSET appear to be for small
     objects stored in larger ones, for example a `short' in an `int'
     register.  WIDTH is normally the number of bytes in the type.
     OFFSET seems to always be zero.  NBITS is the number of bits in
     the type.

     Note that type descriptor `b' used for builtin types conflicts with
     its use for Pascal space types (*note Miscellaneous Types::); they
     can be distinguished because the character following the type
     descriptor will be a digit, `(', or `-' for a Pascal space type, or
     `u' or `s' for a builtin type.

`w'
     Documented by AIX to define a wide character type, but their
     compiler actually uses negative type numbers (*note Negative Type
     Numbers::).

`R FP-TYPE ; BYTES ;'
     Define a floating point type.  FP-TYPE has one of the following
     values:

    `1 (NF_SINGLE)'
          IEEE 32-bit (single precision) floating point format.

    `2 (NF_DOUBLE)'
          IEEE 64-bit (double precision) floating point format.

    `3 (NF_COMPLEX)'

    `4 (NF_COMPLEX16)'

    `5 (NF_COMPLEX32)'
          These are for complex numbers.  A comment in the GDB source
          describes them as Fortran `complex', `double complex', and
          `complex*16', respectively, but what does that mean?  (i.e.,
          Single precision?  Double precision?).

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

     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 FP-TYPE.

`g TYPE-INFORMATION ; NBITS'
     Documented by AIX to define a floating type, but their compiler
     actually uses negative type numbers (*note Negative Type
     Numbers::).

`c TYPE-INFORMATION ; NBITS'
     Documented by AIX to define a complex type, but their compiler
     actually uses negative type numbers (*note Negative Type
     Numbers::).

   The C `void' type is defined as a signed integral type 0 bits long:
     .stabs "void:t19=bs0;0;0",128,0,0,0
   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.


File: stabs.info,  Node: Negative Type Numbers,  Prev: Builtin Type Descriptors,  Up: Builtin Types

5.1.3 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
`int' or `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 (*note 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,

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

   defines an 8-bit boolean type, and

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

   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 _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 `int' and `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:

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

   Here is the list of negative type numbers.  The phrase "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).

`-1'
     `int', 32 bit signed integral type.

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

`-3'
     `short', 16 bit signed integral type.

`-4'
     `long', 32 bit signed integral type.

`-5'
     `unsigned char', 8 bit unsigned integral type.

`-6'
     `signed char', 8 bit signed integral type.

`-7'
     `unsigned short', 16 bit unsigned integral type.

`-8'
     `unsigned int', 32 bit unsigned integral type.

`-9'
     `unsigned', 32 bit unsigned integral type.

`-10'
     `unsigned long', 32 bit unsigned integral type.

`-11'
     `void', type indicating the lack of a value.

`-12'
     `float', IEEE single precision.

`-13'
     `double', IEEE double precision.

`-14'
     `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 `long double'.  I hope when they increase
     it they use a new negative type number.

`-15'
     `integer'.  32 bit signed integral type.

`-16'
     `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.

`-17'
     `short real'.  IEEE single precision.

`-18'
     `real'.  IEEE double precision.

`-19'
     `stringptr'.  *Note Strings::.

`-20'
     `character', 8 bit unsigned character type.

`-21'
     `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.

`-22'
     `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.

`-23'
     `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.

`-24'
     `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.

`-25'
     `complex'.  A complex type consisting of two IEEE single-precision
     floating point values.

`-26'
     `complex'.  A complex type consisting of two IEEE double-precision
     floating point values.

`-27'
     `integer*1', 8 bit signed integral type.

`-28'
     `integer*2', 16 bit signed integral type.

`-29'
     `integer*4', 32 bit signed integral type.

`-30'
     `wchar'.  Wide character, 16 bits wide, unsigned (what format?
     Unicode?).

`-31'
     `long long', 64 bit signed integral type.

`-32'
     `unsigned long long', 64 bit unsigned integral type.

`-33'
     `logical*8', 64 bit unsigned integral type.

`-34'
     `integer*8', 64 bit signed integral type.


File: stabs.info,  Node: Miscellaneous Types,  Next: Cross-References,  Prev: Builtin Types,  Up: Types

5.2 Miscellaneous Types
=======================

`b TYPE-INFORMATION ; BYTES'
     Pascal space type.  This is documented by IBM; what does it mean?

     This use of the `b' type descriptor can be distinguished from its
     use for builtin integral types (*note Builtin Type Descriptors::)
     because the character following the type descriptor is always a
     digit, `(', or `-'.

`B TYPE-INFORMATION'
     A volatile-qualified version of 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.

`d TYPE-INFORMATION'
     File of type TYPE-INFORMATION.  As far as I know this is only used
     by Pascal.

`k TYPE-INFORMATION'
     A const-qualified version of TYPE-INFORMATION.  This is a Sun
     extension.  A variable with a const-qualified type cannot be
     modified.

`M TYPE-INFORMATION ; LENGTH'
     Multiple instance type.  The type seems to composed of LENGTH
     repetitions of TYPE-INFORMATION, for example `character*3' is
     represented by `M-2;3', where `-2' is a reference to a character
     type (*note Negative Type Numbers::).  I'm not sure how this
     differs from an array.  This appears to be a Fortran feature.
     LENGTH is a bound, like those in range types; see *note
     Subranges::.

`S TYPE-INFORMATION'
     Pascal set type.  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 TYPE-INFORMATION.

     In CHILL, if it is a bitstring instead of a set, also use the `S'
     type attribute (*note String Field::).

`* TYPE-INFORMATION'
     Pointer to TYPE-INFORMATION.


File: stabs.info,  Node: Cross-References,  Next: Subranges,  Prev: Miscellaneous Types,  Up: Types

5.3 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 `x' type descriptor, which is followed by
`s' for a structure tag, `u' for a union tag, or `e' for a enumerator
tag, followed by the name of the tag, followed by `:'.  If the name
contains `::' between a `<' and `>' pair (for C++ templates), such a
`::' does not end the name--only a single `:' ends the name; see *note
Nested Symbols::.

   For example, the following C declarations:

     struct foo;
     struct foo *bar;

produce:

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

   Not all debuggers support the `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 `i' type
descriptor, which is followed by the name of the module from which the
type is imported, followed by `:', 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 (*note 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 (*note
String Field::), or what.  The symbol ends with `;'.


File: stabs.info,  Node: Subranges,  Next: Arrays,  Prev: Cross-References,  Up: Types

5.4 Subrange Types
==================

The `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 (*note Arrays::).

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

`A OFFSET'
     The bound is passed by reference on the stack at offset OFFSET
     from the argument list.  *Note Parameters::, for more information
     on such offsets.

`T OFFSET'
     The bound is passed by value on the stack at offset OFFSET from
     the argument list.

`a REGISTER-NUMBER'
     The bound is passed by reference in register number
     REGISTER-NUMBER.

`t REGISTER-NUMBER'
     The bound is passed by value in register number REGISTER-NUMBER.

`J'
     There is no bound.

   Subranges are also used for builtin types; see *note Traditional
Builtin Types::.


File: stabs.info,  Node: Arrays,  Next: Strings,  Prev: Subranges,  Up: Types

5.5 Array Types
===============

Arrays use the `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, *note 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 (*note String Field::) (that is, it need not start with
`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
`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 `r' and some parameters.  It defines the size of the array.
In the example below, the range `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:

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

produces the output:

     .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

   If an array is "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 (*note String
Field::).  In the case of arrays, another is to use the `P' type
descriptor instead of `a'.  Other than specifying a packed array, `P'
is identical to `a'.

   An open array is represented by the `A' type descriptor followed by
type information specifying the type of the array elements.

   An N-dimensional dynamic array is represented by

     D DIMENSIONS ; TYPE-INFORMATION

   DIMENSIONS is the number of dimensions; TYPE-INFORMATION specifies
the type of the array elements.

   A subarray of an N-dimensional array is represented by

     E DIMENSIONS ; TYPE-INFORMATION

   DIMENSIONS is the number of dimensions; TYPE-INFORMATION specifies
the type of the array elements.


File: stabs.info,  Node: Strings,  Next: Enumerations,  Prev: Arrays,  Up: Types

5.6 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:

`n TYPE-INFORMATION ; BYTES'
     BYTES is the maximum length.  I'm not sure what TYPE-INFORMATION
     is; I suspect that it means that this is a string of
     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.

`z TYPE-INFORMATION ; BYTES'
     Just like `n' except that this is a gstring, not an ordinary
     string.  I don't know the difference.

`N'
     Pascal Stringptr.  What is this?  This is an AIX feature.

   Languages, such as CHILL which have a string type which is basically
just an array of characters use the `S' type attribute (*note String
Field::).


File: stabs.info,  Node: Enumerations,  Next: Structures,  Prev: Strings,  Up: Types

5.7 Enumerations
================

Enumerations are defined with the `e' type descriptor.

   The source line below declares an enumeration type at file scope.
The type definition is located after the `N_RBRAC' that marks the end of
the previous procedure's block scope, and before the `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:

     enum e_places {first,second=3,last};

generates the following stab:

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

   The symbol descriptor (`T') says that the stab describes a
structure, enumeration, or union tag.  The type descriptor `e',
following the `22=' of the type definition narrows it down to an
enumeration type.  Following the `e' is a list of the elements of the
enumeration.  The format is `NAME:VALUE,'.  The list of elements ends
with `;'.  The fact that 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 *note String
Field::.

   Enumeration types are unusual in that they define symbols for the
enumeration values (`first', `second', and `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 `T' or `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 (*note String Field::); GCC does this.


File: stabs.info,  Node: Structures,  Next: Typedefs,  Prev: Enumerations,  Up: Types

5.8 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 `typedef' equates the
structure tag with a new type.  Separate stabs are generated for the
structure tag, the structure `typedef', and the structure instance.  The
stabs for the tag and the `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.

     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;

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

   Following the `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 `NAME:TYPE, BIT
OFFSET FROM THE START OF THE STRUCT, NUMBER OF BITS IN THE ELEMENT'.

     # 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

   In this example, the first two structure elements are previously
defined types.  For these, the type following the `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 `NAME:'.  The type definition for the array element
looks just like a type definition for a stand-alone array.  The
`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++ 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++ feature), they follow the
non-method fields; see *note Cplusplus::.


File: stabs.info,  Node: Typedefs,  Next: Unions,  Prev: Structures,  Up: Types

5.9 Giving a Type a Name
========================

To give a type a name, use the `t' symbol descriptor.  The type is
specified by the type information (*note String Field::) for the stab.
For example,

     .stabs "s_typedef:t16",128,0,0,0     # 128 is N_LSYM

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

   If you are specifying the tag name for a structure, union, or
enumeration, use the `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
`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 (*note 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.


File: stabs.info,  Node: Unions,  Next: Function Types,  Prev: Typedefs,  Up: Types

5.10 Unions
===========

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

   This code generates a stab for a union tag and a stab for a union
variable.  Both use the `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 `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 `N_LSYM'.
This would seem to imply that the union type is file scope, like the
struct type `s_tag'.  This is not true.  The contents and position of
the stab for `u_type' do not convey any information about its procedure
local scope.

     # 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

   The symbol descriptor `T', following the `name:' means that the stab
describes an enumeration, structure, or union tag.  The type descriptor
`u', following the `23=' of the type definition, narrows it down to a
union type definition.  Following the `u' is the number of bytes in the
union.  After that is a list of union element descriptions.  Their
format is `NAME:TYPE, BIT OFFSET INTO THE UNION, NUMBER OF BYTES FOR
THE ELEMENT;'.

   The stab for the union variable is:

     .stabs "an_u:23",128,0,0,-20     # 128 is N_LSYM

   `-20' specifies where the variable is stored (*note Stack
Variables::).


File: stabs.info,  Node: Function Types,  Prev: Unions,  Up: Types

5.11 Function Types
===================

Various types can be defined for function variables.  These types are
not used in defining functions (*note Procedures::); they are used for
things like pointers to functions.

   The simple, traditional, type is type descriptor `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 `f', `F', `p', and `R'
type descriptors.

   First comes the type descriptor.  If it is `f' or `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 `R' and `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:

     int (*g_pf)();

generates the following code:

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

   The variable defines a new type, 24, which is a pointer to another
new type, 25, which is a function returning `int'.


File: stabs.info,  Node: Macro define and undefine,  Next: Symbol Tables,  Prev: Types,  Up: Top

6 Representation of #define and #undef
**************************************

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

   A `#define MACRO-NAME MACRO-BODY' is represented with an
`N_MAC_DEFINE' stab with a string field of `MACRO-NAME MACRO-BODY'.  

   An `#undef MACRO-NAME' is represented with an `N_MAC_UNDEF' stabs
with a string field of simply `MACRO-NAME'.  

   For both `N_MAC_DEFINE' and `N_MAC_UNDEF', the desc field is the
line number within the file where the corresponding `#define' or
`#undef' occurred.

   For example, the following C code:

         #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;
         }

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

         .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

NOTE: In the above example, `54' is `N_MAC_DEFINE' and `58' is
`N_MAC_UNDEF'.


File: stabs.info,  Node: Symbol Tables,  Next: Cplusplus,  Prev: Macro define and undefine,  Up: Top

7 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::


File: stabs.info,  Node: Symbol Table Format,  Next: Transformations On Symbol Tables,  Up: Symbol Tables

7.1 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:

     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 */
     };

   If the stab has a string, the `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 `.stabn' or `.stabd' directive), the `n_strx' field is
zero.

   Symbol table entries with `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.


File: stabs.info,  Node: Transformations On Symbol Tables,  Prev: Symbol Table Format,  Up: Symbol Tables

7.2 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 `nm -ap', which dumps the symbol table, including
debugging information, unsorted.  For stab entries the columns are:
VALUE, OTHER, DESC, TYPE, STRING.  For assembler and linker symbols,
the columns are: VALUE, TYPE, 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 `N_RSYM' and `N_LSYM',
where the value is an offset or a register number, the low 5 bits are
`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.


File: stabs.info,  Node: Transformations On Static Variables,  Next: Transformations On Global Variables,  Up: Transformations On Symbol Tables

7.2.1 Transformations on Static Variables
-----------------------------------------

This source line defines a static variable at file scope:

     static int s_g_repeat

The following stab describes the symbol:

     .stabs "s_g_repeat:S1",38,0,0,_s_g_repeat

The assembler transforms the stab into this symbol table entry in the
`.o' file.  The location is expressed as a data segment offset.

     00000084 - 00 0000 STSYM s_g_repeat:S1

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

     0000e00c - 00 0000 STSYM s_g_repeat:S1


File: stabs.info,  Node: Transformations On Global Variables,  Next: Stab Section Transformations,  Prev: Transformations On Static Variables,  Up: Transformations On Symbol Tables

7.2.2 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:

     char g_foo = 'c';

generates the stab:

     .stabs "g_foo:G2",32,0,0,0

   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 `D' signifies that the `n_type'
field of the symbol table contains 7, `N_DATA' with local linkage.  The
stab's value is zero since the value is not used for `N_GSYM' stabs.
The value of the linker symbol is the relocatable address corresponding
to the variable.

     00000000 - 00 0000  GSYM g_foo:G2
     00000080 D _g_foo

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

     00000000 - 00 0000  GSYM g_foo:G2
     ...
     0000e008 D _g_foo


File: stabs.info,  Node: Stab Section Transformations,  Prev: Transformations On Global Variables,  Up: Transformations On Symbol Tables

7.2.3 Transformations of Stabs in separate sections
---------------------------------------------------

For object file formats using stabs in separate sections (*note Stab
Sections::), use `objdump --stabs' instead of `nm' to show the stabs in
an object or executable file.  `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 (*note ELF Linker Relocation::).  For
example, if the source line

     static int ld = 5;

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

     .Ddata.data:
     ...
             .stabs "ld:V(0,3)",0x26,0,4,.L18-Ddata.data    # 0x26 is N_STSYM
     ...
     .L18:
             .align 4
             .word 0x5

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

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

   without any relocations, and the executable file also contains

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


File: stabs.info,  Node: Cplusplus,  Next: Stab Types,  Prev: Symbol Tables,  Up: Top

8 GNU C++ 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 `#' type descriptor
* Member Type Descriptor::      The `@' type descriptor
* Protections::
* Method Modifiers::
* Virtual Methods::
* Inheritance::
* Virtual Base Classes::
* Static Members::


File: stabs.info,  Node: Class Names,  Next: Nested Symbols,  Up: Cplusplus

8.1 C++ Class Names
===================

In C++, a class name which is declared with `class', `struct', or
`union', is not only a tag, as in C, but also a type name.  Thus there
should be stabs with both `t' and `T' symbol descriptors (*note
Typedefs::).

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

   For example, the C++ code

     struct foo {int x;};

   can be represented as either

     .stabs "foo:T19=s4x:1,0,32;;",128,0,0,0       # 128 is N_LSYM
     .stabs "foo:t19",128,0,0,0

   or

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


File: stabs.info,  Node: Nested Symbols,  Next: Basic Cplusplus Types,  Prev: Class Names,  Up: Cplusplus

8.2 Defining a Symbol Within Another Type
=========================================

In C++, a symbol (such as a type name) can be defined within another
type.

   In stabs, this is sometimes represented by making the name of a
symbol which contains `::'.  Such a pair of colons does not end the name
of the symbol, the way a single colon would (*note 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, `:'
cannot be used as a symbol descriptor.

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


File: stabs.info,  Node: Basic Cplusplus Types,  Next: Simple Classes,  Prev: Nested Symbols,  Up: Cplusplus

8.3 Basic Types For C++
=======================

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

   C++ 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++ programs even if there are no
virtual methods defined.

     .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

     .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

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

     .stabs "$vtbl_ptr_type:T17",128,0,0,0


File: stabs.info,  Node: Simple Classes,  Next: Class Instance,  Prev: Basic Cplusplus Types,  Up: Cplusplus

8.4 Simple Class Definition
===========================

The stabs describing C++ language features are an extension of the
stabs describing C.  Stabs representing C++ 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.

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

   The class `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 `N_LSYM'.
Since the stab is not located between an `N_FUN' and an `N_LBRAC' stab
this indicates that the class is defined at file scope.  If it were,
then the `N_LSYM' would signify a local variable.

   A stab describing a C++ 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++ 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++ 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++ class stab representing a member function
differs substantially from the field part of a C struct stab.  It still
begins with `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 `#' type
descriptor; see *note Method Type Descriptor::; static member functions
are declared using the `f' type descriptor instead; see *note Function
Types::.

   The format of an overloaded operator method name differs from that of
other methods.  It is `op$::OPERATOR-NAME.' where OPERATOR-NAME is the
operator name such as `+' or `+='.  The name ends with a period, and
any characters except the period can occur in the 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++ name mangling.  In this example an `int' and a `char'
map to `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, `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.

     .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

     .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


File: stabs.info,  Node: Class Instance,  Next: Methods,  Prev: Simple Classes,  Up: Cplusplus

8.5 Class Instance
==================

As shown above, describing even a simple C++ 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:

     main () {
             baseA AbaseA;
     }

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

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

     .stabs "AbaseA:20",128,0,0,-20


File: stabs.info,  Node: Methods,  Next: Method Type Descriptor,  Prev: Class Instance,  Up: Cplusplus

8.6 Method Definition
=====================

The class definition shown above declares Ameth.  The C++ source below
defines Ameth:

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

   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 `this' pointer.  The `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 ARM (`The Annotated C++
Reference Manual', by Ellis and Stroustrup, ISBN 0-201-51459-1);
`gpcompare.texi' in Cygnus GCC distributions describes the differences
between GNU mangling and ARM mangling.

     .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

   Here is the stab for the `this' pointer implicit argument.  The name
of the `this' pointer is always `this'.  Type 19, the `this' pointer is
defined as a pointer to type 20, `baseA', but a stab defining `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 `xs'.

     .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

   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.

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

     .stabs "in:p1",160,0,0,72

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


File: stabs.info,  Node: Method Type Descriptor,  Next: Member Type Descriptor,  Prev: Methods,  Up: Cplusplus

8.7 The `#' 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 `this' pointer.

   If the `#' is immediately followed by another `#', 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 `#' 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 `void'
indicates a method which does not take a variable number of arguments.
If the final argument type of `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.


File: stabs.info,  Node: Member Type Descriptor,  Next: Protections,  Prev: Method Type Descriptor,  Up: Cplusplus

8.8 The `@' Type Descriptor
===========================

The `@' 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++ source:

     typedef int A::*int_in_a;

   generates the following stab:

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

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


File: stabs.info,  Node: Protections,  Next: Method Modifiers,  Prev: Member Type Descriptor,  Up: Cplusplus

8.9 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++ stabs.

   If the character following the `FIELD-NAME:' part of the string is
`/', then the next character is the visibility.  `0' means private, `1'
means protected, and `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 `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 `9' is not supported by
GDB 4.11; this should be fixed in the next GDB release.

   The following C++ source:

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

generates the following stab:

     # 128 is N_LSYM
     .stabs "vis:T19=s12priv:/01,0,32;prot:/12,32,8;pub:12,64,32;;",128,0,0,0

   `vis:T19=s12' indicates that type number 19 is a 12 byte structure
named `vis' The `priv' field has public visibility (`/0'), type int
(`1'), and offset and size `,0,32;'.  The `prot' field has protected
visibility (`/1'), type char (`2') and offset and size `,32,8;'.  The
`pub' field has type float (`12'), and offset and size `,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++ class
definition below:

     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;};
     };

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

     .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

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


File: stabs.info,  Node: Method Modifiers,  Next: Virtual Methods,  Prev: Protections,  Up: Cplusplus

8.10 Method Modifiers (`const', `volatile', `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 `A', const methods use `B',
volatile methods use `C', and const volatile methods use `D'.  Consider
the class definition below:

     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; };
     };

   This class is described by the following stab:

     .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);;", ...

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


File: stabs.info,  Node: Virtual Methods,  Next: Inheritance,  Prev: Method Modifiers,  Up: Cplusplus

8.11 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:

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

   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 `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++ 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 `$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
`$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++
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
`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 `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 `~%' and followed by a final semi-colon.

     .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

     .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


File: stabs.info,  Node: Inheritance,  Next: Virtual Base Classes,  Prev: Virtual Methods,  Up: Cplusplus

8.12 Inheritance
================

Stabs describing C++ 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 `1' if the base class is virtual and `0' if
not.  The visibility character is `2' if the derivation is public, `1'
if it is protected, and `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 `A', `B', and `C' and
the derived class `D'.

     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; };
     };

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

     .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

   In the stab describing derived class `D' below, the information about
the derivation of this class is encoded as follows.

     .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); ...

     .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


File: stabs.info,  Node: Virtual Base Classes,  Next: Static Members,  Prev: Inheritance,  Up: Cplusplus

8.13 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 `D'
inherits virtually from base class `B'.  This means that an instance of
a `D' object will not contain its own `B' part but merely a pointer to
a `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 `B' is given as 0 even though `B' is
not the first base class.  The first base class `A' starts at offset 0.

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

     .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

   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 `B' class `this' pointer.  The
`this' pointer for a class is a pointer to the class type.

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

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


File: stabs.info,  Node: Static Members,  Prev: Virtual Base Classes,  Up: Cplusplus

8.14 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.  >>


File: stabs.info,  Node: Stab Types,  Next: Symbol Descriptors,  Prev: Cplusplus,  Up: Top

Appendix A 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 (*note 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 `include/aout/stabs.def'.

* Menu:

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


File: stabs.info,  Node: Non-Stab Symbol Types,  Next: Stab Symbol Types,  Up: Stab Types

A.1 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.

`0x0     N_UNDF'
     Undefined symbol

`0x2     N_ABS'
     File scope absolute symbol

`0x3     N_ABS | N_EXT'
     External absolute symbol

`0x4     N_TEXT'
     File scope text symbol

`0x5     N_TEXT | N_EXT'
     External text symbol

`0x6     N_DATA'
     File scope data symbol

`0x7     N_DATA | N_EXT'
     External data symbol

`0x8     N_BSS'
     File scope BSS symbol

`0x9     N_BSS | N_EXT'
     External BSS symbol

`0x0c    N_FN_SEQ'
     Same as `N_FN', for Sequent compilers

`0x0a    N_INDR'
     Symbol is indirected to another symbol

`0x12    N_COMM'
     Common--visible after shared library dynamic link

`0x14 N_SETA'
`0x15 N_SETA | N_EXT'
     Absolute set element

`0x16 N_SETT'
`0x17 N_SETT | N_EXT'
     Text segment set element

`0x18 N_SETD'
`0x19 N_SETD | N_EXT'
     Data segment set element

`0x1a N_SETB'
`0x1b N_SETB | N_EXT'
     BSS segment set element

`0x1c N_SETV'
`0x1d N_SETV | N_EXT'
     Pointer to set vector

`0x1e N_WARNING'
     Print a warning message during linking

`0x1f    N_FN'
     File name of a `.o' file


File: stabs.info,  Node: Stab Symbol Types,  Prev: Non-Stab Symbol Types,  Up: Stab Types

A.2 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.

`0x20     N_GSYM'
     Global symbol; see *note Global Variables::.

`0x22     N_FNAME'
     Function name (for BSD Fortran); see *note Procedures::.

`0x24     N_FUN'
     Function name (*note Procedures::) or text segment variable (*note
     Statics::).

`0x26 N_STSYM'
     Data segment file-scope variable; see *note Statics::.

`0x28 N_LCSYM'
     BSS segment file-scope variable; see *note Statics::.

`0x2a N_MAIN'
     Name of main routine; see *note Main Program::.

`0x2c N_ROSYM'
     Variable in `.rodata' section; see *note Statics::.

`0x30     N_PC'
     Global symbol (for Pascal); see *note N_PC::.

`0x32     N_NSYMS'
     Number of symbols (according to Ultrix V4.0); see *note N_NSYMS::.

`0x34     N_NOMAP'
     No DST map; see *note N_NOMAP::.

`0x36     N_MAC_DEFINE'
     Name and body of a `#define'd macro; see *note Macro define and
     undefine::.

`0x38 N_OBJ'
     Object file (Solaris2).

`0x3a     N_MAC_UNDEF'
     Name of an `#undef'ed macro; see *note Macro define and undefine::.

`0x3c N_OPT'
     Debugger options (Solaris2).

`0x40     N_RSYM'
     Register variable; see *note Register Variables::.

`0x42     N_M2C'
     Modula-2 compilation unit; see *note N_M2C::.

`0x44     N_SLINE'
     Line number in text segment; see *note Line Numbers::.

`0x46     N_DSLINE'
     Line number in data segment; see *note Line Numbers::.

`0x48     N_BSLINE'
     Line number in bss segment; see *note Line Numbers::.

`0x48     N_BROWS'
     Sun source code browser, path to `.cb' file; see *note N_BROWS::.

`0x4a     N_DEFD'
     GNU Modula2 definition module dependency; see *note N_DEFD::.

`0x4c N_FLINE'
     Function start/body/end line numbers (Solaris2).

`0x50     N_EHDECL'
     GNU C++ exception variable; see *note N_EHDECL::.

`0x50     N_MOD2'
     Modula2 info "for imc" (according to Ultrix V4.0); see *note
     N_MOD2::.

`0x54     N_CATCH'
     GNU C++ `catch' clause; see *note N_CATCH::.

`0x60     N_SSYM'
     Structure of union element; see *note N_SSYM::.

`0x62 N_ENDM'
     Last stab for module (Solaris2).

`0x64     N_SO'
     Path and name of source file; see *note Source Files::.

`0x80 N_LSYM'
     Stack variable (*note Stack Variables::) or type (*note
     Typedefs::).

`0x82     N_BINCL'
     Beginning of an include file (Sun only); see *note Include Files::.

`0x84     N_SOL'
     Name of include file; see *note Include Files::.

`0xa0     N_PSYM'
     Parameter variable; see *note Parameters::.

`0xa2     N_EINCL'
     End of an include file; see *note Include Files::.

`0xa4     N_ENTRY'
     Alternate entry point; see *note Alternate Entry Points::.

`0xc0     N_LBRAC'
     Beginning of a lexical block; see *note Block Structure::.

`0xc2     N_EXCL'
     Place holder for a deleted include file; see *note Include Files::.

`0xc4     N_SCOPE'
     Modula2 scope information (Sun linker); see *note N_SCOPE::.

`0xe0     N_RBRAC'
     End of a lexical block; see *note Block Structure::.

`0xe2     N_BCOMM'
     Begin named common block; see *note Common Blocks::.

`0xe4     N_ECOMM'
     End named common block; see *note Common Blocks::.

`0xe8     N_ECOML'
     Member of a common block; see *note Common Blocks::.

`0xea N_WITH'
     Pascal `with' statement: type,,0,0,offset (Solaris2).

`0xf0     N_NBTEXT'
     Gould non-base registers; see *note Gould::.

`0xf2     N_NBDATA'
     Gould non-base registers; see *note Gould::.

`0xf4     N_NBBSS'
     Gould non-base registers; see *note Gould::.

`0xf6     N_NBSTS'
     Gould non-base registers; see *note Gould::.

`0xf8     N_NBLCS'
     Gould non-base registers; see *note Gould::.


File: stabs.info,  Node: Symbol Descriptors,  Next: Type Descriptors,  Prev: Stab Types,  Up: Top

Appendix B 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.  *Note String Field::,
for more information about their use.

`DIGIT'
`('
`-'
     Variable on the stack; see *note Stack Variables::.

`:'
     C++ nested symbol; see *Note Nested Symbols::.

`a'
     Parameter passed by reference in register; see *note Reference
     Parameters::.

`b'
     Based variable; see *note Based Variables::.

`c'
     Constant; see *note Constants::.

`C'
     Conformant array bound (Pascal, maybe other languages); *note
     Conformant Arrays::.  Name of a caught exception (GNU C++).  These
     can be distinguished because the latter uses `N_CATCH' and the
     former uses another symbol type.

`d'
     Floating point register variable; see *note Register Variables::.

`D'
     Parameter in floating point register; see *note Register
     Parameters::.

`f'
     File scope function; see *note Procedures::.

`F'
     Global function; see *note Procedures::.

`G'
     Global variable; see *note Global Variables::.

`i'
     *Note Register Parameters::.

`I'
     Internal (nested) procedure; see *note Nested Procedures::.

`J'
     Internal (nested) function; see *note Nested Procedures::.

`L'
     Label name (documented by AIX, no further information known).

`m'
     Module; see *note Procedures::.

`p'
     Argument list parameter; see *note Parameters::.

`pP'
     *Note Parameters::.

`pF'
     Fortran Function parameter; see *note Parameters::.

`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 *note Procedures::.
     Register parameter (GNU) (symbol type `N_PSYM'); see *note
     Parameters::.  Prototype of function referenced by this file (Sun
     `acc') (symbol type `N_FUN').

`Q'
     Static Procedure; see *note Procedures::.

`R'
     Register parameter; see *note Register Parameters::.

`r'
     Register variable; see *note Register Variables::.

`S'
     File scope variable; see *note Statics::.

`s'
     Local variable (OS9000).

`t'
     Type name; see *note Typedefs::.

`T'
     Enumeration, structure, or union tag; see *note Typedefs::.

`v'
     Parameter passed by reference; see *note Reference Parameters::.

`V'
     Procedure scope static variable; see *note Statics::.

`x'
     Conformant array; see *note Conformant Arrays::.

`X'
     Function return variable; see *note Parameters::.


File: stabs.info,  Node: Type Descriptors,  Next: Expanded Reference,  Prev: Symbol Descriptors,  Up: Top

Appendix C 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.
*Note String Field::, for more information about their use.

`DIGIT'
`('
     Type reference; see *note String Field::.

`-'
     Reference to builtin type; see *note Negative Type Numbers::.

`#'
     Method (C++); see *note Method Type Descriptor::.

`*'
     Pointer; see *note Miscellaneous Types::.

`&'
     Reference (C++).

`@'
     Type Attributes (AIX); see *note String Field::.  Member (class
     and variable) type (GNU C++); see *note Member Type Descriptor::.

`a'
     Array; see *note Arrays::.

`A'
     Open array; see *note Arrays::.

`b'
     Pascal space type (AIX); see *note Miscellaneous Types::.  Builtin
     integer type (Sun); see *note Builtin Type Descriptors::.  Const
     and volatile qualified type (OS9000).

`B'
     Volatile-qualified type; see *note Miscellaneous Types::.

`c'
     Complex builtin type (AIX); see *note Builtin Type Descriptors::.
     Const-qualified type (OS9000).

`C'
     COBOL Picture type.  See AIX documentation for details.

`d'
     File type; see *note Miscellaneous Types::.

`D'
     N-dimensional dynamic array; see *note Arrays::.

`e'
     Enumeration type; see *note Enumerations::.

`E'
     N-dimensional subarray; see *note Arrays::.

`f'
     Function type; see *note Function Types::.

`F'
     Pascal function parameter; see *note Function Types::

`g'
     Builtin floating point type; see *note Builtin Type Descriptors::.

`G'
     COBOL Group.  See AIX documentation for details.

`i'
     Imported type (AIX); see *note Cross-References::.
     Volatile-qualified type (OS9000).

`k'
     Const-qualified type; see *note Miscellaneous Types::.

`K'
     COBOL File Descriptor.  See AIX documentation for details.

`M'
     Multiple instance type; see *note Miscellaneous Types::.

`n'
     String type; see *note Strings::.

`N'
     Stringptr; see *note Strings::.

`o'
     Opaque type; see *note Typedefs::.

`p'
     Procedure; see *note Function Types::.

`P'
     Packed array; see *note Arrays::.

`r'
     Range type; see *note Subranges::.

`R'
     Builtin floating type; see *note Builtin Type Descriptors:: (Sun).
     Pascal subroutine parameter; see *note 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).

`s'
     Structure type; see *note Structures::.

`S'
     Set type; see *note Miscellaneous Types::.

`u'
     Union; see *note Unions::.

`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.

`w'
     Wide character; see *note Builtin Type Descriptors::.

`x'
     Cross-reference; see *note Cross-References::.

`Y'
     Used by IBM's xlC C++ compiler (for structures, I think).

`z'
     gstring; see *note Strings::.


File: stabs.info,  Node: Expanded Reference,  Next: Questions,  Prev: Type Descriptors,  Up: Top

Appendix D Expanded Reference by Stab Type
******************************************

For a full list of stab types, and cross-references to where they are
described, see *note 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 `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


File: stabs.info,  Node: N_PC,  Next: N_NSYMS,  Up: Expanded Reference

D.1 N_PC
========

 -- `.stabs': N_PC
     Global symbol (for Pascal).

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

          `stabdump.c' says:

          global pascal symbol: name,,0,subtype,line
          << subtype? >>


File: stabs.info,  Node: N_NSYMS,  Next: N_NOMAP,  Prev: N_PC,  Up: Expanded Reference

D.2 N_NSYMS
===========

 -- `.stabn': N_NSYMS
     Number of symbols (according to Ultrix V4.0).

                  0, files,,funcs,lines (stab.def)


File: stabs.info,  Node: N_NOMAP,  Next: N_M2C,  Prev: N_NSYMS,  Up: Expanded Reference

D.3 N_NOMAP
===========

 -- `.stabs': N_NOMAP
     No DST map for symbol (according to Ultrix V4.0).  I think this
     means a variable has been optimized out.

                  name, ,0,type,ignored (stab.def)


File: stabs.info,  Node: N_M2C,  Next: N_BROWS,  Prev: N_NOMAP,  Up: Expanded Reference

D.4 N_M2C
=========

 -- `.stabs': N_M2C
     Modula-2 compilation unit.

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

     See `Dbx and Dbxtool Interfaces', 2nd edition, by Sun, 1988, for
     more information.



File: stabs.info,  Node: N_BROWS,  Next: N_DEFD,  Prev: N_M2C,  Up: Expanded Reference

D.5 N_BROWS
===========

 -- `.stabs': N_BROWS
     Sun source code browser, path to `.cb' file

     <<?>> "path to associated `.cb' file"

     Note: N_BROWS has the same value as N_BSLINE.


File: stabs.info,  Node: N_DEFD,  Next: N_EHDECL,  Prev: N_BROWS,  Up: Expanded Reference

D.6 N_DEFD
==========

 -- `.stabn': 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 `%INITIALIZE'.
     Perhaps `N_M2C' can be used if there are enough empty fields?


File: stabs.info,  Node: N_EHDECL,  Next: N_MOD2,  Prev: N_DEFD,  Up: Expanded Reference

D.7 N_EHDECL
============

 -- `.stabs': N_EHDECL
     GNU C++ exception variable <<?>>.

     "STRING is variable name"

     Note: conflicts with `N_MOD2'.


File: stabs.info,  Node: N_MOD2,  Next: N_CATCH,  Prev: N_EHDECL,  Up: Expanded Reference

D.8 N_MOD2
==========

 -- `.stab?': N_MOD2
     Modula2 info "for imc" (according to Ultrix V4.0)

     Note: conflicts with `N_EHDECL'  <<?>>


File: stabs.info,  Node: N_CATCH,  Next: N_SSYM,  Prev: N_MOD2,  Up: Expanded Reference

D.9 N_CATCH
===========

 -- `.stabn': N_CATCH
     GNU C++ `catch' clause

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


File: stabs.info,  Node: N_SSYM,  Next: N_SCOPE,  Prev: N_CATCH,  Up: Expanded Reference

D.10 N_SSYM
===========

 -- `.stabn': 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>>


File: stabs.info,  Node: N_SCOPE,  Next: Gould,  Prev: N_SSYM,  Up: Expanded Reference

D.11 N_SCOPE
============

 -- `.stab?': N_SCOPE
     Modula2 scope information (Sun linker) <<?>>


File: stabs.info,  Node: Gould,  Next: N_LENG,  Prev: N_SCOPE,  Up: Expanded Reference

D.12 Non-base registers on Gould systems
========================================

 -- `.stab?': N_NBTEXT
 -- `.stab?': N_NBDATA
 -- `.stab?': N_NBBSS
 -- `.stab?': N_NBSTS
 -- `.stab?': 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).

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


File: stabs.info,  Node: N_LENG,  Prev: Gould,  Up: Expanded Reference

D.13 N_LENG
===========

 -- `.stabn': N_LENG
     Second symbol entry containing a length-value for the preceding
     entry.  The value is the length.


File: stabs.info,  Node: Questions,  Next: Stab Sections,  Prev: Expanded Reference,  Up: Top

Appendix E Questions and Anomalies
**********************************

   * For GNU C stabs defining local and global variables (`N_LSYM' and
     `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 `dbxout.c' and
     putting a line number in desc is controlled by `#ifdef
     WINNING_GDB', which defaults to false). GDB supposedly uses this
     information if you say `list VAR'.  In reality, VAR can be a
     variable defined in the program and GDB says `function VAR not
     defined'.

   * In GNU C stabs, there seems to be no way to differentiate tag
     types: structures, unions, and enums (symbol descriptor `T') and
     typedefs (symbol descriptor `t') defined at file scope from types
     defined locally to a procedure or other more local scope.  They
     all use the `N_LSYM' stab type.  Types defined at procedure scope
     are emitted after the `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, `-ansi' and `-traditional' compiler options.
     (Bugs gcc/1063, gdb/1066.)

   * What ends the procedure scope?  Is it the proc block's `N_RBRAC'
     or the next `N_FUN'?  (I believe its the first.)


File: stabs.info,  Node: Stab Sections,  Next: Symbol Types Index,  Prev: Questions,  Up: Top

Appendix F 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


File: stabs.info,  Node: Stab Section Basics,  Next: ELF Linker Relocation,  Up: Stab Sections

F.1 How to Embed Stabs in Sections
==================================

The assembler creates two custom sections, a section named `.stab'
which contains an array of fixed length structures, one struct per stab,
and a section named `.stabstr' containing all the variable length
strings that are referenced by stabs in the `.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 `EI_DATA' field in the `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 (*note Symbol Table Format::), except that the
`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 `.stab' section for each compilation unit is
synthetic, generated entirely by the assembler, with no corresponding
`.stab' directive as input to the assembler.  This stab contains the
following fields:

`n_strx'
     Offset in the `.stabstr' section to the source filename.

`n_type'
     `N_UNDF'.

`n_other'
     Unused field, always zero.  This may eventually be used to hold
     overflows from the count in the `n_desc' field.

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

`n_value'
     Size of the string table fragment associated with this source
     file, in bytes.

   The `.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 `.stab' section has its `sh_link'
member set to the section number of the `.stabstr' section, and the
`.stabstr' section has its ELF section header `sh_type' member set to
`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 `.stab' and `.stabstr' sections may be simply
concatenated by the linker.  GDB then uses the `n_desc' fields to
figure out the extent of the original sections.  Similarly, the
`n_value' fields of the header symbols are added together in order to
get the actual position of the strings in a desired `.stabstr' section.
Although this design obviates any need for the linker to relocate or
otherwise manipulate `.stab' and `.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 `.stabstr' sections
before concatenating, then the offsets to strings in the middle of the
executable's `.stabstr' section would be wrong.

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


File: stabs.info,  Node: ELF Linker Relocation,  Prev: Stab Section Basics,  Up: Stab Sections

F.2 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 `N_SLINE', `N_RBRAC',
and `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 `n_value' field (functions
and static variables) relative to the source file.  For the `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
`Bbss.bss' for the bss section, `Ddata.data' for the data section, and
`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, *Note 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
`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 `S' symbol descriptor stabs (*note Statics::) and functions
(*note 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 `Ttext.text' symbol, analogous
to the `Bbss.bss', etc., symbols.  I recommend this rather than using a
zero value and getting the address from the ELF symbols.

   Finding the correct `Bbss.bss', etc., symbol is difficult, because
the linker simply concatenates the `.stab' sections from each `.o' file
without including any information about which part of a `.stab' section
comes from which `.o' file.  The way GDB does this is to look for an
ELF `STT_FILE' symbol which has the same name as the last component of
the file name from the `N_SO' symbol in the stabs (for example, if the
file name is `../../gdb/main.c', it looks for an ELF `STT_FILE' symbol
named `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 `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.


File: stabs.info,  Node: GNU Free Documentation License,  Prev: Symbol Types Index,  Up: Top

Appendix G GNU Free Documentation License
*****************************************

                     Version 1.3, 3 November 2008

     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
     `http://fsf.org/'

     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

  0. PREAMBLE

     The purpose of this License is to make a manual, textbook, or other
     functional and useful document "free" in the sense of freedom: to
     assure everyone the effective freedom to copy and redistribute it,
     with or without modifying it, either commercially or
     noncommercially.  Secondarily, this License preserves for the
     author and publisher a way to get credit for their work, while not
     being considered responsible for modifications made by others.

     This License is a kind of "copyleft", which means that derivative
     works of the document must themselves be free in the same sense.
     It complements the GNU General Public License, which is a copyleft
     license designed for free software.

     We have designed this License in order to use it for manuals for
     free software, because free software needs free documentation: a
     free program should come with manuals providing the same freedoms
     that the software does.  But this License is not limited to
     software manuals; it can be used for any textual work, regardless
     of subject matter or whether it is published as a printed book.
     We recommend this License principally for works whose purpose is
     instruction or reference.

  1. APPLICABILITY AND DEFINITIONS

     This License applies to any manual or other work, in any medium,
     that contains a notice placed by the copyright holder saying it
     can be distributed under the terms of this License.  Such a notice
     grants a world-wide, royalty-free license, unlimited in duration,
     to use that work under the conditions stated herein.  The
     "Document", below, refers to any such manual or work.  Any member
     of the public is a licensee, and is addressed as "you".  You
     accept the license if you copy, modify or distribute the work in a
     way requiring permission under copyright law.

     A "Modified Version" of the Document means any work containing the
     Document or a portion of it, either copied verbatim, or with
     modifications and/or translated into another language.

     A "Secondary Section" is a named appendix or a front-matter section
     of the Document that deals exclusively with the relationship of the
     publishers or authors of the Document to the Document's overall
     subject (or to related matters) and contains nothing that could
     fall directly within that overall subject.  (Thus, if the Document
     is in part a textbook of mathematics, a Secondary Section may not
     explain any mathematics.)  The relationship could be a matter of
     historical connection with the subject or with related matters, or
     of legal, commercial, philosophical, ethical or political position
     regarding them.

     The "Invariant Sections" are certain Secondary Sections whose
     titles are designated, as being those of Invariant Sections, in
     the notice that says that the Document is released under this
     License.  If a section does not fit the above definition of
     Secondary then it is not allowed to be designated as Invariant.
     The Document may contain zero Invariant Sections.  If the Document
     does not identify any Invariant Sections then there are none.

     The "Cover Texts" are certain short passages of text that are
     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
     that says that the Document is released under this License.  A
     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
     be at most 25 words.

     A "Transparent" copy of the Document means a machine-readable copy,
     represented in a format whose specification is available to the
     general public, that is suitable for revising the document
     straightforwardly with generic text editors or (for images
     composed of pixels) generic paint programs or (for drawings) some
     widely available drawing editor, and that is suitable for input to
     text formatters or for automatic translation to a variety of
     formats suitable for input to text formatters.  A copy made in an
     otherwise Transparent file format whose markup, or absence of
     markup, has been arranged to thwart or discourage subsequent
     modification by readers is not Transparent.  An image format is
     not Transparent if used for any substantial amount of text.  A
     copy that is not "Transparent" is called "Opaque".

     Examples of suitable formats for Transparent copies include plain
     ASCII without markup, Texinfo input format, LaTeX input format,
     SGML or XML using a publicly available DTD, and
     standard-conforming simple HTML, PostScript or PDF designed for
     human modification.  Examples of transparent image formats include
     PNG, XCF and JPG.  Opaque formats include proprietary formats that
     can be read and edited only by proprietary word processors, SGML or
     XML for which the DTD and/or processing tools are not generally
     available, and the machine-generated HTML, PostScript or PDF
     produced by some word processors for output purposes only.

     The "Title Page" means, for a printed book, the title page itself,
     plus such following pages as are needed to hold, legibly, the
     material this License requires to appear in the title page.  For
     works in formats which do not have any title page as such, "Title
     Page" means the text near the most prominent appearance of the
     work's title, preceding the beginning of the body of the text.

     The "publisher" means any person or entity that distributes copies
     of the Document to the public.

     A section "Entitled XYZ" means a named subunit of the Document
     whose title either is precisely XYZ or contains XYZ in parentheses
     following text that translates XYZ in another language.  (Here XYZ
     stands for a specific section name mentioned below, such as
     "Acknowledgements", "Dedications", "Endorsements", or "History".)
     To "Preserve the Title" of such a section when you modify the
     Document means that it remains a section "Entitled XYZ" according
     to this definition.

     The Document may include Warranty Disclaimers next to the notice
     which states that this License applies to the Document.  These
     Warranty Disclaimers are considered to be included by reference in
     this License, but only as regards disclaiming warranties: any other
     implication that these Warranty Disclaimers may have is void and
     has no effect on the meaning of this License.

  2. VERBATIM COPYING

     You may copy and distribute the Document in any medium, either
     commercially or noncommercially, provided that this License, the
     copyright notices, and the license notice saying this License
     applies to the Document are reproduced in all copies, and that you
     add no other conditions whatsoever to those of this License.  You
     may not use technical measures to obstruct or control the reading
     or further copying of the copies you make or distribute.  However,
     you may accept compensation in exchange for copies.  If you
     distribute a large enough number of copies you must also follow
     the conditions in section 3.

     You may also lend copies, under the same conditions stated above,
     and you may publicly display copies.

  3. COPYING IN QUANTITY

     If you publish printed copies (or copies in media that commonly
     have printed covers) of the Document, numbering more than 100, and
     the Document's license notice requires Cover Texts, you must
     enclose the copies in covers that carry, clearly and legibly, all
     these Cover Texts: Front-Cover Texts on the front cover, and
     Back-Cover Texts on the back cover.  Both covers must also clearly
     and legibly identify you as the publisher of these copies.  The
     front cover must present the full title with all words of the
     title equally prominent and visible.  You may add other material
     on the covers in addition.  Copying with changes limited to the
     covers, as long as they preserve the title of the Document and
     satisfy these conditions, can be treated as verbatim copying in
     other respects.

     If the required texts for either cover are too voluminous to fit
     legibly, you should put the first ones listed (as many as fit
     reasonably) on the actual cover, and continue the rest onto
     adjacent pages.

     If you publish or distribute Opaque copies of the Document
     numbering more than 100, you must either include a
     machine-readable Transparent copy along with each Opaque copy, or
     state in or with each Opaque copy a computer-network location from
     which the general network-using public has access to download
     using public-standard network protocols a complete Transparent
     copy of the Document, free of added material.  If you use the
     latter option, you must take reasonably prudent steps, when you
     begin distribution of Opaque copies in quantity, to ensure that
     this Transparent copy will remain thus accessible at the stated
     location until at least one year after the last time you
     distribute an Opaque copy (directly or through your agents or
     retailers) of that edition to the public.

     It is requested, but not required, that you contact the authors of
     the Document well before redistributing any large number of
     copies, to give them a chance to provide you with an updated
     version of the Document.

  4. MODIFICATIONS

     You may copy and distribute a Modified Version of the Document
     under the conditions of sections 2 and 3 above, provided that you
     release the Modified Version under precisely this License, with
     the Modified Version filling the role of the Document, thus
     licensing distribution and modification of the Modified Version to
     whoever possesses a copy of it.  In addition, you must do these
     things in the Modified Version:

       A. Use in the Title Page (and on the covers, if any) a title
          distinct from that of the Document, and from those of
          previous versions (which should, if there were any, be listed
          in the History section of the Document).  You may use the
          same title as a previous version if the original publisher of
          that version gives permission.

       B. List on the Title Page, as authors, one or more persons or
          entities responsible for authorship of the modifications in
          the Modified Version, together with at least five of the
          principal authors of the Document (all of its principal
          authors, if it has fewer than five), unless they release you
          from this requirement.

       C. State on the Title page the name of the publisher of the
          Modified Version, as the publisher.

       D. Preserve all the copyright notices of the Document.

       E. Add an appropriate copyright notice for your modifications
          adjacent to the other copyright notices.

       F. Include, immediately after the copyright notices, a license
          notice giving the public permission to use the Modified
          Version under the terms of this License, in the form shown in
          the Addendum below.

       G. Preserve in that license notice the full lists of Invariant
          Sections and required Cover Texts given in the Document's
          license notice.

       H. Include an unaltered copy of this License.

       I. Preserve the section Entitled "History", Preserve its Title,
          and add to it an item stating at least the title, year, new
          authors, and publisher of the Modified Version as given on
          the Title Page.  If there is no section Entitled "History" in
          the Document, create one stating the title, year, authors,
          and publisher of the Document as given on its Title Page,
          then add an item describing the Modified Version as stated in
          the previous sentence.

       J. Preserve the network location, if any, given in the Document
          for public access to a Transparent copy of the Document, and
          likewise the network locations given in the Document for
          previous versions it was based on.  These may be placed in
          the "History" section.  You may omit a network location for a
          work that was published at least four years before the
          Document itself, or if the original publisher of the version
          it refers to gives permission.

       K. For any section Entitled "Acknowledgements" or "Dedications",
          Preserve the Title of the section, and preserve in the
          section all the substance and tone of each of the contributor
          acknowledgements and/or dedications given therein.

       L. Preserve all the Invariant Sections of the Document,
          unaltered in their text and in their titles.  Section numbers
          or the equivalent are not considered part of the section
          titles.

       M. Delete any section Entitled "Endorsements".  Such a section
          may not be included in the Modified Version.

       N. Do not retitle any existing section to be Entitled
          "Endorsements" or to conflict in title with any Invariant
          Section.

       O. Preserve any Warranty Disclaimers.

     If the Modified Version includes new front-matter sections or
     appendices that qualify as Secondary Sections and contain no
     material copied from the Document, you may at your option
     designate some or all of these sections as invariant.  To do this,
     add their titles to the list of Invariant Sections in the Modified
     Version's license notice.  These titles must be distinct from any
     other section titles.

     You may add a section Entitled "Endorsements", provided it contains
     nothing but endorsements of your Modified Version by various
     parties--for example, statements of peer review or that the text
     has been approved by an organization as the authoritative
     definition of a standard.

     You may add a passage of up to five words as a Front-Cover Text,
     and a passage of up to 25 words as a Back-Cover Text, to the end
     of the list of Cover Texts in the Modified Version.  Only one
     passage of Front-Cover Text and one of Back-Cover Text may be
     added by (or through arrangements made by) any one entity.  If the
     Document already includes a cover text for the same cover,
     previously added by you or by arrangement made by the same entity
     you are acting on behalf of, you may not add another; but you may
     replace the old one, on explicit permission from the previous
     publisher that added the old one.

     The author(s) and publisher(s) of the Document do not by this
     License give permission to use their names for publicity for or to
     assert or imply endorsement of any Modified Version.

  5. COMBINING DOCUMENTS

     You may combine the Document with other documents released under
     this License, under the terms defined in section 4 above for
     modified versions, provided that you include in the combination
     all of the Invariant Sections of all of the original documents,
     unmodified, and list them all as Invariant Sections of your
     combined work in its license notice, and that you preserve all
     their Warranty Disclaimers.

     The combined work need only contain one copy of this License, and
     multiple identical Invariant Sections may be replaced with a single
     copy.  If there are multiple Invariant Sections with the same name
     but different contents, make the title of each such section unique
     by adding at the end of it, in parentheses, the name of the
     original author or publisher of that section if known, or else a
     unique number.  Make the same adjustment to the section titles in
     the list of Invariant Sections in the license notice of the
     combined work.

     In the combination, you must combine any sections Entitled
     "History" in the various original documents, forming one section
     Entitled "History"; likewise combine any sections Entitled
     "Acknowledgements", and any sections Entitled "Dedications".  You
     must delete all sections Entitled "Endorsements."

  6. COLLECTIONS OF DOCUMENTS

     You may make a collection consisting of the Document and other
     documents released under this License, and replace the individual
     copies of this License in the various documents with a single copy
     that is included in the collection, provided that you follow the
     rules of this License for verbatim copying of each of the
     documents in all other respects.

     You may extract a single document from such a collection, and
     distribute it individually under this License, provided you insert
     a copy of this License into the extracted document, and follow
     this License in all other respects regarding verbatim copying of
     that document.

  7. AGGREGATION WITH INDEPENDENT WORKS

     A compilation of the Document or its derivatives with other
     separate and independent documents or works, in or on a volume of
     a storage or distribution medium, is called an "aggregate" if the
     copyright resulting from the compilation is not used to limit the
     legal rights of the compilation's users beyond what the individual
     works permit.  When the Document is included in an aggregate, this
     License does not apply to the other works in the aggregate which
     are not themselves derivative works of the Document.

     If the Cover Text requirement of section 3 is applicable to these
     copies of the Document, then if the Document is less than one half
     of the entire aggregate, the Document's Cover Texts may be placed
     on covers that bracket the Document within the aggregate, or the
     electronic equivalent of covers if the Document is in electronic
     form.  Otherwise they must appear on printed covers that bracket
     the whole aggregate.

  8. TRANSLATION

     Translation is considered a kind of modification, so you may
     distribute translations of the Document under the terms of section
     4.  Replacing Invariant Sections with translations requires special
     permission from their copyright holders, but you may include
     translations of some or all Invariant Sections in addition to the
     original versions of these Invariant Sections.  You may include a
     translation of this License, and all the license notices in the
     Document, and any Warranty Disclaimers, provided that you also
     include the original English version of this License and the
     original versions of those notices and disclaimers.  In case of a
     disagreement between the translation and the original version of
     this License or a notice or disclaimer, the original version will
     prevail.

     If a section in the Document is Entitled "Acknowledgements",
     "Dedications", or "History", the requirement (section 4) to
     Preserve its Title (section 1) will typically require changing the
     actual title.

  9. TERMINATION

     You may not copy, modify, sublicense, or distribute the Document
     except as expressly provided under this License.  Any attempt
     otherwise to copy, modify, sublicense, or distribute it is void,
     and will automatically terminate your rights under this License.

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly
     and finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from
     you under this License.  If your rights have been terminated and
     not permanently reinstated, receipt of a copy of some or all of
     the same material does not give you any rights to use it.

 10. FUTURE REVISIONS OF THIS LICENSE

     The Free Software Foundation may publish new, revised versions of
     the GNU Free Documentation License from time to time.  Such new
     versions will be similar in spirit to the present version, but may
     differ in detail to address new problems or concerns.  See
     `http://www.gnu.org/copyleft/'.

     Each version of the License is given a distinguishing version
     number.  If the Document specifies that a particular numbered
     version of this License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that specified version or of any later version that has been
     published (not as a draft) by the Free Software Foundation.  If
     the Document does not specify a version number of this License,
     you may choose any version ever published (not as a draft) by the
     Free Software Foundation.  If the Document specifies that a proxy
     can decide which future versions of this License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Document.

 11. RELICENSING

     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
     World Wide Web server that publishes copyrightable works and also
     provides prominent facilities for anybody to edit those works.  A
     public wiki that anybody can edit is an example of such a server.
     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
     site means any set of copyrightable works thus published on the MMC
     site.

     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
     license published by Creative Commons Corporation, a not-for-profit
     corporation with a principal place of business in San Francisco,
     California, as well as future copyleft versions of that license
     published by that same organization.

     "Incorporate" means to publish or republish a Document, in whole or
     in part, as part of another Document.

     An MMC is "eligible for relicensing" if it is licensed under this
     License, and if all works that were first published under this
     License somewhere other than this MMC, and subsequently
     incorporated in whole or in part into the MMC, (1) had no cover
     texts or invariant sections, and (2) were thus incorporated prior
     to November 1, 2008.

     The operator of an MMC Site may republish an MMC contained in the
     site under CC-BY-SA on the same site at any time before August 1,
     2009, provided the MMC is eligible for relicensing.


ADDENDUM: How to use this License for your documents
====================================================

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:

       Copyright (C)  YEAR  YOUR NAME.
       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, no Front-Cover Texts, and no Back-Cover
       Texts.  A copy of the license is included in the section entitled ``GNU
       Free Documentation License''.

   If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:

         with the Invariant Sections being LIST THEIR TITLES, with
         the Front-Cover Texts being LIST, and with the Back-Cover Texts
         being LIST.

   If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

   If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License, to
permit their use in free software.


File: stabs.info,  Node: Symbol Types Index,  Next: GNU Free Documentation License,  Prev: Stab Sections,  Up: Top

Symbol Types Index
******************

 [index ]
* Menu:

* .bb:                                   Block Structure.      (line 26)
* .be:                                   Block Structure.      (line 26)
* C_BCOMM:                               Common Blocks.        (line 10)
* C_BINCL:                               Include Files.        (line 41)
* C_BLOCK:                               Block Structure.      (line 26)
* C_BSTAT:                               Statics.              (line 31)
* C_DECL, for types:                     Typedefs.             (line  6)
* C_ECOML:                               Common Blocks.        (line 17)
* C_ECOMM:                               Common Blocks.        (line 10)
* C_EINCL:                               Include Files.        (line 41)
* C_ENTRY:                               Alternate Entry Points.
                                                               (line  6)
* C_ESTAT:                               Statics.              (line 31)
* C_FILE:                                Source Files.         (line 61)
* C_FUN:                                 Procedures.           (line 18)
* C_GSYM:                                Global Variables.     (line  6)
* C_LSYM:                                Stack Variables.      (line 11)
* C_PSYM:                                Parameters.           (line 12)
* C_RPSYM:                               Register Parameters.  (line 15)
* C_RSYM:                                Register Variables.   (line  6)
* C_STSYM:                               Statics.              (line 31)
* N_BCOMM:                               Common Blocks.        (line 10)
* N_BINCL:                               Include Files.        (line 17)
* N_BROWS:                               N_BROWS.              (line  7)
* N_BSLINE:                              Line Numbers.         (line 12)
* N_CATCH:                               N_CATCH.              (line  7)
* N_DEFD:                                N_DEFD.               (line  7)
* N_DSLINE:                              Line Numbers.         (line 12)
* N_ECOML:                               Common Blocks.        (line 17)
* N_ECOMM:                               Common Blocks.        (line 10)
* N_EHDECL:                              N_EHDECL.             (line  7)
* N_EINCL:                               Include Files.        (line 17)
* N_ENTRY:                               Alternate Entry Points.
                                                               (line  6)
* N_EXCL:                                Include Files.        (line 17)
* N_FNAME:                               Procedures.           (line  6)
* N_FUN, for functions:                  Procedures.           (line  6)
* N_FUN, for variables:                  Statics.              (line 12)
* N_GSYM:                                Global Variables.     (line  6)
* N_GSYM, for functions (Sun acc):       Procedures.           (line  6)
* N_LBRAC:                               Block Structure.      (line  6)
* N_LCSYM:                               Statics.              (line 12)
* N_LENG:                                N_LENG.               (line  7)
* N_LSYM, for parameter:                 Local Variable Parameters.
                                                               (line 35)
* N_LSYM, for stack variables:           Stack Variables.      (line 11)
* N_LSYM, for types:                     Typedefs.             (line  6)
* N_M2C:                                 N_M2C.                (line  7)
* N_MAC_DEFINE:                          Macro define and undefine.
                                                               (line 11)
* N_MAC_UNDEF:                           Macro define and undefine.
                                                               (line 14)
* N_MAIN:                                Main Program.         (line  6)
* N_MOD2:                                N_MOD2.               (line  7)
* N_NBBSS:                               Gould.                (line  9)
* N_NBDATA:                              Gould.                (line  8)
* N_NBLCS:                               Gould.                (line 11)
* N_NBSTS:                               Gould.                (line 10)
* N_NBTEXT:                              Gould.                (line  7)
* N_NOMAP:                               N_NOMAP.              (line  7)
* N_NSYMS:                               N_NSYMS.              (line  7)
* N_PC:                                  N_PC.                 (line  7)
* N_PSYM:                                Parameters.           (line 12)
* N_RBRAC:                               Block Structure.      (line  6)
* N_ROSYM:                               Statics.              (line 12)
* N_RSYM:                                Register Variables.   (line  6)
* N_RSYM, for parameters:                Register Parameters.  (line 15)
* N_SCOPE:                               N_SCOPE.              (line  7)
* N_SLINE:                               Line Numbers.         (line  6)
* N_SO:                                  Source Files.         (line  6)
* N_SOL:                                 Include Files.        (line 11)
* N_SSYM:                                N_SSYM.               (line  7)
* N_STSYM:                               Statics.              (line 12)
* N_STSYM, for functions (Sun acc):      Procedures.           (line  6)



Tag Table:
Node: Top1644
Node: Overview2691
Node: Flow4106
Node: Stabs Format5632
Node: String Field7194
Node: C Example12625
Node: Assembly Code13170
Node: Program Structure15141
Node: Main Program15867
Node: Source Files16428
Node: Include Files18880
Node: Line Numbers21545
Node: Procedures23079
Node: Nested Procedures28969
Node: Block Structure30145
Node: Alternate Entry Points31551
Node: Constants32284
Node: Variables35396
Node: Stack Variables36084
Node: Global Variables37785
Node: Register Variables38941
Node: Common Blocks39763
Node: Statics41017
Node: Based Variables43596
Node: Parameters44981
Node: Register Parameters46593
Node: Local Variable Parameters48854
Node: Reference Parameters51769
Node: Conformant Arrays52389
Node: Types53106
Node: Builtin Types54053
Node: Traditional Builtin Types55199
Node: Traditional Integer Types55600
Node: Traditional Other Types57908
Node: Builtin Type Descriptors58822
Node: Negative Type Numbers62322
Node: Miscellaneous Types68677
Node: Cross-References70563
Node: Subranges72238
Node: Arrays73477
Node: Strings76702
Node: Enumerations77764
Node: Structures80149
Node: Typedefs82856
Node: Unions84180
Node: Function Types85761
Node: Macro define and undefine87343
Node: Symbol Tables88920
Node: Symbol Table Format89372
Node: Transformations On Symbol Tables90820
Node: Transformations On Static Variables92174
Node: Transformations On Global Variables92910
Node: Stab Section Transformations94153
Node: Cplusplus95536
Node: Class Names96119
Node: Nested Symbols96864
Node: Basic Cplusplus Types97710
Node: Simple Classes99270
Node: Class Instance103564
Node: Methods104281
Node: Method Type Descriptor106500
Node: Member Type Descriptor107700
Node: Protections108492
Node: Method Modifiers111582
Node: Virtual Methods113210
Node: Inheritance117011
Node: Virtual Base Classes120707
Node: Static Members122951
Node: Stab Types123421
Node: Non-Stab Symbol Types124045
Node: Stab Symbol Types125476
Node: Symbol Descriptors129407
Node: Type Descriptors132186
Node: Expanded Reference135398
Node: N_PC136816
Node: N_NSYMS137184
Node: N_NOMAP137425
Node: N_M2C137731
Node: N_BROWS138165
Node: N_DEFD138448
Node: N_EHDECL138905
Node: N_MOD2139156
Node: N_CATCH139394
Node: N_SSYM139888
Node: N_SCOPE140173
Node: Gould140363
Node: N_LENG141355
Node: Questions141583
Node: Stab Sections143227
Node: Stab Section Basics143825
Node: ELF Linker Relocation147166
Node: GNU Free Documentation License150576
Node: Symbol Types Index175733

End Tag Table
