gimple-fold: Use DECL_PADDING_P in __builtin_clear_padding
authorJakub Jelinek <jakub@redhat.com>
Thu, 26 Nov 2020 09:51:51 +0000 (10:51 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 26 Nov 2020 09:51:51 +0000 (10:51 +0100)
On Wed, Nov 25, 2020 at 12:26:17PM -0500, Jason Merrill wrote:
> I think you want to check DECL_PADDING_P here; the C and C++ front ends set
> it on unnamed bit-fields, and that's what is_empty_type looks at.

While the above has been written in the context of __builtin_bit_cast patch,
I think it applies to __builtin_clear_padding too.

So this patch implements that.  The C FE sets DECL_PADDING_P solely on the
DECL_BIT_FIELD !DECL_NAME FIELD_DECLs, the C++ FE sets it on those and in
another spot I haven't really figured out what it is about.

2020-11-26  Jakub Jelinek  <jakub@redhat.com>

* gimple-fold.c (clear_padding_union): Ignore DECL_PADDING_P
fields.
(clear_padding_type): Ignore DECL_PADDING_P fields, rather than
DECL_BIT_FIELD with NULL DECL_NAME.

gcc/gimple-fold.c

index 58b6ea42a7e208fc04d3194fac9f46f4dfdf652d..a821b649bf8f385e12f427acb941910620dd6dfd 100644 (file)
@@ -4327,7 +4327,7 @@ clear_padding_union (clear_padding_struct *buf, tree type, HOST_WIDE_INT sz)
     }
 
   for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
-    if (TREE_CODE (field) == FIELD_DECL)
+    if (TREE_CODE (field) == FIELD_DECL && !DECL_PADDING_P (field))
       {
        if (DECL_SIZE_UNIT (field) == NULL_TREE)
          {
@@ -4455,13 +4455,11 @@ clear_padding_type (clear_padding_struct *buf, tree type, HOST_WIDE_INT sz)
       HOST_WIDE_INT cur_pos;
       cur_pos = 0;
       for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
-       if (TREE_CODE (field) == FIELD_DECL)
+       if (TREE_CODE (field) == FIELD_DECL && !DECL_PADDING_P (field))
          {
            tree ftype = TREE_TYPE (field);
            if (DECL_BIT_FIELD (field))
              {
-               if (DECL_NAME (field) == NULL_TREE)
-                 continue;
                HOST_WIDE_INT fldsz = TYPE_PRECISION (ftype);
                if (fldsz == 0)
                  continue;