Add clif-util compile option to output object file (#5493)
* add clif-util compile option to output object file * switch from a box to a borrow * update objectmodule tests to use borrowed isa * put targetisa into an arc
This commit is contained in:
@@ -216,7 +216,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);
|
||||
Ok(Box::new(backend))
|
||||
Ok(backend.wrapped())
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ use crate::machinst::{CompiledCode, CompiledCodeStencil, TextSectionBuilder, Unw
|
||||
use crate::settings;
|
||||
use crate::settings::SetResult;
|
||||
use crate::CodegenResult;
|
||||
use alloc::{boxed::Box, vec::Vec};
|
||||
use alloc::{boxed::Box, sync::Arc, vec::Vec};
|
||||
use core::fmt;
|
||||
use core::fmt::{Debug, Formatter};
|
||||
use target_lexicon::{triple, Architecture, PointerWidth, Triple};
|
||||
@@ -142,14 +142,16 @@ impl fmt::Display for LookupError {
|
||||
}
|
||||
}
|
||||
|
||||
/// The type of a polymorphic TargetISA object which is 'static.
|
||||
pub type OwnedTargetIsa = Arc<dyn TargetIsa>;
|
||||
|
||||
/// Builder for a `TargetIsa`.
|
||||
/// Modify the ISA-specific settings before creating the `TargetIsa` trait object with `finish`.
|
||||
#[derive(Clone)]
|
||||
pub struct Builder {
|
||||
triple: Triple,
|
||||
setup: settings::Builder,
|
||||
constructor:
|
||||
fn(Triple, settings::Flags, settings::Builder) -> CodegenResult<Box<dyn TargetIsa>>,
|
||||
constructor: fn(Triple, settings::Flags, settings::Builder) -> CodegenResult<OwnedTargetIsa>,
|
||||
}
|
||||
|
||||
impl Builder {
|
||||
@@ -169,7 +171,7 @@ impl Builder {
|
||||
/// flags are inconsistent or incompatible: for example, some
|
||||
/// platform-independent features, like general SIMD support, may
|
||||
/// need certain ISA extensions to be enabled.
|
||||
pub fn finish(self, shared_flags: settings::Flags) -> CodegenResult<Box<dyn TargetIsa>> {
|
||||
pub fn finish(self, shared_flags: settings::Flags) -> CodegenResult<OwnedTargetIsa> {
|
||||
(self.constructor)(self.triple, shared_flags, self.setup)
|
||||
}
|
||||
}
|
||||
@@ -297,6 +299,14 @@ pub trait TargetIsa: fmt::Display + Send + Sync {
|
||||
|
||||
/// The function alignment required by this ISA.
|
||||
fn function_alignment(&self) -> u32;
|
||||
|
||||
/// Create a polymorphic TargetIsa from this specific implementation.
|
||||
fn wrapped(self) -> OwnedTargetIsa
|
||||
where
|
||||
Self: Sized + 'static,
|
||||
{
|
||||
Arc::new(self)
|
||||
}
|
||||
}
|
||||
|
||||
/// Methods implemented for free for target ISA!
|
||||
|
||||
@@ -193,7 +193,7 @@ pub fn isa_builder(triple: Triple) -> IsaBuilder {
|
||||
constructor: |triple, shared_flags, builder| {
|
||||
let isa_flags = riscv_settings::Flags::new(&shared_flags, builder);
|
||||
let backend = Riscv64Backend::new_with_flags(triple, shared_flags, isa_flags);
|
||||
Ok(Box::new(backend))
|
||||
Ok(backend.wrapped())
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,7 +191,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);
|
||||
Ok(Box::new(backend))
|
||||
Ok(backend.wrapped())
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
pub use self::inst::{args, EmitInfo, EmitState, Inst};
|
||||
|
||||
use super::TargetIsa;
|
||||
use super::{OwnedTargetIsa, TargetIsa};
|
||||
use crate::ir::{condcodes::IntCC, Function, Type};
|
||||
#[cfg(feature = "unwind")]
|
||||
use crate::isa::unwind::systemv;
|
||||
@@ -196,7 +196,7 @@ fn isa_constructor(
|
||||
triple: Triple,
|
||||
shared_flags: Flags,
|
||||
builder: shared_settings::Builder,
|
||||
) -> CodegenResult<Box<dyn TargetIsa>> {
|
||||
) -> CodegenResult<OwnedTargetIsa> {
|
||||
let isa_flags = x64_settings::Flags::new(&shared_flags, builder);
|
||||
|
||||
// Check for compatibility between flags and ISA level
|
||||
@@ -214,7 +214,7 @@ fn isa_constructor(
|
||||
}
|
||||
|
||||
let backend = X64Backend::new_with_flags(triple, shared_flags, isa_flags);
|
||||
Ok(Box::new(backend))
|
||||
Ok(backend.wrapped())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
Reference in New Issue
Block a user