Annotation of researchv10dc/cmd/gcc/symseg.h, revision 1.1

1.1     ! root        1: /* GDB symbol table format definitions.
        !             2:    Copyright (C) 1987, 1988 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU CC.
        !             5: 
        !             6: GNU CC is distributed in the hope that it will be useful,
        !             7: but WITHOUT ANY WARRANTY.  No author or distributor
        !             8: accepts responsibility to anyone for the consequences of using it
        !             9: or for whether it serves any particular purpose or works at all,
        !            10: unless he says so in writing.  Refer to the GNU CC General Public
        !            11: License for full details.
        !            12: 
        !            13: Everyone is granted permission to copy, modify and redistribute
        !            14: GNU CC, but only under the conditions described in the
        !            15: GNU CC General Public License.   A copy of this license is
        !            16: supposed to have been given to you along with GNU CC so you
        !            17: can know your rights and responsibilities.  It should be in a
        !            18: file named COPYING.  Among other things, the copyright notice
        !            19: and this notice must be preserved on all copies.  */
        !            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: struct symbol_root
        !            73: {
        !            74:   int format;                  /* Data format version */
        !            75:   int length;                  /* # bytes in this symbol segment */
        !            76:   int ldsymoff;                        /* Offset in ld symtab of this file's syms */
        !            77:   int textrel;                 /* Relocation for text addresses */
        !            78:   int datarel;                 /* Relocation for data addresses */
        !            79:   int bssrel;                  /* Relocation for bss addresses */
        !            80:   char *filename;              /* Name of main source file compiled */
        !            81:   char *filedir;               /* Name of directory it was reached from */
        !            82:   struct blockvector *blockvector; /* Vector of all symbol-naming blocks */
        !            83:   struct typevector *typevector; /* Vector of all data types */
        !            84:   enum language language;      /* Code identifying the language used */
        !            85:   char *version;               /* Version info.  Not fully specified */
        !            86:   char *compilation;           /* Compilation info.  Not fully specified */
        !            87:   int databeg;                 /* Address within the file of data start */
        !            88:   int bssbeg;                  /* Address within the file of bss start */
        !            89:   struct sourcevector *sourcevector; /* Vector of line-number info */
        !            90: };
        !            91: 
        !            92: /* All data types of symbols in the compiled program
        !            93:    are represented by `struct type' objects.
        !            94:    All of these objects are pointed to by the typevector.
        !            95:    The type vector may have empty slots that contain zero.  */
        !            96: 
        !            97: struct typevector
        !            98: {
        !            99:   int length;                  /* Number of types described */
        !           100:   struct type *type[1];
        !           101: };
        !           102: 
        !           103: /* Different kinds of data types are distinguished by the `code' field.  */
        !           104: 
        !           105: enum type_code
        !           106: {
        !           107:   TYPE_CODE_UNDEF,             /* Not used; catches errors */
        !           108:   TYPE_CODE_PTR,               /* Pointer type */
        !           109:   TYPE_CODE_ARRAY,             /* Array type, lower bound zero */
        !           110:   TYPE_CODE_STRUCT,            /* C struct or Pascal record */
        !           111:   TYPE_CODE_UNION,             /* C union or Pascal variant part */
        !           112:   TYPE_CODE_ENUM,              /* Enumeration type */
        !           113:   TYPE_CODE_FUNC,              /* Function type */
        !           114:   TYPE_CODE_INT,               /* Integer type */
        !           115:   TYPE_CODE_FLT,               /* Floating type */
        !           116:   TYPE_CODE_VOID,              /* Void type (values zero length) */
        !           117:   TYPE_CODE_SET,               /* Pascal sets */
        !           118:   TYPE_CODE_RANGE,             /* Range (integers within spec'd bounds) */
        !           119:   TYPE_CODE_PASCAL_ARRAY,      /* Array with explicit type of index */
        !           120: };
        !           121: 
        !           122: /* This appears in a type's flags word for an unsigned integer type.  */
        !           123: #define TYPE_FLAG_UNSIGNED 1
        !           124: 
        !           125: /* Other flag bits are used with GDB.  */
        !           126: 
        !           127: struct type
        !           128: {
        !           129:   /* Code for kind of type */
        !           130:   enum type_code code;
        !           131:   /* Name of this type, or zero if none.
        !           132:      This is used for printing only.
        !           133:      Type names specified as input are defined by symbols.  */
        !           134:   char *name;
        !           135:   /* Length in bytes of storage for a value of this type */
        !           136:   int length;
        !           137:   /* For a pointer type, describes the type of object pointed to.
        !           138:      For an array type, describes the type of the elements.
        !           139:      For a function type, describes the type of the value.
        !           140:      Unused otherwise.  */
        !           141:   struct type *target_type;
        !           142:   /* Type that is a pointer to this type.
        !           143:      Zero if no such pointer-to type is known yet.
        !           144:      The debugger may add the address of such a type
        !           145:      if it has to construct one later.  */ 
        !           146:   struct type *pointer_type;
        !           147:   /* Type that is a function returning this type.
        !           148:      Zero if no such function type is known here.
        !           149:      The debugger may add the address of such a type
        !           150:      if it has to construct one later.  */
        !           151:   struct type *function_type;
        !           152:   /* Flags about this type.  */
        !           153:   short flags;
        !           154:   /* Number of fields described for this type */
        !           155:   short nfields;
        !           156:   /* For structure and union types, a description of each field.
        !           157:      For set and pascal array types, there is one "field",
        !           158:      whose type is the domain type of the set or array.
        !           159:      For range types, there are two "fields",
        !           160:      the minimum and maximum values (both inclusive).
        !           161:      For enum types, each possible value is described by one "field".
        !           162:      For range types, there are two "fields", that record constant values
        !           163:      (inclusive) for the minimum and maximum.
        !           164: 
        !           165:      Using a pointer to a separate array of fields
        !           166:      allows all types to have the same size, which is useful
        !           167:      because we can allocate the space for a type before
        !           168:      we know what to put in it.  */
        !           169:   struct field
        !           170:     {
        !           171:       /* Position of this field, counting in bits from start of
        !           172:         containing structure.  For a function type, this is the
        !           173:         position in the argument list of this argument.
        !           174:         For a range bound or enum value, this is the value itself.  */
        !           175:       int bitpos;
        !           176:       /* Size of this field, in bits, or zero if not packed.
        !           177:         For an unpacked field, the field's type's length
        !           178:         says how many bytes the field occupies.  */
        !           179:       int bitsize;
        !           180:       /* In a struct or enum type, type of this field.
        !           181:         In a function type, type of this argument.
        !           182:         In an array type, the domain-type of the array.  */
        !           183:       struct type *type;
        !           184:       /* Name of field, value or argument.
        !           185:         Zero for range bounds and array domains.  */
        !           186:       char *name;
        !           187:     } *fields;
        !           188: };
        !           189: 
        !           190: /* All of the name-scope contours of the program
        !           191:    are represented by `struct block' objects.
        !           192:    All of these objects are pointed to by the blockvector.
        !           193: 
        !           194:    Each block represents one name scope.
        !           195:    Each lexical context has its own block.
        !           196: 
        !           197:    The first two blocks in the blockvector are special.
        !           198:    The first one contains all the symbols defined in this compilation
        !           199:    whose scope is the entire program linked together.
        !           200:    The second one contains all the symbols whose scope is the
        !           201:    entire compilation excluding other separate compilations.
        !           202:    In C, these correspond to global symbols and static symbols.
        !           203: 
        !           204:    Each block records a range of core addresses for the code that
        !           205:    is in the scope of the block.  The first two special blocks
        !           206:    give, for the range of code, the entire range of code produced
        !           207:    by the compilation that the symbol segment belongs to.
        !           208: 
        !           209:    The blocks appear in the blockvector
        !           210:    in order of increasing starting-address,
        !           211:    and, within that, in order of decreasing ending-address.
        !           212: 
        !           213:    This implies that within the body of one function
        !           214:    the blocks appear in the order of a depth-first tree walk.  */
        !           215: 
        !           216: struct blockvector
        !           217: {
        !           218:   /* Number of blocks in the list.  */
        !           219:   int nblocks;
        !           220:   /* The blocks themselves.  */
        !           221:   struct block *block[1];
        !           222: };
        !           223: 
        !           224: struct block
        !           225: {
        !           226:   /* Addresses in the executable code that are in this block.
        !           227:      Note: in an unrelocated symbol segment in a file,
        !           228:      these are always zero.  They can be filled in from the
        !           229:      N_LBRAC and N_RBRAC symbols in the loader symbol table.  */
        !           230:   int startaddr, endaddr;
        !           231:   /* The symbol that names this block,
        !           232:      if the block is the body of a function;
        !           233:      otherwise, zero.
        !           234:      Note: In an unrelocated symbol segment in an object file,
        !           235:      this field may be zero even when the block has a name.
        !           236:      That is because the block is output before the name
        !           237:      (since the name resides in a higher block).
        !           238:      Since the symbol does point to the block (as its value),
        !           239:      it is possible to find the block and set its name properly.  */
        !           240:   struct symbol *function;
        !           241:   /* The `struct block' for the containing block, or 0 if none.  */
        !           242:   /* Note that in an unrelocated symbol segment in an object file
        !           243:      this pointer may be zero when the correct value should be
        !           244:      the second special block (for symbols whose scope is one compilation).
        !           245:      This is because the compiler ouptuts the special blocks at the
        !           246:      very end, after the other blocks.   */
        !           247:   struct block *superblock;
        !           248:   /* Number of local symbols.  */
        !           249:   int nsyms;
        !           250:   /* The symbols.  */
        !           251:   struct symbol *sym[1];
        !           252: };
        !           253: 
        !           254: /* Represent one symbol name; a variable, constant, function or typedef.  */
        !           255: 
        !           256: /* Different name spaces for symbols.  Looking up a symbol specifies
        !           257:    a namespace and ignores symbol definitions in other name spaces.
        !           258: 
        !           259:    VAR_NAMESPACE is the usual namespace.
        !           260:    In C, this contains variables, function names, typedef names
        !           261:    and enum type values.
        !           262: 
        !           263:    STRUCT_NAMESPACE is used in C to hold struct, union and enum type names.
        !           264:    Thus, if `struct foo' is used in a C program,
        !           265:    it produces a symbol named `foo' in the STRUCT_NAMESPACE.
        !           266: 
        !           267:    LABEL_NAMESPACE may be used for names of labels (for gotos);
        !           268:    currently it is not used and labels are not recorded at all.  */
        !           269: 
        !           270: /* For a non-global symbol allocated statically,
        !           271:    the correct core address cannot be determined by the compiler.
        !           272:    The compiler puts an index number into the symbol's value field.
        !           273:    This index number can be matched with the "desc" field of
        !           274:    an entry in the loader symbol table.  */
        !           275: 
        !           276: enum namespace
        !           277: {
        !           278:   UNDEF_NAMESPACE, VAR_NAMESPACE, STRUCT_NAMESPACE, LABEL_NAMESPACE,
        !           279: };
        !           280: 
        !           281: /* An address-class says where to find the value of the symbol in core.  */
        !           282: 
        !           283: enum address_class
        !           284: {
        !           285:   LOC_UNDEF,           /* Not used; catches errors */
        !           286:   LOC_CONST,           /* Value is constant int */
        !           287:   LOC_STATIC,          /* Value is at fixed address */
        !           288:   LOC_REGISTER,                /* Value is in register */
        !           289:   LOC_ARG,             /* Value is at spec'd position in arglist */
        !           290:   LOC_LOCAL,           /* Value is at spec'd pos in stack frame */
        !           291:   LOC_TYPEDEF,         /* Value not used; definition in SYMBOL_TYPE
        !           292:                           Symbols in the namespace STRUCT_NAMESPACE
        !           293:                           all have this class.  */
        !           294:   LOC_LABEL,           /* Value is address in the code */
        !           295:   LOC_BLOCK,           /* Value is address of a `struct block'.
        !           296:                           Function names have this class.  */
        !           297:   LOC_EXTERNAL,                /* Value is at address not in this compilation.
        !           298:                           This is used for .comm symbols
        !           299:                           and for extern symbols within functions.
        !           300:                           Inside GDB, this is changed to LOC_STATIC once the
        !           301:                           real address is obtained from a loader symbol.  */
        !           302:   LOC_CONST_BYTES      /* Value is a constant byte-sequence.   */
        !           303: };
        !           304: 
        !           305: struct symbol
        !           306: {
        !           307:   /* Symbol name */
        !           308:   char *name;
        !           309:   /* Name space code.  */
        !           310:   enum namespace namespace;
        !           311:   /* Address class */
        !           312:   enum address_class class;
        !           313:   /* Data type of value */
        !           314:   struct type *type;
        !           315:   /* constant value, or address if static, or register number,
        !           316:      or offset in arguments, or offset in stack frame.  */
        !           317:   union
        !           318:     {
        !           319:       long value;
        !           320:       struct block *block;      /* for LOC_BLOCK */
        !           321:       char *bytes;             /* for LOC_CONST_BYTES */
        !           322:     }
        !           323:   value;
        !           324: };
        !           325: 
        !           326: /* Source-file information.
        !           327:    This describes the relation between source files and line numbers
        !           328:    and addresses in the program text.  */
        !           329: 
        !           330: struct sourcevector
        !           331: {
        !           332:   int length;                  /* Number of source files described */
        !           333:   struct source *source[1];    /* Descriptions of the files */
        !           334: };
        !           335: 
        !           336: /* Line number and address of one line.  */
        !           337:  
        !           338: struct line
        !           339: {
        !           340:   int linenum;
        !           341:   int address;
        !           342: };
        !           343: 
        !           344: /* All the information on one source file.  */
        !           345: 
        !           346: struct source
        !           347: {
        !           348:   char *name;                  /* Name of file */
        !           349:   int nlines;                  /* Number of lines that follow */
        !           350:   struct line lines[1];        /* Information on each line */
        !           351: };

unix.superglobalmegacorp.com

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