Annotation of researchv9/jerq/sgs/as/addr1.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     static char addr1_ID[] = "@(#) addr1.c: 1.6 12/10/83";
                      3:  */
                      4: 
                      5: #include <stdio.h>
                      6: #include <filehdr.h>
                      7: #include <reloc.h>
                      8: #include <syms.h>
                      9: #include <linenum.h>
                     10: #include "systems.h"
                     11: #include "gendefs.h"
                     12: #include "symbols.h"
                     13: #include "codeout.h"
                     14: 
                     15: /*
                     16:  *
                     17:  *     "addr1.c" is a file containing routines for implementing the
                     18:  *     various addressing modes from the intermediate file.  The
                     19:  *     majority of the routines are passed a pointer to a
                     20:  *     character string and a pointer to the code buffer.
                     21:  *     The array "modes" is initialized to contain the addresses
                     22:  *     of the functions that implement the various addressing modes.
                     23:  *     Indexing this array with the addressing mode will give the
                     24:  *     correct routine for implementing that mode.
                     25:  *
                     26:  */
                     27: 
                     28: #define outblock(a,b,c)        fwrite((char *)(a),b,1,c)
                     29: 
                     30: extern char
                     31:        cfile[];
                     32: 
                     33: extern unsigned short
                     34:        line,
                     35:        cline;
                     36: 
                     37: extern short
                     38:        type,
                     39:        transvec,
                     40:        sttop;
                     41: 
                     42: extern int
                     43:        setsym();
                     44: 
                     45: extern long
                     46:        newdot,
                     47:        symbent,
                     48:        gsymbent;
                     49: 
                     50: extern long
                     51:        getindx();
                     52: 
                     53: extern symbol
                     54:        *dot;
                     55: 
                     56: extern FILHDR
                     57:        filhead;
                     58: 
                     59: extern upsymins
                     60:        *lookup();
                     61: 
                     62: extern stent
                     63:        *pop();
                     64: static stent
                     65:        *popptr;
                     66: 
                     67: extern FILE
                     68: #if !ONEPROC
                     69:        *fdstring,
                     70: #endif
                     71:        *fdline,
                     72:        *fdsymb,
                     73:        *fdgsymb;
                     74: 
                     75: symbol *savsym;
                     76: 
                     77: unsigned short
                     78:        lineent;
                     79: 
                     80: short  filedef = NO;
                     81: 
                     82: #if FLEXNAMES
                     83: extern char    *strtab;        /* String table; referenced for symbol  */
                     84:                                /* name to pass to getindx.             */
                     85: #endif
                     86: 
                     87: SYMENT sment;
                     88: 
                     89: AUXENT axent;
                     90: 
                     91: static short
                     92:        dimcnt;
                     93: 
                     94: static LINENO
                     95:        lnent;
                     96: 
                     97: /*ARGSUSED*/
                     98: 
                     99: setmagic(sym,code)
                    100:        symbol *sym;
                    101:        codebuf *code;
                    102: {
                    103:        filhead.f_magic = (short)(code->cvalue);
                    104: }
                    105: 
                    106: setfile(sym,code)
                    107:        upsymins sym;
                    108:        codebuf *code;
                    109: {
                    110:        register char c;
                    111:        register char *auxchar;
                    112:        register short index = 0;
                    113: 
                    114:        filedef = YES;
                    115: 
                    116:        sym = *lookup(".file",INSTALL,USRNAME);
                    117:        define(sym.stp,code);
                    118: 
                    119:        sment.n_numaux = 1;
                    120:        auxchar = ((union auxent *)(&axent))->x_file.x_fname;
                    121: #if ONEPROC
                    122:        while (*auxchar++ = cfile[index++]) ;
                    123: #else
                    124:        while (((c = getc(fdstring)) != '\n') && (index < FILNMLEN)) {
                    125:                *auxchar++ = c;
                    126:                cfile[index++] = c;
                    127:        }
                    128: #endif
                    129:        for ( ; index < FILNMLEN; index++)
                    130:                *auxchar++ = '\0';
                    131: 
                    132:        cfile[index] = '\0';
                    133:        code->cvalue = (long)C_FILE;
                    134:        setscl(NULLSYM,code);
                    135:        endef(NULLSYM,code);
                    136: } /* setfile */
                    137: 
                    138: /*ARGSUSED*/
                    139: 
                    140: newstmt(sym,code)
                    141:        symbol *sym;
                    142:        codebuf *code;
                    143: {
                    144:        line = (unsigned short)(code->cvalue);
                    145:        dot->value = newdot; /* resynchronize */
                    146: } /* newstmt */
                    147: 
                    148: /*
                    149:  *
                    150:  *     "lineno" is a function that creates a line number entry with
                    151:  *     the value of the program counter. A preliminary line number
                    152:  *     entry is created by writing to the file whose descriptor
                    153:  *     appears in "fdline". The preliminary line number entry contains
                    154:  *     the value of the program counter and the line number itself.
                    155:  *
                    156:  */
                    157: 
                    158: lineno(sym,code)
                    159:        register symbol *sym;
                    160:        register codebuf *code;
                    161: {
                    162:        if (sym != NULLSYM)
                    163:                code->cvalue += sym->value;
                    164:        lnent.l_lnno = cline = (unsigned short)(code->cvalue);
                    165:        lnent.l_addr.l_paddr = newdot;
                    166:        outblock(&lnent,LINESZ,fdline);
                    167:        lineent++;
                    168: }
                    169: 
                    170: /*
                    171:  *
                    172:  *     "linenum" and "lineval" work in a pair to implement the two
                    173:  *     operand version of the ".ln" pseudo operation.  This operation
                    174:  *     will generate two intermediate file entries. "linenum"
                    175:  *     evaluates the line number and stores it in the global
                    176:  *     variable "savline". "lineval" evaluates its argument to
                    177:  *     use it as the address for the line number. This address
                    178:  *     and the line number from "savline" are written to the file
                    179:  *     whose descriptor appears in "fdline" as a completed line
                    180:  *     number entry.
                    181:  *
                    182:  */
                    183: 
                    184: linenum(sym,code)
                    185:        register symbol *sym;
                    186:        register codebuf *code;
                    187: {
                    188:        if (sym != NULLSYM)
                    189:                code->cvalue += sym->value;
                    190:        lnent.l_lnno = cline = (unsigned short)(code->cvalue);
                    191: }
                    192: 
                    193: lineval(sym,code)
                    194:        register symbol *sym;
                    195:        register codebuf *code;
                    196: {
                    197:        if (sym != NULLSYM)
                    198:                code->cvalue += sym->value;
                    199:        lnent.l_addr.l_paddr = code->cvalue;
                    200:        outblock(&lnent,LINESZ,fdline);
                    201:        lineent++;
                    202: }
                    203: 
                    204: /*
                    205:  *
                    206:  *     The functions "define", "setval", "settyp", "setscl", "settag",
                    207:  *     "setlno", "setsiz", "setdim1" through "setdim5", "xform", and
                    208:  *     "endef" are all involved in creating the symbol table entries
                    209:  *     that appear in the object file.  The call to "define" will
                    210:  *     initialize the symbol table entry.  The calls to subsequent
                    211:  *     functions will store values into various fields of that entry.
                    212:  *     The call to "endef" will write out the completed symbol table
                    213:  *     entry to an intermediate file.  The symbol table entry will be
                    214:  *     constructed in a structure called "sment".  The auxiliary
                    215:  *     symbol table entry (if necessary) will be constructed in the
                    216:  *     structure "axent".  The completed symbol table entry will be
                    217:  *     written either to the file whose descriptor appears in "fdsymb"
                    218:  *     or the file whose descriptor appears in "fdgsymb".
                    219:  *
                    220:  */
                    221: 
                    222: /*
                    223:  *
                    224:  *     "define" is a function that performs initialization of a symbol
                    225:  *     table entry to be written to the object file.
                    226:  *     The arguments to this function is a pointer to the symbol for
                    227:  *     which the entry is to be created. The symbol name is stored
                    228:  *     into the object file symbol table entry, and the remainder
                    229:  *     of the fields for the entry are set to zero.
                    230:  *
                    231:  */
                    232: 
                    233: /*ARGSUSED*/
                    234: 
                    235: define(sym,code)
                    236:        register symbol *sym;
                    237:        codebuf *code;
                    238: {
                    239:        register short index;
                    240: 
                    241:        savsym = sym;
                    242: #if FLEXNAMES
                    243:        /* Copy the internal symbol table entry for the name to the     */
                    244:        /* structure which will be written to the symbol table file.    */
                    245: 
                    246:        if (sym->_name.tabentry.zeroes == 0)
                    247:        {
                    248:                sment.n_zeroes = 0L;
                    249:                sment.n_offset = sym->_name.tabentry.offset;
                    250:        }
                    251:        else
                    252:        {
                    253: #endif
                    254:                for(index = 0; (index < SYMNMLEN) && (sment.n_name[index] = sym->_name.name[index]); index++)
                    255:                        ;
                    256: 
                    257:                for(; index < SYMNMLEN; index++)
                    258:                        sment.n_name[index] = '\0';
                    259: #if FLEXNAMES
                    260:        }
                    261: #endif
                    262:        sment.n_value = 0L;
                    263:        sment.n_scnum = 0;
                    264:        sment.n_type = 0;
                    265:        sment.n_sclass = 0;
                    266:        sment.n_numaux = 0;
                    267:        axent.x_sym.x_tagndx = 0L;
                    268:        axent.x_sym.x_misc.x_lnsz.x_lnno = 0;
                    269:        axent.x_sym.x_misc.x_lnsz.x_size = 0;
                    270:        for(index = 0; index < DIMNUM; ++index)
                    271:                axent.x_sym.x_fcnary.x_ary.x_dimen[index] = 0;
                    272:        axent.x_sym.x_tvndx = 0;
                    273: #if TRANVEC
                    274:        if (transvec && (sym->styp & TVDEF)) {
                    275:                sment.n_numaux = 1;     /* we can do this since transfer */
                    276:                axent.x_sym.x_tvndx = N_TV;     /* vectors are always */
                    277:                                                /* functions in .def's */
                    278:        }
                    279: #endif
                    280: }
                    281: 
                    282: /*
                    283:  *
                    284:  *     "setval" is a function that sets the value field of a symbol
                    285:  *     table entry. The arguments are evaluated and the result is
                    286:  *     stored into the value field of the symbol table entry, and
                    287:  *     the section number is set according to the type of the result.
                    288:  *
                    289:  */
                    290: 
                    291: setval(sym,code)
                    292:        register symbol *sym;
                    293:        register codebuf *code;
                    294: {
                    295:        register short stype;
                    296: 
                    297:        if (sym != NULLSYM) {
                    298:                code->cvalue += sym->value;
                    299:                stype = sym->styp & TYPE;
                    300:        }
                    301:        else
                    302:                stype = ABS;
                    303:        sment.n_value = code->cvalue;
                    304:        switch (stype){
                    305:                case ABS:{
                    306:                        sment.n_scnum = N_ABS;
                    307:                        break;
                    308:                }
                    309:                case TXT:{
                    310:                        sment.n_scnum = 1;
                    311:                        break;
                    312:                }
                    313:                case DAT:{
                    314:                        sment.n_scnum = 2;
                    315:                        break;
                    316:                }
                    317:                case BSS:{
                    318:                        sment.n_scnum = 3;
                    319:                        break;
                    320:                }
                    321:        }
                    322: }
                    323: 
                    324: /*
                    325:  *
                    326:  *     "settyp" is a function that sets the type and derived type
                    327:  *     field in a symbol table entry. The arguments are evaluated to
                    328:  *     yield the numeric value to be stored into the type and derived
                    329:  *     type word. This value is stored into the appropriate field
                    330:  *     of "sment".
                    331:  *
                    332:  */
                    333: 
                    334: settyp(sym,code)
                    335:        register symbol *sym;
                    336:        register codebuf *code;
                    337: {
                    338:        if (sym != NULLSYM)
                    339:                code->cvalue += sym->value;
                    340:        sment.n_type = (short)(code->cvalue);
                    341: }
                    342: 
                    343: /*
                    344:  *
                    345:  *     "setscl" is a function that sets the storage class field in a
                    346:  *     symbol table entry. The arguments are evaluated to yield a
                    347:  *     value to be stored into the appropriate field of "sment".
                    348:  *
                    349:  */
                    350: 
                    351: setscl(sym,code)
                    352:        register symbol *sym;
                    353:        register codebuf *code;
                    354: {
                    355:        if (sym != NULLSYM)
                    356:                code->cvalue += sym->value;
                    357:        sment.n_sclass = (char)(code->cvalue);
                    358: }
                    359: 
                    360: /*
                    361:  *
                    362:  *     "settag" is a function that sets the tag field in an auxiliary
                    363:  *     symbol table entry. The argument to this function is the
                    364:  *     name of a structure, union, or enumeration tag. This name
                    365:  *     is passed to "getindx" to obtain the symbol table index of
                    366:  *     the tag entry. If it is found, a field in the symbol table
                    367:  *     entry is set indicating the presence of an auxiliary entry
                    368:  *     and the tag field of the auxiliary entry is set to the index.
                    369:  *     If the tag was not found, "yyerror" is called to print a 
                    370:  *     diagnostic message.
                    371:  *
                    372:  */
                    373: 
                    374: /*ARGSUSED*/
                    375: 
                    376: settag(sym,code)
                    377:        register symbol *sym;
                    378:        codebuf *code;
                    379: {
                    380:        register long index;
                    381:        char *nameptr;          /* We need a pointer to the name string */
                    382:                                /* to pass to getindx.                  */
                    383: 
                    384: #if FLEXNAMES
                    385:        if (sym->_name.tabentry.zeroes == 0)
                    386:                nameptr = &strtab[sym->_name.tabentry.offset];
                    387:        else
                    388: #endif
                    389:                nameptr = sym->_name.name;
                    390:        if (    ((index = getindx(nameptr,C_STRTAG)) < 0) &&
                    391:                ((index = getindx(nameptr,C_UNTAG)) < 0) &&
                    392:                ((index = getindx(nameptr,C_ENTAG)) < 0))
                    393:                yyerror("Illegal structure, union, or enumeration tag");
                    394:        sment.n_numaux = 1;
                    395:        axent.x_sym.x_tagndx = index;
                    396: }
                    397: 
                    398: /*
                    399:  *
                    400:  *     "setlno" sets the line number field in an auxiliary symbol
                    401:  *     table entry. A field is set in the symbol table entry to
                    402:  *     indicate the presence of an auxiliary entry. The arguments
                    403:  *     are evaluated to obtain the value of the line number and
                    404:  *     this value is stored into the appropriate field of the
                    405:  *     auxiliary symbol table entry.
                    406:  *
                    407:  *
                    408:  */
                    409: 
                    410: setlno(sym,code)
                    411:        register symbol *sym;
                    412:        register codebuf *code;
                    413: {
                    414:        sment.n_numaux = 1;
                    415:        if (sym != NULLSYM)
                    416:                code->cvalue += sym->value;
                    417:        axent.x_sym.x_misc.x_lnsz.x_lnno = (unsigned short)(code->cvalue);
                    418: }
                    419: 
                    420: /*
                    421:  *
                    422:  *     "setsiz" sets the size field in an auxiliary symbol table entry.
                    423:  *     The arguments are evaluated to obtain the size of the object
                    424:  *     described by this symbol table entry. This value is stored into
                    425:  *     the appropriate field of the auxiliary symbol table entry and
                    426:  *     a field is set in the basic symbol table entry to indicate the
                    427:  *     presence of the auxiliary entry.
                    428:  *
                    429:  */
                    430: 
                    431: setsiz(sym,code)
                    432:        register symbol *sym;
                    433:        register codebuf *code;
                    434: {
                    435:        sment.n_numaux = 1;
                    436:        if (sym != NULLSYM)
                    437:                code->cvalue += sym->value;
                    438:        axent.x_sym.x_misc.x_lnsz.x_size = (unsigned short)(code->cvalue);
                    439: }
                    440: 
                    441: /* indicate that the function was expanded inline */
                    442: inline(sym,codeptr)
                    443: symbol *sym;
                    444: codebuf *codeptr;
                    445: {
                    446:        axent.x_sym.x_misc.x_lnsz.x_size |= 0x1;
                    447: }
                    448: 
                    449: /*
                    450:  *
                    451:  *     "setdim1" and "setdim2" set the fields for array dimensions
                    452:  *     one through four in an auxiliary symbol table entry. The
                    453:  *     arguments to each function are evaluated to obtain the values
                    454:  *     for the array dimensions. The function "setdim1" set a field
                    455:  *     in the basic symbol table entry to indicate the presence of
                    456:  *     an auxiliary entry. The array dimensions are stored into the
                    457:  *     appropriate fields of the auxiliary symbol table entry.
                    458:  *
                    459:  */
                    460: 
                    461: setdim1(sym,code)
                    462:        register symbol *sym;
                    463:        register codebuf *code;
                    464: {
                    465:        sment.n_numaux = 1;
                    466:        if (sym != NULLSYM)
                    467:                code->cvalue += sym->value;
                    468:        axent.x_sym.x_fcnary.x_ary.x_dimen[dimcnt=0] = (unsigned short)(code->cvalue);
                    469: }
                    470: 
                    471: setdim2(sym,code)
                    472:        register symbol *sym;
                    473:        register codebuf *code;
                    474: {
                    475:        if (sym != NULLSYM)
                    476:                code->cvalue += sym->value;
                    477:        if (++dimcnt < DIMNUM)
                    478:                axent.x_sym.x_fcnary.x_ary.x_dimen[dimcnt] = (unsigned short)(code->cvalue);
                    479:        else
                    480:                werror("Too many array dimensions for symbolic debug");
                    481: }
                    482: 
                    483: /*
                    484:  *   "dfaxent" defines an auxillary entry into the symbol table for
                    485:  *   the ".text." , ".data" , and ".bss" symbols. It is called from
                    486:  *   "symout" in file "obj.c". These auxillary entries allow the
                    487:  *   link editor to know the size of each of these sections in the
                    488:  *   original source code.
                    489:  *
                    490:  */
                    491: 
                    492: dfaxent(size,nrel,nlin)
                    493:        long  size;
                    494:        unsigned short nrel,
                    495:                       nlin;
                    496: {
                    497:        sment.n_numaux = 1;
                    498:        axent.x_scn.x_scnlen = size;
                    499:        axent.x_scn.x_nreloc = nrel;
                    500:        axent.x_scn.x_nlinno = nlin;
                    501: }
                    502: 
                    503: /*
                    504:  *
                    505:  *     "xform" is a function called by "endef" that performs any final
                    506:  *     transformations necessary on a symbol table entry before it is
                    507:  *     written out to a temporary file.  The present transformations
                    508:  *     are as follows:
                    509:  *
                    510:  *          1. The section number for structure tags, union tags,
                    511:  *             enumeration tags, typedefs, and file names is set to
                    512:  *             indicate a special symbolic debugging symbol.
                    513:  *
                    514:  *          2. If the symbol table entry is for a function, a zero
                    515:  *             line number entry is generated that points to the symbol
                    516:  *             table entry.  The index of the next entry to be
                    517:  *             generated appears in the global variable "symbent".
                    518:  *
                    519:  *          3. If the symbol table entry is for a function, a enu-
                    520:  *             meration tag, a union tag, or a structure tag
                    521:  *             "setsym" is called to remember the symbol table index
                    522:  *             for the associated auxiliary entry.
                    523:  *
                    524:  *          4. If the symbol table entry is for a end block, a
                    525:  *             end function, or a end of structure, pop is called
                    526:  *             to enter the symbol table index of the next symbol
                    527:  *             table entry onto the symbol table element stack.
                    528:  *
                    529:  */
                    530: 
                    531: xform()
                    532: {
                    533: 
                    534:        switch (sment.n_sclass) {
                    535:        case C_STRTAG:
                    536:        case C_UNTAG:
                    537:        case C_ENTAG:
                    538:                setsym(-1);
                    539:                /* No Break */
                    540:        case C_TPDEF:
                    541:        case C_FILE:
                    542:                sment.n_scnum = N_DEBUG;
                    543:                break;
                    544:        case C_BLOCK:   /* handles ".bb" and ".eb" */
                    545:                if (sment.n_name[1] == 'b')
                    546:                        setsym(-1);
                    547:                else
                    548:                        pop()->fwdindex = symbent + 1L
                    549:                                        + sment.n_numaux;
                    550:                break;
                    551:        case C_FCN:     /* handles ".bf" and ".ef" */
                    552:                if (sment.n_name[1] == 'e') {
                    553:                        popptr = pop();
                    554:                        popptr->fwdindex = symbent + 1L
                    555:                                        + sment.n_numaux;
                    556:                        if (sttop > 0)
                    557:                                aerror("Unbalanced Symbol Table Entries-Too Many Scope Beginnings");
                    558:                } /* ".ef" */
                    559:                break;
                    560:        case C_EOS:
                    561:                /* get around auxiliary entry */
                    562:                pop()->fwdindex = symbent + 1L + sment.n_numaux;
                    563:                break;
                    564:        default:
                    565:                /* process function entry */
                    566:                if (ISFCN(sment.n_type)) {
                    567:                        popptr = NULL;
                    568:                        lnent.l_lnno = 0;
                    569:                        lnent.l_addr.l_symndx = symbent;
                    570:                        outblock(&lnent,LINESZ,fdline);
                    571:                        lineent++;
                    572:                        sment.n_numaux = 1;
                    573:                        setsym(0);
                    574:                }
                    575:                break;
                    576:        } /* switch */
                    577: } /* xform */
                    578: 
                    579: /*
                    580:  *
                    581:  *     "endef" is a function that completes processing of a symbol
                    582:  *     table entry and writes it out to an intermediate file
                    583:  *     The arguments to this function are absolutely meaningless.
                    584:  *     The function "xform" is called to perform any final
                    585:  *     transformations necessary on the entry. A decision is made
                    586:  *     as to whether or not the symbol is a global symbol. It is
                    587:  *     global if the ".def" for it appears in the data section and
                    588:  *     it has a storage class of "C_EXT". If it is global, the
                    589:  *     entry will be written to the file whose descriptor appears
                    590:  *     in "fdgsymb" and the count "gsymbent" will be incremented.
                    591:  *     If it is not global, the entry will be written to the file
                    592:  *     whose descriptor appears in "fdsymb" and the count "symbent"
                    593:  *     will be incremented.
                    594:  *
                    595:  */
                    596: 
                    597: /*ARGSUSED*/
                    598: 
                    599: endef(sym,code)
                    600:        symbol *sym;
                    601:        codebuf *code;
                    602: {
                    603:        FILE *fd;
                    604:        register long *count;
                    605: 
                    606:        if (sment.n_sclass == (char) C_EFCN) {
                    607:                if (popptr == NULL) {
                    608:                        popptr = pop();
                    609:                        popptr->fwdindex = symbent;
                    610:                        if (sttop > 0)
                    611:                                aerror("Unbalanced Symbol Table Entries-Too Many Scope Beginnings");
                    612:                } /* popptr == NULL */
                    613:                popptr->fcnlen = newdot - savsym->value;
                    614:                /* don't put out this symbol table entry */
                    615:                return;
                    616:        } /* sment.n_sclass == C_EFCN */
                    617:        xform();
                    618:        if ((dot->styp == DAT) && (sment.n_sclass == C_EXT)) {
                    619:                fd = fdgsymb;
                    620:                count = &gsymbent;
                    621:        }
                    622:        else
                    623:        {
                    624:                fd = fdsymb;
                    625:                count = &symbent;
                    626:                putindx(savsym,sment.n_sclass,symbent);
                    627:        }
                    628:        outblock(&sment,SYMESZ,fd);
                    629:        (*count)++;
                    630:        if (sment.n_numaux != 0){
                    631:                outblock(&axent,AUXESZ,fd);
                    632:                (*count)++;
                    633:        }
                    634: }

unix.superglobalmegacorp.com

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