Cranelift: Remove ABICallee trait (#4701)
* Cranelift: Remove `ABICallee` trait It has only one implementation: the `ABICalleeImpl` struct. By using that directly we can avoid unnecessary layers of generics and abstractions as well as a couple `Box`es that were previously putting the single implementation into a `Box<dyn>`. * Cranelift: Rename `ABICalleeImpl` to `AbiCallee` * Fix comments as per review * Rename `AbiCallee` to `Callee`
This commit is contained in:
@@ -21,7 +21,7 @@ use smallvec::{smallvec, SmallVec};
|
||||
// these ABIs are very similar.
|
||||
|
||||
/// Support for the AArch64 ABI from the callee side (within a function body).
|
||||
pub(crate) type AArch64ABICallee = ABICalleeImpl<AArch64MachineDeps>;
|
||||
pub(crate) type AArch64Callee = Callee<AArch64MachineDeps>;
|
||||
|
||||
/// Support for the AArch64 ABI from the caller side (at a callsite).
|
||||
pub(crate) type AArch64ABICaller = ABICallerImpl<AArch64MachineDeps>;
|
||||
@@ -65,7 +65,7 @@ fn saved_reg_stack_size(
|
||||
|
||||
/// AArch64-specific ABI behavior. This struct just serves as an implementation
|
||||
/// point for the trait; it is never actually instantiated.
|
||||
pub(crate) struct AArch64MachineDeps;
|
||||
pub struct AArch64MachineDeps;
|
||||
|
||||
impl IsaFlags for aarch64_settings::Flags {}
|
||||
|
||||
|
||||
@@ -630,7 +630,7 @@ pub struct EmitState {
|
||||
}
|
||||
|
||||
impl MachInstEmitState<Inst> for EmitState {
|
||||
fn new(abi: &dyn ABICallee<I = Inst>) -> Self {
|
||||
fn new(abi: &Callee<AArch64MachineDeps>) -> Self {
|
||||
EmitState {
|
||||
virtual_sp_offset: 0,
|
||||
nominal_sp_to_fp: abi.frame_size() as i64,
|
||||
|
||||
@@ -1060,6 +1060,7 @@ fn aarch64_get_operands<F: Fn(VReg) -> VReg>(inst: &Inst, collector: &mut Operan
|
||||
// Instructions: misc functions and external interface
|
||||
|
||||
impl MachInst for Inst {
|
||||
type ABIMachineSpec = AArch64MachineDeps;
|
||||
type LabelUse = LabelUse;
|
||||
|
||||
fn get_operands<F: Fn(VReg) -> VReg>(&self, collector: &mut OperandCollector<'_, F>) {
|
||||
|
||||
@@ -60,7 +60,7 @@ impl AArch64Backend {
|
||||
flags: shared_settings::Flags,
|
||||
) -> CodegenResult<(VCode<inst::Inst>, regalloc2::Output)> {
|
||||
let emit_info = EmitInfo::new(flags.clone());
|
||||
let abi = Box::new(abi::AArch64ABICallee::new(func, self, &self.isa_flags)?);
|
||||
let abi = abi::AArch64Callee::new(func, self, &self.isa_flags)?;
|
||||
compile::compile::<AArch64Backend>(func, self, abi, &self.machine_env, emit_info)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ use std::convert::TryFrom;
|
||||
// We use a generic implementation that factors out ABI commonalities.
|
||||
|
||||
/// Support for the S390x ABI from the callee side (within a function body).
|
||||
pub type S390xABICallee = ABICalleeImpl<S390xMachineDeps>;
|
||||
pub type S390xCallee = Callee<S390xMachineDeps>;
|
||||
|
||||
/// ABI Register usage
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//! S390x ISA: binary code emission.
|
||||
|
||||
use crate::binemit::{Reloc, StackMap};
|
||||
use crate::ir::TrapCode;
|
||||
use crate::ir::{MemFlags, RelSourceLoc};
|
||||
use crate::ir::{MemFlags, RelSourceLoc, TrapCode};
|
||||
use crate::isa::s390x::abi::S390xMachineDeps;
|
||||
use crate::isa::s390x::inst::*;
|
||||
use crate::isa::s390x::settings as s390x_settings;
|
||||
use crate::machinst::reg::count_operands;
|
||||
@@ -1260,7 +1260,7 @@ pub struct EmitState {
|
||||
}
|
||||
|
||||
impl MachInstEmitState<Inst> for EmitState {
|
||||
fn new(abi: &dyn ABICallee<I = Inst>) -> Self {
|
||||
fn new(abi: &Callee<S390xMachineDeps>) -> Self {
|
||||
EmitState {
|
||||
virtual_sp_offset: 0,
|
||||
initial_sp_offset: abi.frame_size() as i64,
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
use crate::binemit::{Addend, CodeOffset, Reloc};
|
||||
use crate::ir::{types, ExternalName, Opcode, Type};
|
||||
use crate::isa::s390x::abi::S390xMachineDeps;
|
||||
use crate::isa::CallConv;
|
||||
use crate::machinst::*;
|
||||
use crate::{settings, CodegenError, CodegenResult};
|
||||
@@ -977,6 +978,7 @@ fn s390x_get_operands<F: Fn(VReg) -> VReg>(inst: &Inst, collector: &mut OperandC
|
||||
// Instructions: misc functions and external interface
|
||||
|
||||
impl MachInst for Inst {
|
||||
type ABIMachineSpec = S390xMachineDeps;
|
||||
type LabelUse = LabelUse;
|
||||
|
||||
fn get_operands<F: Fn(VReg) -> VReg>(&self, collector: &mut OperandCollector<'_, F>) {
|
||||
|
||||
@@ -58,7 +58,7 @@ impl S390xBackend {
|
||||
func: &Function,
|
||||
) -> CodegenResult<(VCode<inst::Inst>, regalloc2::Output)> {
|
||||
let emit_info = EmitInfo::new(self.isa_flags.clone());
|
||||
let abi = Box::new(abi::S390xABICallee::new(func, self, &self.isa_flags)?);
|
||||
let abi = abi::S390xCallee::new(func, self, &self.isa_flags)?;
|
||||
compile::compile::<S390xBackend>(func, self, abi, &self.machine_env, emit_info)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,13 +21,13 @@ use std::convert::TryFrom;
|
||||
static STACK_ARG_RET_SIZE_LIMIT: u64 = 128 * 1024 * 1024;
|
||||
|
||||
/// Support for the x64 ABI from the callee side (within a function body).
|
||||
pub(crate) type X64ABICallee = ABICalleeImpl<X64ABIMachineSpec>;
|
||||
pub(crate) type X64Callee = Callee<X64ABIMachineSpec>;
|
||||
|
||||
/// Support for the x64 ABI from the caller side (at a callsite).
|
||||
pub(crate) type X64ABICaller = ABICallerImpl<X64ABIMachineSpec>;
|
||||
|
||||
/// Implementation of ABI primitives for x64.
|
||||
pub(crate) struct X64ABIMachineSpec;
|
||||
pub struct X64ABIMachineSpec;
|
||||
|
||||
impl IsaFlags for x64_settings::Flags {}
|
||||
|
||||
|
||||
@@ -2157,6 +2157,8 @@ fn x64_get_operands<F: Fn(VReg) -> VReg>(inst: &Inst, collector: &mut OperandCol
|
||||
// Instructions: misc functions and external interface
|
||||
|
||||
impl MachInst for Inst {
|
||||
type ABIMachineSpec = X64ABIMachineSpec;
|
||||
|
||||
fn get_operands<F: Fn(VReg) -> VReg>(&self, collector: &mut OperandCollector<'_, F>) {
|
||||
x64_get_operands(&self, collector)
|
||||
}
|
||||
@@ -2460,7 +2462,7 @@ impl MachInstEmit for Inst {
|
||||
}
|
||||
|
||||
impl MachInstEmitState<Inst> for EmitState {
|
||||
fn new(abi: &dyn ABICallee<I = Inst>) -> Self {
|
||||
fn new(abi: &Callee<X64ABIMachineSpec>) -> Self {
|
||||
EmitState {
|
||||
virtual_sp_offset: 0,
|
||||
nominal_sp_to_fp: abi.frame_size() as i64,
|
||||
|
||||
@@ -53,7 +53,7 @@ impl X64Backend {
|
||||
// This performs lowering to VCode, register-allocates the code, computes
|
||||
// block layout and finalizes branches. The result is ready for binary emission.
|
||||
let emit_info = EmitInfo::new(flags.clone(), self.x64_flags.clone());
|
||||
let abi = Box::new(abi::X64ABICallee::new(&func, self, &self.x64_flags)?);
|
||||
let abi = abi::X64Callee::new(&func, self, &self.x64_flags)?;
|
||||
compile::compile::<Self>(&func, self, abi, &self.reg_env, emit_info)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user