9f97c3f1df89b7526041d5b6dc03d01a5b258b55
[libfirm] / ir / ana / cgana.c
1 /*
2  * Copyright (C) 1995-2011 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief      Intraprozedural analyses to estimate the call graph.
23  * @author     Hubert Schmid
24  * @date       09.06.2002
25  * @version    $Id$
26  * @brief
27  *  Interprocedural analysis to estimate the calling relation.
28  *
29  *  This analysis computes all entities representing methods that
30  *  can be called at a Call node.  Further it computes a set of
31  *  methods that are 'free', i.e., their adress is handled by
32  *  the program directly, or they are visible external.
33  */
34 #include "config.h"
35
36 #include <string.h>
37
38 #include "cgana.h"
39 #include "rta.h"
40
41 #include "xmalloc.h"
42 #include "irnode_t.h"
43 #include "irmode_t.h"
44 #include "irprog_t.h"
45 #include "irgwalk.h"
46 #include "ircons.h"
47 #include "irgmod.h"
48 #include "iropt.h"
49 #include "irtools.h"
50
51 #include "irflag_t.h"
52 #include "dbginfo_t.h"
53 #include "iropt_dbg.h"
54
55 #include "eset.h"
56 #include "pmap.h"
57 #include "array.h"
58 #include "error.h"
59
60 #include "irdump.h"
61
62 /* unambiguous address used as a mark. */
63 static void *MARK = &MARK;
64
65 static eset *entities = NULL;
66
67 /*--------------------------------------------------------------------------*/
68 /* The analysis                                                             */
69 /*--------------------------------------------------------------------------*/
70
71
72 /*--------------------------------------------------------------------------*/
73 /* Initialize datastructures, remove unwanted constructs, optimize          */
74 /* call target computations.                                                */
75 /*--------------------------------------------------------------------------*/
76
77 /** Collect the entity representing the implementation of this
78  *  method (not the same if inherited) and all entities for overwriting
79  *  implementations in "set".
80  *  If the implementation of the method is not included in the
81  *  compilation unit "open" is set to true.
82  *  A recursive descend in the overwritten relation.
83  *  Cycle-free, therefore must terminate.
84  *
85  * @param method
86  * @param set      A set of entities.
87  * @param size     Number of entities in set.
88  * @param open
89  */
90 static void collect_impls(ir_entity *method, eset *set, int *size, int *open)
91 {
92         int i;
93
94         if (get_entity_irg(method) != NULL) {
95                 eset_insert(set, method);
96                 ++(*size);
97         }
98
99         /*- recursive descent -*/
100         for (i = get_entity_n_overwrittenby(method) - 1; i >= 0; --i)
101                 collect_impls(get_entity_overwrittenby(method, i), set, size, open);
102 }
103
104 /** Alle Methoden bestimmen, die die �bergebene Methode �berschreiben
105  *  (und implementieren). In der zur�ckgegebenen Reihung kommt jede
106  *  Methode nur einmal vor. Der Wert 'NULL' steht f�r unbekannte
107  *  (externe) Methoden. Die zur�ckgegebene Reihung mu� vom Aufrufer
108  *  wieder freigegeben werden (siehe "DEL_ARR_F"). Gibt es �berhaupt
109  *  keine Methoden, die "method" �berschreiben, so gibt die Methode
110  *  "NULL" zur�ck.
111  *
112  *  @param method
113  */
114 static ir_entity ** get_impl_methods(ir_entity * method)
115 {
116         eset * set = eset_create();
117         int size = 0;
118         ir_entity ** arr;
119         int open = 0;
120
121         /* Collect all method entities that can be called here */
122         collect_impls(method, set, &size, &open);
123
124         /* Vorgaenger einfuegen. */
125         if (size == 0 && !open) {
126                 /* keine implementierte �berschriebene Methode */
127                 arr = NULL;
128         } else if (open) {
129                 ir_entity * ent;
130                 arr = NEW_ARR_F(ir_entity *, size + 1);
131                 arr[0] = NULL;  /* Represents open method */
132                 for (ent = (ir_entity*) eset_first(set); size > 0; ent = (ir_entity*) eset_next(set), --size)
133                         arr[size] = ent;
134         } else {
135                 ir_entity * ent;
136                 arr = NEW_ARR_F(ir_entity *, size);
137                 for (size -= 1, ent = (ir_entity*) eset_first(set); size >= 0; ent = (ir_entity*) eset_next(set), --size)
138                         arr[size] = ent;
139         }
140         eset_destroy(set);
141         return arr;
142 }
143
144 /** Analyze address computations.
145  *
146  *  Compute for all Sel nodes the set of methods that can be selected.
147  *  For each entity we store the set of subentities in the link field.
148  *
149  *  Further do some optimizations:
150  *  - Call standard optimizations for Sel nodes: this removes polymorphic
151  *    calls.
152  *  - If the node is a SymConst(name) replace it by SymConst(ent) if possible.
153  *    For this we precomputed a map name->entity.  Nowadays, we no more support
154  *    this and assert.
155  *  - If the node is a Sel:
156  *    If we found only a single method that can be called, replace the Sel
157  *    by a SymConst.  This is more powerful than the analysis in opt_polymorphy,
158  *    as here we walk the type graph.  In opt_polymorphy we only apply a local
159  *    pattern.
160  *
161  *  @param node  The node to analyze
162  *  @param env   A map that maps names of entities to the entities.
163  */
164 static void sel_methods_walker(ir_node *node, void *env)
165 {
166         ir_entity **arr;
167         (void)env;
168
169         /* Call standard optimizations */
170         if (is_Sel(node)) {
171                 ir_node *new_node = optimize_in_place(node);
172                 if (node != new_node) {
173                         exchange(node, new_node);
174                         node = new_node;
175                 }
176         }
177
178         if (is_Sel(node) && is_Method_type(get_entity_type(get_Sel_entity(node)))) {
179                 ir_entity *ent = get_SymConst_entity(get_atomic_ent_value(get_Sel_entity(node)));
180
181                 if (!eset_contains(entities, ent)) {
182                         /* Entity not yet handled. Find all (internal or external)
183                          * implemented methods that overwrites this entity.
184                          * This set is stored in the entity link. */
185                         set_entity_link(ent, get_impl_methods(ent));
186                         eset_insert(entities, ent);
187                 }
188
189                 /* -- As an add on we get an optimization that removes polymorphic calls.
190                 This optimization is more powerful than that in transform_node_Sel().  -- */
191                 arr = (ir_entity**) get_entity_link(ent);
192                 if (arr == NULL) {
193                         /*
194                          * The Sel node never returns a pointer to a usable method.
195                          * We could not call it, but it may be description:
196                          * We call a method in a dead part of the program.
197                          */
198                         assert(get_entity_irg(ent) == NULL);
199                 }
200                 else if (get_opt_closed_world() && get_opt_dyn_meth_dispatch() &&
201                         (ARR_LEN(arr) == 1 && arr[0] != NULL)) {
202                         ir_node *new_node;
203
204                         /*
205                          * The Sel node returns only one possible method.
206                          * So we could replace the Sel node by a SymConst.
207                          * This method must exists.
208                          */
209                         assert(get_entity_irg(arr[0]) != NULL);
210                         new_node = copy_const_value(get_irn_dbg_info(node), get_atomic_ent_value(arr[0]), get_nodes_block(node));
211                         DBG_OPT_POLY(node, new_node);
212                         exchange(node, new_node);
213                 }
214         }
215 }
216
217 /**
218  * Initialize auxiliary data structures.
219  *
220  * Computes a set of entities that overwrite an entity and contain
221  * an implementation. The set is stored in the entity's link field.
222  *
223  * Further replaces Sel nodes where this set contains exactly one
224  * method by SymConst nodes.
225  * Finally asserts if there is a SymConst(name) if there could be a
226  * SymConst(ent).
227  */
228 static void sel_methods_init(void)
229 {
230         int i;
231         pmap *ldname_map = pmap_create();   /* Map entity names to entities: to replace
232                                                SymConst(name) by SymConst(ent). */
233         assert(entities == NULL);
234         entities = eset_create();
235         for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
236                 ir_entity * ent = get_irg_entity(get_irp_irg(i));
237                 /* only external visible methods are allowed to call by a SymConst_ptr_name */
238                 if (entity_is_externally_visible(ent)) {
239                         pmap_insert(ldname_map, (void *)get_entity_ld_ident(ent), ent);
240                 }
241         }
242
243         all_irg_walk(sel_methods_walker, NULL, NULL);
244         pmap_destroy(ldname_map);
245 }
246
247 /*--------------------------------------------------------------------------*/
248 /* Find free methods.
249  *
250  * We expect that each entity has an array with all implementations in its
251  * link field.                                                              */
252 /*--------------------------------------------------------------------------*/
253
254 /**
255  * Returns an array of all methods that could be called at a Sel node.
256  * This array contains every entry only once.
257  *
258  * @param sel  the Sel node
259  */
260 static ir_entity ** get_Sel_arr(ir_node * sel)
261 {
262         static ir_entity ** NULL_ARRAY = NULL;
263         ir_entity * ent;
264         ir_entity ** arr;
265
266         assert(is_Sel(sel));
267         ent = get_Sel_entity(sel);
268
269         assert(is_Method_type(get_entity_type(ent))); /* what else? */
270         arr = (ir_entity**) get_entity_link(ent);
271         if (arr) {
272                 return arr;
273         } else {
274                 /* "NULL" zeigt an, dass keine Implementierung existiert. Dies
275                  * kann f�r polymorphe (abstrakte) Methoden passieren. */
276                 if (!NULL_ARRAY) {
277                         NULL_ARRAY = NEW_ARR_F(ir_entity *, 0);
278                 }
279                 return NULL_ARRAY;
280         }
281 }
282
283 /**
284  * Returns the number of possible called methods at a Sel node.
285  *
286  * @param sel  the Sel node
287  */
288 static size_t get_Sel_n_methods(ir_node * sel)
289 {
290         return ARR_LEN(get_Sel_arr(sel));
291 }
292
293 /**
294  * Returns the ith possible called method entity at a Sel node.
295  */
296 static ir_entity * get_Sel_method(ir_node * sel, size_t pos)
297 {
298         ir_entity ** arr = get_Sel_arr(sel);
299         assert(pos < ARR_LEN(arr));
300         return arr[pos];
301 }
302
303 /* forward */
304 static void free_mark(ir_node * node, eset * set);
305
306 static void free_mark_proj(ir_node * node, long n, eset * set)
307 {
308         assert(get_irn_mode(node) == mode_T);
309         if (get_irn_link(node) == MARK) {
310                 /* already visited */
311                 return;
312         }
313         set_irn_link(node, MARK);
314         switch (get_irn_opcode(node)) {
315         case iro_Proj: {
316                 /* proj_proj: in einem "sinnvollen" Graphen kommt jetzt ein
317                  * op_Tuple oder ein Knoten, der in "free_ana_walker" behandelt
318                  * wird. */
319                 ir_node * pred = get_Proj_pred(node);
320                 if (get_irn_link(pred) != MARK && is_Tuple(pred)) {
321                         free_mark_proj(get_Tuple_pred(pred, get_Proj_proj(node)), n, set);
322                 } else {
323                         /* nothing: da in "free_ana_walker" behandelt. */
324                 }
325                 break;
326         }
327
328         case iro_Tuple:
329                 free_mark(get_Tuple_pred(node, n), set);
330                 break;
331
332         case iro_Id:
333                 free_mark_proj(get_Id_pred(node), n, set);
334                 break;
335
336         case iro_Start:
337         case iro_Alloc:
338         case iro_Load:
339                 /* nothing: Die Operationen werden in free_ana_walker() selbst
340                  * behandelt. */
341                 break;
342
343         default:
344                 assert(0 && "unexpected opcode or opcode not implemented");
345                 break;
346         }
347         // set_irn_link(node, NULL);
348 }
349
350 /**
351  * Called for predecessors nodes of "interesting" ones.
352  * Interesting ones include all nodes that can somehow make
353  * a method visible.
354  *
355  * If a method (or a set of methods in case of polymorph calls) gets visible,
356  * add it to the set of 'free' methods
357  *
358  * @param node  the current visited node
359  * @param set   the set of all free methods
360  */
361 static void free_mark(ir_node *node, eset * set)
362 {
363         size_t i, n;
364
365         if (get_irn_link(node) == MARK)
366                 return; /* already visited */
367
368         set_irn_link(node, MARK);
369
370         switch (get_irn_opcode(node)) {
371         case iro_Sel: {
372                 ir_entity *ent = get_Sel_entity(node);
373                 if (is_method_entity(ent)) {
374                         for (i = 0, n = get_Sel_n_methods(node); i < n; ++i) {
375                                 eset_insert(set, get_Sel_method(node, i));
376                         }
377                 }
378                 break;
379         }
380         case iro_SymConst:
381                 if (get_SymConst_kind(node) == symconst_addr_ent) {
382                         ir_entity *ent = get_SymConst_entity(node);
383                         if (is_method_entity(ent)) {
384                                 eset_insert(set, ent);
385                         }
386                 }
387                 break;
388
389         case iro_Phi:
390         {
391                 int i, n;
392                 for (i = 0, n = get_Phi_n_preds(node); i < n; ++i) {
393                         free_mark(get_Phi_pred(node, i), set);
394                 }
395                 break;
396         }
397         case iro_Proj:
398                 free_mark_proj(get_Proj_pred(node), get_Proj_proj(node), set);
399                 break;
400         default:
401                 /* nothing: */
402                 break;
403         }
404 }
405
406 /**
407  * post-walker. Find method addresses.
408  */
409 static void free_ana_walker(ir_node *node, void *env)
410 {
411         eset *set = (eset*) env;
412         int i;
413
414         if (get_irn_link(node) == MARK) {
415                 /* already visited */
416                 return;
417         }
418         switch (get_irn_opcode(node)) {
419                 /* special nodes */
420         case iro_Sel:
421         case iro_SymConst:
422         case iro_Const:
423         case iro_Phi:
424         case iro_Id:
425         case iro_Proj:
426         case iro_Tuple:
427                 /* nothing */
428                 break;
429         case iro_Call:
430                 /* we must handle Call nodes specially, because their call address input
431                    do not expose a method address. */
432                 set_irn_link(node, MARK);
433                 for (i = get_Call_n_params(node) - 1; i >= 0; --i) {
434                         ir_node *pred = get_Call_param(node, i);
435                         if (mode_is_reference(get_irn_mode(pred))) {
436                                 free_mark(pred, set);
437                         }
438                 }
439                 break;
440         default:
441                 /* other nodes: Alle anderen Knoten nehmen wir als Verr�ter an, bis
442                  * jemand das Gegenteil implementiert. */
443                 set_irn_link(node, MARK);
444                 for (i = get_irn_arity(node) - 1; i >= 0; --i) {
445                         ir_node *pred = get_irn_n(node, i);
446                         if (mode_is_reference(get_irn_mode(pred))) {
447                                 free_mark(pred, set);
448                         }
449                 }
450                 break;
451         }
452 }
453
454 /**
455  * Add all method addresses in global new style initializers to the set.
456  *
457  * @note
458  * We do NOT check the type here, just it it's an entity address.
459  * The reason for this is code like:
460  *
461  * void *p = function;
462  *
463  * which is sometimes used to anchor functions.
464  */
465 static void add_method_address_inititializer(ir_initializer_t *initializer,
466                                              eset *set)
467 {
468         ir_node *n;
469         size_t  i;
470
471         switch (initializer->kind) {
472         case IR_INITIALIZER_CONST:
473                 n = initializer->consti.value;
474
475                 /* let's check if it's the address of a function */
476                 if (is_Global(n)) {
477                         ir_entity *ent = get_Global_entity(n);
478
479                         if (is_Method_type(get_entity_type(ent)))
480                                 eset_insert(set, ent);
481                 }
482                 return;
483         case IR_INITIALIZER_TARVAL:
484         case IR_INITIALIZER_NULL:
485                 return;
486         case IR_INITIALIZER_COMPOUND:
487                 for (i = 0; i < initializer->compound.n_initializers; ++i) {
488                         ir_initializer_t *sub_initializer
489                                 = initializer->compound.initializers[i];
490                         add_method_address_inititializer(sub_initializer, set);
491                 }
492                 return;
493         }
494         panic("invalid initializer found");
495 }
496
497 /**
498  * Add all method addresses in global initializers to the set.
499  *
500  * @note
501  * We do NOT check the type here, just it it's an entity address.
502  * The reason for this is code like:
503  *
504  * void *p = function;
505  *
506  * which is sometimes used to anchor functions.
507  */
508 static void add_method_address(ir_entity *ent, eset *set)
509 {
510         ir_node *n;
511         ir_type *tp;
512         int i;
513
514         /* ignore methods: these of course reference it's address
515          * TODO: remove this later once this incorrect self-intialisation is gone
516          */
517         tp = get_entity_type(ent);
518         if (is_Method_type(tp))
519                 return;
520
521         if (ent->initializer != NULL) {
522                 add_method_address_inititializer(get_entity_initializer(ent), set);
523         } else if (entity_has_compound_ent_values(ent)) {
524                 for (i = get_compound_ent_n_values(ent) - 1; i >= 0; --i) {
525                         n = get_compound_ent_value(ent, i);
526
527                         /* let's check if it's the address of a function */
528                         if (is_Global(n)) {
529                                 ir_entity *ent = get_Global_entity(n);
530
531                                 if (is_Method_type(get_entity_type(ent)))
532                                         eset_insert(set, ent);
533                         }
534                 }
535         }
536 }
537
538 /**
539  * returns a list of 'free' methods, i.e., the methods that can be called
540  * from external or via function pointers.
541  *
542  * Die Datenstrukturen für sel-Methoden (sel_methods) muß vor dem
543  * Aufruf von "get_free_methods" aufgebaut sein. Die (internen)
544  * SymConst(name)-Operationen müssen in passende SymConst(ent)-Operationen
545  * umgewandelt worden sein, d.h. SymConst-Operationen verweisen immer
546  * auf eine echt externe Methode.
547  */
548 static size_t get_free_methods(ir_entity ***free_methods)
549 {
550         eset *free_set = eset_create();
551         int i;
552         ir_entity **arr;
553         ir_entity *ent;
554         ir_graph *irg;
555         ir_type *tp;
556         size_t length;
557
558         for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
559                 ir_linkage linkage;
560                 irg = get_irp_irg(i);
561                 ent = get_irg_entity(irg);
562                 linkage = get_entity_linkage(ent);
563
564                 if (entity_is_externally_visible(ent)
565                                 || (linkage & IR_LINKAGE_HIDDEN_USER)) {
566                         eset_insert(free_set, ent);
567                 }
568
569                 ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
570                 /* Find all method entities that gets "visible" through this graphs,
571                  * for instance because their address is stored. */
572                 irg_walk_graph(irg, firm_clear_link, free_ana_walker, free_set);
573                 ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
574         }
575
576         /* insert all methods that are used in global variables initializers */
577         tp = get_glob_type();
578         for (i = get_class_n_members(tp) - 1; i >= 0; --i) {
579                 ent = get_class_member(tp, i);
580                 add_method_address(ent, free_set);
581         }
582         tp = get_tls_type();
583         for (i = get_class_n_members(tp) - 1; i >= 0; --i) {
584                 ent = get_class_member(tp, i);
585                 add_method_address(ent, free_set);
586         }
587
588         /* the main program is even then "free", if it's not external visible. */
589         irg = get_irp_main_irg();
590         if (irg != NULL)
591                 eset_insert(free_set, get_irg_entity(irg));
592
593         /* Finally, transform the set into an array. */
594         length = eset_count(free_set);
595         arr = XMALLOCN(ir_entity*, length);
596         for (i = 0, ent = (ir_entity*) eset_first(free_set); ent; ent = (ir_entity*) eset_next(free_set)) {
597                 arr[i++] = ent;
598         }
599         eset_destroy(free_set);
600
601         *free_methods = arr;
602         return length;
603 }
604
605 /*--------------------------------------------------------------------------*/
606 /* Callee analysis.                                                         */
607 /*--------------------------------------------------------------------------*/
608
609 static void callee_ana_node(ir_node * node, eset * methods);
610
611 static void callee_ana_proj(ir_node *node, long n, eset *methods)
612 {
613         assert(get_irn_mode(node) == mode_T);
614         if (get_irn_link(node) == MARK) {
615                 /* already visited */
616                 return;
617         }
618         set_irn_link(node, MARK);
619
620         switch (get_irn_opcode(node)) {
621         case iro_Proj: {
622                 /* proj_proj: in einem "sinnvollen" Graphen kommt jetzt ein
623                  * op_Tuple oder ein Knoten, der eine "freie Methode"
624                  * zur�ckgibt. */
625                 ir_node *pred = get_Proj_pred(node);
626                 if (get_irn_link(pred) != MARK) {
627                         if (is_Tuple(pred)) {
628                                 callee_ana_proj(get_Tuple_pred(pred, get_Proj_proj(node)), n, methods);
629                         } else {
630                                 eset_insert(methods, unknown_entity); /* free method -> unknown */
631                         }
632                 }
633                 break;
634         }
635
636         case iro_Tuple:
637                 callee_ana_node(get_Tuple_pred(node, n), methods);
638                 break;
639
640         default:
641                 eset_insert(methods, unknown_entity); /* free method -> unknown */
642                 break;
643         }
644 }
645
646 /**
647  * Analyse a Call address.
648  *
649  * @param node     the node representing the call address
650  * @param methods  after call contains the set of all possibly called entities
651  */
652 static void callee_ana_node(ir_node *node, eset *methods)
653 {
654         assert(mode_is_reference(get_irn_mode(node)) || is_Bad(node));
655         /* Beware of recursion */
656         if (get_irn_link(node) == MARK) {
657                 /* already visited */
658                 return;
659         }
660         set_irn_link(node, MARK);
661
662         switch (get_irn_opcode(node)) {
663         case iro_Const:
664                 /* A direct address call. We tread this as an external
665                    call and ignore it completely. */
666                 eset_insert(methods, unknown_entity); /* free method -> unknown */
667                 break;
668
669         case iro_SymConst: {
670                 ir_entity *ent = get_SymConst_entity(node);
671                 assert(ent && is_method_entity(ent));
672                 eset_insert(methods, ent);
673                 break;
674         }
675
676         case iro_Sel: {
677                 /* polymorphic method */
678                 size_t i, n;
679                 for (i = 0, n = get_Sel_n_methods(node); i < n; ++i) {
680                         ir_entity *ent = get_Sel_method(node, i);
681                         if (ent != NULL) {
682                                 eset_insert(methods, ent);
683                         } else {
684                                 eset_insert(methods, unknown_entity);
685                         }
686                 }
687                 break;
688         }
689
690         case iro_Bad:
691                 /* nothing */
692                 break;
693
694         case iro_Phi: {
695                 int i;
696                 for (i = get_Phi_n_preds(node) - 1; i >= 0; --i) {
697                         callee_ana_node(get_Phi_pred(node, i), methods);
698                 }
699                 break;
700         }
701
702         case iro_Mux:
703                 callee_ana_node(get_Mux_false(node), methods);
704                 callee_ana_node(get_Mux_true(node), methods);
705                 break;
706
707         case iro_Id:
708                 callee_ana_node(get_Id_pred(node), methods);
709                 break;
710
711         case iro_Proj:
712                 callee_ana_proj(get_Proj_pred(node), get_Proj_proj(node), methods);
713                 break;
714
715         case iro_Add:
716         case iro_Sub:
717         case iro_Conv:
718                 /* extern */
719                 eset_insert(methods, unknown_entity); /* free method -> unknown */
720                 break;
721
722         default:
723                 assert(0 && "invalid opcode or opcode not implemented");
724                 break;
725         }
726 }
727
728 /**
729  * Walker: Analyses every Call node and calculates an array of possible
730  * callees for that call.
731  */
732 static void callee_walker(ir_node *call, void *env)
733 {
734         (void) env;
735         if (is_Call(call)) {
736                 eset *methods = eset_create();
737                 ir_entity *ent;
738                 ir_entity **arr;
739                 size_t i;
740
741                 callee_ana_node(get_Call_ptr(call), methods);
742                 arr = NEW_ARR_F(ir_entity *, eset_count(methods));
743                 for (i = 0, ent = (ir_entity*) eset_first(methods); ent; ent = (ir_entity*) eset_next(methods)) {
744                         arr[i] = ent;
745                         /* we want the unknown_entity on the zero position for easy tests later */
746                         if (ent == unknown_entity) {
747                                 arr[i] = arr[0];
748                                 arr[0] = unknown_entity;
749                         }
750                         ++i;
751                 }
752                 set_Call_callee_arr(call, ARR_LEN(arr), arr);
753                 DEL_ARR_F(arr);
754                 eset_destroy(methods);
755         }
756 }
757
758 /**
759  * Walker: Removes all tuple.
760  */
761 static void remove_Tuples(ir_node *proj, void *env)
762 {
763         ir_node *nn;
764         (void) env;
765         if (! is_Proj(proj)) return;
766
767         nn = skip_Tuple(proj);
768         if (nn != proj) exchange(proj, nn);
769 }
770
771
772 /**
773  * Determine for every Call the set of possibly called methods and stores it
774  * inside the Call (@see set_Call_callee()).
775  * Uses the sel_methods set with much be already calculated.
776  */
777 static void callee_ana(void)
778 {
779         int i;
780         /* analyse all graphs */
781         for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
782                 ir_graph *irg = get_irp_irg(i);
783                 irg_walk_graph(irg, callee_walker, remove_Tuples, NULL);
784                 set_irg_callee_info_state(irg, irg_callee_info_consistent);
785         }
786         set_irp_callee_info_state(irg_callee_info_consistent);
787 }
788
789 /*--------------------------------------------------------------------------*/
790 /* Cleanup after analyses.                                                  */
791 /*--------------------------------------------------------------------------*/
792
793 /** Frees intermediate data structures. */
794 static void sel_methods_dispose(void)
795 {
796         ir_entity * ent;
797         assert(entities);
798         for (ent = (ir_entity*) eset_first(entities); ent; ent = (ir_entity*) eset_next(entities)) {
799                 ir_entity ** arr = (ir_entity**) get_entity_link(ent);
800                 if (arr) {
801                         DEL_ARR_F(arr);
802                 }
803                 set_entity_link(ent, NULL);
804         }
805         eset_destroy(entities);
806         entities = NULL;
807 }
808
809 /*--------------------------------------------------------------------------*/
810 /* Freeing the callee arrays.                                               */
811 /*--------------------------------------------------------------------------*/
812
813 static void destruct_walker(ir_node * node, void * env)
814 {
815         (void) env;
816         if (is_Call(node)) {
817                 remove_Call_callee_arr(node);
818         }
819 }
820
821 /*--------------------------------------------------------------------------*/
822 /* Main drivers.                                                            */
823 /*--------------------------------------------------------------------------*/
824
825 size_t cgana(ir_entity ***free_methods)
826 {
827         size_t length;
828         /* Optimize Sel/SymConst nodes and compute all methods that implement an entity. */
829         sel_methods_init();
830         length = get_free_methods(free_methods);
831         callee_ana();
832         sel_methods_dispose();
833         return length;
834 }
835
836 void free_callee_info(ir_graph *irg)
837 {
838         irg_walk_graph(irg, destruct_walker, NULL, NULL);
839         set_irg_callee_info_state(irg, irg_callee_info_none);
840 }
841
842 void free_irp_callee_info(void)
843 {
844         int i;
845         for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
846                 free_callee_info(get_irp_irg(i));
847         }
848 }
849
850 /* Optimize the address expressions passed to call nodes.
851  *
852  * This optimization performs the following transformations for
853  * all ir graphs:
854  * - All SymConst operations that refer to intern methods are replaced
855  *   by Const operations referring to the corresponding entity.
856  * - Sel nodes, that select entities that are not overwritten are
857  *   replaced by Const nodes referring to the selected entity.
858  * - Sel nodes, for which no method exists at all are replaced by Bad
859  *   nodes.
860  * - Sel nodes with a pointer input that is an Alloc node are replaced
861  *   by Const nodes referring to the entity that implements the method in
862  *   the type given by the Alloc node.
863  */
864 void opt_call_addrs(void)
865 {
866         sel_methods_init();
867         sel_methods_dispose();
868 }