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