|
|
1.1 root 1: #include <errno.h>
2: #include "cem.h"
3: #define STD_OBJ 1
4: #include "stdobj.h"
5:
6: /*
7: * Read and load an object file.
8: */
9: static void
10: read_obj(s, fd)
11: register char *s;
12: register int fd;
13: {
14: register int i;
15: register long sz;
16: header obj_header;
17: static char cmd[] = CMD;
18: static char mac[] = MAC;
19: extern void enter_types();
20: extern void enter_vars();
21: extern void install_strings();
22:
23: switch (read(fd, (char *)&obj_header, sizeof (header)))
24: {
25: case SYSERROR:
26: fprintf(stderr, "%s: could not read ", my_name);
27: fflush(stderr);
28: perror(s);
29: exit(1);
30:
31: case sizeof (header):
32: break;
33:
34: default:
35: fprintf(stderr, "%s: %s is not an object module\n", my_name, s);
36: exit(1);
37: }
38:
39: if (strncmp(obj_header.hd_cmd, cmd, CMD_SZ) != 0)
40: {
41: fprintf(stderr, "%s: %s is not an object module\n", my_name, s);
42: exit(1);
43: }
44:
45: if (strncmp(obj_header.hd_mac, mac, MAC_SZ) != 0)
46: {
47: fprintf(stderr, "%s: version mismatch for %s (recompile)\n", my_name, s);
48: exit(1);
49: }
50:
51: if (obj_header.hd_type_size == 0)
52: {
53: fprintf(stderr, "%s: %s has compilation errors\n", my_name, s);
54: exit(1);
55: }
56:
57: sz = obj_header.hd_str_off + obj_header.hd_str_size - sizeof (header);
58: data_base = salloc(sz);
59: str_base = data_base + obj_header.hd_str_off - sizeof (header) - 1;
60:
61: if ((i = read(fd, data_base, (int)sz)) != sz)
62: {
63: if (i == SYSERROR)
64: {
65: fprintf(stderr, "%s: could not read ", my_name);
66: fflush(stderr);
67: perror(s);
68: }
69: else
70: fprintf(stderr, "%s: %s is too small\n", my_name, s);
71:
72: exit(1);
73: }
74:
75: #if DEBUG
76: if (debug)
77: {
78: register char *id;
79: register long l0;
80: register long l1;
81: register long l2;
82:
83: data_ptr = data_base;
84: data_end = data_base + obj_header.hd_str_off - sizeof (header);
85: type_index = 1;
86: var_index = 1;
87: str_num = 0;
88:
89: while (data_ptr < data_end)
90: {
91: i = getd();
92:
93: switch (obj_item(i))
94: {
95: case i_data:
96: l0 = getv();
97: l1 = getv();
98: printf("data: var %ld (%s:%ld)\n", l0, &str_base[l1], getv());
99:
100: loop
101: {
102: i = getd();
103:
104: switch (obj_item(i))
105: {
106: case d_addr:
107: printf("\taddr var %ld for %ld\n", get4(), obj_id(i));
108: continue;
109:
110: case d_bytes:
111: if (obj_id(i) == 0)
112: l0 = getv();
113: else
114: l0 = obj_id(i);
115:
116: printf("\tbytes %ld\n", l0);
117: data_ptr += l0;
118: continue;
119:
120: case d_end:
121: printf("\tend\n");
122: break;
123:
124: case d_istring:
125: if (obj_id(i) == 0)
126: l0 = getv();
127: else
128: l0 = obj_id(i);
129:
130: data_ptr += l0;
131: printf("\tstring %ld, length %ld\n", str_num++, l0);
132: continue;
133:
134: case d_irstring:
135: if (obj_id(i) == 0)
136: l0 = getv();
137: else
138: l0 = obj_id(i);
139:
140: data_ptr += l0;
141: printf("\tstring %ld + %ld, length %ld\n", str_num++, get4(), l0);
142: continue;
143:
144: case d_space:
145: printf("\tspace %ld\n", obj_id(i) == 0 ? getv() : obj_id(i));
146: continue;
147:
148: case d_string:
149: printf("\tstring %ld\n", getv());
150: continue;
151:
152: case d_reloc:
153: l0 = getv();
154: printf("\treloc var %ld + %ld for %ld\n", l0, get4(), obj_id(i));
155: continue;
156:
157: case d_rstring:
158: l0 = getv();
159: printf("\tstring %ld + %ld\n", l0, get4());
160: continue;
161:
162: default:
163: fprintf(stderr, "%s: unknown data id %d\n", my_name, i);
164: exit(1);
165: }
166:
167: break;
168: }
169:
170: break;
171:
172: case i_lib:
173: printf("lib: %s\n", &str_base[getv()]);
174: break;
175:
176: case i_src:
177: printf("src: %s\n", &str_base[getv()]);
178: break;
179:
180: case i_string:
181: if (obj_id(i) == 0)
182: l0 = getv();
183: else
184: l0 = obj_id(i);
185:
186: printf("string %ld, length %ld\n", str_num++, l0);
187: data_ptr += l0;
188: break;
189:
190: case i_type:
191: printf("type ");
192:
193: switch (obj_id(i))
194: {
195: case t_arrayof:
196: l0 = getv();
197: l1 = getv();
198: printf("%ld: array %ld of %ld\n", type_index++, l0, l1);
199: break;
200:
201: case t_basetype:
202: printf("%ld: ", type_index++);
203: print_basetype(getd() & 0xFF);
204: printf("\n");
205: break;
206:
207: case t_bitfield:
208: l0 = getv();
209: l1 = getv();
210: printf("%ld: bitfield %ld of %ld\n", type_index++, l0, l1);
211: break;
212:
213: case t_dimless:
214: printf("%ld: array [] of %ld\n", type_index++, getv());
215: break;
216:
217: case t_elaboration:
218: l0 = getv();
219: l1 = getv();
220: printf("elab %ld: (%s:%ld) ", l0, &str_base[l1], getv());
221:
222: switch (i = obj_id(getd()))
223: {
224: case t_enum:
225: printf("enum\n");
226: l0 = getv();
227: goto elab_enum;
228:
229: case t_structof:
230: printf("struct\n");
231: l0 = getv();
232:
233: do
234: {
235: l1 = getv();
236: printf("\t%s = %ld @ %ld\n", &str_base[l0], l1, getv());
237: l0 = getv();
238: }
239: while (l0 != 0);
240:
241: printf("\t(%ld)\n", getv());
242: break;
243:
244: case t_unionof:
245: printf("union\n");
246: l0 = getv();
247:
248: do
249: {
250: l1 = getv();
251: printf("\t%s = %ld\n", &str_base[l0], l1);
252: l0 = getv();
253: }
254: while (l0 != 0);
255:
256: printf("\t(%ld)\n", getv());
257: break;
258:
259: default:
260: fprintf(stderr, "%s: unknown elaboration id %d\n", my_name, i);
261: exit(1);
262: }
263:
264: break;
265:
266: case t_enum:
267: printf("%ld: ", type_index++);
268:
269: if ((l0 = getv()) == 0)
270: id = "<anon>";
271: else
272: id = &str_base[l0];
273:
274: l0 = getv();
275: l1 = getv();
276:
277: printf("enum %s (%s:%ld)\n", id, &str_base[l0], l1);
278:
279: if ((l0 = getv()) == 0)
280: {
281: printf("\tforward\n");
282: break;
283: }
284:
285: elab_enum:
286: do
287: {
288: l1 = getu();
289: printf("\t%s = %ld\n", &str_base[l0], l1);
290: l0 = getv();
291: }
292: while (l0 != 0);
293:
294: l0 = getu();
295: l1 = getu();
296:
297: printf("\t(%ld, %ld)\n", l0, l1);
298: break;
299:
300: case t_ftnreturning:
301: printf("%ld: function returning %ld\n", type_index++, getv());
302: break;
303:
304: case t_ptrto:
305: printf("%ld: pointer to %ld\n", type_index++, getv());
306: break;
307:
308: case t_structof:
309: printf("%ld: ", type_index++);
310:
311: if ((l0 = getv()) == 0)
312: id = "<anon>";
313: else
314: id = &str_base[l0];
315:
316: l0 = getv();
317: l1 = getv();
318:
319: printf("struct %s (%s:%ld)\n", id, &str_base[l0], l1);
320: break;
321:
322: case t_unionof:
323: printf("%ld: ", type_index++);
324:
325: if ((l0 = getv()) == 0)
326: id = "<anon>";
327: else
328: id = &str_base[l0];
329:
330: l0 = getv();
331: l1 = getv();
332:
333: printf("union %s (%s:%ld)\n", id, &str_base[l0], l1);
334: break;
335:
336: default:
337: fprintf(stderr, "%s: unknown type id %d\n", my_name, obj_id(i));
338: exit(1);
339: }
340:
341: break;
342:
343: case i_var:
344: printf("var ");
345:
346: switch (obj_id(i))
347: {
348: case v_arglist:
349: l0 = getv();
350: l1 = getv();
351: printf("arglist: %ld (%s:%ld)\n", l0, &str_base[l1], getv());
352:
353: while ((l0 = getv()) != 0)
354: {
355: l1 = getv();
356: l2 = getv();
357: printf("\t%ld: %s type %ld (%s:%ld)\n", var_index++, &str_base[l0], l1, &str_base[l2], getv());
358: }
359:
360: break;
361:
362: case v_array_size:
363: l0 = getv();
364: printf("array %ld new type %ld\n", l0, getv());
365: break;
366:
367: case v_auto:
368: id = "auto";
369: goto get_var;
370:
371: case v_block_static:
372: id = "block static";
373: goto get_var;
374:
375: case v_call:
376: l0 = getv();
377: l1 = getv();
378: printf("call: var %ld (%s:%ld)\n", l0, &str_base[l1], getv());
379:
380: while ((l0 = getv()) != 0)
381: printf("\ttype %ld\n", l0);
382:
383: break;
384:
385: case v_global:
386: id = "global";
387: goto get_var;
388:
389: case v_implicit_function:
390: id = "implicit()";
391: goto get_var;
392:
393: case v_static:
394: id = "static";
395: goto get_var;
396:
397: get_var:
398: l0 = getv();
399: l1 = getv();
400: l2 = getv();
401: printf("%ld: %s %s type %ld (%s:%ld)\n", var_index++, id, &str_base[l0], l1, &str_base[l2], getv());
402: break;
403:
404: case v_varargs:
405: l0 = getv();
406: printf("%ld: varargs %ld\n", l0, getv());
407: break;
408:
409: default:
410: fprintf(stderr, "%s: unknown var id %d\n", my_name, obj_id(i));
411: exit(1);
412: }
413:
414: break;
415:
416: default:
417: fprintf(stderr, "%s: unknown obj_item %d\n", my_name, obj_item(i));
418: exit(1);
419: }
420: }
421:
422: fflush(stdout);
423: }
424: #endif DEBUG
425:
426: file_errors = 0;
427: install_strings(str_base + 1, obj_header.hd_str_size);
428:
429: type_index = 1;
430: data_ptr = data_base;
431: data_end = data_base + obj_header.hd_str_off - sizeof (header);
432: enter_types(obj_header.hd_type_size);
433:
434: str_num = 0;
435: var_index = 1;
436: data_ptr = data_base;
437: data_end = data_base + obj_header.hd_str_off - sizeof (header);
438: enter_vars(obj_header.hd_var_size);
439:
440: free((char *)str_trans);
441: free((char *)type_trans);
442: free((char *)var_trans);
443: free(data_base);
444: src_file = NULL;
445:
446: if (file_errors)
447: fflush(stdout);
448: }
449:
450: /*
451: * Open a library and load it.
452: */
453: void
454: load_lib(l)
455: char *l;
456: {
457: register int fd;
458: register char *s;
459: extern int errno;
460: extern char *strcat();
461: extern char *strcpy();
462:
463: s = salloc(strlen(LIB_PATH) + strlen(l) + 1L);
464: (void)strcat(strcpy(s, LIB_PATH), l);
465:
466: if ((fd = open(s, 0)) == SYSERROR)
467: {
468: if (errno == ENOENT)
469: fprintf(stderr, "%s: no library '-l%s'\n", my_name, l);
470: else
471: {
472: fprintf(stderr, "%s: could not open ", my_name);
473: fflush(stderr);
474: perror(s);
475: }
476:
477: exit(1);
478: }
479:
480: read_obj(s, fd);
481: free(s);
482: (void)close(fd);
483: }
484:
485: /*
486: * Open an object file and load it.
487: */
488: void
489: load_obj(s)
490: register char *s;
491: {
492: register int fd;
493:
494: if ((fd = open(s, 0)) == SYSERROR)
495: {
496: fprintf(stderr, "%s: could not open ", my_name);
497: fflush(stderr);
498: perror(s);
499: exit(1);
500: }
501:
502: read_obj(s, fd);
503: (void)close(fd);
504: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.