|
|
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.