Annotation of researchv9/cmd/sun/as/ps.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)ps.c 1.1 86/02/03 Copyr 1985 Sun Micro";
        !             3: #endif
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 1985 by Sun Microsystems, Inc.
        !             7:  */
        !             8: 
        !             9: #include "as.h"
        !            10: #include <a.out.h>
        !            11: 
        !            12: /* a sop here to the cross-assemblers */
        !            13: #define put_words( x, y ) put_text( x, y )
        !            14: #define CSECT_MAX       5       /* number of control sections. */
        !            15: /* Csect descriptor */
        !            16: struct csect {
        !            17:     char *name_cs;     /* print name                                   */
        !            18:     long  len_cs;      /* Length in machine addresses,                 */
        !            19:                        /* i.e., highest address referenced             */
        !            20:     long  dot_cs;      /* current dot in this cs, in machine addresses */
        !            21:     short id_cs;       /* UNIX a.out name for this csect               */
        !            22:     short which_cs;    /* C_name for csect                             */
        !            23: };
        !            24: 
        !            25: struct csect csect[CSECT_MAX] = {
        !            26:   ".text", 0,0,N_TEXT,C_TEXT,          /* text csect */
        !            27:   ".data", 0,0,N_DATA,C_DATA,          /* data csect */
        !            28:   ".data1",0,0,N_DATA,C_DATA1,         /* data csect */
        !            29:   ".data2",0,0,N_DATA,C_DATA2,         /* data csect */
        !            30:   ".bss",  0,0,N_BSS, C_BSS            /* uninitialized csect */
        !            31: } ;
        !            32: 
        !            33: short cur_csect_name      = C_TEXT;
        !            34: 
        !            35: int cansdi = (C_TEXT == C_TEXT) ; /* i.e. yes */
        !            36: 
        !            37: 
        !            38: prog_end()
        !            39: { 
        !            40:        register int i;
        !            41:        register struct csect *p;
        !            42: 
        !            43:        /* pass 2 */
        !            44:        if (pass > 1)          /* On the second pass, */
        !            45:           { fix_rel();        /* patch up object file */
        !            46:             return; 
        !            47:           }
        !            48: 
        !            49:        /* pass 1 */
        !            50:        current_file= 0;
        !            51:        new_csect( C_TEXT );    /* end in text segment */
        !            52:        /* export these values to sdi_resolve */
        !            53:        if (even_align_flag == 0)
        !            54:                {
        !            55:        dsize  = (csect[C_DATA-1].len_cs  + 3) & ~3;
        !            56:        d1size = (csect[C_DATA1-1].len_cs + 3) & ~3;
        !            57:        d2size = (csect[C_DATA2-1].len_cs + 3) & ~3;
        !            58:        bsize  = (csect[C_BSS-1].len_cs   + 3) & ~3;
        !            59:        tsize  = (csect[C_TEXT-1].len_cs  + 3) & ~3;    /* make long aligned */
        !            60:                }
        !            61:        else
        !            62:                {
        !            63:        dsize  = (csect[C_DATA-1].len_cs  + 1) & ~1;
        !            64:        d1size = (csect[C_DATA1-1].len_cs + 1) & ~1;
        !            65:        d2size = (csect[C_DATA2-1].len_cs + 1) & ~1;
        !            66:        bsize  = (csect[C_BSS-1].len_cs   + 1) & ~1;
        !            67:        tsize  = (csect[C_TEXT-1].len_cs  + 1) & ~1;    /* make word aligned */
        !            68:                }
        !            69:        
        !            70:        sdi_resolve();         /* resolve span dependent instructions */
        !            71: 
        !            72:        csect[C_TEXT-1].len_cs += sdi_inc( csect[C_TEXT-1].len_cs, NULL);
        !            73:        /* re-compute values for sym_fix and rel_header */
        !            74:        if (even_align_flag == 0)
        !            75:                {
        !            76:        dsize  = (csect[C_DATA-1].len_cs  + 3) & ~3;
        !            77:        d1size = (csect[C_DATA1-1].len_cs + 3) & ~3;
        !            78:        d2size = (csect[C_DATA2-1].len_cs + 3) & ~3;
        !            79:        bsize  = (csect[C_BSS-1].len_cs   + 3) & ~3;
        !            80:        tsize  = (csect[C_TEXT-1].len_cs  + 3) & ~3;    /* make long aligned */
        !            81:                }
        !            82:        else
        !            83:                {
        !            84:        dsize  = (csect[C_DATA-1].len_cs  + 1) & ~1;
        !            85:        d1size = (csect[C_DATA1-1].len_cs + 1) & ~1;
        !            86:        d2size = (csect[C_DATA2-1].len_cs + 1) & ~1;
        !            87:        bsize  = (csect[C_BSS-1].len_cs   + 1) & ~1;
        !            88:        tsize  = (csect[C_TEXT-1].len_cs  + 1) & ~1;    /* make word aligned */
        !            89:                }
        !            90:        sym_fix();                     /* relocate and globalize */
        !            91:        rel_header();                  /* Initialize output stuff */
        !            92:        start_pass();                  /* Init per-pass variables */
        !            93:        return;
        !            94: } /* end prog_end */
        !            95: 
        !            96: /* Initialize per-pass variables */
        !            97: start_pass()
        !            98: { 
        !            99:        register int i;
        !           100: 
        !           101:        last_symbol = dot_bkt;  /* last defined symbol at start of pass */
        !           102:        line_no = 0;
        !           103:        errors = 0;
        !           104:        implicit_cpid = INITIAL_CPID ;
        !           105:         pass++;
        !           106:        if (pass == 1) {
        !           107:                for (i=0; i<CSECT_MAX; i++) 
        !           108:                csect[i].dot_cs = 0;
        !           109:        } else { 
        !           110:            csect[C_TEXT-1].dot_cs = 0;
        !           111:            csect[C_DATA-1].dot_cs = tsize;
        !           112:            csect[C_DATA1-1].dot_cs = tsize + dsize;
        !           113:            csect[C_DATA2-1].dot_cs = tsize + dsize + d1size;
        !           114:            csect[C_BSS-1].dot_cs = tsize + dsize + d1size + d2size;
        !           115:        }
        !           116:        dot = 0;
        !           117:        new_csect( C_TEXT ); /* start in text segment */
        !           118: } /* end Start_pass */
        !           119: 
        !           120: 
        !           121: /* .even handler */
        !           122: even_op( ip, nops )
        !           123:     struct ins_bkt *ip;
        !           124: { 
        !           125:     int align_val, dot_delta;
        !           126:     if (nops == 0 ){
        !           127:        /* just plain .even */
        !           128:        align_val = 2;
        !           129:     } else {
        !           130:        /* .align something */
        !           131:        if (operands[0].sym_o)
        !           132:            PROG_ERROR(E_OPERAND);
        !           133:        align_val = operands[0].value_o;
        !           134:     }
        !           135:     switch( align_val ){
        !           136:     case 1: /* no-op */
        !           137:        break;
        !           138:     case 4:
        !           139:        if (cansdi){
        !           140:            PROG_ERROR(E_ALIGN);
        !           141:            break;
        !           142:        }
        !           143:        /* FALL THROUGH */
        !           144:     case 2:
        !           145:        dot_delta = align_val - (dot%align_val);
        !           146:        if (dot_delta != 0 && dot_delta != align_val){
        !           147:            dot += dot_delta;
        !           148:            wcode[0] = 0;
        !           149:            wcode[1] = 0;
        !           150:            put_text(wcode, dot_delta);
        !           151:        }
        !           152:        break;
        !           153:     default:
        !           154:        PROG_ERROR(E_OPERAND);
        !           155:     }
        !           156: } /* end Even */
        !           157: 
        !           158: byteword( ip )
        !           159:     struct ins_bkt *ip;
        !           160: { 
        !           161:     register int i;
        !           162:     register struct oper *p;
        !           163:   
        !           164:     for (i=0, p=operands; i < numops; i++, p++) { 
        !           165:        if (p->type_o != T_NORMAL) { 
        !           166:             p->sym_o = 0;
        !           167:             p->type_o = T_NORMAL;
        !           168:             p->value_o = 0;
        !           169:             PROG_ERROR(E_OPERAND);
        !           170:         } else if (p->sym_o) 
        !           171:              put_rel(p, ip->subop_i, dot+bc,(p->flags_o&O_COMPLEX)!=0);
        !           172:   
        !           173:        switch (ip->subop_i){
        !           174:        case SUBOP_L:   *(unsigned *)code = p->value_o;
        !           175:                        /* if cross-assembling, we die here */
        !           176:                        put_words(wcode,4);
        !           177:                        bc += 4;
        !           178:                        break;
        !           179:   
        !           180:        case SUBOP_W:   wcode[0] = p->value_o;
        !           181:                        put_words(wcode,2);
        !           182:                        bc += 2;
        !           183:                        break;
        !           184:   
        !           185:        case SUBOP_B:   code[0] = p->value_o;
        !           186:                        put_text(code,1);
        !           187:                        bc++;
        !           188:                        break;
        !           189:            } /* end switch */
        !           190:        } /* end for */
        !           191: } /* end ByteWord */
        !           192: 
        !           193: /* handle .ascii and .asciz pseudo ops -- zero<>0 indicates that
        !           194:  * user wants zero byte at end of string.
        !           195:  */
        !           196: ascii_op( ip )
        !           197:     struct ins_bkt *ip;
        !           198: {
        !           199:     register char *p;
        !           200:     char c;
        !           201:     /*
        !           202:      * opval_i[0] == 1 => ASCIZ
        !           203:      *               0 => ASCII
        !           204:      */
        !           205: 
        !           206:     if (numops!=1 || operands[0].type_o!=T_STRING){
        !           207:        PROG_ERROR(E_OPERAND);
        !           208:        return;
        !           209:     }
        !           210:     p = operands[0].stringval_o;
        !           211:     while (*p) {
        !           212:            bc++; 
        !           213:            if ((c = *p++) != '\\') {
        !           214:                    put_text(&c,1);
        !           215:            } else switch ( c = *p){
        !           216:                case '\\':
        !           217:                case '"':
        !           218:                        put_text(&c, 1);
        !           219:                        p++;
        !           220:                        break;
        !           221:                default:
        !           222:                {
        !           223:                    register i;
        !           224:                    /* \octal number.  Max of 3 octal digits */
        !           225: 
        !           226:                    for(i=0,c=0;i<3;i++) {
        !           227:                            if ((*p >= '0') && (*p <= '7')) {
        !           228:                                    c = c * 8 + (*p++) - '0';
        !           229:                            } else
        !           230:                                    break;
        !           231:                    }
        !           232:                    put_text(&c,1);
        !           233:                }
        !           234:            }
        !           235:     }
        !           236:     if (ip->opval_i[0]) { put_text(p,1); bc++; }
        !           237: } /* end Ascii */      
        !           238: 
        !           239: /*
        !           240:  * handle .float and .double pseudo-ops. We distinguish by the opcode in
        !           241:  * the instruction bucket handed us. We expect >=0 operands of type
        !           242:  * T_FLOAT or T_DOUBLE.
        !           243:  */
        !           244: float_op( ip )
        !           245:     struct ins_bkt *ip;
        !           246: { 
        !           247:     register int i;
        !           248:     register struct oper *p;
        !           249:     double d;
        !           250:     float f;
        !           251:   
        !           252:     switch (ip->op_i){
        !           253:     case OP_FLOAT:
        !           254:        for (i=0, p=operands; i < numops; i++, p++) {
        !           255:            switch (p->type_o){
        !           256:            default:
        !           257:                PROG_ERROR( E_OPERAND );
        !           258:                f = 0.0;
        !           259:                break;
        !           260:            case T_NORMAL:
        !           261:                if (p->sym_o )
        !           262:                    PROG_ERROR( E_CONSTANT );
        !           263:                f = (double) p->value_o;
        !           264:                break;
        !           265:            case T_FLOAT:
        !           266:                f =  p->fval_o;        break;
        !           267:            case T_DOUBLE:
        !           268:                f = (float) p->dval_o; break;
        !           269:            }
        !           270:            put_text((char *) &f, sizeof f );
        !           271:            bc += sizeof f;
        !           272:        }
        !           273:        break;
        !           274:     case OP_DOUBLE:
        !           275:        for (i=0, p=operands; i < numops; i++, p++) {
        !           276:            switch (p->type_o){
        !           277:            default:
        !           278:                PROG_ERROR( E_OPERAND );
        !           279:                d = 0.0;
        !           280:                break;
        !           281:            case T_NORMAL:
        !           282:                if (p->sym_o )
        !           283:                    PROG_ERROR( E_CONSTANT );
        !           284:                d = (double) p->value_o;
        !           285:                break;
        !           286:            case T_FLOAT:
        !           287:                d = (double) p->fval_o; break;
        !           288:            case T_DOUBLE:
        !           289:                d = p->dval_o;          break;
        !           290:            }
        !           291:            put_text((char *) &d, sizeof d );
        !           292:            bc += sizeof d;
        !           293:        }
        !           294:        break;
        !           295:     default:
        !           296:        sys_error("broken .float\n");
        !           297:     }
        !           298: }
        !           299: 
        !           300: csect_op( ip )
        !           301:     struct ins_bkt *ip;
        !           302: { 
        !           303:     new_csect( (int)(ip->op_i) - (int)OP_TEXT + C_TEXT );
        !           304: }
        !           305: 
        !           306: new_csect( cname )
        !           307:     int cname;
        !           308: {
        !           309:     register struct sym_bkt *sbp;        /* for defining new symbol */
        !           310:     register struct csect   *csp;      /* ptr to current csect */
        !           311:     extern struct sym_bkt  *last_symbol;       /* used for local symbols */
        !           312:     extern struct sym_bkt  *dot_bkt;   /* sym_bkt for location counter */
        !           313:        
        !           314:     /* update current csect */
        !           315:     csp = &csect[ cur_csect_name -1 ];
        !           316:     csp->dot_cs = dot;
        !           317:     if (dot > csp->len_cs) csp->len_cs = dot;
        !           318:     /* now install new one */
        !           319:     csp = &csect[cname-1];
        !           320:     cur_csect_name = csp->which_cs;
        !           321:     dot = csp->dot_cs;
        !           322:     dot_bkt->csect_s = cur_csect_name;/* update dot's csect. dot_bkt->value_s */
        !           323:     dot_bkt->value_s = dot;
        !           324:                                       /* will be updated in the main loop     */
        !           325:     sbp = lookup(csp->name_cs);
        !           326:     sbp->attr_s |= S_DEC | S_DEF | S_LOCAL | S_PERM;
        !           327:     sbp->csect_s = cur_csect_name;
        !           328:     cansdi = !Jflag && (cur_csect_name==C_TEXT);
        !           329:     sbp->value_s = 0;
        !           330: } /* end New_csect */
        !           331: 
        !           332: 
        !           333: proc_op( ip )
        !           334:     struct ins_bkt *ip;
        !           335: {
        !           336:     if (pass == 1) makesdi( NULL, 0, 0 ); 
        !           337: }
        !           338: 
        !           339: globl_op( ip )
        !           340:     struct ins_bkt *ip;
        !           341: { 
        !           342:     register int i;
        !           343:     register struct sym_bkt *sbp;
        !           344:   
        !           345:     if (pass == 1) 
        !           346:        for (i=0; i<numops; i++) {
        !           347:             sbp = operands[i].sym_o;
        !           348:             if (sbp == NULL) {
        !           349:                PROG_ERROR(E_SYMBOL);
        !           350:             } else { 
        !           351:                  sbp->attr_s |= S_DEC | S_EXT; /* declared and external */
        !           352:                  if (!(sbp->attr_s & S_DEF)){
        !           353:                      sbp->csect_s = C_UNDEF;   /* don't know which */
        !           354:                  }
        !           355:             }
        !           356:        }
        !           357:     return;
        !           358: } /* end Globl */
        !           359: 
        !           360: 
        !           361: comm_op( ip )
        !           362:     struct ins_bkt *ip;
        !           363: { 
        !           364:        register struct sym_bkt *sbp;
        !           365: 
        !           366:        sbp = operands[0].sym_o;
        !           367:        if (sbp == NULL) {
        !           368:            PROG_ERROR(E_OPERAND);
        !           369:            return;
        !           370:        }
        !           371:        if (ip->op_i == OP_COMM ){
        !           372:            /* .comm */
        !           373:            if (pass == 1){
        !           374:                sbp->csect_s = C_UNDEF; /* make it undefined */
        !           375:                sbp->attr_s |= S_DEC | S_EXT | S_COMM;
        !           376:                sbp->value_s = operands[1].value_o;
        !           377:            }
        !           378:        } else {
        !           379:            /* .lcomm */
        !           380:            /*
        !           381:             * switch to bss segment;
        !           382:             * bump dot and plant label;
        !           383:             * switch back
        !           384:             */
        !           385:            auto save_csect = cur_csect_name;
        !           386:            new_csect( C_BSS );
        !           387:            if (pass == 1) {
        !           388:                    sbp->attr_s |=S_LABEL|S_DEC|S_DEF;
        !           389:                    sbp->csect_s = C_BSS;
        !           390:                    sbp->value_s = dot;
        !           391:            } else {
        !           392:                if (sbp->csect_s != C_BSS || sbp->value_s != dot)
        !           393:                    prog_error(E_MULTSYM);
        !           394:            }
        !           395:            dot += operands[1].value_o;
        !           396:            new_csect( save_csect );
        !           397:     }
        !           398: }
        !           399: 
        !           400: skip_op( ip )
        !           401:     struct ins_bkt *ip;
        !           402: {
        !           403:        register i;
        !           404:        static int zed[1024] = {0};
        !           405:        bc += i = operands[0].value_o;
        !           406:        if (cur_csect_name != C_BSS){
        !           407:                while (i>sizeof zed){
        !           408:                        put_text(zed, sizeof zed);
        !           409:                        i -= sizeof zed;
        !           410:                }
        !           411:                if (i) {
        !           412:                        put_text(zed,i);
        !           413:                }
        !           414:        }
        !           415: }
        !           416:  
        !           417: cpid_op( ip )
        !           418:      struct ins_bkt *ip ;
        !           419: {
        !           420: implicit_cpid = operands[0].value_o ;
        !           421: }

unix.superglobalmegacorp.com

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