Hi

On Mon, Sep 24, 2018 at 1:30 PM Igor Mammedov <imamm...@redhat.com> wrote:
>
> On Fri, 21 Sep 2018 15:13:30 +0400
> Marc-André Lureau <marcandre.lur...@redhat.com> wrote:
>
> > Hi,
> >
> > This is a readability suggestion. See the first patch for the doc
> > change, and the second patch for an example of usage and readability
> > improvement.
> Looks like a nice improvement,
> but could you conversion tree wide so we end up with a consistent
> way to cast across the tree.
> Probably it would result in negative diffstat and demonstrate
> usefulness of the simplification in numbers.

It doesn't result in negative diffstat, since often a one-liner is
replaced by a 2-liner macro ;)

However, the resulting code is more pleasant to read imho.

I attached the whole diff here, the branch with the 49 patches
split-series is here: https://github.com/elmarco/qemu/commits/object

Let me know what you think

>
> > thanks
> >
> > Marc-André Lureau (2):
> >   object: recommend a few type check macros
> >   nvdimm: use IS_NVDIMM macro
> >
> >  include/hw/mem/nvdimm.h |  1 +
> >  include/qom/object.h    | 25 ++++++++++++++++---------
> >  hw/acpi/ich9.c          |  2 +-
> >  hw/acpi/nvdimm.c        |  2 +-
> >  hw/acpi/piix4.c         |  2 +-
> >  hw/i386/pc.c            |  8 +++-----
> >  hw/mem/pc-dimm.c        |  2 +-
> >  7 files changed, 24 insertions(+), 18 deletions(-)
> >
>
>


--
Marc-André Lureau
diff --git a/hw/net/fsl_etsec/etsec.h b/hw/net/fsl_etsec/etsec.h
index 877988572e..93d484eeae 100644
--- a/hw/net/fsl_etsec/etsec.h
+++ b/hw/net/fsl_etsec/etsec.h
@@ -151,7 +151,9 @@ typedef struct eTSEC {
 
 #define TYPE_ETSEC_COMMON "eTSEC"
 #define ETSEC_COMMON(obj) \
-     OBJECT_CHECK(eTSEC, (obj), TYPE_ETSEC_COMMON)
+    OBJECT_CHECK(eTSEC, (obj), TYPE_ETSEC_COMMON)
+#define IS_ETSEC_COMMON(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_ETSEC_COMMON)
 
 #define eTSEC_TRANSMIT 1
 #define eTSEC_RECEIVE  2
diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h
index 1f7f9b5814..d66974b301 100644
--- a/hw/s390x/s390-pci-bus.h
+++ b/hw/s390x/s390-pci-bus.h
@@ -46,6 +46,9 @@
 #define S390_PCI_IOMMU(obj) \
     OBJECT_CHECK(S390PCIIOMMU, (obj), TYPE_S390_PCI_IOMMU)
 
+#define IS_S390_PCI_DEVICE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_S390_PCI_DEVICE)
+
 #define HP_EVENT_TO_CONFIGURED        0x0301
 #define HP_EVENT_RESERVED_TO_STANDBY  0x0302
 #define HP_EVENT_DECONFIGURE_REQUEST  0x0303
diff --git a/include/chardev/char.h b/include/chardev/char.h
index 6f0576e214..c9e8e23ead 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -214,6 +214,8 @@ int qemu_chr_wait_connected(Chardev *chr, Error **errp);
     OBJECT_CLASS_CHECK(ChardevClass, (klass), TYPE_CHARDEV)
 #define CHARDEV_GET_CLASS(obj) \
     OBJECT_GET_CLASS(ChardevClass, (obj), TYPE_CHARDEV)
+#define IS_CHARDEV_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_CHARDEV)
 
 #define TYPE_CHARDEV_NULL "chardev-null"
 #define TYPE_CHARDEV_MUX "chardev-mux"
diff --git a/include/crypto/tlscredsanon.h b/include/crypto/tlscredsanon.h
index 4d6b7e4d29..9836851cff 100644
--- a/include/crypto/tlscredsanon.h
+++ b/include/crypto/tlscredsanon.h
@@ -26,6 +26,8 @@
 #define TYPE_QCRYPTO_TLS_CREDS_ANON "tls-creds-anon"
 #define QCRYPTO_TLS_CREDS_ANON(obj)                  \
     OBJECT_CHECK(QCryptoTLSCredsAnon, (obj), TYPE_QCRYPTO_TLS_CREDS_ANON)
+#define IS_QCRYPTO_TLS_CREDS_ANON(obj)                              \
+    object_dynamic_cast(OBJECT(obj), TYPE_QCRYPTO_TLS_CREDS_ANON)
 
 
 typedef struct QCryptoTLSCredsAnon QCryptoTLSCredsAnon;
diff --git a/include/crypto/tlscredspsk.h b/include/crypto/tlscredspsk.h
index 306d36c67d..ba201a097f 100644
--- a/include/crypto/tlscredspsk.h
+++ b/include/crypto/tlscredspsk.h
@@ -26,6 +26,8 @@
 #define TYPE_QCRYPTO_TLS_CREDS_PSK "tls-creds-psk"
 #define QCRYPTO_TLS_CREDS_PSK(obj)                  \
     OBJECT_CHECK(QCryptoTLSCredsPSK, (obj), TYPE_QCRYPTO_TLS_CREDS_PSK)
+#define IS_QCRYPTO_TLS_CREDS_PSK(obj)                              \
+    object_dynamic_cast(OBJECT(obj), TYPE_QCRYPTO_TLS_CREDS_PSK)
 
 typedef struct QCryptoTLSCredsPSK QCryptoTLSCredsPSK;
 typedef struct QCryptoTLSCredsPSKClass QCryptoTLSCredsPSKClass;
diff --git a/include/crypto/tlscredsx509.h b/include/crypto/tlscredsx509.h
index 66ad6a7486..67d8a35001 100644
--- a/include/crypto/tlscredsx509.h
+++ b/include/crypto/tlscredsx509.h
@@ -26,6 +26,8 @@
 #define TYPE_QCRYPTO_TLS_CREDS_X509 "tls-creds-x509"
 #define QCRYPTO_TLS_CREDS_X509(obj)                  \
     OBJECT_CHECK(QCryptoTLSCredsX509, (obj), TYPE_QCRYPTO_TLS_CREDS_X509)
+#define IS_QCRYPTO_TLS_CREDS_X509(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_QCRYPTO_TLS_CREDS_X509)
 
 typedef struct QCryptoTLSCredsX509 QCryptoTLSCredsX509;
 typedef struct QCryptoTLSCredsX509Class QCryptoTLSCredsX509Class;
diff --git a/include/hw/arm/linux-boot-if.h b/include/hw/arm/linux-boot-if.h
index aba4479a14..33f3fde82c 100644
--- a/include/hw/arm/linux-boot-if.h
+++ b/include/hw/arm/linux-boot-if.h
@@ -15,6 +15,8 @@
     OBJECT_GET_CLASS(ARMLinuxBootIfClass, (obj), TYPE_ARM_LINUX_BOOT_IF)
 #define ARM_LINUX_BOOT_IF(obj) \
     INTERFACE_CHECK(ARMLinuxBootIf, (obj), TYPE_ARM_LINUX_BOOT_IF)
+#define IS_ARM_LINUX_BOOT_IF(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_ARM_LINUX_BOOT_IF)
 
 typedef struct ARMLinuxBootIf {
     /*< private >*/
diff --git a/include/hw/boards.h b/include/hw/boards.h
index f82f28468b..9e5b4452bd 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -56,6 +56,8 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
     OBJECT_GET_CLASS(MachineClass, (obj), TYPE_MACHINE)
 #define MACHINE_CLASS(klass) \
     OBJECT_CLASS_CHECK(MachineClass, (klass), TYPE_MACHINE)
+#define IS_MACHINE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_MACHINE)
 
 MachineClass *find_default_machine(void);
 extern MachineState *current_machine;
diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h
index 0acfbbc382..720e6359c3 100644
--- a/include/hw/char/serial.h
+++ b/include/hw/char/serial.h
@@ -99,6 +99,8 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
 #define MAX_ISA_SERIAL_PORTS 4
 
 #define TYPE_ISA_SERIAL "isa-serial"
+#define IS_ISA_SERIAL(obj) object_dynamic_cast(OBJECT(obj), TYPE_ISA_SERIAL)
+
 void serial_hds_isa_init(ISABus *bus, int from, int to);
 
 #endif
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 6894f37df1..84ba1e2659 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -143,6 +143,8 @@ struct PCMachineClass {
     OBJECT_GET_CLASS(PCMachineClass, (obj), TYPE_PC_MACHINE)
 #define PC_MACHINE_CLASS(klass) \
     OBJECT_CLASS_CHECK(PCMachineClass, (klass), TYPE_PC_MACHINE)
+#define IS_PC_MACHINE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_PC_MACHINE)
 
 /* i8259.c */
 
diff --git a/include/hw/intc/intc.h b/include/hw/intc/intc.h
index 27d9828943..d0812b07a3 100644
--- a/include/hw/intc/intc.h
+++ b/include/hw/intc/intc.h
@@ -14,6 +14,8 @@
 #define INTERRUPT_STATS_PROVIDER(obj) \
     INTERFACE_CHECK(InterruptStatsProvider, (obj), \
                     TYPE_INTERRUPT_STATS_PROVIDER)
+#define IS_INTERRUPT_STATS_PROVIDER(obj) \
+    object_dynamic_cast((obj), TYPE_INTERRUPT_STATS_PROVIDER)
 
 typedef struct InterruptStatsProvider {
     Object parent;
diff --git a/include/hw/ipmi/ipmi.h b/include/hw/ipmi/ipmi.h
index 0affe5a4d8..af4e42657d 100644
--- a/include/hw/ipmi/ipmi.h
+++ b/include/hw/ipmi/ipmi.h
@@ -113,6 +113,8 @@ uint32_t ipmi_next_uuid(void);
      OBJECT_CLASS_CHECK(IPMIInterfaceClass, (class), TYPE_IPMI_INTERFACE)
 #define IPMI_INTERFACE_GET_CLASS(class) \
      OBJECT_GET_CLASS(IPMIInterfaceClass, (class), TYPE_IPMI_INTERFACE)
+#define IS_IPMI_INTERFACE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_IPMI_INTERFACE)
 
 typedef struct IPMIInterface {
     Object parent;
@@ -168,6 +170,9 @@ typedef struct IPMIInterfaceClass {
     void (*get_fwinfo)(struct IPMIInterface *s, IPMIFwInfo *info);
 } IPMIInterfaceClass;
 
+#define TYPE_ISA_IPMI_BT "isa-ipmi-bt"
+#define IS_ISA_IPMI_BT(obj) object_dynamic_cast(OBJECT(obj), TYPE_ISA_IPMI_BT)
+
 /*
  * Define a BMC simulator (or perhaps a connection to a real BMC)
  */
diff --git a/include/hw/mem/memory-device.h b/include/hw/mem/memory-device.h
index 2853b084b5..5821992d2f 100644
--- a/include/hw/mem/memory-device.h
+++ b/include/hw/mem/memory-device.h
@@ -19,11 +19,13 @@
 #define TYPE_MEMORY_DEVICE "memory-device"
 
 #define MEMORY_DEVICE_CLASS(klass) \
-     OBJECT_CLASS_CHECK(MemoryDeviceClass, (klass), TYPE_MEMORY_DEVICE)
+    OBJECT_CLASS_CHECK(MemoryDeviceClass, (klass), TYPE_MEMORY_DEVICE)
 #define MEMORY_DEVICE_GET_CLASS(obj) \
     OBJECT_GET_CLASS(MemoryDeviceClass, (obj), TYPE_MEMORY_DEVICE)
 #define MEMORY_DEVICE(obj) \
-     INTERFACE_CHECK(MemoryDeviceState, (obj), TYPE_MEMORY_DEVICE)
+    INTERFACE_CHECK(MemoryDeviceState, (obj), TYPE_MEMORY_DEVICE)
+#define IS_MEMORY_DEVICE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_MEMORY_DEVICE)
 
 typedef struct MemoryDeviceState {
     Object parent_obj;
diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h
index c5c9b3c7f8..e56be1d492 100644
--- a/include/hw/mem/nvdimm.h
+++ b/include/hw/mem/nvdimm.h
@@ -47,6 +47,7 @@
 #define NVDIMM_CLASS(oc) OBJECT_CLASS_CHECK(NVDIMMClass, (oc), TYPE_NVDIMM)
 #define NVDIMM_GET_CLASS(obj) OBJECT_GET_CLASS(NVDIMMClass, (obj), \
                                                TYPE_NVDIMM)
+#define IS_NVDIMM(obj)   object_dynamic_cast(OBJECT(obj), TYPE_NVDIMM)
 
 #define NVDIMM_LABEL_SIZE_PROP "label-size"
 #define NVDIMM_UNARMED_PROP    "unarmed"
diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h
index b382eb4303..5f3ec060b4 100644
--- a/include/hw/mem/pc-dimm.h
+++ b/include/hw/mem/pc-dimm.h
@@ -28,6 +28,7 @@
     OBJECT_CLASS_CHECK(PCDIMMDeviceClass, (oc), TYPE_PC_DIMM)
 #define PC_DIMM_GET_CLASS(obj) \
     OBJECT_GET_CLASS(PCDIMMDeviceClass, (obj), TYPE_PC_DIMM)
+#define IS_PC_DIMM(obj) object_dynamic_cast(OBJECT(obj), TYPE_PC_DIMM)
 
 #define PC_DIMM_ADDR_PROP "addr"
 #define PC_DIMM_SLOT_PROP "slot"
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index e6514bba23..c09c47b3c6 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -198,6 +198,8 @@ enum {
      OBJECT_CLASS_CHECK(PCIDeviceClass, (klass), TYPE_PCI_DEVICE)
 #define PCI_DEVICE_GET_CLASS(obj) \
      OBJECT_GET_CLASS(PCIDeviceClass, (obj), TYPE_PCI_DEVICE)
+#define IS_PCI_DEVICE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_PCI_DEVICE)
 
 /* Implemented by devices that can be plugged on PCI Express buses */
 #define INTERFACE_PCIE_DEVICE "pci-express-device"
@@ -393,6 +395,7 @@ typedef PCIINTxRoute (*pci_route_irq_fn)(void *opaque, int pin);
 #define PCI_BUS_CLASS(klass) OBJECT_CLASS_CHECK(PCIBusClass, (klass), TYPE_PCI_BUS)
 #define PCI_BUS_GET_CLASS(obj) OBJECT_GET_CLASS(PCIBusClass, (obj), TYPE_PCI_BUS)
 #define TYPE_PCIE_BUS "PCIE"
+#define IS_PCIE_BUS(obj) object_dynamic_cast(OBJECT(obj), TYPE_PCIE_BUS)
 
 bool pci_bus_is_express(PCIBus *bus);
 bool pci_bus_is_root(PCIBus *bus);
@@ -429,6 +432,9 @@ PCIDevice *pci_nic_init_nofail(NICInfo *nd, PCIBus *rootbus,
                                const char *default_model,
                                const char *default_devaddr);
 
+#define TYPE_PCI_VGA "pci-vga"
+#define IS_PCI_VGA(obj) object_dynamic_cast(OBJECT(obj), TYPE_PCI_VGA)
+
 PCIDevice *pci_vga_init(PCIBus *bus);
 
 static inline PCIBus *pci_get_bus(const PCIDevice *dev)
diff --git a/include/hw/pci/pci_bridge.h b/include/hw/pci/pci_bridge.h
index cdff7edfd1..5a56814fe9 100644
--- a/include/hw/pci/pci_bridge.h
+++ b/include/hw/pci/pci_bridge.h
@@ -51,6 +51,7 @@ struct PCIBridgeWindows {
 
 #define TYPE_PCI_BRIDGE "base-pci-bridge"
 #define PCI_BRIDGE(obj) OBJECT_CHECK(PCIBridge, (obj), TYPE_PCI_BRIDGE)
+#define IS_PCI_BRIDGE(obj) object_dynamic_cast(OBJECT(obj), TYPE_PCI_BRIDGE)
 
 struct PCIBridge {
     /*< private >*/
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index 255b26a5aa..1747d42ea8 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -27,12 +27,14 @@ typedef struct PnvXScomInterface {
 
 #define TYPE_PNV_XSCOM_INTERFACE "pnv-xscom-interface"
 #define PNV_XSCOM_INTERFACE(obj) \
-     OBJECT_CHECK(PnvXScomInterface, (obj), TYPE_PNV_XSCOM_INTERFACE)
+    OBJECT_CHECK(PnvXScomInterface, (obj), TYPE_PNV_XSCOM_INTERFACE)
 #define PNV_XSCOM_INTERFACE_CLASS(klass)                \
     OBJECT_CLASS_CHECK(PnvXScomInterfaceClass, (klass), \
                        TYPE_PNV_XSCOM_INTERFACE)
 #define PNV_XSCOM_INTERFACE_GET_CLASS(obj) \
-     OBJECT_GET_CLASS(PnvXScomInterfaceClass, (obj), TYPE_PNV_XSCOM_INTERFACE)
+    OBJECT_GET_CLASS(PnvXScomInterfaceClass, (obj), TYPE_PNV_XSCOM_INTERFACE)
+#define IS_PNV_XSCOM_INTERFACE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_PNV_XSCOM_INTERFACE)
 
 typedef struct PnvXScomInterfaceClass {
     InterfaceClass parent;
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index ad4d7cfd97..85110f9234 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -44,6 +44,8 @@ typedef struct sPAPRMachineClass sPAPRMachineClass;
     OBJECT_GET_CLASS(sPAPRMachineClass, obj, TYPE_SPAPR_MACHINE)
 #define SPAPR_MACHINE_CLASS(klass) \
     OBJECT_CLASS_CHECK(sPAPRMachineClass, klass, TYPE_SPAPR_MACHINE)
+#define IS_SPAPR_MACHINE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_SPAPR_MACHINE)
 
 typedef enum {
     SPAPR_RESIZE_HPT_DEFAULT = 0,
diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_core.h
index 9e2821e4b3..7083137763 100644
--- a/include/hw/ppc/spapr_cpu_core.h
+++ b/include/hw/ppc/spapr_cpu_core.h
@@ -20,7 +20,9 @@
 #define SPAPR_CPU_CORE_CLASS(klass) \
     OBJECT_CLASS_CHECK(sPAPRCPUCoreClass, (klass), TYPE_SPAPR_CPU_CORE)
 #define SPAPR_CPU_CORE_GET_CLASS(obj) \
-     OBJECT_GET_CLASS(sPAPRCPUCoreClass, (obj), TYPE_SPAPR_CPU_CORE)
+    OBJECT_GET_CLASS(sPAPRCPUCoreClass, (obj), TYPE_SPAPR_CPU_CORE)
+#define IS_SPAPR_CPU_CORE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_SPAPR_CPU_CORE)
 
 #define SPAPR_CPU_CORE_TYPE_NAME(model) model "-" TYPE_SPAPR_CPU_CORE
 
diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h
index f6ff32e7e2..8ddce93294 100644
--- a/include/hw/ppc/spapr_drc.h
+++ b/include/hw/ppc/spapr_drc.h
@@ -36,6 +36,8 @@
                            TYPE_SPAPR_DRC_PHYSICAL)
 #define SPAPR_DRC_PHYSICAL(obj) OBJECT_CHECK(sPAPRDRCPhysical, (obj), \
                                              TYPE_SPAPR_DRC_PHYSICAL)
+#define IS_SPAPR_DRC_PHYSICAL(obj) \
+        object_dynamic_cast(OBJECT(obj), TYPE_SPAPR_DRC_PHYSICAL)
 
 #define TYPE_SPAPR_DRC_LOGICAL "spapr-drc-logical"
 #define SPAPR_DRC_LOGICAL_GET_CLASS(obj) \
@@ -45,6 +47,8 @@
                            TYPE_SPAPR_DRC_LOGICAL)
 #define SPAPR_DRC_LOGICAL(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \
                                              TYPE_SPAPR_DRC_LOGICAL)
+#define IS_SPAPR_DRC_LOGICAL(obj) \
+        object_dynamic_cast(OBJECT(obj), TYPE_SPAPR_DRC_LOGICAL)
 
 #define TYPE_SPAPR_DRC_CPU "spapr-drc-cpu"
 #define SPAPR_DRC_CPU_GET_CLASS(obj) \
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index 9958443d19..c16e17bc1e 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -105,6 +105,7 @@ struct PnvICPState {
 
 #define TYPE_ICS_KVM "icskvm"
 #define ICS_KVM(obj) OBJECT_CHECK(ICSState, (obj), TYPE_ICS_KVM)
+#define IS_ICS_KVM(obj) object_dynamic_cast(OBJECT(obj), TYPE_ICS_KVM)
 
 #define ICS_BASE_CLASS(klass) \
      OBJECT_CLASS_CHECK(ICSStateClass, (klass), TYPE_ICS_BASE)
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index a24d0dd566..e3cb0617db 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -15,6 +15,9 @@ enum {
 #define DEVICE(obj) OBJECT_CHECK(DeviceState, (obj), TYPE_DEVICE)
 #define DEVICE_CLASS(klass) OBJECT_CLASS_CHECK(DeviceClass, (klass), TYPE_DEVICE)
 #define DEVICE_GET_CLASS(obj) OBJECT_GET_CLASS(DeviceClass, (obj), TYPE_DEVICE)
+#define IS_DEVICE(obj) object_dynamic_cast(OBJECT(obj), TYPE_DEVICE)
+#define IS_DEVICE_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_DEVICE)
 
 typedef enum DeviceCategory {
     DEVICE_CATEGORY_BRIDGE,
diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index 0b59a3b8d6..7dfcb7c5bf 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -21,6 +21,8 @@ typedef struct SysBusDevice SysBusDevice;
      OBJECT_CLASS_CHECK(SysBusDeviceClass, (klass), TYPE_SYS_BUS_DEVICE)
 #define SYS_BUS_DEVICE_GET_CLASS(obj) \
      OBJECT_GET_CLASS(SysBusDeviceClass, (obj), TYPE_SYS_BUS_DEVICE)
+#define IS_SYS_BUS_DEVICE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_SYS_BUS_DEVICE)
 
 /**
  * SysBusDeviceClass:
diff --git a/include/hw/timer/mc146818rtc.h b/include/hw/timer/mc146818rtc.h
index fe6ed63f71..dcb7054691 100644
--- a/include/hw/timer/mc146818rtc.h
+++ b/include/hw/timer/mc146818rtc.h
@@ -5,6 +5,7 @@
 #include "hw/timer/mc146818rtc_regs.h"
 
 #define TYPE_MC146818_RTC "mc146818rtc"
+#define IS_MC146818_RTC(obj) object_dynamic_cast(OBJECT(obj), TYPE_MC146818_RTC)
 
 ISADevice *mc146818_rtc_init(ISABus *bus, int base_year,
                              qemu_irq intercept_irq);
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
index 821def0565..96f49e8497 100644
--- a/include/hw/vfio/vfio-common.h
+++ b/include/hw/vfio/vfio-common.h
@@ -157,6 +157,9 @@ typedef struct VFIODisplay {
     } dmabuf;
 } VFIODisplay;
 
+#define TYPE_VFIO_PCI "vfio-pci"
+#define IS_VFIO_PCI(obj) object_dynamic_cast(OBJECT(obj), TYPE_VFIO_PCI)
+
 void vfio_put_base_device(VFIODevice *vbasedev);
 void vfio_disable_irqindex(VFIODevice *vbasedev, int index);
 void vfio_unmask_single_irqindex(VFIODevice *vbasedev, int index);
diff --git a/include/hw/vfio/vfio.h b/include/hw/vfio/vfio.h
index 86248f5436..78803ab52b 100644
--- a/include/hw/vfio/vfio.h
+++ b/include/hw/vfio/vfio.h
@@ -1,6 +1,8 @@
 #ifndef HW_VFIO_H
 #define HW_VFIO_H
 
+#include "hw/vfio/vfio-common.h"
+
 bool vfio_eeh_as_ok(AddressSpace *as);
 int vfio_eeh_as_op(AddressSpace *as, uint32_t op);
 
diff --git a/include/io/channel-tls.h b/include/io/channel-tls.h
index 87fcaf9146..f67867a932 100644
--- a/include/io/channel-tls.h
+++ b/include/io/channel-tls.h
@@ -28,6 +28,8 @@
 #define TYPE_QIO_CHANNEL_TLS "qio-channel-tls"
 #define QIO_CHANNEL_TLS(obj)                                     \
     OBJECT_CHECK(QIOChannelTLS, (obj), TYPE_QIO_CHANNEL_TLS)
+#define IS_QIO_CHANNEL_TLS(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_QIO_CHANNEL_TLS)
 
 typedef struct QIOChannelTLS QIOChannelTLS;
 
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index dc130cd307..6fd9dc00bf 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -62,6 +62,7 @@ typedef uint64_t vaddr;
 
 #define CPU_CLASS(class) OBJECT_CLASS_CHECK(CPUClass, (class), TYPE_CPU)
 #define CPU_GET_CLASS(obj) OBJECT_GET_CLASS(CPUClass, (obj), TYPE_CPU)
+#define IS_CPU(obj) object_dynamic_cast(OBJECT(obj), TYPE_CPU)
 
 typedef enum MMUAccessType {
     MMU_DATA_LOAD  = 0,
diff --git a/include/qom/object.h b/include/qom/object.h
index c16e0bc91e..5c0e63f913 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -512,6 +512,9 @@ struct TypeInfo
 #define OBJECT_CLASS(class) \
     ((ObjectClass *)(class))
 
+#define IS_OBJECT_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_OBJECT)
+
 /**
  * OBJECT_CHECK:
  * @type: The C type to use for the return value.
diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
index 4d513fb329..8ac4919f35 100644
--- a/include/qom/object_interfaces.h
+++ b/include/qom/object_interfaces.h
@@ -7,15 +7,15 @@
 #define TYPE_USER_CREATABLE "user-creatable"
 
 #define USER_CREATABLE_CLASS(klass) \
-     OBJECT_CLASS_CHECK(UserCreatableClass, (klass), \
-                        TYPE_USER_CREATABLE)
+    OBJECT_CLASS_CHECK(UserCreatableClass, (klass), TYPE_USER_CREATABLE)
 #define USER_CREATABLE_GET_CLASS(obj) \
-     OBJECT_GET_CLASS(UserCreatableClass, (obj), \
-                      TYPE_USER_CREATABLE)
+    OBJECT_GET_CLASS(UserCreatableClass, (obj), TYPE_USER_CREATABLE)
 #define USER_CREATABLE(obj) \
-     INTERFACE_CHECK(UserCreatable, (obj), \
-                     TYPE_USER_CREATABLE)
-
+    INTERFACE_CHECK(UserCreatable, (obj), TYPE_USER_CREATABLE)
+#define IS_USER_CREATABLE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_USER_CREATABLE)
+#define IS_USER_CREATABLE_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_USER_CREATABLE)
 
 typedef struct UserCreatable {
     /* <private> */
diff --git a/include/sysemu/hostmem.h b/include/sysemu/hostmem.h
index 6e6bd2c1cb..56900fd94d 100644
--- a/include/sysemu/hostmem.h
+++ b/include/sysemu/hostmem.h
@@ -26,6 +26,12 @@
     OBJECT_GET_CLASS(HostMemoryBackendClass, (obj), TYPE_MEMORY_BACKEND)
 #define MEMORY_BACKEND_CLASS(klass) \
     OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND)
+#define IS_MEMORY_BACKEND(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_MEMORY_BACKEND)
+
+#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
+#define IS_MEMORY_BACKEND_RAM(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_MEMORY_BACKEND_RAM)
 
 typedef struct HostMemoryBackend HostMemoryBackend;
 typedef struct HostMemoryBackendClass HostMemoryBackendClass;
diff --git a/include/sysemu/tpm_backend.h b/include/sysemu/tpm_backend.h
index 14488820f6..dce31d1243 100644
--- a/include/sysemu/tpm_backend.h
+++ b/include/sysemu/tpm_backend.h
@@ -26,6 +26,8 @@
     OBJECT_GET_CLASS(TPMBackendClass, (obj), TYPE_TPM_BACKEND)
 #define TPM_BACKEND_CLASS(klass) \
     OBJECT_CLASS_CHECK(TPMBackendClass, (klass), TYPE_TPM_BACKEND)
+#define IS_TPM_BACKEND_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_TPM_BACKEND)
 
 typedef struct TPMBackendClass TPMBackendClass;
 typedef struct TPMBackend TPMBackend;
diff --git a/target/alpha/cpu-qom.h b/target/alpha/cpu-qom.h
index bae4945344..e0da42660b 100644
--- a/target/alpha/cpu-qom.h
+++ b/target/alpha/cpu-qom.h
@@ -30,6 +30,8 @@
     OBJECT_CHECK(AlphaCPU, (obj), TYPE_ALPHA_CPU)
 #define ALPHA_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(AlphaCPUClass, (obj), TYPE_ALPHA_CPU)
+#define IS_ALPHA_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_ALPHA_CPU)
 
 /**
  * AlphaCPUClass:
diff --git a/target/arm/cpu-qom.h b/target/arm/cpu-qom.h
index d135ff8e06..41fb03f6ab 100644
--- a/target/arm/cpu-qom.h
+++ b/target/arm/cpu-qom.h
@@ -32,6 +32,8 @@ struct arm_boot_info;
     OBJECT_CHECK(ARMCPU, (obj), TYPE_ARM_CPU)
 #define ARM_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(ARMCPUClass, (obj), TYPE_ARM_CPU)
+#define IS_ARM_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_ARM_CPU)
 
 #define TYPE_ARM_MAX_CPU "max-" TYPE_ARM_CPU
 
@@ -57,7 +59,9 @@ typedef struct ARMCPU ARMCPU;
 #define AARCH64_CPU_CLASS(klass) \
     OBJECT_CLASS_CHECK(AArch64CPUClass, (klass), TYPE_AARCH64_CPU)
 #define AARCH64_CPU_GET_CLASS(obj) \
-    OBJECT_GET_CLASS(AArch64CPUClass, (obj), TYPE_AArch64_CPU)
+    OBJECT_GET_CLASS(AArch64CPUClass, (obj), TYPE_AARCH64_CPU)
+#define IS_AARCH64_CPU(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_AARCH64_CPU)
 
 typedef struct AArch64CPUClass {
     /*< private >*/
diff --git a/target/cris/cpu-qom.h b/target/cris/cpu-qom.h
index 7556e9f97e..8c0d024d61 100644
--- a/target/cris/cpu-qom.h
+++ b/target/cris/cpu-qom.h
@@ -30,6 +30,8 @@
     OBJECT_CHECK(CRISCPU, (obj), TYPE_CRIS_CPU)
 #define CRIS_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(CRISCPUClass, (obj), TYPE_CRIS_CPU)
+#define IS_CRIS_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_CRIS_CPU)
 
 /**
  * CRISCPUClass:
diff --git a/target/lm32/cpu-qom.h b/target/lm32/cpu-qom.h
index b423d2564b..d67eab1967 100644
--- a/target/lm32/cpu-qom.h
+++ b/target/lm32/cpu-qom.h
@@ -30,6 +30,8 @@
     OBJECT_CHECK(LM32CPU, (obj), TYPE_LM32_CPU)
 #define LM32_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(LM32CPUClass, (obj), TYPE_LM32_CPU)
+#define IS_LM32_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_LM32_CPU)
 
 /**
  * LM32CPUClass:
diff --git a/target/m68k/cpu-qom.h b/target/m68k/cpu-qom.h
index 9885bba317..b09d1b98d6 100644
--- a/target/m68k/cpu-qom.h
+++ b/target/m68k/cpu-qom.h
@@ -30,6 +30,8 @@
     OBJECT_CHECK(M68kCPU, (obj), TYPE_M68K_CPU)
 #define M68K_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(M68kCPUClass, (obj), TYPE_M68K_CPU)
+#define IS_M68K_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_M68K_CPU)
 
 /**
  * M68kCPUClass:
diff --git a/target/moxie/cpu.h b/target/moxie/cpu.h
index d40f1e6c45..e1772655aa 100644
--- a/target/moxie/cpu.h
+++ b/target/moxie/cpu.h
@@ -72,6 +72,8 @@ typedef struct CPUMoxieState {
     OBJECT_CHECK(MoxieCPU, (obj), TYPE_MOXIE_CPU)
 #define MOXIE_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(MoxieCPUClass, (obj), TYPE_MOXIE_CPU)
+#define IS_MOXIE_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_MOXIE_CPU)
 
 /**
  * MoxieCPUClass:
diff --git a/target/openrisc/cpu.h b/target/openrisc/cpu.h
index f1b31bc24a..e533088fc1 100644
--- a/target/openrisc/cpu.h
+++ b/target/openrisc/cpu.h
@@ -39,6 +39,8 @@ struct OpenRISCCPU;
     OBJECT_CHECK(OpenRISCCPU, (obj), TYPE_OPENRISC_CPU)
 #define OPENRISC_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(OpenRISCCPUClass, (obj), TYPE_OPENRISC_CPU)
+#define IS_OPENRISC_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_OPENRISC_CPU)
 
 /**
  * OpenRISCCPUClass:
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index d4f36295f0..efef337d80 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -181,6 +181,8 @@ struct CPURISCVState {
     OBJECT_CHECK(RISCVCPU, (obj), TYPE_RISCV_CPU)
 #define RISCV_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(RISCVCPUClass, (obj), TYPE_RISCV_CPU)
+#define IS_RISCV_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_RISCV_CPU)
 
 /**
  * RISCVCPUClass:
diff --git a/target/tricore/cpu-qom.h b/target/tricore/cpu-qom.h
index 6a69756126..01f20f2601 100644
--- a/target/tricore/cpu-qom.h
+++ b/target/tricore/cpu-qom.h
@@ -29,6 +29,8 @@
     OBJECT_CHECK(TriCoreCPU, (obj), TYPE_TRICORE_CPU)
 #define TRICORE_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(TriCoreCPUClass, (obj), TYPE_TRICORE_CPU)
+#define IS_TRICORE_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_TRICORE_CPU)
 
 typedef struct TriCoreCPUClass {
     /*< private >*/
diff --git a/target/unicore32/cpu-qom.h b/target/unicore32/cpu-qom.h
index bc68e78045..5c0ea564c4 100644
--- a/target/unicore32/cpu-qom.h
+++ b/target/unicore32/cpu-qom.h
@@ -21,6 +21,8 @@
     OBJECT_CHECK(UniCore32CPU, (obj), TYPE_UNICORE32_CPU)
 #define UNICORE32_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(UniCore32CPUClass, (obj), TYPE_UNICORE32_CPU)
+#define IS_UNICORE32_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_UNICORE32_CPU)
 
 /**
  * UniCore32CPUClass:
diff --git a/target/xtensa/cpu-qom.h b/target/xtensa/cpu-qom.h
index 403bd95721..08aed31954 100644
--- a/target/xtensa/cpu-qom.h
+++ b/target/xtensa/cpu-qom.h
@@ -39,6 +39,8 @@
     OBJECT_CHECK(XtensaCPU, (obj), TYPE_XTENSA_CPU)
 #define XTENSA_CPU_GET_CLASS(obj) \
     OBJECT_GET_CLASS(XtensaCPUClass, (obj), TYPE_XTENSA_CPU)
+#define IS_XTENSA_CPU_CLASS(klass) \
+    object_class_dynamic_cast(OBJECT_CLASS(klass), TYPE_XTENSA_CPU)
 
 typedef struct XtensaConfig XtensaConfig;
 
diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
index 7ddd08d370..d0866954dc 100644
--- a/backends/hostmem-ram.c
+++ b/backends/hostmem-ram.c
@@ -14,9 +14,6 @@
 #include "qapi/error.h"
 #include "qom/object_interfaces.h"
 
-#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
-
-
 static void
 ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
 {
diff --git a/chardev/char.c b/chardev/char.c
index 76d866e6fe..68bfd29454 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -496,7 +496,7 @@ static const ChardevClass *char_get_class(const char *driver, Error **errp)
     oc = object_class_by_name(typename);
     g_free(typename);
 
-    if (!object_class_dynamic_cast(oc, TYPE_CHARDEV)) {
+    if (!IS_CHARDEV_CLASS(oc)) {
         error_setg(errp, "'%s' is not a valid char driver name", driver);
         return NULL;
     }
diff --git a/crypto/tlssession.c b/crypto/tlssession.c
index 66a6fbe19c..b2170fae09 100644
--- a/crypto/tlssession.c
+++ b/crypto/tlssession.c
@@ -138,8 +138,7 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds,
         goto error;
     }
 
-    if (object_dynamic_cast(OBJECT(creds),
-                            TYPE_QCRYPTO_TLS_CREDS_ANON)) {
+    if (IS_QCRYPTO_TLS_CREDS_ANON(creds)) {
         QCryptoTLSCredsAnon *acreds = QCRYPTO_TLS_CREDS_ANON(creds);
         char *prio;
 
@@ -174,8 +173,7 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds,
                        gnutls_strerror(ret));
             goto error;
         }
-    } else if (object_dynamic_cast(OBJECT(creds),
-                                   TYPE_QCRYPTO_TLS_CREDS_PSK)) {
+    } else if (IS_QCRYPTO_TLS_CREDS_PSK(creds)) {
         QCryptoTLSCredsPSK *pcreds = QCRYPTO_TLS_CREDS_PSK(creds);
         char *prio;
 
@@ -210,8 +208,7 @@ qcrypto_tls_session_new(QCryptoTLSCreds *creds,
                        gnutls_strerror(ret));
             goto error;
         }
-    } else if (object_dynamic_cast(OBJECT(creds),
-                                   TYPE_QCRYPTO_TLS_CREDS_X509)) {
+    } else if (IS_QCRYPTO_TLS_CREDS_X509(creds)) {
         QCryptoTLSCredsX509 *tcreds = QCRYPTO_TLS_CREDS_X509(creds);
         const char *prio = creds->priority;
         if (!prio) {
@@ -397,16 +394,13 @@ int
 qcrypto_tls_session_check_credentials(QCryptoTLSSession *session,
                                       Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(session->creds),
-                            TYPE_QCRYPTO_TLS_CREDS_ANON)) {
+    if (IS_QCRYPTO_TLS_CREDS_ANON(session->creds)) {
         trace_qcrypto_tls_session_check_creds(session, "nop");
         return 0;
-    } else if (object_dynamic_cast(OBJECT(session->creds),
-                            TYPE_QCRYPTO_TLS_CREDS_PSK)) {
+    } else if (IS_QCRYPTO_TLS_CREDS_PSK(session->creds)) {
         trace_qcrypto_tls_session_check_creds(session, "nop");
         return 0;
-    } else if (object_dynamic_cast(OBJECT(session->creds),
-                            TYPE_QCRYPTO_TLS_CREDS_X509)) {
+    } else if (IS_QCRYPTO_TLS_CREDS_X509(session->creds)) {
         if (session->creds->verifyPeer) {
             int ret = qcrypto_tls_session_check_certificate(session,
                                                             errp);
diff --git a/exec.c b/exec.c
index 6826c8337d..c4427bb925 100644
--- a/exec.c
+++ b/exec.c
@@ -1673,7 +1673,7 @@ static int find_max_supported_pagesize(Object *obj, void *opaque)
 {
     long *hpsize_min = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_MEMORY_BACKEND)) {
+    if (IS_MEMORY_BACKEND(obj)) {
         long hpsize = host_memory_backend_pagesize(MEMORY_BACKEND(obj));
 
         if (hpsize < *hpsize_min) {
diff --git a/hmp.c b/hmp.c
index 61ef120423..089f2aabe1 100644
--- a/hmp.c
+++ b/hmp.c
@@ -906,7 +906,7 @@ static int hmp_info_irq_foreach(Object *obj, void *opaque)
     InterruptStatsProviderClass *k;
     Monitor *mon = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_INTERRUPT_STATS_PROVIDER)) {
+    if (IS_INTERRUPT_STATS_PROVIDER(obj)) {
         intc = INTERRUPT_STATS_PROVIDER(obj);
         k = INTERRUPT_STATS_PROVIDER_GET_CLASS(obj);
         uint64_t *irq_counts;
@@ -944,7 +944,7 @@ static int hmp_info_pic_foreach(Object *obj, void *opaque)
     InterruptStatsProviderClass *k;
     Monitor *mon = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_INTERRUPT_STATS_PROVIDER)) {
+    if (IS_INTERRUPT_STATS_PROVIDER(obj)) {
         intc = INTERRUPT_STATS_PROVIDER(obj);
         k = INTERRUPT_STATS_PROVIDER_GET_CLASS(obj);
         if (k->print_info) {
diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index c5d8646abc..c09c63e5f0 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -488,15 +488,14 @@ void ich9_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(hotplug_dev);
 
-    if (lpc->pm.acpi_memory_hotplug.is_enabled &&
-        object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
-        if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
+    if (lpc->pm.acpi_memory_hotplug.is_enabled && IS_PC_DIMM(dev)) {
+        if (IS_NVDIMM(dev)) {
             nvdimm_acpi_plug_cb(hotplug_dev, dev);
         } else {
             acpi_memory_plug_cb(hotplug_dev, &lpc->pm.acpi_memory_hotplug,
                                 dev, errp);
         }
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    } else if (IS_CPU(dev)) {
         if (lpc->pm.cpu_hotplug_legacy) {
             legacy_acpi_cpu_plug_cb(hotplug_dev, &lpc->pm.gpe_cpu, dev, errp);
         } else {
@@ -513,13 +512,11 @@ void ich9_pm_device_unplug_request_cb(HotplugHandler *hotplug_dev,
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(hotplug_dev);
 
-    if (lpc->pm.acpi_memory_hotplug.is_enabled &&
-        object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (lpc->pm.acpi_memory_hotplug.is_enabled && IS_PC_DIMM(dev)) {
         acpi_memory_unplug_request_cb(hotplug_dev,
                                       &lpc->pm.acpi_memory_hotplug, dev,
                                       errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) &&
-               !lpc->pm.cpu_hotplug_legacy) {
+    } else if (IS_CPU(dev) && !lpc->pm.cpu_hotplug_legacy) {
         acpi_cpu_unplug_request_cb(hotplug_dev, &lpc->pm.cpuhp_state,
                                    dev, errp);
     } else {
@@ -533,11 +530,9 @@ void ich9_pm_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
 {
     ICH9LPCState *lpc = ICH9_LPC_DEVICE(hotplug_dev);
 
-    if (lpc->pm.acpi_memory_hotplug.is_enabled &&
-        object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (lpc->pm.acpi_memory_hotplug.is_enabled && IS_PC_DIMM(dev)) {
         acpi_memory_unplug_cb(&lpc->pm.acpi_memory_hotplug, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) &&
-               !lpc->pm.cpu_hotplug_legacy) {
+    } else if (IS_CPU(dev) && !lpc->pm.cpu_hotplug_legacy) {
         acpi_cpu_unplug_cb(&lpc->pm.cpuhp_state, dev, errp);
     } else {
         error_setg(errp, "acpi: device unplug for not supported device"
diff --git a/hw/acpi/ipmi.c b/hw/acpi/ipmi.c
index 651e2e94ea..06c2aee1b0 100644
--- a/hw/acpi/ipmi.c
+++ b/hw/acpi/ipmi.c
@@ -90,15 +90,13 @@ void build_acpi_ipmi_devices(Aml *scope, BusState *bus)
         IPMIInterface *ii;
         IPMIInterfaceClass *iic;
         IPMIFwInfo info;
-        Object *obj = object_dynamic_cast(OBJECT(kid->child),
-                                          TYPE_IPMI_INTERFACE);
 
-        if (!obj) {
+        if (!IS_IPMI_INTERFACE(kid->child)) {
             continue;
         }
 
-        ii = IPMI_INTERFACE(obj);
-        iic = IPMI_INTERFACE_GET_CLASS(obj);
+        ii = IPMI_INTERFACE(kid->child);
+        iic = IPMI_INTERFACE_GET_CLASS(ii);
         memset(&info, 0, sizeof(info));
         iic->get_fwinfo(ii, &info);
         aml_append(scope, aml_ipmi_device(&info));
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index 27eeb6609f..03ba0402af 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -37,7 +37,7 @@ static int nvdimm_device_list(Object *obj, void *opaque)
 {
     GSList **list = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_NVDIMM)) {
+    if (IS_NVDIMM(obj)) {
         *list = g_slist_append(*list, DEVICE(obj));
     }
 
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index e330f24c71..72593e4d2f 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -375,17 +375,16 @@ static void piix4_device_plug_cb(HotplugHandler *hotplug_dev,
 {
     PIIX4PMState *s = PIIX4_PM(hotplug_dev);
 
-    if (s->acpi_memory_hotplug.is_enabled &&
-        object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
-        if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
+    if (s->acpi_memory_hotplug.is_enabled && IS_PC_DIMM(dev)) {
+        if (IS_NVDIMM(dev)) {
             nvdimm_acpi_plug_cb(hotplug_dev, dev);
         } else {
             acpi_memory_plug_cb(hotplug_dev, &s->acpi_memory_hotplug,
                                 dev, errp);
         }
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
+    } else if (IS_PCI_DEVICE(dev)) {
         acpi_pcihp_device_plug_cb(hotplug_dev, &s->acpi_pci_hotplug, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    } else if (IS_CPU(dev)) {
         if (s->cpu_hotplug_legacy) {
             legacy_acpi_cpu_plug_cb(hotplug_dev, &s->gpe_cpu, dev, errp);
         } else {
@@ -402,15 +401,13 @@ static void piix4_device_unplug_request_cb(HotplugHandler *hotplug_dev,
 {
     PIIX4PMState *s = PIIX4_PM(hotplug_dev);
 
-    if (s->acpi_memory_hotplug.is_enabled &&
-        object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (s->acpi_memory_hotplug.is_enabled && IS_PC_DIMM(dev)) {
         acpi_memory_unplug_request_cb(hotplug_dev, &s->acpi_memory_hotplug,
                                       dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
+    } else if (IS_PCI_DEVICE(dev)) {
         acpi_pcihp_device_unplug_cb(hotplug_dev, &s->acpi_pci_hotplug, dev,
                                     errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) &&
-               !s->cpu_hotplug_legacy) {
+    } else if (IS_CPU(dev) && !s->cpu_hotplug_legacy) {
         acpi_cpu_unplug_request_cb(hotplug_dev, &s->cpuhp_state, dev, errp);
     } else {
         error_setg(errp, "acpi: device unplug request for not supported device"
@@ -423,11 +420,9 @@ static void piix4_device_unplug_cb(HotplugHandler *hotplug_dev,
 {
     PIIX4PMState *s = PIIX4_PM(hotplug_dev);
 
-    if (s->acpi_memory_hotplug.is_enabled &&
-        object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (s->acpi_memory_hotplug.is_enabled && IS_PC_DIMM(dev)) {
         acpi_memory_unplug_cb(&s->acpi_memory_hotplug, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) &&
-               !s->cpu_hotplug_legacy) {
+    } else if (IS_CPU(dev) && !s->cpu_hotplug_legacy) {
         acpi_cpu_unplug_cb(&s->cpuhp_state, dev, errp);
     } else {
         error_setg(errp, "acpi: device unplug for not supported device"
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
index 20c71d7d96..2d55b28589 100644
--- a/hw/arm/boot.c
+++ b/hw/arm/boot.c
@@ -817,7 +817,7 @@ static void load_image_to_fw_cfg(FWCfgState *fw_cfg, uint16_t size_key,
 
 static int do_arm_linux_init(Object *obj, void *opaque)
 {
-    if (object_dynamic_cast(obj, TYPE_ARM_LINUX_BOOT_IF)) {
+    if (IS_ARM_LINUX_BOOT_IF(obj)) {
         ARMLinuxBootIf *albif = ARM_LINUX_BOOT_IF(obj);
         ARMLinuxBootIfClass *albifc = ARM_LINUX_BOOT_IF_GET_CLASS(obj);
         struct arm_boot_info *info = opaque;
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 0b57f87abc..507eccfd56 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1727,7 +1727,7 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
     VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
 
     if (vms->platform_bus_dev) {
-        if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)) {
+        if (IS_SYS_BUS_DEVICE(dev)) {
             platform_bus_link_device(PLATFORM_BUS_DEVICE(vms->platform_bus_dev),
                                      SYS_BUS_DEVICE(dev));
         }
@@ -1737,7 +1737,7 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
 static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
                                                         DeviceState *dev)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)) {
+    if (IS_SYS_BUS_DEVICE(dev)) {
         return HOTPLUG_HANDLER(machine);
     }
 
diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c
index 6748334ded..2cc6e6c800 100644
--- a/hw/char/spapr_vty.c
+++ b/hw/char/spapr_vty.c
@@ -19,7 +19,9 @@ typedef struct VIOsPAPRVTYDevice {
 
 #define TYPE_VIO_SPAPR_VTY_DEVICE "spapr-vty"
 #define VIO_SPAPR_VTY_DEVICE(obj) \
-     OBJECT_CHECK(VIOsPAPRVTYDevice, (obj), TYPE_VIO_SPAPR_VTY_DEVICE)
+    OBJECT_CHECK(VIOsPAPRVTYDevice, (obj), TYPE_VIO_SPAPR_VTY_DEVICE)
+#define IS_VIO_SPAPR_VTY_DEVICE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_VIO_SPAPR_VTY_DEVICE)
 
 static int vty_can_receive(void *opaque)
 {
@@ -225,7 +227,7 @@ VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus)
         DeviceState *iter = kid->child;
 
         /* Only look at VTY devices */
-        if (!object_dynamic_cast(OBJECT(iter), TYPE_VIO_SPAPR_VTY_DEVICE)) {
+        if (!IS_VIO_SPAPR_VTY_DEVICE(iter)) {
             continue;
         }
 
@@ -260,7 +262,7 @@ VIOsPAPRDevice *vty_lookup(sPAPRMachineState *spapr, target_ulong reg)
         return spapr_vty_get_default(spapr->vio_bus);
     }
 
-    if (!object_dynamic_cast(OBJECT(sdev), TYPE_VIO_SPAPR_VTY_DEVICE)) {
+    if (!IS_VIO_SPAPR_VTY_DEVICE(sdev)) {
         return NULL;
     }
 
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 35072dec1e..4b74a2752a 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1226,8 +1226,7 @@ int qdev_prop_check_globals(void)
             continue;
         }
         oc = object_class_by_name(prop->driver);
-        oc = object_class_dynamic_cast(oc, TYPE_DEVICE);
-        if (!oc) {
+        if (!IS_DEVICE_CLASS(oc)) {
             warn_report("global %s.%s has invalid class name",
                         prop->driver, prop->property);
             ret = 1;
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index 046d8f1f76..41edce3dc3 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -149,7 +149,7 @@ DeviceState *qdev_try_create(BusState *bus, const char *type)
          * being put onto a bus should be created with object_new(TYPE_FOO),
          * not qdev_create(NULL, TYPE_FOO).
          */
-        g_assert(object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE));
+        g_assert(IS_SYS_BUS_DEVICE(dev));
         bus = sysbus_get_default();
     }
 
@@ -218,15 +218,13 @@ void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
 
 HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev)
 {
-    MachineState *machine;
-    MachineClass *mc;
     Object *m_obj = qdev_get_machine();
 
-    if (object_dynamic_cast(m_obj, TYPE_MACHINE)) {
-        machine = MACHINE(m_obj);
-        mc = MACHINE_GET_CLASS(machine);
+    if (IS_MACHINE(m_obj)) {
+        MachineClass *mc = MACHINE_GET_CLASS(m_obj);
+
         if (mc->get_hotplug_handler) {
-            return mc->get_hotplug_handler(machine, dev);
+            return mc->get_hotplug_handler(MACHINE(m_obj), dev);
         }
     }
 
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 7ac36ad3e7..87b7b0f203 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -35,18 +35,13 @@ typedef struct SysBusFind {
 static int find_sysbus_device(Object *obj, void *opaque)
 {
     SysBusFind *find = opaque;
-    Object *dev;
-    SysBusDevice *sbdev;
 
-    dev = object_dynamic_cast(obj, TYPE_SYS_BUS_DEVICE);
-    sbdev = (SysBusDevice *)dev;
-
-    if (!sbdev) {
+    if (!IS_SYS_BUS_DEVICE(obj)) {
         /* Container, traverse it for children */
         return object_child_foreach(obj, find_sysbus_device, opaque);
     }
 
-    find->func(sbdev, find->opaque);
+    find->func(SYS_BUS_DEVICE(obj), find->opaque);
 
     return 0;
 }
diff --git a/hw/display/vga-pci.c b/hw/display/vga-pci.c
index e9e62eac70..e576473943 100644
--- a/hw/display/vga-pci.c
+++ b/hw/display/vga-pci.c
@@ -44,7 +44,6 @@ typedef struct PCIVGAState {
     MemoryRegion mrs[3];
 } PCIVGAState;
 
-#define TYPE_PCI_VGA "pci-vga"
 #define PCI_VGA(obj) OBJECT_CHECK(PCIVGAState, (obj), TYPE_PCI_VGA)
 
 static const VMStateDescription vmstate_vga_pci = {
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 03148450c8..ce9799bfc8 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1680,7 +1680,6 @@ static void pc_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
 {
     const PCMachineState *pcms = PC_MACHINE(hotplug_dev);
     const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
-    const bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM);
     const uint64_t legacy_align = TARGET_PAGE_SIZE;
 
     /*
@@ -1694,7 +1693,7 @@ static void pc_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
         return;
     }
 
-    if (is_nvdimm && !pcms->acpi_nvdimm_state.is_enabled) {
+    if (IS_NVDIMM(dev) && !pcms->acpi_nvdimm_state.is_enabled) {
         error_setg(errp, "nvdimm is not enabled: missing 'nvdimm' in '-M'");
         return;
     }
@@ -1709,14 +1708,13 @@ static void pc_memory_plug(HotplugHandler *hotplug_dev,
     HotplugHandlerClass *hhc;
     Error *local_err = NULL;
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
-    bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM);
 
     pc_dimm_plug(dev, MACHINE(pcms), &local_err);
     if (local_err) {
         goto out;
     }
 
-    if (is_nvdimm) {
+    if (IS_NVDIMM(dev)) {
         nvdimm_plug(&pcms->acpi_nvdimm_state);
     }
 
@@ -1744,7 +1742,7 @@ static void pc_memory_unplug_request(HotplugHandler *hotplug_dev,
         goto out;
     }
 
-    if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
+    if (IS_NVDIMM(dev)) {
         error_setg(&local_err,
                    "nvdimm device hot unplug is not supported yet.");
         goto out;
@@ -2009,9 +2007,9 @@ static void pc_cpu_pre_plug(HotplugHandler *hotplug_dev,
 static void pc_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
                                           DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(dev)) {
         pc_memory_pre_plug(hotplug_dev, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    } else if (IS_CPU(dev)) {
         pc_cpu_pre_plug(hotplug_dev, dev, errp);
     }
 }
@@ -2019,9 +2017,9 @@ static void pc_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
 static void pc_machine_device_plug_cb(HotplugHandler *hotplug_dev,
                                       DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(dev)) {
         pc_memory_plug(hotplug_dev, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    } else if (IS_CPU(dev)) {
         pc_cpu_plug(hotplug_dev, dev, errp);
     }
 }
@@ -2029,9 +2027,9 @@ static void pc_machine_device_plug_cb(HotplugHandler *hotplug_dev,
 static void pc_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
                                                 DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(dev)) {
         pc_memory_unplug_request(hotplug_dev, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    } else if (IS_CPU(dev)) {
         pc_cpu_unplug_request_cb(hotplug_dev, dev, errp);
     } else {
         error_setg(errp, "acpi: device unplug request for not supported device"
@@ -2042,9 +2040,9 @@ static void pc_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
 static void pc_machine_device_unplug_cb(HotplugHandler *hotplug_dev,
                                         DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(dev)) {
         pc_memory_unplug(hotplug_dev, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    } else if (IS_CPU(dev)) {
         pc_cpu_unplug_cb(hotplug_dev, dev, errp);
     } else {
         error_setg(errp, "acpi: device unplug for not supported device"
@@ -2055,8 +2053,7 @@ static void pc_machine_device_unplug_cb(HotplugHandler *hotplug_dev,
 static HotplugHandler *pc_get_hotpug_handler(MachineState *machine,
                                              DeviceState *dev)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
-        object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    if (IS_PC_DIMM(dev) || IS_CPU(dev)) {
         return HOTPLUG_HANDLER(machine);
     }
 
diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c
index 935a3676c8..02c77a3947 100644
--- a/hw/i386/xen/xen-hvm.c
+++ b/hw/i386/xen/xen-hvm.c
@@ -574,7 +574,7 @@ static void xen_device_realize(DeviceListener *listener,
 {
     XenIOState *state = container_of(listener, XenIOState, device_listener);
 
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
+    if (IS_PCI_DEVICE(dev)) {
         PCIDevice *pci_dev = PCI_DEVICE(dev);
         XenPciDevice *xendev = g_new(XenPciDevice, 1);
 
@@ -592,7 +592,7 @@ static void xen_device_unrealize(DeviceListener *listener,
 {
     XenIOState *state = container_of(listener, XenIOState, device_listener);
 
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
+    if (IS_PCI_DEVICE(dev)) {
         PCIDevice *pci_dev = PCI_DEVICE(dev);
         XenPciDevice *xendev, *next;
 
diff --git a/hw/ipmi/isa_ipmi_bt.c b/hw/ipmi/isa_ipmi_bt.c
index 8bbb1fa785..d4709fa7b5 100644
--- a/hw/ipmi/isa_ipmi_bt.c
+++ b/hw/ipmi/isa_ipmi_bt.c
@@ -380,10 +380,7 @@ static void ipmi_bt_init(IPMIInterface *ii, Error **errp)
     memory_region_init_io(&ib->io, NULL, &ipmi_bt_io_ops, ii, "ipmi-bt", 3);
 }
 
-
-#define TYPE_ISA_IPMI_BT "isa-ipmi-bt"
-#define ISA_IPMI_BT(obj) OBJECT_CHECK(ISAIPMIBTDevice, (obj), \
-                                       TYPE_ISA_IPMI_BT)
+#define ISA_IPMI_BT(obj) OBJECT_CHECK(ISAIPMIBTDevice, (obj), TYPE_ISA_IPMI_BT)
 
 typedef struct ISAIPMIBTDevice {
     ISADevice dev;
diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c
index 6de4f70bb4..58451da4dc 100644
--- a/hw/mem/memory-device.c
+++ b/hw/mem/memory-device.c
@@ -39,7 +39,7 @@ static int memory_device_build_list(Object *obj, void *opaque)
 {
     GSList **list = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_MEMORY_DEVICE)) {
+    if (IS_MEMORY_DEVICE(obj)) {
         DeviceState *dev = DEVICE(obj);
         if (dev->realized) { /* only realized memory devices matter */
             *list = g_slist_insert_sorted(*list, dev, memory_device_addr_sort);
@@ -54,7 +54,7 @@ static int memory_device_used_region_size(Object *obj, void *opaque)
 {
     uint64_t *size = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_MEMORY_DEVICE)) {
+    if (IS_MEMORY_DEVICE(obj)) {
         const DeviceState *dev = DEVICE(obj);
         const MemoryDeviceState *md = MEMORY_DEVICE(obj);
         const MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(obj);
@@ -226,7 +226,7 @@ static int memory_device_plugged_size(Object *obj, void *opaque)
 {
     uint64_t *size = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_MEMORY_DEVICE)) {
+    if (IS_MEMORY_DEVICE(obj)) {
         const DeviceState *dev = DEVICE(obj);
         const MemoryDeviceState *md = MEMORY_DEVICE(obj);
         const MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(obj);
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index fb6bcaedc4..35524f7535 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -101,7 +101,7 @@ static int pc_dimm_slot2bitmap(Object *obj, void *opaque)
 {
     unsigned long *bitmap = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(obj)) {
         DeviceState *dev = DEVICE(obj);
         if (dev->realized) { /* count only realized DIMMs */
             PCDIMMDevice *d = PC_DIMM(obj);
@@ -272,7 +272,7 @@ static void pc_dimm_md_fill_device_info(const MemoryDeviceState *md,
                                         NULL);
     di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
 
-    if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
+    if (IS_NVDIMM(dev)) {
         info->u.nvdimm.data = di;
         info->type = MEMORY_DEVICE_INFO_KIND_NVDIMM;
     } else {
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 51d0dec466..8163032098 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -381,7 +381,7 @@ static void pci_root_bus_init(PCIBus *bus, DeviceState *parent,
 
 bool pci_bus_is_express(PCIBus *bus)
 {
-    return object_dynamic_cast(OBJECT(bus), TYPE_PCIE_BUS);
+    return IS_PCIE_BUS(bus);
 }
 
 bool pci_bus_is_root(PCIBus *bus)
@@ -2484,7 +2484,7 @@ static int pci_qdev_find_recursive(PCIBus *bus,
     }
 
     /* roughly check if given qdev is pci device */
-    if (object_dynamic_cast(OBJECT(qdev), TYPE_PCI_DEVICE)) {
+    if (IS_PCI_DEVICE(qdev)) {
         *pdev = PCI_DEVICE(qdev);
         return 0;
     }
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index e6747fce28..e7033e87b3 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -211,7 +211,7 @@ static void sysbus_device_create_devtree(SysBusDevice *sbdev, void *opaque)
     PlatformDevtreeData *data = opaque;
     bool matched = false;
 
-    if (object_dynamic_cast(OBJECT(sbdev), TYPE_ETSEC_COMMON)) {
+    if (IS_ETSEC_COMMON(sbdev)) {
         create_devtree_etsec(sbdev, data);
         matched = true;
     }
diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
index 963d429cc8..0101b9cf67 100644
--- a/hw/ppc/e500plat.c
+++ b/hw/ppc/e500plat.c
@@ -49,10 +49,8 @@ static void e500plat_machine_device_plug_cb(HotplugHandler *hotplug_dev,
 {
     PPCE500MachineState *pms = PPCE500_MACHINE(hotplug_dev);
 
-    if (pms->pbus_dev) {
-        if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)) {
-            platform_bus_link_device(pms->pbus_dev, SYS_BUS_DEVICE(dev));
-        }
+    if (pms->pbus_dev && IS_SYS_BUS_DEVICE(dev)) {
+        platform_bus_link_device(pms->pbus_dev, SYS_BUS_DEVICE(dev));
     }
 }
 
@@ -60,7 +58,7 @@ static
 HotplugHandler *e500plat_machine_get_hotpug_handler(MachineState *machine,
                                                     DeviceState *dev)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)) {
+    if (IS_SYS_BUS_DEVICE(dev)) {
         return HOTPLUG_HANDLER(machine);
     }
 
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 346f5e7aed..70a6cc27a0 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -382,11 +382,11 @@ static int pnv_dt_isa_device(DeviceState *dev, void *opaque)
     ForeachPopulateArgs *args = opaque;
     ISADevice *d = ISA_DEVICE(dev);
 
-    if (object_dynamic_cast(OBJECT(dev), TYPE_MC146818_RTC)) {
+    if (IS_MC146818_RTC(dev)) {
         pnv_dt_rtc(d, args->fdt, args->offset);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_ISA_SERIAL)) {
+    } else if (IS_ISA_SERIAL(dev)) {
         pnv_dt_serial(d, args->fdt, args->offset);
-    } else if (object_dynamic_cast(OBJECT(dev), "isa-ipmi-bt")) {
+    } else if (IS_ISA_IPMI_BT(dev)) {
         pnv_dt_ipmi_bt(d, args->fdt, args->offset);
     } else {
         error_report("unknown isa device %s@i%x", qdev_fw_name(dev),
diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
index 46fae41f32..83d6cb921d 100644
--- a/hw/ppc/pnv_xscom.c
+++ b/hw/ppc/pnv_xscom.c
@@ -207,7 +207,7 @@ typedef struct ForeachPopulateArgs {
 
 static int xscom_dt_child(Object *child, void *opaque)
 {
-    if (object_dynamic_cast(child, TYPE_PNV_XSCOM_INTERFACE)) {
+    if (IS_PNV_XSCOM_INTERFACE(child)) {
         ForeachPopulateArgs *args = opaque;
         PnvXScomInterface *xd = PNV_XSCOM_INTERFACE(child);
         PnvXScomInterfaceClass *xc = PNV_XSCOM_INTERFACE_GET_CLASS(xd);
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 2afb7f437e..5e7fc2a274 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -603,7 +603,7 @@ static int prep_set_cmos_checksum(DeviceState *dev, void *opaque)
     uint16_t checksum = *(uint16_t *)opaque;
     ISADevice *rtc;
 
-    if (object_dynamic_cast(OBJECT(dev), "mc146818rtc")) {
+    if (IS_MC146818_RTC(dev)) {
         rtc = ISA_DEVICE(dev);
         rtc_set_memory(rtc, 0x2e, checksum & 0xff);
         rtc_set_memory(rtc, 0x3e, checksum & 0xff);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 98868d893a..027d9007ee 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1708,7 +1708,7 @@ static int spapr_post_load(void *opaque, int version_id)
         return err;
     }
 
-    if (!object_dynamic_cast(OBJECT(spapr->ics), TYPE_ICS_KVM)) {
+    if (!IS_ICS_KVM(spapr->ics)) {
         CPUState *cs;
         CPU_FOREACH(cs) {
             PowerPCCPU *cpu = POWERPC_CPU(cs);
@@ -3576,9 +3576,9 @@ out:
 static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
                                       DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(dev)) {
         spapr_memory_plug(hotplug_dev, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
+    } else if (IS_SPAPR_CPU_CORE(dev)) {
         spapr_core_plug(hotplug_dev, dev, errp);
     }
 }
@@ -3586,9 +3586,9 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
 static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev,
                                         DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(dev)) {
         spapr_memory_unplug(hotplug_dev, dev);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
+    } else if (IS_SPAPR_CPU_CORE(dev)) {
         spapr_core_unplug(hotplug_dev, dev);
     }
 }
@@ -3599,7 +3599,7 @@ static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
     sPAPRMachineState *sms = SPAPR_MACHINE(OBJECT(hotplug_dev));
     MachineClass *mc = MACHINE_GET_CLASS(sms);
 
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(dev)) {
         if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) {
             spapr_memory_unplug_request(hotplug_dev, dev, errp);
         } else {
@@ -3611,7 +3611,7 @@ static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
              */
             error_setg(errp, "Memory hot unplug not supported for this guest");
         }
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
+    } else if (IS_SPAPR_CPU_CORE(dev)) {
         if (!mc->has_hotpluggable_cpus) {
             error_setg(errp, "CPU hot unplug not supported on this machine");
             return;
@@ -3623,9 +3623,9 @@ static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
 static void spapr_machine_device_pre_plug(HotplugHandler *hotplug_dev,
                                           DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(dev)) {
         spapr_memory_pre_plug(hotplug_dev, dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
+    } else if (IS_SPAPR_CPU_CORE(dev)) {
         spapr_core_pre_plug(hotplug_dev, dev, errp);
     }
 }
@@ -3633,8 +3633,7 @@ static void spapr_machine_device_pre_plug(HotplugHandler *hotplug_dev,
 static HotplugHandler *spapr_get_hotplug_handler(MachineState *machine,
                                                  DeviceState *dev)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
-        object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
+    if (IS_PC_DIMM(dev) || IS_SPAPR_CPU_CORE(dev)) {
         return HOTPLUG_HANDLER(machine);
     }
     return NULL;
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 2edb7d1e9c..6fba6f557b 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -927,7 +927,7 @@ static uint32_t rtas_set_allocation_state(uint32_t idx, uint32_t state)
 {
     sPAPRDRConnector *drc = spapr_drc_by_index(idx);
 
-    if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_LOGICAL)) {
+    if (!IS_SPAPR_DRC_LOGICAL(drc)) {
         return RTAS_OUT_NO_SUCH_INDICATOR;
     }
 
@@ -949,7 +949,7 @@ static uint32_t rtas_set_dr_indicator(uint32_t idx, uint32_t state)
 {
     sPAPRDRConnector *drc = spapr_drc_by_index(idx);
 
-    if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_PHYSICAL)) {
+    if (!IS_SPAPR_DRC_PHYSICAL(drc)) {
         return RTAS_OUT_NO_SUCH_INDICATOR;
     }
     if ((state != SPAPR_DR_INDICATOR_INACTIVE)
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index c2271e6ed4..d9e58b7d29 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -45,6 +45,7 @@
 #include "hw/pci/pci_bus.h"
 #include "hw/pci/pci_ids.h"
 #include "hw/ppc/spapr_drc.h"
+#include "hw/vfio/vfio-common.h"
 #include "sysemu/device_tree.h"
 #include "sysemu/kvm.h"
 #include "sysemu/hostmem.h"
@@ -822,7 +823,7 @@ static char *spapr_phb_get_loc_code(sPAPRPHBState *sphb, PCIDevice *pdev)
     const char *devtype = "qemu";
     uint32_t busnr = pci_bus_num(PCI_BUS(qdev_get_parent_bus(DEVICE(pdev))));
 
-    if (object_dynamic_cast(OBJECT(pdev), "vfio-pci")) {
+    if (IS_VFIO_PCI(pdev)) {
         buf = spapr_phb_vfio_get_loc_code(sphb, pdev);
         if (buf) {
             return buf;
@@ -2253,8 +2254,8 @@ static int spapr_switch_one_vga(DeviceState *dev, void *opaque)
 {
     bool be = *(bool *)opaque;
 
-    if (object_dynamic_cast(OBJECT(dev), "VGA")
-        || object_dynamic_cast(OBJECT(dev), "secondary-vga")) {
+    if (IS_PCI_VGA(dev) &&
+        object_property_find(OBJECT(dev), "big-endian-framebuffer", NULL)) {
         object_property_set_bool(OBJECT(dev), be, "big-endian-framebuffer",
                                  &error_abort);
     }
diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c
index 71491dbd28..6bd33e1788 100644
--- a/hw/ppc/spapr_pci_vfio.c
+++ b/hw/ppc/spapr_pci_vfio.c
@@ -71,7 +71,7 @@ int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb,
         phb = PCI_HOST_BRIDGE(sphb);
         pdev = pci_find_device(phb->bus,
                                (addr >> 16) & 0xFF, (addr >> 8) & 0xFF);
-        if (!pdev || !object_dynamic_cast(OBJECT(pdev), "vfio-pci")) {
+        if (!IS_VFIO_PCI(pdev)) {
             return RTAS_OUT_PARAM_ERROR;
         }
 
@@ -114,7 +114,7 @@ static void spapr_phb_vfio_eeh_clear_dev_msix(PCIBus *bus,
                                               void *opaque)
 {
     /* Check if the device is VFIO PCI device */
-    if (!object_dynamic_cast(OBJECT(pdev), "vfio-pci")) {
+    if (!IS_VFIO_PCI(pdev)) {
         return;
     }
 
diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c
index ca5fa8d981..7438b729df 100644
--- a/hw/rdma/vmw/pvrdma_main.c
+++ b/hw/rdma/vmw/pvrdma_main.c
@@ -34,6 +34,7 @@
 #include "standard-headers/rdma/vmw_pvrdma-abi.h"
 #include "standard-headers/drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h"
 #include "pvrdma_qp_ops.h"
+#include "sysemu/hostmem.h"
 
 static Property pvrdma_dev_properties[] = {
     DEFINE_PROP_STRING("backend-dev", PVRDMADev, backend_device_name),
@@ -563,7 +564,7 @@ static int pvrdma_check_ram_shared(Object *obj, void *opaque)
 {
     bool *shared = opaque;
 
-    if (object_dynamic_cast(obj, "memory-backend-ram")) {
+    if (IS_MEMORY_BACKEND_RAM(obj)) {
         *shared = object_property_get_bool(obj, "share", NULL);
     }
 
diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index e3e0ebb7f6..6d667c4c03 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -21,6 +21,7 @@
 #include "hw/pci/pci_bus.h"
 #include "hw/pci/pci_bridge.h"
 #include "hw/pci/msi.h"
+#include "hw/vfio/vfio-common.h"
 #include "qemu/error-report.h"
 
 #ifndef DEBUG_S390PCI_BUS
@@ -811,7 +812,7 @@ static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
     S390PCIBusDevice *pbdev = NULL;
     S390pciState *s = s390_get_phb();
 
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
+    if (IS_PCI_BRIDGE(dev)) {
         BusState *bus;
         PCIBridge *pb = PCI_BRIDGE(dev);
         PCIDevice *pdev = PCI_DEVICE(dev);
@@ -837,7 +838,7 @@ static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
                                          s->bus_no, 1);
             } while (pci_get_bus(pdev) && pci_dev_bus_num(pdev));
         }
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
+    } else if (IS_PCI_DEVICE(dev)) {
         pdev = PCI_DEVICE(dev);
 
         if (pdev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION) {
@@ -863,7 +864,7 @@ static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
             }
         }
 
-        if (object_dynamic_cast(OBJECT(dev), "vfio-pci")) {
+        if (IS_VFIO_PCI(dev)) {
             pbdev->fh |= FH_SHM_VFIO;
         } else {
             pbdev->fh |= FH_SHM_EMUL;
@@ -884,7 +885,7 @@ static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
             s390_pci_generate_plug_event(HP_EVENT_RESERVED_TO_STANDBY,
                                          pbdev->fh, pbdev->fid);
         }
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_S390_PCI_DEVICE)) {
+    } else if (IS_S390_PCI_DEVICE(dev)) {
         pbdev = S390_PCI_DEVICE(dev);
 
         if (!s390_pci_alloc_idx(s, pbdev)) {
@@ -923,10 +924,10 @@ static void s390_pcihost_hot_unplug(HotplugHandler *hotplug_dev,
     S390PCIBusDevice *pbdev = NULL;
     S390pciState *s = s390_get_phb();
 
-    if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
+    if (IS_PCI_BRIDGE(dev)) {
         error_setg(errp, "PCI bridge hot unplug currently not supported");
         return;
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
+    } else if (IS_PCI_DEVICE(dev)) {
         pci_dev = PCI_DEVICE(dev);
 
         QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) {
@@ -935,7 +936,7 @@ static void s390_pcihost_hot_unplug(HotplugHandler *hotplug_dev,
             }
         }
         assert(pbdev != NULL);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_S390_PCI_DEVICE)) {
+    } else if (IS_S390_PCI_DEVICE(dev)) {
         pbdev = S390_PCI_DEVICE(dev);
         pci_dev = pbdev->pdev;
     }
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index f0f7fdcadd..f0c6652449 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -372,7 +372,7 @@ static void s390_machine_reset(void)
 static void s390_machine_device_plug(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    if (IS_CPU(dev)) {
         s390_cpu_plug(hotplug_dev, dev, errp);
     }
 }
@@ -380,7 +380,7 @@ static void s390_machine_device_plug(HotplugHandler *hotplug_dev,
 static void s390_machine_device_unplug_request(HotplugHandler *hotplug_dev,
                                                DeviceState *dev, Error **errp)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    if (IS_CPU(dev)) {
         error_setg(errp, "CPU hot unplug not supported on this machine");
         return;
     }
@@ -422,7 +422,7 @@ static const CPUArchIdList *s390_possible_cpu_arch_ids(MachineState *ms)
 static HotplugHandler *s390_get_hotplug_handler(MachineState *machine,
                                                 DeviceState *dev)
 {
-    if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    if (IS_CPU(dev)) {
         return HOTPLUG_HANDLER(machine);
     }
     return NULL;
diff --git a/hw/vfio/pci-quirks.c b/hw/vfio/pci-quirks.c
index 481fd08df7..3dc6e983a9 100644
--- a/hw/vfio/pci-quirks.c
+++ b/hw/vfio/pci-quirks.c
@@ -1391,8 +1391,12 @@ static void vfio_pci_igd_lpc_bridge_class_init(ObjectClass *klass, void *data)
     k->class_id = PCI_CLASS_BRIDGE_ISA;
 }
 
+#define TYPE_VFIO_PCI_IGD_LPC_BRIDGE "vfio-pci-igd-lpc-bridge"
+#define IS_VFIO_PCI_IGD_LPC_BRIDGE(obj) \
+    object_dynamic_cast(OBJECT(obj), TYPE_VFIO_PCI_IGD_LPC_BRIDGE)
+
 static TypeInfo vfio_pci_igd_lpc_bridge_info = {
-    .name = "vfio-pci-igd-lpc-bridge",
+    .name = TYPE_VFIO_PCI_IGD_LPC_BRIDGE,
     .parent = TYPE_PCI_DEVICE,
     .class_init = vfio_pci_igd_lpc_bridge_class_init,
     .interfaces = (InterfaceInfo[]) {
@@ -1418,7 +1422,7 @@ static int vfio_pci_igd_lpc_init(VFIOPCIDevice *vdev,
                                  0, PCI_DEVFN(0x1f, 0));
     if (!lpc_bridge) {
         lpc_bridge = pci_create_simple(pci_device_root_bus(&vdev->pdev),
-                                 PCI_DEVFN(0x1f, 0), "vfio-pci-igd-lpc-bridge");
+                            PCI_DEVFN(0x1f, 0), TYPE_VFIO_PCI_IGD_LPC_BRIDGE);
     }
 
     ret = vfio_pci_igd_copy(vdev, lpc_bridge, info, igd_lpc_bridge_infos,
@@ -1588,8 +1592,7 @@ static void vfio_probe_igd_bar4_quirk(VFIOPCIDevice *vdev, int nr)
      */
     lpc_bridge = pci_find_device(pci_device_root_bus(&vdev->pdev),
                                  0, PCI_DEVFN(0x1f, 0));
-    if (lpc_bridge && !object_dynamic_cast(OBJECT(lpc_bridge),
-                                           "vfio-pci-igd-lpc-bridge")) {
+    if (lpc_bridge && !IS_VFIO_PCI_IGD_LPC_BRIDGE(lpc_bridge)) {
         error_report("IGD device %s cannot support legacy mode due to existing "
                      "devices at address 1f.0", vdev->vbasedev.name);
         return;
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index 866f0deeb7..bd2c6241eb 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -3245,7 +3245,7 @@ static void vfio_pci_dev_class_init(ObjectClass *klass, void *data)
 }
 
 static const TypeInfo vfio_pci_dev_info = {
-    .name = "vfio-pci",
+    .name = TYPE_VFIO_PCI,
     .parent = TYPE_PCI_DEVICE,
     .instance_size = sizeof(VFIOPCIDevice),
     .class_init = vfio_pci_dev_class_init,
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index 1728e4f83a..51cc1b82e8 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -324,7 +324,7 @@ static int build_dimm_list(Object *obj, void *opaque)
 {
     GSList **list = opaque;
 
-    if (object_dynamic_cast(obj, TYPE_PC_DIMM)) {
+    if (IS_PC_DIMM(obj)) {
         DeviceState *dev = DEVICE(obj);
         if (dev->realized) { /* only realized DIMMs matter */
             *list = g_slist_prepend(*list, dev);
diff --git a/migration/channel.c b/migration/channel.c
index 33e0e9b82f..90ba75d404 100644
--- a/migration/channel.c
+++ b/migration/channel.c
@@ -36,8 +36,7 @@ void migration_channel_process_incoming(QIOChannel *ioc)
 
     if (s->parameters.tls_creds &&
         *s->parameters.tls_creds &&
-        !object_dynamic_cast(OBJECT(ioc),
-                             TYPE_QIO_CHANNEL_TLS)) {
+        !IS_QIO_CHANNEL_TLS(ioc)) {
         Error *local_err = NULL;
         migration_tls_channel_process_incoming(s, ioc, &local_err);
         if (local_err) {
@@ -68,8 +67,7 @@ void migration_channel_connect(MigrationState *s,
     if (!error) {
         if (s->parameters.tls_creds &&
             *s->parameters.tls_creds &&
-            !object_dynamic_cast(OBJECT(ioc),
-                                 TYPE_QIO_CHANNEL_TLS)) {
+            !IS_QIO_CHANNEL_TLS(ioc)) {
             migration_tls_channel_connect(s, ioc, hostname, &error);
 
             if (!error) {
diff --git a/numa.c b/numa.c
index 81542d4ebb..78a9afc0e9 100644
--- a/numa.c
+++ b/numa.c
@@ -593,7 +593,7 @@ static int query_memdev(Object *obj, void *opaque)
     MemdevList **list = opaque;
     MemdevList *m = NULL;
 
-    if (object_dynamic_cast(obj, TYPE_MEMORY_BACKEND)) {
+    if (IS_MEMORY_BACKEND(obj)) {
         m = g_malloc0(sizeof(*m));
 
         m->value = g_malloc0(sizeof(*m->value));
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 61e0300991..9e0561f55c 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -219,7 +219,7 @@ static DeviceClass *qdev_get_device_class(const char **driver, Error **errp)
         }
     }
 
-    if (!object_class_dynamic_cast(oc, TYPE_DEVICE)) {
+    if (!IS_DEVICE_CLASS(oc)) {
         if (*driver != original_name) {
             error_setg(errp, "'%s' (alias '%s') is not a valid device model"
                        " name", original_name, *driver);
@@ -834,7 +834,7 @@ static DeviceState *find_device_state(const char *id, Error **errp)
         return NULL;
     }
 
-    if (!object_dynamic_cast(obj, TYPE_DEVICE)) {
+    if (!IS_DEVICE(obj)) {
         error_setg(errp, "%s is not a hotpluggable device", id);
         return NULL;
     }
diff --git a/qmp.c b/qmp.c
index e7c0a2fd60..75e9333c2a 100644
--- a/qmp.c
+++ b/qmp.c
@@ -566,8 +566,7 @@ ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
         return NULL;
     }
 
-    klass = object_class_dynamic_cast(klass, TYPE_OBJECT);
-    if (klass == NULL) {
+    if (!IS_OBJECT_CLASS(klass)) {
         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename", TYPE_OBJECT);
         return NULL;
     }
diff --git a/qom/cpu.c b/qom/cpu.c
index 92599f3541..509e80bb84 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -333,7 +333,7 @@ static void cpu_common_realizefn(DeviceState *dev, Error **errp)
      * if this is one of the user-only emulators; in that case there's
      * no need to check the ignore_memory_transaction_failures board flag.
      */
-    if (object_dynamic_cast(machine, TYPE_MACHINE)) {
+    if (IS_MACHINE(machine)) {
         ObjectClass *oc = object_get_class(machine);
         MachineClass *mc = MACHINE_CLASS(oc);
 
diff --git a/qom/object.c b/qom/object.c
index 75d1d48944..0703e8e4ff 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -424,7 +424,7 @@ void object_initialize_childv(Object *parentobj, const char *propname,
         goto out;
     }
 
-    if (object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
+    if (IS_USER_CREATABLE(obj)) {
         user_creatable_complete(obj, &local_err);
         if (local_err) {
             object_unparent(obj);
@@ -605,7 +605,7 @@ Object *object_new_with_propv(const char *typename,
         goto error;
     }
 
-    if (object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
+    if (IS_USER_CREATABLE(obj)) {
         user_creatable_complete(obj, &local_err);
         if (local_err) {
             object_unparent(obj);
diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
index 72b97a8bed..6d152edf66 100644
--- a/qom/object_interfaces.c
+++ b/qom/object_interfaces.c
@@ -52,7 +52,7 @@ Object *user_creatable_add_type(const char *type, const char *id,
         return NULL;
     }
 
-    if (!object_class_dynamic_cast(klass, TYPE_USER_CREATABLE)) {
+    if (!IS_USER_CREATABLE_CLASS(klass)) {
         error_setg(errp, "object type '%s' isn't supported by object-add",
                    type);
         return NULL;
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
index b08078e7fc..fd42df4d89 100644
--- a/target/alpha/cpu.c
+++ b/target/alpha/cpu.c
@@ -116,8 +116,7 @@ static ObjectClass *alpha_cpu_class_by_name(const char *cpu_model)
     int i;
 
     oc = object_class_by_name(cpu_model);
-    if (oc != NULL && object_class_dynamic_cast(oc, TYPE_ALPHA_CPU) != NULL &&
-        !object_class_is_abstract(oc)) {
+    if (IS_ALPHA_CPU_CLASS(oc) && !object_class_is_abstract(oc)) {
         return oc;
     }
 
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index b5e61cc177..9895666917 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -1065,8 +1065,7 @@ static ObjectClass *arm_cpu_class_by_name(const char *cpu_model)
     oc = object_class_by_name(typename);
     g_strfreev(cpuname);
     g_free(typename);
-    if (!oc || !object_class_dynamic_cast(oc, TYPE_ARM_CPU) ||
-        object_class_is_abstract(oc)) {
+    if (!IS_ARM_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         return NULL;
     }
     return oc;
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
index e0b8246283..7ab0b71c9d 100644
--- a/target/arm/kvm64.c
+++ b/target/arm/kvm64.c
@@ -500,8 +500,7 @@ int kvm_arch_init_vcpu(CPUState *cs)
     ARMCPU *cpu = ARM_CPU(cs);
     CPUARMState *env = &cpu->env;
 
-    if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE ||
-        !object_dynamic_cast(OBJECT(cpu), TYPE_AARCH64_CPU)) {
+    if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE || !IS_AARCH64_CPU(cpu)) {
         fprintf(stderr, "KVM is not supported for this guest CPU type\n");
         return -EINVAL;
     }
diff --git a/target/cris/cpu.c b/target/cris/cpu.c
index a23aba2688..be1d43e614 100644
--- a/target/cris/cpu.c
+++ b/target/cris/cpu.c
@@ -77,8 +77,7 @@ static ObjectClass *cris_cpu_class_by_name(const char *cpu_model)
     typename = g_strdup_printf(CRIS_CPU_TYPE_NAME("%s"), cpu_model);
     oc = object_class_by_name(typename);
     g_free(typename);
-    if (oc != NULL && (!object_class_dynamic_cast(oc, TYPE_CRIS_CPU) ||
-                       object_class_is_abstract(oc))) {
+    if (!IS_CRIS_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         oc = NULL;
     }
     return oc;
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 0b2a07d3a4..2fd5215bb1 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -1440,7 +1440,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
     }
 
     if (kvm_check_extension(s, KVM_CAP_X86_SMM) &&
-        object_dynamic_cast(OBJECT(ms), TYPE_PC_MACHINE) &&
+        IS_PC_MACHINE(ms) &&
         pc_machine_is_smm_enabled(PC_MACHINE(ms))) {
         smram_machine_done.notify = register_smram_listener;
         qemu_add_machine_init_done_notifier(&smram_machine_done);
diff --git a/target/lm32/cpu.c b/target/lm32/cpu.c
index b7499cb627..6b11b29389 100644
--- a/target/lm32/cpu.c
+++ b/target/lm32/cpu.c
@@ -209,8 +209,7 @@ static ObjectClass *lm32_cpu_class_by_name(const char *cpu_model)
     typename = g_strdup_printf(LM32_CPU_TYPE_NAME("%s"), cpu_model);
     oc = object_class_by_name(typename);
     g_free(typename);
-    if (oc != NULL && (!object_class_dynamic_cast(oc, TYPE_LM32_CPU) ||
-                       object_class_is_abstract(oc))) {
+    if (!IS_LM32_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         oc = NULL;
     }
     return oc;
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
index 582e3a73b3..9a1c99f295 100644
--- a/target/m68k/cpu.c
+++ b/target/m68k/cpu.c
@@ -89,8 +89,7 @@ static ObjectClass *m68k_cpu_class_by_name(const char *cpu_model)
     typename = g_strdup_printf(M68K_CPU_TYPE_NAME("%s"), cpu_model);
     oc = object_class_by_name(typename);
     g_free(typename);
-    if (oc != NULL && (object_class_dynamic_cast(oc, TYPE_M68K_CPU) == NULL ||
-                       object_class_is_abstract(oc))) {
+    if (!IS_M68K_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         return NULL;
     }
     return oc;
diff --git a/target/moxie/cpu.c b/target/moxie/cpu.c
index 8d67eb6727..8b1c960cbf 100644
--- a/target/moxie/cpu.c
+++ b/target/moxie/cpu.c
@@ -88,8 +88,7 @@ static ObjectClass *moxie_cpu_class_by_name(const char *cpu_model)
     typename = g_strdup_printf(MOXIE_CPU_TYPE_NAME("%s"), cpu_model);
     oc = object_class_by_name(typename);
     g_free(typename);
-    if (oc != NULL && (!object_class_dynamic_cast(oc, TYPE_MOXIE_CPU) ||
-                       object_class_is_abstract(oc))) {
+    if (!IS_MOXIE_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         return NULL;
     }
     return oc;
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
index fb7cb5c507..c9b78a9d30 100644
--- a/target/openrisc/cpu.c
+++ b/target/openrisc/cpu.c
@@ -107,8 +107,7 @@ static ObjectClass *openrisc_cpu_class_by_name(const char *cpu_model)
     typename = g_strdup_printf(OPENRISC_CPU_TYPE_NAME("%s"), cpu_model);
     oc = object_class_by_name(typename);
     g_free(typename);
-    if (oc != NULL && (!object_class_dynamic_cast(oc, TYPE_OPENRISC_CPU) ||
-                       object_class_is_abstract(oc))) {
+    if (!IS_OPENRISC_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         return NULL;
     }
     return oc;
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 30aeafa7de..7dda66877b 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2458,7 +2458,7 @@ static int kvm_ppc_register_host_cpu_type(MachineState *ms)
     }
     type_info.parent = object_class_get_name(OBJECT_CLASS(pvr_pcc));
     type_register(&type_info);
-    if (object_dynamic_cast(OBJECT(ms), TYPE_SPAPR_MACHINE)) {
+    if (IS_SPAPR_MACHINE(ms)) {
         /* override TCG default cpu type with 'host' cpu model */
         mc->default_cpu_type = TYPE_HOST_POWERPC_CPU;
     }
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index d630e8fd6c..f46c234ede 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -184,8 +184,7 @@ static ObjectClass *riscv_cpu_class_by_name(const char *cpu_model)
     oc = object_class_by_name(typename);
     g_strfreev(cpuname);
     g_free(typename);
-    if (!oc || !object_class_dynamic_cast(oc, TYPE_RISCV_CPU) ||
-        object_class_is_abstract(oc)) {
+    if (!IS_RISCV_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         return NULL;
     }
     return oc;
diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c
index 2edaef1aef..bd621269fb 100644
--- a/target/tricore/cpu.c
+++ b/target/tricore/cpu.c
@@ -119,8 +119,7 @@ static ObjectClass *tricore_cpu_class_by_name(const char *cpu_model)
     typename = g_strdup_printf(TRICORE_CPU_TYPE_NAME("%s"), cpu_model);
     oc = object_class_by_name(typename);
     g_free(typename);
-    if (!oc || !object_class_dynamic_cast(oc, TYPE_TRICORE_CPU) ||
-        object_class_is_abstract(oc)) {
+    if (!IS_TRICORE_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         return NULL;
     }
     return oc;
diff --git a/target/unicore32/cpu.c b/target/unicore32/cpu.c
index 68f978d80b..a45f99411d 100644
--- a/target/unicore32/cpu.c
+++ b/target/unicore32/cpu.c
@@ -48,8 +48,7 @@ static ObjectClass *uc32_cpu_class_by_name(const char *cpu_model)
     typename = g_strdup_printf(UNICORE32_CPU_TYPE_NAME("%s"), cpu_model);
     oc = object_class_by_name(typename);
     g_free(typename);
-    if (oc != NULL && (!object_class_dynamic_cast(oc, TYPE_UNICORE32_CPU) ||
-                       object_class_is_abstract(oc))) {
+    if (!IS_UNICORE32_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         oc = NULL;
     }
     return oc;
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
index a54dbe4260..42d2ce470a 100644
--- a/target/xtensa/cpu.c
+++ b/target/xtensa/cpu.c
@@ -98,8 +98,7 @@ static ObjectClass *xtensa_cpu_class_by_name(const char *cpu_model)
     typename = g_strdup_printf(XTENSA_CPU_TYPE_NAME("%s"), cpu_model);
     oc = object_class_by_name(typename);
     g_free(typename);
-    if (oc == NULL || !object_class_dynamic_cast(oc, TYPE_XTENSA_CPU) ||
-        object_class_is_abstract(oc)) {
+    if (!IS_XTENSA_CPU_CLASS(oc) || object_class_is_abstract(oc)) {
         return NULL;
     }
     return oc;
diff --git a/tpm.c b/tpm.c
index 93031723ad..f6ef167820 100644
--- a/tpm.c
+++ b/tpm.c
@@ -34,7 +34,7 @@ tpm_be_find_by_type(enum TpmType type)
     oc = object_class_by_name(typename);
     g_free(typename);
 
-    if (!object_class_dynamic_cast(oc, TYPE_TPM_BACKEND)) {
+    if (!IS_TPM_BACKEND_CLASS(oc)) {
         return NULL;
     }
 
diff --git a/ui/vnc.c b/ui/vnc.c
index 916a16d312..0f5c276f8d 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -3464,10 +3464,8 @@ vnc_display_setup_auth(int *auth,
         }
         *subauth = VNC_AUTH_INVALID;
     } else {
-        bool is_x509 = object_dynamic_cast(OBJECT(tlscreds),
-                                           TYPE_QCRYPTO_TLS_CREDS_X509) != NULL;
-        bool is_anon = object_dynamic_cast(OBJECT(tlscreds),
-                                           TYPE_QCRYPTO_TLS_CREDS_ANON) != NULL;
+        bool is_x509 = IS_QCRYPTO_TLS_CREDS_X509(tlscreds);
+        bool is_anon = IS_QCRYPTO_TLS_CREDS_ANON(tlscreds);
 
         if (!is_x509 && !is_anon) {
             error_setg(errp,

Reply via email to