(&self, module: &Module)
| 597 | } |
| 598 | |
| 599 | pub fn do_disassemble(&self, module: &Module) { |
| 600 | fn compact_ids(module: &mut rspirv::dr::Function) -> u32 { |
| 601 | let mut remap = std::collections::HashMap::new(); |
| 602 | let mut insert = |current_id: &mut u32| { |
| 603 | let len = remap.len(); |
| 604 | *current_id = *remap.entry(*current_id).or_insert_with(|| len as u32 + 1); |
| 605 | }; |
| 606 | module.all_inst_iter_mut().for_each(|inst| { |
| 607 | if let Some(ref mut result_id) = &mut inst.result_id { |
| 608 | insert(result_id); |
| 609 | } |
| 610 | if let Some(ref mut result_type) = &mut inst.result_type { |
| 611 | insert(result_type); |
| 612 | } |
| 613 | inst.operands.iter_mut().for_each(|op| { |
| 614 | if let Some(w) = op.id_ref_any_mut() { |
| 615 | insert(w); |
| 616 | } |
| 617 | }); |
| 618 | }); |
| 619 | remap.len() as u32 + 1 |
| 620 | } |
| 621 | |
| 622 | use rspirv::binary::Disassemble; |
| 623 | |
| 624 | if self.disassemble { |
| 625 | eprintln!("{}", module.disassemble()); |
| 626 | } |
| 627 | |
| 628 | if let Some(func) = &self.disassemble_fn { |
| 629 | let id = module |
| 630 | .debug_names |
| 631 | .iter() |
| 632 | .find(|inst| { |
| 633 | inst.class.opcode == rspirv::spirv::Op::Name |
| 634 | && inst.operands[1].unwrap_literal_string() == func |
| 635 | }) |
| 636 | .unwrap_or_else(|| { |
| 637 | panic!( |
| 638 | "no function with the name `{}` found in:\n{}\n", |
| 639 | func, |
| 640 | module.disassemble() |
| 641 | ) |
| 642 | }) |
| 643 | .operands[0] |
| 644 | .unwrap_id_ref(); |
| 645 | let mut func = module |
| 646 | .functions |
| 647 | .iter() |
| 648 | .find(|f| f.def_id().unwrap() == id) |
| 649 | .unwrap() |
| 650 | .clone(); |
| 651 | // Compact to make IDs more stable |
| 652 | compact_ids(&mut func); |
| 653 | eprintln!("{}", func.disassemble()); |
| 654 | } |
| 655 | |
| 656 | if let Some(entry) = &self.disassemble_entry { |
no test coverage detected