* An edge.
*/
struct _ir_edge_t {
-#ifdef DEBUG_libfirm
- long src_nr; /**< The node number of the source node. */
-#endif
ir_node *src; /**< The source node of the edge. */
int pos; /**< The position of the edge at @p src. */
unsigned invalid : 1; /**< edges that are removed are marked invalid. */
unsigned present : 1; /**< Used by the verifier. Don't rely on its content. */
struct list_head list; /**< The list head to queue all out edges at a node. */
+#ifdef DEBUG_libfirm
+ long src_nr; /**< The node number of the source node. */
+#endif
};
/**
*/
static INLINE int _get_irn_n_edges(const ir_node *irn)
{
- return _get_irn_edge_info(irn)->out_count;
+/* Perhaps out_count was buggy. This code does it more safely.
+
+ int res = 0;
+ struct list_head *pos, *head = _get_irn_outs_head(irn);
+ list_for_each(pos, head)
+ res++;
+ return res;
+*/
+ return _get_irn_edge_info(irn)->out_count;
}
static INLINE int _edges_activated(const ir_graph *irg)
void edges_init_graph(ir_graph *irg);
+/**
+ * Notify of a edge change.
+ * The edge from (src, pos) -> old_tgt is redirected to tgt
+ */
void edges_notify_edge(ir_node *src, int pos, ir_node *tgt, ir_node *old_tgt, ir_graph *irg);
+/**
+ * A node is deleted.
+ */
void edges_node_deleted(ir_node *old, ir_graph *irg);
void edges_invalidate(ir_node *irn, ir_graph *irg);
+/**
+ * Register additional memory in an edge.
+ * This must be called before Firm is initialized.
+ * @param n Number of bytes you need.
+ * @return A number you have to keep and to pass
+ * edges_get_private_data()
+ * to get a pointer to your data.
+ */
+int edges_register_private_data(size_t n);
+
+/**
+ * Get a pointer to the private data you registered.
+ * @param edge The edge.
+ * @param ofs The number, you obtained with
+ * edges_register_private_data().
+ * @return A pointer to the private data.
+ */
+static INLINE void *_get_edge_private_data(const ir_edge_t *edge, int ofs)
+{
+ /* Get the size of the edge. */
+ size_t size =
+ is_Block(edge->src) ? sizeof(ir_block_edge_t) : sizeof(ir_edge_t);
+
+ return (void *) ((char *) edge + size + ofs);
+}
+
/**
* Initialize the out edges.
* This must be called before firm is initialized.
#define get_block_succ_next(irn,last) _get_block_succ_next(irn, last)
#define get_edge_src_irn(edge) _get_edge_src_irn(edge)
#define get_edge_src_pos(edge) _get_edge_src_pos(edge)
+#define get_edge_private_data(edge,ofs) _get_edge_private_data(edge,ofs)
#define edges_activated(irg) _edges_activated(irg)
#define edges_assure(irg) _edges_assure(irg)
#define get_irn_out_edge_next(irn,last) NULL
#define get_edge_src_irn(edge) NULL
#define get_edge_src_pos(edge) -1
+#define get_edge_private_data(edge,ofs) NULL
#define edges_activated(irg) 0
#define edges_assure(irg)