|
|
1.1 ! root 1: /* C compiler: back-end structures */ ! 2: ! 3: #define NODAG 0 ! 4: #define RX 2 /* symbol holding target register */ ! 5: #define MAXSYMS 4 /* symbols/node */ ! 6: #define MAXINTS 5 /* codes/node */ ! 7: #define MAXKIDS 6 /* children/node */ ! 8: ! 9: #ifdef DEBUG ! 10: #define dumptree(x,y) dumptree1(x,y,-1,0) ! 11: #else ! 12: #define dumptree(x,y) ! 13: #endif ! 14: ! 15: typedef struct regnode *Regnode; ! 16: ! 17: typedef struct { /* back end's block record */ ! 18: int off; /* offset for locals */ ! 19: unsigned freemask[3]; /* free registers */ ! 20: } Env; ! 21: ! 22: typedef struct { ! 23: char *exportfmt; ! 24: unsigned twoop:1; ! 25: unsigned char maxunalignedload; ! 26: char *segnames[5]; ! 27: dclproto(void (*doarg),(Node)); ! 28: dclproto(void (*docall),(Node)); ! 29: dclproto(void (*blkfetch),(int, int, int, int)); ! 30: dclproto(void (*blkloop),(int, int, int, int, int, int[])); ! 31: dclproto(void (*blkstore),(int, int, int, int)); ! 32: dclproto(void (*final),(Node)); ! 33: dclproto(void (*rewrite),(Node)); ! 34: dclproto(void (*emitspecial),(Node)); ! 35: } Xinterface; ! 36: ! 37: struct real { /* canonical real */ ! 38: unsigned sign; ! 39: unsigned exp; /* unbiased exponent */ ! 40: unsigned msb; /* most significant fraction bits */ ! 41: unsigned lsb; /* least significant fraction bits */ ! 42: }; ! 43: ! 44: struct regnode { /* register */ ! 45: unsigned char regtype; /* type extension for loads */ ! 46: unsigned char regset; /* register set */ ! 47: unsigned char regnum; /* register number */ ! 48: int count; /* number of uses left; zero if free; negative if register vbl */ ! 49: unsigned mask; /* underlying basic registers */ ! 50: Node node; /* node assigned to this register */ ! 51: Symbol link; /* next register in this class */ ! 52: Symbol next; /* next register in any class */ ! 53: }; ! 54: ! 55: typedef struct { /* back end's node fields */ ! 56: unsigned loadaddr:1; ! 57: unsigned sideeffect:1; ! 58: unsigned unavailable:1; ! 59: unsigned zap0:1; ! 60: unsigned linearized:1; ! 61: unsigned linfrontier:1; ! 62: unsigned lininterior:1; ! 63: unsigned registered:1; ! 64: unsigned listed:1; ! 65: unsigned iscall:1; ! 66: unsigned isarg:1; ! 67: unsigned isvararg:1; ! 68: unsigned frontier:1; ! 69: unsigned char ints[MAXINTS]; /* target-specific function, type and addressing codes */ ! 70: char perm[MAXKIDS]; ! 71: unsigned char delay; ! 72: Symbol rtarget; ! 73: Node args; ! 74: Node next; /* next node in output order */ ! 75: } Xnode; ! 76: ! 77: typedef struct { /* back end's symbol fields */ ! 78: char *name; /* name for back end */ ! 79: int offset; /* offset for locals, formals */ ! 80: Symbol regvar; /* register allocated to this symbol, if any */ ! 81: Symbol nextregvar; /* links function's register variables */ ! 82: Regnode regnode; /* mkregs's register id, if any */ ! 83: unsigned int eaddr; /* effective address of symbol */ ! 84: } Xsymbol; ! 85: ! 86: #define atst(p) ((p)->x.loadaddr) ! 87: #define isregvar(p) ((p)->sclass == REGISTER) ! 88: #define setreg(p,r) ((p)->syms[RX]=r) ! 89: #define symeaddr(s) ((s)->x.eaddr) ! 90: ! 91: /* gen.c */ ! 92: dclproto(extern void blockbeg,(Env *)); ! 93: dclproto(extern void blockend,(Env *)); ! 94: dclproto(extern void export,(Symbol)); ! 95: dclproto(extern Node gen,(Node)); ! 96: dclproto(extern void progend,(void)); ! 97: ! 98: dclproto(extern int aset,(Node, int)); ! 99: dclproto(extern int bitcount,(unsigned)); ! 100: dclproto(extern void blkcopy,(int, int, int, int, int, int[])); ! 101: dclproto(extern void blkunroll,(int, int, int, int, int, int, int[])); ! 102: dclproto(extern void docall,(Node)); ! 103: dclproto(extern void dumpregs,(char *, char *, char *)); ! 104: dclproto(extern void dumptree1,(Node, int, int, int)); ! 105: dclproto(extern void freeregvars,(void)); ! 106: dclproto(extern void genascii,(char*, char*, int, char*)); ! 107: dclproto(extern int getint,(Symbol)); ! 108: dclproto(extern Regnode getregnode,(Symbol)); ! 109: dclproto(extern int getregset,(Symbol)); ! 110: dclproto(extern int getregvar,(Symbol, Symbol)); ! 111: dclproto(extern unsigned getunsigned,(Symbol)); ! 112: dclproto(extern void initfunc,(int, int, int)); ! 113: dclproto(extern int lop,(Node, int, int)); ! 114: dclproto(extern int mkactual,(int, int, int)); ! 115: dclproto(extern int mkauto,(Symbol, int)); ! 116: dclproto(extern Symbol mkregs,(char *, int, int, int, int, int, int, Symbol)); ! 117: dclproto(extern void mvregvars,(void)); ! 118: dclproto(extern void parseflags,(int, char **)); ! 119: dclproto(extern int range,(int, int)); ! 120: dclproto(extern int regchain,(Node)); ! 121: dclproto(extern unsigned regloc,(Symbol)); ! 122: dclproto(extern int rmcopy,(Node)); ! 123: dclproto(extern void rtarget,(Node, int, Symbol)); ! 124: dclproto(extern void setseg,(int)); ! 125: dclproto(extern void spacen,(int, char *)); ! 126: dclproto(extern void spill,(unsigned, int, Node)); ! 127: extern int argbuildsize; ! 128: extern int argoffset; ! 129: extern char **asmstr[MAXINTS]; ! 130: extern unsigned eemask[]; ! 131: extern unsigned freemask[]; ! 132: extern Node last; ! 133: extern int maxoffset; ! 134: extern int ncalls; ! 135: extern int offset; ! 136: extern int bflag, dflag, kflag, pflag, rflag; ! 137: extern int nregsets; ! 138: extern char **opcodes; ! 139: extern Symbol regs; ! 140: extern Symbol regvars; ! 141: extern Symbol rmap[]; ! 142: extern int savebase[]; ! 143: extern unsigned savemask[]; ! 144: extern unsigned tempmask[]; ! 145: extern unsigned tmask[]; ! 146: extern unsigned usedmask[]; ! 147: extern unsigned vmask[]; ! 148: extern int dalign, salign; ! 149: extern int genx; ! 150: /* decode.c */ ! 151: dclproto(struct real decode,(int, double)); ! 152: #ifdef DEBUG ! 153: #define debug(f,x) if(f)x ! 154: #else ! 155: #define debug(f,x) ! 156: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.