X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Fcgana.c;h=c5f0b1f5c05f98d561a28be80b35fa15afb4fbaa;hb=52d1c7c57180cdb6aa12be48a1d41a961dc85174;hp=736f6958351a143a406f02c04fc3e202136d4292;hpb=1adbf5a888bc38944df7db0c201b2a68ccb265e1;p=libfirm diff --git a/ir/ana/cgana.c b/ir/ana/cgana.c index 736f69583..c5f0b1f5c 100644 --- a/ir/ana/cgana.c +++ b/ir/ana/cgana.c @@ -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 @@ -31,13 +31,9 @@ * 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 -#endif #include "cgana.h" #include "rta.h" @@ -63,10 +59,6 @@ #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 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. * * @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 f�r 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 Verr�ter 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 m�ssen 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. */ + * zur�ckgibt. */ ir_node *pred = get_Proj_pred(node); if (get_irn_link(pred) != MARK) { if (is_Tuple(pred)) {