diff options
Diffstat (limited to 'share/info/stabs.info')
-rw-r--r-- | share/info/stabs.info | 4590 |
1 files changed, 4590 insertions, 0 deletions
diff --git a/share/info/stabs.info b/share/info/stabs.info new file mode 100644 index 0000000..ca91d22 --- /dev/null +++ b/share/info/stabs.info @@ -0,0 +1,4590 @@ +This is stabs.info, produced by makeinfo version 4.13 from +/Volumes/androidtc/androidtoolchain/./src/build/../gdb/gdb-7.3.x/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 +****************** + + +* 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: Top1620 +Node: Overview2667 +Node: Flow4082 +Node: Stabs Format5608 +Node: String Field7170 +Node: C Example12601 +Node: Assembly Code13146 +Node: Program Structure15117 +Node: Main Program15843 +Node: Source Files16404 +Node: Include Files18856 +Node: Line Numbers21521 +Node: Procedures23055 +Node: Nested Procedures28945 +Node: Block Structure30121 +Node: Alternate Entry Points31527 +Node: Constants32260 +Node: Variables35372 +Node: Stack Variables36060 +Node: Global Variables37761 +Node: Register Variables38917 +Node: Common Blocks39739 +Node: Statics40993 +Node: Based Variables43572 +Node: Parameters44957 +Node: Register Parameters46569 +Node: Local Variable Parameters48830 +Node: Reference Parameters51745 +Node: Conformant Arrays52365 +Node: Types53082 +Node: Builtin Types54029 +Node: Traditional Builtin Types55175 +Node: Traditional Integer Types55576 +Node: Traditional Other Types57884 +Node: Builtin Type Descriptors58798 +Node: Negative Type Numbers62298 +Node: Miscellaneous Types68653 +Node: Cross-References70539 +Node: Subranges72214 +Node: Arrays73453 +Node: Strings76678 +Node: Enumerations77740 +Node: Structures80125 +Node: Typedefs82832 +Node: Unions84156 +Node: Function Types85737 +Node: Macro define and undefine87319 +Node: Symbol Tables88896 +Node: Symbol Table Format89348 +Node: Transformations On Symbol Tables90796 +Node: Transformations On Static Variables92150 +Node: Transformations On Global Variables92886 +Node: Stab Section Transformations94129 +Node: Cplusplus95512 +Node: Class Names96095 +Node: Nested Symbols96840 +Node: Basic Cplusplus Types97686 +Node: Simple Classes99246 +Node: Class Instance103540 +Node: Methods104257 +Node: Method Type Descriptor106476 +Node: Member Type Descriptor107676 +Node: Protections108468 +Node: Method Modifiers111558 +Node: Virtual Methods113186 +Node: Inheritance116987 +Node: Virtual Base Classes120683 +Node: Static Members122927 +Node: Stab Types123397 +Node: Non-Stab Symbol Types124021 +Node: Stab Symbol Types125452 +Node: Symbol Descriptors129383 +Node: Type Descriptors132162 +Node: Expanded Reference135374 +Node: N_PC136792 +Node: N_NSYMS137160 +Node: N_NOMAP137401 +Node: N_M2C137707 +Node: N_BROWS138141 +Node: N_DEFD138424 +Node: N_EHDECL138881 +Node: N_MOD2139132 +Node: N_CATCH139370 +Node: N_SSYM139864 +Node: N_SCOPE140149 +Node: Gould140339 +Node: N_LENG141331 +Node: Questions141559 +Node: Stab Sections143203 +Node: Stab Section Basics143801 +Node: ELF Linker Relocation147142 +Node: GNU Free Documentation License150552 +Node: Symbol Types Index175709 + +End Tag Table |