waffle_func_reloop/
lib.rs1use 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 .collect(),
22 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}