added function to retrieve irn ops
[libfirm] / ir / be / benumb.c
1 /**
2  * Numbering implementation.
3  * @author Sebastian Hack
4  * @date 8.12.2004
5  */
6
7 #ifdef HAVE_CONFIG_H
8 # include "config.h"
9 #endif
10
11 #ifdef HAVE_STDLIB_H
12 # include <stdlib.h>
13 #endif
14
15 #include "impl.h"
16
17 #include "irnode_t.h"
18 #include "irgwalk.h"
19 #include "xmalloc.h"
20
21 #include "be_t.h"
22 #include "benumb_t.h"
23
24 int numbering_irn_data_offset = 0;
25 int numbering_irg_data_offset = 0;
26
27 FIRM_IMPL1(get_irn_graph_nr, int, const ir_node *)
28 FIRM_IMPL1(get_irn_block_nr, int, const ir_node *)
29 FIRM_IMPL1(get_block_graph_nr, int, const ir_node *)
30 FIRM_IMPL1(get_block_node_count, int, const ir_node *)
31 FIRM_IMPL1(get_graph_block_count, int, const ir_graph *)
32 FIRM_IMPL2(get_irn_for_graph_nr, ir_node *, const ir_graph *, int)
33
34 static void numbering_walker(ir_node *irn, void *env)
35 {
36         irg_numbering_t *graph_nr = get_irg_numbering(get_irn_irg(irn));
37         numbering_t *irn_nr = get_irn_numbering(irn);
38
39         if(is_Block(irn))
40                 irn_nr->global_nr = graph_nr->local_nr++;
41         else {
42                 numbering_t *block_nr = get_irn_numbering(get_nodes_block(irn));
43                 irn_nr->local_nr = block_nr->local_nr++;
44                 irn_nr->global_nr = graph_nr->global_nr++;
45         }
46 }
47
48 static void reverse_walker(ir_node *irn, void *env)
49 {
50         if(!is_Block(irn)) {
51                 ir_node **map = env;
52                 map[get_irn_graph_nr(irn)] = irn;
53         }
54 }
55
56 void be_numbering(ir_graph *irg)
57 {
58         ir_node **reverse_map;
59
60         irg_walk_graph(irg, numbering_walker, NULL, NULL);
61
62         reverse_map = xcalloc(get_graph_node_count(irg), sizeof(reverse_map[0]));
63         irg_walk_graph(irg, reverse_walker, NULL, reverse_map);
64
65         get_irg_numbering(irg)->reverse_map = reverse_map;
66 }
67
68 void be_numbering_done(ir_graph *irg)
69 {
70         free(get_irg_numbering(irg)->reverse_map);
71 }
72
73 void be_numbering_init(void)
74 {
75         numbering_irn_data_offset = register_additional_node_data(sizeof(numbering_t));
76         numbering_irg_data_offset = register_additional_graph_data(sizeof(irg_numbering_t));
77 }