+/**
+ * Hook: Remove all old in edges, turn node into id node, add new input edge.
+ */
+static void firm_ycomp_debug_turn_into_id(void *context, ir_node *old_node) {
+ firm_ycomp_dbg_t *dbg = context;
+ exchange_node_outs_assoc_t key, *entry;
+ int i;
+ char buf[SEND_BUF_SIZE];
+ unsigned src_idx, tgt_idx;
+ ycomp_edge_t edge_key, *new_edge;
+
+ key.irn = old_node;
+ entry = pset_find(dbg->exchanged_nodes, &key, HASH_PTR(old_node));
+
+ assert(entry != NULL && "Exchange entry missing");
+
+ src_idx = get_irn_node_nr(old_node);
+ tgt_idx = get_irn_node_nr(entry->nw);
+
+ /* remove all old edges */
+ for (i = get_irn_arity(old_node) - 1; i >= 0; --i) {
+ ycomp_edge_t *old_edge;
+ unsigned old_tgt_idx;
+
+ /* check if the old edge exists */
+ edge_key.src = old_node;
+ edge_key.tgt = get_irn_n(old_node, i);
+ edge_key.pos = i;
+ old_edge = pset_find(dbg->edges, &edge_key, HASH_EDGE(&edge_key));
+
+ old_tgt_idx = get_irn_node_nr(edge_key.tgt);
+
+ /* remove the old edge */
+ if (old_edge) {
+ snprintf(buf, sizeof(buf), "deleteEdge \"n%un%up%d\"\n", src_idx, old_tgt_idx, i);
+ send_cmd(dbg, buf);
+ pset_remove(dbg->edges, old_edge, HASH_EDGE(old_edge));
+ }
+ }
+
+ /* change the old node into an id node */
+ snprintf(buf, sizeof(buf), "changeNode \"%ld\" \"%u\"\n", get_irn_node_nr(old_node), NODE_REALIZER_ID);
+ send_cmd(dbg, buf);
+
+ /* add new Id input */
+ snprintf(buf, sizeof(buf), "addEdge \"n%un%up%d\" \"%u\" \"%u\" \"%u\" \"%d\"\n",
+ src_idx, tgt_idx, 0, /* edge id */
+ src_idx, /* source node id */
+ tgt_idx, /* target node id */
+ get_edge_realizer(old_node, entry->nw), /* realizer id */
+ 0); /* title */
+ send_cmd(dbg, buf);
+
+ /* go */
+ show_and_sync(dbg);
+
+ /* add the new edge to our pset */
+ new_edge = obstack_alloc(&dbg->obst, sizeof(*new_edge));
+ new_edge->src = old_node;
+ new_edge->tgt = entry->nw;
+ new_edge->pos = 0;
+ pset_insert(dbg->edges, new_edge, HASH_EDGE(new_edge));
+}
+
+/**
+ * Hook: Just mark start/end of dead node elimination.
+ */
+static void firm_ycomp_debug_dead_node_elim(void *context, ir_graph *irg, int start) {
+ firm_ycomp_dbg_t *dbg = context;
+ (void) irg;
+ dbg->in_dead_node_elim = start != 0;
+}
+
+/**
+ * Establish connection to yComp and register all hooks.
+ */
+void firm_init_ycomp_debugger(const char *host, unsigned port) {