Fixed some obviously wrong conditions.
[libfirm] / ir / ana / cgana.c
index 736f695..c5f0b1f 100644 (file)
@@ -23,7 +23,7 @@
  * @author     Hubert Schmid
  * @date       09.06.2002
  * @version    $Id$
- * @summary
+ * @brief
  *  Interprocedural analysis to estimate the calling relation.
  *
  *  This analysis computes all entities representing methods that
  *  methods that are 'free', i.e., their adress is handled by
  *  the program directly, or they are visible external.
  */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
 
-#ifdef HAVE_STRING_H
 # include <string.h>
-#endif
 
 #include "cgana.h"
 #include "rta.h"
 
 #include "irdump.h"
 
-#include "irhooks.h"
-
-
-
 /* unambiguous address used as a mark. */
 static void *MARK = &MARK;
 
@@ -126,13 +118,13 @@ static void collect_impls(ir_entity *method, eset *set, int *size, int *open) {
                collect_impls(get_entity_overwrittenby(method, i), set, size, open);
 }
 
-/** Alle Methoden bestimmen, die die übergebene Methode überschreiben
- *  (und implementieren). In der zurückgegebenen Reihung kommt jede
- *  Methode nur einmal vor. Der Wert 'NULL' steht für unbekannte
- *  (externe) Methoden. Die zurückgegebene Reihung muß vom Aufrufer
- *  wieder freigegeben werden (siehe "DEL_ARR_F"). Gibt es überhaupt
- *  keine Methoden, die "method" überschreiben, so gibt die Methode
- *  "NULL" zurück.
+/** Alle Methoden bestimmen, die die �bergebene Methode �berschreiben
+ *  (und implementieren). In der zurckgegebenen Reihung kommt jede
+ *  Methode nur einmal vor. Der Wert 'NULL' steht fr unbekannte
+ *  (externe) Methoden. Die zur�ckgegebene Reihung mu� vom Aufrufer
+ *  wieder freigegeben werden (siehe "DEL_ARR_F"). Gibt es berhaupt
+ *  keine Methoden, die "method" berschreiben, so gibt die Methode
+ *  "NULL" zurck.
  *
  *  @param method
  */
@@ -147,7 +139,7 @@ static ir_entity ** get_impl_methods(ir_entity * method) {
 
        /* Vorgaenger einfuegen. */
        if (size == 0 && !open) {
-               /* keine implementierte überschriebene Methode */
+               /* keine implementierte berschriebene Methode */
                arr = NULL;
        } else if (open) {
                ir_entity * ent;
@@ -306,7 +298,7 @@ static ir_entity ** get_Sel_arr(ir_node * sel) {
                return arr;
        } else {
                /* "NULL" zeigt an, dass keine Implementierung existiert. Dies
-                * kann für polymorphe (abstrakte) Methoden passieren. */
+                * kann fr polymorphe (abstrakte) Methoden passieren. */
                if (!NULL_ARRAY) {
                        NULL_ARRAY = NEW_ARR_F(ir_entity *, 0);
                }
@@ -348,7 +340,7 @@ static void free_mark_proj(ir_node * node, long n, eset * set) {
                 * op_Tuple oder ein Knoten, der in "free_ana_walker" behandelt
                 * wird. */
                ir_node * pred = get_Proj_pred(node);
-               if (get_irn_link(pred) != MARK && get_irn_op(pred) == op_Tuple) {
+               if (get_irn_link(pred) != MARK && is_Tuple(pred)) {
                        free_mark_proj(get_Tuple_pred(pred, get_Proj_proj(node)), n, set);
                } else {
                        /* nothing: da in "free_ana_walker" behandelt. */
@@ -413,9 +405,6 @@ static void free_mark(ir_node *node, eset * set) {
                        if (is_method_entity(ent)) {
                                eset_insert(set, ent);
                        }
-               } else {
-                       assert(get_SymConst_kind(node) == symconst_addr_name);
-                       /* nothing: SymConst points to extern method */
                }
                break;
 
@@ -467,7 +456,7 @@ static void free_ana_walker(ir_node *node, void *env) {
                }
                break;
        default:
-               /* other nodes: Alle anderen Knoten nehmen wir als Verräter an, bis
+               /* other nodes: Alle anderen Knoten nehmen wir als Verrter an, bis
                 * jemand das Gegenteil implementiert. */
                set_irn_link(node, MARK);
                for (i = get_irn_arity(node) - 1; i >= 0; --i) {
@@ -580,9 +569,9 @@ static void add_method_address(ir_entity *ent, eset *set)
  * returns a list of 'free' methods, i.e., the methods that can be called
  * from external or via function pointers.
  *
- * Die Datenstrukturen für sel-Methoden (sel_methods) muß vor dem
+ * Die Datenstrukturen f�r sel-Methoden (sel_methods) mu� vor dem
  * Aufruf von "get_free_methods" aufgebaut sein. Die (internen)
- * SymConst(name)-Operationen müssen in passende SymConst(ent)-Operationen
+ * SymConst(name)-Operationen mssen in passende SymConst(ent)-Operationen
  * umgewandelt worden sein, d.h. SymConst-Operationen verweisen immer
  * auf eine echt externe Methode.
  */
@@ -606,11 +595,11 @@ static ir_entity **get_free_methods(int *length)
                        eset_insert(free_set, ent);
                }
 
-               set_using_irn_link(irg);
+               ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
                /* Find all method entities that gets "visible" through this graphs,
                 * for instance because their address is stored. */
                irg_walk_graph(irg, firm_clear_link, free_ana_walker, free_set);
-               clear_using_irn_link(irg);
+               ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
        }
 
        /* insert all methods that are used in global variables initializers */
@@ -632,7 +621,7 @@ static ir_entity **get_free_methods(int *length)
 
        /* Finally, transform the set into an array. */
        *length = eset_count(free_set);
-       arr = xmalloc(sizeof(ir_entity *) * (*length));
+       arr = XMALLOCN(ir_entity*, *length);
        for (i = 0, ent = eset_first(free_set); ent; ent = eset_next(free_set)) {
                arr[i++] = ent;
        }
@@ -659,7 +648,7 @@ static void callee_ana_proj(ir_node *node, long n, eset *methods) {
        case iro_Proj: {
                /* proj_proj: in einem "sinnvollen" Graphen kommt jetzt ein
                 * op_Tuple oder ein Knoten, der eine "freie Methode"
-                * zurückgibt. */
+                * zurckgibt. */
                ir_node *pred = get_Proj_pred(node);
                if (get_irn_link(pred) != MARK) {
                        if (is_Tuple(pred)) {