]> git.ipfire.org Git - thirdparty/gcc.git/commit
inline-asm: Fix ICE with bitfields in "m" operands [PR100785]
authorJakub Jelinek <jakub@redhat.com>
Mon, 21 Jun 2021 11:30:42 +0000 (13:30 +0200)
committerJakub Jelinek <jakub@redhat.com>
Wed, 11 May 2022 05:58:20 +0000 (07:58 +0200)
commit21a95d88fe628d1da4d59c4eface53503b29a574
treeaf9237e09e41299ebf8818344a8849b8bb0971ed
parent80f194b25f573b409ada5761778fb6dfb3cf85e9
inline-asm: Fix ICE with bitfields in "m" operands [PR100785]

Bitfields, while they live in memory, aren't something inline-asm can easily
operate on.
For C and "=m" or "+m", we were diagnosing bitfields in the past in the
FE, where c_mark_addressable had:
      case COMPONENT_REF:
        if (DECL_C_BIT_FIELD (TREE_OPERAND (x, 1)))
          {
            error
              ("cannot take address of bit-field %qD", TREE_OPERAND (x, 1));
            return false;
          }
but that check got moved in GCC 6 to build_unary_op instead and now we
emit an error during expansion and ICE afterwards (i.e. error-recovery).
For "m" it used to be diagnosed in c_mark_addressable too, but since
GCC 6 it is ice-on-invalid.
For C++, this was never diagnosed in the FE, but used to be diagnosed
in the gimplifier and/or during expansion before 4.8.

The following patch does multiple things:
1) diagnoses it in the FEs
2) simplifies during expansion the inline asm if any errors have been
   reported (similarly how e.g. vregs pass if it detects errors on
   inline-asm either deletes them or simplifies to bare minimum -
   just labels), so that we don't have error-recovery ICEs there

2021-06-11  Jakub Jelinek  <jakub@redhat.com>

PR inline-asm/100785
gcc/
* cfgexpand.c (expand_asm_stmt): If errors are emitted,
remove all inputs, outputs and clobbers from the asm and
set template to "".
gcc/c/
* c-typeck.c (c_mark_addressable): Diagnose trying to make
bit-fields addressable.
gcc/cp/
* typeck.c (cxx_mark_addressable): Diagnose trying to make
bit-fields addressable.
gcc/testsuite/
* c-c++-common/pr100785.c: New test.

(cherry picked from commit 644c2cc5f2c09506a7bfef293a7f90efa8d7e5fa)
gcc/c/c-typeck.c
gcc/cfgexpand.c
gcc/cp/typeck.c
gcc/testsuite/c-c++-common/pr100785.c [new file with mode: 0644]