qemu-e2k/target/s390x
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
..
arch_dump.c
cc_helper.c target/s390x: Use tcg_s390_program_interrupt in TCG helpers 2019-10-09 12:49:01 +02:00
cpu_features_def.h
cpu_features_def.inc.h s390x/cpumodel: Fix UI to CPU features pcc-cmac-{aes,eaes}-256 2020-05-15 07:07:58 +02:00
cpu_features.c
cpu_features.h
cpu_models.c error: Eliminate error_propagate() with Coccinelle, part 1 2020-07-10 15:18:08 +02:00
cpu_models.h
cpu-param.h
cpu-qom.h cpu: Use DeviceClass reset instead of a special CPUClass reset 2020-03-17 19:48:10 -04:00
cpu.c target/s390x: Restrict CpuClass::get_crash_info() to system-mode 2020-06-05 21:23:22 +02:00
cpu.h s390x: Add SIDA memory ops 2020-04-29 14:31:31 +02:00
crypto_helper.c target/s390x: Use tcg_s390_program_interrupt in TCG helpers 2019-10-09 12:49:01 +02:00
diag.c s390x: protvirt: Move diag 308 data over SIDA 2020-04-29 14:31:32 +02:00
excp_helper.c Let cpu_[physical]_memory() calls pass a boolean 'is_write' argument 2020-02-20 14:47:08 +01:00
fpu_helper.c softfloat: Name compare relation enum 2020-05-19 08:41:45 -07:00
gdbstub.c gdbstub: extend GByteArray to read register helpers 2020-03-17 17:38:38 +00:00
gen-features.c s390x: Add unpack facility feature to GA1 2020-04-29 14:31:32 +02:00
helper.c target/s390x/helper: Clean ifdef'ry 2020-06-05 17:13:11 +02:00
helper.h target/s390x: Use tcg_gen_gvec_rotl{i,s,v} 2020-06-02 08:42:37 -07:00
insn-data.def target/s390x: Fix SQXBR 2020-07-03 11:15:59 +02:00
insn-format.def
int_helper.c target/s390x: Use tcg_s390_program_interrupt in TCG helpers 2019-10-09 12:49:01 +02:00
internal.h target/s390x: Restrict system-mode declarations 2020-06-05 17:13:11 +02:00
interrupt.c target/s390x: Remove ilen argument from trigger_pgm_exception 2019-10-09 12:49:02 +02:00
ioinst.c vfio-ccw: Add support for the schib region 2020-06-18 12:13:54 +02:00
kvm_s390x.h s390x: Add SIDA memory ops 2020-04-29 14:31:31 +02:00
kvm-stub.c s390x: protvirt: Support unpack facility 2020-04-29 14:30:54 +02:00
kvm.c s390x/kvm: help valgrind in several places 2020-06-05 17:13:11 +02:00
machine.c
Makefile.objs
mem_helper.c tcg: Search includes from the project root source directory 2020-01-15 15:13:10 -10:00
misc_helper.c target/s390x: Split out helper_per_store_real 2019-12-18 12:57:29 +01:00
mmu_helper.c s390x: Add SIDA memory ops 2020-04-29 14:31:31 +02:00
s390-tod.h
sigp.c s390x: sigp: Fix sense running reporting 2020-01-27 12:13:10 +01:00
tcg_s390x.h target/s390x: Remove ilen parameter from tcg_s390_program_interrupt 2019-10-09 12:49:01 +02:00
tcg-stub.c target/s390x: Remove ilen parameter from tcg_s390_program_interrupt 2019-10-09 12:49:01 +02:00
trace-events
translate_vx.inc.c target/s390x: Use tcg_gen_gvec_rotl{i,s,v} 2020-06-02 08:42:37 -07:00
translate.c target/s390x/translate: Fix RNSBG instruction 2020-02-26 18:57:07 +01:00
vec_fpu_helper.c softfloat: Inline float64 compare specializations 2020-05-19 08:42:45 -07:00
vec_helper.c
vec_int_helper.c target/s390x: Use tcg_gen_gvec_rotl{i,s,v} 2020-06-02 08:42:37 -07:00
vec_string_helper.c
vec.h