qemu-e2k/hw/misc
Markus Armbruster 668f62ec62 error: Eliminate error_propagate() with Coccinelle, part 1
When all we do with an Error we receive into a local variable is
propagating to somewhere else, we can just as well receive it there
right away.  Convert

    if (!foo(..., &err)) {
        ...
        error_propagate(errp, err);
        ...
        return ...
    }

to

    if (!foo(..., errp)) {
        ...
        ...
        return ...
    }

where nothing else needs @err.  Coccinelle script:

    @rule1 forall@
    identifier fun, err, errp, lbl;
    expression list args, args2;
    binary operator op;
    constant c1, c2;
    symbol false;
    @@
         if (
    (
    -        fun(args, &err, args2)
    +        fun(args, errp, args2)
    |
    -        !fun(args, &err, args2)
    +        !fun(args, errp, args2)
    |
    -        fun(args, &err, args2) op c1
    +        fun(args, errp, args2) op c1
    )
            )
         {
             ... when != err
                 when != lbl:
                 when strict
    -        error_propagate(errp, err);
             ... when != err
    (
             return;
    |
             return c2;
    |
             return false;
    )
         }

    @rule2 forall@
    identifier fun, err, errp, lbl;
    expression list args, args2;
    expression var;
    binary operator op;
    constant c1, c2;
    symbol false;
    @@
    -    var = fun(args, &err, args2);
    +    var = fun(args, errp, args2);
         ... when != err
         if (
    (
             var
    |
             !var
    |
             var op c1
    )
            )
         {
             ... when != err
                 when != lbl:
                 when strict
    -        error_propagate(errp, err);
             ... when != err
    (
             return;
    |
             return c2;
    |
             return false;
    |
             return var;
    )
         }

    @depends on rule1 || rule2@
    identifier err;
    @@
    -    Error *err = NULL;
         ... when != err

Not exactly elegant, I'm afraid.

The "when != lbl:" is necessary to avoid transforming

         if (fun(args, &err)) {
             goto out
         }
         ...
     out:
         error_propagate(errp, err);

even though other paths to label out still need the error_propagate().
For an actual example, see sclp_realize().

Without the "when strict", Coccinelle transforms vfio_msix_setup(),
incorrectly.  I don't know what exactly "when strict" does, only that
it helps here.

The match of return is narrower than what I want, but I can't figure
out how to express "return where the operand doesn't use @err".  For
an example where it's too narrow, see vfio_intx_enable().

Silently fails to convert hw/arm/armsse.c, because Coccinelle gets
confused by ARMSSE being used both as typedef and function-like macro
there.  Converted manually.

Line breaks tidied up manually.  One nested declaration of @local_err
deleted manually.  Preexisting unwanted blank line dropped in
hw/riscv/sifive_e.c.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20200707160613.848843-35-armbru@redhat.com>
2020-07-10 15:18:08 +02:00
..
macio error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
a9scu.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
allwinner-cpucfg.c hw/arm/allwinner: add CPU Configuration module 2020-03-12 16:27:33 +00:00
allwinner-h3-ccu.c hw/arm/allwinner-h3: add Clock Control Unit 2020-03-12 16:27:33 +00:00
allwinner-h3-dramc.c hw/misc/allwinner-h3-dramc: enforce 64-bit multiply when calculating row mirror address 2020-03-30 13:18:58 +01:00
allwinner-h3-sysctrl.c hw/arm/allwinner-h3: add System Control module 2020-03-12 16:27:33 +00:00
allwinner-sid.c hw/arm/allwinner: add Security Identifier device 2020-03-12 16:27:33 +00:00
applesmc.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
arm11scu.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
arm_integrator_debug.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
arm_l2x0.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
arm_sysctl.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
armsse-cpuid.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
armsse-mhu.c Clean up inclusion of sysemu/sysemu.h 2019-08-16 13:31:53 +02:00
aspeed_scu.c aspeed: Support AST2600A1 silicon revision 2020-05-11 11:00:26 +01:00
aspeed_sdmc.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
aspeed_xdma.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
auxbus.c auxbus: Eliminate aux_create_slave() 2020-06-15 22:05:28 +02:00
bcm2835_mbox.c qom: Don't handle impossible object_property_get_link() failure 2020-07-10 15:18:08 +02:00
bcm2835_mphi.c raspi: add BCM2835 SOC MPHI emulation 2020-06-05 17:23:09 +01:00
bcm2835_property.c qom: Don't handle impossible object_property_get_link() failure 2020-07-10 15:18:08 +02:00
bcm2835_rng.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
bcm2835_thermal.c hw/misc/bcm2835_thermal: Add a dummy BCM2835 thermal sensor 2019-10-25 13:09:27 +01:00
cbus.c sysemu: Split sysemu/runstate.h off sysemu/sysemu.h 2019-08-16 13:37:36 +02:00
debugexit.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
eccmemctl.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
edu.c qom: Drop parameter @errp of object_property_add() & friends 2020-05-15 07:07:58 +02:00
empty_slot.c sysbus: Convert to sysbus_realize() etc. with Coccinelle 2020-06-15 22:05:28 +02:00
exynos4210_clk.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
exynos4210_pmu.c sysemu: Split sysemu/runstate.h off sysemu/sysemu.h 2019-08-16 13:37:36 +02:00
exynos4210_rng.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
grlib_ahb_apb_pnp.c hw/misc/grlib_ahb_apb_pnp: Add trace events on read accesses 2020-06-09 09:21:10 +02:00
imx6_ccm.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
imx6_src.c hw/core: Move cpu.c, cpu.h from qom/ to hw/core/ 2019-08-21 13:24:01 +02:00
imx6ul_ccm.c hw/misc/imx6ul_ccm: Implement non writable bits in CCM registers 2020-06-16 10:32:28 +01:00
imx7_ccm.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
imx7_gpr.c Clean up inclusion of sysemu/sysemu.h 2019-08-16 13:31:53 +02:00
imx7_snvs.c sysemu: Split sysemu/runstate.h off sysemu/sysemu.h 2019-08-16 13:37:36 +02:00
imx25_ccm.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
imx31_ccm.c Include migration/vmstate.h less 2019-08-16 13:31:52 +02:00
imx_ccm.c Include qemu/module.h where needed, drop it from qemu-common.h 2019-06-12 13:18:33 +02:00
imx_rngc.c i.MX: add an emulation for RNGC 2020-01-17 14:27:16 +00:00
iotkit-secctl.c hw/misc/iotkit-secctl: Fix writing to 'PPC Interrupt Clear' register 2020-02-21 16:07:00 +00:00
iotkit-sysctl.c qom: Put name parameter before value / visitor parameter 2020-07-10 15:18:08 +02:00
iotkit-sysinfo.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
ivshmem.c hw/misc/ivshmem: Use one Error * variable instead of two 2020-03-17 16:05:49 +01:00
Kconfig hw/misc: Add the STM32F4xx EXTI device 2020-01-17 14:09:29 +00:00
mac_via.c adb: only call autopoll callbacks when autopoll is not blocked 2020-06-26 10:13:52 +01:00
Makefile.objs hw/misc/empty_slot: Move the 'hw/misc' and cover in MAINTAINERS 2020-06-09 06:59:44 +02:00
max111x.c hw/misc/max111x: Create header file for documentation, TYPE_ macros 2020-07-03 16:59:45 +01:00
milkymist-hpdmc.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
milkymist-pfpu.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
mips_cmgcr.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
mips_cpc.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
mips_itu.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
mos6522.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
mps2-fpgaio.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
mps2-scc.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
msf2-sysreg.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
mst_fpga.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
nrf51_rng.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
omap_clk.c Include hw/irq.h a lot less 2019-08-16 13:31:52 +02:00
omap_gpmc.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
omap_l4.c misc: Replace zero-length arrays with flexible array member (automatic) 2020-03-16 22:07:42 +01:00
omap_sdrc.c Include hw/hw.h exactly where needed 2019-08-16 13:31:52 +02:00
omap_tap.c Replace all occurances of __FUNCTION__ with __func__ 2018-01-22 09:46:18 +01:00
pc-testdev.c Let cpu_[physical]_memory() calls pass a boolean 'is_write' argument 2020-02-20 14:47:08 +01:00
pca9552.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
pci-testdev.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
puv3_pm.c hw/unicore32/puv3: Use qemu_log_mask(ERROR) instead of debug printf() 2020-06-09 19:01:56 +02:00
pvpanic.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
sga.c Clean up inclusion of sysemu/sysemu.h 2019-08-16 13:31:53 +02:00
slavio_misc.c sysemu: Split sysemu/runstate.h off sysemu/sysemu.h 2019-08-16 13:37:36 +02:00
stm32f2xx_syscfg.c Include qemu/module.h where needed, drop it from qemu-common.h 2019-06-12 13:18:33 +02:00
stm32f4xx_exti.c hw/misc: Add the STM32F4xx EXTI device 2020-01-17 14:09:29 +00:00
stm32f4xx_syscfg.c hw/misc/stm32f4xx_syscfg: Fix copy/paste error 2020-01-23 15:34:04 +00:00
tmp105.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
tmp105.h
tmp421.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
trace-events hw/misc/pca9552: Trace GPIO change events 2020-06-26 14:30:28 +01:00
tz-mpc.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
tz-msc.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
tz-ppc.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
unimp.c qdev: set properties with device_class_set_props() 2020-01-24 20:59:15 +01:00
vmcoreinfo.c hw/misc/vmcoreinfo: Add comment about reset handler 2019-10-15 18:18:08 -03:00
zynq_slcr.c hw/misc/zynq_slcr: add clock generation for uarts 2020-04-30 15:35:41 +01:00
zynq-xadc.c Clean up inclusion of sysemu/sysemu.h 2019-08-16 13:31:53 +02:00