Annotation of researchv9/cmd/sun/c2/pseudoop.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)pseudoop.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 "c2.h"
                     11: 
                     12: /* Csect descriptor */
                     13: struct csect {
                     14:        char *name_cs;    /* print name                                          */
                     15:        long len_cs;     /* Length in machine addresses,                 */ 
                     16:                          /* i.e., highest address referenced            */
                     17:        long dot_cs;     /* current dot in this cs, in machine addresses */
                     18:        short id_cs;     /* UNIX a.out name for this csect               */
                     19:        short which_cs;  /* our name for this csect (see below)          */
                     20: };
                     21: 
                     22: /* table used to determine node type. */
                     23: /* 
                     24:  * we would really like this table to be subscripted by the enumerated type
                     25:  * opcode_t, but C cannot hack that. Order here is VERY IMPORTANT,
                     26:  * and this table must change if the opcode order or number changes!!
                     27:  */
                     28: char opcodetypes[] = {
                     29:        0,                      /* FIRST        */
                     30:        PSEUDONOCODE,           /* COMMENT      */
                     31:        0,                      /* LABEL        */
                     32:        PSEUDOCODE,             /* LONG         */
                     33:        PSEUDOCODE,             /* WORD         */
                     34:        PSEUDOCODE,             /* BYTE         */
                     35:        PSEUDONOCODE,           /* TEXT         */
                     36:        PSEUDONOCODE,           /* DATA         */
                     37:        PSEUDONOCODE,           /* DATA1        */
                     38:        PSEUDONOCODE,           /* DATA2        */
                     39:        PSEUDONOCODE,           /* BSS          */
                     40:        PSEUDONOCODE,           /* GLOBL        */
                     41:        PSEUDONOCODE,           /* COMM         */
                     42:        PSEUDOCODE,             /* EVEN         */
                     43:        PSEUDOCODE,             /* ALIGN        */
                     44:        PSEUDOCODE,             /* ASCIZ        */
                     45:        PSEUDOCODE,             /* ASCII        */
                     46:        PSEUDOCODE,             /* SINGLE       */
                     47:        PSEUDOCODE,             /* DOUBLE       */
                     48:        PSEUDONOCODE,           /* STABS        */
                     49:        PSEUDONOCODE,           /* STABD        */
                     50:        PSEUDONOCODE,           /* STABN        */
                     51:        PSEUDOCODE,             /* SKIP         */
                     52:        PSEUDONOCODE,           /* LCOMM        */
                     53:        PSEUDONOCODE,           /* CPID         */
                     54:        INSTRTYPE|BRANCHTYPE,   /* CSWITCH      */
                     55:        INSTRTYPE|BRANCHTYPE,   /* FSWITCH      */
                     56:        INSTRTYPE|BRANCHTYPE,   /* BRANCH       */
                     57:        INSTRTYPE,              /* MOVE         */
                     58:        INSTRTYPE,              /* MOVEM        */
                     59:        INSTRTYPE|BRANCHTYPE,   /* EXIT         */
                     60:        INSTRTYPE|BRANCHTYPE,   /* DBRA         */
                     61:        INSTRTYPE,              /* CALL         */
                     62:        INSTRTYPE|BRANCHTYPE|JUMPTYPE,  /* JUMP         */
                     63:        INSTRTYPE|BRANCHTYPE|JUMPTYPE,  /* DJMP         */
                     64:        INSTRTYPE,              /* LINK         */
                     65:        INSTRTYPE,              /* CMP          */
                     66:        INSTRTYPE,              /* PEA          */
                     67:        INSTRTYPE,              /* ADD          */
                     68:        INSTRTYPE,              /* AND          */
                     69:        INSTRTYPE,              /* EXT          */
                     70:        INSTRTYPE,              /* OR           */
                     71:        INSTRTYPE,              /* TST          */
                     72:        INSTRTYPE,              /* ASL          */
                     73:        INSTRTYPE,              /* ASR          */
                     74:        INSTRTYPE,              /* SUB          */
                     75:        INSTRTYPE,              /* UNLK         */
                     76:        INSTRTYPE,              /* LEA          */
                     77:        INSTRTYPE,              /* CLR          */
                     78:        INSTRTYPE,              /* BOP          */
                     79:        INSTRTYPE,              /* EOR          */
                     80:        INSTRTYPE,              /* FTST         */
                     81:        INSTRTYPE,              /* OTHER        */
                     82: };
                     83: extern struct sym_bkt *dot_bkt;
                     84: 
                     85: struct csect csects[] = {
                     86:   ".text", 0,0,0,C_TEXT,               /* text csect */
                     87:   ".data", 0,0,0,C_DATA,               /* data csect */
                     88:   ".data1",0,0,0,C_DATA1,              /* data csect */
                     89:   ".data2",0,0,0,C_DATA2,              /* data csect */
                     90:   ".bss",  0,0,0, C_BSS,               /* uninitialized csect */
                     91:   0
                     92: } ;
                     93: 
                     94: struct csect *cur_csect   = &(csects[0]);/* ptr to current csect */
                     95: struct csect *all_csects[] = { 0 ,
                     96:        &(csects[0]), &(csects[1]), &(csects[2]), &(csects[3]), &(csects[4])
                     97: };
                     98: 
                     99: short cur_csect_name      = C_TEXT;
                    100: 
                    101: void
                    102: init_csects(){
                    103:     register struct sym_bkt *sbp;
                    104:     struct csect *csp;
                    105:     for (csp = csects; csp->name_cs != NULL; csp++){
                    106:        sbp = lookup(csp->name_cs);
                    107:        sbp->attr_s |= S_DEC | S_DEF | S_LOCAL;
                    108:        sbp->csect_s = csp->which_cs;
                    109:        sbp->value_s = 0;
                    110:     }
                    111: }
                    112: 
                    113: void
                    114: new_csect()
                    115: { 
                    116:     extern struct csect    *cur_csect; /* ptr to current csect */
                    117:     extern struct sym_bkt  *dot_bkt;   /* sym_bkt for location counter */
                    118:        
                    119:     cur_csect = all_csects[cur_csect_name];
                    120:     dot = cur_csect->dot_cs;
                    121:     dot_bkt->csect_s = cur_csect_name;/* update dot's csect. dot_bkt->value_s */
                    122:                                       /* will be updated in the main loop     */
                    123: }
                    124: 
                    125: int
                    126: ascii(csectname)
                    127: {      register char *p;
                    128:        int count;
                    129:        extern char *malloc();
                    130: 
                    131:        if (numops!=1 || operands[0].type_o!=T_STRING)
                    132:          { PROG_ERROR(E_OPERAND); return 0; }
                    133:        if (csectname == C_TEXT){
                    134:            count = strlen(operands[0].stringval_o);
                    135:            p = malloc( count+1);
                    136:            strcpy( p, operands[0].stringval_o);
                    137:            operands[0].stringval_o = p;
                    138:        } else
                    139:            p = operands[0].stringval_o;
                    140:        /* scan out the string, so we can figure how much space it will take */
                    141:        count = 0;
                    142:        while (*p) {
                    143:                count++;
                    144:                if ( *p++ == '\\' )
                    145:                    switch ( *p ){
                    146:                    case '\\':
                    147:                    case '"':
                    148:                            p++;
                    149:                            break;
                    150:                    default:
                    151:                    {
                    152:                        register i;
                    153:                        /* \octal number.  Max of 3 octal digits */
                    154: 
                    155:                        for(i=0;i<3;i++,p++) {
                    156:                                if (!((*p >= '0') && (*p <= '7'))) 
                    157:                                    break;
                    158:                        }
                    159:                    }
                    160:                }
                    161:        }
                    162:        return count;
                    163: }
                    164: 
                    165: int
                    166: pseudo_size( ip )
                    167:     struct ins_bkt *ip;
                    168: {
                    169:     int val, delta;
                    170:     switch( ip->op_i ){
                    171:     case OP_LONG:
                    172:        return numops*sizeof(long);
                    173:     case OP_WORD:
                    174:        return numops*sizeof(short);
                    175:     case OP_BYTE:
                    176:        return numops*sizeof(char);
                    177:     case OP_SKIP:
                    178:        return operands[0].value_o;
                    179:     case OP_EVEN:
                    180:        return dot&1;
                    181:     case OP_ALIGN:
                    182:        val = operands[0].value_o;
                    183:        delta = val - (dot%val);
                    184:        if (delta == val) delta = 0;
                    185:        return delta;
                    186:     }
                    187:     return 0;
                    188: }
                    189: 
                    190: int
                    191: pseudo_code( op ) opcode_t op; 
                    192: {
                    193:     /*
                    194:      *  1 => can generate code
                    195:      *  0 => cannot generate code
                    196:      * -1 => not a pseudo-op
                    197:      */
                    198:     if (opcodetypes[(int)op]&PSEUDONOCODE) return 0;
                    199:     if (opcodetypes[(int)op]&PSEUDOCODE  ) return 1;
                    200:     return -1;
                    201: }
                    202: 
                    203: void
                    204: save_stabs(csectname)
                    205: {
                    206:     char *p;
                    207:     /* IF IN TEXT, save stabs string */
                    208:     if (csectname != C_TEXT) return;
                    209:     /* like ascii above */
                    210:     p = malloc( 1 + strlen(operands[0].stringval_o));
                    211:     strcpy( p, operands[0].stringval_o);
                    212:     operands[0].stringval_o = p;
                    213: }

unix.superglobalmegacorp.com

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