#include #include #include #include "../5c/5.out.h" #include "a.h" #include "y.tab.h" void main(int argc, char *argv[]) { char ofile[100], incfile[20], *p; int i, c, of; thechar = '5'; thestring = "arm"; memset(debug, 0, sizeof(debug)); cinit(); outfile = 0; include[ninclude++] = "."; ARGBEGIN { default: c = ARGC(); if(c >= 0 || c < sizeof(debug)) debug[c] = 1; break; case 'o': outfile = ARGF(); break; case 'D': p = ARGF(); if(p) Dlist[nDlist++] = p; break; case 'I': p = ARGF(); setinclude(p); break; } ARGEND if(*argv == 0) { print("usage: %ca [-options] file.s\n", thechar); errorexit(); } c = 0; do { child: strcpy(ofile, *argv); if(p = strrchr(ofile, '\\')) { include[0] = ofile; *p++ = 0; } else p = ofile; if(outfile == 0) { outfile = p; if(p = strrchr(outfile, '.')) if(p[1] == 's' && p[2] == 0) p[0] = 0; p = strrchr(outfile, 0); p[0] = '.'; p[1] = thechar; p[2] = 0; } if(plan9()) { strcpy(incfile, "/"); strcat(incfile, thestring); strcat(incfile, "/include"); } else { strcpy(incfile, "/usr/%include"); p = strrchr(incfile, '%'); if(p) *p = thechar; } if(!(p = getenv("INCLUDE"))) p = incfile; setinclude(p); of = mycreat(outfile, 0664); if(of < 0) { yyerror("%ca: cannot create %s", thechar, outfile); errorexit(); } Binit(&obuf, of, OWRITE); pass = 1; pinit(*argv); for(i=0; i 0); if(c) errorexit(); exits(0); } struct { char *name; ushort type; ushort value; } itab[] = { "SP", LSP, D_AUTO, "SB", LSB, D_EXTERN, "FP", LFP, D_PARAM, "PC", LPC, D_BRANCH, "R", LR, 0, "R0", LREG, 0, "R1", LREG, 1, "R2", LREG, 2, "R3", LREG, 3, "R4", LREG, 4, "R5", LREG, 5, "R6", LREG, 6, "R7", LREG, 7, "R8", LREG, 8, "R9", LREG, 9, "R10", LREG, 10, "R11", LREG, 11, "R12", LREG, 12, "R13", LREG, 13, "R14", LREG, 14, "R15", LREG, 15, "F", LF, 0, "F0", LFREG, 0, "F1", LFREG, 1, "F2", LFREG, 2, "F3", LFREG, 3, "F4", LFREG, 4, "F5", LFREG, 5, "F6", LFREG, 6, "F7", LFREG, 7, "F8", LFREG, 8, "F9", LFREG, 9, "F10", LFREG, 10, "F11", LFREG, 11, "F12", LFREG, 12, "F13", LFREG, 13, "F14", LFREG, 14, "F15", LFREG, 15, "C", LC, 0, "C0", LCREG, 0, "C1", LCREG, 1, "C2", LCREG, 2, "C3", LCREG, 3, "C4", LCREG, 4, "C5", LCREG, 5, "C6", LCREG, 6, "C7", LCREG, 7, "C8", LCREG, 8, "C9", LCREG, 9, "C10", LCREG, 10, "C11", LCREG, 11, "C12", LCREG, 12, "C13", LCREG, 13, "C14", LCREG, 14, "C15", LCREG, 15, "CPSR", LPSR, 0, "SPSR", LPSR, 1, ".EQ", LCOND, 0, ".NE", LCOND, 1, ".CS", LCOND, 2, ".HS", LCOND, 2, ".CC", LCOND, 3, ".LO", LCOND, 3, ".MI", LCOND, 4, ".PL", LCOND, 5, ".VS", LCOND, 6, ".VC", LCOND, 7, ".HI", LCOND, 8, ".LS", LCOND, 9, ".GE", LCOND, 10, ".LT", LCOND, 11, ".GT", LCOND, 12, ".LE", LCOND, 13, ".AL", LCOND, Always, ".U", LS, C_UBIT, ".S", LS, C_SBIT, ".W", LS, C_WBIT, ".P", LS, C_PBIT, ".PW", LS, C_WBIT|C_PBIT, ".WP", LS, C_WBIT|C_PBIT, ".F", LS, C_FBIT, ".IBW", LS, C_WBIT|C_PBIT|C_UBIT, ".IAW", LS, C_WBIT|C_UBIT, ".DBW", LS, C_WBIT|C_PBIT, ".DAW", LS, C_WBIT, ".IB", LS, C_PBIT|C_UBIT, ".IA", LS, C_UBIT, ".DB", LS, C_PBIT, ".DA", LS, 0, "@", LAT, 0, "AND", LTYPE1, AAND, "EOR", LTYPE1, AEOR, "SUB", LTYPE1, ASUB, "RSB", LTYPE1, ARSB, "ADD", LTYPE1, AADD, "ADC", LTYPE1, AADC, "SBC", LTYPE1, ASBC, "RSC", LTYPE1, ARSC, "TST", LTYPE7, ATST, "TEQ", LTYPE1, ATEQ, "CMN", LTYPE1, ACMN, "ORR", LTYPE1, AORR, "BIC", LTYPE1, ABIC, "SLL", LTYPE1, ASLL, "SRL", LTYPE1, ASRL, "SRA", LTYPE1, ASRA, "MVN", LTYPE2, AMVN, /* op2 ignored */ "MOVB", LTYPE3, AMOVB, "MOVBU", LTYPE3, AMOVBU, "MOVH", LTYPE3, AMOVH, "MOVHU", LTYPE3, AMOVHU, "MOVW", LTYPE3, AMOVW, "B", LTYPE4, AB, "BL", LTYPE4, ABL, "BEQ", LTYPE5, ABEQ, "BNE", LTYPE5, ABNE, "BCS", LTYPE5, ABCS, "BHS", LTYPE5, ABHS, "BCC", LTYPE5, ABCC, "BLO", LTYPE5, ABLO, "BMI", LTYPE5, ABMI, "BPL", LTYPE5, ABPL, "BVS", LTYPE5, ABVS, "BVC", LTYPE5, ABVC, "BHI", LTYPE5, ABHI, "BLS", LTYPE5, ABLS, "BGE", LTYPE5, ABGE, "BLT", LTYPE5, ABLT, "BGT", LTYPE5, ABGT, "BLE", LTYPE5, ABLE, "SWI", LTYPE6, ASWI, "CMP", LTYPE7, ACMP, "MOVM", LTYPE8, AMOVM, "SWPBU", LTYPE9, ASWPBU, "SWPW", LTYPE9, ASWPW, "MUL", LTYPEA, AMOVW, "MLA", LTYPEA, AMOVW, "RET", LTYPEA, ARET, "RFE", LTYPEA, ARFE, "TEXT", LTYPEB, ATEXT, "GLOBL", LTYPEB, AGLOBL, "DATA", LTYPEC, ADATA, "WORD", LTYPEH, AWORD, "NOP", LTYPEI, ANOP, "MCR", LTYPEJ, 0, "MRC", LTYPEJ, 1, 0 }; void cinit(void) { Sym *s; int i; nullgen.sym = S; nullgen.offset = 0; nullgen.type = D_NONE; nullgen.name = D_NONE; nullgen.reg = NREG; if(FPCHIP) nullgen.dval = 0; for(i=0; itype = itab[i].type; s->value = itab[i].value; } ALLOCN(pathname, 0, 100); if(getcwd(pathname, 99) == 0) { ALLOCN(pathname, 100, 900); if(getcwd(pathname, 999) == 0) strcpy(pathname, "/???"); } } void syminit(Sym *s) { s->type = LNAME; s->value = 0; } int isreg(Gen *g) { USED(g); return 1; } void cclean(void) { outcode(AEND, Always, &nullgen, NREG, &nullgen); Bflush(&obuf); } void zname(char *n, int t, int s) { Bputc(&obuf, ANAME); Bputc(&obuf, t); /* type */ Bputc(&obuf, s); /* sym */ while(*n) { Bputc(&obuf, *n); n++; } Bputc(&obuf, 0); } void zaddr(Gen *a, int s) { long l; int i; char *n; Ieee e; Bputc(&obuf, a->type); Bputc(&obuf, a->reg); Bputc(&obuf, s); Bputc(&obuf, a->name); switch(a->type) { default: print("unknown type %d\n", a->type); exits("arg"); case D_NONE: case D_REG: case D_FREG: case D_PSR: break; case D_OREG: case D_CONST: case D_BRANCH: case D_SHIFT: l = a->offset; Bputc(&obuf, l); Bputc(&obuf, l>>8); Bputc(&obuf, l>>16); Bputc(&obuf, l>>24); break; case D_SCONST: n = a->sval; for(i=0; idval); Bputc(&obuf, e.l); Bputc(&obuf, e.l>>8); Bputc(&obuf, e.l>>16); Bputc(&obuf, e.l>>24); Bputc(&obuf, e.h); Bputc(&obuf, e.h>>8); Bputc(&obuf, e.h>>16); Bputc(&obuf, e.h>>24); break; } } void outcode(int a, int scond, Gen *g1, int reg, Gen *g2) { int sf, st, t; Sym *s; if(pass == 1) goto out; jackpot: sf = 0; s = g1->sym; while(s != S) { sf = s->sym; if(sf < 0 || sf >= NSYM) sf = 0; t = g1->name; if(h[sf].type == t) if(h[sf].sym == s) break; zname(s->name, t, sym); s->sym = sym; h[sym].sym = s; h[sym].type = t; sf = sym; sym++; if(sym >= NSYM) sym = 1; break; } st = 0; s = g2->sym; while(s != S) { st = s->sym; if(st < 0 || st >= NSYM) st = 0; t = g2->name; if(h[st].type == t) if(h[st].sym == s) break; zname(s->name, t, sym); s->sym = sym; h[sym].sym = s; h[sym].type = t; st = sym; sym++; if(sym >= NSYM) sym = 1; if(st == sf) goto jackpot; break; } Bputc(&obuf, a); Bputc(&obuf, scond); Bputc(&obuf, reg); Bputc(&obuf, lineno); Bputc(&obuf, lineno>>8); Bputc(&obuf, lineno>>16); Bputc(&obuf, lineno>>24); zaddr(g1, sf); zaddr(g2, st); out: if(a != AGLOBL && a != ADATA) pc++; } void outhist(void) { Gen g; Hist *h; char *p, *q, *op; int n; g = nullgen; for(h = hist; h != H; h = h->link) { p = h->name; op = 0; /* pathname[0]='drive', pathname[1]=':' on a PC */ if(p && p[0] != '\\' && h->offset == 0 && pathname && pathname[2] == '\\') { op = p; p = &pathname[2]; *p = '/'; /* change leading '\' to '/' */ } while(p) { q = strchr(p, '\\'); if(q) { n = q-p; q++; } else { n = strlen(p); q = 0; } if(n) { Bputc(&obuf, ANAME); Bputc(&obuf, D_FILE); /* type */ Bputc(&obuf, 1); /* sym */ Bputc(&obuf, '<'); Bwrite(&obuf, p, n); Bputc(&obuf, 0); } p = q; if(p == 0 && op) { p = op; op = 0; } } g.offset = h->offset; Bputc(&obuf, AHISTORY); Bputc(&obuf, Always); Bputc(&obuf, 0); Bputc(&obuf, h->line); Bputc(&obuf, h->line>>8); Bputc(&obuf, h->line>>16); Bputc(&obuf, h->line>>24); zaddr(&nullgen, 0); zaddr(&g, 0); } } /* * Stub file for wait(2) so that mywait(2) (which is not used * in the Nt implementation) in file cc/compat.c is happy. */ int wait(int *stat_loc) { return 0; } #include "../cc/lexbody" #include "../cc/macbody"