becopyilp: Inline struct size_red_t into struct ilp_env_t.
[libfirm] / ir / ana / absgraph.c
1 /*
2  * This file is part of libFirm.
3  * Copyright (C) 2012 University of Karlsruhe.
4  */
5
6 /**
7  * @file
8  * @author  Sebastian Hack
9  * @date    20.04.2007
10  * @brief
11  *
12  * Abstract graph implementations for the CFG of a ir_graph.
13  */
14 #include <config.h>
15
16 #include "irgraph_t.h"
17 #include "iredges_t.h"
18 #include "absgraph.h"
19
20 static void *irg_cfg_succ_get_root(void *self)
21 {
22         ir_graph *irg = (ir_graph*) self;
23         assure_edges_kind(irg, EDGE_KIND_BLOCK);
24         return get_irg_start_block(irg);
25 }
26
27 static void *irg_cfg_succ_get_end(void *self)
28 {
29         ir_graph *irg = (ir_graph*) self;
30         return get_irg_end_block(irg);
31 }
32
33 static void irg_cfg_succ_grow_succs(void *self, void *node, struct obstack *obst)
34 {
35         ir_node *bl = (ir_node*) node;
36
37         (void) self;
38         foreach_block_succ(bl, edge) {
39                 obstack_ptr_grow(obst, get_edge_src_irn(edge));
40         }
41 }
42
43 const absgraph_t absgraph_irg_cfg_succ = {
44         irg_cfg_succ_get_root,
45         irg_cfg_succ_grow_succs,
46         irg_cfg_succ_get_end
47 };
48
49 static void *irg_cfg_pred_get_root(void *self)
50 {
51         return get_irg_end_block((ir_graph*) self);
52 }
53
54 static void *irg_cfg_pred_get_end(void *self)
55 {
56         return get_irg_start_block((ir_graph*) self);
57 }
58
59 static void irg_cfg_pred_grow_succs(void *self, void *node, struct obstack *obst)
60 {
61         int i, n;
62
63         (void) self;
64         for (i = 0, n = get_irn_arity((ir_node*) node); i < n; ++i) {
65                 obstack_ptr_grow(obst, get_irn_n((ir_node*) node, i));
66         }
67 }
68
69 const absgraph_t absgraph_irg_cfg_pred = {
70         irg_cfg_pred_get_root,
71         irg_cfg_pred_grow_succs,
72         irg_cfg_pred_get_end
73 };