2 function::{Block, FnFields, SSAVal, SSAValDef},
3 index::{BlockIdx, SSAValIdx},
6 use arbitrary::{Arbitrary, Error, Unstructured};
8 struct FnBuilder<'a, 'b> {
9 u: &'a mut Unstructured<'b>,
13 impl FnBuilder<'_, '_> {
14 fn new_ssa_val(&mut self, ty: Ty, def: SSAValDef) -> SSAValIdx {
15 let retval = SSAValIdx::new(self.func.ssa_vals.len());
16 self.func.ssa_vals.push(SSAVal {
19 operand_uses: Default::default(),
20 branch_succ_param_uses: Default::default(),
24 fn run(&mut self) -> Result<(), Error> {
25 for block_idx in 0..self.u.int_in_range(1..=10)? {
26 let block_idx = BlockIdx::new(block_idx);
27 let mut params = Vec::new();
28 for param_idx in 0..self.u.int_in_range(0..=10)? {
29 let ty = self.u.arbitrary()?;
30 params.push(self.new_ssa_val(
32 SSAValDef::BlockParam {
39 self.func.blocks.push(Block {
42 preds: Default::default(),
43 immediate_dominator: Default::default(),
50 impl<'a> Arbitrary<'a> for FnFields {
51 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self, Error> {
52 let mut builder = FnBuilder {
58 start_inst_to_block_map: Default::default(),