| 604 | |
| 605 | #[cfg(test)] |
| 606 | fn check_multiblock(blocks: [pcode::Block; 3], load_offset: usize, resize: Option<(u8, u8)>) { |
| 607 | use icicle_vm::cpu::BlockKey; |
| 608 | use pcode::PcodeDisplay; |
| 609 | |
| 610 | let sleigh = sleigh_runtime::SleighData::default(); |
| 611 | for (block_id, block) in blocks.iter().enumerate() { |
| 612 | eprintln!("{block_id}:"); |
| 613 | for (i, entry) in block.instructions.iter().enumerate() { |
| 614 | eprintln!("[{i}] {}", entry.display(&sleigh)); |
| 615 | } |
| 616 | eprintln!(""); |
| 617 | } |
| 618 | |
| 619 | let [parent, fallthrough, jump] = blocks; |
| 620 | |
| 621 | let mut code = BlockTable::default(); |
| 622 | code.blocks.push(icicle_vm::cpu::lifter::Block { |
| 623 | pcode: parent, |
| 624 | entry: None, |
| 625 | start: 0x0, |
| 626 | end: 0x0, |
| 627 | context: 0x0, |
| 628 | exit: lifter::BlockExit::new( |
| 629 | pcode::VarNode::new(0x1000, 1).into(), |
| 630 | lifter::Target::External(0x2.into()), |
| 631 | lifter::Target::External(0x1.into()), |
| 632 | ), |
| 633 | breakpoints: 0x0, |
| 634 | num_instructions: 0x1, |
| 635 | }); |
| 636 | code.map.insert(BlockKey { vaddr: 0x1, isa_mode: 0 }, BlockGroup { |
| 637 | blocks: (1, 2), |
| 638 | start: 0x1, |
| 639 | end: 0x2, |
| 640 | }); |
| 641 | code.blocks.push(icicle_vm::cpu::lifter::Block { |
| 642 | pcode: fallthrough, |
| 643 | entry: None, |
| 644 | start: 0x1, |
| 645 | end: 0x0, |
| 646 | context: 0x0, |
| 647 | exit: lifter::BlockExit::invalid(), |
| 648 | breakpoints: 0x0, |
| 649 | num_instructions: 0x1, |
| 650 | }); |
| 651 | code.map.insert(BlockKey { vaddr: 0x2, isa_mode: 0 }, BlockGroup { |
| 652 | blocks: (2, 3), |
| 653 | start: 0x2, |
| 654 | end: 0x3, |
| 655 | }); |
| 656 | code.blocks.push(icicle_vm::cpu::lifter::Block { |
| 657 | pcode: jump, |
| 658 | entry: None, |
| 659 | start: 0x2, |
| 660 | end: 0x0, |
| 661 | context: 0x0, |
| 662 | exit: lifter::BlockExit::invalid(), |
| 663 | breakpoints: 0x0, |