Add TargetIsa::as_any for downcasting to specific ISA implementations
This is necessary when we would like to check specific ISA flags, e.g.
This commit is contained in:
@@ -17,6 +17,7 @@ use crate::isa::{EncInfo, RegClass, RegInfo, TargetIsa};
|
|||||||
use crate::regalloc;
|
use crate::regalloc;
|
||||||
use alloc::borrow::Cow;
|
use alloc::borrow::Cow;
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
|
use core::any::Any;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use target_lexicon::{Architecture, Triple};
|
use target_lexicon::{Architecture, Triple};
|
||||||
|
|
||||||
@@ -135,6 +136,10 @@ impl TargetIsa for Isa {
|
|||||||
fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC {
|
fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC {
|
||||||
ir::condcodes::IntCC::UnsignedGreaterThanOrEqual
|
ir::condcodes::IntCC::UnsignedGreaterThanOrEqual
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn as_any(&self) -> &dyn Any {
|
||||||
|
self as &dyn Any
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Isa {
|
impl fmt::Display for Isa {
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ use crate::settings::SetResult;
|
|||||||
use crate::timing;
|
use crate::timing;
|
||||||
use alloc::borrow::Cow;
|
use alloc::borrow::Cow;
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
|
use core::any::Any;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use core::fmt::{Debug, Formatter};
|
use core::fmt::{Debug, Formatter};
|
||||||
use target_lexicon::{triple, Architecture, PointerWidth, Triple};
|
use target_lexicon::{triple, Architecture, PointerWidth, Triple};
|
||||||
@@ -422,6 +423,10 @@ pub trait TargetIsa: fmt::Display + Send + Sync {
|
|||||||
fn get_mach_backend(&self) -> Option<&dyn MachBackend> {
|
fn get_mach_backend(&self) -> Option<&dyn MachBackend> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return an [Any] reference for downcasting to the ISA-specific implementation of this trait
|
||||||
|
/// with `isa.as_any().downcast_ref::<isa::foo::Isa>()`.
|
||||||
|
fn as_any(&self) -> &dyn Any;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Debug for &dyn TargetIsa {
|
impl Debug for &dyn TargetIsa {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ use crate::isa::{EncInfo, RegClass, RegInfo, TargetIsa};
|
|||||||
use crate::regalloc;
|
use crate::regalloc;
|
||||||
use alloc::borrow::Cow;
|
use alloc::borrow::Cow;
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
|
use core::any::Any;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use target_lexicon::{PointerWidth, Triple};
|
use target_lexicon::{PointerWidth, Triple};
|
||||||
|
|
||||||
@@ -130,6 +131,10 @@ impl TargetIsa for Isa {
|
|||||||
fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC {
|
fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn as_any(&self) -> &dyn Any {
|
||||||
|
self as &dyn Any
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ use crate::result::CodegenResult;
|
|||||||
use crate::timing;
|
use crate::timing;
|
||||||
use alloc::borrow::Cow;
|
use alloc::borrow::Cow;
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
|
use core::any::Any;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use target_lexicon::{PointerWidth, Triple};
|
use target_lexicon::{PointerWidth, Triple};
|
||||||
|
|
||||||
@@ -184,6 +185,10 @@ impl TargetIsa for Isa {
|
|||||||
fn create_systemv_cie(&self) -> Option<gimli::write::CommonInformationEntry> {
|
fn create_systemv_cie(&self) -> Option<gimli::write::CommonInformationEntry> {
|
||||||
Some(unwind::systemv::create_cie())
|
Some(unwind::systemv::create_cie())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn as_any(&self) -> &dyn Any {
|
||||||
|
self as &dyn Any
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Isa {
|
impl fmt::Display for Isa {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use crate::settings::Flags;
|
|||||||
#[cfg(feature = "testing_hooks")]
|
#[cfg(feature = "testing_hooks")]
|
||||||
use crate::regalloc::RegDiversions;
|
use crate::regalloc::RegDiversions;
|
||||||
|
|
||||||
|
use core::any::Any;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use target_lexicon::Triple;
|
use target_lexicon::Triple;
|
||||||
@@ -127,4 +128,8 @@ impl TargetIsa for TargetIsaAdapter {
|
|||||||
fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC {
|
fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC {
|
||||||
self.backend.unsigned_sub_overflow_condition()
|
self.backend.unsigned_sub_overflow_condition()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn as_any(&self) -> &dyn Any {
|
||||||
|
self as &dyn Any
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user