1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Author: Goetz Lindenmaier
6 ** traverse the type information. The walker walks the whole ir graph
7 ** to find the distinct type trees in the type graph forest.
8 ** - execute the pre function before recursion
9 ** - execute the post function after recursion
22 #include "type_or_entity.h"
24 /* Make types visible to allow most efficient access */
25 # include "entity_t.h"
28 typedef struct type_walk_env {
35 void type_walk_2(type_or_ent *tore,
36 void (pre)(type_or_ent*, void*),
37 void (post)(type_or_ent*, void*),
43 switch (get_kind(tore)) {
45 if (((entity *)tore)->visit >= type_visited) return;
48 if(type_id == get_type_tpop((type*)tore)) {
49 type_walk_2((type_or_ent *)skip_tid((type *)tore), pre, post, env);
52 if (((type *)tore)->visit >= type_visited) return;
58 /* execute pre method */
63 switch (get_kind(tore)) {
67 entity *ent = (entity *)tore;
68 ent->visit = type_visited;
69 type_walk_2((type_or_ent *)get_entity_owner(ent), pre, post, env);
70 type_walk_2((type_or_ent *)get_entity_type(ent), pre, post, env);
75 type *tp = (type *)tore;
76 mark_type_visited(tp);
77 switch (get_type_tpop_code(tp)) {
80 for (i=0; i<get_class_n_supertype(tp); i++)
81 type_walk_2((type_or_ent *)get_class_supertype(tp, i), pre, post, env);
82 for (i=0; i<get_class_n_member(tp); i++)
83 type_walk_2((type_or_ent *)get_class_member(tp, i), pre, post, env);
84 for (i=0; i<get_class_n_subtype(tp); i++)
85 type_walk_2((type_or_ent *)get_class_subtype(tp, i), pre, post, env);
90 for (i=0; i<get_struct_n_member(tp); i++)
91 type_walk_2((type_or_ent *)get_struct_member(tp, i), pre, post, env);
96 for (i = 0; i < get_method_n_params(tp); i++)
97 type_walk_2((type_or_ent *)get_method_param_type(tp, i), pre, post, env);
98 for (i = 0; i < get_method_n_res(tp); i++)
99 type_walk_2((type_or_ent *)get_method_res_type(tp, i), pre, post, env);
104 for (i = 0; i < get_union_n_members(tp); i++)
105 type_walk_2((type_or_ent *)get_union_member(tp, i), pre, post, env);
109 type_walk_2((type_or_ent *)get_array_element_type(tp),
112 case tpo_enumeration:
116 type_walk_2((type_or_ent *)get_pointer_points_to_type(tp),
124 printf(" *** Faulty type! \n");
127 } break; /* end case k_type */
129 printf(" *** Faulty type or entity! \n");
133 /* execute post method */
140 void start_type_walk(ir_node *node, void *env) {
141 void *pre = ((type_walk_env *)env)->pre;
142 void *post = ((type_walk_env *)env)->post;
143 void *envi = ((type_walk_env *)env)->env;
147 switch (get_irn_opcode(node)) { /* node label */
149 if ( (get_SymConst_kind(node) == type_tag)
150 || (get_SymConst_kind(node) == size))
151 type_walk_2((type_or_ent *)get_SymConst_type(node), pre, post, envi);
154 type_walk_2((type_or_ent *)get_Sel_entity(node), pre, post, envi);
157 type_walk_2((type_or_ent *)get_Call_type(node), pre, post, envi);
160 type_walk_2((type_or_ent *)get_Alloc_type(node), pre, post, envi);
163 printf("here in typewalk\n");
164 type_walk_2((type_or_ent *)get_Free_type(node), pre, post, envi);
171 void type_walk(void (pre)(type_or_ent*, void*),
172 void (post)(type_or_ent*, void*),
176 type_walk_2((type_or_ent *)get_glob_type(), pre, post, env);
177 for (i = 0; i < get_irp_n_types(); i++) {
178 type_walk_2((type_or_ent *)get_irp_type(i), pre, post, env);
182 void type_walk_irg (ir_graph *irg,
183 void (pre)(type_or_ent*, void*),
184 void (post)(type_or_ent*, void*),
187 /* this is needed to pass the parameters to the walker that actually
188 walks the type information */
189 type_walk_env* type_env;
190 type_env = (type_walk_env *) malloc (sizeof(type_walk_env));
192 type_env->post = post;
196 irg_walk(get_irg_end(irg), start_type_walk, NULL, type_env);
198 type_walk_2((type_or_ent *)get_irg_ent(irg), pre, post, env);
204 void type_walk_s2s_2(type_or_ent *tore,
205 void (pre)(type_or_ent*, void*),
206 void (post)(type_or_ent*, void*),
212 switch (get_kind(tore)) {
214 if (((entity *)tore)->visit >= type_visited) return;
217 if(type_id == get_type_tpop((type*)tore)) {
218 type_walk_s2s_2((type_or_ent *)skip_tid((type *)tore), pre, post, env);
221 if (((type *)tore)->visit >= type_visited) return;
228 switch (get_kind(tore)) {
231 type *tp = (type *)tore;
232 mark_type_visited(tp);
233 switch (get_type_tpop_code(tp)) {
236 for (i=0; i<get_class_n_supertype(tp); i++)
237 type_walk_s2s_2((type_or_ent *)get_class_supertype(tp, i), pre, post, env);
239 /* execute pre method */
242 tp = skip_tid((type*)tore);
244 for (i=0; i<get_class_n_subtype(tp); i++)
245 type_walk_s2s_2((type_or_ent *)get_class_subtype(tp, i), pre, post, env);
247 /* execute post method */
256 case tpo_enumeration:
263 printf(" *** Faulty type! \n");
266 } break; /* end case k_type */
271 printf(" *** Faulty type or entity! \n");
277 void type_walk_super2sub(void (pre)(type_or_ent*, void*),
278 void (post)(type_or_ent*, void*),
282 type_walk_s2s_2((type_or_ent *)get_glob_type(), pre, post, env);
283 for (i = 0; i < get_irp_n_types(); i++) {
284 type_walk_s2s_2((type_or_ent *)get_irp_type(i), pre, post, env);