diff options
Diffstat (limited to 'src/cmd/5a/lex.c')
-rw-r--r-- | src/cmd/5a/lex.c | 538 |
1 files changed, 0 insertions, 538 deletions
diff --git a/src/cmd/5a/lex.c b/src/cmd/5a/lex.c deleted file mode 100644 index 6f56922a4e..0000000000 --- a/src/cmd/5a/lex.c +++ /dev/null @@ -1,538 +0,0 @@ -// Inferno utils/5a/lex.c -// http://code.google.com/p/inferno-os/source/browse/utils/5a/lex.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#define EXTERN -#include <u.h> -#include <libc.h> -#include "a.h" -#include "y.tab.h" - -enum -{ - Plan9 = 1<<0, - Unix = 1<<1, - Windows = 1<<2, -}; - -int -systemtype(int sys) -{ -#ifdef _WIN32 - return sys&Windows; -#else - return sys&Plan9; -#endif -} - -int -Lconv(Fmt *fp) -{ - return linklinefmt(ctxt, fp); -} - -void -dodef(char *p) -{ - if(nDlist%8 == 0) - Dlist = allocn(Dlist, nDlist*sizeof(char *), - 8*sizeof(char *)); - Dlist[nDlist++] = p; -} - -void -usage(void) -{ - print("usage: %ca [options] file.c...\n", thechar); - flagprint(1); - errorexit(); -} - -void -main(int argc, char *argv[]) -{ - char *p; - - thechar = '5'; - thestring = "arm"; - - ctxt = linknew(&linkarm); - ctxt->diag = yyerror; - ctxt->bso = &bstdout; - ctxt->enforce_data_order = 1; - Binit(&bstdout, 1, OWRITE); - listinit5(); - fmtinstall('L', Lconv); - - // Allow GOARCH=thestring or GOARCH=thestringsuffix, - // but not other values. - p = getgoarch(); - if(strncmp(p, thestring, strlen(thestring)) != 0) - sysfatal("cannot use %cc with GOARCH=%s", thechar, p); - - ensuresymb(NSYMB); - memset(debug, 0, sizeof(debug)); - cinit(); - outfile = 0; - setinclude("."); - - flagfn1("D", "name[=value]: add #define", dodef); - flagfn1("I", "dir: add dir to include path", setinclude); - flagcount("S", "print assembly and machine code", &debug['S']); - flagcount("m", "debug preprocessor macros", &debug['m']); - flagstr("o", "file: set output file", &outfile); - flagstr("trimpath", "prefix: remove prefix from recorded source file paths", &ctxt->trimpath); - - flagparse(&argc, &argv, usage); - ctxt->debugasm = debug['S']; - - if(argc < 1) - usage(); - if(argc > 1){ - print("can't assemble multiple files\n"); - errorexit(); - } - - if(assemble(argv[0])) - errorexit(); - Bflush(&bstdout); - if(nerrors > 0) - errorexit(); - exits(0); -} - -int -assemble(char *file) -{ - char *ofile, *p; - int i, of; - - ofile = alloc(strlen(file)+3); // +3 for .x\0 (x=thechar) - strcpy(ofile, file); - p = utfrrune(ofile, '/'); - if(p) { - include[0] = ofile; - *p++ = 0; - } else - p = ofile; - if(outfile == 0) { - outfile = p; - if(outfile){ - p = utfrrune(outfile, '.'); - if(p) - if(p[1] == 's' && p[2] == 0) - p[0] = 0; - p = utfrune(outfile, 0); - p[0] = '.'; - p[1] = thechar; - p[2] = 0; - } else - outfile = "/dev/null"; - } - - of = create(outfile, OWRITE, 0664); - if(of < 0) { - yyerror("%ca: cannot create %s", thechar, outfile); - errorexit(); - } - Binit(&obuf, of, OWRITE); - Bprint(&obuf, "go object %s %s %s\n", getgoos(), getgoarch(), getgoversion()); - Bprint(&obuf, "!\n"); - - for(pass = 1; pass <= 2; pass++) { - pinit(file); - for(i=0; i<nDlist; i++) - dodefine(Dlist[i]); - yyparse(); - cclean(); - if(nerrors) - return nerrors; - } - - writeobj(ctxt, &obuf); - Bflush(&obuf); - return 0; -} - -struct -{ - char *name; - ushort type; - ushort value; -} itab[] = -{ - "SP", LSP, NAME_AUTO, - "SB", LSB, NAME_EXTERN, - "FP", LFP, NAME_PARAM, - "PC", LPC, TYPE_BRANCH, - - "R", LR, REG_F0, - - "R0", LREG, REG_R0, - "R1", LREG, REG_R1, - "R2", LREG, REG_R2, - "R3", LREG, REG_R3, - "R4", LREG, REG_R4, - "R5", LREG, REG_R5, - "R6", LREG, REG_R6, - "R7", LREG, REG_R7, - "R8", LREG, REG_R8, - "R9", LREG, REG_R9, - "g", LREG, REG_R10, // avoid unintentionally clobber g using R10 - "R11", LREG, REG_R11, - "R12", LREG, REG_R12, - "R13", LREG, REG_R13, - "R14", LREG, REG_R14, - "R15", LREG, REG_R15, - - "F", LF, REG_F0, - - "F0", LFREG, REG_F0, - "F1", LFREG, REG_F1, - "F2", LFREG, REG_F2, - "F3", LFREG, REG_F3, - "F4", LFREG, REG_F4, - "F5", LFREG, REG_F5, - "F6", LFREG, REG_F6, - "F7", LFREG, REG_F7, - "F8", LFREG, REG_F8, - "F9", LFREG, REG_F9, - "F10", LFREG, REG_F10, - "F11", LFREG, REG_F11, - "F12", LFREG, REG_F12, - "F13", LFREG, REG_F13, - "F14", LFREG, REG_F14, - "F15", LFREG, REG_F15, - - "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, REG_CPSR, - "SPSR", LPSR, REG_SPSR, - - "FPSR", LFCR, REG_FPSR, - "FPCR", LFCR, REG_FPCR, - - ".EQ", LCOND, C_SCOND_EQ, - ".NE", LCOND, C_SCOND_NE, - ".CS", LCOND, C_SCOND_HS, - ".HS", LCOND, C_SCOND_HS, - ".CC", LCOND, C_SCOND_LO, - ".LO", LCOND, C_SCOND_LO, - ".MI", LCOND, C_SCOND_MI, - ".PL", LCOND, C_SCOND_PL, - ".VS", LCOND, C_SCOND_VS, - ".VC", LCOND, C_SCOND_VC, - ".HI", LCOND, C_SCOND_HI, - ".LS", LCOND, C_SCOND_LS, - ".GE", LCOND, C_SCOND_GE, - ".LT", LCOND, C_SCOND_LT, - ".GT", LCOND, C_SCOND_GT, - ".LE", LCOND, C_SCOND_LE, - ".AL", LCOND, C_SCOND_NONE, - - ".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, - "ORR", LTYPE1, AORR, - "BIC", LTYPE1, ABIC, - - "SLL", LTYPE1, ASLL, - "SRL", LTYPE1, ASRL, - "SRA", LTYPE1, ASRA, - - "MUL", LTYPE1, AMUL, - "MULA", LTYPEN, AMULA, - "DIV", LTYPE1, ADIV, - "MOD", LTYPE1, AMOD, - - "MULL", LTYPEM, AMULL, - "MULAL", LTYPEM, AMULAL, - "MULLU", LTYPEM, AMULLU, - "MULALU", LTYPEM, AMULALU, - - "MVN", LTYPE2, AMVN, /* op2 ignored */ - - "MOVB", LTYPE3, AMOVB, - "MOVBU", LTYPE3, AMOVBU, - "MOVH", LTYPE3, AMOVH, - "MOVHU", LTYPE3, AMOVHU, - "MOVW", LTYPE3, AMOVW, - - "MOVD", LTYPE3, AMOVD, - "MOVDF", LTYPE3, AMOVDF, - "MOVDW", LTYPE3, AMOVDW, - "MOVF", LTYPE3, AMOVF, - "MOVFD", LTYPE3, AMOVFD, - "MOVFW", LTYPE3, AMOVFW, - "MOVWD", LTYPE3, AMOVWD, - "MOVWF", LTYPE3, AMOVWF, - - "LDREX", LTYPE3, ALDREX, - "LDREXD", LTYPE3, ALDREXD, - "STREX", LTYPE9, ASTREX, - "STREXD", LTYPE9, ASTREXD, - -/* - "NEGF", LTYPEI, ANEGF, - "NEGD", LTYPEI, ANEGD, - "SQTF", LTYPEI, ASQTF, - "SQTD", LTYPEI, ASQTD, - "RNDF", LTYPEI, ARNDF, - "RNDD", LTYPEI, ARNDD, - "URDF", LTYPEI, AURDF, - "URDD", LTYPEI, AURDD, - "NRMF", LTYPEI, ANRMF, - "NRMD", LTYPEI, ANRMD, -*/ - - "ABSF", LTYPEI, AABSF, - "ABSD", LTYPEI, AABSD, - "SQRTF", LTYPEI, ASQRTF, - "SQRTD", LTYPEI, ASQRTD, - "CMPF", LTYPEL, ACMPF, - "CMPD", LTYPEL, ACMPD, - "ADDF", LTYPEK, AADDF, - "ADDD", LTYPEK, AADDD, - "SUBF", LTYPEK, ASUBF, - "SUBD", LTYPEK, ASUBD, - "MULF", LTYPEK, AMULF, - "MULD", LTYPEK, AMULD, - "DIVF", LTYPEK, ADIVF, - "DIVD", LTYPEK, ADIVD, - - "B", LTYPE4, AB, - "BL", LTYPE4, ABL, - "BX", LTYPEBX, ABX, - - "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, - "BCASE", LTYPE5, ABCASE, - - "SWI", LTYPE6, ASWI, - - "CMP", LTYPE7, ACMP, - "TST", LTYPE7, ATST, - "TEQ", LTYPE7, ATEQ, - "CMN", LTYPE7, ACMN, - - "MOVM", LTYPE8, AMOVM, - - "SWPBU", LTYPE9, ASWPBU, - "SWPW", LTYPE9, ASWPW, - - "RET", LTYPEA, ARET, - "RFE", LTYPEA, ARFE, - - "TEXT", LTYPEB, ATEXT, - "GLOBL", LGLOBL, AGLOBL, - "DATA", LTYPEC, ADATA, - "CASE", LTYPED, ACASE, - "END", LTYPEE, AEND, - "WORD", LTYPEH, AWORD, - "NOP", LTYPEI, ANOP, - - "MCR", LTYPEJ, 0, - "MRC", LTYPEJ, 1, - - "PLD", LTYPEPLD, APLD, - "UNDEF", LTYPEE, AUNDEF, - "CLZ", LTYPE2, ACLZ, - - "MULWT", LTYPE1, AMULWT, - "MULWB", LTYPE1, AMULWB, - "MULAWT", LTYPEN, AMULAWT, - "MULAWB", LTYPEN, AMULAWB, - - "USEFIELD", LTYPEN, AUSEFIELD, - "PCDATA", LTYPEPC, APCDATA, - "FUNCDATA", LTYPEF, AFUNCDATA, - - 0 -}; - -void -cinit(void) -{ - Sym *s; - int i; - - nullgen.type = TYPE_NONE; - nullgen.name = NAME_NONE; - - nerrors = 0; - iostack = I; - iofree = I; - peekc = IGN; - nhunk = 0; - for(i=0; i<NHASH; i++) - hash[i] = S; - for(i=0; itab[i].name; i++) { - s = slookup(itab[i].name); - s->type = itab[i].type; - s->value = itab[i].value; - } -} - -void -syminit(Sym *s) -{ - - s->type = LNAME; - s->value = 0; -} - -int -isreg(Addr *g) -{ - - USED(g); - return 1; -} - -void -cclean(void) -{ - outcode(AEND, Always, &nullgen, 0, &nullgen); -} - -static int bcode[] = -{ - ABEQ, - ABNE, - ABCS, - ABCC, - ABMI, - ABPL, - ABVS, - ABVC, - ABHI, - ABLS, - ABGE, - ABLT, - ABGT, - ABLE, - AB, - ANOP, -}; - -void -outcode(int a, int scond, Addr *g1, int reg, Addr *g2) -{ - Prog *p; - Plist *pl; - - /* hack to make B.NE etc. work: turn it into the corresponding conditional */ - if(a == AB){ - a = bcode[(scond^C_SCOND_XOR)&0xf]; - scond = (scond & ~0xf) | C_SCOND_NONE; - } - - if(pass == 1) - goto out; - - p = malloc(sizeof *p); - memset(p, 0, sizeof *p); - p->as = a; - p->lineno = stmtline; - p->scond = scond; - p->from = *g1; - p->reg = reg; - p->to = *g2; - p->pc = pc; - - if(lastpc == nil) { - pl = linknewplist(ctxt); - pl->firstpc = p; - } else - lastpc->link = p; - lastpc = p; - -out: - if(a != AGLOBL && a != ADATA) - pc++; -} - -#include "../cc/lexbody" -#include "../cc/macbody" |