aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-11-26 10:51:51 +0100
committerJakub Jelinek <jakub@redhat.com>2020-11-26 10:51:51 +0100
commita386566118054e08bb733f1248649fb6847c407e (patch)
tree3fb332683d5f0f66a34bce27642717610328d715
parent39f5e9aded23e8b7e0e7080fc6020478b9c5b7b5 (diff)
downloadgcc-a386566118054e08bb733f1248649fb6847c407e.zip
gcc-a386566118054e08bb733f1248649fb6847c407e.tar.gz
gcc-a386566118054e08bb733f1248649fb6847c407e.tar.bz2
gimple-fold: Use DECL_PADDING_P in __builtin_clear_padding
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.
-rw-r--r--gcc/gimple-fold.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 58b6ea4..a821b64 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -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;