|
|
1.1 root 1: #include "cem.h"
2: #define STD_OBJ 1
3: #include "stdobj.h"
4: #include "symbol.h"
5: #include "type.h"
6:
7: /*
8: * Type fixing routines.
9: */
10:
11: static char *interned;
12:
13: /*
14: * Fix up a type. First pass. Intern all basetypes and enums
15: * and modifications of these.
16: */
17: static void
18: fix_pure_simple(n, x)
19: type **n;
20: int x;
21: {
22: register type *p;
23:
24: p = *n;
25:
26: switch (p->t_type)
27: {
28: case t_arrayof:
29: case t_bitfield:
30: case t_dimless:
31: case t_ftnreturning:
32: case t_ptrto:
33: if (!interned[p->t_sub.index])
34: return;
35:
36: p->t_subtype = type_trans[p->t_sub.index];
37: break;
38:
39: case t_basetype:
40: case t_enum:
41: break;
42:
43: case t_structof:
44: if ((p = lookup_hash(p->d.s->s_file, p->d.s->s_line)) != NULL)
45: {
46: interned[x] = 1;
47: delete_type(*n);
48: *n = p;
49: }
50:
51: return;
52:
53: case t_unionof:
54: if ((p = lookup_hash(p->d.u->u_file, p->d.u->u_line)) != NULL)
55: {
56: interned[x] = 1;
57: delete_type(*n);
58: *n = p;
59: }
60:
61: return;
62:
63: default:
64: fprintf(stderr, "%s: unknown type in fix_pure_simple\n", my_name);
65: exit(1);
66: }
67:
68: interned[x] = 1;
69: *n = find_type(p);
70: }
71:
72: /*
73: * Fix up a type. Second pass. Intern structs and unions with
74: * exclusively pure components.
75: */
76: static int
77: fix_pure_complex(n, x)
78: type **n;
79: int x;
80: {
81: register s_elt *s;
82: register u_elt *u;
83: register type *p;
84:
85: if (interned[x])
86: return 0;
87:
88: p = *n;
89:
90: switch (p->t_type)
91: {
92: case t_arrayof:
93: case t_bitfield:
94: case t_dimless:
95: case t_ftnreturning:
96: case t_ptrto:
97: if (!interned[p->t_sub.index])
98: return 0;
99:
100: p->t_subtype = type_trans[p->t_sub.index];
101: break;
102:
103: case t_basetype:
104: case t_enum:
105: return 0;
106:
107: case t_structof:
108: for (s = p->d.s->s_list; s != NULL; s = s->s_next)
109: {
110: if (!interned[s->s_ptype.index])
111: return 0;
112: }
113:
114: for (s = p->d.s->s_list; s != NULL; s = s->s_next)
115: s->s_type = type_trans[s->s_ptype.index];
116:
117: break;
118:
119: case t_unionof:
120: for (u = p->d.u->u_list; u != NULL; u = u->u_next)
121: {
122: if (!interned[u->u_ptype.index])
123: return 0;
124: }
125:
126: for (u = p->d.u->u_list; u != NULL; u = u->u_next)
127: u->u_type = type_trans[u->u_ptype.index];
128:
129: break;
130:
131: default:
132: fprintf(stderr, "%s: unknown type in fix_pure_complex\n", my_name);
133: exit(1);
134: }
135:
136: interned[x] = 1;
137: *n = find_type(p);
138: return 1;
139: }
140:
141: /*
142: * Fix up a type. Final pass. Fill in subtypes.
143: */
144: static void
145: elab_complex(p, x)
146: register type *p;
147: int x;
148: {
149: register s_elt *s;
150: register u_elt *u;
151:
152: if (interned[x])
153: return;
154:
155: p->t_index = new_type_index++;
156:
157: switch (p->t_type)
158: {
159: case t_arrayof:
160: case t_bitfield:
161: case t_dimless:
162: case t_ftnreturning:
163: case t_ptrto:
164: p->t_subtype = type_trans[p->t_sub.index];
165: break;
166:
167: case t_basetype:
168: case t_enum:
169: break;
170:
171: case t_structof:
172: for (s = p->d.s->s_list; s != NULL; s = s->s_next)
173: s->s_type = type_trans[s->s_ptype.index];
174:
175: break;
176:
177: case t_unionof:
178: for (u = p->d.u->u_list; u != NULL; u = u->u_next)
179: u->u_type = type_trans[u->u_ptype.index];
180:
181: break;
182:
183: default:
184: fprintf(stderr, "%s: unknown type in elab_complex\n", my_name);
185: exit(1);
186: }
187: }
188:
189: /*
190: * Fix the types in the type translation table. If they are 'pure'
191: * intern them else elaborate them.
192: */
193: void
194: fix_types(n)
195: register long n;
196: {
197: register char *p;
198: register type **v;
199: register int have_fixed;
200: register int i;
201:
202: v = type_trans;
203: p = (char *)salloc(n * sizeof (char));
204: interned = p;
205: i = n;
206:
207: while (--i >= 0)
208: *p++ = 0;
209:
210: for (i = 1; i < n; i++)
211: fix_pure_simple(&v[i], i);
212:
213: do
214: {
215: have_fixed = 0;
216:
217: for (i = 1; i < n; i++)
218: {
219: if (fix_pure_complex(&v[i], i))
220: have_fixed = 1;
221: }
222: }
223: while (have_fixed);
224:
225: for (i = 1; i < n; i++)
226: elab_complex(v[i], i);
227:
228: free(interned);
229: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.