Annotation of cci/usr/src/usr.bin/cdb/transBsd/sym.h, revision 1.1

1.1     ! root        1: /* $Header: sym.h,v 1.1 86/03/24 16:17:05 rcs Exp $ */
        !             2: 
        !             3: /* (C) Copyright 1984 by Third Eye Software, Inc.
        !             4:  *
        !             5:  * Third Eye Software, Inc. grants reproduction and use rights to
        !             6:  * all parties, PROVIDED that this comment is maintained in the copy.
        !             7:  *
        !             8:  * Third Eye makes no claims about the applicability of this
        !             9:  * symbol table to a particular use.
        !            10:  */
        !            11: 
        !            12: /* 
        !            13:  * This file contains the definition of the Third Eye Symbol Table.
        !            14:  *
        !            15:  * Symbols are assumed to be in 'encounter order' - i.e. the order that
        !            16:  * the things they represent were encountered by the compiler/assembler/loader.
        !            17:  * EXCEPT for globals! These are assumed to be bunched together,
        !            18:  * probably right after the last 'normal' symbol.  Globals ARE sorted
        !            19:  * in ascending order.
        !            20:  *
        !            21:  * -----------------------------------------------------------------
        !            22:  * A brief word about Third Eye naming/use conventions:
        !            23:  *
        !            24:  * All arrays and index's are 0 based.
        !            25:  * All "ifooMax" values are the highest legal value PLUS ONE. This makes
        !            26:  * them good for allocating arrays, etc. All checks are "ifoo < ifooMax".
        !            27:  *
        !            28:  * "isym"      Index into the SYMbol table.
        !            29:  * "ipd"       Index into the Procedure Descriptor array.
        !            30:  * "ifd"       Index into the File Descriptor array.
        !            31:  * "iss"       Index into String Space.
        !            32:  * "cb"                Count of Bytes.
        !            33:  * "rgPd"      array whose domain is "0..ipdMax-1" and RanGe is PDR.
        !            34:  * "rgFd"      array whose domain is "0..ifdMax-1" and RanGe is FDR.
        !            35:  */
        !            36: 
        !            37: #ifndef int1
        !            38: #define int1   char
        !            39: #define uint1  unsigned char
        !            40: #define int2   short
        !            41: #define uint2  unsigned short
        !            42: #define int4   long
        !            43: #define uint4  unsigned long
        !            44: #define bits   unsigned int
        !            45: #endif
        !            46: 
        !            47: /* 
        !            48:  * HDR structure.
        !            49:  * As long as all the pointers are set correctly,
        !            50:  * we don't care WHAT order the various sections come out in!
        !            51:  *
        !            52:  * A file produced solely for the use of CDB will probably NOT have
        !            53:  * any instructions or data areas in it, as these are available
        !            54:  * in the original.
        !            55:  */
        !            56: 
        !            57: typedef struct HDS {
        !            58:        int2    magic;          /* magic numer as defined below */
        !            59:        int2    vstamp;         /* version stamp */
        !            60:        uint4   cbText;         /* text size in bytes, padded to FW boundary */
        !            61:        uint4   cbData;         /* initialized data     "  "            */
        !            62:        uint4   cbBss;          /* uninitialized data   "  "            */
        !            63:        uint4   entrypoint;
        !            64: 
        !            65:        int4    ipdMax;         /* number of procedures */
        !            66:        uint4   cbPdOffset;     /* offset to procedure array */
        !            67:        int4    ifdMax;         /* number of files */
        !            68:        uint4   cbFdOffset;     /* offset to file array */
        !            69:        int4    ilineMax;       /* number of line numbers (0 if none) */
        !            70:        uint4   cbLineOffset;   /* offset to start of LINE's*/
        !            71:        int4    issMax;         /* max index into string space */
        !            72:        uint4   cbSsOffset;     /* offset to start of string space */
        !            73:        int4    isymMax;        /* number of symbols */
        !            74:        uint4   cbSymOffset;    /* offset to start of symbols*/
        !            75:        int4    isymGl;         /* lowest isym of a global */
        !            76:        int4    isymGlMax;      /* highest isym of a global + 1 */
        !            77:        int4    iauxMax;        /* number of auxillary symbols */
        !            78:        uint4   cbAuxOffset;    /* offset to start of auxillary symbols*/
        !            79:        int4    ijokeDay;       /* index to joke of the day -
        !            80:                                 * if (ijokeDay == ijokeNil) then
        !            81:                                 *   ****'em if they can't take a joke.
        !            82:                                 */
        !            83:        } HDRR, *pHDRR; 
        !            84: #define cbHDRR sizeof(HDRR)
        !            85: #define hdrNil ((pHDRR)0)
        !            86: #define ijokeNil -1
        !            87: 
        !            88: /* magic number definitions */
        !            89: #define magicNil       -1
        !            90: #define magicLpd       0401            /* lpd (UNIX/RT) */
        !            91: #define magicOverlay   0405            /* overlay */
        !            92: #define magicImpure    0407            /* impure format */
        !            93: #define magicReadOnly  0410            /* read-only text */
        !            94: #define magicSplit     0411            /* separated I&D */
        !            95: #define magicDemand    0413            /* demand load format */
        !            96: #define magicSDemand   0415            /* short format,demand load(MegaTest) */
        !            97: 
        !            98: /*
        !            99:  * The FDR and PDR structures speed mapping of address <-> name.
        !           100:  * They are sorted in ascending memory order and are kept in
        !           101:  * memory by CDB at runtime.
        !           102:  */
        !           103: 
        !           104: /* 
        !           105:  * File Descriptor
        !           106:  *
        !           107:  * There is one of these for EVERY FILE, whether compiled with
        !           108:  * full debugging symbols or not.  The name of a file should be
        !           109:  * the path name given to the compiler.         This allows the user
        !           110:  * to simply specify the names of the directories where the COMPILES
        !           111:  * were done, and we will be able to find their files.
        !           112:  * A field whose comment starts with "R - " indicates that it is a
        !           113:  * runtime field and shoould be set to 0.
        !           114:  */
        !           115: 
        !           116: typedef struct FDS {
        !           117:        ADRT    adr;            /* memory address of beginning of file */
        !           118:        int4    iss;            /* file name (of source, if known) */
        !           119:        int4    isym;           /* beginning of symbols */
        !           120:        int4    iline;          /* file's line symbols */
        !           121:        int2    ipd;            /* start of procedures for this file */
        !           122:        int2    ilnMac;         /* R - number of text lines in file */
        !           123:        uint4   *rgLn;          /* R - the line pointer array (if any) */
        !           124:        bits    fWarned : 1;    /* R - they were warned about age problems */
        !           125:        bits    fEdited : 1;    /* R - edited during debug session */
        !           126:        bits    fNoSource : 1;  /* R - we couldn't find the source file */
        !           127:        bits    reserved : 12; /* reserved for future TES use */
        !           128:        } FDR, *pFDR;
        !           129: #define cbFDR sizeof(FDR)
        !           130: #define fdNil ((pFDR)0)
        !           131: 
        !           132: #define ifdNil -1
        !           133: #define ifdTemp 0      /* element 0 of rgFd is ALWAYS reserved for runtime */
        !           134: #define ilnNil -1
        !           135: 
        !           136: 
        !           137: /* 
        !           138:  * Procedure Descriptor
        !           139:  *
        !           140:  * There is one of these for EVERY TEXT LABEL.
        !           141:  * If a procedure is in a file with full symbols, then isym
        !           142:  * will point to the PROC symbols, else it will point to the
        !           143:  * global symbol for the label.
        !           144:  */
        !           145: 
        !           146: typedef struct PDS {
        !           147:        ADRT    adr;            /* memory address of beginning of proc */
        !           148:        int4    isym;           /* beginning of symbols */
        !           149:        int4    iline;          /* proc's line symbols */
        !           150:        } PDR, *pPDR;
        !           151: #define cbPDR sizeof(PDR)
        !           152: #define ipdNil -1
        !           153: 
        !           154: 
        !           155: /*
        !           156:  * Line Numbers
        !           157:  *
        !           158:  * Line Numbers are segregated from the normal symbols because they
        !           159:  * are [1] smaller (4 bytes vs 12) , [2] are of no interest to your
        !           160:  * average loader, and [3] are never needed in the middle of normal
        !           161:  * scanning and therefore slow things down.
        !           162:  *
        !           163:  * By definition, the first LINER for any given procedure will have
        !           164:  * a delta address (dadr) of 0.  This conveniently allows deduction
        !           165:  * of start-of-proc when building the PDR array.
        !           166:  */
        !           167: 
        !           168: typedef struct LINES {
        !           169:        uint2   iln;    /* line number, file relative, starting at 1 */
        !           170:        uint2   dadr;   /* delta address from start of procedure */
        !           171:        } LINER, *pLINER;
        !           172: #define lineNil ((pLINER)0)
        !           173: #define cbLINER sizeof(LINER)
        !           174: #define ilineNil       -1L
        !           175: 
        !           176: 
        !           177: /* The following are value definitions for the fields in the SYMR */
        !           178: 
        !           179: /*
        !           180:  * Storage Classes
        !           181:  */
        !           182: 
        !           183: #define scNil          0
        !           184: #define scText         1       /* text symbol */
        !           185: #define scData         2       /* initialized data symbol */
        !           186: #define scBss          3       /* un-initialized data symbol */
        !           187: #define scRegister     4       /* value of symbol is register number */
        !           188: #define scAbs          5       /* value of symbol is absolute */
        !           189: #define scUndefined    6       /* who knows? */
        !           190: #define scCdbLocal     7       /* variable's value is IN se->va.?? */
        !           191: #define scBits         8       /* this is a bit field */
        !           192: #define scCdbSystem    9       /* variable's value is IN CDB's address space */
        !           193: #define scRegImage     10      /* register value saved on stack */
        !           194: #define scInfo         11      /* symbol contains debugger information */
        !           195: #define scUserStruct   12      /* address in struct user for current process */
        !           196: #define scMax          16
        !           197: 
        !           198: 
        !           199: /*
        !           200:  *   Symbol Types
        !           201:  */
        !           202: 
        !           203: #define stNil          0       /* Nuthin' special */
        !           204: #define stGlobal       1       /* external symbol */
        !           205: #define stStatic       2       /* static */
        !           206: #define stParam                3       /* procedure argument */
        !           207: #define stLocal                4       /* local variable */
        !           208: #define stLabel                5       /* label */
        !           209: #define stProc         6       /*     "      "  Procedure */
        !           210: #define stBlock                7       /* beginnning of block */
        !           211: #define stEnd          8       /* end (of anything) */
        !           212: #define stMember       9       /* member (of anything  - struct/union/enum */
        !           213: #define stTypedef      10      /* type definition */
        !           214: #define stFile         11      /* file name */
        !           215: #define stRegReloc     12      /* register relocation */
        !           216: #define stForward      13      /* forwarding address */
        !           217:     /* Psuedo-symbols - internal to debugger */
        !           218: #define stStr          60      /* string */
        !           219: #define stNumber       61      /* pure number (ie. 4 NOR 2+2) */
        !           220: #define stExpr         62      /* 2+2 vs. 4 */
        !           221: #define stType         63      /* post-coersion SER */
        !           222: #define stMax          64
        !           223: 
        !           224: 
        !           225: /*
        !           226:  * The Symbol Structure                (GFW, to those who Know!)
        !           227:  */
        !           228: 
        !           229: typedef struct SYMS {
        !           230:        int4    iss;            /* index into String Space of name */
        !           231:        int4    value;          /* value of symbol */
        !           232:        bits    st : 6; /* symbol type */
        !           233:        bits    sc  : 5;        /* storage class - text, data, etc */
        !           234:        bits    ext : 1;        /* information is globally available */
        !           235: #ifdef INT_16
        !           236:        bits    unused : 4;
        !           237:        bits    index : 16;     /* index into sym/aux table */
        !           238: #else
        !           239:        bits    index : 20;     /* index into sym/aux table */
        !           240: #endif INT_16
        !           241:        } SYMR, *pSYMR;
        !           242: #define symNil ((pSYMR)0)
        !           243: #define cbSYMR sizeof(SYMR)
        !           244: #define isymNil 0
        !           245: #define issNil 0
        !           246: 
        !           247: 
        !           248: /* A U X I L L A R Y   T Y P E  I N F O R M A T I O N */
        !           249: 
        !           250: /* definitions for fields in TIR */
        !           251: 
        !           252: /* type qualifiers for ti.tq0 -> ti.(itqMax-1) */
        !           253: #define tqNil  0       /* bt is what you see */
        !           254: #define tqPtr  1       /* pointer */
        !           255: #define tqProc 2       /* procedure */
        !           256: #define tqArray 3      /* duh */
        !           257: #define tqFar  4       /* longer addressing - 8086/8 land */
        !           258: #define tqMax  8
        !           259: 
        !           260: /* basic types as seen in ti.bt */
        !           261: #define btNil          0       /* undefined */
        !           262: #define btAdr          1       /* address - integer same size as pointer */
        !           263: #define btChar         2       /* character */
        !           264: #define btUChar                3       /* unsigned character */
        !           265: #define btShort                4       /* short */
        !           266: #define btUShort       5       /* unsigned short */
        !           267: #define btInt          6       /* int */
        !           268: #define btUInt         7       /* unsigned int */
        !           269: #define btLong         8       /* long */
        !           270: #define btULong                9       /* unsigned long */
        !           271: #define btFloat                10      /* float (real) */
        !           272: #define btDouble       11      /* Double (real) */
        !           273: #define btStruct       12      /* Structure (Record) */
        !           274: #define btUnion                13      /* Union (variant) */
        !           275: #define btEnum         14      /* Enumerated */
        !           276: #define btTypedef      15      /* defined via a typedef, isymRef points */
        !           277: #define btLongLong     16      /* E.g. ELXSI 64 bit integers */
        !           278: #define btULongLong    17      /* E.g. ELXSI 64 bit integers */
        !           279: #define        btSet           18      /* pascal type set */
        !           280: #define        btRange         19      /* pascal type range */
        !           281: #define btMax          64
        !           282: 
        !           283: /*
        !           284:  * Type Information Record
        !           285:  */
        !           286: 
        !           287: typedef struct {
        !           288:        bits    reserved : 6;   /* reserved by Third Eye for future use */
        !           289:        bits    continued : 1;  /* indicates additional info in next AUX */
        !           290:        bits    bt  : 6;        /* basic type */
        !           291:        bits    tq5 : 3;
        !           292:        /* ---- 16 bit boundary ---- */
        !           293:        bits    fConstant : 1; /* value IS value, not address */
        !           294:        bits    tq0 : 3;
        !           295:        bits    tq1 : 3;        /* 5 type qualifiers - tqPtr, etc. */
        !           296:        bits    tq2 : 3;
        !           297:        bits    tq3 : 3;
        !           298:        bits    tq4 : 3;
        !           299:        } TIR, *pTIR;
        !           300: #define cbTIR sizeof(TIR)
        !           301: #define tiNil ((pTIR)0)
        !           302: #define itqMax 6
        !           303: 
        !           304: 
        !           305: typedef struct {       /* Dimension bounds */
        !           306:        int2    dnLow;  /* lowest index value */
        !           307:        int2    dnMac;  /* highest value PLUS ONE! (dnMac-dnLow==cElement) */
        !           308:        } DIMR, *pDIMR;
        !           309: #define cbDIMR sizeof(DIMR)
        !           310: #define dimNil ((pDIMR)0)
        !           311: #define idimMax 4      /* maximum number of dimesions */
        !           312: 
        !           313: /*
        !           314:  * Auxillary information occurs only if needed.
        !           315:  * It ALWAYS occurs in this order when present.
        !           316: 
        !           317:            isymMac             used by stProc only
        !           318:            TIR                 type info
        !           319:            TIR                 additional TQ info (if first TIR was not enough)
        !           320:            isymRef             if (bt == btStruct/etc.) OR (bt == btTypedef)
        !           321:            idim0               as many as there are "tqArray"s in TIR
        !           322:            ...
        !           323:            idimMax-1
        !           324:            width in bits       if (bit field), width in bits.
        !           325:  */
        !           326: #define cAuxMax (4 + idimMax)
        !           327: 
        !           328: /* a union of all possible info in the AUX universe */
        !           329: typedef union {
        !           330:        TIR     ti;
        !           331:        DIMR    dim;
        !           332:        int4    isym;
        !           333:        int4    iss;
        !           334:        int4    width;
        !           335:        } AUXU, *pAUXU;
        !           336: #define cbAUXU sizeof(AUXU)
        !           337: #define auxNil ((pAUXU)0)
        !           338: #define iauxNil        0L
        !           339: 
        !           340: /*
        !           341:  * The following table defines the meaning of each SYM field as
        !           342:  * a function of the "st". (scD/B == scData OR scBss)
        !           343:  *
        !           344:  * Note: the value "isymMac" is used by symbols that have the concept
        !           345:  * of enclosing a block of related information.         This value is the
        !           346:  * isym of the first symbol AFTER the End associated with the primary
        !           347:  * symbol. For example if a procedure was at isym==90 and had an
        !           348:  * isymMac==155, the associated end would be at isym==154, and the
        !           349:  * symbol at 155 would probably (although not necessarily) be the
        !           350:  * symbol for the next procedure or file.  This allows rapid skipping over
        !           351:  * internal information of various sorts. "stEnd"s ALWAYS have the
        !           352:  * isym of the primary symbol that started the block.
        !           353:  * 
        !           354: 
        !           355: ST             SC      VALUE           INDEX
        !           356: --------       ------  --------        ------
        !           357: stFile         scText  address         isymMac
        !           358: stLabel                scText  address         ---
        !           359: stGlobal       scD/B   address         iaux
        !           360: stStatic       scD/B   address         iaux
        !           361: stParam                scAbs   offset          iaux
        !           362: stLocal                scAbs   offset          iaux
        !           363: stProc         scText  address         iaux    (isymMac is first AUX)
        !           364: 
        !           365: stMember       scNil   ordinal         ---     (if member of enum)
        !           366: stMember       scNil   byte offset     iaux    (if member of struct/union)
        !           367: stMember       scBits  bit offset      iaux    (bit field spec)
        !           368: 
        !           369: stBlock                scText  address         isymMac (text block)
        !           370: stBlock                scNil   cb              isymMac (struct/union member define)
        !           371: stBlock                scNil   cMembers        isymMac (enum member define)
        !           372: 
        !           373: stEnd          scText  address         isymStart
        !           374: stEnd          scNil   -------         isymStart (struct/union/enum)
        !           375: 
        !           376: stTypedef      scNil   -------         iaux
        !           377: stRegReloc     sc???   value           old register number
        !           378: stForward      sc???   new address     isym to original symbol
        !           379: 
        !           380:  *
        !           381:  */

unix.superglobalmegacorp.com

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