MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / emit_veneer

Method emit_veneer

cranelift/codegen/src/machinst/buffer.rs:1567–1601  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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,

Callers 1

handle_fixupMethod · 0.80

Calls 8

cur_offsetMethod · 0.80
get_appended_spaceMethod · 0.80
use_label_at_offsetMethod · 0.80
align_toMethod · 0.45
patch_sizeMethod · 0.45
patchMethod · 0.45
veneer_sizeMethod · 0.45
generate_veneerMethod · 0.45

Tested by

no test coverage detected