|
|
1.1 root 1: /*
2: * n3/cc3.c
3: * Print out C compiler intermediate language files.
4: * It is a machine dependent program,
5: * but most, if not all, of the machine dependencies are in tables.
6: * It understands all favours of intermediate files;
7: * that is, it understands both trees and CODE nodes!
8: */
9:
10: #ifdef vax
11: #include "INC$LIB:cc3.h"
12: #else
13: #include "cc3.h"
14: #endif
15:
16: /*
17: * Possibly impure areas.
18: * All external impure data is here
19: * and is reinitialized by the overlaid version of the mainline.
20: * This permits the compiler to be called many times if loaded
21: * as one big block.
22: */
23: #if !OVERLAID
24: int line; /* Source line */
25: int dotseg; /* Current segment */
26: char file[NFNAME]; /* Source file name */
27: char id[NCSYMB]; /* Identifier buffer */
28: FILE *ifp; /* Input file pointer */
29: FILE *ofp; /* Output file pointer */
30: VARIANT variant; /* Variant template */
31: #endif
32:
33: extern char *segnames[];
34: /*
35: * Temp. file opcodes.
36: */
37: char *ilonames[] = {
38: 0,
39: "file name",
40: 0,
41: 0,
42: "global label",
43: "static label",
44: "block",
45: "prolog",
46: "epilog",
47: 0,
48: 0,
49: 0,
50: 0,
51: "line number",
52: "return expression",
53: "effect expression",
54: "switch expression",
55: "switch body",
56: "initialization expression",
57: "initialize absolute block",
58: 0,
59: "jump if true",
60: "jump if false",
61: 0, /* ENTER */
62: "module name",
63: 0, /* COMM */
64: "", /* DLOCAT */
65: "", /* DLABEL */
66: "segment guess",
67: "undefined reference"
68: };
69:
70: #if !OVERLAID
71: main(argc, argv)
72: char *argv[];
73: {
74: passname = "cc3";
75: if (argc < 3)
76: usage();
77: getvariant(argv[1]);
78: #if GEMDOS
79: {
80: extern long gemdos();
81: extern char *lmalloc();
82: free(lmalloc((gemdos(0x48,-1L)-4096) & ~1023L));
83: }
84: #endif
85: if ((ifp=fopen(argv[2], SRMODE)) == NULL) {
86: fprintf(stderr, "%s: cannot open.\n", argv[2]);
87: exit(BAD);
88: }
89: if (argc == 4) {
90: if ((ofp=fopen(argv[3], "w")) == NULL) {
91: fprintf(stderr, "%s: cannot create.\n", argv[3]);
92: exit(BAD);
93: }
94: } else {
95: ofp = stdout;
96: }
97: dotseg = -1;
98: exit(work3());
99: }
100:
101: usage()
102: {
103: fprintf(stderr, "Usage: cc3 variant input [output]\n");
104: exit(BAD);
105: }
106:
107: #else
108: /*
109: * This is the mainline of the intermediate interpreter
110: * if the compiler is being run as an overlay job.
111: * The impure area must be reinitialized if monolithic
112: * because the code can be called over and over again.
113: */
114: cc3()
115: {
116: passname = "cc3";
117: if (setjmp(death) != 0) {
118: return (ABORT);
119: }
120: dotseg = -1;
121: #if MONOLITHIC
122: line = 0;
123: #endif
124: return (work3());
125: }
126: #endif
127:
128: /*
129: * This is the nuts and bolts of the operation.
130: */
131: work3()
132: {
133: register int op;
134: register long ifseek;
135:
136: cc3init();
137: for (;;) {
138: #if TEMPBUF
139: ifseek = (ifp == NULL) ? inbufp - inbuf : ftell(ifp);
140: #else
141: ifseek = ftell(ifp);
142: #endif
143: if ((op=bget())==EOF || op==FINISH) {
144: cc3close();
145: break;
146: }
147: if (notvariant(VASM))
148: fprintf(ofp, "%ld:\t", ifseek);
149: switch (op) {
150:
151: case FNAME:
152: case MNAME:
153: case GLABEL:
154: case SLABEL:
155: case UREFER:
156: sget(id, NCSYMB);
157: if (isvariant(VASM))
158: genname(op, id);
159: else {
160: fprintf(ofp, "\t%s\t%s\n", ilonames[op], id);
161: if (op==GLABEL || op==SLABEL)
162: fprintf(ofp, "\t%s:\n", id);
163: }
164: break;
165:
166: case LLABEL:
167: if (isvariant(VASM))
168: genival(op, (long)iget());
169: else
170: fprintf(ofp, "L" I_FMT ":\n", iget());
171: break;
172:
173: case LINE:
174: line = iget();
175: if (isvariant(VASM))
176: genival(op, (long)line);
177: else
178: fprintf(ofp, "\t%s\t%d\n", ilonames[op], line);
179: break;
180:
181: case BLOCK:
182: if (isvariant(VASM))
183: genival(op, (long)zget());
184: else
185: fprintf(ofp, "%s\t%ld\n",
186: ilonames[op], (long)zget());
187: break;
188:
189: case DLOCAT:
190: cc3dloc();
191: break;
192: case DLABEL:
193: cc3dbug(1);
194: break;
195:
196: case PROLOG:
197: case EPILOG:
198: fprintf(ofp, "\t%s\n", ilonames[op]);
199: break;
200:
201: case AUTOS:
202: genautos();
203: break;
204:
205: case JUMP:
206: fprintf(ofp, "\tjump\tL" I_FMT "\n", iget());
207: break;
208:
209: case COMM:
210: gencomm();
211: break;
212:
213: case ENTER:
214: if (isvariant(VASM))
215: genival(op, (long)bget());
216: else
217: fprintf(ofp, "\tenter %s\n", segnames[bget()]);
218: break;
219:
220: case ALIGN:
221: if (isvariant(VASM))
222: genival(op, (long)bget());
223: else
224: fprintf(ofp, "\talign %d\n", bget());
225: break;
226:
227: case SBODY:
228: {
229: register ival_t deflab, ncases, cvalue, clabel;
230:
231: deflab = iget();
232: ncases = iget();
233: fprintf(ofp, "%s\n", ilonames[op]);
234: while (ncases--) {
235: cvalue = iget();
236: clabel = iget();
237: fprintf(ofp, "\t\t" I_FMT "\tL" I_FMT "\n", cvalue, clabel);
238: }
239: fprintf(ofp, "\t\tdef\tL" I_FMT "\n", deflab);
240: break;
241: }
242:
243: case IBLOCK:
244: {
245: register int firstb, nitems;
246:
247: fprintf(ofp, "byte block\t");
248: nitems = bget();
249: firstb = 0;
250: while (nitems--) {
251: if (firstb++ != 0)
252: fprintf(ofp, " ");
253: fprintf(ofp, "%d", bget());
254: }
255: fprintf(ofp, "\n");
256: break;
257: }
258:
259: case REXPR:
260: case SEXPR:
261: case TEXPR:
262: case FEXPR:
263: case IEXPR:
264: case EEXPR:
265: itree(op);
266: break;
267:
268: case CODE:
269: icode();
270: break;
271:
272: case EOF:
273: cfatal("unexpected EOF");
274:
275: default:
276: cbotch("bad temporary file opcode %d", op);
277: }
278: }
279: if (op != FINISH)
280: cfatal("unexpected EOF");
281: return (OK);
282: }
283:
284: /* end of n3/cc3.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.