Annotation of gdb/sun-dbx.doc, revision 1.1

1.1     ! root        1: .ds + \v'-0.06i'+\v'0.06i'
        !             2: .de PR
        !             3: .sp 1
        !             4: .in +1.5i
        !             5: .ti -0.8i
        !             6: .nh
        !             7: \s-2\fL\\$1  \s+2\(->\s-2  \\$2\fR\s+2
        !             8: .hy
        !             9: .in -1.5i
        !            10: ..
        !            11: .de PC
        !            12: .in +1.5i
        !            13: .ti -0.8i
        !            14: .nh
        !            15: .sp 0.05i
        !            16: \s-2\fL\\$1  \s+2\(->\s-2  \\$2\fR\s+2
        !            17: .hy
        !            18: .in -1.5i
        !            19: ..
        !            20: .OF 'Sun Microsystems'8 Apr 86'Programming Languages Group'
        !            21: .EF 'Sun Microsystems'8 Apr 86'Programming Languages Group'
        !            22: .ps 12
        !            23: .nr PS 12
        !            24: .vs 14p
        !            25: .nr VS 14p
        !            26: .ce
        !            27: \fB\s20Dbx and Dbxtool Interfaces\s0\fR
        !            28: .sp 1
        !            29: .ce
        !            30: Steven S. Muchnick
        !            31: .sp 1
        !            32: .ce
        !            33: \fI8 April 1986\fR
        !            34: .sp 2
        !            35: .NH 1
        !            36: Introduction and Assumptions
        !            37: .PP
        !            38: This document specifies two interfaces, one between Sun's compilers and
        !            39: the \fIdbx\fR and \fIdbxtool\fR debuggers and the other between the two
        !            40: processes which make up \fIdbxtool\fR.
        !            41: The information is current as of the 3.0 Sun Software Release and the
        !            42: 1.0 release of Sun Modula-2 and is intended for compiler implementors.
        !            43: .PP
        !            44: The interface languages are expected to grow and evolve over time.
        !            45: While they may be extended at arbitrary times and bugs fixed in them as needed,
        !            46: major changes which introduce incompatibilities with previous versions
        !            47: will generally be synchronized with major system releases.
        !            48: .PP
        !            49: This document assumes the reader is familiar with the Sun assembler and linker,
        !            50: and with \fIdbx\fR and \fIdbxtool\fR.
        !            51: .PP
        !            52: .sp 1
        !            53: .NH 1
        !            54: \fIDbx\fB and \fIDbxtool\fR
        !            55: .PP
        !            56: \fIDbxtool\fR consists of two processes, the debugger process (DP), which is
        !            57: identical to \fIdbx\fR, and the user interface process (UIP).
        !            58: When the UIP starts the DP it passes a flag to it telling it that it was
        !            59: started by the UIP, rather than directly by the user.
        !            60: Commands are communicated from the UIP to the DP in the same form that they
        !            61: are typed by the user to \fIdbx\fR, as character strings consisting of the
        !            62: command name followed by the arguments, and are presented to it via its
        !            63: standard input.
        !            64: Commands entered via the mouse are translated by the UIP into the standard
        !            65: form:  the command button provides the command name to be placed at the
        !            66: beginning of the string and the selected argument is translated according
        !            67: to the selection interpretation associated with the command button.
        !            68: The DP communicates to the UIP in the DP-UIP interface language,
        !            69: instead of the usual tty-oriented responses used by the DP when it is
        !            70: invoked directly as \fIdbx\fR.
        !            71: .PP
        !            72: The next section presents the syntax and semantics of the language which
        !            73: compilers use to convey information about data types, variables and the
        !            74: relationship between source statements and machine instructions to the DP
        !            75: (or, equivalently, to \fIdbx\fR).
        !            76: The following section presents the syntax and semantics of the interface
        !            77: between the DP and the UIP.
        !            78: Appendix A lists the standard types defined for Sun's supported languages.
        !            79: Appendix B gives an example of the compiler-debugger interface.
        !            80: .PP
        !            81: .sp 1
        !            82: .NH 1
        !            83: Overview of the Compiler-Debugger Interface Language
        !            84: .PP
        !            85: All information about a compiled module needed by \fIdbx\fR and \fIdbxtool\fR
        !            86: is contained in the symbol table part of the \fIa.out\fR file.
        !            87: Some of this information is derived from ordinary linker and assembler
        !            88: symbols; the rest is passed by the compilers to the assembler via \fL.stab\fR
        !            89: ("symbol table") directives.
        !            90: The debuggers distinguish the two types of symbols by whether or not any of
        !            91: the \fLN_STAB\fR* bits are set in the type field of the symbol entry, as
        !            92: described below in Section 3.31.
        !            93: .FS
        !            94: *Symbols beginning with \fLN_\fR are defined in the files
        !            95: \fL/usr/include/a.out.h\fR and \fL/usr/include/stab.h\fR.
        !            96: .FE
        !            97: .PP
        !            98: The \fL.stab\fR directives have the following forms:
        !            99: .sp 1
        !           100: .in +1.0i
        !           101: \fL .stabs    "\fIname\fR",\fItype\fR,0,\fIdesc\fR,\fIvalue\fR
        !           102: .sp 1
        !           103: \fL .stabn    \fItype\fR,0,\fIdesc\fR,\fIvalue\fR
        !           104: .in -1.0i
        !           105: .sp 0.6
        !           106: or
        !           107: .sp 0.6
        !           108: .in +1.0i
        !           109: \fL .stabd    \fItype\fR,0,\fIdesc\fR
        !           110: .in -1.0i
        !           111: .sp 1
        !           112: .LP
        !           113: The \fL.stabs\fR directives are used to describe types, variables,
        !           114: procedures, and so on, while the \fL.stabn\fR directives convey
        !           115: information about scopes and the mapping from source statements to
        !           116: object code.
        !           117: A \fL.stabd\fR directive is identical in meaning to a
        !           118: corresponding \fL.stabn\fR directive with the value field set to "." (dot),
        !           119: which the assembler uses to mean the current location.
        !           120: Most of the needed information, for example symbol name and type structure,
        !           121: is contained in the \fIname\fR field.
        !           122: The \fItype\fR field identifies the type of symbolic information, for
        !           123: example source file, global symbol, or source line.
        !           124: The \fIdesc\fR field specifies the number of bytes occupied by a variable or
        !           125: type or the nesting level for a scope symbol.
        !           126: The \fIvalue\fR field specifies an address or an offset.
        !           127: .PP
        !           128: The following classes of \fL.stab\fR information are needed to describe
        !           129: a compiled module or file, with of course considerable variations
        !           130: depending on the source language:
        !           131: .IP -
        !           132: file and module identification and (for Modula-2) the list of imported
        !           133: separate units
        !           134: .IP -
        !           135: program structure information and descriptions of types, variables and scopes
        !           136: .IP -
        !           137: code address information for statements
        !           138: .PP
        !           139: The \fL.stab\fR directives may be interspersed in the generated assembly
        !           140: language with relatively few constraints on their ordering.
        !           141: In particular, the \fLN_SLINE .stabd\fR or \fL.stabn\fR directives which
        !           142: describe the relationship between the source and object code need to
        !           143: appear in the same order as the corresponding source lines and
        !           144: the \fL.stabs\fR directives which describe variables need to be ordered
        !           145: to correspond to the scope structure of the program.
        !           146: .PP
        !           147: The name field in a \fL.stabs\fR entry for a symbol contains the
        !           148: symbol's name, followed by a colon, a one-character symbol
        !           149: descriptor, and descriptor-specific information, i.e.
        !           150: .sp 1
        !           151: .in +1.0i
        !           152: \fLsymbol : descriptor debuginfo\fR
        !           153: .in -1.0i
        !           154: .sp 0.5
        !           155: .PP
        !           156: The linker and assembler symbols and \fL.stab\fR directives expected by
        !           157: the debuggers and their meanings are described below.
        !           158: .PP
        !           159: .sp 1
        !           160: .NH 2
        !           161: Syntax Notation
        !           162: .PP
        !           163: In the syntax notation used below nonterminal symbols are those in
        !           164: \fLtypewriter font\fR which are more than one character long and begin with
        !           165: a capital letter.
        !           166: The left and right sides of a production are separated by an arrow
        !           167: "\fL\(->\fR".
        !           168: Braces "\fL{\fR" and "\fL}\fR" are used to indicate grouping, brackets
        !           169: "\fL[\fR" and "\fL]\fR"  to indicate optionality, vertical bar "\fL|\fR" for
        !           170: alternation, asterisk "\fL*\fR" for zero or more repetitions, and plus
        !           171: "\fL\*+\fR" for one or more repetitions.
        !           172: All other symbols in \fLtypewriter font\fR which are not part of the notation
        !           173: denote terminals.
        !           174: .PP
        !           175: .sp 1
        !           176: .NH 2
        !           177: Lexical Rules
        !           178: .PP
        !           179: Lexically \fL.stab\fR directives follow the conventions of ordinary
        !           180: assembly language lines.
        !           181: The string in a \fL.stabs\fR directive may be continued from one line to the
        !           182: next by terminating it with a backslash '\\', completing the other fields
        !           183: of the directive, and continuing the string in another \fL.stabs\fR
        !           184: directive on the next line with the same non-string fileds.
        !           185: Thus, for example,
        !           186: .in +1.0i
        !           187: .nf
        !           188:  \fL\s-2.stabs    "int:t(0,1)=r(0,1);-2147483648;\\",0x80,0,0,0
        !           189:  .stabs    "2147483647;",0x80,0,0,0\s+2\fR
        !           190: .fi
        !           191: .in -1.0i
        !           192: .LP
        !           193: and
        !           194: .in +1.0i
        !           195: .nf
        !           196:  \fL\s-2.stabs    "int:t(0,1)=r(0,1);-2147483648;2147483647;",0x80,0,0,0\s+2\fR
        !           197: .fi
        !           198: .in -1.0i
        !           199: .LP
        !           200: are equivalent.
        !           201: There may be any number of such continuation lines.
        !           202: .PP
        !           203: .sp 1
        !           204: .NH 2
        !           205: Linker and Assembler Symbols
        !           206: .PP
        !           207: The linker and assembler symbols used by the debuggers are those which
        !           208: identify object files, procedures, and variables.
        !           209: These symbols are generated either by the linker (object filenames) or by
        !           210: the assembler (procedure names and variables) without the compiler having
        !           211: to supply \fL.stab\fR directives for them.
        !           212: .PP
        !           213: Symbols in text space whose names end in "\fL.o\fR" are taken as object
        !           214: filenames.
        !           215: The debugger strips off the "\fL.o\fR" and any leading directory names.
        !           216: The resulting filename becomes associated with following symbols as the
        !           217: file which contains them, until another object filename or the end of file
        !           218: is seen.
        !           219: Text-space symbols other than object filenames are taken by the debugger
        !           220: as names of procedures.
        !           221: If the symbol has a leading underscore, it is removed.
        !           222: If a debugger symbol entry is later encountered for the same symbol, the
        !           223: assembler symbol is discarded in its favor.
        !           224: .PP
        !           225: Data- and bss-space symbols are taken by the debugger as representing
        !           226: global variables in the corresponding spaces.
        !           227: Leading underscores are stripped off and the scope information is preserved.
        !           228: A debugger symbol is also required for such symbols to provide full information
        !           229: for them (see Section 3.13).
        !           230: .PP
        !           231: .sp 1
        !           232: .NH 2
        !           233: Top-Level Structure of Debugger Symbols
        !           234: .PP
        !           235: .PR DebuggerStabs "{CodeStabs | SourceFileStabs | UnitStab | ProcStab | ScopeBgnStab StructureStabs* ScopeEndStab | TypeStab | GlblVarStab | StaticVarStab | LclVarStab | ParamStab | CommonStabs | ImpExpStab}*"
        !           236: .PP
        !           237: .NH 2
        !           238: Source-to-Object Code Mapping
        !           239: .PP
        !           240: .PR CodeStabs "{BlockBgnStab LineStab* BlockEndStab}*"
        !           241: .PC BlockBgnStab ".stabn N_LBRAC , 0 , Level , CodeAddr"
        !           242: .PC N_LBRAC 0xc0
        !           243: .PC LineStab ".stabn N_SLINE , 0 , Line , CodeAddr"
        !           244: .PC N_SLINE 0x44
        !           245: .PC BlockEndStab ".stabn N_RBRAC , 0 , Level , CodeAddr"
        !           246: .PC N_RBRAC 0xe0
        !           247: .PP
        !           248: \fLCodeStabs\fR define the relationship between the source code and the
        !           249: object code.
        !           250: The object code generated for each block (e.g. a group of statements
        !           251: delimited by curly braces in C or by \fLbegin\fR and \fLend\fR in Pascal)
        !           252: is enclosed in \fLBlockBgnStab\fR and \fLBlockEndStab\fR directives.
        !           253: A \fLLineStab\fR is given for the first instruction generated for
        !           254: each statement.
        !           255: \fLLevel\fR identifies the static nesting level of a block, \fLLine\fR
        !           256: gives the source line number for a statement and \fLCodeAddr\fR
        !           257: gives the relocatable address of the corresponding object code.
        !           258: .PP
        !           259: .NH 2
        !           260: Source File Identification
        !           261: .PP
        !           262: .PR SourceFileStab ".stabs "" SourceFileString "" , N_SO , 0 , 0 , CodeAddr"
        !           263: .PC SourceFileString String
        !           264: .PC N_SO 0x64
        !           265: .PP
        !           266: A \fLSourceFileStab\fR identifies the source file which was compiled to
        !           267: produce this object code.
        !           268: The \fLSourceFileString\fR is the name of the source file in the form it was
        !           269: given to the compiler.
        !           270: The \fLCodeAddr\fR gives the relocatable address of the beginning of the
        !           271: generated object code.
        !           272: .PP
        !           273: .NH 2
        !           274: Unit Identification (Modula-2 only)
        !           275: .PP
        !           276: .PR UnitStab ".stabs "" UnitString "" , N_M2C , 0 , UnitNumber , UnitFlag"
        !           277: .PC UnitString "Name , UnitTimeStamp [, CodeTimeStamp]"
        !           278: .PC N_M2C 0x42
        !           279: .PC UnitNumber Number
        !           280: .PC UnitTimeStamp String
        !           281: .PC CodeTimeStamp String
        !           282: .PC UnitFlag "0 | 1"
        !           283: .PP
        !           284: A \fLUnitStab\fR provides some debugging information, in addition to
        !           285: identifying a Modula-2 separate compilation unit for version consistency
        !           286: checking in the Modula-2 linker \fIm2l\fR .
        !           287: The \fLName\fR field defines the the name of the module to the
        !           288: debugger.
        !           289: The \fLUnitNumber\fR field is used to identify the modules of imported
        !           290: and exported identifiers (see Section 3.12).
        !           291: The \fLUnitTimeStamp\fR is used internally in the debugger to provide
        !           292: unique entries in its module table.
        !           293: The \fLUnitFlag\fR field is used only to identify the main module
        !           294: (its \fLUnitFlag\fR is \fL0\fR).
        !           295: The \fLCodeTimeStamp\fR field is used only for consistency checking.
        !           296: .PP
        !           297: .NH 2
        !           298: Functions and Procedures (C, FORTRAN and Pascal)
        !           299: .PP
        !           300: .PR ProcStab ".stabs "" ProcName : ProcClass ProcRtnType "" , N_FUN , 0 , RtnSize , CodeAddr"
        !           301: .PC ProcClass "F | f"
        !           302: .PC ProcRtnType TypeRef
        !           303: .PC N_FUN 0x24
        !           304: .PP
        !           305: A \fLProcStab\fR defines the beginning of a C, FORTRAN or Pascal function or
        !           306: procedure.
        !           307: It gives the routine's name and storage class, the type and size of the value
        !           308: it returns, and the address of the beginning of its code.
        !           309: The class is \fLF\fR for globally defined routines and \fLf\fR for local ones.
        !           310: For procedures, the return type is \fLvoid\fR.
        !           311: .PP
        !           312: .NH 2
        !           313: Module, Function and Procedure Scopes (Modula-2 only)
        !           314: .PP
        !           315: .PR ScopeBgnStab ".stabs "" ScopeBgnString "" , N_SCOPE , 0 , Level , CodeAddr"
        !           316: .PC ScopeEndStab ".stabs "" ScopeEndString "" , N_SCOPE , 0 , Level , 0"
        !           317: .PC ScopeBgnString "Name : ScopeId"
        !           318: .PC ScopeId "M ScopeNumber | Q ScopeNumber ResultType"
        !           319: .PC ResultType TypeRef
        !           320: .PC ScopeEndString "Name : E ScopeNumber"
        !           321: .PC N_SCOPE 0xc4
        !           322: .PC ScopeNumber Number
        !           323: .PP
        !           324: A \fLScopeBgnStab\fR - \fLScopeEndStab\fR pair delimits a module, procedure or
        !           325: function scope in Modula-2.
        !           326: The \fLScopeBgnString\fR gives the name of the scope and a \fLScopeId\fR
        !           327: which identifies it as a module (\fLM\fR) or a function or procedure
        !           328: (\fLQ\fR) and gives the sequence number (\fLScopeNumber\fR) assigned to it
        !           329: and, for functions and procedures, the type of its return value; for
        !           330: procedures the return type is \fLvoid\fR.
        !           331: The \fLLevel\fR field gives the static nesting level of the scope.
        !           332: The \fLScopeEndString\fR gives the name of the scope and the assigned sequence
        !           333: number.
        !           334: .PP
        !           335: .NH 2
        !           336: Type Identifiers
        !           337: .PP
        !           338: .PR TypeStab ".stabs "" TypeString "" , TypeScope , 0 , Size , 0"
        !           339: .PC TypeScope "N_LSYM | N_GSYM"
        !           340: .PC N_GSYM 0x20
        !           341: .PC N_LSYM 0x80
        !           342: .PC TypeString "[Name] : t Type"
        !           343: .PP
        !           344: A \fLTypeStab\fR describes a data type, giving its name,
        !           345: a description of the range of values it comprises and (for Modula-2) the size
        !           346: in bytes of the storage it occupies.
        !           347: The \fLSize\fR field is ignored by \fIdbx\fR for languages other than
        !           348: Modula-2 and the size of a type is determined by its range of values.
        !           349: The \fLTypeScope\fR indicates whether the type is locally or globally
        !           350: defined.
        !           351: See Section 3.20 below for a description of \fLType\fR.
        !           352: .PP
        !           353: .NH 2
        !           354: Local Variables
        !           355: .PP
        !           356: .PR LclVarStab ".stabs "" Name : Type "" , N_LSYM , 0 , 0 , DataOffset"
        !           357: .PP
        !           358: A \fLLclVarStab\fR describes a local variable, giving its name, kind and type
        !           359: and the offset from the stack pointer to the local.
        !           360: .PP
        !           361: .NH 2
        !           362: Modula-2 Imports and Exports
        !           363: .PP
        !           364: .PR ImpExpStab ".stabs "" ImpExpString "" , N_LSYM , 0 , 0 , 0"
        !           365: .PC ImpExpString "Name : ImpExpId"
        !           366: .PC ImpExpId "U UnitNumber  | u UnitNumber | d ScopeNumber"
        !           367: .PP
        !           368: An \fLImpExpStab\fR is used by Modula-2 to describe a separately compiled
        !           369: module and the symbols it defines.
        !           370: See Table 2 (Section 3.30) below for a description of the letters occurring in
        !           371: the \fLImpExpId\fR field.
        !           372: .PP
        !           373: .NH 2
        !           374: Global Variables
        !           375: .PP
        !           376: .PR GlblVarStab ".stabs "" Name : G Type "" , N_GSYM , 0 , 0 , 0"
        !           377: .PC N_GSYM 0x20
        !           378: .PP
        !           379: A \fLGlblVarStab\fR identifies a global variable.
        !           380: The address of the variable is gotten from the corresponding assembler symbol.
        !           381: .PP
        !           382: .NH 2
        !           383: Static Variables
        !           384: .PP
        !           385: .PR StaticVarStab ".stabs "" Name : StaticKind Type "" , StaticSym , 0 , 0 , DataAddr"
        !           386: .PC StaticKind "S | V"
        !           387: .PC StaticSym "N_STSYM | N_LCSYM"
        !           388: .PC N_STSYM 0x26
        !           389: .PC N_LCSYM 0x28
        !           390: .PP
        !           391: A \fLStaticVarStab\fR identifies a static variable, which may be either
        !           392: uninitialized or initialized and either global or local.
        !           393: Global statics are identified by \fLStaticKind\fR \fLS\fR and local ones
        !           394: by \fLV\fR.
        !           395: Uninitialized statics are identified by \fLStaticSym\fR \fLN_LCSYM\fR and
        !           396: initialized ones by \fLN_STSYM\fR.
        !           397: The \fLDataAddr\fR is the relocatable address assigned to the static
        !           398: variable.
        !           399: .PP
        !           400: .NH 2
        !           401: Parameters
        !           402: .PP
        !           403: .PR ParamStab ".stabs "" Name : ParamKind Type "" , N_PSYM , 0 , 0 , DataOffset"
        !           404: .PC ParamKind "p | i | v | C | x | pP | pF | X"
        !           405: .PC N_PSYM 0xa0
        !           406: .PP
        !           407: A \fLParamStab\fR describes a procedure or function parameter, giving its
        !           408: name, kind, type and stack offset.
        !           409: The kind is as described in Table 2 (Section 3.30) below, except that \fLpP\fR
        !           410: and \fLpF\fR are used for Pascal procedure and function parameters,
        !           411: respectively.
        !           412: For register parameters a \fLRegStab\fR is also generated.
        !           413: .PP
        !           414: .NH 2
        !           415: Register Variables
        !           416: .PP
        !           417: .PR RegStab ".stabs "" Name : Type "" , N_RSYM , 0 , RegSize , RegNumber"
        !           418: .PC RegSize Number
        !           419: .PC RegNumber Number
        !           420: .PC N_RSYM 0x40
        !           421: .PP
        !           422: A \fLRegStab\fR describes a register variable or parameter, giving its
        !           423: name, size in bytes, type and register number.
        !           424: The register numbers are assigned as shown in Table 1.
        !           425: .KF
        !           426: .TS
        !           427: box center;
        !           428: l | l
        !           429: l | l.
        !           430: Register class Numbers
        !           431: _      _
        !           432: Data registers d0 - d7 0 - 7
        !           433: Address registers a0 - a7      8 - 15
        !           434: MC68881 registers fp0 - fp7    18 - 25
        !           435: FPA registers fpa0 - fpa31     31 - 62
        !           436: .TE
        !           437: .ce
        !           438: Table 1.  Register Numbers
        !           439: .sp 1
        !           440: .KE
        !           441: .LP
        !           442: For register parameters a \fLParamStab\fR is also generated.
        !           443: .PP
        !           444: .NH 2
        !           445: Common Blocks
        !           446: .PP
        !           447: .PR CommonStabs "BgnCommonStab GlblVarStab* EndCommonStab"
        !           448: .PC BgnCommonStab ".stabs ""BlockName"" , N_BCOMM , 0 , 0 , 0"
        !           449: .PC EndCommonStab ".stabs ""BlockName"" , N_ECOMM , 0 , 0 , 0"
        !           450: .PC BlockName Name
        !           451: .PC N_BCOMM 0xe2
        !           452: .PC N_ECOMM 0xe4
        !           453: .PP
        !           454: A \fLBgnCommonStab\fR introduces the symbol list for a common block and the
        !           455: corresponding \fLEndCommonStab\fR ends it.
        !           456: .PP
        !           457: .NH 2
        !           458: Other Terms
        !           459: .PP
        !           460: .PR Level Number
        !           461: .PC Size Number
        !           462: .PC Line Number
        !           463: .PC CodeAddr AddrExpr
        !           464: .PC DataAddr AddrExpr
        !           465: .PC DataOffset Number
        !           466: .PR Number "[-] {DIGIT}\*+ | 0x {HEXDIGIT}\*+"
        !           467: .PC Name " LETTER {LETTER | DIGIT}*"
        !           468: .PC String "{CHARACTER}*"
        !           469: .PP
        !           470: An \fLAddrExpr\fR is an assembler address expression (see the assembly language
        !           471: manual).
        !           472: A \fLDIGIT\fR may be any decimal digit.
        !           473: A \fLHEXDIGIT\fR may be a decimal digit or an upper or lower case letter in
        !           474: the range \fLA\fR through \fLF\fR.
        !           475: A \fLCHARACTER\fR may be any character accepted by the assembler in a string
        !           476: (see the assembly language manual).
        !           477: .PP
        !           478: .sp 1
        !           479: .NH 2
        !           480: Specification of Types
        !           481: .PP
        !           482: Type information starts with a type descriptor, followed by type-specific
        !           483: information, which is a sequence of information blocks separated by semicolons.
        !           484: .sp 1
        !           485: .in +1.0i
        !           486: \fLtypedescriptor typeinfoblock ; ... ; typeinfoblock\fR
        !           487: .in -1.0i
        !           488: .sp 0.5
        !           489: .LP
        !           490: Upon definition of a type, a type number or type number pair is assigned
        !           491: to it which can be used in later type specifications to refer to the
        !           492: type definition.
        !           493: .NH 2
        !           494: Types, Type Definitions, Type References and Standard Types
        !           495: .PP
        !           496: .PR Type "TypeRef | TypeDef | Enumeration | RangeOrFloat | Array | DynArray | ConfArray | Record | Set | Pointer | ProcType | FuncType | FileType | SeparateType"
        !           497: .PC TypeRef "Number | ( Number , Number )"
        !           498: .PC TypeDef "TypeRef = Type"
        !           499: .PP
        !           500: A type may be any of those allowed by the C, FORTRAN 77, Modula-2 and
        !           501: Pascal languages.
        !           502: A \fLTypeRef\fR is the number or pair of numbers assigned to a type.
        !           503: Whether numbers or pairs are used depends on the compiler.
        !           504: Currently, C uses pairs and FORTRAN 77, Pascal and Modula-2 use
        !           505: single numbers.
        !           506: .PP
        !           507: In the single number form, the numbers are assigned sequentially by the
        !           508: compiler as it encounters type definitions during processing a source file and
        !           509: the files included into it.
        !           510: In the pair form, the first element identifies the file (the source file is
        !           511: number 0 and successive include files are given successive numbers) and the
        !           512: second element identifies successive types defined within each file.
        !           513: .PP
        !           514: A \fLTypeDef\fR associates a type number with a type definition.
        !           515: .PP
        !           516: Each language defines some standard types by a series of \fL.stabs\fR
        !           517: lines, as shown in Appendix A.
        !           518: .PP
        !           519: .NH 2
        !           520: Enumeration Types
        !           521: .PP
        !           522: .PR Enumeration "e {EnumName : OrdinalValue ,}\*+"
        !           523: .PC EnumName Name
        !           524: .PC OrdinalValue Number
        !           525: .PP
        !           526: An \fLEnumeration\fR defines an enumeration type by giving the names and values
        !           527: of its elements.
        !           528: .PP
        !           529: .NH 2
        !           530: Range, Floating-Point and Complex Types
        !           531: .PP
        !           532: .PR RangeOrFloat "r Type ; MinValue ; MaxValue"
        !           533: .PC MinValue RangeValue
        !           534: .PC MaxValue RangeValue
        !           535: .PC RangeValue "[ A | J] Number"
        !           536: .PP
        !           537: A \fLRangeOrFloat\fR defines a range, floating-point or complex type.
        !           538: It describes a range type if the number in the \fLMaxValue\fR field is
        !           539: nonzero and the \fLMinValue\fR number is less than or equal to the
        !           540: \fLMaxValue\fR number.
        !           541: In this case, it gives the minimal and maximal values of the range and the
        !           542: type it is a subrange of.
        !           543: The letters \fLA\fR or \fLJ\fR occur only for ranges.
        !           544: An \fLA\fR indicates that the following number, instead of being the range
        !           545: value is the run-time offset from the frame pointer of the range.
        !           546: A \fLT\fR indicates that the bound is adjustable at runtime and not
        !           547: determinable, as may be the case for FORTRAN array arguments.
        !           548: .PP
        !           549: It describes a floating-point or complex type if the \fLMaxValue\fR field is
        !           550: zero and the \fLMinValue\fR is greater than the \fLMaxValue\fR.
        !           551: In this case, the \fLMinValue\fR field gives the number of bytes occupied by
        !           552: values of the floating-point or complex type.
        !           553: The type is interpreted as complex if the name in the \fL.stabs\fR line is
        !           554: \fLcomplex\fR or \fLdouble complex\fR.
        !           555: .PP
        !           556: .NH 2
        !           557: Array Types
        !           558: .PP
        !           559: .PR Array "a IndexType ; ElementType"
        !           560: .PC IndexType Type
        !           561: .PC ElementType Type
        !           562: .PC DynArray "a r IndexType ; 0 ; A HighBound ; ElementType"
        !           563: .PC ConfArray "a C LowBound , HighBound , IndexType ; ElementType"
        !           564: .PC LowBound Number
        !           565: .PC HighBound Number
        !           566: .PP
        !           567: An \fLArray\fR defines an array type by giving the types of the indexes and
        !           568: elements.
        !           569: Multidimensional arrays are treated as if they were one-dimensional arrays
        !           570: of arrays.**
        !           571: .FS
        !           572: **See Appendix B, line 36 for an example.
        !           573: .FE
        !           574: .PP
        !           575: A \fLDynArray\fR defines a Modula-2 dynamic array type by giving the types
        !           576: of the indexes and elements and the high bound.
        !           577: Note that \fLDynArray\fR is identical to an ordinary array whose index is
        !           578: a range type (see Section 3.22).
        !           579: .PP
        !           580: A \fLConfArray\fR defines a Pascal conformant array type by giving the types
        !           581: of the indexes and elements and the low and high bounds.
        !           582: .PP
        !           583: .NH 2
        !           584: Record Types
        !           585: .PP
        !           586: .PR Record "s ByteSize FieldList"
        !           587: .PC FieldList  "{FieldName : {Type | Variant} , BitOffset , BitSize ;}\*+"
        !           588: .PC Variant "Selector ; { Case ; }\*+"
        !           589: .PC Selector "v Flag : Type"
        !           590: .PC Case "{CaseValue ,}\*+ : FieldList"
        !           591: .PC FieldName Name
        !           592: .PC ByteSize Number
        !           593: .PC BitOffset Number
        !           594: .PC BitSize Number
        !           595: .PC CaseValue Number
        !           596: .PC Flag "0 | 1"
        !           597: .PP
        !           598: A \fLRecord\fR defines a record type, giving the size in bytes of an instance
        !           599: of the type and a description of each field.
        !           600: A field description includes its name, either a type or a variant description,
        !           601: bit offset within the record type and length in bits.
        !           602: A variant consists of the selector name and a series of cases.
        !           603: The flag in a selector indicates whether a variant record has a discriminant
        !           604: (\fL1\fR) or not (\fL0\fR).
        !           605: .PP
        !           606: .NH 2
        !           607: Set Types
        !           608: .PP
        !           609: .PR Set "S Type"
        !           610: .PP
        !           611: A \fLSet\fR defines a set type and specifies its base type.
        !           612: .PP
        !           613: .NH 2
        !           614: Pointer Types
        !           615: .PP
        !           616: .PR Pointer "* Type"
        !           617: .PP
        !           618: A \fLPointer\fR defines a pointer type and specifies its base type.
        !           619: .PP
        !           620: .NH 2
        !           621: Function and Procedure Types
        !           622: .PP
        !           623: .PR FuncType "Q ResultType , ParamNumber {; FormalType}*"
        !           624: .PC ParamNumber Number
        !           625: .PC FormalType "DataKind Type"
        !           626: .PP
        !           627: A \fLFuncType\fR defines a function or procedure type, giving its result type,
        !           628: the number of parameters expected and descriptions of the parameters.
        !           629: The \fLDataKind\fR field may be any of the type descriptors listed in
        !           630: Table 2 (Section 3.31) below.
        !           631: .PP
        !           632: .NH 2
        !           633: File Types (Pascal only)
        !           634: .PP
        !           635: .PR FileType "L Type"
        !           636: .PP
        !           637: A \fLFileType\fR describes a Pascal file type by giving its base type.
        !           638: .PP
        !           639: .NH 2
        !           640: Types Defined in Separate Units (Modula-2)
        !           641: .PP
        !           642: .PR SeparateType "I UnitNumber , Name"
        !           643: .PP
        !           644: A \fLSeparateType\fR describes a type defined in a different compiled unit in
        !           645: a Modula-2 program, giving its unit number and name.
        !           646: .PP
        !           647: .NH 2
        !           648: Summary of Symbol Descriptors
        !           649: .PP
        !           650: Table 2 lists the symbol descriptors currently in use, along with their
        !           651: meanings and the languages which generate them (C = C, F = FORTRAN 77,
        !           652: M = Modula-2, P = Pascal).
        !           653: .KF
        !           654: .sp 1
        !           655: .TS
        !           656: center box;
        !           657: c | c | c
        !           658: cfL | l | c.
        !           659: descriptor     meaning languages
        !           660: _
        !           661: (empty)        local variable  C F M P
        !           662: d      symbol defined in other scope   M
        !           663: f      local (function) procedure      C P
        !           664: i      value parameter by reference (indirect access)  M
        !           665: p      value parameter C F M P
        !           666: r      register variable       C
        !           667: t      type name       C F M P
        !           668: u      symbol defined in a separate unit (module)      M
        !           669: v      variable parameter by reference F M P
        !           670: x      conformant array value parameter        P
        !           671: A      bound value in parameter with specified offset  F M
        !           672: C      read-only parameter (conformant array bound)    P
        !           673: E      end of scope    M
        !           674: F      global (function) procedure     C F P
        !           675: G      global variable C F P
        !           676: M      module  M
        !           677: Q      procedure or function   M
        !           678: S      static global variable  C M
        !           679: T      enumeration or structure type tag       C
        !           680: U      separate unit (module)  M
        !           681: V      common / static local variable  F / C
        !           682: X      function result variable        F P
        !           683: .TE
        !           684: .ce
        !           685: Table 2.  Symbol Descriptors
        !           686: .sp 1
        !           687: .KE
        !           688: .NH 2
        !           689: Summary of Type Descriptors
        !           690: .PP
        !           691: Table 3 lists the type descriptors which are currently in use,
        !           692: along with their meanings and the languages which generate them (C = C,
        !           693: F = FORTRAN 77, M = Modula-2, P = Pascal).
        !           694: .KF
        !           695: .sp 1
        !           696: .TS
        !           697: center box;
        !           698: c | c | c
        !           699: cfL | l | c.
        !           700: descriptor     meaning languages
        !           701: _
        !           702: (empty)        type reference  C F M P
        !           703: a      array type      C F M P
        !           704: c      conformant array        P
        !           705: e      enumeration type        C M P
        !           706: f      function type   C
        !           707: r      range type      C F M P
        !           708: s      record / structure type C M P
        !           709: u      union specification     C
        !           710: v      variant specification   P
        !           711: C      lower and upper bound of a conformant array     P
        !           712: F      function parameter type P
        !           713: I      separate type   M
        !           714: L      file type       P
        !           715: P      procedure parameter type        P
        !           716: Q      function or procedure type      M
        !           717: S      set type        M P
        !           718: *      pointer type    C F M P
        !           719: .TE
        !           720: .ce
        !           721: Table 3.  Type Descriptors
        !           722: .sp 1
        !           723: .KE
        !           724: .PP
        !           725: .NH 2
        !           726: Generating Object Code Instead of Assembly Language
        !           727: .PP
        !           728: Some compilers prefer to generate object code directly, rather than Sun
        !           729: assembly language.
        !           730: This section explains how to generate the appropriate code for the assembler
        !           731: symbols and \fL.stab\fR directives described above (linker symbols are
        !           732: generated automatically by the system linker).
        !           733: .PP
        !           734: In the Sun-2 and Sun-3 assemblers, the three types of directives
        !           735: .sp 1
        !           736: .in +1.0i
        !           737: \fL .stabs    "\fIname\fL",\fItype\fL,0,\fIdesc\fL,\fIvalue\fR
        !           738: .sp 1
        !           739: \fL .stabn    \fItype\fL,0,\fIdesc\fL,\fIvalue\fR
        !           740: .in -1.0i
        !           741: .sp 0.6
        !           742: and
        !           743: .sp 0.6
        !           744: .in +1.0i
        !           745: \fL .stabd    \fItype\fL,0,\fIdesc\fR
        !           746: .in -1.0i
        !           747: .sp 1
        !           748: .LP
        !           749: generate records in the \fIa.out\fR symbol table which are described by
        !           750: variations of the C structure
        !           751: .ne 7
        !           752: .TS
        !           753: center;
        !           754: l l lw(1.5i) lw(1.0i) l lw(2.7i) l.
        !           755: \s-2\fLstruct  nlist
        !           756: {      long     n_strx;        /* \fRstring table index\fL     */
        !           757:        unsigned char    n_type;        /* \fRtype field\fL     */
        !           758:        char     n_other;       /* \fRunused\fL */
        !           759:        short    n_desc;        /* \fRdesc field\fL     */
        !           760:        unsigned long    n_value;       /* \fRsymbol value or offset\fL */
        !           761: };\fR\s+2
        !           762: .TE
        !           763: with the variations as given by the field names, i.e. a \fL.stabs\fR directive
        !           764: fills all five fields, a \fL.stabn\fR directive defaults the \fLn_strx\fR
        !           765: field to zero, and a \fL.stabd\fR directive, in addition to defaulting
        !           766: \fLn_strx\fR, sets the \fLn_value\fR field to the current value of the
        !           767: assembler location counter.
        !           768: .PP
        !           769: Symbols generated by \fL.stab\fR directives are distinguished from assembler
        !           770: symbols by whether any of the bits in the mask \fLN_STAB\fR (with value
        !           771: \fL0xe0\fR) are set.
        !           772: .PP
        !           773: The \fLn_strx\fR field contains an index into the \fIa.out\fR string table for
        !           774: the string occurring in a \fL.stabs\fR directive.
        !           775: The string table consists of a 32-bit word containing the length of the table
        !           776: in bytes (including the length word) followed by a series of
        !           777: null-terminated strings.
        !           778: The index is the offset of the first character of a string from the first
        !           779: byte of the length word.
        !           780: .PP
        !           781: If the value field given in a \fL.stabd\fR directive is a symbol, the offset of
        !           782: the symbol from the beginning of the appropriate control section (text, data
        !           783: or bss) is placed in the \fLn_value\fR field.
        !           784: The current location is handled similarly for the \fL.stabd\fR directive.
        !           785: .PP
        !           786: Assembler symbols can be described in terms of the \fL.stabs\fR directives
        !           787: which would generate the same information.
        !           788: Their syntax is as follows:
        !           789: .PP
        !           790: .PR AssemblerSymbol ".stabs "" SymbolName "" , SymbolType , 0 , 0 , SymbolOffset
        !           791: .PC SymbolName Name
        !           792: .PC SymbolType "N_TEXT | TextExternal | N_DATA | DataExternal | N_BSS | BssExternal"
        !           793: .PC N_TEXT 0x04
        !           794: .PC TextExternal 0x05
        !           795: .PC N_DATA 0x06
        !           796: .PC DataExternal 0x07
        !           797: .PC N_BSS 0x08
        !           798: .PC BssExternal 0x09
        !           799: .PP
        !           800: The \fLSymbolName\fR and \fLSymbolOffset\fR are simply the text of the symbol
        !           801: and its offset within the text, data or bss space.
        !           802: The \fLSymbolType\fR indicates the address space and whether the symbol is
        !           803: external.
        !           804: External symbols are indicated by or'ing the value of \fLN_EXT\fR, which is
        !           805: \fL0x01\fR, with the type for the corresponding space.
        !           806: .PP
        !           807: .sp 1
        !           808: .NH 2
        !           809: Other Issues
        !           810: .PP
        !           811: There are several other things one needs to know to interface to the debuggers:
        !           812: .sp 0.5
        !           813: .IP 1.
        !           814: The debuggers require that a program include a routine named \fL_main\fR.
        !           815: If none is found, an internal error results.
        !           816: .IP 2.
        !           817: The debuggers assume the Sun standard format for the run-time stack.
        !           818: If yours differs, it may still be possible to interface to them.
        !           819: Contact us for more information.
        !           820: .PP
        !           821: .sp 1
        !           822: .NH 1
        !           823: The DP-UIP Interface Language
        !           824: .PP
        !           825: As mentioned above in Section 2, \fIdbxtool\fR consists of two processes, the
        !           826: DP (debugger process) and the UIP (user interface process).
        !           827: Commands passed from the DP to the UIP pass through a pipe which is created
        !           828: by the UIP when it starts the DP.
        !           829: The commands are expressed in the DP-UIP interface language, whose
        !           830: syntax and semantics appear below.
        !           831: .NH 2
        !           832: What the UIP and DP Know About Each Other
        !           833: .PP
        !           834: In the current version of \fIdbxtool\fR there are several assumptions which
        !           835: the UIP makes about the DP and vice versa, as follows:
        !           836: .IP 1.
        !           837: The name of the program which the UIP starts is \fLdbx\fR.
        !           838: To do so, it calls \fLttysw_fork(\ )\fR with its second argument set to a
        !           839: pointer to an array \fLnargv[ ]\fR of character strings of the form
        !           840: .TS
        !           841: center;
        !           842: lfL l.
        !           843: nargv[0]       \fLdbx\fR
        !           844: nargv[1]       \fL-P\fR
        !           845: nargv[2]       \fIpipenumber\fR
        !           846: nargv[3]       \v'0.02i'\(rt\v'-0.02i'
        !           847:   ...  \(rk \fIarguments\fR
        !           848: nargv[\fIn\fR] \v'-0.02i'\(rb\v'0.02i'
        !           849: .TE
        !           850: where \fIpipenumber\fR is the number of the pipe which the DP uses in writing
        !           851: to the UIP and \fIarguments\fR are the arguments with which \fIdbxtool\fR
        !           852: was invoked.
        !           853: .IP 2.
        !           854: The sequence of directories to search for source files (provided by
        !           855: the \fIuse\fR command in \fIdbx\fR and \fIdbxtool\fR) is passed by the
        !           856: DP to the UIP (via the \fLI_USE\fR command described below) and used by it
        !           857: to display source in the source window.
        !           858: .IP 3.
        !           859: The lineno selection interpretation is expanded into the form
        !           860: "\fIfilename\fR":\fIlineno\fR before it is passed to the DP.
        !           861: .IP 4.
        !           862: The UIP's command button mechanism assumes that the DP expects commands in
        !           863: prefix form, i.e. with the command name first, and with a blank separating
        !           864: the name from the following argument (if any).
        !           865: Further, for the command buttons to be really useful it must be the case that
        !           866: the DP's most used commands take either zero or one argument, since the
        !           867: argument selection mechanism cannot accomodate more than one selection per
        !           868: command.
        !           869: .PP
        !           870: .NH 2
        !           871: Commands and Type Identifiers
        !           872: .PP
        !           873: .PR Command "VersionCheck | InitDone | Stopped | Quit | PrintLines | BreakSet | BreakDel | Resume | Use | Reinit | Kill | Chdir | Emphasize | Trace | Display | ToolEnv | Width | SourceLines | CommandLines | DisplayLines | Font | TopMargin | BotMargin | Un
        !           874: 
        !           875: 
        !           876: 
        !           877: 
        !           878: 
        !           879: button | Button"
        !           880: .PP
        !           881: Each command and argument begins with a type identifier which indicates the
        !           882: command or the type of the argument.
        !           883: The mapping between integers and type identifiers is given in Table 4.
        !           884: .KF
        !           885: .sp 1
        !           886: .TS
        !           887: center box;
        !           888: n | lfL.
        !           889: 0      I_BADTYPE
        !           890: 1      I_INITDONE
        !           891: 2      I_STOPPED
        !           892: 3      I_STRING
        !           893: 4      I_INT
        !           894: 5      I_QUIT
        !           895: 6      I_PRINTLINES
        !           896: 7      I_BRKSET
        !           897: 8      I_BRKDEL
        !           898: 9      I_RESUME
        !           899: 10     I_USE
        !           900: 11     I_REINIT
        !           901: 12     I_KILL
        !           902: 13     I_CHDIR
        !           903: 14     I_EMPHASIZE
        !           904: 15     I_TRACE
        !           905: 16     I_DISPLAY
        !           906: 17     I_VERSION
        !           907: 18     I_TOOLENV
        !           908: 19     I_WIDTH
        !           909: 20     I_SRCLINES
        !           910: 21     I_CMDLINES
        !           911: 22     I_DISPLINES
        !           912: 23     I_FONT
        !           913: 24     I_TOPMARGIN
        !           914: 25     I_BOTMARGIN
        !           915: 26     I_UNBUTTON
        !           916: 27     I_BUTTON
        !           917: .TE
        !           918: .ce
        !           919: Table 4.  Command and Type Identifiers
        !           920: .sp 1
        !           921: .KE
        !           922: .PP
        !           923: .NH 2
        !           924: Version Consistency Checking
        !           925: .PP
        !           926: .PR VersionCheck "I_VERSION VersionNumber"
        !           927: .PP
        !           928: The DP issues this command during initialization to insure that the versions
        !           929: of the DP and UIP being run are consistent with each other.
        !           930: It tells the UIP the version number of the DP, which must match that of the
        !           931: UIP.
        !           932: It must be the first command issued.
        !           933: .PP
        !           934: .NH 2
        !           935: Initialization Finished
        !           936: .PP
        !           937: .PR InitDone "I_INITDONE FileName LineNumber"
        !           938: .PP
        !           939: The DP issues this command to inform the UIP that it has completed initializing
        !           940: itself.
        !           941: It tells the UIP the name of the source file to display and the line number of
        !           942: the line to appear at the top of the source window.
        !           943: .PP
        !           944: .NH 2
        !           945: Breakpoint Reached
        !           946: .PP
        !           947: .PR Stopped "I_STOPPED FileName FuncName LineNumber BreakFile BreakFunc BreakLine"
        !           948: .PP
        !           949: This command indicates that a breakpoint has been reached and tells the
        !           950: UIP the filename, function name and line number of the point currently
        !           951: being displayed and the same information concerning the breakpoint.
        !           952: .PP
        !           953: .NH 2
        !           954: Terminate \fIDbxtool\fR
        !           955: .PP
        !           956: .PR Quit "I_QUIT ExitStatus"
        !           957: .PP
        !           958: This command tells the UIP to terminate execution of \fIdbxtool\fR and return
        !           959: the given exit status to the shell which invoked it.
        !           960: .PP
        !           961: .NH 2
        !           962: Print Source Lines
        !           963: .PP
        !           964: .PR PrintLines "I_PRINTLINES FileName LineNumber LineNumber"
        !           965: .PP
        !           966: This command specifies a filename and two line numbers, the second of which
        !           967: is ignored by the UIP.
        !           968: It causes the UIP to display lines from the given file in the source window.
        !           969: .PP
        !           970: .NH 2
        !           971: Set a Breakpoint
        !           972: .PP
        !           973: .PR BreakSet "I_BRKSET FileName LineNumber"
        !           974: .PP
        !           975: This command tells the UIP to display a stop sign on the given line
        !           976: of the given file.
        !           977: .PP
        !           978: .NH 2
        !           979: Delete a Breakpoint
        !           980: .PP
        !           981: .PR BreakDel "I_BRKDEL FileName LineNumber"
        !           982: .PP
        !           983: This command tells the UIP to remove a stop sign from the given line
        !           984: of the given file.
        !           985: .PP
        !           986: .NH 2
        !           987: Ready to Resume Execution 
        !           988: .PP
        !           989: .PR Resume "I_RESUME"
        !           990: .PP
        !           991: This command tells the UIP that the DP is ready to resume execution of the
        !           992: process being debugged.
        !           993: .PP
        !           994: .NH 2
        !           995: Specify Directory Search Path
        !           996: .PP
        !           997: .PR Use "I_USE DirNumber Directory*"
        !           998: .PP
        !           999: This command specifies to the UIP the search path to be used in locating
        !          1000: source files.
        !          1001: It specifies the number of directories followed by their names. 
        !          1002: .PP
        !          1003: .NH 2
        !          1004: Reinitialize the Debugger
        !          1005: .PP
        !          1006: .PR Reinit "I_REINIT"
        !          1007: .PP
        !          1008: This command indicates that the debugger is being reinitialized to debug
        !          1009: another process.
        !          1010: .PP
        !          1011: .NH 2
        !          1012: Kill the Process Being Debugged
        !          1013: .PP
        !          1014: .PR Kill "I_KILL"
        !          1015: .PP
        !          1016: This command informs the UIP that the process being debugged has been
        !          1017: discarded by the DP.
        !          1018: .PP
        !          1019: .NH 2
        !          1020: Change Directory
        !          1021: .PP
        !          1022: .PR Chdir "I_CHDIR Directory"
        !          1023: .PP
        !          1024: This command tells the UIP to change its notion of the current directory
        !          1025: to the one specified.
        !          1026: .PP
        !          1027: .NH 2
        !          1028: Display and Highlight Source Lines
        !          1029: .PP
        !          1030: .PR Emphasize "I_EMPHASIZE FileName LineNumber"
        !          1031: .PP
        !          1032: This command tells the UIP to highlight the given source line (and to display
        !          1033: it if it is not already displayed).
        !          1034: .PP
        !          1035: .NH 2
        !          1036: Display and Highlight Traced Lines
        !          1037: .PP
        !          1038: .PR Trace "I_TRACE BreakFile BreakFunc  BreakLine"
        !          1039: .PP
        !          1040: This command tells the UIP to highlight the given source line and display the
        !          1041: arrow indicating the execution focus next to it (and to display it if it
        !          1042: is not already displayed).
        !          1043: .PP
        !          1044: .NH 2
        !          1045: Update Variable Display
        !          1046: .PP
        !          1047: .PR Display "I_DISPLAY DisplayFile"
        !          1048: .PP
        !          1049: This command tells the UIP to update the variable display window by
        !          1050: showing the contents of the given file.
        !          1051: .PP
        !          1052: .NH 2
        !          1053: Print the Tool Environment
        !          1054: .PP
        !          1055: .PR ToolEnv "I_TOOLENV"
        !          1056: .PP
        !          1057: This command causes the UIP to print the current tool environment parameters.
        !          1058: .PP
        !          1059: .NH 2
        !          1060: Specify Width of Window
        !          1061: .PP
        !          1062: .PR Width "I_WIDTH Number"
        !          1063: .PP
        !          1064: This command causes the UIP to change the width of the window to the
        !          1065: given number of characters.
        !          1066: .PP
        !          1067: .NH 2
        !          1068: Specify Number of Lines in Source Window
        !          1069: .PP
        !          1070: .PR SourceLines "I_SRCLINES NumberLines"
        !          1071: .PP
        !          1072: This command causes the UIP to set the vertical size of the source window to
        !          1073: the given number of lines.
        !          1074: .PP
        !          1075: .NH 2
        !          1076: Specify Number of Lines in Command Window
        !          1077: .PP
        !          1078: .PR CommandLines "I_CMDLINES NumberLines"
        !          1079: .PP
        !          1080: This command causes the UIP to set the vertical size of the command window to
        !          1081: the given number of lines.
        !          1082: .PP
        !          1083: .NH 2
        !          1084: Specify Number of Lines in Display Window
        !          1085: .PP
        !          1086: .PR DisplayLines "I_DISPLINES NumberLines"
        !          1087: .PP
        !          1088: This command causes the UIP to set the vertical size of the display window to
        !          1089: the given number of lines.
        !          1090: .PP
        !          1091: .NH 2
        !          1092: Change Font
        !          1093: .PP
        !          1094: .PR Font "I_FONT FontFile"
        !          1095: .PP
        !          1096: This command causes the UIP to using the font given in the specified font file.
        !          1097: .PP
        !          1098: .NH 2
        !          1099: Change Top Margin of Source Window
        !          1100: .PP
        !          1101: .PR TopMargin "I_TOPMARGIN NumberLines"
        !          1102: .PP
        !          1103: This command causes the UIP to set the number of lines between the top of the
        !          1104: source window and the first line containing a breakpoint or the current
        !          1105: execution focus.
        !          1106: .PP
        !          1107: .NH 2
        !          1108: Change Bottom Margin of Source Window
        !          1109: .PP
        !          1110: .PR BotMargin "I_BOTMARGIN NumberLines"
        !          1111: .PP
        !          1112: This command causes the UIP to set the number of lines between the bottom
        !          1113: of the source window and the last line containing a breakpoint or the current
        !          1114: execution focus.
        !          1115: .PP
        !          1116: .NH 2
        !          1117: Remove a Button from the Buttons Window
        !          1118: .PP
        !          1119: .PR Unbutton "I_UNBUTTON ButtonName"
        !          1120: .PP
        !          1121: This command causes the UIP to remove from the buttons window the first button
        !          1122: with the given name.
        !          1123: .PP
        !          1124: .NH 2
        !          1125: Add a Button to the Buttons Window
        !          1126: .PP
        !          1127: .PR Button "I_BUTTON SelectionType ButtonName"
        !          1128: .PP
        !          1129: This command causes the UIP to add to the buttons window a button with the
        !          1130: indicated selection interpretation and name.
        !          1131: The mapping between selection type numbers and selection interpretations
        !          1132: and their meanings is given in Table 5.
        !          1133: .KF
        !          1134: .sp 1
        !          1135: .TS
        !          1136: center box;
        !          1137: c | c | cw(3.5i)
        !          1138: n | l | lw(3.5i).
        !          1139: type   name    meaning
        !          1140: _
        !          1141: 1      command T{
        !          1142: the selection, which must be in the command window, is expanded to produce
        !          1143: the command which contains it
        !          1144: T}
        !          1145: _
        !          1146: 2      expand  T{
        !          1147: the selection produces exactly the selected text, except that if either
        !          1148: its first or last character is an alphanumeric or an underscore it is
        !          1149: expanded to produce the longest enclosing sequence of alphanumerics and
        !          1150: underscores
        !          1151: T}
        !          1152: _
        !          1153: 3      ignore  T{
        !          1154: the selection is ignored, producing the null string
        !          1155: T}
        !          1156: _
        !          1157: 4      lineno  T{
        !          1158: the selection, which must be in the source window, produces a string of the
        !          1159: form "\fIfilename\fR":\fIlineno\fR, where \fIfilename\fR is the name of the
        !          1160: file displayed in the source window and \fIlineno\fR is the line number of
        !          1161: the selected line
        !          1162: T}
        !          1163: _
        !          1164: 5      literal T{
        !          1165: the selection produces exactly the selected text
        !          1166: T}
        !          1167: .TE
        !          1168: .ce
        !          1169: Table 5.  Selection Interpretations
        !          1170: .sp 1
        !          1171: .KE
        !          1172: .PP
        !          1173: .NH 2
        !          1174: Other Items
        !          1175: .PP
        !          1176: .PR SelectionType Number
        !          1177: .PC FileName String
        !          1178: .PC LineNumber Number
        !          1179: .PC FuncName String
        !          1180: .PC BreakFile String
        !          1181: .PC BreakFunc String
        !          1182: .PC BreakLine Number
        !          1183: .PC ExitStatus Number
        !          1184: .PC DirNumber Number
        !          1185: .PC Directory String
        !          1186: .PC DisplayFile String
        !          1187: .PC NumberLines Number
        !          1188: .PC FontFile String
        !          1189: .PC ButtonName String
        !          1190: .PP
        !          1191: .NH 2
        !          1192: Numbers and Strings
        !          1193: .PP
        !          1194: .PR Number "I_INT Integer"
        !          1195: .PC String "I_STRING StringLen Character*"
        !          1196: .PC StringLen Integer
        !          1197: .PP
        !          1198: A number is a 32-bit integer.
        !          1199: A string consists of a 32-bit integer followed by a sequence of that many
        !          1200: characters.
        !          1201: .PP
        !          1202: .bp
        !          1203: .ce
        !          1204: \s+2\fBAppendix A.  Standard Types for Sun C, FORTRAN 77, Pascal
        !          1205: .ce
        !          1206:  and Modula-2\fR\s-2
        !          1207: .sp 1
        !          1208: .PP
        !          1209: Each language defines some standard types by a series of \fL.stabs\fR
        !          1210: lines, as follows.
        !          1211: For C***, they are
        !          1212: .FS
        !          1213: ***The "\fL???\fR" entry at the end is a debugging artifact.
        !          1214: It serves no purpose in ordinary usage of \fIdbx\fR.
        !          1215: .FE
        !          1216: .sp 1
        !          1217: .in +0.75i
        !          1218: .nf
        !          1219: \fL\s-2
        !          1220:  .stabs    "int:t(0,1)=r(0,1);-2147483648;2147483647;",0x80,0,0,0
        !          1221:  .stabs    "char:t(0,2)=r(0,2);0;127;",0x80,0,0,0
        !          1222:  .stabs    "long:t(0,3)=r(0,1);-2147483648;2147483647;",0x80,0,0,0
        !          1223:  .stabs    "short:t(0,4)=r(0,1);-32768;32767;",0x80,0,0,0
        !          1224:  .stabs    "unsigned char:t(0,5)=r(0,1);0;255;",0x80,0,0,0
        !          1225:  .stabs    "unsigned short:t(0,6)=r(0,1);0;65535;",0x80,0,0,0
        !          1226:  .stabs    "unsigned long:t(0,7)=r(0,1);0;-1;",0x80,0,0,0
        !          1227:  .stabs    "unsigned int:t(0,8)=r(0,1);0;-1;",0x80,0,0,0
        !          1228:  .stabs    "float:t(0,9)=r(0,1);4;0;",0x80,0,0,0
        !          1229:  .stabs    "double:t(0,10)=r(0,1);8;0;",0x80,0,0,0
        !          1230:  .stabs    "void:t(0,11)=(0,11)",0x80,0,0,0
        !          1231:  .stabs    "???:t(0,12)=(0,1)",0x80,0,0,0
        !          1232: \fR\s+2
        !          1233: .fi
        !          1234: .in -0.75i
        !          1235: .sp 1
        !          1236: For FORTRAN 77, they are
        !          1237: .sp 1
        !          1238: .in +0.75i
        !          1239: .nf
        !          1240: \fL\s-2
        !          1241:  .stabs    "integer*2:t2=r2;-32768;32767;",0x20,0,0,0
        !          1242:  .stabs    "integer*4:t3=r3;-2147483648;2147483647;",0x20,0,0,0
        !          1243:  .stabs    "real:t5=r5;4;0;",0x20,0,0,0
        !          1244:  .stabs    "double precision:t6=r6;8;0;",0x20,0,0,0
        !          1245:  .stabs    "complex:t7=r7;8;0;",0x20,0,0,0
        !          1246:  .stabs    "double complex:t8=r8;16;0;",0x20,0,0,0
        !          1247:  .stabs    "logical:t9=3;",0x20,0,0,0
        !          1248:  .stabs    "char:t10=r10;0;127;",0x20,0,0,0
        !          1249:  .stabs    "void:t11=r11;0;0;",0x20,0,0,0
        !          1250: \fR\s+2
        !          1251: .fi
        !          1252: .in -0.75i
        !          1253: .sp 1
        !          1254: For Pascal, they are
        !          1255: .sp 1
        !          1256: .in +0.75i
        !          1257: .nf
        !          1258: \fL\s-2
        !          1259:  .stabs    "boolean:t1=efalse:0,true:1,",0x20,0x0,0x0,0x0
        !          1260:  .stabs    "char:t2=r2;0;127",0x20,0x0,0x0,0x0
        !          1261:  .stabs    "integer:t3=r3;-2147483648;2147483647",0x20,0x0,0x0,0x0
        !          1262:  .stabs    "shortreal:t4=r4;4;0",0x20,0x0,0x0,0x0
        !          1263:  .stabs    "real:t5=r5;8;0",0x20,0x0,0x0,0x0
        !          1264:  .stabs    "(void):t6=6",0x20,0x0,0x0,0x0
        !          1265:  .stabs    "Boolean:t1",0x20,0x0,0x0,0x0
        !          1266:  .stabs    "intset:t7=Sr3;0;127",0x20,0x0,0x0,0x0
        !          1267:  .stabs    "alfa:t8=ar3;1;10;2",0x20,0x0,0x0,0x0
        !          1268:  .stabs    "text:t9=L2",0x20,0x0,0x0,0x0
        !          1269:  .stabs    "longreal:t5",0x20,0x0,0x0,0x0
        !          1270: \fR\s+2
        !          1271: .fi
        !          1272: .in -0.75i
        !          1273: .sp 1
        !          1274: .ne 10
        !          1275: For Modula-2, they are
        !          1276: .sp 1
        !          1277: .in +0.75i
        !          1278: .nf
        !          1279: \fL\s-2
        !          1280:  .stabs    "INTEGER:t1=r1;-2147483648;2147483647", 0x80, 0, 4, 0
        !          1281:  .stabs    "SHORTINT:t2=r1;-32768;32767", 0x80, 0, 2, 0
        !          1282:  .stabs    "CARDINAL:t3=r3;0;-1", 0x80, 0, 4, 0
        !          1283:  .stabs    "SHORTCARD:t4=r3;0;65535", 0x80, 0, 2, 0
        !          1284:  .stabs    "CHAR:t5=r5;0;255", 0x80, 0, 1, 0
        !          1285:  .stabs    "BOOLEAN:t6=eFALSE:0,TRUE:1,", 0x80, 0, 1, 0
        !          1286:  .stabs    "REAL:t7=r7;4;0", 0x80, 0, 4, 0
        !          1287:  .stabs    "(void):t8=8", 0x80, 0, 4, 0
        !          1288:  .stabs    "PROC:t9=Q8,0", 0x80, 0, 4, 0
        !          1289:  .stabs    "BITSET:t10=Sr3;0;31", 0x80, 0, 4, 0
        !          1290:  .stabs    "BYTE:t11=r11;0;255", 0x80, 0, 1, 0
        !          1291:  .stabs    "WORD:t12=r12;0;-1", 0x80, 0, 4, 0
        !          1292:  .stabs    "ADDRESS:t13=r3;0;-1", 0x80, 0, 4, 0
        !          1293:  .stabs    "PROCESS:t14=*12", 0x80, 0, 4, 0
        !          1294: \fR\s+2
        !          1295: .fi
        !          1296: .in -0.75i
        !          1297: .sp 1
        !          1298: .bp
        !          1299: .ce
        !          1300: \s+2\fBAppendix B.  An Example of the Compiler-Debugger Interface\fR\s-2
        !          1301: .sp 1
        !          1302: .PP
        !          1303: This appendix gives an example of the code generated by the Sun C compiler
        !          1304: to interface to the \fIdbx\fR and \fIdbxtool\fR debuggers.
        !          1305: We take as our example the (nonsense) C program
        !          1306: .sp 1
        !          1307: .in +1.0i
        !          1308: .nf
        !          1309: \fL
        !          1310: int a;
        !          1311: static int b;
        !          1312: 
        !          1313: static void l( );
        !          1314: 
        !          1315: main (d)
        !          1316: register short int d;
        !          1317: {      int e[10][20];
        !          1318:        static int g = 3;
        !          1319:        register int h;
        !          1320:        struct i {
        !          1321:                int j;
        !          1322:                float k;
        !          1323:        } i;
        !          1324: 
        !          1325:        a = 2;
        !          1326:        i.j = b;
        !          1327:        l( );
        !          1328: }
        !          1329: 
        !          1330: static void l()
        !          1331: {
        !          1332:        b = 3;
        !          1333: }
        !          1334: \fR
        !          1335: .fi
        !          1336: .in -1.0i
        !          1337: .LP
        !          1338: Compiling this program with \fLcc -g -S example.c\fR results in the following
        !          1339: assembly code in \fLexample.s\fR (with line numbers supplied at the left):
        !          1340: .TS
        !          1341: nw(0.4i) lw(0.7i)fL lw(0.9i)fL lfL.
        !          1342: \s-2
        !          1343: 1              .stabs  "example.c",0x64,0,0,LL0
        !          1344: 2      LL0:
        !          1345: 3              .data
        !          1346: 4              .stabs  "int:t(0,1)=r(0,1);-2147483648;2147483647;",
        !          1347:                        0x80,0,0,0
        !          1348: 5              .stabs  "char:t(0,2)=r(0,2);0;127;",0x80,0,0,0
        !          1349: 6              .stabs  "long:t(0,3)=r(0,1);-2147483648;2147483647;",
        !          1350:                        0x80,0,0,0
        !          1351: 7              .stabs  "short:t(0,4)=r(0,1);-32768;32767;",0x80,0,0,0
        !          1352: 8              .stabs  "unsigned char:t(0,5)=r(0,1);0;255;",
        !          1353:                        0x80,0,0,0
        !          1354: 9              .stabs  "unsigned short:t(0,6)=r(0,1);0;65535;",
        !          1355:                        0x80,0,0,0
        !          1356: 10             .stabs  "unsigned long:t(0,7)=r(0,1);0;-1;",0x80,0,0,0
        !          1357: 11             .stabs  "unsigned int:t(0,8)=r(0,1);0;-1;",0x80,0,0,0
        !          1358: 12             .stabs  "float:t(0,9)=r(0,1);4;0;",0x80,0,0,0
        !          1359: 13             .stabs  "double:t(0,10)=r(0,1);8;0;",0x80,0,0,0
        !          1360: 14             .stabs  "void:t(0,11)=(0,11)",0x80,0,0,0
        !          1361: 15             .stabs  "???:t(0,12)=(0,1)",0x80,0,0,0
        !          1362: 16             .stabs  "a:G(0,1)",0x20,0,4,0
        !          1363: 17             .comm   _a,0x4
        !          1364: 18             .stabs  "b:S(0,1)",0x28,0,4,_b
        !          1365: 19             .lcomm  _b,4
        !          1366: 20     |||                     no info for l (18) 
        !          1367: 21             .stabs  "main:F(0,1)",0x24,0,4,_main
        !          1368: 22             .stabs  "d:r(0,4)",0x40,0,2,7
        !          1369: 23             .stabs  "d:p(0,4)",0xa0,0,2,8
        !          1370: 24             .text
        !          1371: 25             .stabn  0x44,0,8,LL1
        !          1372: 26     LL1:
        !          1373: 27     |       #PROC# 04
        !          1374: 28             .globl  _main
        !          1375: 29     _main:
        !          1376: 30             link    a6,#0
        !          1377: 31             addl    #-LF14,sp
        !          1378: 32             moveml  #LS14,sp@
        !          1379: 33             movw    a6@(10),d7
        !          1380: 34             .stabn  0x44,0,8,LL2
        !          1381: 35     LL2:
        !          1382: 36             .stabs  "e:(0,13)=ar(0,1);0;9;(0,14)=ar(0,1);0;19;(0,1)",
        !          1383:                        0x80,0,4,-800
        !          1384: 37             .stabs  "g:V(0,1)",0x26,0,4,L16
        !          1385: 38             .data
        !          1386: 39             .even
        !          1387: 40     L16:
        !          1388: 41             .text
        !          1389: 42             .data
        !          1390: 43             .long   0x3
        !          1391: 44             .stabs  "h:r(0,1)",0x40,0,4,6
        !          1392: 45             .stabs  "i:T(0,15)=s8j:(0,1),0,32;k:(0,9),32,32;;",
        !          1393:                        0x80,0,8,-1275
        !          1394: 46             .stabs  "i:(0,15)",0x80,0,8,-808
        !          1395: 47             .stabn  0xc0,0,2,LL3
        !          1396: 48     LL3:
        !          1397: 49             .text
        !          1398: 50             .stabn  0x44,0,16,LL4
        !          1399: 51     LL4:
        !          1400: 52             movl    #0x2,_a
        !          1401: 53             .stabn  0x44,0,17,LL5
        !          1402: 54     LL5:
        !          1403: 55             movl    _b,a6@(-0x328)
        !          1404: 56             .stabn  0x44,0,18,LL6
        !          1405: 57     LL6:
        !          1406: 58             jbsr    _l
        !          1407: 59             .stabn  0xe0,0,2,LL7
        !          1408: 60     LL7:
        !          1409: 61             .stabn  0x44,0,19,LL8
        !          1410: 62     LL8:
        !          1411: 63     LE14:
        !          1412: 64             moveml  a6@(-0x32c),#0x80
        !          1413: 65             unlk    a6
        !          1414: 66             rts
        !          1415: 67             LF14    = 812
        !          1416: 68             LS14    = 0x80
        !          1417: 69             LFF14   = 808
        !          1418: 70             LSS14   = 0x0
        !          1419: 71             LP14    = 0x8
        !          1420: 72             .data
        !          1421: 73             .stabs  "l:f(0,11)",0x24,0,0,_l
        !          1422: 74             .text
        !          1423: 75             .stabn  0x44,0,22,LL9
        !          1424: 76     LL9:
        !          1425: 77     |       #PROC# 0
        !          1426: 78     _l:
        !          1427: 79             link    a6,#0
        !          1428: 80             addl    #-LF17,sp
        !          1429: 81             moveml  #LS17,sp@
        !          1430: 82             .stabn  0x44,0,22,LL10
        !          1431: 83     LL10:
        !          1432: 84             .stabn  0x44,0,23,LL11
        !          1433: 85     LL11:
        !          1434: 86             movl    #0x3,_b
        !          1435: 87             .stabn  0x44,0,24,LL12
        !          1436: 88     LL12:
        !          1437: 89     LE17:
        !          1438: 90             unlk    a6
        !          1439: 91             rts
        !          1440: 92             LF17    = 0
        !          1441: 93             LS17    = 0x0
        !          1442: 94             LFF17   = 0
        !          1443: 95             LSS17   = 0x0
        !          1444: 96             LP17    = 0x8
        !          1445: 97             .data
        !          1446: \s+2
        !          1447: .TE
        !          1448: .LP
        !          1449: The following commentary is keyed to the line numbers appearing at the left.
        !          1450: .IP 1: 0.75i
        !          1451: Identifies the source file from which the program was compiled.
        !          1452: .IP "4 - 15:" 0.75i
        !          1453: The C standard types, generated automatically by the compiler.
        !          1454: Line 4, for example, defines \fLint\fR to be type number \fL(0,1)\fR, to be
        !          1455: a subrange of itself with values extending from \fL-2147483648\fR through
        !          1456: \fL2147483647\fR and to be local.
        !          1457: .IP "16 - 17:" 0.75i
        !          1458: The variable \fLa\fR is identified as being a global \fLint\fR
        !          1459: ("\fLG(0,1)\fR") and as occupying 4 bytes of storage.
        !          1460: Its address is given by the assembler symbol \fL_a\fR.
        !          1461: .IP "18 - 19:" 0.75i
        !          1462: The variable \fLb\fR is identified as being a static global \fLint\fR
        !          1463: ("\fLS(0,1)\fR") occupying 4 bytes of storage an with address \fL_b\fR.
        !          1464: .IP 20: 0.75i
        !          1465: The information about \fLl\fR will come later when it is declared (see
        !          1466: line 73).
        !          1467: .IP 21: 0.75i
        !          1468: The symbol \fLmain\fR is identified as a function returning an \fLint\fR
        !          1469: ("\fLF(0,1)\fR") and as beginning at the assembler symbol \fL_main\fR.
        !          1470: .IP "22 - 23:" 0.75i
        !          1471: The symbol \fLd\fR is a \fLshort int\fR parameter ("\fLp(0,4)\fR") and a
        !          1472: register variable ("\fLr(0,4)\fR") occupying in register d7.
        !          1473: .IP 25: 0.75i
        !          1474: This entry represents a bug discovered in the C compiler discovered during
        !          1475: preparation of this document.
        !          1476: The entry on line 34 is the correct one (\fIq.v.\fR)
        !          1477: The bug causes no errors in the debugger since the second (correct) entry for
        !          1478: line 8 simply supplants this one.
        !          1479: .IP 34: 0.75i
        !          1480: Identifies the first line of \fLexample.c\fR for which any executable code is
        !          1481: generated as line 8 and as corresponding to assembly label \fLLL2\fR.
        !          1482: Line 8 is the entry point of \fLmain\fR.
        !          1483: .IP 36: 0.75i
        !          1484: Identifies the symbol \fLe\fR as an array of arrays with anonymous type
        !          1485: \fL(0,13)\fR.
        !          1486: Its subscript is a subrange of \fLint\fR with range \fL0\fR through \fL9\fR
        !          1487: and its elements are arrays with anonymous type \fL(0,14)\fR, which in turn
        !          1488: is an array whose subscript is a subrange of \fLint\fR with range \fL0\fR
        !          1489: through \fL19\fR and element type \fLint\fR.
        !          1490: Its stack offset is -800.
        !          1491: .IP 37: 0.75i
        !          1492: Identifies the symbol \fLg\fR as a static local variable of type \fLint\fR
        !          1493: ("\fLV(0,1)\fR") located at label \fLL16\fR.
        !          1494: .IP 44: 0.75i
        !          1495: The variable \fLh\fR is identified as being a \fLregister int\fR
        !          1496: ("\fLr(0,1)\fR") occupying register d6.
        !          1497: .IP 45: 0.75i
        !          1498: Identifies the symbol \fLi\fR as a structure tag of anonymous type
        !          1499: \fL(0,15)\fR.
        !          1500: Type \fL(0,15)\fR is defined as a structure type occupying 8 bytes with fields
        !          1501: named \fLj\fR and \fLk\fR.
        !          1502: Field \fLj\fR is of type \fLint\fR, begins at bit offset zero and runs for
        !          1503: 32 bits; field \fLk\fR is of type \fLfloat\fR, begins at bit offset 32 and
        !          1504: runs for 32 bits.
        !          1505: .IP 46: 0.75i
        !          1506: Identifies the symbol \fLi\fR as a local variable of type \fL(0,15)\fR
        !          1507: occupying eight bytes and located at stack offset -808.
        !          1508: .IP 47: 0.75i
        !          1509: Identifies a level 2 scope beginning at label \fLLL3\fR.
        !          1510: .IP 59: 0.75i
        !          1511: Identifies a level 2 scope ending at label \fLLL7\fR.
        !          1512: .IP 73: 0.75i
        !          1513: Identifies \fLl\fR as a local function returning \fLvoid\fR and beginning at
        !          1514: symbol \fL_l\fR.
        !          1515: .IP "75 & 82:" 0.75i
        !          1516: These two lines represent the same harmless C compiler bug as do lines 25 and
        !          1517: 34.
        !          1518: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.