123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702 |
- #include "lib9.h"
- #include "bio.h"
- #include "isa.h"
- #include "mathi.h"
- /* internal dis ops */
- #define IEXC MAXDIS
- #define IEXC0 (MAXDIS+1)
- #define INOOP (MAXDIS+2)
- /* temporary */
- #define LDT 1
- #ifndef Extern
- #define Extern extern
- #endif
- #define YYMAXDEPTH 200
- typedef struct Addr Addr;
- typedef struct Case Case;
- typedef struct Decl Decl;
- typedef struct Desc Desc;
- typedef struct Dlist Dlist;
- typedef struct Except Except;
- typedef struct File File;
- typedef struct Fline Fline;
- typedef struct Inst Inst;
- typedef struct Label Label;
- typedef struct Line Line;
- typedef struct Node Node;
- typedef struct Ok Ok;
- typedef struct Src Src;
- typedef struct Sym Sym;
- typedef struct Szal Szal;
- typedef struct Tattr Tattr;
- typedef struct Teq Teq;
- typedef struct Tpair Tpair;
- typedef struct Type Type;
- typedef struct Typelist Typelist;
- typedef double Real;
- typedef vlong Long;
- enum
- {
- STemp = NREG * IBY2WD,
- RTemp = STemp+IBY2WD,
- DTemp = RTemp+IBY2WD,
- MaxTemp = DTemp+IBY2WD,
- MaxReg = 1<<16,
- MaxAlign = IBY2LG,
- StrSize = 256,
- NumSize = 32, /* max length of printed */
- MaxIncPath = 32, /* max directories in include path */
- MaxScope = 64, /* max nested {} */
- MaxInclude = 32, /* max nested include "" */
- ScopeBuiltin = 0,
- ScopeNils = 1,
- ScopeGlobal = 2
- };
- /*
- * return tuple from expression type checking
- */
- struct Ok
- {
- int ok;
- int allok;
- };
- /*
- * return tuple from type sizing
- */
- struct Szal
- {
- int size;
- int align;
- };
- /*
- * return tuple for file/line numbering
- */
- struct Fline
- {
- File *file;
- int line;
- };
- struct File
- {
- char *name;
- int abs; /* absolute line of start of the part of file */
- int off; /* offset to line in the file */
- int in; /* absolute line where included */
- char *act; /* name of real file with #line fake file */
- int actoff; /* offset from fake line to real line */
- int sbl; /* symbol file number */
- };
- struct Line
- {
- int line;
- int pos; /* character within the line */
- };
- struct Src
- {
- Line start;
- Line stop;
- };
- enum
- {
- Aimm, /* immediate */
- Amp, /* global */
- Ampind, /* global indirect */
- Afp, /* activation frame */
- Afpind, /* frame indirect */
- Apc, /* branch */
- Adesc, /* type descriptor immediate */
- Aoff, /* offset in module description table */
- Anoff, /* above encoded as -ve */
- Aerr, /* error */
- Anone, /* no operand */
- Aldt, /* linkage descriptor table immediate */
- Aend
- };
- struct Addr
- {
- long reg;
- long offset;
- Decl *decl;
- };
- struct Inst
- {
- Src src;
- ushort op;
- long pc;
- uchar reach; /* could a control path reach this instruction? */
- uchar sm; /* operand addressing modes */
- uchar mm;
- uchar dm;
- Addr s; /* operands */
- Addr m;
- Addr d;
- Inst *branch; /* branch destination */
- Inst *next;
- int block; /* blocks nested inside */
- };
- struct Case
- {
- int nlab;
- int nsnd;
- long offset; /* offset in mp */
- Label *labs;
- Node *wild; /* if nothing matches */
- Inst *iwild;
- };
- struct Label
- {
- Node *node;
- char isptr; /* true if the labelled alt channel is a pointer */
- Node *start; /* value in range [start, stop) => code */
- Node *stop;
- Inst *inst;
- };
- enum
- {
- Dtype,
- Dfn,
- Dglobal,
- Darg,
- Dlocal,
- Dconst,
- Dfield,
- Dtag, /* pick tags */
- Dimport, /* imported identifier */
- Dunbound, /* unbound identified */
- Dundef,
- Dwundef, /* undefined, but don't whine */
- Dend
- };
- struct Decl
- {
- Src src; /* where declaration */
- Sym *sym;
- uchar store; /* storage class */
- uchar nid; /* block grouping for locals */
- schar caninline; /* inline function */
- uchar das; /* declared with := */
- Decl *dot; /* parent adt or module */
- Type *ty;
- int refs; /* number of references */
- long offset;
- int tag; /* union tag */
- uchar scope; /* in which it was declared */
- uchar handler; /* fn has exception handler in body */
- Decl *next; /* list in same scope, field or argument list, etc. */
- Decl *old; /* declaration of the symbol in enclosing scope */
- Node *eimport; /* expr from which imported */
- Decl *importid; /* identifier imported */
- Decl *timport; /* stack of identifiers importing a type */
- Node *init; /* data initialization */
- int tref; /* 1 => is a tmp; >=2 => tmp in use */
- char cycle; /* can create a cycle */
- char cyc; /* so labelled in source */
- char cycerr; /* delivered an error message for cycle? */
- char implicit; /* implicit first argument in an adt? */
- Decl *iface; /* used external declarations in a module */
- Decl *locals; /* locals for a function */
- Decl *link; /* pointer to parent function or function argument or local share or parent type dec */
- Inst *pc; /* start of function */
- /* Inst *endpc; */ /* limit of function - unused */
- Desc *desc; /* heap descriptor */
- };
- struct Desc
- {
- int id; /* dis type identifier */
- uchar used; /* actually used in output? */
- uchar *map; /* byte map of pointers */
- long size; /* length of the object */
- long nmap; /* length of good bytes in map */
- Desc *next;
- };
- struct Dlist
- {
- Decl *d;
- Dlist *next;
- };
- struct Except
- {
- Inst *p1; /* first pc covered */
- Inst *p2; /* last pc not covered */
- Case *c; /* exception case instructions */
- Decl *d; /* exception definition if any */
- Node *zn; /* list of nodes to zero in handler */
- Desc *desc; /* descriptor map for above */
- int ne; /* number of exceptions (ie not strings) in case */
- Except *next;
- };
- struct Sym
- {
- ushort token;
- char *name;
- int len;
- int hash;
- Sym *next;
- Decl *decl;
- Decl *unbound; /* place holder for unbound symbols */
- };
- /*
- * ops for nodes
- */
- enum
- {
- Oadd = 1,
- Oaddas,
- Oadr,
- Oadtdecl,
- Oalt,
- Oand,
- Oandand,
- Oandas,
- Oarray,
- Oas,
- Obreak,
- Ocall,
- Ocase,
- Ocast,
- Ochan,
- Ocomma,
- Ocomp,
- Ocondecl,
- Ocons,
- Oconst,
- Ocont,
- Odas,
- Odec,
- Odiv,
- Odivas,
- Odo,
- Odot,
- Oelem,
- Oeq,
- Oexcept,
- Oexdecl,
- Oexit,
- Oexp,
- Oexpas,
- Oexstmt,
- Ofielddecl,
- Ofnptr,
- Ofor,
- Ofunc,
- Ogeq,
- Ogt,
- Ohd,
- Oif,
- Oimport,
- Oinc,
- Oind,
- Oindex,
- Oinds,
- Oindx,
- Oinv,
- Ojmp,
- Olabel,
- Olen,
- Oleq,
- Oload,
- Olsh,
- Olshas,
- Olt,
- Omdot,
- Omod,
- Omodas,
- Omoddecl,
- Omul,
- Omulas,
- Oname,
- Oneg,
- Oneq,
- Onot,
- Onothing,
- Oor,
- Ooras,
- Ooror,
- Opick,
- Opickdecl,
- Opredec,
- Opreinc,
- Oraise,
- Orange,
- Orcv,
- Oref,
- Oret,
- Orsh,
- Orshas,
- Oscope,
- Oself,
- Oseq,
- Oslice,
- Osnd,
- Ospawn,
- Osub,
- Osubas,
- Otagof,
- Otl,
- Otuple,
- Otype,
- Otypedecl,
- Oused,
- Ovardecl,
- Ovardecli,
- Owild,
- Oxor,
- Oxoras,
- Oend
- };
- /*
- * moves
- */
- enum
- {
- Mas,
- Mcons,
- Mhd,
- Mtl,
- Mend
- };
- /*
- * addressability
- */
- enum
- {
- Rreg, /* v(fp) */
- Rmreg, /* v(mp) */
- Roff, /* $v */
- Rnoff, /* $v encoded as -ve */
- Rdesc, /* $v */
- Rdescp, /* $v */
- Rconst, /* $v */
- Ralways, /* preceeding are always addressable */
- Radr, /* v(v(fp)) */
- Rmadr, /* v(v(mp)) */
- Rcant, /* following are not quite addressable */
- Rpc, /* branch address */
- Rmpc, /* cross module branch address */
- Rareg, /* $v(fp) */
- Ramreg, /* $v(mp) */
- Raadr, /* $v(v(fp)) */
- Ramadr, /* $v(v(mp)) */
- Rldt, /* $v */
- Rend
- };
- #define PARENS 1
- #define TEMP 2
- #define FNPTRA 4 /* argument */
- #define FNPTR2 8 /* 2nd parameter */
- #define FNPTRN 16 /* use -ve offset */
- #define FNPTR (FNPTRA|FNPTR2|FNPTRN)
- struct Node
- {
- Src src;
- uchar op;
- uchar addable;
- uchar flags;
- uchar temps;
- Node *left;
- Node *right;
- Type *ty;
- Decl *decl;
- Long val; /* for Oconst */
- Real rval; /* for Oconst */
- };
- enum
- {
- /*
- * types visible to limbo
- */
- Tnone = 0,
- Tadt,
- Tadtpick, /* pick case of an adt */
- Tarray,
- Tbig, /* 64 bit int */
- Tbyte, /* 8 bit unsigned int */
- Tchan,
- Treal,
- Tfn,
- Tint, /* 32 bit int */
- Tlist,
- Tmodule,
- Tref,
- Tstring,
- Ttuple,
- Texception,
- Tfix,
- Tpoly,
- /*
- * internal use types
- */
- Tainit, /* array initializers */
- Talt, /* alt channels */
- Tany, /* type of nil */
- Tarrow, /* unresolved ty->id types */
- Tcase, /* case labels */
- Tcasel, /* case big labels */
- Tcasec, /* case string labels */
- Tdot, /* unresolved ty.id types */
- Terror,
- Tgoto, /* goto labels */
- Tid, /* id with unknown type */
- Tiface, /* module interface */
- Texcept, /* exception handler tables */
- Tinst, /* instantiated adt */
- Tend
- };
- enum
- {
- OKbind = 1 << 0, /* type decls are bound */
- OKverify = 1 << 1, /* type looks ok */
- OKsized = 1 << 2, /* started figuring size */
- OKref = 1 << 3, /* recorded use of type */
- OKclass = 1 << 4, /* equivalence class found */
- OKcyc = 1 << 5, /* checked for cycles */
- OKcycsize = 1 << 6, /* checked for cycles and size */
- OKmodref = 1 << 7, /* started checking for a module handle */
- OKmask = 0xff,
- /*
- * recursive marks
- */
- TReq = 1 << 0,
- TRcom = 1 << 1,
- TRcyc = 1 << 2,
- TRvis = 1 << 3,
- };
- /* type flags */
- #define FULLARGS 1 /* all hidden args added */
- #define INST 2 /* instantiated adt */
- #define CYCLIC 4 /* cyclic type */
- #define POLY 8 /* polymorphic types inside */
- #define NOPOLY 16 /* no polymorphic types inside */
- struct Type
- {
- Src src;
- uchar kind;
- uchar varargs; /* if a function, ends with vargs? */
- uchar ok; /* set when type is verified */
- uchar linkall; /* put all iface fns in external linkage? */
- uchar rec; /* in the middle of recursive type */
- uchar cons; /* exception constant */
- uchar align; /* alignment in bytes */
- uchar flags;
- int sbl; /* slot in .sbl adt table */
- long sig; /* signature for dynamic type check */
- long size; /* storage required, in bytes */
- Decl *decl;
- Type *tof;
- Decl *ids;
- Decl *tags; /* tagged fields in an adt */
- Decl *polys; /* polymorphic fields in fn or adt */
- Case *cse; /* case or goto labels */
- Type *teq; /* temporary equiv class for equiv checking */
- Type *tcom; /* temporary equiv class for compat checking */
- Teq *eq; /* real equiv class */
- Node *val; /* for Tfix, Tfn, Tadt only */
- union {
- Node *eraises; /* for Tfn only */
- Typelist *tlist; /* for Tinst only */
- Tpair *tmap; /* for Tadt only */
- } u;
- };
- /*
- * type equivalence classes
- */
- struct Teq
- {
- int id; /* for signing */
- Type *ty; /* an instance of the class */
- Teq *eq; /* used to link eq sets */
- };
- struct Tattr
- {
- char isptr;
- char refable;
- char conable;
- char big;
- char vis; /* type visible to users */
- };
- enum {
- Sother,
- Sloop,
- Sscope
- };
- struct Tpair
- {
- Type *t1;
- Type *t2;
- Tpair *nxt;
- };
- struct Typelist
- {
- Type *t;
- Typelist *nxt;
- };
-
- Extern Decl **adts;
- Extern Sym *anontupsym; /* name assigned to all anonymouse tuples */
- Extern int arrayz;
- Extern int asmsym; /* generate symbols in assembly language? */
- Extern Biobuf *bins[MaxInclude];
- Extern int blocks;
- Extern Biobuf *bout; /* output file */
- Extern Biobuf *bsym; /* symbol output file; nil => no sym out */
- Extern double canonnan; /* standard nan */
- Extern uchar casttab[Tend][Tend]; /* instruction to cast from [1] to [2] */
- Extern long constval;
- Extern Decl *curfn;
- Extern char debug[256];
- Extern Desc *descriptors; /* list of all possible descriptors */
- Extern int dontcompile; /* dis header flag */
- Extern int dowarn;
- Extern char *emitcode; /* emit stub routines for system module functions */
- Extern int emitdyn; /* emit stub routines as above but for dynamic modules */
- Extern int emitstub; /* emit type and call frames for system modules */
- Extern char *emittab; /* emit table of runtime functions for this module */
- Extern int errors;
- Extern char escmap[256];
- Extern Inst *firstinst;
- Extern long fixss; /* set extent from command line */
- Extern Decl *fndecls;
- Extern Decl **fns;
- Extern int gendis; /* generate dis or asm? */
- Extern Decl *impdecl; /* id of implementation module or union if many */
- Extern Dlist *impdecls; /* id(s) of implementation module(s) */
- /* Extern Sym *impmod; */ /* name of implementation module */
- Extern Decl *impmods; /* name of implementation module(s) */
- Extern Decl *iota;
- Extern uchar isbyteinst[256];
- Extern int isfatal;
- Extern int isrelop[Oend];
- Extern uchar isused[Oend];
- Extern Inst *lastinst;
- Extern int lenadts;
- Extern int maxerr;
- Extern int maxlabdep; /* maximum nesting of breakable/continuable statements */
- Extern long maxstack; /* max size of a stack frame called */
- Extern int mustcompile; /* dis header flag */
- Extern int oldcycles;
- Extern int nadts;
- Extern int newfnptr; /* ISELF and -ve indices */
- Extern int nfns;
- Extern Decl *nildecl; /* declaration for limbo's nil */
- Extern int nlabel;
- Extern int dontinline;
- Extern Line noline;
- Extern Src nosrc;
- Extern uchar opcommute[Oend];
- Extern int opind[Tend];
- Extern uchar oprelinvert[Oend];
- Extern int optims;
- Extern char *outfile;
- Extern Type *precasttab[Tend][Tend];
- Extern int scope;
- Extern Decl *selfdecl; /* declaration for limbo's self */
- Extern uchar sideeffect[Oend];
- Extern char *signdump; /* dump sig for this fn */
- Extern int superwarn;
- Extern char *symfile;
- Extern Type *tany;
- Extern Type *tbig;
- Extern Type *tbyte;
- Extern Type *terror;
- Extern Type *tint;
- Extern Type *tnone;
- Extern Type *treal;
- Extern Node *tree;
- Extern Type *tstring;
- Extern Type *texception;
- Extern Type *tunknown;
- Extern Type *tfnptr;
- Extern Type *rtexception;
- Extern char unescmap[256];
- Extern Src unifysrc;
- Extern Node znode;
- extern int *blockstack;
- extern int blockdep;
- extern int nblocks;
- extern File **files;
- extern int nfiles;
- extern uchar chantab[Tend];
- extern uchar disoptab[Oend+1][7];
- extern char *instname[];
- extern char *kindname[Tend];
- extern uchar movetab[Mend][Tend];
- extern char *opname[];
- extern int setisbyteinst[];
- extern int setisused[];
- extern int setsideeffect[];
- extern char *storename[Dend];
- extern int storespace[Dend];
- extern Tattr tattr[Tend];
- #include "fns.h"
- #pragma varargck type "D" Decl*
- #pragma varargck type "I" Inst*
- #pragma varargck type "K" Decl*
- #pragma varargck type "k" Decl*
- #pragma varargck type "L" Line
- #pragma varargck type "M" Desc*
- #pragma varargck type "n" Node*
- #pragma varargck type "O" int
- #pragma varargck type "O" uint
- #pragma varargck type "g" double
- #pragma varargck type "Q" Node*
- #pragma varargck type "R" Type*
- #pragma varargck type "T" Type*
- #pragma varargck type "t" Type*
- #pragma varargck type "U" Src
- #pragma varargck type "v" Node*
- #pragma varargck type "V" Node*
|