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:
@@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user