]> git.ipfire.org Git - thirdparty/gcc.git/commit - gcc/run-rtl-passes.c
[mid-end][__RTL] Clean state despite unspecified __RTL startwith passes
authorMatthew Malcomson <matthew.malcomson@arm.com>
Mon, 18 Nov 2019 11:16:46 +0000 (11:16 +0000)
committerMatthew Malcomson <matmal01@gcc.gnu.org>
Mon, 18 Nov 2019 11:16:46 +0000 (11:16 +0000)
commit20a380171f5db5f356b173d573559bfeef1ebbff
tree6917b6d723309b3e12013c39ef8855b345a135e2
parentef50b972e10238a1ac20f23ce3bb32187ae4cb84
[mid-end][__RTL] Clean state despite unspecified __RTL startwith passes

Hi there,

When compiling an __RTL function that has an unspecified "startwith"
pass we currently don't run the cleanup pass, this means that we ICE on
the next function (if it's a basic function).

This change ensures that the clean_state pass is run even if the
startwith pass is unspecified.

We also ensure the name of the startwith pass is always freed correctly.

As an example, before this change the following code would ICE when compiling
the function `foo_a`.

When compiled with
./aarch64-none-linux-gnu-gcc -O0 -S unspecified-pass-error.c -o test.s

```
int __RTL () badfoo ()
{
(function "badfoo"
  (insn-chain
    (block 2
      (edge-from entry (flags "FALLTHRU"))
      (cnote 3 [bb 2] NOTE_INSN_BASIC_BLOCK)
      (cinsn 101 (set (reg:DI x19) (reg:DI x0)))
      (cinsn 10 (use (reg/i:SI x19)))
      (edge-to exit (flags "FALLTHRU"))
    ) ;; block 2
  ) ;; insn-chain
) ;; function "foo2"
}

int
foo_a ()
{
  return 200;
}
```

Now it silently ignores the __RTL function and successfully compiles foo_a.

regtest done on aarch64
regtest done on x86_64

OK for trunk?

gcc/ChangeLog:

2019-11-18  Matthew Malcomson  <matthew.malcomson@arm.com>

* run-rtl-passes.c (run_rtl_passes): Accept and handle empty
"initial_pass_name" argument -- by running "*clean_state" pass.
Also free the "initial_pass_name" when done.

gcc/c/ChangeLog:

2019-11-18  Matthew Malcomson  <matthew.malcomson@arm.com>

* c-parser.c (c_parser_parse_rtl_body): Always call
run_rtl_passes, even if startwith pass is not provided.

gcc/testsuite/ChangeLog:

2019-11-18  Matthew Malcomson  <matthew.malcomson@arm.com>

* gcc.dg/rtl/aarch64/unspecified-pass-error.c: New test.

From-SVN: r278393
gcc/ChangeLog
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/run-rtl-passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/rtl/aarch64/unspecified-pass-error.c [new file with mode: 0644]