|
|
1.1 root 1: #define csync(c) (global_filename = (c)->c_value.no.no_name, global_lineno = (c)->c_value.no.no_offset)
2: #define cunpack(x) ((cnodes)x)
3:
4: typedef enum
5: {
6: ct_args,
7: ct_binopfsfx,
8: ct_binopft,
9: ct_binopfv,
10: ct_block,
11: ct_booltest,
12: ct_boolval,
13: ct_call,
14: ct_callfv,
15: ct_dcast,
16: ct_clear,
17: ct_colon,
18: ct_discard,
19: ct_fake,
20: ct_ftnentry,
21: ct_ftnxit,
22: ct_hard,
23: ct_jmp,
24: ct_jmpf,
25: ct_jmpt,
26: ct_intrin,
27: ct_intrinfv,
28: ct_label,
29: ct_ldiff,
30: ct_nop,
31: ct_not,
32: ct_obj,
33: ct_objfv,
34: ct_objref,
35: ct_question,
36: ct_ret,
37: ct_switch,
38: ct_sync,
39: ct_ujmp,
40: ct_unopfsfx,
41: ct_unopfv,
42: ct_vret,
43: ct_xnd,
44: ct_xndtest,
45:
46: ct_char,
47: ct_double,
48: ct_extern,
49: ct_float,
50: ct_int,
51: ct_long,
52: ct_short,
53: ct_space,
54: ct_ptr,
55: ct_string,
56: }
57: cnodes;
58:
59: struct cnode
60: {
61: /*
62: * whenever in a list.
63: */
64: cnode *c_next;
65: /*
66: * last - during optimisation
67: * type - codegen and beyond
68: * symtab - intrinsics (currently unused)
69: */
70: union
71: {
72: cnode *cu_last;
73: xnode *cu_type;
74: char *cu_symtab;
75: }
76: cu1;
77: /*
78: * value - general use
79: * labs - label difference (switch table)
80: */
81: union
82: {
83: data cu_value;
84: struct
85: {
86: cnode *cu_l1;
87: cnode *cu_l2;
88: }
89: cu_labs;
90: }
91: cu2;
92: /*
93: * what - whenever in a list
94: * label - switch labels
95: */
96: union
97: {
98: cnodes cu_what;
99: cnode *cu_label;
100: }
101: cu3;
102: /*
103: * choice - switch tree
104: * link - labels
105: * ids - register allocation
106: * xwhat - codegen operator
107: */
108: union
109: {
110: choice *cu_choice;
111: cnode *cu_link;
112: xnodes cu_xwhat;
113: xnode *cu_ids;
114: }
115: cu4;
116: /*
117: * flow_set - opt/flow
118: */
119: union
120: {
121: xnode *cu_flow;
122: cnode *cu_switch;
123: }
124: cu5;
125: /*
126: * short1 - flags (almost everywhere)
127: * short2 - optimisation
128: */
129: short c_short1;
130: short c_short2;
131: };
132: #define c_code c_next
133:
134: #define c_symtab cu1.cu_symtab
135: #define c_last cu1.cu_last
136: #define c_type cu1.cu_type
137:
138: #define c_value cu2.cu_value
139: #define c_l1 cu2.cu_labs.cu_l1
140: #define c_l2 cu2.cu_labs.cu_l2
141: #define c_uncomarg cu2.cu_labs.cu_l1
142: #define c_uncomnext cu2.cu_labs.cu_l2
143:
144: #define c_label cu3.cu_label
145: #define c_what cu3.cu_what
146:
147: #define c_link cu4.cu_link
148: #define c_xwhat cu4.cu_xwhat
149: #define c_choice cu4.cu_choice
150: #define c_ids cu4.cu_ids
151:
152: #define c_left c_next
153: #define c_right c_last
154: #define c_switch cu5.cu_switch
155:
156: #define c_flow cu5.cu_flow
157:
158: #define c_height c_short1
159: #define c_flags c_short1
160: #define c_known c_short2
161: #define c_dist c_short2
162: #define c_ord c_short2
163:
164: /*
165: * Used in ct_clear nodes for memory layout definitions as passed
166: * to memory().
167: */
168: #define C_READONLY 0x0001
169: #define C_EXECUTEONLY 0x0002
170: #define C_ALLZERO 0x0004
171:
172: /*
173: * cnode / xnode flow flags
174: *
175: * The first five are the flow sets, the rest
176: * are allocated identifier classes.
177: */
178: #define C_X_CUT 0x0001
179: #define C_X_MOD 0x0002
180: #define C_X_REF 0x0004
181: #define C_X_HIDE 0x0008
182: #define C_X_CMOD 0x0010
183:
184: #define C_ID_BEGIN 0x0020
185: #define C_ID_END 0x0040
186: #define C_ID_BECOMES 0x0080
187:
188: /*
189: * A switch label ref cnode does not live in the list.
190: * It is on the label ref list and has c_flags & C_SWITCH
191: * Its c_label points to the abel itself and its c_switch
192: * points to the switch.
193: */
194: #define C_SWITCH 0x0100
195:
196: #define LABIS_NORMAL 0x1000
197: #define LABIS_PRECIOUS 0x2000
198:
199: struct cfrag
200: {
201: union
202: {
203: cnode *c_cn;
204: cfrag *c_cf;
205: }
206: c_un;
207: cnode *c_tail;
208: };
209: #define c_head c_un.c_cn
210: #define k_next c_un.c_cf
211:
212: typedef set cnodes cnset;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.