+
+
+
+static void destruct_walker(ir_node * node, void * env) {
+ if (get_irn_op(node) == op_Call) {
+ remove_Call_callee_arr(node);
+ }
+}
+
+void free_callee_info(ir_graph *irg) {
+ irg_walk_graph(irg, destruct_walker, NULL, NULL);
+ set_irg_callee_info_state(irg, irg_callee_info_none);
+}
+
+
+/* Optimize the address expressions passed to call nodes.
+ *
+ * This optimization performs the following transformations for
+ * all ir graphs:
+ * - All SymConst operations that refer to intern methods are replaced
+ * by Const operations refering to the corresponding entity.
+ * - Sel nodes, that select entities that are not overwritten are
+ * replaced by Const nodes refering to the selected entity.
+ * - Sel nodes, for witch no method exists at all are replaced by Bad
+ * nodes.
+ * - Sel nodes with a pointer input that is an Alloc node are replaced
+ * by Const nodes refering to the entity that implements the method in
+ * the type given by the Alloc node.
+ */
+void opt_call_addrs(void) {
+ sel_methods_init();
+ sel_methods_dispose();
+#if 0
+ int i;
+ pmap * ldname_map = pmap_create();
+ assert(entities == NULL);
+ entities = eset_create();
+ for (i = get_irp_n_irgs() - 1; i >= 0; --i) {
+ entity * ent = get_irg_ent(get_irp_irg(i));
+ /* Nur extern sichtbare Methoden können überhaupt mit SymConst
+ * aufgerufen werden. */
+ if (get_entity_visibility(ent) != local) {
+ pmap_insert(ldname_map, (void *) get_entity_ld_ident(ent), ent);
+ }
+ }
+ all_irg_walk((irg_walk_func *) sel_methods_walker, NULL, ldname_map);
+ pmap_destroy(ldname_map);
+#endif
+}