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:
Andrew Brown
2020-05-21 11:54:19 -07:00
parent 9ba9fd0f64
commit 40f31375a5
5 changed files with 25 additions and 0 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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)]

View File

@@ -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 {

View File

@@ -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
}
} }