waffle_func_reloop/
lib.rs

1use relooper::ShapedBlock;
2use waffle::{cfg::CFGInfo, Block, FunctionBody};
3pub fn go(b: &FunctionBody) -> Box<ShapedBlock<Block>> {
4    let cfg = CFGInfo::new(b);
5    let reloop = std::panic::catch_unwind(|| {
6        relooper::reloop(
7            b.blocks
8                .entries()
9                .filter(|k| cfg.dominates(b.entry, k.0))
10                .map(|(k, l)| {
11                    (
12                        k,
13                        l.succs
14                            .iter()
15                            .cloned()
16                            .chain(b.blocks.iter().filter(|x| cfg.dominates(*x, k)))
17                            .collect(),
18                    )
19                })
20                // .chain(once((Block::invalid(), vec![b.entry])))
21                .collect(),
22            // Block::invalid(),
23            b.entry,
24        )
25    });
26    let reloop = match reloop {
27        Ok(a) => a,
28        Err(e) => {
29            panic!(
30                "reloop failure ({}) in {}",
31                e.downcast_ref::<&str>()
32                    .map(|a| *a)
33                    .unwrap_or("unknown panic"),
34                b.display("", None)
35            );
36        }
37    };
38    reloop
39}