(&self, w: &mut impl io::Write)
| 2497 | } |
| 2498 | |
| 2499 | fn dump_instances(&self, w: &mut impl io::Write) -> io::Result<()> { |
| 2500 | writeln!(w, "; All specializer \"generic\"s and their instances:")?; |
| 2501 | writeln!(w)?; |
| 2502 | |
| 2503 | // FIXME(eddyb) maybe dump (transitive) dependencies? could use a def-use graph. |
| 2504 | for (&generic_id, generic) in &self.specializer.generics { |
| 2505 | if let Some(name) = self.specializer.debug_names.get(&generic_id) { |
| 2506 | writeln!(w, "; {name}")?; |
| 2507 | } |
| 2508 | |
| 2509 | write!( |
| 2510 | w, |
| 2511 | "{} = Op{:?}", |
| 2512 | Instance { |
| 2513 | generic_id, |
| 2514 | generic_args: Param(0)..Param(generic.param_count) |
| 2515 | } |
| 2516 | .display(Param::range_iter), |
| 2517 | generic.def.class.opcode |
| 2518 | )?; |
| 2519 | let mut next_param = Param(0); |
| 2520 | for operand in generic |
| 2521 | .def |
| 2522 | .result_type |
| 2523 | .map(Operand::IdRef) |
| 2524 | .iter() |
| 2525 | .chain(generic.def.operands.iter()) |
| 2526 | { |
| 2527 | write!(w, " ")?; |
| 2528 | let (needed, used_generic) = self.specializer.params_needed_by(operand); |
| 2529 | let params = next_param..Param(next_param.0 + needed); |
| 2530 | |
| 2531 | // NOTE(eddyb) see HACK comment in `instantiate_instruction`. |
| 2532 | if generic.def.class.opcode != Op::Function { |
| 2533 | next_param = params.end; |
| 2534 | } |
| 2535 | |
| 2536 | if used_generic.is_some() { |
| 2537 | write!( |
| 2538 | w, |
| 2539 | "{}", |
| 2540 | Instance { |
| 2541 | generic_id: operand.unwrap_id_ref(), |
| 2542 | generic_args: params |
| 2543 | } |
| 2544 | .display(Param::range_iter) |
| 2545 | )?; |
| 2546 | } else if needed == 1 { |
| 2547 | write!(w, "{}", params.start)?; |
| 2548 | } else { |
| 2549 | write!(w, "{operand}")?; |
| 2550 | } |
| 2551 | } |
| 2552 | writeln!(w)?; |
| 2553 | |
| 2554 | if let Some(param_values) = &generic.param_values { |
| 2555 | write!(w, " where")?; |
| 2556 | for (i, v) in param_values.iter().enumerate() { |
no test coverage detected