* stabs.texinfo (XCOFF-differences): Remove references to
authorJim Kingdon <jkingdon@engr.sgi.com>
Sun, 22 Aug 1993 19:53:21 +0000 (19:53 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Sun, 22 Aug 1993 19:53:21 +0000 (19:53 +0000)
non-existent types N_DECL and N_RPSYM.

* stabs.texinfo (String Field): Say that type attributes bug is
fixed in GDB 4.10, since it is.

* stabs.texinfo: Clean up djm cleanups, and more cleanups of my own.

gdb/doc/ChangeLog
gdb/doc/stabs.texinfo

index e04e08e513d6d90fdc276a3e34ac1d08c13e2bd4..681ec0e1a012b99fe59779efea758379f9a2212b 100644 (file)
@@ -1,3 +1,17 @@
+Sun Aug 22 12:15:18 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
+
+       * stabs.texinfo (XCOFF-differences): Remove references to
+       non-existent types N_DECL and N_RPSYM.
+
+       * stabs.texinfo (String Field): Say that type attributes bug is
+       fixed in GDB 4.10, since it is.
+
+       * stabs.texinfo: Clean up djm cleanups, and more cleanups of my own.
+
+Sat Aug 21 04:32:28 1993  David MacKenzie  (djm@cygnus.com)
+
+       * stabs.texinfo: Formatting cleanups.
+
 Fri Aug 20 20:49:53 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
        * stabs.texinfo: When explaining the n_type of a stab, standardize
index d831a41e1868e1a159be2e4d8ba44bb694210624..c997150e0544919faccb3861f66a462b3e4da3df 100644 (file)
@@ -101,19 +101,18 @@ the University of California at Berkeley, for the @code{pdx} Pascal
 debugger; the format has spread widely since then.
 
 This document is one of the few published sources of documentation on
-stabs.  It is believed to be completely comprehensive for stabs used by
-C.  The lists of symbol descriptors (@pxref{Symbol Descriptors}) and
-type descriptors (@pxref{Type Descriptors}) are believed to be completely
-comprehensive.  There are known to be stabs for C++ and COBOL which are
-poorly documented here.  Stabs specific to other languages (e.g., Pascal,
-Modula-2) are probably not as well documented as they should be.
-
-Other sources of information on stabs are @cite{dbx and dbxtool
-interfaces}, 2nd edition, by Sun, circa 1988, and @cite{AIX Version 3.2
-Files Reference}, Fourth Edition, September 1992, "dbx Stabstring
-Grammar" in the a.out section, page 2-31.  This document is believed to
-incorporate the information from those two sources except where it
-explictly directs you to them for more information.
+stabs.  It is believed to be comprehensive for stabs used by C.  The
+lists of symbol descriptors (@pxref{Symbol Descriptors}) and type
+descriptors (@pxref{Type Descriptors}) are believed to be completely
+comprehensive.  Stabs for COBOL-specific features and for variant
+records (used by Pascal and Modula-2) are poorly documented here.
+
+Other sources of information on stabs are @cite{Dbx and Dbxtool
+Interfaces}, 2nd edition, by Sun, 1988, and @cite{AIX Version 3.2 Files
+Reference}, Fourth Edition, September 1992, "dbx Stabstring Grammar" in
+the a.out section, page 2-31.  This document is believed to incorporate
+the information from those two sources except where it explictly directs
+you to them for more information.
 
 @menu
 * Flow::                       Overview of debugging information flow
@@ -207,7 +206,7 @@ The overall format is of the @var{string} field is:
 @var{name} can be omitted, which means the stab represents an unnamed
 object.  For example, @samp{:t10=*2} defines type 10 as a pointer to
 type 2, but does not give the type a name.  Omitting the @var{name}
-field is supported by AIX DBX and GDB after about version 4.8, but not
+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.
@@ -240,10 +239,9 @@ Descriptors}, for a list of
 
 There is an AIX extension for type attributes.  Following the @samp{=}
 is any number of type attributes.  Each one starts with @samp{@@} and
-ends with @samp{;}.  Debuggers, including AIX's DBX, skip any type
-attributes they do not recognize.  GDB 4.9 does not do this---it will
-ignore the entire symbol containing a type attribute.  Hopefully this
-will be fixed in the next GDB release.  Because of a conflict with C++
+ends with @samp{;}.  Debuggers, including AIX's dbx and GDB 4.10, skip
+any type attributes they do not recognize.  GDB 4.9 and other versions
+of dbx may not do this.  Because of a conflict with C++
 (@pxref{Cplusplus}), new attributes should not be defined which begin
 with a digit, @samp{(}, or @samp{-}; GDB may be unable to distinguish
 those from the C++ type descriptor @samp{@@}.  The attributes are:
@@ -267,9 +265,9 @@ expense of speed.
 @end table
 
 All this can make the @var{string} field quite long.  All
-versions of GDB, and some versions of DBX, can handle arbitrarily long
-strings.  But many versions of DBX cretinously limit the strings to
-about 80 characters, so compilers which must work with such DBX's need
+versions of GDB, and some versions of dbx, can handle arbitrarily long
+strings.  But many versions of dbx cretinously limit the strings to
+about 80 characters, so compilers which must work with such dbx's need
 to split the @code{.stabs} directive into several @code{.stabs}
 directives.  Each stab duplicates exactly all but the
 @var{string} field.  The @var{string} field of
@@ -360,9 +358,6 @@ types used to describe C language source files.
 @node Program structure
 @chapter Encoding for the structure of the program
 
-For the numeric values of the symbolic stab types, see @ref{Stab Types}.
-For a reference to them, see @ref{Expanded reference}.
-
 @menu
 * Main Program::               Indicate what the main program is
 * Source Files::               The path and name of the source file
@@ -474,7 +469,7 @@ since GDB 3.5.
 
 XCOFF uses COFF line numbers instead, which are outside the scope of
 this document, ammeliorated by adequate marking of include files
-(@pxref{Source Files}).
+(@pxref{Include Files}).
 
 For single source lines that generate discontiguous code, such as flow
 of control statements, there may be more than one line number entry for
@@ -486,14 +481,14 @@ start of each code range, each with the same line number.
 
 All of the following stabs use the @code{N_FUN} symbol type.
 
-A function is represented by an @samp{F} symbol descriptor (@var{desc}
-field) for a global (extern) function, and @samp{f} for a static (local)
-function.  The next @code{N_SLINE} symbol can be used to find the line
-number of the start of the function.  The value field is the address of
-the start of the function (absolute for @code{a.out}; relative to the
-start of the file for Sun's stabs-in-ELF).  The type information of the
-stab represents the return type of the function; thus @samp{foo:f5}
-means that foo is a function returning type 5.
+A function is represented by an @samp{F} symbol descriptor for a global
+(extern) function, and @samp{f} for a static (local) function.  The next
+@code{N_SLINE} symbol can be used to find the line number of the start
+of the function.  The value field is the address of the start of the
+function (absolute for @code{a.out}; relative to the start of the file
+for Sun's stabs-in-ELF).  The type information of the stab represents
+the return type of the function; thus @samp{foo:f5} means that foo is a
+function returning type 5.
 
 The type information of the stab is optionally followed by type
 information for each argument, with each argument preceded by @samp{;}.
@@ -501,7 +496,7 @@ An argument type of 0 means that additional arguments are being passed,
 whose types and number may vary (@samp{...} in ANSI C).  This extension
 is used by Sun's Solaris compiler.  GDB has tolerated it (i.e., at least
 parsed the syntax, if not necessarily used the information) at least
-since version 4.8; I don't know whether all versions of DBX will
+since version 4.8; I don't know whether all versions of dbx will
 tolerate it.  The argument types given here are not redundant
 with the symbols for the arguments themselves (@pxref{Parameters}), they
 are the types of the arguments as they are passed, before any
@@ -613,7 +608,7 @@ followed by line 50 of our sample assembly output, which has this form:
 
 The program's block structure is represented by the @code{N_LBRAC} (left
 brace) and the @code{N_RBRAC} (right brace) stab types.  The variables
-defined inside a block preceded the @code{N_LBRAC} symbol for most
+defined inside a block precede the @code{N_LBRAC} symbol for most
 compilers, including GCC.  Other compilers, such as the Convex, Acorn
 RISC machine, and Sun @code{acc} compilers, put the variables after the
 @code{N_LBRAC} symbol.  The values of the @code{N_LBRAC} and
@@ -629,7 +624,7 @@ represents the procedure itself.
 
 Sun documents the @code{desc} field of @code{N_LBRAC} and
 @code{N_RBRAC} symbols as containing the nesting level of the block.
-However, DBX seems not to care, and GCC always sets @code{desc} to
+However, dbx seems not to care, and GCC always sets @code{desc} to
 zero.
 
 @node Constants
@@ -651,7 +646,7 @@ Character constant.  @var{value} is the numeric value of the constant.
 @item e @var{type-information} , @var{value}
 Constant whose value can be represented as integral.
 @var{type-information} is the type of the constant, as it would appear
-after a symbol descriptor (@pxref{Stabs Format}).  @var{value} is the
+after a symbol descriptor (@pxref{String Field}).  @var{value} is the
 numeric value of the constant.  GDB 4.9 does not actually get the right
 value if @var{value} does not fit in a host @code{int}, but it does not
 do anything violent, and future debuggers could be extended to accept
@@ -679,7 +674,7 @@ string are represented as @samp{\"}).
 
 @item S @var{type-information} , @var{elements} , @var{bits} , @var{pattern}
 Set constant.  @var{type-information} is the type of the constant, as it
-would appear after a symbol descriptor (@pxref{Stabs Format}).
+would appear after a symbol descriptor (@pxref{String Field}).
 @var{elements} is the number of elements in the set (Does this means
 how many bits of @var{pattern} are actually used, which would be
 redundant with the type, or perhaps the number of bits set in
@@ -880,12 +875,9 @@ that type descriptors are distinct from symbol descriptors.
 
 These stabs have the @code{N_LSYM} stab type.  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 stab for an automatic variable is located just before the
-@code{N_LBRAC} stab describing the open brace of the block to which it
-is scoped, except for some compilers which put the automatic variables
-after the @code{N_LBRAC} (see @code{VARIABLES_INSIDE_BLOCK} in GDB).
+this is an offset from the frame pointer and is negative.  The location
+of the stab specifies what block it is defined in; see @ref{Block
+Structure}.
 
 For example, the following C code
 
@@ -916,7 +908,7 @@ stabs.
 A variable whose scope which is not specific to just one source file is
 represented by the @samp{G} symbol descriptor.  These stabs use the
 @code{N_GSYM} stab type.  The type information for the stab
-(@pxref{Stabs Format}) gives the type of the variable.
+(@pxref{String Field}) gives the type of the variable.
 
 For example, the following source code:
 
@@ -997,7 +989,7 @@ Initialized static variables are represented by the @samp{S} and
 @c for `double' variables which although declared const are actually in
 @c the data segment (the text segment can't guarantee 8 byte alignment).
 @c (although GCC
-@c 2.4.5 has a bug in that it uses @code{N_FUN}, so neither DBX nor GDB can
+@c 2.4.5 has a bug in that it uses @code{N_FUN}, so neither dbx nor GDB can
 @c find the variables)
 In a.out files, @code{N_STSYM} means the data segment, @code{N_FUN}
 means the text segment, and @code{N_LCSYM} means the bss segment.
@@ -1039,11 +1031,14 @@ yield the following stabs:
 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).
+parameters are declared in the source file).  The exact form of the stab
+depends on how the parameter is being passed.
 
-The symbol descriptor @samp{p} is used to refer to parameters which are
-in the arglist.  Symbols have symbol type @code{N_PSYM}.  The value of
-the symbol is the offset relative to the argument list.
+Parameters passed on the stack use the symbol descriptor @samp{p}, and
+the @code{N_PSYM} symbol type.  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.
 
 If the parameter is passed in a register, then the traditional way to do
 this is to provide two symbols for each argument:
@@ -1093,17 +1088,18 @@ argument which 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.  Some compilers use
-the pair of symbols approach described above (@samp{@var{arg}:p} followed by
-@samp{@var{arg}:}); this includes GCC1 (not GCC2) on the sparc when passing a small
-structure and GCC2 (sometimes) when the argument type is float and it is
-passed as a double and converted to float by the prologue (in the latter
-case the type of the @samp{@var{arg}:p} symbol is double and the type of the @samp{@var{arg}:}
-symbol is float).  GCC, at least on the 960, uses a single @samp{p}
-symbol descriptor for an argument which is stored as a local variable
-but uses @code{N_LSYM} instead of @code{N_PSYM}.  In this case the value
-of the symbol is an offset relative to the local variables for that
-function, not relative to the arguments (on some machines those are the
-same thing, but not on all).
+the pair of symbols approach described above (@samp{@var{arg}:p}
+followed by @samp{@var{arg}:}); this includes GCC1 (not GCC2) on the
+sparc when passing a small structure and GCC2 (sometimes) when the
+argument type is float and it is passed as a double and converted to
+float by the prologue (in the latter case the type of the
+@samp{@var{arg}:p} symbol is double and the type of the
+@samp{@var{arg}:} symbol is float).  GCC, at least on the 960, uses a
+single @samp{p} symbol descriptor for an argument which is stored as a
+local variable but uses @code{N_LSYM} instead of @code{N_PSYM}.  In this
+case the value of the symbol is an offset relative to the local
+variables for that function, not relative to the arguments (on some
+machines those are the same thing, but not on all).
 
 If the parameter is passed by reference (e.g., Pascal VAR parameters),
 then type symbol descriptor is @samp{v} if it is in the argument list,
@@ -1159,7 +1155,7 @@ type definitions.  Type 21 is pointer to type 2 (char) and argv (type 20) is
 pointer to type 21.
 
 @node Types
-@chapter Defining types
+@chapter Defining Types
 
 Now let's look at some variable definitions involving complex types.
 This involves understanding better how types are described.  In the
@@ -1194,11 +1190,11 @@ 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 convolunted, so new ways
-have been invented to describe them.  Sun's ACC uses the @samp{b} and
-@samp{R} type descriptors (@pxref{Builtin Type Descriptors}), and IBM
-uses negative type numbers (@pxref{Negative Type Numbers}).  GDB can
-accept all three, as of version 4.8; DBX just accepts the traditional
-builtin types and perhaps one of the other two formats.
+have been invented to describe them.  Sun's @code{acc} uses special
+builtin type descriptors (@samp{b} and @samp{R}), and IBM uses negative
+type numbers.  GDB can accept all three, 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 seatbelts and prepare for kludgery
@@ -1226,13 +1222,15 @@ Builtin types can also be described as subranges of @code{int}:
 If the lower bound of a subrange is 0 and the upper bound is -1, it
 means that the type is an unsigned integral type whose bounds are too
 big to describe in an int.  Traditionally this is only used for
-@code{unsigned int} and @code{unsigned long}; GCC also sometimes uses it
-for @code{long long} and @code{unsigned long long}, and the only way to
-tell those types apart is to look at their names.  On other machines GCC
-puts out bounds in octal, with a leading 0.  In this case a negative
-bound consists of a number which is a 1 bit followed by a bunch of 0
-bits, and a positive bound is one in which a bunch of bits are 1.
+@code{unsigned int} and @code{unsigned long}.  For larger types, GCC
+2.4.5 puts out bounds in octal, with a leading 0.  In this case a
+negative bound consists of a number which is a 1 bit followed by a bunch
+of 0 bits, and a positive bound is one in which a bunch of bits are 1.
+All known versions of dbx and GDB version 4 accept this, 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.
 
+@c FIXME: Update this for the 2.4.5 output, not 2.3.3
 @example
 .stabs "unsigned int:t4=r1;0;-1;",128,0,0,0
 .stabs "long long int:t7=r1;0;-1;",128,0,0,0
@@ -1260,15 +1258,15 @@ bytes in the type:
 @end example
 
 However, GCC writes @code{long double} the same way it writes
-@code{double}; the only way to distinguish them is by the name:
+@code{double}, so there is no way to distinguish.
 
 @example
 .stabs "long double:t14=r1;8;0;",128,0,0,0
 @end example
 
-Complex types are defined the same way as floating-point types; the only
-way to distinguish a single-precision complex from a double-precision
-floating-point type is by the name.
+Complex types are defined the same way as floating-point types; there is
+no way to distinguish a single-precision complex from a double-precision
+floating-point type.
 
 The C @code{void} type is defined as itself:
 
@@ -1391,7 +1389,7 @@ different names have different negative type numbers.
 @code{int}, 32 bit signed integral type.
 
 @item -2
-@code{char}, 8 bit type holding a character.   Both GDB and DBX on AIX
+@code{char}, 8 bit type holding a character.   Both GDB and dbx on AIX
 treat this as signed.  GCC uses this type whether @code{char} is signed
 or not, which seems like a bad idea.  The AIX compiler (xlc) seems to
 avoid this type; it uses -5 instead for @code{char}.
@@ -1581,7 +1579,7 @@ the type (This differs from merely naming the type (@pxref{Typedefs}) in
 that it identifies the module; I don't understand whether the name of
 the type given here is always just the same as the name we are giving
 it, or whether this type descriptor is used with a nameless stab
-(@pxref{Stabs Format}), or what).  The symbol ends with @samp{;}.
+(@pxref{String Field}), or what).  The symbol ends with @samp{;}.
 
 @node Subranges
 @section Subrange types
@@ -1639,7 +1637,7 @@ range anyway; I'm not sure about dbx.
 
 It is well established, and widely used, that the type of the index,
 unlike most types found in the stabs, is merely a type definition, not
-type information (@pxref{Stabs Format}) (that is, it need not start with
+type information (@pxref{String Field}) (that is, it need not start with
 @var{type-number}@code{=} if it is defining a new type).  According to a
 comment in GDB, this is also true of the type of the array elements; it
 gives @samp{ar1;1;10;ar1;1;10;4} as a legitimate way to express a two
@@ -1677,7 +1675,7 @@ closely than normal, saving memory at the expense of speed.  For
 example, an array of 3-byte objects might, if unpacked, have each
 element aligned on a 4-byte boundary, but if packed, have no padding.
 One way to specify that something is packed is with type attributes
-(@pxref{Stabs Format}), in the case of arrays another is to use the
+(@pxref{String Field}), in the case of arrays another is to use the
 @samp{P} type descriptor instead of @samp{a}.  Other than specifying a
 packed array, @samp{P} is identical to @samp{a}.
 
@@ -1762,7 +1760,7 @@ generates the following stab
 @end example
 
 The symbol descriptor (T) says that the stab describes a structure,
-enumeration, or type tag.  The type descriptor e, following the 22= of
+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
 @var{name:value,}. The list of elements ends with a @samp{;}.
@@ -1848,7 +1846,7 @@ definition for an element which is a pointer to type 16.
 @section Giving a Type a Name
 
 To give a type a name, use the @samp{t} symbol descriptor.  The type
-specified by the type information (@pxref{Stabs Format}) for the stab.
+specified by the type information (@pxref{String Field}) for the stab.
 For example,
 
 @example
@@ -1866,7 +1864,7 @@ If the type is an opaque type (I believe this is a Modula-2 feature),
 AIX provides a type descriptor to specify it.  The type descriptor is
 @samp{o} and is followed by a name.  I don't know what the name
 means---is it always the same as the name of the type, or is this type
-descriptor used with a nameless stab (@pxref{Stabs Format})?  There
+descriptor used with a nameless stab (@pxref{String Field})?  There
 optionally follows a comma followed by type information which defines
 the type of this type.  If omitted, a semicolon is used in place of the
 comma and the type information, and the type is much like a generic
@@ -1916,7 +1914,7 @@ scope.
 @end smallexample
 
 The symbol descriptor, @samp{T}, following the @samp{name:} means that the stab
-describes an enumeration, struct or type tag.  The type descriptor @samp{u},
+describes an enumeration, struct or union tag.  The type descriptor @samp{u},
 following the @samp{23=} of the type definition, narrows it down to a union
 type definition.  Following the @samp{u} is the number of bytes in the union.
 After that is a list of union element descriptions.  Their format is
@@ -1992,6 +1990,7 @@ symbol table entry for that stab points to a string table entry
 containing the string data from the stab.  Assembler labels become
 relocatable addresses.  Symbol table entries in a.out have the format:
 
+@c FIXME: should refer to external, not internal.
 @example
 struct internal_nlist @{
   unsigned long n_strx;         /* index into string table of name */
@@ -2128,7 +2127,7 @@ the field being pointed to.  (FIXME: this is acknowledged to be
 gibberish.  Can anyone say what really goes here?).
 
 Note that there is a conflict between this and type attributes
-(@pxref{Stabs Format}); both use type descriptor @samp{@@}.
+(@pxref{String Field}); both use type descriptor @samp{@@}.
 Fortunately, the @samp{@@} type descriptor used in this C++ sense always
 will be followed by a digit, @samp{(}, or @samp{-}, and type attributes
 never start with those things.
@@ -2227,22 +2226,25 @@ 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 then the
-symbol descriptor @samp{##}, indicating a method type.  This is followed by
-a type reference showing the return type of the method and a
+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 descriptor
+@samp{#}, indicating a method type, and a second @samp{#}, indicating
+that this is the @dfn{minimal} type of method definition used by GCC2,
+not larger method definitions used by earlier versions of GCC.  This is
+followed by a type reference showing the return type of the method and a
 semi-colon.
 
-The format of an overloaded operator method name differs from that
-of other methods.  It is @samp{op$::@var{XXXX}.} where @var{XXXX} is the operator name
-such as @samp{+} or @samp{+=}.  The name ends with a period, and any characters except
-the period can occur in the @var{XXXX} string.
+The format of an overloaded operator method name differs from that of
+other methods.  It is @samp{op$::@var{operator-name}.} where
+@var{operator-name} is the operator name such as @samp{+} or @samp{+=}.
+The name ends with a period, and any characters except the period can
+occur in the @var{operator-name} string.
 
-The next part of the method description represents the arguments to
-the method, preceeded 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 @code{int} and a @code{char}
+The next part of the method description represents the arguments to the
+method, preceeded 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 @code{int} and a @code{char}
 map to @samp{ic}.
 
 This is followed by a number, a letter, and an asterisk or period,
@@ -2377,11 +2379,13 @@ functions were publicly accessable.  The example that follows
 contrasts public, protected and privately accessable fields and shows
 how these protections are encoded in C++ stabs.
 
+@c FIXME:  What does "part of the string" mean?
 Protections for class member data are signified by two characters
-embeded in the stab defining the class type.  These characters are
-located after the name: part of the string.  @samp{/0} means private, @samp{/1}
-means protected, and @samp{/2} means public.  If these characters are omited
-this means that the member is public.  The following C++ source:
+embedded in the stab defining the class type.  These characters are
+located after the name: part of the string.  @samp{/0} means private,
+@samp{/1} means protected, and @samp{/2} means public.  If these
+characters are omited this means that the member is public.  The
+following C++ source:
 
 @example
 class all_data @{
@@ -2678,19 +2682,20 @@ the derivation of this class is encoded as follows.
 @node Virtual Base Classes
 @section Virtual Base Classes
 
-A derived class object consists of a concatination 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 inheritence.  In the example above, class
-@code{D} inherits virtually from base class @code{B}.  This means that an instance
-of a @code{D} object will not contain its own @code{B} part but merely a pointer to
-a @code{B} part, known as a virtual base pointer.
+A derived class object consists of a concatination 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 inheritence.  In the example above, class @code{D}
+inherits virtually from base class @code{B}.  This means that an
+instance of a @code{D} object will not contain its own @code{B} part but
+merely a pointer to a @code{B} part, known as a virtual base pointer.
 
 In a derived class stab, the base offset part of the derivation
 information, described above, shows how the base class parts are
-ordered.  The base offset for a virtual base class is always given as
-0.  Notice that the base offset for @code{B} is given as 0 even though @code{B} is
-not the first base class.  The first base class @code{A} starts at offset 0.
+ordered.  The base offset for a virtual base class is always given as 0.
+Notice that the base offset for @code{B} is given as 0 even though
+@code{B} is not the first base class.  The first base class @code{A}
+starts at offset 0.
 
 The field information part of the stab for class @code{D} describes the field
 which is the pointer to the virtual base class @code{B}. The vbase pointer
@@ -2938,8 +2943,8 @@ The following are all the possible values for the stab type field, for
 The symbolic names are defined in the file @file{include/aout/stabs.def}.
 
 @menu
-* Non-stab symbol types::
-* Stab symbol types::
+* Non-stab symbol types::      Types from 0 to 0x1f
+* Stab symbol types::          Types from 0x20 to 0xff
 @end menu
 
 @node Non-stab symbol types
@@ -2990,7 +2995,7 @@ Same as @code{N_FN}, for Sequent compilers
 Symbol is indirected to another symbol
 
 @item 0x12    N_COMM
-Common sym -- visable after shared lib dynamic link
+Common---visible after shared library dynamic link
 
 @item 0x14 N_SETA
 Absolute set element
@@ -3020,7 +3025,6 @@ File name of a @file{.o} file
 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.
-@xref{Expanded reference}, for more information about the stab types.
 
 @table @code
 @item 0x20     N_GSYM
@@ -3111,16 +3115,16 @@ Path and name of source file; see @ref{Source Files}.
 Stack variable (@pxref{Stack Variables}) or type (@pxref{Typedefs}).
 
 @item 0x82     N_BINCL
-Beginning of an include file (Sun only); see @ref{Source Files}.
+Beginning of an include file (Sun only); see @ref{Include Files}.
 
 @item 0x84     N_SOL
-Name of include file; see @ref{Source Files}.
+Name of include file; see @ref{Include Files}.
 
 @item 0xa0     N_PSYM
 Parameter variable; see @ref{Parameters}.
 
 @item 0xa2     N_EINCL
-End of an include file; see @ref{Source Files}.
+End of an include file; see @ref{Include Files}.
 
 @item 0xa4     N_ENTRY
 Alternate entry point; see @ref{N_ENTRY}.
@@ -3129,7 +3133,7 @@ Alternate entry point; see @ref{N_ENTRY}.
 Beginning of a lexical block; see @ref{Block Structure}.
 
 @item 0xc2     N_EXCL
-Place holder for a deleted include file; see @ref{Source Files}.
+Place holder for a deleted include file; see @ref{Include Files}.
 
 @item 0xc4     N_SCOPE
 Modula2 scope information (Sun linker); see @ref{N_SCOPE}.
@@ -3174,9 +3178,9 @@ Gould non-base registers; see @ref{Gould}.
 @node Symbol Descriptors
 @appendix Table of Symbol Descriptors
 
-These tell in the @code{.stabs} @var{string} field what kind of symbol the stab
-represents.  They follow the symbol name and a colon.  @xref{String
-Field}, for more information about their use.
+These tell in the @code{.stabs} @var{string} field what kind of symbol
+the stab represents.  They follow the colon which follows the symbol
+name.  @xref{String Field}, for more information about their use.
 
 @c Please keep this alphabetical
 @table @code
@@ -3289,7 +3293,7 @@ defined.  They follow the type number and an equals sign.
 @table @code
 @item @var{digit}
 @itemx (
-Type reference; see @ref{Stabs Format}.
+Type reference; see @ref{String Field}.
 
 @item -
 Reference to builtin type; see @ref{Negative Type Numbers}.
@@ -3304,7 +3308,7 @@ Pointer; see @ref{Miscellaneous Types}.
 Reference (C++).
 
 @item @@
-Type Attributes (AIX); see @ref{Stabs Format}.  Member (class and variable)
+Type Attributes (AIX); see @ref{String Field}.  Member (class and variable)
 type (GNU C++); see @ref{Cplusplus}.
 
 @item a
@@ -3563,8 +3567,8 @@ GNU Modula2 definition module dependency
 
 GNU Modula-2 definition module dependency.  Value is the modification
 time of the definition file.  Other is non-zero if it is imported with
-the GNU M2 keyword @code{%INITIALIZE}.  Perhaps @code{N_M2C} can be used if there
-are enough empty fields?
+the GNU M2 keyword @code{%INITIALIZE}.  Perhaps @code{N_M2C} can be used
+if there are enough empty fields?
 
 @node N_EHDECL
 @section 80 - 0x50 - N_EHDECL
@@ -3642,13 +3646,15 @@ The value is the length.
 
 @itemize @bullet
 @item
+@c I think this is changed in GCC 2.4.5 to put the line number there.
 For GNU C stabs defining local and global variables (@code{N_LSYM} and
-@code{N_GSYM}), the @var{desc} field is supposed to contain the source line number
-on which the variable is defined.  In reality the @var{desc} field is always
-0.  (This behavior is defined in @file{dbxout.c} and putting a line number in
-@var{desc} is controlled by @samp{#ifdef WINNING_GDB}, which defaults to false). GDB
-supposedly uses this information if you say @samp{list @var{var}}.  In reality,
-@var{var} can be a variable defined in the program and GDB says @samp{function
+@code{N_GSYM}), the @var{desc} field is supposed to contain the source
+line number on which the variable is defined.  In reality the @var{desc}
+field is always 0.  (This behavior is defined in @file{dbxout.c} and
+putting a line number in @var{desc} is controlled by @samp{#ifdef
+WINNING_GDB}, which defaults to false). GDB supposedly uses this
+information if you say @samp{list @var{var}}.  In reality, @var{var} can
+be a variable defined in the program and GDB says @samp{function
 @var{var} not defined}.
 
 @item
@@ -3679,11 +3685,12 @@ knows that external symbols have leading underbars).
 
 @c FIXME: This is absurdly vague; there all kinds of differences, some
 @c of which are the same between gnu & sun, and some of which aren't.
-@item
-Can GCC be configured to output stabs the way the Sun compiler
-does, so that their native debugging tools work? <NO?> It doesn't by
-default.  GDB reads either format of stab. (GCC or SunC).  How about
-DBX?
+@c In particular, I'm pretty sure GCC works with Sun dbx by default.
+@c @item
+@c Can GCC be configured to output stabs the way the Sun compiler
+@c does, so that their native debugging tools work? <NO?> It doesn't by
+@c default.  GDB reads either format of stab. (GCC or SunC).  How about
+@c dbx?
 @end itemize
 
 @node XCOFF-differences
@@ -3696,24 +3703,25 @@ body of this document.
 
 @itemize @bullet
 @item
-BSD a.out stab types correspond to AIX XCOFF storage classes. In general the
-mapping is @code{N_STABTYPE} becomes @code{C_STABTYPE}.  Some stab types in a.out
-are not supported in XCOFF.
+BSD a.out stab types correspond to AIX XCOFF storage classes. In general
+the mapping is @code{N_@var{stabtype}} becomes @code{C_@var{stabtype}}.
+Some stab types in a.out are not supported in XCOFF; most of these use
+@code{C_DECL}.
 
 @c FIXME: Get C_* types for the block, figure out whether it is always
 @c used (I suspect not), explain clearly, and move to node Statics.
-Exception:
-initialised static @code{N_STSYM} and un-initialized static @code{N_LCSYM} both map
-to the @code{C_STSYM} storage class.  But the destinction is preserved
-because in XCOFF @code{N_STSYM} and @code{N_LCSYM} must be emited in a named static
-block.  Begin the block with @samp{.bs s[RW] data_section_name} for @code{N_STSYM}
-or @samp{.bs s bss_section_name} for @code{N_LCSYM}.  End the block with @samp{.es}.
+Exception: initialised static @code{N_STSYM} and un-initialized static
+@code{N_LCSYM} both map to the @code{C_STSYM} storage class.  But the
+destinction is preserved because in XCOFF @code{N_STSYM} and
+@code{N_LCSYM} must be emited in a named static block.  Begin the block
+with @samp{.bs s[RW] data_section_name} for @code{N_STSYM} or @samp{.bs
+s bss_section_name} for @code{N_LCSYM}.  End the block with @samp{.es}.
 
 @c FIXME: I think they are trying to say something about whether the
 @c assembler defaults the value to the location counter.
 @item
-If the XCOFF stab is a @code{N_FUN} (@code{C_FUN}) then follow the string field with
-@samp{,.} instead of just @samp{,}.
+If the XCOFF stab is a @code{N_FUN} (@code{C_FUN}) then follow the
+string field with @samp{,.} instead of just @samp{,}.
 @end itemize
 
 I think that's it for @file{.s} file differences.  They could stand to be
@@ -3734,7 +3742,7 @@ N_LCSYM         C_STSYM
 N_MAIN          unkown
 N_PC            unknown
 N_RSYM          C_RSYM
-N_RPSYM (0x8e)  C_RPSYM
+unknown         C_RPSYM
 N_M2C           unknown
 N_SLINE         unknown
 N_DSLINE        unknown
@@ -3744,7 +3752,7 @@ N_CATCH         unknown
 N_SSYM          unknown
 N_SO            unknown
 N_LSYM          C_LSYM
-N_DECL  (0x8c)  C_DECL
+various         C_DECL
 N_BINCL         unknown
 N_SOL           unknown
 N_PSYM          C_PSYM