Decouple MachBufferFinalized<Stencil> from ir::FunctionParameters (#5419)

This commit allows retrieving a `MachBufferFinalized<Final>` from a
`MachBufferFinalized<Stencil>` without relying on
`ir::FunctionParameters`. Instead it uses the function's base source location,
which is the only piece used by the previous `apply_params` definition.

This change allows other uses cases (e.g. Winch) to use an opaque, common
concept, exposed outside of `cranelift-codegen` to get the finalized state of
the machine buffer. This change implies that Winch will transitively know about
the `Stencil` compilation phase, but the `Stencil` phase is not exposed to Winch.

Other alternatives considered:

Parametrizing `MachBufferFinzalized` in a way such that it allows specifying
which compilation phase the caller is targetting. Such approach would require
also parametrizing the `MachSrcLoc` definition. One of the main drawbacks of
this approach is that it also requires changing how the `MachBuffer`'s
`start_srcloc` works: for caller requesting a `Final` `MachBufferFinalized`, the
`MachBuffer` will need to work in terms of `SourceLoc` rather than in
`RelSourceLoc` terms. This approach doesn't necessarily present more advantages
than the approach presented in this change, in which there's no need to make any
fundamental changes and in which all the `cranelift-codegen` primitives are
already exposed.
This commit is contained in:
Saúl Cabrera
2022-12-13 07:13:45 -05:00
committed by GitHub
parent a5ecb5e647
commit a76e0e8aa5
2 changed files with 6 additions and 8 deletions

View File

@@ -141,7 +141,6 @@
//! semantics below (grep for "Preserves execution semantics"). //! semantics below (grep for "Preserves execution semantics").
use crate::binemit::{Addend, CodeOffset, Reloc, StackMap}; use crate::binemit::{Addend, CodeOffset, Reloc, StackMap};
use crate::ir::function::FunctionParameters;
use crate::ir::{ExternalName, Opcode, RelSourceLoc, SourceLoc, TrapCode}; use crate::ir::{ExternalName, Opcode, RelSourceLoc, SourceLoc, TrapCode};
use crate::isa::unwind::UnwindInst; use crate::isa::unwind::UnwindInst;
use crate::machinst::{ use crate::machinst::{
@@ -172,8 +171,6 @@ pub trait CompilePhase {
} }
/// Status of a compiled artifact that needs patching before being used. /// Status of a compiled artifact that needs patching before being used.
///
/// Only used internally.
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
pub struct Stencil; pub struct Stencil;
@@ -267,7 +264,8 @@ pub struct MachBuffer<I: VCodeInst> {
} }
impl MachBufferFinalized<Stencil> { impl MachBufferFinalized<Stencil> {
pub(crate) fn apply_params(self, params: &FunctionParameters) -> MachBufferFinalized<Final> { /// Get a finalized machine buffer by applying the function's base source location.
pub fn apply_base_srcloc(self, base_srcloc: SourceLoc) -> MachBufferFinalized<Final> {
MachBufferFinalized { MachBufferFinalized {
data: self.data, data: self.data,
relocs: self.relocs, relocs: self.relocs,
@@ -276,7 +274,7 @@ impl MachBufferFinalized<Stencil> {
srclocs: self srclocs: self
.srclocs .srclocs
.into_iter() .into_iter()
.map(|srcloc| srcloc.apply_params(params)) .map(|srcloc| srcloc.apply_base_srcloc(base_srcloc))
.collect(), .collect(),
stack_maps: self.stack_maps, stack_maps: self.stack_maps,
unwind_info: self.unwind_info, unwind_info: self.unwind_info,
@@ -1550,11 +1548,11 @@ pub struct MachSrcLoc<T: CompilePhase> {
} }
impl MachSrcLoc<Stencil> { impl MachSrcLoc<Stencil> {
fn apply_params(self, params: &FunctionParameters) -> MachSrcLoc<Final> { fn apply_base_srcloc(self, base_srcloc: SourceLoc) -> MachSrcLoc<Final> {
MachSrcLoc { MachSrcLoc {
start: self.start, start: self.start,
end: self.end, end: self.end,
loc: self.loc.expand(params.base_srcloc()), loc: self.loc.expand(base_srcloc),
} }
} }
} }

View File

@@ -323,7 +323,7 @@ impl CompiledCodeStencil {
/// Apply function parameters to finalize a stencil into its final form. /// Apply function parameters to finalize a stencil into its final form.
pub fn apply_params(self, params: &FunctionParameters) -> CompiledCode { pub fn apply_params(self, params: &FunctionParameters) -> CompiledCode {
CompiledCode { CompiledCode {
buffer: self.buffer.apply_params(params), buffer: self.buffer.apply_base_srcloc(params.base_srcloc()),
frame_size: self.frame_size, frame_size: self.frame_size,
disasm: self.disasm, disasm: self.disasm,
value_labels_ranges: self.value_labels_ranges, value_labels_ranges: self.value_labels_ranges,