|
|
1.1 root 1: #include "mfile2.h"
2: extern struct symtab { /* ripped untimely from mfile1.h */
3: char *sname;
4: TWORD stype; /* type word */
5:
6: char sclass; /* storage class */
7: char slevel; /* scope level */
8: char sflags; /* flags for set, use, hidden, mos, etc. */
9: int offset; /* offset or value */
10: short dimoff; /* offset into the dimension table */
11: short sizoff; /* offset into the size table */
12: short suse; /* line number of last use of the variable */
13: struct symtab *scopelink; /* chain of symbols at same level */
14: } stab[];
15:
16: #define BINOP 1000
17: #define ARG 1001
18: #define UCALL 1002
19: #define BINARY 1003
20: #define COPY 1004
21: #define ENTRY 1005
22: #define LOCCTR 1006
23: #define LXINFO 1008
24: #define URETURN 1010
25: #define USTCALL 1011
26: #define STRANGE 1012
27: struct init {
28: int op;
29: int type;
30: char *name;
31: } ar[] = {
32: {1, 0, "???"},
33: {AND, BINOP, "and"},
34: {ANDAND, BINOP, "andand"},
35: {ASG AND, BINOP, "asgand"},
36: {UNARY AND, UNOP, "unaryand"},
37: {ARG, ARG, "arg"},
38: {ARS, BINOP, "ars"},
39: {ASSIGN, BINOP, "assign"},
40: {CALL, CALL, "call"},
41: {FORTCALL, CALL, "fortcall"},
42: {UNARY CALL, UCALL, "unarycall"},
43: {UNARY FORTCALL, UNOP, "unaryfortcall"},
44: {CBRANCH, BINARY, "cbranch "},
45: {CM, BINARY, "cm "},
46: {CMP, BINARY, "cmp "},
47: {COLON, BINOP, "colon"},
48: {COMOP, BINOP, "comop"},
49: {COMPL, UNOP, "compl"},
50: {CONV, UNOP, "conv"},
51: {COPY, COPY, "copy"},
52: {DECR, BINOP, "decr"},
53: {DIV, BINOP, "div"},
54: {ASG DIV, BINOP, "asgdiv"},
55: {ENTRY, ENTRY, "entry"},
56: {EPILOG, EPILOG, "epilog"},
57: {ER, BINOP, "er"},
58: {ASG ER, BINOP, "asger"},
59: {FCON, FCON, "fcon"},
60: {FLD, FLD, "fld"},
61: {FUNARG, UNOP, "funarg"},
62: {FREE, FREE, "free"},
63: {GENBR, GENBR, "genbr"},
64: {GENLAB, GENLAB, "genlab"},
65: {GENUBR, GENLAB, "genubr"},
66: {GOTO, GOTO, "goto"},
67: {ICON, ICON, "icon"},
68: {INCR, BINOP, "incr"},
69: {INIT, UNOP, "init"},
70: {LABELPT, GOTO, "labelpt"},
71: {LOCCTR, LOCCTR, "locctr"},
72: {LS, BINOP, "ls"},
73: {ASG LS, BINOP, "asgls"},
74: {LXINFO, LXINFO, "lxinfo"},
75: {MINUS, BINOP, "minus"},
76: {ASG MINUS, BINOP, "asgminus"},
77: {UNARY MINUS, UNOP, "unaryminus"},
78: {MOD, BINOP, "mod"},
79: {ASG MOD, BINOP, "asgmod"},
80: {MUL, BINOP, "mul"},
81: {ASG MUL, BINOP, "asgmul"},
82: {NAME, NAME, "name"},
83: {NOT, UNOP, "not"},
84: {OR, BINOP, "or"},
85: {ASG OR, BINOP, "asgor"},
86: {OROR, BINARY, "oror "},
87: {PLUS, BINOP, "plus"},
88: {ASG PLUS, BINOP, "asgplus"},
89: {PROLOG, PROLOG, "prolog"},
90: {QUEST, BINARY, "quest"},
91: {REG, REG, "reg"},
92: {EQ, BINOP, "eql"},
93: {NE, BINOP, "neq"},
94: {GT, BINOP, "gtr"},
95: {GE, BINOP, "geq"},
96: {LT, BINOP, "lss"},
97: {LE, BINOP, "leq"},
98: {UGT, BINOP, "gtru"},
99: {UGE, BINOP, "gequ"},
100: {ULT, BINOP, "lssu"},
101: {ULE, BINOP, "lequ"},
102: {RETURN, RETURN, "return"},
103: {UNARY RETURN, URETURN, "unaryreturn"},
104: {RNODE, STRANGE, "rnode"},
105: {QNODE, STRANGE, "qnode"},
106: {SNODE, STRANGE, "snode"},
107: {RS, BINOP, "rs"},
108: {ASG RS, BINOP, "asgrs"},
109: {STAR, UNOP, "star"},
110: {UNARY MUL, UNOP, "star"},
111: {STARG, STARG, "starg"},
112: {STASG, STASG, "stasg"},
113: {STREF, STASG, "stref"},
114: {STCALL, STCALL, "stcall"},
115: {UNARY STCALL, USTCALL, "unarystcall"},
116: {SWBEG, SWBEG, "swbeg"},
117: {SWCASE, SWCASE, "swcase"},
118: {SWDEF, SWDEF, "swdef"},
119: {SWEND, SWEND, "swend"},
120: {TEMP, TEMP, "temp"},
121: {VAUTO, VAUTO, "vauto"},
122: {VPARAM, VAUTO, "vparam"},
123: {0, 0, 0}
124: };
125: int opindex[256];
126: int bothdebug;
127: FILE *fd;
128: pjwreader(p)
129: NODE *p;
130: { int n;
131: if(bothdebug) {
132: printf("#tree ", p);
133: prtree(p);
134: putchar('\n');
135: gencode(p);
136: tfree(p);
137: }
138: else {
139: gencode(p);
140: tfree(p);
141: }
142: }
143: prtree(p)
144: NODE *p;
145: { int i, n;
146: static init = 0;
147: if(!init++)
148: myinit();
149: if(p == 0) {
150: printf("???");
151: return;
152: }
153: i = opindex[p->in.op];
154: if(i == 0) {
155: printf("(unk op %d ???) ", p->in.op);
156: return;
157: }
158: printf("(%s", ar[i].name);
159: switch(ar[i].type) {
160: default:
161: printf("%d???) ", ar[i].type);
162: return;
163: case STRANGE:
164: printf(") ");
165: return;
166: case BINOP:
167: prtype(p->in.type);
168: case BINARY:
169: prtree(p->in.left);
170: prtree(p->in.right);
171: printf(") ");
172: return;
173: case UNOP:
174: prtype(p->in.type);
175: prtree(p->in.left);
176: printf(") ");
177: return;
178: case ARG:
179: prtree(p->in.left);
180: printf("%d) ", p->tn.rval);
181: return;
182: case EPILOG:
183: printf(" %d %d) ", p->tn.lval, p->tn.rval);
184: return;
185: case FLD:
186: printf(" %d %d ", p->tn.rval % 64, p->tn.rval / 64);
187: prtree(p->in.left);
188: printf(") ");
189: return;
190: case CALL:
191: prtype(p->in.type);
192: printf("%d ", p->stn.argsize/32);
193: prtree(p->in.left);
194: prtree(p->in.right);
195: printf(") ");
196: return;
197: case UCALL:
198: prtype(p->in.type);
199: prtree(p->in.left);
200: printf(") ");
201: return;
202: case FCON:
203: prtype(p->in.type);
204: printf("%g) ", p->fpn.dval);
205: return;
206: case GENBR:
207: printf(" %s L%d ", ar[opindex[p->bn.lop]].name, p->bn.label);
208: prtree(p->in.left);
209: printf(") ");
210: return;
211: case GENLAB:
212: prtype(p->in.type);
213: printf(" L%d ", p->bn.label);
214: prtree(p->in.left);
215: printf(") ");
216: return;
217: case GOTO:
218: printf(" L%d ", p->bn.label);
219: printf(") ");
220: return;
221: case ICON:
222: prtype(p->in.type);
223: if(p->tn.name)
224: if(p->tn.lval)
225: printf("%s+%d) ", p->tn.name, p->tn.lval);
226: else
227: printf("%s) ", p->tn.name);
228: else
229: printf("%d) ", p->tn.lval);
230: return;
231: case VAUTO:
232: prtype(p->in.type);
233: printf("%d) ", p->tn.lval);
234: return;
235: case NAME:
236: prtype(p->in.type);
237: if(p->tn.lval)
238: printf("%s+%d) ", p->tn.name, p->tn.lval);
239: else if(p->tn.name)
240: printf("%s) ", p->tn.name);
241: else if(p->tn.rval >= 0)
242: printf("%s) ", stab[p->tn.rval].sname);
243: else
244: printf("L%d) ", -p->tn.rval);
245: return;
246: case PROLOG:
247: prtype(p->in.type);
248: printf("%s %d) ", p->tn.name, p->tn.lval);
249: return;
250: case RETURN:
251: printf("%s) ", p->tn.name);
252: return;
253: case URETURN:
254: prtype(p->in.type);
255: printf("%s ", p->tn.name);
256: prtree(p->in.left);
257: return;
258: case SWCASE:
259: printf(" %d L%d) ", p->tn.lval, p->tn.rval);
260: return;
261: case SWDEF:
262: printf(" L%d) ", p->tn.rval);
263: return;
264: case SWEND:
265: printf(" %d %d) ", p->tn.lval, p->tn.rval);
266: return;
267: case STARG:
268: printf(" %d %d ", p->tn.rval, p->stn.stsize);
269: prtree(p->in.left);
270: printf(") ");
271: return;
272: case STASG:
273: printf(" %d ", p->stn.stsize);
274: prtree(p->in.left);
275: prtree(p->in.right);
276: printf(") ");
277: return;
278: case STCALL:
279: printf(" %d %d ", p->stn.stsize, p->stn.argsize);
280: prtree(p->in.left);
281: prtree(p->in.right);
282: printf(") ");
283: return;
284: case USTCALL:
285: printf("%d ", p->stn.stsize);
286: prtree(p->in.left);
287: printf(") ");
288: return;
289: case REG:
290: prtype(p->in.type);
291: printf("%d) ", p->tn.rval, p->tn.lval);
292: return;
293: }
294: }
295: prtype(n)
296: { char *s;
297: switch(n) {
298: default:
299: cerror("prtype(#%x)\n", n);
300: case TCHAR: s = "C"; break;
301: case TUCHAR: s = "UC"; break;
302: case TSHORT: s = "S"; break;
303: case TUSHORT: s = "US"; break;
304: case TINT: s = "I"; break;
305: case TUNSIGNED: s = "U"; break;
306: case TLONG: s = "L"; break;
307: case TULONG: s = "UL"; break;
308: case TFLOAT: s = "F"; break;
309: case TDOUBLE: s = "D"; break;
310: case TSTRUCT: s = "St"; break;
311: case TPOINT: s = "P"; break;
312: }
313: printf("%s ", s);
314: }
315: myinit()
316: { int i;
317: for(i = 0; ar[i].name; i++)
318: opindex[ar[i].op] = i;
319: }
320: pjwend(p)
321: NODE *p;
322: {
323: if(bothdebug)
324: printf("#treeend\n");
325: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.