From 40f31375a511c0fc0b17a7b0f72e3e86eab92646 Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Thu, 21 May 2020 11:54:19 -0700 Subject: [PATCH] Add TargetIsa::as_any for downcasting to specific ISA implementations This is necessary when we would like to check specific ISA flags, e.g. --- cranelift/codegen/src/isa/arm32/mod.rs | 5 +++++ cranelift/codegen/src/isa/mod.rs | 5 +++++ cranelift/codegen/src/isa/riscv/mod.rs | 5 +++++ cranelift/codegen/src/isa/x86/mod.rs | 5 +++++ cranelift/codegen/src/machinst/adapter.rs | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/cranelift/codegen/src/isa/arm32/mod.rs b/cranelift/codegen/src/isa/arm32/mod.rs index 0358a70113..c10d51607d 100644 --- a/cranelift/codegen/src/isa/arm32/mod.rs +++ b/cranelift/codegen/src/isa/arm32/mod.rs @@ -17,6 +17,7 @@ use crate::isa::{EncInfo, RegClass, RegInfo, TargetIsa}; use crate::regalloc; use alloc::borrow::Cow; use alloc::boxed::Box; +use core::any::Any; use core::fmt; use target_lexicon::{Architecture, Triple}; @@ -135,6 +136,10 @@ impl TargetIsa for Isa { fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC { ir::condcodes::IntCC::UnsignedGreaterThanOrEqual } + + fn as_any(&self) -> &dyn Any { + self as &dyn Any + } } impl fmt::Display for Isa { diff --git a/cranelift/codegen/src/isa/mod.rs b/cranelift/codegen/src/isa/mod.rs index f7f033965f..ad0d292c37 100644 --- a/cranelift/codegen/src/isa/mod.rs +++ b/cranelift/codegen/src/isa/mod.rs @@ -66,6 +66,7 @@ use crate::settings::SetResult; use crate::timing; use alloc::borrow::Cow; use alloc::boxed::Box; +use core::any::Any; use core::fmt; use core::fmt::{Debug, Formatter}; 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> { None } + + /// Return an [Any] reference for downcasting to the ISA-specific implementation of this trait + /// with `isa.as_any().downcast_ref::()`. + fn as_any(&self) -> &dyn Any; } impl Debug for &dyn TargetIsa { diff --git a/cranelift/codegen/src/isa/riscv/mod.rs b/cranelift/codegen/src/isa/riscv/mod.rs index e957367bbb..e69a3a0e12 100644 --- a/cranelift/codegen/src/isa/riscv/mod.rs +++ b/cranelift/codegen/src/isa/riscv/mod.rs @@ -17,6 +17,7 @@ use crate::isa::{EncInfo, RegClass, RegInfo, TargetIsa}; use crate::regalloc; use alloc::borrow::Cow; use alloc::boxed::Box; +use core::any::Any; use core::fmt; use target_lexicon::{PointerWidth, Triple}; @@ -130,6 +131,10 @@ impl TargetIsa for Isa { fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC { unimplemented!() } + + fn as_any(&self) -> &dyn Any { + self as &dyn Any + } } #[cfg(test)] diff --git a/cranelift/codegen/src/isa/x86/mod.rs b/cranelift/codegen/src/isa/x86/mod.rs index 9386e60310..4da21a879f 100644 --- a/cranelift/codegen/src/isa/x86/mod.rs +++ b/cranelift/codegen/src/isa/x86/mod.rs @@ -23,6 +23,7 @@ use crate::result::CodegenResult; use crate::timing; use alloc::borrow::Cow; use alloc::boxed::Box; +use core::any::Any; use core::fmt; use target_lexicon::{PointerWidth, Triple}; @@ -184,6 +185,10 @@ impl TargetIsa for Isa { fn create_systemv_cie(&self) -> Option { Some(unwind::systemv::create_cie()) } + + fn as_any(&self) -> &dyn Any { + self as &dyn Any + } } impl fmt::Display for Isa { diff --git a/cranelift/codegen/src/machinst/adapter.rs b/cranelift/codegen/src/machinst/adapter.rs index c9cf41f359..7e07143e87 100644 --- a/cranelift/codegen/src/machinst/adapter.rs +++ b/cranelift/codegen/src/machinst/adapter.rs @@ -10,6 +10,7 @@ use crate::settings::Flags; #[cfg(feature = "testing_hooks")] use crate::regalloc::RegDiversions; +use core::any::Any; use std::borrow::Cow; use std::fmt; use target_lexicon::Triple; @@ -127,4 +128,8 @@ impl TargetIsa for TargetIsaAdapter { fn unsigned_sub_overflow_condition(&self) -> ir::condcodes::IntCC { self.backend.unsigned_sub_overflow_condition() } + + fn as_any(&self) -> &dyn Any { + self as &dyn Any + } }