1use std::collections::HashMap;
6
7#[derive(Debug, Clone)]
9pub struct BasicBlock {
10 pub id: usize,
11 pub predecessors: Vec<usize>,
12 pub successors: Vec<usize>,
13}
14
15#[derive(Default)]
17pub struct ControlFlowGraph {
18 blocks: HashMap<usize, BasicBlock>,
19 entry: Option<usize>,
20}
21
22impl ControlFlowGraph {
23 pub fn new() -> Self {
24 Self::default()
25 }
26
27 pub fn add_block(&mut self, id: usize) {
28 self.blocks.insert(
29 id,
30 BasicBlock {
31 id,
32 predecessors: Vec::new(),
33 successors: Vec::new(),
34 },
35 );
36 }
37
38 pub fn add_edge(&mut self, from: usize, to: usize) {
39 if let Some(b) = self.blocks.get_mut(&from) {
40 b.successors.push(to);
41 }
42 if let Some(b) = self.blocks.get_mut(&to) {
43 b.predecessors.push(from);
44 }
45 }
46
47 pub fn set_entry(&mut self, id: usize) {
48 self.entry = Some(id);
49 }
50}