2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief Some often needed tool-functions
23 * @author Michael Beck
26 #ifndef FIRM_COMMON_IRTOOLS_H
27 #define FIRM_COMMON_IRTOOLS_H
29 #include "firm_types.h"
32 lc_opt_entry_t *firm_opt_get_root(void);
38 #define MAX(x, y) ((x) > (y) ? (x) : (y))
39 #define MIN(x, y) ((x) < (y) ? (x) : (y))
41 /* calculate the address of the one past last element of an array whose size is
43 #define ENDOF(x) ((x) + sizeof(x) / sizeof(*(x)))
46 * Three valued compare as demanded by e.g. qsort(3)
48 * @param d Another number.
49 * @return 0 if c == d, -1 if c < d, 1 if c > d.
51 #define QSORT_CMP(c, d) (((c) > (d)) - ((c) < (d)))
55 * convert an integer into pointer
57 #define INT_TO_PTR(v) ((void *)((char *)0 + (v)))
60 * convert a pointer into an integer
62 #define PTR_TO_INT(v) ((int)((char *)(v) - (char *)0))
65 * Dump a pset containing Firm objects.
67 void firm_pset_dump(pset *set);
70 * The famous clear_link() walker-function.
71 * Sets all links fields of visited nodes to NULL.
72 * Do not implement it by yourself, use this one.
74 void firm_clear_link(ir_node *n, void *env);
77 * The famous clear_link_and_block_lists() walker-function.
78 * Sets all links fields of visited nodes to NULL.
79 * Additionally, clear all Phi-lists of visited blocks.
80 * Do not implement it by yourself, use this one
82 void firm_clear_node_and_phi_links(ir_node *n, void *env);
85 * Copies a node to a new irg. The Ins of the new node point to
86 * the predecessors on the old irg. n->link points to the new node.
88 * @param n The node to be copied
89 * @param irg the new irg
91 * Does NOT copy standard nodes like Start, End etc that are fixed
92 * in an irg. Instead, the corresponding nodes of the new irg are returned.
93 * Note further, that the new nodes have no block.
95 void copy_irn_to_irg(ir_node *n, ir_graph *irg);
98 * Creates an exact copy of a node.
99 * The copy resists on the same graph in the same block.
101 * @param n the node to copy
103 * @note If the copy is not changed, the next CSE operation will
104 * replace it by the original, so beware.
106 ir_node *exact_copy(const ir_node *n);