Emits a "veneer" the `kind` code at `offset` to jump to `label`. This will generate extra machine code, using `kind`, to get a larger-jump-kind than `kind` allows. The code at `offset` is then patched to jump to our new code, and then the new code is enqueued for a fixup to get processed at some later time.
(&mut self, label: MachLabel, offset: CodeOffset, kind: I::LabelUse)
| 1565 | /// patched to jump to our new code, and then the new code is enqueued for |
| 1566 | /// a fixup to get processed at some later time. |
| 1567 | fn emit_veneer(&mut self, label: MachLabel, offset: CodeOffset, kind: I::LabelUse) { |
| 1568 | // If this `kind` doesn't support a veneer then that's a bug in the |
| 1569 | // backend because we need to implement support for such a veneer. |
| 1570 | assert!( |
| 1571 | kind.supports_veneer(), |
| 1572 | "jump beyond the range of {kind:?} but a veneer isn't supported", |
| 1573 | ); |
| 1574 | |
| 1575 | // Allocate space for a veneer in the island. |
| 1576 | self.align_to(I::LabelUse::ALIGN); |
| 1577 | let veneer_offset = self.cur_offset(); |
| 1578 | trace!("making a veneer at {}", veneer_offset); |
| 1579 | let start = offset as usize; |
| 1580 | let end = (offset + kind.patch_size()) as usize; |
| 1581 | let slice = &mut self.data[start..end]; |
| 1582 | // Patch the original label use to refer to the veneer. |
| 1583 | trace!( |
| 1584 | "patching original at offset {} to veneer offset {}", |
| 1585 | offset, veneer_offset |
| 1586 | ); |
| 1587 | kind.patch(slice, offset, veneer_offset); |
| 1588 | // Generate the veneer. |
| 1589 | let veneer_slice = self.get_appended_space(kind.veneer_size() as usize); |
| 1590 | let (veneer_fixup_off, veneer_label_use) = |
| 1591 | kind.generate_veneer(veneer_slice, veneer_offset); |
| 1592 | trace!( |
| 1593 | "generated veneer; fixup offset {}, label_use {:?}", |
| 1594 | veneer_fixup_off, veneer_label_use |
| 1595 | ); |
| 1596 | // Register a new use of `label` with our new veneer fixup and |
| 1597 | // offset. This'll recalculate deadlines accordingly and |
| 1598 | // enqueue this fixup to get processed at some later |
| 1599 | // time. |
| 1600 | self.use_label_at_offset(veneer_fixup_off, label, veneer_label_use); |
| 1601 | } |
| 1602 | |
| 1603 | fn finish_emission_maybe_forcing_veneers( |
| 1604 | &mut self, |
no test coverage detected