Annotation of GNUtools/cctools/include/gnu/symseg.h, revision 1.1

1.1     ! root        1: /* GDB symbol table format definitions.
        !             2:    Copyright (C) 1986 Free Software Foundation, Inc.
        !             3: 
        !             4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY
        !             5: WARRANTY.  No author or distributor accepts responsibility to anyone
        !             6: for the consequences of using it or for whether it serves any
        !             7: particular purpose or works at all, unless he says so in writing.
        !             8: Refer to the GDB General Public License for full details.
        !             9: 
        !            10: Everyone is granted permission to copy, modify and redistribute GDB,
        !            11: but only under the conditions described in the GDB General Public
        !            12: License.  A copy of this license is supposed to have been given to you
        !            13: along with GDB so you can know your rights and responsibilities.  It
        !            14: should be in a file named COPYING.  Among other things, the copyright
        !            15: notice and this notice must be preserved on all copies.
        !            16: 
        !            17: In other words, go ahead and share GDB, but don't try to stop
        !            18: anyone else from sharing it farther.  Help stamp out software hoarding!
        !            19: */
        !            20: 
        !            21: /* Format of GDB symbol table data.
        !            22:    There is one symbol segment for each source file or
        !            23:    independant compilation.  These segments are simply concatenated
        !            24:    to form the GDB symbol table.  A zero word where the beginning
        !            25:    of a segment is expected indicates there are no more segments.
        !            26: 
        !            27: Format of a symbol segment:
        !            28: 
        !            29:    The symbol segment begins with a word containing 1
        !            30:    if it is in the format described here.  Other formats may
        !            31:    be designed, with other code numbers.
        !            32: 
        !            33:    The segment contains many objects which point at each other.
        !            34:    The pointers are offsets in bytes from the beginning of the segment.
        !            35:    Thus, each segment can be loaded into core and its pointers relocated
        !            36:    to make valid in-core pointers.
        !            37: 
        !            38:    All the data objects in the segment can be found indirectly from
        !            39:    one of them, the root object, of type `struct symbol_root'.
        !            40:    It appears at the beginning of the segment.
        !            41: 
        !            42:    The total size of the segment, in bytes, appears as the `length'
        !            43:    field of this object.  This size includes the size of the
        !            44:    root object.
        !            45: 
        !            46:    All the object data types are defined here to contain pointer types
        !            47:    appropriate for in-core use on a relocated symbol segment.
        !            48:    Casts to and from type int are required for working with
        !            49:    unrelocated symbol segments such as are found in the file.
        !            50: 
        !            51:    The ldsymaddr word is filled in by the loader to contain
        !            52:    the offset (in bytes) within the ld symbol table
        !            53:    of the first nonglobal symbol from this compilation.
        !            54:    This makes it possible to match those symbols
        !            55:    (which contain line number information) reliably with
        !            56:    the segment they go with.
        !            57: 
        !            58:    Core addresses within the program that appear in the symbol segment
        !            59:    are not relocated by the loader.  They are inserted by the assembler
        !            60:    and apply to addresses as output by the assembler, so GDB must
        !            61:    relocate them when it loads the symbol segment.  It gets the information
        !            62:    on how to relocate from the textrel, datarel, bssrel, databeg and bssbeg
        !            63:    words of the root object.
        !            64: 
        !            65:    The words textrel, datarel and bssrel
        !            66:    are filled in by ld with the amounts to relocate within-the-file
        !            67:    text, data and bss addresses by; databeg and bssbeg can be
        !            68:    used to tell which kind of relocation an address needs.  */
        !            69: 
        !            70: enum language {language_c};
        !            71: 
        !            72: /*
        !            73:  * All symbol roots must have as their first two fields format and length
        !            74:  * fields.  The total length of the symbol root must be a multiple of
        !            75:  * sizeof(long) and any padding must be zeroed.
        !            76:  */
        !            77: struct symbol_root_header
        !            78: {
        !            79:   int format;  /* type of symbol segment */
        !            80:   int length;  /* # bytes in this symbol segment, rounded to sizeof(long) */
        !            81: };
        !            82: 
        !            83: /*
        !            84:  * Constants for symbol root format fields
        !            85:  */
        !            86: #define SYMBOL_ROOT_FORMAT     1
        !            87: #define INDIRECT_ROOT_FORMAT   1002
        !            88: #define COMMON_ROOT_FORMAT     1003
        !            89: #define SHLIB_ROOT_FORMAT      1004
        !            90: #define ALIAS_ROOT_FORMAT      1005
        !            91: #define MACH_ROOT_FORMAT               2001
        !            92: #define MACH_INDIRECT_ROOT_FORMAT      2002
        !            93: #define MACH_SHLIB_ROOT_FORMAT         2004
        !            94: 
        !            95: 
        !            96: struct symbol_root
        !            97: {
        !            98:   int format;                  /* SYMBOL_ROOT_FORMAT */
        !            99:   int length;                  /* # bytes in this symbol segment */
        !           100:   int ldsymoff;                        /* Offset in ld symtab of this file's syms */
        !           101:   int textrel;                 /* Relocation for text addresses */
        !           102:   int datarel;                 /* Relocation for data addresses */
        !           103:   int bssrel;                  /* Relocation for bss addresses */
        !           104:   char *filename;              /* Name of main source file compiled */
        !           105:   char *filedir;               /* Name of directory it was reached from */
        !           106:   struct blockvector *blockvector; /* Vector of all symbol-naming blocks */
        !           107:   struct typevector *typevector; /* Vector of all data types */
        !           108:   enum language language;      /* Code identifying the language used */
        !           109:   char *version;               /* Version info.  Not fully specified */
        !           110:   char *compilation;           /* Compilation info.  Not fully specified */
        !           111:   int databeg;                 /* Address within the file of data start */
        !           112:   int bssbeg;                  /* Address within the file of bss start */
        !           113:   struct sourcevector *sourcevector; /* Vector of line-number info */
        !           114: };
        !           115: 
        !           116: struct mach_root
        !           117: {
        !           118:   int format;                  /* MACH_ROOT_FORMAT */
        !           119:   int length;                  /* # bytes in this symbol segment */
        !           120:   int ldsymoff;                        /* Offset in ld symtab of this file's syms */
        !           121:   struct loadmap *loadmap;     /* load map of the relocatable object */
        !           122:   char *filename;              /* Name of main source file compiled */
        !           123:   char *filedir;               /* Name of directory it was reached from */
        !           124:   struct blockvector *blockvector; /* Vector of all symbol-naming blocks */
        !           125:   struct typevector *typevector; /* Vector of all data types */
        !           126:   enum language language;      /* Code identifying the language used */
        !           127:   char *version;               /* Version info.  Not fully specified */
        !           128:   char *compilation;           /* Compilation info.  Not fully specified */
        !           129:   struct sourcevector *sourcevector; /* Vector of line-number info */
        !           130: };
        !           131: 
        !           132: /*
        !           133:  * Indirect symbol root format.  Written by ld when -g is used (the default).
        !           134:  * This is for lazy evaluation of the -gg symbol segments.
        !           135:  */
        !           136: struct indirect_root {
        !           137:   int format;          /* INDIRECT_ROOT_FORMAT */
        !           138:   int length;          /* length of this struct, rounded to sizeof(long) */
        !           139:   int ldsymoff;                /* Offset in ld symtab of this file's syms */
        !           140:   int textrel;         /* Relocation for text addresses */
        !           141:   int datarel;         /* Relocation for data addresses */
        !           142:   int bssrel;          /* Relocation for bss addresses */
        !           143:   int textsize;                /* text size */
        !           144:   int datasize;                /* data size */
        !           145:   int bsssize;         /* bss size */
        !           146:   int mtime;           /* last modified time, as returned by stat(2) */
        !           147:   int fileoffset;      /* Offset in file that contains symbol_root */
        !           148:   char filename[1];    /* variable length file name, zero padded */
        !           149: };
        !           150: 
        !           151: /*
        !           152:  * Mach indirect symbol root format.  Written by ld when -g is used (the
        !           153:  * default).  This is for lazy evaluation of the -gg symbol segments.
        !           154:  */
        !           155: struct mach_indirect_root {
        !           156:   int format;          /* MACH_INDIRECT_ROOT_FORMAT */
        !           157:   int length;          /* length of this struct, rounded to sizeof(long) */
        !           158:   int ldsymoff;                /* Offset in ld symtab of this file's syms */
        !           159:   struct loadmap *loadmap; /* load map of the relocatable object */
        !           160:   int mtime;           /* last modified time, as returned by stat(2) */
        !           161:   int fileoffset;      /* Offset in relocatable file that contains the 
        !           162:                           mach_root */
        !           163:   char filename[1];    /* variable length file name, zero padded */
        !           164: };
        !           165: 
        !           166: /*
        !           167:  * common symbol root format.  For each common symbol that the link editor
        !           168:  * defines the storage for that symbol name is recorded in here.
        !           169:  */
        !           170: struct common_root {
        !           171:   int format;          /* COMMON_SYM_FORMAT */
        !           172:   int length;          /* length of this struct, rounded to sizeof(long) */
        !           173:   int nsyms;           /* the number of strings in the data[] field for the
        !           174:                           common symbols names of this file */
        !           175:   char data[1];                
        !           176:   /* Data looks like the following:
        !           177:     - Null terminated string for the filename.
        !           178:        - Null terminated stings for syms.
        !           179:        ...
        !           180:     - zero padded to round to sizeof(long)
        !           181:    */
        !           182: };
        !           183:  
        !           184: /*
        !           185:  * shlib_root: Written by ld for target shared library output.  This has two
        !           186:  * fields for each of the data segment fields. The data segments of .o files
        !           187:  * that go into target shared libraries have all their static data first in
        !           188:  * the data segment followed by all the global data.  When it is loaded into
        !           189:  * a target shared library the global data from all the .o files is placed
        !           190:  * first in the data segment then all of the static data.  So this information
        !           191:  * is reflected in the {global,static}datarel and the {global,static}databeg
        !           192:  * fields.
        !           193:  *
        !           194:  * After one of these has been written for each object in the shared library
        !           195:  * then the symbol root from each object is written into the shared library.
        !           196:  */
        !           197: struct shlib_root {
        !           198:   int format;          /* SHLIB_ROOT_FORMAT */
        !           199:   int length;          /* length of this struct, rounded to sizeof(long) */
        !           200:   int ldsymoff;                /* Offset in ld symtab of this file's syms */
        !           201:   int textrel;         /* Relocation for text addresses */
        !           202:   int globaldatarel;   /* Relocation for global data addresses */
        !           203:   int staticdatarel;   /* Relocation for static data addresses */
        !           204:   int globaldatabeg;   /* Address of the global data start */
        !           205:   int staticdatabeg;   /* Address of the static data start */
        !           206:   int globaldatasize;  /* global data size */
        !           207:   int staticdatasize;  /* static data size */
        !           208:   int symreloffset;    /* relitive offset, from the first SYMBOL_ROOT_FORMAT
        !           209:                           of the symbol root for this file */
        !           210:   char filename[1];    /* variable length file name, zero padded */
        !           211: };
        !           212: 
        !           213: struct mach_shlib_root {
        !           214:   int format;          /* MACH_SHLIB_ROOT_FORMAT */
        !           215:   int length;          /* length of this struct, rounded to sizeof(long) */
        !           216:   int ldsymoff;                /* Offset in ld symtab of this file's syms */
        !           217:   struct loadmap *loadmap; /* load map of the relocatable object */
        !           218:   int symreloffset;    /* relitive offset, from the first SYMBOL_ROOT_FORMAT
        !           219:                           of the symbol root for this file */
        !           220:   char filename[1];    /* variable length file name, zero padded */
        !           221: };
        !           222: 
        !           223: /*
        !           224:  * This format is used when the link-editor alias option -a original:alias
        !           225:  * is used when producing an output file.  This option changes symbols in
        !           226:  * the .o file from 'original' to 'alias' in the a.out file.
        !           227:  */
        !           228: struct alias_root {
        !           229:   int format;          /* ALIAS_SYM_FORMAT */
        !           230:   int length;          /* length of this struct, rounded to sizeof(long) */
        !           231:   int naliases;                /* number of pairs of aliased symbols */
        !           232:   char data[1];                
        !           233:   /* Data looks like the following:
        !           234:        - Pairs of:
        !           235:            - Null terminated string for the original symbol
        !           236:            - Null terminated string for the aliased symbol
        !           237:        - zero padded to round to sizeof(long)
        !           238:    */
        !           239: };
        !           240: 
        !           241: /*
        !           242:  * The load map describes where the parts the relocatable object have been
        !           243:  * loaded in the executable.  The enitre address space of the relocatable
        !           244:  * is to be covered by all the map entries.  There may be multiple map entries
        !           245:  * for a single section or one map entry for multiple sections.  This allows
        !           246:  * the link editor to scatter load a section based on information that improves
        !           247:  * performance by increasing the locality of reference.
        !           248:  */
        !           249: struct loadmap
        !           250: {
        !           251:   /* Number of maps in the list.  */
        !           252:   int nmaps;
        !           253:   /* The maps themselves.  */
        !           254:   struct map *map[1];
        !           255: };
        !           256: struct map
        !           257: {
        !           258:   /* The starting address in the relocatable object and size of part of the
        !           259:      object file. */
        !           260:   int reladdr, size;
        !           261:   /* The address the loader loaded this part of the object file at */
        !           262:   int ldaddr;  
        !           263: };
        !           264: 
        !           265: 
        !           266: /* All data types of symbols in the compiled program
        !           267:    are represented by `struct type' objects.
        !           268:    All of these objects are pointed to by the typevector.
        !           269:    The type vector may have empty slots that contain zero.  */
        !           270: 
        !           271: struct typevector
        !           272: {
        !           273:   int length;                  /* Number of types described */
        !           274:   struct type *type[1];
        !           275: };
        !           276: 
        !           277: /* Different kinds of data types are distinguished by the `code' field.  */
        !           278: 
        !           279: enum type_code
        !           280: {
        !           281:   TYPE_CODE_UNDEF,             /* Not used; catches errors */
        !           282:   TYPE_CODE_PTR,               /* Pointer type */
        !           283:   TYPE_CODE_ARRAY,             /* Array type, lower bound zero */
        !           284:   TYPE_CODE_STRUCT,            /* C struct or Pascal record */
        !           285:   TYPE_CODE_UNION,             /* C union or Pascal variant part */
        !           286:   TYPE_CODE_ENUM,              /* Enumeration type */
        !           287:   TYPE_CODE_FUNC,              /* Function type */
        !           288:   TYPE_CODE_INT,               /* Integer type */
        !           289:   TYPE_CODE_FLT,               /* Floating type */
        !           290:   TYPE_CODE_VOID,              /* Void type (values zero length) */
        !           291:   TYPE_CODE_SET,               /* Pascal sets */
        !           292:   TYPE_CODE_RANGE,             /* Range (integers within spec'd bounds) */
        !           293:   TYPE_CODE_PASCAL_ARRAY,      /* Array with explicit type of index */
        !           294: };
        !           295: 
        !           296: /* This appears in a type's flags word for an unsigned integer type.  */
        !           297: #define TYPE_FLAG_UNSIGNED 1
        !           298: 
        !           299: /* Other flag bits are used with GDB.  */
        !           300: 
        !           301: struct type
        !           302: {
        !           303:   /* Code for kind of type */
        !           304:   enum type_code code;
        !           305:   /* Name of this type, or zero if none.
        !           306:      This is used for printing only.
        !           307:      Type names specified as input are defined by symbols.  */
        !           308:   char *name;
        !           309:   /* Length in bytes of storage for a value of this type */
        !           310:   int length;
        !           311:   /* For a pointer type, describes the type of object pointed to.
        !           312:      For an array type, describes the type of the elements.
        !           313:      For a function type, describes the type of the value.
        !           314:      Unused otherwise.  */
        !           315:   struct type *target_type;
        !           316:   /* Type that is a pointer to this type.
        !           317:      Zero if no such pointer-to type is known yet.
        !           318:      The debugger may add the address of such a type
        !           319:      if it has to construct one later.  */ 
        !           320:   struct type *pointer_type;
        !           321:   /* Type that is a function returning this type.
        !           322:      Zero if no such function type is known here.
        !           323:      The debugger may add the address of such a type
        !           324:      if it has to construct one later.  */
        !           325:   struct type *function_type;
        !           326:   /* Flags about this type.  */
        !           327:   short flags;
        !           328:   /* Number of fields described for this type */
        !           329:   short nfields;
        !           330:   /* For structure and union types, a description of each field.
        !           331:      For set and pascal array types, there is one "field",
        !           332:      whose type is the domain type of the set or array.
        !           333:      For range types, there are two "fields",
        !           334:      the minimum and maximum values (both inclusive).
        !           335:      For enum types, each possible value is described by one "field".
        !           336:      For range types, there are two "fields", that record constant values
        !           337:      (inclusive) for the minimum and maximum.
        !           338: 
        !           339:      Using a pointer to a separate array of fields
        !           340:      allows all types to have the same size, which is useful
        !           341:      because we can allocate the space for a type before
        !           342:      we know what to put in it.  */
        !           343:   struct field
        !           344:     {
        !           345:       /* Position of this field, counting in bits from start of
        !           346:         containing structure.  For a function type, this is the
        !           347:         position in the argument list of this argument.
        !           348:         For a range bound or enum value, this is the value itself.  */
        !           349:       int bitpos;
        !           350:       /* Size of this field, in bits, or zero if not packed.
        !           351:         For an unpacked field, the field's type's length
        !           352:         says how many bytes the field occupies.  */
        !           353:       int bitsize;
        !           354:       /* In a struct or enum type, type of this field.
        !           355:         In a function type, type of this argument.
        !           356:         In an array type, the domain-type of the array.  */
        !           357:       struct type *type;
        !           358:       /* Name of field, value or argument.
        !           359:         Zero for range bounds and array domains.  */
        !           360:       char *name;
        !           361:     } *fields;
        !           362: };
        !           363: 
        !           364: /* All of the name-scope contours of the program
        !           365:    are represented by `struct block' objects.
        !           366:    All of these objects are pointed to by the blockvector.
        !           367: 
        !           368:    Each block represents one name scope.
        !           369:    Each lexical context has its own block.
        !           370: 
        !           371:    The first two blocks in the blockvector are special.
        !           372:    The first one contains all the symbols defined in this compilation
        !           373:    whose scope is the entire program linked together.
        !           374:    The second one contains all the symbols whose scope is the
        !           375:    entire compilation excluding other separate compilations.
        !           376:    In C, these correspond to global symbols and static symbols.
        !           377: 
        !           378:    Each block records a range of core addresses for the code that
        !           379:    is in the scope of the block.  The first two special blocks
        !           380:    give, for the range of code, the entire range of code produced
        !           381:    by the compilation that the symbol segment belongs to.
        !           382: 
        !           383:    The blocks appear in the blockvector
        !           384:    in order of increasing starting-address,
        !           385:    and, within that, in order of decreasing ending-address.
        !           386: 
        !           387:    This implies that within the body of one function
        !           388:    the blocks appear in the order of a depth-first tree walk.  */
        !           389: 
        !           390: struct blockvector
        !           391: {
        !           392:   /* Number of blocks in the list.  */
        !           393:   int nblocks;
        !           394:   /* The blocks themselves.  */
        !           395:   struct block *block[1];
        !           396: };
        !           397: 
        !           398: struct block
        !           399: {
        !           400:   /* Addresses in the executable code that are in this block.
        !           401:      Note: in an unrelocated symbol segment in a file,
        !           402:      these are always zero.  They can be filled in from the
        !           403:      N_LBRAC and N_RBRAC symbols in the loader symbol table.  */
        !           404:   int startaddr, endaddr;
        !           405:   /* The symbol that names this block,
        !           406:      if the block is the body of a function;
        !           407:      otherwise, zero.
        !           408:      Note: In an unrelocated symbol segment in an object file,
        !           409:      this field may be zero even when the block has a name.
        !           410:      That is because the block is output before the name
        !           411:      (since the name resides in a higher block).
        !           412:      Since the symbol does point to the block (as its value),
        !           413:      it is possible to find the block and set its name properly.  */
        !           414:   struct symbol *function;
        !           415:   /* The `struct block' for the containing block, or 0 if none.  */
        !           416:   /* Note that in an unrelocated symbol segment in an object file
        !           417:      this pointer may be zero when the correct value should be
        !           418:      the second special block (for symbols whose scope is one compilation).
        !           419:      This is because the compiler ouptuts the special blocks at the
        !           420:      very end, after the other blocks.   */
        !           421:   struct block *superblock;
        !           422:   /* Number of local symbols.  */
        !           423:   int nsyms;
        !           424:   /* The symbols.  */
        !           425:   struct symbol *sym[1];
        !           426: };
        !           427: 
        !           428: /* Represent one symbol name; a variable, constant, function or typedef.  */
        !           429: 
        !           430: /* Different name spaces for symbols.  Looking up a symbol specifies
        !           431:    a namespace and ignores symbol definitions in other name spaces.
        !           432: 
        !           433:    VAR_NAMESPACE is the usual namespace.
        !           434:    In C, this contains variables, function names, typedef names
        !           435:    and enum type values.
        !           436: 
        !           437:    STRUCT_NAMESPACE is used in C to hold struct, union and enum type names.
        !           438:    Thus, if `struct foo' is used in a C program,
        !           439:    it produces a symbol named `foo' in the STRUCT_NAMESPACE.
        !           440: 
        !           441:    LABEL_NAMESPACE may be used for names of labels (for gotos);
        !           442:    currently it is not used and labels are not recorded at all.  */
        !           443: 
        !           444: /* For a non-global symbol allocated statically,
        !           445:    the correct core address cannot be determined by the compiler.
        !           446:    The compiler puts an index number into the symbol's value field.
        !           447:    This index number can be matched with the "desc" field of
        !           448:    an entry in the loader symbol table.  */
        !           449: 
        !           450: enum namespace
        !           451: {
        !           452:   UNDEF_NAMESPACE, VAR_NAMESPACE, STRUCT_NAMESPACE, LABEL_NAMESPACE,
        !           453: };
        !           454: 
        !           455: /* An address-class says where to find the value of the symbol in core.  */
        !           456: 
        !           457: enum address_class
        !           458: {
        !           459:   LOC_UNDEF,           /* Not used; catches errors */
        !           460:   LOC_CONST,           /* Value is constant int */
        !           461:   LOC_STATIC,          /* Value is at fixed address */
        !           462:   LOC_REGISTER,                /* Value is in register */
        !           463:   LOC_ARG,             /* Value is at spec'd position in arglist */
        !           464:   LOC_LOCAL,           /* Value is at spec'd pos in stack frame */
        !           465:   LOC_TYPEDEF,         /* Value not used; definition in SYMBOL_TYPE
        !           466:                           Symbols in the namespace STRUCT_NAMESPACE
        !           467:                           all have this class.  */
        !           468:   LOC_LABEL,           /* Value is address in the code */
        !           469:   LOC_BLOCK,           /* Value is address of a `struct block'.
        !           470:                           Function names have this class.  */
        !           471:   LOC_EXTERNAL,                /* Value is at address not in this compilation.
        !           472:                           This is used for .comm symbols
        !           473:                           and for extern symbols within functions.
        !           474:                           Inside GDB, this is changed to LOC_STATIC once the
        !           475:                           real address is obtained from a loader symbol.  */
        !           476:   LOC_CONST_BYTES      /* Value is a constant byte-sequence.   */
        !           477: };
        !           478: 
        !           479: struct symbol
        !           480: {
        !           481:   /* Symbol name */
        !           482:   char *name;
        !           483:   /* Name space code.  */
        !           484:   enum namespace namespace;
        !           485:   /* Address class */
        !           486:   enum address_class class;
        !           487:   /* Data type of value */
        !           488:   struct type *type;
        !           489:   /* constant value, or address if static, or register number,
        !           490:      or offset in arguments, or offset in stack frame.  */
        !           491:   union
        !           492:     {
        !           493:       long value;
        !           494:       struct block *block;      /* for LOC_BLOCK */
        !           495:       char *bytes;             /* for LOC_CONST_BYTES */
        !           496:     }
        !           497:   value;
        !           498: };
        !           499: 
        !           500: /* Source-file information.
        !           501:    This describes the relation between source files and line numbers
        !           502:    and addresses in the program text.  */
        !           503: 
        !           504: struct sourcevector
        !           505: {
        !           506:   int length;                  /* Number of source files described */
        !           507:   struct source *source[1];    /* Descriptions of the files */
        !           508: };
        !           509: 
        !           510: /* Each item is either minus a line number, or a program counter.
        !           511:    If it represents a line number, that is the line described by the next
        !           512:    program counter value.  If it is positive, it is the program
        !           513:    counter at which the code for the next line starts.
        !           514: 
        !           515:    Consecutive lines can be recorded by program counter entries
        !           516:    with no line number entries between them.  Line number entries
        !           517:    are used when there are lines to skip with no code on them.
        !           518:    This is to make the table shorter.  */
        !           519: 
        !           520: struct linetable
        !           521:   {
        !           522:     int nitems;
        !           523:     int item[1];
        !           524:   };
        !           525: 
        !           526: /* All the information on one source file.  */
        !           527: 
        !           528: struct source
        !           529: {
        !           530:   char *name;                  /* Name of file */
        !           531:   struct linetable contents;
        !           532: };

unix.superglobalmegacorp.com

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