From 376c93bda0eeef9f203da34411b314ad1183fe8b Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Thu, 6 Jan 2022 14:39:24 +0100 Subject: [PATCH] Remove MachBackend It is identical to TargetIsa --- cranelift/codegen/src/isa/aarch64/mod.rs | 20 +++-- cranelift/codegen/src/isa/arm32/mod.rs | 29 +++++-- cranelift/codegen/src/isa/mod.rs | 5 +- cranelift/codegen/src/isa/s390x/mod.rs | 22 ++++-- cranelift/codegen/src/isa/x64/mod.rs | 20 +++-- cranelift/codegen/src/machinst/adapter.rs | 93 ----------------------- cranelift/codegen/src/machinst/compile.rs | 3 +- cranelift/codegen/src/machinst/mod.rs | 72 +----------------- 8 files changed, 75 insertions(+), 189 deletions(-) delete mode 100644 cranelift/codegen/src/machinst/adapter.rs diff --git a/cranelift/codegen/src/isa/aarch64/mod.rs b/cranelift/codegen/src/isa/aarch64/mod.rs index 95987b1f0c..ae19034dd9 100644 --- a/cranelift/codegen/src/isa/aarch64/mod.rs +++ b/cranelift/codegen/src/isa/aarch64/mod.rs @@ -3,14 +3,14 @@ use crate::ir::condcodes::IntCC; use crate::ir::Function; use crate::isa::aarch64::settings as aarch64_settings; -use crate::isa::Builder as IsaBuilder; +use crate::isa::{Builder as IsaBuilder, TargetIsa}; use crate::machinst::{ - compile, MachBackend, MachCompileResult, MachTextSectionBuilder, TargetIsaAdapter, - TextSectionBuilder, VCode, + compile, MachCompileResult, MachTextSectionBuilder, TextSectionBuilder, VCode, }; use crate::result::CodegenResult; use crate::settings as shared_settings; use alloc::{boxed::Box, vec::Vec}; +use core::fmt; use regalloc::{PrettyPrint, RealRegUniverse}; use target_lexicon::{Aarch64Architecture, Architecture, Triple}; @@ -62,7 +62,7 @@ impl AArch64Backend { } } -impl MachBackend for AArch64Backend { +impl TargetIsa for AArch64Backend { fn compile_function( &self, func: &Function, @@ -153,6 +153,16 @@ impl MachBackend for AArch64Backend { } } +impl fmt::Display for AArch64Backend { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("MachBackend") + .field("name", &self.name()) + .field("triple", &self.triple()) + .field("flags", &format!("{}", self.flags())) + .finish() + } +} + /// Create a new `isa::Builder`. pub fn isa_builder(triple: Triple) -> IsaBuilder { assert!(triple.architecture == Architecture::Aarch64(Aarch64Architecture::Aarch64)); @@ -162,7 +172,7 @@ pub fn isa_builder(triple: Triple) -> IsaBuilder { constructor: |triple, shared_flags, builder| { let isa_flags = aarch64_settings::Flags::new(&shared_flags, builder); let backend = AArch64Backend::new_with_flags(triple, shared_flags, isa_flags); - Box::new(TargetIsaAdapter::new(backend)) + Box::new(backend) }, } } diff --git a/cranelift/codegen/src/isa/arm32/mod.rs b/cranelift/codegen/src/isa/arm32/mod.rs index 876c74fb45..f6a5ba8267 100644 --- a/cranelift/codegen/src/isa/arm32/mod.rs +++ b/cranelift/codegen/src/isa/arm32/mod.rs @@ -2,15 +2,15 @@ use crate::ir::condcodes::IntCC; use crate::ir::Function; -use crate::isa::Builder as IsaBuilder; +use crate::isa::{Builder as IsaBuilder, TargetIsa}; use crate::machinst::{ - compile, MachBackend, MachCompileResult, MachTextSectionBuilder, TargetIsaAdapter, - TextSectionBuilder, VCode, + compile, MachCompileResult, MachTextSectionBuilder, TextSectionBuilder, VCode, }; use crate::result::CodegenResult; use crate::settings; use alloc::{boxed::Box, vec::Vec}; +use core::fmt; use regalloc::{PrettyPrint, RealRegUniverse}; use target_lexicon::{Architecture, ArmArchitecture, Triple}; @@ -53,7 +53,7 @@ impl Arm32Backend { } } -impl MachBackend for Arm32Backend { +impl TargetIsa for Arm32Backend { fn compile_function( &self, func: &Function, @@ -100,6 +100,15 @@ impl MachBackend for Arm32Backend { Vec::new() } + #[cfg(feature = "unwind")] + fn emit_unwind_info( + &self, + _result: &MachCompileResult, + _kind: crate::machinst::UnwindInfoKind, + ) -> CodegenResult> { + Ok(None) // FIXME implement this + } + fn unsigned_add_overflow_condition(&self) -> IntCC { // Carry flag set. IntCC::UnsignedGreaterThanOrEqual @@ -110,6 +119,16 @@ impl MachBackend for Arm32Backend { } } +impl fmt::Display for Arm32Backend { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("MachBackend") + .field("name", &self.name()) + .field("triple", &self.triple()) + .field("flags", &format!("{}", self.flags())) + .finish() + } +} + /// Create a new `isa::Builder`. pub fn isa_builder(triple: Triple) -> IsaBuilder { assert!(match triple.architecture { @@ -123,7 +142,7 @@ pub fn isa_builder(triple: Triple) -> IsaBuilder { setup: settings::builder(), constructor: |triple, shared_flags, _| { let backend = Arm32Backend::new_with_flags(triple, shared_flags); - Box::new(TargetIsaAdapter::new(backend)) + Box::new(backend) }, } } diff --git a/cranelift/codegen/src/isa/mod.rs b/cranelift/codegen/src/isa/mod.rs index 270889c86c..e92dc21627 100644 --- a/cranelift/codegen/src/isa/mod.rs +++ b/cranelift/codegen/src/isa/mod.rs @@ -49,7 +49,7 @@ use crate::flowgraph; use crate::ir::{self, Function}; #[cfg(feature = "unwind")] use crate::isa::unwind::systemv::RegisterMappingError; -use crate::machinst::{MachBackend, MachCompileResult, TextSectionBuilder, UnwindInfoKind}; +use crate::machinst::{MachCompileResult, TextSectionBuilder, UnwindInfoKind}; use crate::settings; use crate::settings::SetResult; use crate::CodegenResult; @@ -273,9 +273,6 @@ pub trait TargetIsa: fmt::Display + Send + Sync { /// will be "labeled" or might have calls between them, typically the number /// of defined functions in the object file. fn text_section_builder(&self, num_labeled_funcs: u32) -> Box; - - /// Get the new-style MachBackend. - fn get_mach_backend(&self) -> &dyn MachBackend; } /// Methods implemented for free for target ISA! diff --git a/cranelift/codegen/src/isa/s390x/mod.rs b/cranelift/codegen/src/isa/s390x/mod.rs index 63a5762fe7..dbf8679924 100644 --- a/cranelift/codegen/src/isa/s390x/mod.rs +++ b/cranelift/codegen/src/isa/s390x/mod.rs @@ -5,15 +5,15 @@ use crate::ir::Function; use crate::isa::s390x::settings as s390x_settings; #[cfg(feature = "unwind")] use crate::isa::unwind::systemv::RegisterMappingError; -use crate::isa::Builder as IsaBuilder; +use crate::isa::{Builder as IsaBuilder, TargetIsa}; use crate::machinst::{ - compile, MachBackend, MachCompileResult, MachTextSectionBuilder, TargetIsaAdapter, - TextSectionBuilder, VCode, + compile, MachCompileResult, MachTextSectionBuilder, TextSectionBuilder, VCode, }; use crate::result::CodegenResult; use crate::settings as shared_settings; use alloc::{boxed::Box, vec::Vec}; +use core::fmt; use regalloc::{PrettyPrint, RealRegUniverse, Reg}; use target_lexicon::{Architecture, Triple}; @@ -65,7 +65,7 @@ impl S390xBackend { } } -impl MachBackend for S390xBackend { +impl TargetIsa for S390xBackend { fn compile_function( &self, func: &Function, @@ -151,7 +151,7 @@ impl MachBackend for S390xBackend { } #[cfg(feature = "unwind")] - fn map_reg_to_dwarf(&self, reg: Reg) -> Result { + fn map_regalloc_reg_to_dwarf(&self, reg: Reg) -> Result { inst::unwind::systemv::map_reg(reg).map(|reg| reg.0) } @@ -160,6 +160,16 @@ impl MachBackend for S390xBackend { } } +impl fmt::Display for S390xBackend { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("MachBackend") + .field("name", &self.name()) + .field("triple", &self.triple()) + .field("flags", &format!("{}", self.flags())) + .finish() + } +} + /// Create a new `isa::Builder`. pub fn isa_builder(triple: Triple) -> IsaBuilder { assert!(triple.architecture == Architecture::S390x); @@ -169,7 +179,7 @@ pub fn isa_builder(triple: Triple) -> IsaBuilder { constructor: |triple, shared_flags, builder| { let isa_flags = s390x_settings::Flags::new(&shared_flags, builder); let backend = S390xBackend::new_with_flags(triple, shared_flags, isa_flags); - Box::new(TargetIsaAdapter::new(backend)) + Box::new(backend) }, } } diff --git a/cranelift/codegen/src/isa/x64/mod.rs b/cranelift/codegen/src/isa/x64/mod.rs index 6907ac81ba..7e4c4f277b 100644 --- a/cranelift/codegen/src/isa/x64/mod.rs +++ b/cranelift/codegen/src/isa/x64/mod.rs @@ -9,12 +9,12 @@ use crate::isa::unwind::systemv; use crate::isa::x64::{inst::regs::create_reg_universe_systemv, settings as x64_settings}; use crate::isa::Builder as IsaBuilder; use crate::machinst::{ - compile, MachBackend, MachCompileResult, MachTextSectionBuilder, TargetIsaAdapter, - TextSectionBuilder, VCode, + compile, MachCompileResult, MachTextSectionBuilder, TextSectionBuilder, VCode, }; use crate::result::CodegenResult; use crate::settings::{self as shared_settings, Flags}; use alloc::{boxed::Box, vec::Vec}; +use core::fmt; use regalloc::{PrettyPrint, RealRegUniverse, Reg}; use target_lexicon::Triple; @@ -54,7 +54,7 @@ impl X64Backend { } } -impl MachBackend for X64Backend { +impl TargetIsa for X64Backend { fn compile_function( &self, func: &Function, @@ -142,7 +142,7 @@ impl MachBackend for X64Backend { } #[cfg(feature = "unwind")] - fn map_reg_to_dwarf(&self, reg: Reg) -> Result { + fn map_regalloc_reg_to_dwarf(&self, reg: Reg) -> Result { inst::unwind::systemv::map_reg(reg).map(|reg| reg.0) } @@ -151,6 +151,16 @@ impl MachBackend for X64Backend { } } +impl fmt::Display for X64Backend { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("MachBackend") + .field("name", &self.name()) + .field("triple", &self.triple()) + .field("flags", &format!("{}", self.flags())) + .finish() + } +} + /// Create a new `isa::Builder`. pub(crate) fn isa_builder(triple: Triple) -> IsaBuilder { IsaBuilder { @@ -167,5 +177,5 @@ fn isa_constructor( ) -> Box { let isa_flags = x64_settings::Flags::new(&shared_flags, builder); let backend = X64Backend::new_with_flags(triple, shared_flags, isa_flags); - Box::new(TargetIsaAdapter::new(backend)) + Box::new(backend) } diff --git a/cranelift/codegen/src/machinst/adapter.rs b/cranelift/codegen/src/machinst/adapter.rs deleted file mode 100644 index e95c579333..0000000000 --- a/cranelift/codegen/src/machinst/adapter.rs +++ /dev/null @@ -1,93 +0,0 @@ -//! Adapter for a `MachBackend` to implement the `TargetIsa` trait. - -use crate::ir; -use crate::isa::TargetIsa; -use crate::machinst::*; -use crate::settings::{self, Flags}; - -#[cfg(feature = "unwind")] -use crate::isa::unwind::systemv::RegisterMappingError; - -use std::fmt; -use target_lexicon::Triple; - -/// A wrapper around a `MachBackend` that provides a `TargetIsa` impl. -pub struct TargetIsaAdapter { - backend: Box, -} - -impl TargetIsaAdapter { - /// Create a new `TargetIsa` wrapper around a `MachBackend`. - pub fn new(backend: B) -> TargetIsaAdapter { - TargetIsaAdapter { - backend: Box::new(backend), - } - } -} - -impl fmt::Display for TargetIsaAdapter { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("MachBackend") - .field("name", &self.backend.name()) - .field("triple", &self.backend.triple()) - .field("flags", &format!("{}", self.backend.flags())) - .finish() - } -} - -impl TargetIsa for TargetIsaAdapter { - fn name(&self) -> &'static str { - self.backend.name() - } - - fn triple(&self) -> &Triple { - self.backend.triple() - } - - fn flags(&self) -> &Flags { - self.backend.flags() - } - - fn isa_flags(&self) -> Vec { - self.backend.isa_flags() - } - - fn compile_function( - &self, - func: &Function, - want_disasm: bool, - ) -> CodegenResult { - self.backend.compile_function(func, want_disasm) - } - - fn get_mach_backend(&self) -> &dyn MachBackend { - &*self.backend - } - - fn unsigned_add_overflow_condition(&self) -> ir::condcodes::IntCC { - self.backend.unsigned_add_overflow_condition() - } - - #[cfg(feature = "unwind")] - fn emit_unwind_info( - &self, - result: &MachCompileResult, - kind: UnwindInfoKind, - ) -> CodegenResult> { - self.backend.emit_unwind_info(result, kind) - } - - #[cfg(feature = "unwind")] - fn create_systemv_cie(&self) -> Option { - self.backend.create_systemv_cie() - } - - #[cfg(feature = "unwind")] - fn map_regalloc_reg_to_dwarf(&self, r: Reg) -> Result { - self.backend.map_reg_to_dwarf(r) - } - - fn text_section_builder(&self, num_labeled_funcs: u32) -> Box { - self.backend.text_section_builder(num_labeled_funcs) - } -} diff --git a/cranelift/codegen/src/machinst/compile.rs b/cranelift/codegen/src/machinst/compile.rs index 24c7efa56a..67593d940a 100644 --- a/cranelift/codegen/src/machinst/compile.rs +++ b/cranelift/codegen/src/machinst/compile.rs @@ -1,6 +1,7 @@ //! Compilation backend pipeline: optimized IR to VCode / binemit. use crate::ir::Function; +use crate::isa::TargetIsa; use crate::log::DeferredDisplay; use crate::machinst::*; use crate::settings; @@ -10,7 +11,7 @@ use regalloc::{allocate_registers_with_opts, Algorithm, Options, PrettyPrint}; /// Compile the given function down to VCode with allocated registers, ready /// for binary emission. -pub fn compile( +pub fn compile( f: &Function, b: &B, abi: Box>, diff --git a/cranelift/codegen/src/machinst/mod.rs b/cranelift/codegen/src/machinst/mod.rs index 1bd4f679ce..e16dcce9a0 100644 --- a/cranelift/codegen/src/machinst/mod.rs +++ b/cranelift/codegen/src/machinst/mod.rs @@ -61,10 +61,9 @@ //! ``` use crate::binemit::{Addend, CodeInfo, CodeOffset, Reloc, StackMap}; -use crate::ir::condcodes::IntCC; -use crate::ir::{Function, SourceLoc, StackSlot, Type, ValueLabel}; +use crate::ir::{SourceLoc, StackSlot, Type, ValueLabel}; use crate::result::CodegenResult; -use crate::settings::{self, Flags}; +use crate::settings::Flags; use crate::value_label::ValueLabelsRanges; use alloc::boxed::Box; use alloc::vec::Vec; @@ -76,10 +75,6 @@ use regalloc::{ }; use smallvec::{smallvec, SmallVec}; use std::string::String; -use target_lexicon::Triple; - -#[cfg(feature = "unwind")] -use crate::isa::unwind::systemv::RegisterMappingError; #[macro_use] pub mod isle; @@ -98,8 +93,6 @@ pub mod abi_impl; pub use abi_impl::*; pub mod buffer; pub use buffer::*; -pub mod adapter; -pub use adapter::*; pub mod helpers; pub use helpers::*; pub mod inst_common; @@ -363,67 +356,6 @@ impl MachCompileResult { } } -/// Top-level machine backend trait, which wraps all monomorphized code and -/// allows a virtual call from the machine-independent `Function::compile()`. -pub trait MachBackend { - /// Compile the given function. - fn compile_function( - &self, - func: &Function, - want_disasm: bool, - ) -> CodegenResult; - - /// Return flags for this backend. - fn flags(&self) -> &Flags; - - /// Get the ISA-dependent flag values that were used to make this trait object. - fn isa_flags(&self) -> Vec; - - /// Return triple for this backend. - fn triple(&self) -> &Triple; - - /// Return name for this backend. - fn name(&self) -> &'static str; - - /// Machine-specific condcode info needed by TargetIsa. - /// Condition that will be true when an IaddIfcout overflows. - fn unsigned_add_overflow_condition(&self) -> IntCC; - - /// Produces unwind info based on backend results. - #[cfg(feature = "unwind")] - fn emit_unwind_info( - &self, - _result: &MachCompileResult, - _kind: UnwindInfoKind, - ) -> CodegenResult> { - // By default, an backend cannot produce unwind info. - Ok(None) - } - - /// Creates a new System V Common Information Entry for the ISA. - #[cfg(feature = "unwind")] - fn create_systemv_cie(&self) -> Option { - // By default, an ISA cannot create a System V CIE - None - } - /// Maps a regalloc::Reg to a DWARF register number. - #[cfg(feature = "unwind")] - fn map_reg_to_dwarf(&self, _: Reg) -> Result { - Err(RegisterMappingError::UnsupportedArchitecture) - } - - /// Returns an object that can be used to build the text section of an - /// executable. - /// - /// This object will internally attempt to handle as many relocations as - /// possible using relative calls/jumps/etc between functions. - /// - /// The `num_labeled_funcs` argument here is the number of functions which - /// will be "labeled" or might have calls between them, typically the number - /// of defined functions in the object file. - fn text_section_builder(&self, num_labeled_funcs: u32) -> Box; -} - /// An object that can be used to create the text section of an executable. /// /// This primarily handles resolving relative relocations at