diff options
author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-06-07 13:41:20 +0000 |
---|---|---|
committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-06-07 13:41:20 +0000 |
commit | e8c653c68cf10a64732ee53963212d0d8c95f3c2 (patch) | |
tree | bf5e6dfe8190f774703697026d6f9fcac7768161 /gcc/cp/class.c | |
parent | 5c672d0baa8281f405c68604b3bec98d91da2bab (diff) | |
download | gcc-e8c653c68cf10a64732ee53963212d0d8c95f3c2.tar.gz |
* class.c (layout_class_type): Restructure overlong-bitfield tpe
search.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@248971 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r-- | gcc/cp/class.c | 60 |
1 files changed, 29 insertions, 31 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 96377cc79ae..227466ec913 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -6426,41 +6426,39 @@ layout_class_type (tree t, tree *virtuals_p) if (DECL_C_BIT_FIELD (field) && tree_int_cst_lt (TYPE_SIZE (type), DECL_SIZE (field))) { - unsigned int itk; - tree integer_type; bool was_unnamed_p = false; /* We must allocate the bits as if suitably aligned for the - longest integer type that fits in this many bits. type - of the field. Then, we are supposed to use the left over - bits as additional padding. */ - for (itk = itk_char; itk != itk_none; ++itk) - if (integer_types[itk] != NULL_TREE - && (tree_int_cst_lt (size_int (MAX_FIXED_MODE_SIZE), - TYPE_SIZE (integer_types[itk])) - || tree_int_cst_lt (DECL_SIZE (field), - TYPE_SIZE (integer_types[itk])))) - break; - - /* ITK now indicates a type that is too large for the - field. We have to back up by one to find the largest - type that fits. */ - do - { - --itk; - integer_type = integer_types[itk]; - } while (itk > 0 && integer_type == NULL_TREE); + longest integer type that fits in this many bits. Then, + we are supposed to use the left over bits as additional + padding. */ + + /* Do not pick a type bigger than MAX_FIXED_MODE_SIZE. */ + tree limit = size_int (MAX_FIXED_MODE_SIZE); + if (tree_int_cst_lt (DECL_SIZE (field), limit)) + limit = DECL_SIZE (field); + + tree integer_type = integer_types[itk_char]; + for (unsigned itk = itk_char; itk != itk_none; itk++) + if (tree next = integer_types[itk]) + { + if (tree_int_cst_lt (limit, TYPE_SIZE (next))) + /* Too big, so our current guess is what we want. */ + break; + /* Not bigger than limit, ok */ + integer_type = next; + } /* Figure out how much additional padding is required. */ - if (tree_int_cst_lt (TYPE_SIZE (integer_type), DECL_SIZE (field))) - { - if (TREE_CODE (t) == UNION_TYPE) - /* In a union, the padding field must have the full width - of the bit-field; all fields start at offset zero. */ - padding = DECL_SIZE (field); - else - padding = size_binop (MINUS_EXPR, DECL_SIZE (field), - TYPE_SIZE (integer_type)); - } + if (TREE_CODE (t) == UNION_TYPE) + /* In a union, the padding field must have the full width + of the bit-field; all fields start at offset zero. */ + padding = DECL_SIZE (field); + else + padding = size_binop (MINUS_EXPR, DECL_SIZE (field), + TYPE_SIZE (integer_type)); + + if (integer_zerop (padding)) + padding = NULL_TREE; /* An unnamed bitfield does not normally affect the alignment of the containing class on a target where |