Annotation of researchv10no/cmd/lcc/gen2/vax/pseudos.c, revision 1.1.1.1

1.1       root        1: /* C compiler: VAX code generator */
                      2: 
                      3: #include "c.h"
                      4: 
                      5: dclproto(static void address,(Symbol, Symbol, int));
                      6: dclproto(static void defaddress,(Symbol));
                      7: dclproto(static void defconst,(int, Value));
                      8: dclproto(static void defstring,(int, char *));
                      9: dclproto(static void defsymbol,(Symbol));
                     10: dclproto(static void doarg,(Node));
                     11: dclproto(static void emitspecial,(Node));
                     12: dclproto(static void function,(Symbol, Symbol [], Symbol [], int));
                     13: dclproto(static void global,(Symbol));
                     14: dclproto(static void import,(Symbol));
                     15: dclproto(static void local,(Symbol));
                     16: dclproto(static void progbeg,(int, char **));
                     17: dclproto(static void segment,(int));
                     18: dclproto(static void space,(int));
                     19: 
                     20: #ifdef vax
                     21: #ifdef V9
                     22: dclproto(static void stabblock,(int, int, Symbol*));
                     23: dclproto(static void stabend,(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *));
                     24: dclproto(static void stabfend,(Symbol, int));
                     25: dclproto(static void stabinit,(char *, int, char *[]));
                     26: dclproto(static void stabline,(Coordinate *));
                     27: dclproto(static void stabsym,(Symbol));
                     28: dclproto(static void stabtype,(Symbol));
                     29: #else
                     30: #include <stab.h>
                     31: #include "stabbsd.c"
                     32: #define stabend 0
                     33: #endif
                     34: #endif
                     35:        
                     36: dclproto(static void initgen,(void));
                     37: dclproto(static void final,(Node));
                     38: 
                     39: #ifdef GEN4
                     40: dclproto(static unsigned emit2,(Node,Node[],short[]));
                     41: dclproto(static void target,(Node));
                     42: #endif
                     43: 
                     44: Interface vaxInterface = {
                     45:        "vax",
                     46:        1, 1, 0,        /* char */
                     47:        2, 2, 0,        /* short */
                     48:        4, 4, 0,        /* int */
                     49:        4, 4, 1,        /* float */
                     50:        8, 4, 1,        /* double */
                     51:        4, 4, 0,        /* T * */
                     52:        0, 1, 0,        /* struct */
                     53:        0,              /* left_to_right */
                     54:        1,              /* little_endian */
                     55:        0,              /* jump_on_return */
                     56:        0,              /* mulops_are_calls */
                     57:        1,              /* compl_band */
                     58:        0,              /* no_argb */
                     59:        NODAG,          /* no_dag */
                     60:        address,
                     61:        blockbeg,
                     62:        blockend,
                     63:        defaddress,
                     64:        defconst,
                     65:        defstring,
                     66:        defsymbol,
                     67:        0,
                     68:        export,
                     69:        function,
                     70:        gen,
                     71:        global,
                     72:        import,
                     73:        local,
                     74:        progbeg,
                     75:        progend,
                     76:        segment,
                     77:        space,
                     78: #ifdef vax
                     79:        stabblock, stabend, stabfend, stabinit, stabline, stabsym, stabtype,
                     80: #else
                     81:        0, 0, 0, 0, 0, 0, 0,
                     82: #endif
                     83:        {".globl %s\n", 0, 0, {".text", ".data", ".data", ".text 1", ".data 2"},
                     84:        doarg, docall, 0, 0, 0,
                     85:        final, 0, emitspecial,
                     86: #ifdef GEN4
                     87:        vax_kids, vax_ntname, vax_nts, vax_rule, vax_state, vax_string, vax_cost,
                     88:        rules, emit2, target
                     89: #endif
                     90:        }
                     91: };
                     92: 
                     93: static Symbol d0, f0, r0, r1;
                     94: 
                     95: /* address - initialize q for addressing expression p+n */
                     96: static void address(q, p, n) Symbol q, p; {
                     97:        q->x.offset = p->x.offset + n;
                     98:        if (p->scope == GLOBAL || p->sclass == STATIC || p->sclass == EXTERN)
                     99:                q->x.name = stringf("%s%s%d", p->x.name, n >= 0 ? "+" : "", n);
                    100:        else
                    101:                q->x.name = stringd(q->x.offset);
                    102: }
                    103: 
                    104: static void defaddress(p) Symbol p; {
                    105:        print(".long %s\n", p->x.name);
                    106: }
                    107: 
                    108: /* defconst - define a constant */
                    109: static void defconst(ty, v) Value v; {
                    110:        switch (ty) {
                    111:        case C: print(".byte %d\n",   v.uc); break;
                    112:        case S: print(".word %d\n",   v.ss); break;
                    113:        case I: print(".long %d\n",   v.i ); break;
                    114:        case U: print(".long 0x%x\n", v.u ); break;
                    115:        case P: print(".long 0x%x\n", v.p ); break;
                    116:        case F:
                    117:                if (v.f == 0.0)
                    118:                        print(".long 0x0\n");
                    119:                else {
                    120:                        struct real r;
                    121:                        r = decode(F, v.f);
                    122:                        r.exp = (r.exp + 129)&0xff;
                    123:                        r.msb &= ~0x1ff;
                    124:                        print(".long 0x%x\n", (r.msb<<7) | (r.sign<<15) | (r.exp<<7) | (r.msb>>25));
                    125:                }
                    126:                break;
                    127:        case D:
                    128:                if (v.d == 0.0)
                    129:                        print(".long 0x0,0x0\n");
                    130:                else {
                    131:                        unsigned u;
                    132:                        struct real r;
                    133:                        r = decode(D, v.d);
                    134:                        r.exp = (r.exp + 129)&0xff;
                    135:                        u = r.msb&~0x1ff;
                    136:                        print(".long 0x%x,", (u<<7) | (r.sign<<15) | (r.exp<<7) | (u>>25));
                    137:                        u = (r.msb<<23) | (r.lsb>>9);
                    138:                        print("0x%x\n", (u<<16) | (u>>16));
                    139:                }
                    140:                break;
                    141:        default:
                    142:                assert(0);
                    143:        }
                    144: }
                    145: 
                    146: static void defstring(n, s) char *s; {
                    147:        genascii(".ascii", ".byte", n, s);
                    148: }
                    149: 
                    150: /* defsymbol - compute and store p's back-end name */
                    151: static void defsymbol(p) Symbol p; {
                    152:        if (p->scope == CONSTANTS)
                    153:                p->x.name = p->name;
                    154:        else if (p->scope >= LOCAL && p->sclass == STATIC)
                    155:                p->x.name = stringf("L%d", genlabel(1));
                    156:        else if (p->generated)
                    157:                p->x.name = stringf("L%s", p->name);
                    158:        else
                    159:                p->x.name = stringf("_%s", p->name);
                    160: }
                    161: 
                    162: /* doarg - assign offset for next ARG node */
                    163: static void doarg(p) Node p; {
                    164:        assert(p);
                    165:        assert(p->syms[0]);
                    166:        assert(p->syms[1]);
                    167:        p->syms[2] = intconst(mkactual(p->syms[1]->u.c.v.i, p->syms[0]->u.c.v.i, 4));
                    168: }
                    169: 
                    170: static void emitspecial(p) Node p; {}
                    171: 
                    172: /* function - generate code for a function */
                    173: static void function(p, caller, callee, n) Symbol p, callee[], caller[]; {
                    174:        int i;
                    175: 
                    176:        initfunc(n, 4, 0);
                    177:        for (i = 0; callee[i]; i++) {
                    178:                assert(caller[i]);
                    179:                callee[i]->x.offset = caller[i]->x.offset = offset;
                    180:                callee[i]->x.name = caller[i]->x.name = stringd(offset);
                    181:                offset = roundup(offset + caller[i]->type->size, 4);
                    182:                getregvar(callee[i], rmap[ttob(callee[i]->type)]);
                    183:        }
                    184:        assert(caller[i] == 0);
                    185:        offset = 0;
                    186:        gencode(caller, callee);
                    187:        mvregvars();
                    188:        savemask[0] = usedmask[0]&eemask[0];
                    189:        savebase[0] = 20;
                    190:        print(".align 1\n%s:.word 0x%x\n", p->x.name, savemask[0]);
                    191:        if (maxoffset > 0)
                    192:                print("subl2 $%d,sp\n", maxoffset);
                    193:        if (isstruct(freturn(p->type)))
                    194:                print("movl r1,-4(fp)\n");
                    195:        if (pflag) {
                    196:                int lab = genlabel(1);
                    197:                print("movab L%d,r0\njsb mcount\n", lab);
                    198:                print(".data\n.align 2\nL%d: .long 0\n.text\n", lab);
                    199:        }
                    200:        emitcode();
                    201:        if (glevel > 1)
                    202:                print("ret\n");
                    203: }
                    204: 
                    205: /* global - global id */
                    206: static void global(p) Symbol p; {
                    207:        assert(p->u.seg);
                    208:        if (p->u.seg == BSS && (p->sclass == STATIC || Aflag >= 2))
                    209:                print(".lcomm %s,", p->x.name);
                    210:        else if (p->u.seg == BSS)
                    211:                print(".comm %s,", p->x.name);
                    212:        else {
                    213:                if (p->type->align > 1)
                    214:                        print(".align %c; ", "..1.2...3"[p->type->align]);
                    215:                print("%s:", p->x.name);
                    216:        }
                    217: }
                    218: 
                    219: static void import(p) Symbol p; {}
                    220: 
                    221: /* local - local */
                    222: static void local(p) Symbol p; {
                    223:        if (getregvar(p, rmap[ttob(p->type)]) == 0)
                    224:                p->x.name = stringd(mkauto(p, 4));
                    225: }
                    226: 
                    227: /* progbeg - beginning of program */
                    228: static void progbeg(argc, argv) char *argv[]; {
                    229:        nregsets = 1;
                    230:        eemask[0] = 0xfc0;
                    231:        tmask[0] = 0x03f;
                    232:        vmask[0] = 0xfc0;
                    233:        parseflags(argc, argv);
                    234:        initgen();
                    235:        d0      = mkregs("%d", 0,  0, 2, 3, 0, D, 0);
                    236:        r0      = mkregs("%d", 0,  0, 1, 1, 0, I, 0);
                    237:        f0      = mkregs("%d", 0,  0, 1, 1, 0, F, 0);
                    238:        r1      = mkregs("%d", 1,  1, 1, 1, 0, I, 0);
                    239:        rmap[D] = mkregs("%d", 0, 10, 2, 3, 0, D, 0);
                    240:        rmap[F] = mkregs("%d", 0, 11, 1, 1, 0, F, 0);
                    241:        rmap[I] = mkregs("%d", 0, 11, 1, 1, 0, I, 0);
                    242:        rmap[C] = rmap[S] = rmap[P] = rmap[U] = rmap[I];
                    243: }
                    244: 
                    245: static void segment(n) {
                    246:        setseg(n);
                    247: }
                    248: 
                    249: static void space(n) {
                    250:        spacen(n, ".space");
                    251: }
                    252: 
                    253: #ifndef V9
                    254: #include <errno.h>
                    255: #ifndef errno
                    256: extern int errno;
                    257: #endif
                    258: 
                    259: /* strtol - interpret str as a base b number; if ptr!=0, *ptr gets updated str */
                    260: long strtol(str, ptr, b) char *str, **ptr; {
                    261:        long n = 0;
                    262:        char *s, sign = '+';
                    263:        int d, overflow = 0;
                    264: 
                    265:        if (ptr)
                    266:                *ptr = str;
                    267:        if (b < 0 || b == 1 || b > 36)
                    268:                return 0;
                    269:        while (*str==' '||*str=='\f'||*str=='\n'||*str=='\r'||*str=='\t'||*str=='\v')
                    270:                str++;
                    271:        if (*str == '-' || *str == '+')
                    272:                sign = *str++;
                    273:        if (b == 0)
                    274:                if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
                    275:                        b = 16;
                    276:                        str += 2;
                    277:                } else if (str[0] == '0')
                    278:                        b = 8;
                    279:                else
                    280:                        b = 10;
                    281:        for (s = str; *str; str++) {
                    282:                if (*str >= '0' && *str <= '9')
                    283:                        d = *str - '0';
                    284:                else if (*str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z')
                    285:                        d = (*str&~040) - 'A' + 10;
                    286:                else
                    287:                        break;
                    288:                if (d >= b)
                    289:                        break;
                    290:                if (n < (LONG_MIN + d)/b)
                    291:                        overflow = 1;
                    292:                n = b*n - d;
                    293:        }
                    294:        if (s == str)
                    295:                return 0;
                    296:        if (ptr)
                    297:                *ptr = str;
                    298:        if (overflow || (sign == '+' && n == LONG_MIN)) {
                    299:                errno = ERANGE;
                    300:                return sign == '+' ? LONG_MAX : LONG_MIN;
                    301:        }
                    302:        return sign == '+' ? -n : n;
                    303: }
                    304: #endif
                    305: 
                    306: #ifdef vax
                    307: #ifdef V9
                    308: #include <stab.h>
                    309: static char *currentfile;      /* current file name */
                    310: 
                    311: dclproto(static void emittype,(int desc, int s, Type ty, char *str));
                    312: dclproto(extern long time,(long *));
                    313: 
                    314: /* emittype - emit p's type */
                    315: static void emittype(desc, s, ty, str) Type ty; char *str; {
                    316:        ty = unqual(ty);
                    317:        switch (ty->op) {
                    318:        case CHAR: desc |= (ty == unsignedchar ? 12 : 2); break;
                    319:        case SHORT: desc |= (ty == unsignedshort ? 13 : 3); break;
                    320:        case INT: desc |= 4; break;
                    321:        case UNSIGNED: desc |= 14; break;
                    322:        case FLOAT: desc |= 6; break;
                    323:        case DOUBLE: desc |= 7; break;
                    324:        case STRUCT: case UNION: case ENUM:
                    325:                if (ty->op == STRUCT)
                    326:                        desc |= 8;
                    327:                else if (ty->op == UNION)
                    328:                        desc |= 9;
                    329:                else
                    330:                        desc |= 10;
                    331:                print("0x%x,%s\n", desc, str);
                    332:                if (glevel > 1)
                    333:                        if (*ty->u.sym->name >= '0' && *ty->u.sym->name <= '9')
                    334:                                print(".stabs \"%s$%d.%s\",0x%x,0,0,0\n", ty->u.sym->src.file,
                    335:                                        ty->u.sym->src.y, ty->u.sym->name, N_TYID);
                    336:                        else
                    337:                                print(".stabs \"%s\",0x%x,0,0,0\n", ty->u.sym->name, N_TYID);
                    338:                return;
                    339:        case ARRAY:
                    340:                emittype(desc | (3<<s), s + 2, ty->type, str);
                    341:                if (glevel > 1)
                    342:                        print(".stabn 0x%x,0,0,%d\n", N_DIM, ty->size/ty->type->size);
                    343:                return;
                    344:        case POINTER:
                    345:                emittype(desc | (1<<s), s + 2, ty->type, str);
                    346:                return;
                    347:        case FUNCTION:
                    348:                emittype(desc | (2<<s), s + 2, ty->type, str);
                    349:                return;
                    350:        case VOID: desc |= 16; break;
                    351:        default: break;
                    352:        }
                    353:        print("0x%x,%s\n", desc, str);
                    354: }
                    355: 
                    356: /* stabblock - output a stab entry for '{' or '}' at level lev */
                    357: static void stabblock(brace, lev, p) Symbol *p; {
                    358:        if (brace == '}')
                    359:                while (*p)
                    360:                        stabsym(*p++);
                    361:        print(".stabd 0x%x,0,%d\n", brace == '{' ? N_LBRAC : N_RBRAC, lev);
                    362: }
                    363: 
                    364: /* stabend - finalize stab output */
                    365: static void stabend(cp, p, cpp, sp, syms) Coordinate *cp; Symbol p, *sp, *syms; Coordinate **cpp; {
                    366:        if (glevel && cp->file && *cp->file) {
                    367:                segment(CODE);
                    368:                print("Lend:.stabs \"%s\",0x%x,0,%d,Lend\n", cp->file, N_ESO, cp->y);
                    369:        }
                    370: }
                    371: 
                    372: /* stabfend - end of function p */
                    373: static void stabfend(p, line) Symbol p; {
                    374:        int lab;
                    375: 
                    376:        if (glevel <= 1)
                    377:                return;
                    378:        lab = genlabel(1);
                    379:        print(".stabn 0x%x,0,%d,L%d\n", N_RFUN, line, p->u.f.label);
                    380:        print("L%d:.stabs \"%s\",0x%x,0,%d,L%d\n", lab,
                    381:                p->name, N_EFUN, line, lab);
                    382: }
                    383: 
                    384: /* stabinit - initialize stab output */
                    385: static void stabinit(file, argc, argv) char *file, *argv[]; {
                    386:        if (file && *file) {
                    387:                segment(CODE);
                    388:                print("Ltext:.stabs \"%s\",0x%x,0,0,Ltext\n", file, N_SO);
                    389:                print(".stabs \"rcc\",0x%x,0,17665,%d\n", N_VER, time(0));
                    390:                currentfile = file;
                    391:        }
                    392: }
                    393: 
                    394: /* stabline - emit stab entry for source coordinate *cp */
                    395: static void stabline(cp) Coordinate *cp; {
                    396:        if (glevel <= 1)
                    397:                return;
                    398:        if (cp->file && cp->file != currentfile) {
                    399:                int lab = genlabel(1);
                    400:                print("L%d: .stabs \"%s\",0x%x,0,%d,L%d\n", lab,
                    401:                                cp->file, N_SOL, line, lab);
                    402:                currentfile = cp->file;
                    403:        }
                    404:        print(".stabd 0x%x,0,%d\n", N_SLINE, cp->y);
                    405: }
                    406: 
                    407: /* stabsym - output a stab entry for symbol p */
                    408: static void stabsym(p) Symbol p; {
                    409:        char buf[100], *adr = p->x.name;
                    410: 
                    411:        if (p->generated || p->computed)
                    412:                return;
                    413:        print(".stabs \"%s\",", p->name);
                    414:        if (isfunc(p->type)) {
                    415:                print("0x%x,0,0x%x,_%s\n", N_FUN, p->u.f.pt[0].y, p->name);
                    416:                print(".stabs \"%s\",0x%x,0,", p->name,
                    417:                        p->sclass == STATIC ? N_STFUN : N_GSYM);
                    418:                adr = "0";
                    419:        } else if (p->sclass == AUTO && p->scope == GLOBAL || p->sclass == EXTERN) {
                    420:                print("0x%x,0,", N_GSYM);
                    421:                adr = "0";
                    422:        } else if (p->sclass == STATIC)
                    423:                print("0x%x,0,", p->u.seg == BSS ? N_LCSYM : N_STSYM);
                    424:        else if (p->scope == PARAM)
                    425:                print("0x%x,0,", p->sclass == REGISTER ? N_RSYM : N_PSYM);
                    426:        else if (p->scope >= LOCAL) {
                    427:                print("0x%x,0,", p->sclass == REGISTER ? N_RSYM : N_LSYM);
                    428:                if (p->sclass != REGISTER)
                    429:                        adr = p->x.name + 1;    /* skip - sign */
                    430:        } else
                    431:                assert(0);
                    432:        emittype(0, 5, p->type, adr);
                    433: }
                    434: 
                    435: /* stabtype - output a stab entry for type name, ty */
                    436: static void stabtype(p) Symbol p; {
                    437:        char *name = p->name;
                    438: 
                    439:        if (p->sclass || p->type == 0 || glevel <= 1)
                    440:                return;
                    441:        if (*p->name >= '0' && *p->name <= '9')
                    442:                name = stringf("%s$%d.%s", p->src.file, p->src.y, p->name);
                    443:        switch (p->type->op) {
                    444:        case STRUCT: case UNION: {
                    445:                Field q;
                    446:                print(".stabs \"%s\",0x%x,0,%d,0\n", name, N_BSTR,
                    447:                        p->type->op == STRUCT ? 8 : 9);
                    448:                for (q = fieldlist(p->type); q; q = q->link) {
                    449:                        print(".stabs \"%s\",", q->name ? q->name : "");
                    450:                        if (q->lsb)
                    451:                                print("0x%x,0,0x%x,%d\n", N_SFLD,
                    452:                                        fieldsize(q)<<5|(q->type == inttype ? 4 : 14),
                    453:                                        8*q->offset + fieldright(q));
                    454:                        else {
                    455:                                print("0x%x,0,", N_SSYM);
                    456:                                emittype(0, 5, q->type, stringd(q->offset));
                    457:                        }
                    458:                }
                    459:                print(".stabs \"%s\",0x%x,0,%d,%d\n", name, N_ESTR,
                    460:                        p->type->op == STRUCT ? 8 : 9, p->type->size);
                    461:                break;
                    462:                }
                    463:        case ENUM: {
                    464:                Symbol *q;
                    465:                print(".stabs \"%s\",0x%x,0,10,0\n", name, N_BSTR);
                    466:                for (q = p->u.idlist; *q; q++)
                    467:                        print(".stabs \"%s\",0x%x,0,11,%d\n", (*q)->name,
                    468:                                N_SSYM, (*q)->u.value);
                    469:                print(".stabs \"%s\",0x%x,0,10,%d\n", name, N_ESTR,
                    470:                        p->type->size);
                    471:                break;
                    472:                }
                    473:        }
                    474: }
                    475: #endif
                    476: #endif

unix.superglobalmegacorp.com

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