LCOV - code coverage report
Current view: top level - gcc - stor-layout.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 88.1 % 1364 1202
Test Date: 2026-05-30 15:37:04 Functions: 93.2 % 59 55
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* C-compiler utilities for types and variables storage layout
       2              :    Copyright (C) 1987-2026 Free Software Foundation, Inc.
       3              : 
       4              : This file is part of GCC.
       5              : 
       6              : GCC is free software; you can redistribute it and/or modify it under
       7              : the terms of the GNU General Public License as published by the Free
       8              : Software Foundation; either version 3, or (at your option) any later
       9              : version.
      10              : 
      11              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14              : for more details.
      15              : 
      16              : You should have received a copy of the GNU General Public License
      17              : along with GCC; see the file COPYING3.  If not see
      18              : <http://www.gnu.org/licenses/>.  */
      19              : 
      20              : 
      21              : #include "config.h"
      22              : #include "system.h"
      23              : #include "coretypes.h"
      24              : #include "target.h"
      25              : #include "function.h"
      26              : #include "rtl.h"
      27              : #include "tree.h"
      28              : #include "memmodel.h"
      29              : #include "tm_p.h"
      30              : #include "stringpool.h"
      31              : #include "regs.h"
      32              : #include "emit-rtl.h"
      33              : #include "cgraph.h"
      34              : #include "diagnostic-core.h"
      35              : #include "fold-const.h"
      36              : #include "stor-layout.h"
      37              : #include "varasm.h"
      38              : #include "print-tree.h"
      39              : #include "langhooks.h"
      40              : #include "tree-inline.h"
      41              : #include "dumpfile.h"
      42              : #include "gimplify.h"
      43              : #include "attribs.h"
      44              : #include "debug.h"
      45              : #include "calls.h"
      46              : 
      47              : /* Data type for the expressions representing sizes of data types.
      48              :    It is the first integer type laid out.  */
      49              : tree sizetype_tab[(int) stk_type_kind_last];
      50              : 
      51              : /* If nonzero, this is an upper limit on alignment of structure fields.
      52              :    The value is measured in bits.  */
      53              : unsigned int maximum_field_alignment = TARGET_DEFAULT_PACK_STRUCT * BITS_PER_UNIT;
      54              : 
      55              : static tree self_referential_size (tree);
      56              : static void finalize_record_size (record_layout_info);
      57              : static void finalize_type_size (tree);
      58              : static void place_union_field (record_layout_info, tree);
      59              : static int excess_unit_span (HOST_WIDE_INT, HOST_WIDE_INT, HOST_WIDE_INT,
      60              :                              HOST_WIDE_INT, tree);
      61              : extern void debug_rli (record_layout_info);
      62              : 
      63              : /* Given a size SIZE that may not be a constant, return a SAVE_EXPR
      64              :    to serve as the actual size-expression for a type or decl.  */
      65              : 
      66              : tree
      67       666869 : variable_size (tree size)
      68              : {
      69              :   /* Obviously.  */
      70       666869 :   if (TREE_CONSTANT (size))
      71              :     return size;
      72              : 
      73              :   /* If the size is self-referential, we can't make a SAVE_EXPR (see
      74              :      save_expr for the rationale).  But we can do something else.  */
      75       666807 :   if (CONTAINS_PLACEHOLDER_P (size))
      76            0 :     return self_referential_size (size);
      77              : 
      78              :   /* If we are in the global binding level, we can't make a SAVE_EXPR
      79              :      since it may end up being shared across functions, so it is up
      80              :      to the front-end to deal with this case.  */
      81       666807 :   if (lang_hooks.decls.global_bindings_p ())
      82              :     return size;
      83              : 
      84       321210 :   return save_expr (size);
      85              : }
      86              : 
      87              : /* An array of functions used for self-referential size computation.  */
      88              : static GTY(()) vec<tree, va_gc> *size_functions;
      89              : 
      90              : /* Return true if T is a self-referential component reference.  */
      91              : 
      92              : static bool
      93            0 : self_referential_component_ref_p (tree t)
      94              : {
      95            0 :   if (TREE_CODE (t) != COMPONENT_REF)
      96              :     return false;
      97              : 
      98            0 :   while (REFERENCE_CLASS_P (t))
      99            0 :     t = TREE_OPERAND (t, 0);
     100              : 
     101            0 :   return (TREE_CODE (t) == PLACEHOLDER_EXPR);
     102              : }
     103              : 
     104              : /* Similar to copy_tree_r but do not copy component references involving
     105              :    PLACEHOLDER_EXPRs.  These nodes are spotted in find_placeholder_in_expr
     106              :    and substituted in substitute_in_expr.  */
     107              : 
     108              : static tree
     109            0 : copy_self_referential_tree_r (tree *tp, int *walk_subtrees, void *data)
     110              : {
     111            0 :   enum tree_code code = TREE_CODE (*tp);
     112              : 
     113              :   /* Stop at types, decls, constants like copy_tree_r.  */
     114            0 :   if (TREE_CODE_CLASS (code) == tcc_type
     115              :       || TREE_CODE_CLASS (code) == tcc_declaration
     116            0 :       || TREE_CODE_CLASS (code) == tcc_constant)
     117              :     {
     118            0 :       *walk_subtrees = 0;
     119            0 :       return NULL_TREE;
     120              :     }
     121              : 
     122              :   /* This is the pattern built in ada/make_aligning_type.  */
     123            0 :   else if (code == ADDR_EXPR
     124            0 :            && TREE_CODE (TREE_OPERAND (*tp, 0)) == PLACEHOLDER_EXPR)
     125              :     {
     126            0 :       *walk_subtrees = 0;
     127            0 :       return NULL_TREE;
     128              :     }
     129              : 
     130              :   /* Default case: the component reference.  */
     131            0 :   else if (self_referential_component_ref_p (*tp))
     132              :     {
     133            0 :       *walk_subtrees = 0;
     134            0 :       return NULL_TREE;
     135              :     }
     136              : 
     137              :   /* We're not supposed to have them in self-referential size trees
     138              :      because we wouldn't properly control when they are evaluated.
     139              :      However, not creating superfluous SAVE_EXPRs requires accurate
     140              :      tracking of readonly-ness all the way down to here, which we
     141              :      cannot always guarantee in practice.  So punt in this case.  */
     142            0 :   else if (code == SAVE_EXPR)
     143            0 :     return error_mark_node;
     144              : 
     145            0 :   else if (code == STATEMENT_LIST)
     146            0 :     gcc_unreachable ();
     147              : 
     148            0 :   return copy_tree_r (tp, walk_subtrees, data);
     149              : }
     150              : 
     151              : /* Given a SIZE expression that is self-referential, return an equivalent
     152              :    expression to serve as the actual size expression for a type.  */
     153              : 
     154              : static tree
     155            0 : self_referential_size (tree size)
     156              : {
     157            0 :   static unsigned HOST_WIDE_INT fnno = 0;
     158            0 :   vec<tree> self_refs = vNULL;
     159            0 :   tree param_type_list = NULL, param_decl_list = NULL;
     160            0 :   tree t, ref, return_type, fntype, fnname, fndecl;
     161            0 :   unsigned int i;
     162            0 :   char buf[128];
     163            0 :   vec<tree, va_gc> *args = NULL;
     164              : 
     165              :   /* Do not factor out simple operations.  */
     166            0 :   t = skip_simple_constant_arithmetic (size);
     167            0 :   if (TREE_CODE (t) == CALL_EXPR || self_referential_component_ref_p (t))
     168              :     return size;
     169              : 
     170              :   /* Collect the list of self-references in the expression.  */
     171            0 :   find_placeholder_in_expr (size, &self_refs);
     172            0 :   gcc_assert (self_refs.length () > 0);
     173              : 
     174              :   /* Obtain a private copy of the expression.  */
     175            0 :   t = size;
     176            0 :   if (walk_tree (&t, copy_self_referential_tree_r, NULL, NULL) != NULL_TREE)
     177              :     return size;
     178            0 :   size = t;
     179              : 
     180              :   /* Build the parameter and argument lists in parallel; also
     181              :      substitute the former for the latter in the expression.  */
     182            0 :   vec_alloc (args, self_refs.length ());
     183            0 :   FOR_EACH_VEC_ELT (self_refs, i, ref)
     184              :     {
     185            0 :       tree subst, param_name, param_type, param_decl;
     186              : 
     187            0 :       if (DECL_P (ref))
     188              :         {
     189              :           /* We shouldn't have true variables here.  */
     190            0 :           gcc_assert (TREE_READONLY (ref));
     191              :           subst = ref;
     192              :         }
     193              :       /* This is the pattern built in ada/make_aligning_type.  */
     194            0 :       else if (TREE_CODE (ref) == ADDR_EXPR)
     195              :         subst = ref;
     196              :       /* Default case: the component reference.  */
     197              :       else
     198            0 :         subst = TREE_OPERAND (ref, 1);
     199              : 
     200            0 :       sprintf (buf, "p%d", i);
     201            0 :       param_name = get_identifier (buf);
     202            0 :       param_type = TREE_TYPE (ref);
     203            0 :       param_decl
     204            0 :         = build_decl (input_location, PARM_DECL, param_name, param_type);
     205            0 :       DECL_ARG_TYPE (param_decl) = param_type;
     206            0 :       DECL_ARTIFICIAL (param_decl) = 1;
     207            0 :       TREE_READONLY (param_decl) = 1;
     208              : 
     209            0 :       size = substitute_in_expr (size, subst, param_decl);
     210              : 
     211            0 :       param_type_list = tree_cons (NULL_TREE, param_type, param_type_list);
     212            0 :       param_decl_list = chainon (param_decl, param_decl_list);
     213            0 :       args->quick_push (ref);
     214              :     }
     215              : 
     216            0 :   self_refs.release ();
     217              : 
     218              :   /* Append 'void' to indicate that the number of parameters is fixed.  */
     219            0 :   param_type_list = tree_cons (NULL_TREE, void_type_node, param_type_list);
     220              : 
     221              :   /* The 3 lists have been created in reverse order.  */
     222            0 :   param_type_list = nreverse (param_type_list);
     223            0 :   param_decl_list = nreverse (param_decl_list);
     224              : 
     225              :   /* Build the function type.  */
     226            0 :   return_type = TREE_TYPE (size);
     227            0 :   fntype = build_function_type (return_type, param_type_list);
     228              : 
     229              :   /* Build the function declaration.  */
     230            0 :   sprintf (buf, "SZ" HOST_WIDE_INT_PRINT_UNSIGNED, fnno++);
     231            0 :   fnname = get_file_function_name (buf);
     232            0 :   fndecl = build_decl (input_location, FUNCTION_DECL, fnname, fntype);
     233            0 :   for (t = param_decl_list; t; t = DECL_CHAIN (t))
     234            0 :     DECL_CONTEXT (t) = fndecl;
     235            0 :   DECL_ARGUMENTS (fndecl) = param_decl_list;
     236            0 :   DECL_RESULT (fndecl)
     237            0 :     = build_decl (input_location, RESULT_DECL, 0, return_type);
     238            0 :   DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
     239              : 
     240              :   /* The function has been created by the compiler and we don't
     241              :      want to emit debug info for it.  */
     242            0 :   DECL_ARTIFICIAL (fndecl) = 1;
     243            0 :   DECL_IGNORED_P (fndecl) = 1;
     244              : 
     245              :   /* It is supposed to be "const" and never throw.  */
     246            0 :   TREE_READONLY (fndecl) = 1;
     247            0 :   TREE_NOTHROW (fndecl) = 1;
     248              : 
     249              :   /* We want it to be inlined when this is deemed profitable, as
     250              :      well as discarded if every call has been integrated.  */
     251            0 :   DECL_DECLARED_INLINE_P (fndecl) = 1;
     252              : 
     253              :   /* It is made up of a unique return statement.  */
     254            0 :   DECL_INITIAL (fndecl) = make_node (BLOCK);
     255            0 :   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
     256            0 :   t = build2 (MODIFY_EXPR, return_type, DECL_RESULT (fndecl), size);
     257            0 :   DECL_SAVED_TREE (fndecl) = build1 (RETURN_EXPR, void_type_node, t);
     258            0 :   TREE_STATIC (fndecl) = 1;
     259              : 
     260              :   /* Put it onto the list of size functions.  */
     261            0 :   vec_safe_push (size_functions, fndecl);
     262              : 
     263              :   /* Replace the original expression with a call to the size function.  */
     264            0 :   return build_call_expr_loc_vec (UNKNOWN_LOCATION, fndecl, args);
     265              : }
     266              : 
     267              : /* Take, queue and compile all the size functions.  It is essential that
     268              :    the size functions be gimplified at the very end of the compilation
     269              :    in order to guarantee transparent handling of self-referential sizes.
     270              :    Otherwise the GENERIC inliner would not be able to inline them back
     271              :    at each of their call sites, thus creating artificial non-constant
     272              :    size expressions which would trigger nasty problems later on.  */
     273              : 
     274              : void
     275       258228 : finalize_size_functions (void)
     276              : {
     277       258228 :   unsigned int i;
     278       258228 :   tree fndecl;
     279              : 
     280       258228 :   for (i = 0; size_functions && size_functions->iterate (i, &fndecl); i++)
     281              :     {
     282            0 :       allocate_struct_function (fndecl, false);
     283            0 :       set_cfun (NULL);
     284            0 :       dump_function (TDI_original, fndecl);
     285              : 
     286              :       /* As these functions are used to describe the layout of variable-length
     287              :          structures, debug info generation needs their implementation.  */
     288            0 :       debug_hooks->size_function (fndecl);
     289            0 :       gimplify_function_tree (fndecl);
     290            0 :       cgraph_node::finalize_function (fndecl, false);
     291              :     }
     292              : 
     293       258228 :   vec_free (size_functions);
     294       258228 : }
     295              : 
     296              : /* Return a machine mode of class MCLASS with SIZE bits of precision,
     297              :    if one exists.  The mode may have padding bits as well the SIZE
     298              :    value bits.  If LIMIT is nonzero, disregard modes wider than
     299              :    MAX_FIXED_MODE_SIZE.  */
     300              : 
     301              : opt_machine_mode
     302   1186759031 : mode_for_size (poly_uint64 size, enum mode_class mclass, int limit)
     303              : {
     304   1186759031 :   machine_mode mode;
     305   1186759031 :   int i;
     306              : 
     307   1347795675 :   if (limit && maybe_gt (size, (unsigned int) MAX_FIXED_MODE_SIZE))
     308     37862883 :     return opt_machine_mode ();
     309              : 
     310              :   /* Get the first mode which has this size, in the specified class.  */
     311   1694237133 :   FOR_EACH_MODE_IN_CLASS (mode, mclass)
     312   1652034513 :     if (known_eq (GET_MODE_PRECISION (mode), size))
     313   1106693528 :       return mode;
     314              : 
     315     42202620 :   if (mclass == MODE_INT || mclass == MODE_PARTIAL_INT)
     316     84373668 :     for (i = 0; i < NUM_INT_N_ENTS; i ++)
     317     42186834 :       if (known_eq (int_n_data[i].bitsize, size)
     318     42186834 :           && int_n_enabled_p[i])
     319            0 :         return int_n_data[i].m;
     320              : 
     321     42202620 :   return opt_machine_mode ();
     322              : }
     323              : 
     324              : /* Similar, except passed a tree node.  */
     325              : 
     326              : opt_machine_mode
     327    154334314 : mode_for_size_tree (const_tree size, enum mode_class mclass, int limit)
     328              : {
     329    154334314 :   unsigned HOST_WIDE_INT uhwi;
     330    154334314 :   unsigned int ui;
     331              : 
     332    154334314 :   if (!tree_fits_uhwi_p (size))
     333       287847 :     return opt_machine_mode ();
     334    154046467 :   uhwi = tree_to_uhwi (size);
     335    154046467 :   ui = uhwi;
     336    154046467 :   if (uhwi != ui)
     337          549 :     return opt_machine_mode ();
     338    154045918 :   return mode_for_size (ui, mclass, limit);
     339              : }
     340              : 
     341              : /* Return the narrowest mode of class MCLASS that contains at least
     342              :    SIZE bits, if such a mode exists.  */
     343              : 
     344              : opt_machine_mode
     345     21262466 : smallest_mode_for_size (poly_uint64 size, enum mode_class mclass)
     346              : {
     347     21262466 :   machine_mode mode = VOIDmode;
     348     21262466 :   int i;
     349              : 
     350              :   /* Get the first mode which has at least this size, in the
     351              :      specified class.  */
     352     69974440 :   FOR_EACH_MODE_IN_CLASS (mode, mclass)
     353     69974440 :     if (known_ge (GET_MODE_PRECISION (mode), size))
     354              :       break;
     355              : 
     356     21262466 :   if (mode == VOIDmode)
     357            0 :     return opt_machine_mode ();
     358              : 
     359     21262466 :   if (mclass == MODE_INT || mclass == MODE_PARTIAL_INT)
     360     42524932 :     for (i = 0; i < NUM_INT_N_ENTS; i ++)
     361     21262466 :       if (known_ge (int_n_data[i].bitsize, size)
     362     21261986 :           && known_lt (int_n_data[i].bitsize, GET_MODE_PRECISION (mode))
     363     21262466 :           && int_n_enabled_p[i])
     364            0 :         mode = int_n_data[i].m;
     365              : 
     366     21262466 :   return mode;
     367              : }
     368              : 
     369              : /* Return an integer mode of exactly the same size as MODE, if one exists.  */
     370              : 
     371              : opt_scalar_int_mode
     372      1725870 : int_mode_for_mode (machine_mode mode)
     373              : {
     374      1725870 :   switch (GET_MODE_CLASS (mode))
     375              :     {
     376      1279785 :     case MODE_INT:
     377      1279785 :     case MODE_PARTIAL_INT:
     378      1279785 :       return as_a <scalar_int_mode> (mode);
     379              : 
     380       292738 :     case MODE_COMPLEX_INT:
     381       292738 :     case MODE_COMPLEX_FLOAT:
     382       292738 :     case MODE_FLOAT:
     383       292738 :     case MODE_DECIMAL_FLOAT:
     384       292738 :     case MODE_FRACT:
     385       292738 :     case MODE_ACCUM:
     386       292738 :     case MODE_UFRACT:
     387       292738 :     case MODE_UACCUM:
     388       292738 :     case MODE_VECTOR_BOOL:
     389       292738 :     case MODE_VECTOR_INT:
     390       292738 :     case MODE_VECTOR_FLOAT:
     391       292738 :     case MODE_VECTOR_FRACT:
     392       292738 :     case MODE_VECTOR_ACCUM:
     393       292738 :     case MODE_VECTOR_UFRACT:
     394       292738 :     case MODE_VECTOR_UACCUM:
     395       585476 :       return int_mode_for_size (GET_MODE_BITSIZE (mode), 0);
     396              : 
     397            0 :     case MODE_OPAQUE:
     398            0 :         return opt_scalar_int_mode ();
     399              : 
     400       153347 :     case MODE_RANDOM:
     401       153347 :       if (mode == BLKmode)
     402       153347 :         return opt_scalar_int_mode ();
     403              : 
     404              :       /* fall through */
     405              : 
     406            0 :     case MODE_CC:
     407            0 :     default:
     408            0 :       gcc_unreachable ();
     409              :     }
     410              : }
     411              : 
     412              : /* Find a mode that can be used for efficient bitwise operations on MODE,
     413              :    if one exists.  */
     414              : 
     415              : opt_machine_mode
     416        24893 : bitwise_mode_for_mode (machine_mode mode)
     417              : {
     418              :   /* Quick exit if we already have a suitable mode.  */
     419        24893 :   scalar_int_mode int_mode;
     420        24893 :   if (is_a <scalar_int_mode> (mode, &int_mode)
     421        46598 :       && GET_MODE_BITSIZE (int_mode) <= MAX_FIXED_MODE_SIZE)
     422        23299 :     return int_mode;
     423              : 
     424              :   /* Reuse the sanity checks from int_mode_for_mode.  */
     425         1594 :   gcc_checking_assert ((int_mode_for_mode (mode), true));
     426              : 
     427         3188 :   poly_int64 bitsize = GET_MODE_BITSIZE (mode);
     428              : 
     429              :   /* Try to replace complex modes with complex modes.  In general we
     430              :      expect both components to be processed independently, so we only
     431              :      care whether there is a register for the inner mode.  */
     432         1594 :   if (COMPLEX_MODE_P (mode))
     433              :     {
     434          357 :       machine_mode trial = mode;
     435          357 :       if ((GET_MODE_CLASS (trial) == MODE_COMPLEX_INT
     436          411 :            || mode_for_size (bitsize, MODE_COMPLEX_INT, false).exists (&trial))
     437          959 :           && have_regs_of_mode[GET_MODE_INNER (trial)])
     438          247 :         return trial;
     439              :     }
     440              : 
     441              :   /* Try to replace vector modes with vector modes.  Also try using vector
     442              :      modes if an integer mode would be too big.  */
     443         1105 :   if (VECTOR_MODE_P (mode)
     444         3555 :       || maybe_gt (bitsize, MAX_FIXED_MODE_SIZE))
     445              :     {
     446          363 :       machine_mode trial = mode;
     447          363 :       if ((GET_MODE_CLASS (trial) == MODE_VECTOR_INT
     448          185 :            || mode_for_size (bitsize, MODE_VECTOR_INT, 0).exists (&trial))
     449          307 :           && have_regs_of_mode[trial]
     450          606 :           && targetm.vector_mode_supported_p (trial))
     451          243 :         return trial;
     452              :     }
     453              : 
     454              :   /* Otherwise fall back on integers while honoring MAX_FIXED_MODE_SIZE.  */
     455         1104 :   return mode_for_size (bitsize, MODE_INT, true);
     456              : }
     457              : 
     458              : /* Find a type that can be used for efficient bitwise operations on MODE.
     459              :    Return null if no such mode exists.  */
     460              : 
     461              : tree
     462        24893 : bitwise_type_for_mode (machine_mode mode)
     463              : {
     464        24893 :   if (!bitwise_mode_for_mode (mode).exists (&mode))
     465          120 :     return NULL_TREE;
     466              : 
     467        24773 :   unsigned int inner_size = GET_MODE_UNIT_BITSIZE (mode);
     468        24773 :   tree inner_type = build_nonstandard_integer_type (inner_size, true);
     469              : 
     470        24773 :   if (VECTOR_MODE_P (mode))
     471          243 :     return build_vector_type_for_mode (inner_type, mode);
     472              : 
     473        24530 :   if (COMPLEX_MODE_P (mode))
     474          247 :     return build_complex_type (inner_type);
     475              : 
     476        48566 :   gcc_checking_assert (GET_MODE_INNER (mode) == mode);
     477              :   return inner_type;
     478              : }
     479              : 
     480              : /* Find a mode that can be used for efficient bitwise operations on SIZE
     481              :    bits, if one exists.  */
     482              : 
     483              : opt_machine_mode
     484        23490 : bitwise_mode_for_size (poly_uint64 size)
     485              : {
     486        46980 :   if (known_le (size, (unsigned int) MAX_FIXED_MODE_SIZE))
     487        23243 :     return mode_for_size (size, MODE_INT, true);
     488              : 
     489              :   machine_mode mode, ret = VOIDmode;
     490         4379 :   FOR_EACH_MODE_FROM (mode, MIN_MODE_VECTOR_INT)
     491         8748 :     if (known_eq (GET_MODE_BITSIZE (mode), size)
     492          267 :         && (ret == VOIDmode || GET_MODE_INNER (mode) == QImode)
     493          267 :         && have_regs_of_mode[mode]
     494         4616 :         && targetm.vector_mode_supported_p (mode))
     495              :       {
     496          484 :         if (GET_MODE_INNER (mode) == QImode)
     497          242 :           return mode;
     498            0 :         else if (ret == VOIDmode)
     499         4132 :           ret = mode;
     500              :       }
     501            5 :   if (ret != VOIDmode)
     502            0 :     return ret;
     503            5 :   return opt_machine_mode ();
     504              : }
     505              : 
     506              : /* Find a mode that is suitable for representing a vector with NUNITS
     507              :    elements of mode INNERMODE, if one exists.  The returned mode can be
     508              :    either an integer mode or a vector mode.  */
     509              : 
     510              : opt_machine_mode
     511     71252513 : mode_for_vector (scalar_mode innermode, poly_uint64 nunits)
     512              : {
     513     71252513 :   machine_mode mode;
     514              : 
     515              :   /* First, look for a supported vector type.  */
     516     71252513 :   if (SCALAR_FLOAT_MODE_P (innermode))
     517              :     mode = MIN_MODE_VECTOR_FLOAT;
     518     67136481 :   else if (SCALAR_FRACT_MODE_P (innermode))
     519              :     mode = MIN_MODE_VECTOR_FRACT;
     520     67136481 :   else if (SCALAR_UFRACT_MODE_P (innermode))
     521              :     mode = MIN_MODE_VECTOR_UFRACT;
     522     67136481 :   else if (SCALAR_ACCUM_MODE_P (innermode))
     523              :     mode = MIN_MODE_VECTOR_ACCUM;
     524     67136481 :   else if (SCALAR_UACCUM_MODE_P (innermode))
     525              :     mode = MIN_MODE_VECTOR_UACCUM;
     526              :   else
     527     71252513 :     mode = MIN_MODE_VECTOR_INT;
     528              : 
     529              :   /* Only check the broader vector_mode_supported_any_target_p here.
     530              :      We'll filter through target-specific availability and
     531              :      vector_mode_supported_p later in vector_type_mode.  */
     532    845771412 :   FOR_EACH_MODE_FROM (mode, mode)
     533   1690888434 :     if (known_eq (GET_MODE_NUNITS (mode), nunits)
     534    388661138 :         && GET_MODE_INNER (mode) == innermode
     535    916369535 :         && targetm.vector_mode_supported_any_target_p (mode))
     536     70925318 :       return mode;
     537              : 
     538              :   /* For integers, try mapping it to a same-sized scalar mode.  */
     539       327195 :   if (GET_MODE_CLASS (innermode) == MODE_INT)
     540              :     {
     541        16844 :       poly_uint64 nbits = nunits * GET_MODE_BITSIZE (innermode);
     542        16844 :       if (int_mode_for_size (nbits, 0).exists (&mode)
     543        16075 :           && have_regs_of_mode[mode])
     544        16075 :         return mode;
     545              :     }
     546              : 
     547       311120 :   return opt_machine_mode ();
     548              : }
     549              : 
     550              : /* If a piece of code is using vector mode VECTOR_MODE and also wants
     551              :    to operate on elements of mode ELEMENT_MODE, return the vector mode
     552              :    it should use for those elements.  If NUNITS is nonzero, ensure that
     553              :    the mode has exactly NUNITS elements, otherwise pick whichever vector
     554              :    size pairs the most naturally with VECTOR_MODE; this may mean choosing
     555              :    a mode with a different size and/or number of elements, depending on
     556              :    what the target prefers.  Return an empty opt_machine_mode if there
     557              :    is no supported vector mode with the required properties.
     558              : 
     559              :    Unlike mode_for_vector. any returned mode is guaranteed to satisfy
     560              :    both VECTOR_MODE_P and targetm.vector_mode_supported_p.  */
     561              : 
     562              : opt_machine_mode
     563     34298195 : related_vector_mode (machine_mode vector_mode, scalar_mode element_mode,
     564              :                      poly_uint64 nunits)
     565              : {
     566     34298195 :   gcc_assert (VECTOR_MODE_P (vector_mode));
     567     34298195 :   return targetm.vectorize.related_mode (vector_mode, element_mode, nunits);
     568              : }
     569              : 
     570              : /* If a piece of code is using vector mode VECTOR_MODE and also wants
     571              :    to operate on integer vectors with the same element size and number
     572              :    of elements, return the vector mode it should use.  Return an empty
     573              :    opt_machine_mode if there is no supported vector mode with the
     574              :    required properties.
     575              : 
     576              :    Unlike mode_for_vector. any returned mode is guaranteed to satisfy
     577              :    both VECTOR_MODE_P and targetm.vector_mode_supported_p.  */
     578              : 
     579              : opt_machine_mode
     580        27924 : related_int_vector_mode (machine_mode vector_mode)
     581              : {
     582        27924 :   gcc_assert (VECTOR_MODE_P (vector_mode));
     583        27924 :   scalar_int_mode int_mode;
     584        55848 :   if (int_mode_for_mode (GET_MODE_INNER (vector_mode)).exists (&int_mode))
     585        55848 :     return related_vector_mode (vector_mode, int_mode,
     586        27924 :                                 GET_MODE_NUNITS (vector_mode));
     587            0 :   return opt_machine_mode ();
     588              : }
     589              : 
     590              : /* Return the alignment of MODE. This will be bounded by 1 and
     591              :    BIGGEST_ALIGNMENT.  */
     592              : 
     593              : unsigned int
     594   1638182425 : get_mode_alignment (machine_mode mode)
     595              : {
     596   3175674567 :   return MIN (BIGGEST_ALIGNMENT, MAX (1, mode_base_align[mode]*BITS_PER_UNIT));
     597              : }
     598              : 
     599              : /* Return the natural mode of an array, given that it is SIZE bytes in
     600              :    total and has elements of type ELEM_TYPE.  */
     601              : 
     602              : static machine_mode
     603     68776025 : mode_for_array (tree elem_type, tree size)
     604              : {
     605     68776025 :   tree elem_size;
     606     68776025 :   poly_uint64 int_size, int_elem_size;
     607     68776025 :   unsigned HOST_WIDE_INT num_elems;
     608     68776025 :   bool limit_p;
     609              : 
     610              :   /* One-element arrays get the component type's mode.  */
     611     68776025 :   elem_size = TYPE_SIZE (elem_type);
     612     68776025 :   if (simple_cst_equal (size, elem_size))
     613      4693009 :     return TYPE_MODE (elem_type);
     614              : 
     615     64083016 :   limit_p = true;
     616     64083016 :   if (poly_int_tree_p (size, &int_size)
     617     63795169 :       && poly_int_tree_p (elem_size, &int_elem_size)
     618     63795169 :       && maybe_ne (int_elem_size, 0U)
     619     64083016 :       && constant_multiple_p (int_size, int_elem_size, &num_elems))
     620              :     {
     621     63795169 :       machine_mode elem_mode = TYPE_MODE (elem_type);
     622     63795169 :       machine_mode mode;
     623     63795169 :       if (targetm.array_mode (elem_mode, num_elems).exists (&mode))
     624            0 :         return mode;
     625     63795169 :       if (targetm.array_mode_supported_p (elem_mode, num_elems))
     626     64083016 :         limit_p = false;
     627              :     }
     628     64083016 :   return mode_for_size_tree (size, MODE_INT, limit_p).else_blk ();
     629              : }
     630              : 
     631              : /* Subroutine of layout_decl: Force alignment required for the data type.
     632              :    But if the decl itself wants greater alignment, don't override that.  */
     633              : 
     634              : static inline void
     635   1904216141 : do_type_align (tree type, tree decl)
     636              : {
     637   1904216141 :   if (TYPE_ALIGN (type) > DECL_ALIGN (decl))
     638              :     {
     639   1812400205 :       SET_DECL_ALIGN (decl, TYPE_ALIGN (type));
     640   1812400205 :       if (TREE_CODE (decl) == FIELD_DECL)
     641     58358152 :         DECL_USER_ALIGN (decl) = TYPE_USER_ALIGN (type);
     642              :     }
     643   1904216141 :   if (TYPE_WARN_IF_NOT_ALIGN (type) > DECL_WARN_IF_NOT_ALIGN (decl))
     644           51 :     SET_DECL_WARN_IF_NOT_ALIGN (decl, TYPE_WARN_IF_NOT_ALIGN (type));
     645   1904216141 : }
     646              : 
     647              : /* Set the size, mode and alignment of a ..._DECL node.
     648              :    TYPE_DECL does need this for C++.
     649              :    Note that LABEL_DECL and CONST_DECL nodes do not need this,
     650              :    and FUNCTION_DECL nodes have them set up in a special (and simple) way.
     651              :    Don't call layout_decl for them.
     652              : 
     653              :    KNOWN_ALIGN is the amount of alignment we can assume this
     654              :    decl has with no special effort.  It is relevant only for FIELD_DECLs
     655              :    and depends on the previous fields.
     656              :    All that matters about KNOWN_ALIGN is which powers of 2 divide it.
     657              :    If KNOWN_ALIGN is 0, it means, "as much alignment as you like":
     658              :    the record will be aligned to suit.  */
     659              : 
     660              : void
     661   1904959237 : layout_decl (tree decl, unsigned int known_align)
     662              : {
     663   1904959237 :   tree type = TREE_TYPE (decl);
     664   1904959237 :   enum tree_code code = TREE_CODE (decl);
     665   1904959237 :   rtx rtl = NULL_RTX;
     666   1904959237 :   location_t loc = DECL_SOURCE_LOCATION (decl);
     667              : 
     668   1904959237 :   if (code == CONST_DECL)
     669              :     return;
     670              : 
     671   1904959237 :   gcc_assert (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL
     672              :               || code == TYPE_DECL || code == FIELD_DECL);
     673              : 
     674   1904959237 :   rtl = DECL_RTL_IF_SET (decl);
     675              : 
     676   1904959237 :   if (type == error_mark_node)
     677         3121 :     type = void_type_node;
     678              : 
     679              :   /* Usually the size and mode come from the data type without change,
     680              :      however, the front-end may set the explicit width of the field, so its
     681              :      size may not be the same as the size of its type.  This happens with
     682              :      bitfields, of course (an `int' bitfield may be only 2 bits, say), but it
     683              :      also happens with other fields.  For example, the C++ front-end creates
     684              :      zero-sized fields corresponding to empty base classes, and depends on
     685              :      layout_type setting DECL_FIELD_BITPOS correctly for the field.  Set the
     686              :      size in bytes from the size in bits.  If we have already set the mode,
     687              :      don't set it again since we can be called twice for FIELD_DECLs.  */
     688              : 
     689   1904959237 :   DECL_UNSIGNED (decl) = TYPE_UNSIGNED (type);
     690   1904959237 :   if (DECL_MODE (decl) == VOIDmode)
     691   1844914539 :     SET_DECL_MODE (decl, TYPE_MODE (type));
     692              : 
     693   1904959237 :   if (DECL_SIZE (decl) == 0)
     694              :     {
     695   1845285745 :       DECL_SIZE (decl) = TYPE_SIZE (type);
     696   1845285745 :       DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (type);
     697              :     }
     698     59673492 :   else if (DECL_SIZE_UNIT (decl) == 0)
     699       697539 :     DECL_SIZE_UNIT (decl)
     700      1395078 :       = fold_convert_loc (loc, sizetype,
     701       697539 :                           size_binop_loc (loc, CEIL_DIV_EXPR, DECL_SIZE (decl),
     702              :                                           bitsize_unit_node));
     703              : 
     704   1904959237 :   if (code != FIELD_DECL)
     705              :     /* For non-fields, update the alignment from the type.  */
     706   1841359101 :     do_type_align (type, decl);
     707              :   else
     708              :     /* For fields, it's a bit more complicated...  */
     709              :     {
     710     63600136 :       bool old_user_align = DECL_USER_ALIGN (decl);
     711     63600136 :       bool zero_bitfield = false;
     712     63600136 :       bool packed_p = DECL_PACKED (decl);
     713     63600136 :       unsigned int mfa;
     714              : 
     715     63600136 :       if (DECL_BIT_FIELD (decl))
     716              :         {
     717       744206 :           DECL_BIT_FIELD_TYPE (decl) = type;
     718              : 
     719              :           /* A zero-length bit-field affects the alignment of the next
     720              :              field.  In essence such bit-fields are not influenced by
     721              :              any packing due to #pragma pack or attribute packed.  */
     722       744206 :           if (integer_zerop (DECL_SIZE (decl))
     723       744206 :               && ! targetm.ms_bitfield_layout_p (DECL_FIELD_CONTEXT (decl)))
     724              :             {
     725         2187 :               zero_bitfield = true;
     726         2187 :               packed_p = false;
     727         2187 :               if (PCC_BITFIELD_TYPE_MATTERS)
     728         2187 :                 do_type_align (type, decl);
     729              :               else
     730              :                 {
     731              : #ifdef EMPTY_FIELD_BOUNDARY
     732              :                   if (EMPTY_FIELD_BOUNDARY > DECL_ALIGN (decl))
     733              :                     {
     734              :                       SET_DECL_ALIGN (decl, EMPTY_FIELD_BOUNDARY);
     735              :                       DECL_USER_ALIGN (decl) = 0;
     736              :                     }
     737              : #endif
     738              :                 }
     739              :             }
     740              : 
     741              :           /* See if we can use an ordinary integer mode for a bit-field.
     742              :              Conditions are: a fixed size that is correct for another mode,
     743              :              occupying a complete byte or bytes on proper boundary.  */
     744       744206 :           if (TYPE_SIZE (type) != 0
     745       744206 :               && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
     746      1488412 :               && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT)
     747              :             {
     748       743946 :               machine_mode xmode;
     749       743946 :               if (mode_for_size_tree (DECL_SIZE (decl),
     750       568863 :                                       MODE_INT, 1).exists (&xmode))
     751              :                 {
     752       175083 :                   unsigned int xalign = GET_MODE_ALIGNMENT (xmode);
     753       153367 :                   if (!(xalign > BITS_PER_UNIT && DECL_PACKED (decl))
     754       328180 :                       && (known_align == 0 || known_align >= xalign))
     755              :                     {
     756       153444 :                       SET_DECL_ALIGN (decl, MAX (xalign, DECL_ALIGN (decl)));
     757       153444 :                       SET_DECL_MODE (decl, xmode);
     758       153444 :                       DECL_BIT_FIELD (decl) = 0;
     759              :                     }
     760              :                 }
     761              :             }
     762              : 
     763              :           /* Turn off DECL_BIT_FIELD if we won't need it set.  */
     764       744464 :           if (TYPE_MODE (type) == BLKmode && DECL_MODE (decl) == BLKmode
     765          258 :               && known_align >= TYPE_ALIGN (type)
     766       744256 :               && DECL_ALIGN (decl) >= TYPE_ALIGN (type))
     767            1 :             DECL_BIT_FIELD (decl) = 0;
     768              :         }
     769     62855930 :       else if (packed_p && DECL_USER_ALIGN (decl))
     770              :         /* Don't touch DECL_ALIGN.  For other packed fields, go ahead and
     771              :            round up; we'll reduce it again below.  We want packing to
     772              :            supersede USER_ALIGN inherited from the type, but defer to
     773              :            alignment explicitly specified on the field decl.  */;
     774              :       else
     775     62854853 :         do_type_align (type, decl);
     776              : 
     777              :       /* If the field is packed and not explicitly aligned, give it the
     778              :          minimum alignment.  Note that do_type_align may set
     779              :          DECL_USER_ALIGN, so we need to check old_user_align instead.  */
     780     63600136 :       if (packed_p
     781     63600136 :           && !old_user_align)
     782         6805 :         SET_DECL_ALIGN (decl, MIN (DECL_ALIGN (decl), BITS_PER_UNIT));
     783              : 
     784     63600136 :       if (! packed_p && ! DECL_USER_ALIGN (decl))
     785              :         {
     786              :           /* Some targets (i.e. i386, VMS) limit struct field alignment
     787              :              to a lower boundary than alignment of variables unless
     788              :              it was overridden by attribute aligned.  */
     789              : #ifdef BIGGEST_FIELD_ALIGNMENT
     790              :           SET_DECL_ALIGN (decl, MIN (DECL_ALIGN (decl),
     791              :                                      (unsigned) BIGGEST_FIELD_ALIGNMENT));
     792              : #endif
     793              : #ifdef ADJUST_FIELD_ALIGN
     794     62920265 :           SET_DECL_ALIGN (decl, ADJUST_FIELD_ALIGN (decl, TREE_TYPE (decl),
     795              :                                                     DECL_ALIGN (decl)));
     796              : #endif
     797              :         }
     798              : 
     799     63600136 :       if (zero_bitfield)
     800         2187 :         mfa = initial_max_fld_align * BITS_PER_UNIT;
     801              :       else
     802     63597949 :         mfa = maximum_field_alignment;
     803              :       /* Should this be controlled by DECL_USER_ALIGN, too?  */
     804     63600136 :       if (mfa != 0)
     805          550 :         SET_DECL_ALIGN (decl, MIN (DECL_ALIGN (decl), mfa));
     806              :     }
     807              : 
     808              :   /* Evaluate nonconstant size only once, either now or as soon as safe.  */
     809   1904959237 :   if (DECL_SIZE (decl) != 0 && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
     810        27085 :     DECL_SIZE (decl) = variable_size (DECL_SIZE (decl));
     811   1904959237 :   if (DECL_SIZE_UNIT (decl) != 0
     812   1904959237 :       && TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST)
     813        27085 :     DECL_SIZE_UNIT (decl) = variable_size (DECL_SIZE_UNIT (decl));
     814              : 
     815              :   /* If requested, warn about definitions of large data objects.  */
     816   1170965470 :   if ((code == PARM_DECL || (code == VAR_DECL && !DECL_NONLOCAL_FRAME (decl)))
     817   2195757651 :       && !DECL_EXTERNAL (decl))
     818              :     {
     819   1294416216 :       tree size = DECL_SIZE_UNIT (decl);
     820              : 
     821   1294416216 :       if (size != 0 && TREE_CODE (size) == INTEGER_CST)
     822              :         {
     823              :           /* -Wlarger-than= argument of HOST_WIDE_INT_MAX is treated
     824              :              as if PTRDIFF_MAX had been specified, with the value
     825              :              being that on the target rather than the host.  */
     826   1160842796 :           unsigned HOST_WIDE_INT max_size = warn_larger_than_size;
     827   1160842796 :           if (max_size == HOST_WIDE_INT_MAX)
     828   1160842735 :             max_size = tree_to_shwi (TYPE_MAX_VALUE (ptrdiff_type_node));
     829              : 
     830   1160842796 :           if (compare_tree_int (size, max_size) > 0)
     831           23 :             warning (OPT_Wlarger_than_, "size of %q+D %E bytes exceeds "
     832              :                      "maximum object size %wu",
     833              :                      decl, size, max_size);
     834              :         }
     835              :     }
     836              : 
     837              :   /* If the RTL was already set, update its mode and mem attributes.  */
     838   1904959237 :   if (rtl)
     839              :     {
     840        37784 :       PUT_MODE (rtl, DECL_MODE (decl));
     841        37784 :       SET_DECL_RTL (decl, 0);
     842        37784 :       if (MEM_P (rtl))
     843        37784 :         set_mem_attributes (rtl, decl, 1);
     844        37784 :       SET_DECL_RTL (decl, rtl);
     845              :     }
     846              : }
     847              : 
     848              : /* Given a VAR_DECL, PARM_DECL, RESULT_DECL, or FIELD_DECL, clears the
     849              :    results of a previous call to layout_decl and calls it again.  */
     850              : 
     851              : void
     852    449685444 : relayout_decl (tree decl)
     853              : {
     854    449685444 :   DECL_SIZE (decl) = DECL_SIZE_UNIT (decl) = 0;
     855    449685444 :   SET_DECL_MODE (decl, VOIDmode);
     856    449685444 :   if (!DECL_USER_ALIGN (decl))
     857    449684262 :     SET_DECL_ALIGN (decl, 0);
     858    449685444 :   if (DECL_RTL_SET_P (decl))
     859            0 :     SET_DECL_RTL (decl, 0);
     860              : 
     861    449685444 :   layout_decl (decl, 0);
     862    449685444 : }
     863              : 
     864              : /* Begin laying out type T, which may be a RECORD_TYPE, UNION_TYPE, or
     865              :    QUAL_UNION_TYPE.  Return a pointer to a struct record_layout_info which
     866              :    is to be passed to all other layout functions for this record.  It is the
     867              :    responsibility of the caller to call `free' for the storage returned.
     868              :    Note that garbage collection is not permitted until we finish laying
     869              :    out the record.  */
     870              : 
     871              : record_layout_info
     872     55110816 : start_record_layout (tree t)
     873              : {
     874     55110816 :   record_layout_info rli = XNEW (struct record_layout_info_s);
     875              : 
     876     55110816 :   rli->t = t;
     877              : 
     878              :   /* If the type has a minimum specified alignment (via an attribute
     879              :      declaration, for example) use it -- otherwise, start with a
     880              :      one-byte alignment.  */
     881     55110816 :   rli->record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (t));
     882     55110816 :   rli->unpacked_align = rli->record_align;
     883    109909932 :   rli->offset_align = MAX (rli->record_align, BIGGEST_ALIGNMENT);
     884              : 
     885              : #ifdef STRUCTURE_SIZE_BOUNDARY
     886              :   /* Packed structures don't need to have minimum size.  */
     887              :   if (! TYPE_PACKED (t))
     888              :     {
     889              :       unsigned tmp;
     890              : 
     891              :       /* #pragma pack overrides STRUCTURE_SIZE_BOUNDARY.  */
     892              :       tmp = (unsigned) STRUCTURE_SIZE_BOUNDARY;
     893              :       if (maximum_field_alignment != 0)
     894              :         tmp = MIN (tmp, maximum_field_alignment);
     895              :       rli->record_align = MAX (rli->record_align, tmp);
     896              :     }
     897              : #endif
     898              : 
     899     55110816 :   rli->offset = size_zero_node;
     900     55110816 :   rli->bitpos = bitsize_zero_node;
     901     55110816 :   rli->prev_field = 0;
     902     55110816 :   rli->pending_statics = 0;
     903     55110816 :   rli->packed_maybe_necessary = 0;
     904     55110816 :   rli->remaining_in_alignment = 0;
     905              : 
     906     55110816 :   return rli;
     907              : }
     908              : 
     909              : /* Fold sizetype value X to bitsizetype, given that X represents a type
     910              :    size or offset.  */
     911              : 
     912              : static tree
     913    344522558 : bits_from_bytes (tree x)
     914              : {
     915    344522558 :   if (POLY_INT_CST_P (x))
     916              :     /* The runtime calculation isn't allowed to overflow sizetype;
     917              :        increasing the runtime values must always increase the size
     918              :        or offset of the object.  This means that the object imposes
     919              :        a maximum value on the runtime parameters, but we don't record
     920              :        what that is.  */
     921              :     return build_poly_int_cst
     922              :       (bitsizetype,
     923              :        poly_wide_int::from (poly_int_cst_value (x),
     924              :                             TYPE_PRECISION (bitsizetype),
     925              :                             TYPE_SIGN (TREE_TYPE (x))));
     926    344522558 :   x = fold_convert (bitsizetype, x);
     927    344522558 :   gcc_checking_assert (x);
     928    344522558 :   return x;
     929              : }
     930              : 
     931              : /* Return the combined bit position for the byte offset OFFSET and the
     932              :    bit position BITPOS.
     933              : 
     934              :    These functions operate on byte and bit positions present in FIELD_DECLs
     935              :    and assume that these expressions result in no (intermediate) overflow.
     936              :    This assumption is necessary to fold the expressions as much as possible,
     937              :    so as to avoid creating artificially variable-sized types in languages
     938              :    supporting variable-sized types like Ada.  */
     939              : 
     940              : tree
     941    275156610 : bit_from_pos (tree offset, tree bitpos)
     942              : {
     943    275156610 :   return size_binop (PLUS_EXPR, bitpos,
     944              :                      size_binop (MULT_EXPR, bits_from_bytes (offset),
     945              :                                  bitsize_unit_node));
     946              : }
     947              : 
     948              : /* Return the combined truncated byte position for the byte offset OFFSET and
     949              :    the bit position BITPOS.  */
     950              : 
     951              : tree
     952    286659998 : byte_from_pos (tree offset, tree bitpos)
     953              : {
     954    286659998 :   tree bytepos;
     955    286659998 :   if (TREE_CODE (bitpos) == MULT_EXPR
     956    286659998 :       && tree_int_cst_equal (TREE_OPERAND (bitpos, 1), bitsize_unit_node))
     957            0 :     bytepos = TREE_OPERAND (bitpos, 0);
     958              :   else
     959    286659998 :     bytepos = size_binop (TRUNC_DIV_EXPR, bitpos, bitsize_unit_node);
     960    286659998 :   return size_binop (PLUS_EXPR, offset, fold_convert (sizetype, bytepos));
     961              : }
     962              : 
     963              : /* Split the bit position POS into a byte offset *POFFSET and a bit
     964              :    position *PBITPOS with the byte offset aligned to OFF_ALIGN bits.  */
     965              : 
     966              : void
     967     65199706 : pos_from_bit (tree *poffset, tree *pbitpos, unsigned int off_align,
     968              :               tree pos)
     969              : {
     970     65199706 :   tree toff_align = bitsize_int (off_align);
     971     65199706 :   if (TREE_CODE (pos) == MULT_EXPR
     972     65199706 :       && tree_int_cst_equal (TREE_OPERAND (pos, 1), toff_align))
     973              :     {
     974            0 :       *poffset = size_binop (MULT_EXPR,
     975              :                              fold_convert (sizetype, TREE_OPERAND (pos, 0)),
     976              :                              size_int (off_align / BITS_PER_UNIT));
     977            0 :       *pbitpos = bitsize_zero_node;
     978              :     }
     979              :   else
     980              :     {
     981     65199706 :       *poffset = size_binop (MULT_EXPR,
     982              :                              fold_convert (sizetype,
     983              :                                            size_binop (FLOOR_DIV_EXPR, pos,
     984              :                                                        toff_align)),
     985              :                              size_int (off_align / BITS_PER_UNIT));
     986     65199706 :       *pbitpos = size_binop (FLOOR_MOD_EXPR, pos, toff_align);
     987              :     }
     988     65199706 : }
     989              : 
     990              : /* Given a pointer to bit and byte offsets and an offset alignment,
     991              :    normalize the offsets so they are within the alignment.  */
     992              : 
     993              : void
     994    201249485 : normalize_offset (tree *poffset, tree *pbitpos, unsigned int off_align)
     995              : {
     996              :   /* If the bit position is now larger than it should be, adjust it
     997              :      downwards.  */
     998    201249485 :   if (compare_tree_int (*pbitpos, off_align) >= 0)
     999              :     {
    1000     65199706 :       tree offset, bitpos;
    1001     65199706 :       pos_from_bit (&offset, &bitpos, off_align, *pbitpos);
    1002     65199706 :       *poffset = size_binop (PLUS_EXPR, *poffset, offset);
    1003     65199706 :       *pbitpos = bitpos;
    1004              :     }
    1005    201249485 : }
    1006              : 
    1007              : /* Print debugging information about the information in RLI.  */
    1008              : 
    1009              : DEBUG_FUNCTION void
    1010            0 : debug_rli (record_layout_info rli)
    1011              : {
    1012            0 :   print_node_brief (stderr, "type", rli->t, 0);
    1013            0 :   print_node_brief (stderr, "\noffset", rli->offset, 0);
    1014            0 :   print_node_brief (stderr, " bitpos", rli->bitpos, 0);
    1015              : 
    1016            0 :   fprintf (stderr, "\naligns: rec = %u, unpack = %u, off = %u\n",
    1017              :            rli->record_align, rli->unpacked_align,
    1018              :            rli->offset_align);
    1019              : 
    1020              :   /* The ms_struct code is the only that uses this.  */
    1021            0 :   if (targetm.ms_bitfield_layout_p (rli->t))
    1022            0 :     fprintf (stderr, "remaining in alignment = %u\n", rli->remaining_in_alignment);
    1023              : 
    1024            0 :   if (rli->packed_maybe_necessary)
    1025            0 :     fprintf (stderr, "packed may be necessary\n");
    1026              : 
    1027            0 :   if (!vec_safe_is_empty (rli->pending_statics))
    1028              :     {
    1029            0 :       fprintf (stderr, "pending statics:\n");
    1030            0 :       debug (rli->pending_statics);
    1031              :     }
    1032            0 : }
    1033              : 
    1034              : /* Given an RLI with a possibly-incremented BITPOS, adjust OFFSET and
    1035              :    BITPOS if necessary to keep BITPOS below OFFSET_ALIGN.  */
    1036              : 
    1037              : void
    1038    201249485 : normalize_rli (record_layout_info rli)
    1039              : {
    1040    201249485 :   normalize_offset (&rli->offset, &rli->bitpos, rli->offset_align);
    1041    201249485 : }
    1042              : 
    1043              : /* Returns the size in bytes allocated so far.  */
    1044              : 
    1045              : tree
    1046    176393574 : rli_size_unit_so_far (record_layout_info rli)
    1047              : {
    1048    176393574 :   return byte_from_pos (rli->offset, rli->bitpos);
    1049              : }
    1050              : 
    1051              : /* Returns the size in bits allocated so far.  */
    1052              : 
    1053              : tree
    1054    151264322 : rli_size_so_far (record_layout_info rli)
    1055              : {
    1056    151264322 :   return bit_from_pos (rli->offset, rli->bitpos);
    1057              : }
    1058              : 
    1059              : /* FIELD is about to be added to RLI->T.  The alignment (in bits) of
    1060              :    the next available location within the record is given by KNOWN_ALIGN.
    1061              :    Update the variable alignment fields in RLI, and return the alignment
    1062              :    to give the FIELD.  */
    1063              : 
    1064              : unsigned int
    1065     62141405 : update_alignment_for_field (record_layout_info rli, tree field,
    1066              :                             unsigned int known_align)
    1067              : {
    1068              :   /* The alignment required for FIELD.  */
    1069     62141405 :   unsigned int desired_align;
    1070              :   /* The type of this field.  */
    1071     62141405 :   tree type = TREE_TYPE (field);
    1072              :   /* True if the field was explicitly aligned by the user.  */
    1073     62141405 :   bool user_align;
    1074     62141405 :   bool is_bitfield;
    1075              : 
    1076              :   /* Do not attempt to align an ERROR_MARK node */
    1077     62141405 :   if (TREE_CODE (type) == ERROR_MARK)
    1078              :     return 0;
    1079              : 
    1080              :   /* Lay out the field so we know what alignment it needs.  */
    1081     62141400 :   layout_decl (field, known_align);
    1082     62141400 :   desired_align = DECL_ALIGN (field);
    1083     62141400 :   user_align = DECL_USER_ALIGN (field);
    1084              : 
    1085    124282800 :   is_bitfield = (type != error_mark_node
    1086     62141400 :                  && DECL_BIT_FIELD_TYPE (field)
    1087     62838939 :                  && ! integer_zerop (TYPE_SIZE (type)));
    1088              : 
    1089              :   /* Record must have at least as much alignment as any field.
    1090              :      Otherwise, the alignment of the field within the record is
    1091              :      meaningless.  */
    1092     62141400 :   if (targetm.ms_bitfield_layout_p (rli->t))
    1093              :     {
    1094              :       /* Here, the alignment of the underlying type of a bitfield can
    1095              :          affect the alignment of a record; even a zero-sized field
    1096              :          can do this.  The alignment should be to the alignment of
    1097              :          the type, except that for zero-size bitfields this only
    1098              :          applies if there was an immediately prior, nonzero-size
    1099              :          bitfield.  (That's the way it is, experimentally.) */
    1100          206 :       if (!is_bitfield
    1101          206 :           || ((DECL_SIZE (field) == NULL_TREE
    1102          131 :                || !integer_zerop (DECL_SIZE (field)))
    1103          121 :               ? !DECL_PACKED (field)
    1104           10 :               : (rli->prev_field
    1105            8 :                  && DECL_BIT_FIELD_TYPE (rli->prev_field)
    1106            8 :                  && ! integer_zerop (DECL_SIZE (rli->prev_field)))))
    1107              :         {
    1108          202 :           unsigned int type_align = TYPE_ALIGN (type);
    1109          277 :           if (!is_bitfield && DECL_PACKED (field))
    1110              :             type_align = desired_align;
    1111              :           else
    1112          202 :             type_align = MAX (type_align, desired_align);
    1113          202 :           if (maximum_field_alignment != 0)
    1114           68 :             type_align = MIN (type_align, maximum_field_alignment);
    1115          202 :           rli->record_align = MAX (rli->record_align, type_align);
    1116          202 :           rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
    1117              :         }
    1118              :     }
    1119     62141194 :   else if (is_bitfield && PCC_BITFIELD_TYPE_MATTERS)
    1120              :     {
    1121              :       /* Named bit-fields cause the entire structure to have the
    1122              :          alignment implied by their type.  Some targets also apply the same
    1123              :          rules to unnamed bitfields.  */
    1124       697408 :       if (DECL_NAME (field) != 0
    1125       697408 :           || targetm.align_anon_bitfield ())
    1126              :         {
    1127       553582 :           unsigned int type_align = TYPE_ALIGN (type);
    1128              : 
    1129              : #ifdef ADJUST_FIELD_ALIGN
    1130       553582 :           if (! TYPE_USER_ALIGN (type))
    1131       546728 :             type_align = ADJUST_FIELD_ALIGN (field, type, type_align);
    1132              : #endif
    1133              : 
    1134              :           /* Targets might chose to handle unnamed and hence possibly
    1135              :              zero-width bitfield.  Those are not influenced by #pragmas
    1136              :              or packed attributes.  */
    1137       553582 :           if (integer_zerop (DECL_SIZE (field)))
    1138              :             {
    1139            0 :               if (initial_max_fld_align)
    1140            0 :                 type_align = MIN (type_align,
    1141              :                                   initial_max_fld_align * BITS_PER_UNIT);
    1142              :             }
    1143       553582 :           else if (maximum_field_alignment != 0)
    1144          177 :             type_align = MIN (type_align, maximum_field_alignment);
    1145       553405 :           else if (DECL_PACKED (field))
    1146         2853 :             type_align = MIN (type_align, BITS_PER_UNIT);
    1147              : 
    1148              :           /* The alignment of the record is increased to the maximum
    1149              :              of the current alignment, the alignment indicated on the
    1150              :              field (i.e., the alignment specified by an __aligned__
    1151              :              attribute), and the alignment indicated by the type of
    1152              :              the field.  */
    1153       553582 :           rli->record_align = MAX (rli->record_align, desired_align);
    1154       553582 :           rli->record_align = MAX (rli->record_align, type_align);
    1155              : 
    1156       553582 :           if (warn_packed)
    1157            0 :             rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
    1158       553582 :           user_align |= TYPE_USER_ALIGN (type);
    1159              :         }
    1160              :     }
    1161              :   else
    1162              :     {
    1163     61443786 :       rli->record_align = MAX (rli->record_align, desired_align);
    1164     61443786 :       rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
    1165              :     }
    1166              : 
    1167     62141400 :   TYPE_USER_ALIGN (rli->t) |= user_align;
    1168              : 
    1169     62141400 :   return desired_align;
    1170              : }
    1171              : 
    1172              : /* Issue a warning if the record alignment, RECORD_ALIGN, is less than
    1173              :    the field alignment of FIELD or FIELD isn't aligned. */
    1174              : 
    1175              : static void
    1176     62133282 : handle_warn_if_not_align (tree field, unsigned int record_align)
    1177              : {
    1178     62133282 :   tree type = TREE_TYPE (field);
    1179              : 
    1180     62133282 :   if (type == error_mark_node)
    1181     62133282 :     return;
    1182              : 
    1183     62133239 :   unsigned int warn_if_not_align = 0;
    1184              : 
    1185     62133239 :   int opt_w = 0;
    1186              : 
    1187     62133239 :   if (warn_if_not_aligned)
    1188              :     {
    1189     62133092 :       warn_if_not_align = DECL_WARN_IF_NOT_ALIGN (field);
    1190     62133092 :       if (!warn_if_not_align)
    1191     62133045 :         warn_if_not_align = TYPE_WARN_IF_NOT_ALIGN (type);
    1192           47 :       if (warn_if_not_align)
    1193              :         opt_w = OPT_Wif_not_aligned;
    1194              :     }
    1195              : 
    1196              :   if (!warn_if_not_align
    1197     62133192 :       && warn_packed_not_aligned
    1198      2683337 :       && lookup_attribute ("aligned", TYPE_ATTRIBUTES (type)))
    1199              :     {
    1200          115 :       warn_if_not_align = TYPE_ALIGN (type);
    1201          115 :       opt_w = OPT_Wpacked_not_aligned;
    1202              :     }
    1203              : 
    1204     62133239 :   if (!warn_if_not_align)
    1205     62133077 :     return;
    1206              : 
    1207          162 :   tree context = DECL_CONTEXT (field);
    1208              : 
    1209          162 :   warn_if_not_align /= BITS_PER_UNIT;
    1210          162 :   record_align /= BITS_PER_UNIT;
    1211          162 :   if ((record_align % warn_if_not_align) != 0)
    1212           36 :     warning (opt_w, "alignment %u of %qT is less than %u",
    1213              :              record_align, context, warn_if_not_align);
    1214              : 
    1215          162 :   tree off = byte_position (field);
    1216          162 :   if (!multiple_of_p (TREE_TYPE (off), off, size_int (warn_if_not_align)))
    1217              :     {
    1218           25 :       if (TREE_CODE (off) == INTEGER_CST)
    1219           24 :         warning (opt_w, "%q+D offset %E in %qT isn%'t aligned to %u",
    1220              :                  field, off, context, warn_if_not_align);
    1221              :       else
    1222            1 :         warning (opt_w, "%q+D offset %E in %qT may not be aligned to %u",
    1223              :                  field, off, context, warn_if_not_align);
    1224              :     }
    1225              : }
    1226              : 
    1227              : /* Called from place_field to handle unions.  */
    1228              : 
    1229              : static void
    1230      1932427 : place_union_field (record_layout_info rli, tree field)
    1231              : {
    1232      1932427 :   update_alignment_for_field (rli, field, /*known_align=*/0);
    1233              : 
    1234      1932427 :   DECL_FIELD_OFFSET (field) = size_zero_node;
    1235      1932427 :   DECL_FIELD_BIT_OFFSET (field) = bitsize_zero_node;
    1236      1932427 :   SET_DECL_OFFSET_ALIGN (field, BIGGEST_ALIGNMENT);
    1237      1932427 :   handle_warn_if_not_align (field, rli->record_align);
    1238              : 
    1239              :   /* If this is an ERROR_MARK return *after* having set the
    1240              :      field at the start of the union. This helps when parsing
    1241              :      invalid fields. */
    1242      1932427 :   if (TREE_CODE (TREE_TYPE (field)) == ERROR_MARK)
    1243              :     return;
    1244              : 
    1245      3276419 :   if (AGGREGATE_TYPE_P (TREE_TYPE (field))
    1246      2316531 :       && TYPE_TYPELESS_STORAGE (TREE_TYPE (field)))
    1247       448407 :     TYPE_TYPELESS_STORAGE (rli->t) = 1;
    1248              : 
    1249              :   /* We might see a flexible array member field (with no DECL_SIZE_UNIT), use
    1250              :      zero size for such field.  */
    1251      1932422 :   tree field_size_unit = DECL_SIZE_UNIT (field)
    1252      1932422 :                          ? DECL_SIZE_UNIT (field)
    1253      1932422 :                          : build_int_cst (sizetype, 0);
    1254              :   /* We assume the union's size will be a multiple of a byte so we don't
    1255              :      bother with BITPOS.  */
    1256      1932422 :   if (TREE_CODE (rli->t) == UNION_TYPE)
    1257      1932422 :     rli->offset = size_binop (MAX_EXPR, rli->offset, field_size_unit);
    1258            0 :   else if (TREE_CODE (rli->t) == QUAL_UNION_TYPE)
    1259            0 :     rli->offset = fold_build3 (COND_EXPR, sizetype, DECL_QUALIFIER (field),
    1260              :                                field_size_unit, rli->offset);
    1261              : }
    1262              : 
    1263              : /* A bitfield of SIZE with a required access alignment of ALIGN is allocated
    1264              :    at BYTE_OFFSET / BIT_OFFSET.  Return nonzero if the field would span more
    1265              :    units of alignment than the underlying TYPE.  */
    1266              : static int
    1267       539315 : excess_unit_span (HOST_WIDE_INT byte_offset, HOST_WIDE_INT bit_offset,
    1268              :                   HOST_WIDE_INT size, HOST_WIDE_INT align, tree type)
    1269              : {
    1270              :   /* Note that the calculation of OFFSET might overflow; we calculate it so
    1271              :      that we still get the right result as long as ALIGN is a power of two.  */
    1272       539315 :   unsigned HOST_WIDE_INT offset = byte_offset * BITS_PER_UNIT + bit_offset;
    1273              : 
    1274       539315 :   offset = offset % align;
    1275       539315 :   return ((offset + size + align - 1) / align
    1276       539315 :           > tree_to_uhwi (TYPE_SIZE (type)) / align);
    1277              : }
    1278              : 
    1279              : /* RLI contains information about the layout of a RECORD_TYPE.  FIELD
    1280              :    is a FIELD_DECL to be added after those fields already present in
    1281              :    T.  (FIELD is not actually added to the TYPE_FIELDS list here;
    1282              :    callers that desire that behavior must manually perform that step.)  */
    1283              : 
    1284              : void
    1285    384275240 : place_field (record_layout_info rli, tree field)
    1286              : {
    1287              :   /* The alignment required for FIELD.  */
    1288    384275240 :   unsigned int desired_align;
    1289              :   /* The alignment FIELD would have if we just dropped it into the
    1290              :      record as it presently stands.  */
    1291    384275240 :   unsigned int known_align;
    1292    384275240 :   unsigned int actual_align;
    1293              :   /* The type of this field.  */
    1294    384275240 :   tree type = TREE_TYPE (field);
    1295              : 
    1296    384275240 :   gcc_assert (TREE_CODE (field) != ERROR_MARK);
    1297              : 
    1298              :   /* If FIELD is static, then treat it like a separate variable, not
    1299              :      really like a structure field.  If it is a FUNCTION_DECL, it's a
    1300              :      method.  In both cases, all we do is lay out the decl, and we do
    1301              :      it *after* the record is laid out.  */
    1302    384275240 :   if (VAR_P (field))
    1303              :     {
    1304     13752676 :       vec_safe_push (rli->pending_statics, field);
    1305     13752676 :       return;
    1306              :     }
    1307              : 
    1308              :   /* Enumerators and enum types which are local to this class need not
    1309              :      be laid out.  Likewise for initialized constant fields.  */
    1310    370522564 :   else if (TREE_CODE (field) != FIELD_DECL)
    1311              :     return;
    1312              : 
    1313              :   /* Unions are laid out very differently than records, so split
    1314              :      that code off to another function.  */
    1315     62133282 :   else if (TREE_CODE (rli->t) != RECORD_TYPE)
    1316              :     {
    1317      1932427 :       place_union_field (rli, field);
    1318      1932427 :       return;
    1319              :     }
    1320              : 
    1321     60200855 :   else if (TREE_CODE (type) == ERROR_MARK)
    1322              :     {
    1323              :       /* Place this field at the current allocation position, so we
    1324              :          maintain monotonicity.  */
    1325           38 :       DECL_FIELD_OFFSET (field) = rli->offset;
    1326           38 :       DECL_FIELD_BIT_OFFSET (field) = rli->bitpos;
    1327           38 :       SET_DECL_OFFSET_ALIGN (field, rli->offset_align);
    1328           38 :       handle_warn_if_not_align (field, rli->record_align);
    1329           38 :       return;
    1330              :     }
    1331              : 
    1332     60200817 :   if (AGGREGATE_TYPE_P (type)
    1333     60200817 :       && TYPE_TYPELESS_STORAGE (type))
    1334      1178720 :     TYPE_TYPELESS_STORAGE (rli->t) = 1;
    1335              : 
    1336              :   /* Work out the known alignment so far.  Note that A & (-A) is the
    1337              :      value of the least-significant bit in A that is one.  */
    1338     60200817 :   if (! integer_zerop (rli->bitpos))
    1339     18114870 :     known_align = least_bit_hwi (tree_to_uhwi (rli->bitpos));
    1340     42085947 :   else if (integer_zerop (rli->offset))
    1341              :     known_align = 0;
    1342      8330627 :   else if (tree_fits_uhwi_p (rli->offset))
    1343      8329860 :     known_align = (BITS_PER_UNIT
    1344      8329860 :                    * least_bit_hwi (tree_to_uhwi (rli->offset)));
    1345              :   else
    1346          767 :     known_align = rli->offset_align;
    1347              : 
    1348     60200817 :   desired_align = update_alignment_for_field (rli, field, known_align);
    1349     60200817 :   if (known_align == 0)
    1350     67386422 :     known_align = MAX (BIGGEST_ALIGNMENT, rli->record_align);
    1351              : 
    1352     60200817 :   if (warn_packed && DECL_PACKED (field))
    1353              :     {
    1354            3 :       if (known_align >= TYPE_ALIGN (type))
    1355              :         {
    1356            3 :           if (TYPE_ALIGN (type) > desired_align)
    1357              :             {
    1358            3 :               if (STRICT_ALIGNMENT)
    1359              :                 warning (OPT_Wattributes, "packed attribute causes "
    1360              :                          "inefficient alignment for %q+D", field);
    1361              :               /* Don't warn if DECL_PACKED was set by the type.  */
    1362            3 :               else if (!TYPE_PACKED (rli->t))
    1363            0 :                 warning (OPT_Wattributes, "packed attribute is "
    1364              :                          "unnecessary for %q+D", field);
    1365              :             }
    1366              :         }
    1367              :       else
    1368            0 :         rli->packed_maybe_necessary = 1;
    1369              :     }
    1370              : 
    1371              :   /* Does this field automatically have alignment it needs by virtue
    1372              :      of the fields that precede it and the record's own alignment?  */
    1373     60200817 :   if (known_align < desired_align
    1374     60200817 :       && (! targetm.ms_bitfield_layout_p (rli->t)
    1375           17 :           || rli->prev_field == NULL))
    1376              :     {
    1377              :       /* No, we need to skip space before this field.
    1378              :          Bump the cumulative size to multiple of field alignment.  */
    1379              : 
    1380      1413415 :       if (!targetm.ms_bitfield_layout_p (rli->t)
    1381      1413412 :           && DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION
    1382      2811917 :           && !TYPE_ARTIFICIAL (rli->t))
    1383      1398471 :         warning (OPT_Wpadded, "padding struct to align %q+D", field);
    1384              : 
    1385              :       /* If the alignment is still within offset_align, just align
    1386              :          the bit position.  */
    1387      1413415 :       if (desired_align < rli->offset_align)
    1388      1378967 :         rli->bitpos = round_up (rli->bitpos, desired_align);
    1389              :       else
    1390              :         {
    1391              :           /* First adjust OFFSET by the partial bits, then align.  */
    1392        34448 :           rli->offset
    1393        34448 :             = size_binop (PLUS_EXPR, rli->offset,
    1394              :                           fold_convert (sizetype,
    1395              :                                         size_binop (CEIL_DIV_EXPR, rli->bitpos,
    1396              :                                                     bitsize_unit_node)));
    1397        34448 :           rli->bitpos = bitsize_zero_node;
    1398              : 
    1399        34448 :           rli->offset = round_up (rli->offset, desired_align / BITS_PER_UNIT);
    1400              :         }
    1401              : 
    1402      1413415 :       if (! TREE_CONSTANT (rli->offset))
    1403          416 :         rli->offset_align = desired_align;
    1404              :     }
    1405              : 
    1406              :   /* Handle compatibility with PCC.  Note that if the record has any
    1407              :      variable-sized fields, we need not worry about compatibility.  */
    1408     60200817 :   if (PCC_BITFIELD_TYPE_MATTERS
    1409     60200817 :       && ! targetm.ms_bitfield_layout_p (rli->t)
    1410     60200616 :       && TREE_CODE (field) == FIELD_DECL
    1411     60200616 :       && type != error_mark_node
    1412     60200616 :       && DECL_BIT_FIELD (field)
    1413       543436 :       && (! DECL_PACKED (field)
    1414              :           /* Enter for these packed fields only to issue a warning.  */
    1415         2725 :           || TYPE_ALIGN (type) <= BITS_PER_UNIT)
    1416       540910 :       && maximum_field_alignment == 0
    1417       540676 :       && ! integer_zerop (DECL_SIZE (field))
    1418       539329 :       && tree_fits_uhwi_p (DECL_SIZE (field))
    1419       539329 :       && tree_fits_uhwi_p (rli->offset)
    1420     60740132 :       && tree_fits_uhwi_p (TYPE_SIZE (type)))
    1421              :     {
    1422       539315 :       unsigned int type_align = TYPE_ALIGN (type);
    1423       539315 :       tree dsize = DECL_SIZE (field);
    1424       539315 :       HOST_WIDE_INT field_size = tree_to_uhwi (dsize);
    1425       539315 :       HOST_WIDE_INT offset = tree_to_uhwi (rli->offset);
    1426       539315 :       HOST_WIDE_INT bit_offset = tree_to_shwi (rli->bitpos);
    1427              : 
    1428              : #ifdef ADJUST_FIELD_ALIGN
    1429       539315 :       if (! TYPE_USER_ALIGN (type))
    1430       534326 :         type_align = ADJUST_FIELD_ALIGN (field, type, type_align);
    1431              : #endif
    1432              : 
    1433              :       /* A bit field may not span more units of alignment of its type
    1434              :          than its type itself.  Advance to next boundary if necessary.  */
    1435       539315 :       if (excess_unit_span (offset, bit_offset, field_size, type_align, type))
    1436              :         {
    1437        46037 :           if (DECL_PACKED (field))
    1438              :             {
    1439           22 :               if (warn_packed_bitfield_compat == 1)
    1440           14 :                 inform
    1441           14 :                   (input_location,
    1442              :                    "offset of packed bit-field %qD has changed in GCC 4.4",
    1443              :                    field);
    1444              :             }
    1445              :           else
    1446        46015 :             rli->bitpos = round_up (rli->bitpos, type_align);
    1447              :         }
    1448              : 
    1449       539315 :       if (! DECL_PACKED (field))
    1450       539122 :         TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (type);
    1451              : 
    1452       539315 :       SET_TYPE_WARN_IF_NOT_ALIGN (rli->t,
    1453              :                                   TYPE_WARN_IF_NOT_ALIGN (type));
    1454              :     }
    1455              : 
    1456              : #ifdef BITFIELD_NBYTES_LIMITED
    1457              :   if (BITFIELD_NBYTES_LIMITED
    1458              :       && ! targetm.ms_bitfield_layout_p (rli->t)
    1459              :       && TREE_CODE (field) == FIELD_DECL
    1460              :       && type != error_mark_node
    1461              :       && DECL_BIT_FIELD_TYPE (field)
    1462              :       && ! DECL_PACKED (field)
    1463              :       && ! integer_zerop (DECL_SIZE (field))
    1464              :       && tree_fits_uhwi_p (DECL_SIZE (field))
    1465              :       && tree_fits_uhwi_p (rli->offset)
    1466              :       && tree_fits_uhwi_p (TYPE_SIZE (type)))
    1467              :     {
    1468              :       unsigned int type_align = TYPE_ALIGN (type);
    1469              :       tree dsize = DECL_SIZE (field);
    1470              :       HOST_WIDE_INT field_size = tree_to_uhwi (dsize);
    1471              :       HOST_WIDE_INT offset = tree_to_uhwi (rli->offset);
    1472              :       HOST_WIDE_INT bit_offset = tree_to_shwi (rli->bitpos);
    1473              : 
    1474              : #ifdef ADJUST_FIELD_ALIGN
    1475              :       if (! TYPE_USER_ALIGN (type))
    1476              :         type_align = ADJUST_FIELD_ALIGN (field, type, type_align);
    1477              : #endif
    1478              : 
    1479              :       if (maximum_field_alignment != 0)
    1480              :         type_align = MIN (type_align, maximum_field_alignment);
    1481              :       /* ??? This test is opposite the test in the containing if
    1482              :          statement, so this code is unreachable currently.  */
    1483              :       else if (DECL_PACKED (field))
    1484              :         type_align = MIN (type_align, BITS_PER_UNIT);
    1485              : 
    1486              :       /* A bit field may not span the unit of alignment of its type.
    1487              :          Advance to next boundary if necessary.  */
    1488              :       if (excess_unit_span (offset, bit_offset, field_size, type_align, type))
    1489              :         rli->bitpos = round_up (rli->bitpos, type_align);
    1490              : 
    1491              :       TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (type);
    1492              :       SET_TYPE_WARN_IF_NOT_ALIGN (rli->t,
    1493              :                                   TYPE_WARN_IF_NOT_ALIGN (type));
    1494              :     }
    1495              : #endif
    1496              : 
    1497              :   /* See the docs for TARGET_MS_BITFIELD_LAYOUT_P for details.
    1498              :      A subtlety:
    1499              :         When a bit field is inserted into a packed record, the whole
    1500              :         size of the underlying type is used by one or more same-size
    1501              :         adjacent bitfields.  (That is, if its long:3, 32 bits is
    1502              :         used in the record, and any additional adjacent long bitfields are
    1503              :         packed into the same chunk of 32 bits. However, if the size
    1504              :         changes, a new field of that size is allocated.)  In an unpacked
    1505              :         record, this is the same as using alignment, but not equivalent
    1506              :         when packing.
    1507              : 
    1508              :      Note: for compatibility, we use the type size, not the type alignment
    1509              :      to determine alignment, since that matches the documentation */
    1510              : 
    1511     60200817 :   if (targetm.ms_bitfield_layout_p (rli->t))
    1512              :     {
    1513          201 :       tree prev_saved = rli->prev_field;
    1514          283 :       tree prev_type = prev_saved ? DECL_BIT_FIELD_TYPE (prev_saved) : NULL;
    1515              : 
    1516              :       /* This is a bitfield if it exists.  */
    1517          201 :       if (rli->prev_field)
    1518              :         {
    1519           82 :           bool realign_p = known_align < desired_align;
    1520              : 
    1521              :           /* If both are bitfields, nonzero, and the same size, this is
    1522              :              the middle of a run.  Zero declared size fields are special
    1523              :              and handled as "end of run". (Note: it's nonzero declared
    1524              :              size, but equal type sizes!) (Since we know that both
    1525              :              the current and previous fields are bitfields by the
    1526              :              time we check it, DECL_SIZE must be present for both.) */
    1527           82 :           if (DECL_BIT_FIELD_TYPE (field)
    1528           64 :               && !integer_zerop (DECL_SIZE (field))
    1529           56 :               && !integer_zerop (DECL_SIZE (rli->prev_field))
    1530           54 :               && tree_fits_shwi_p (DECL_SIZE (rli->prev_field))
    1531           54 :               && tree_fits_uhwi_p (TYPE_SIZE (type))
    1532          136 :               && simple_cst_equal (TYPE_SIZE (type), TYPE_SIZE (prev_type)))
    1533              :             {
    1534              :               /* We're in the middle of a run of equal type size fields; make
    1535              :                  sure we realign if we run out of bits.  (Not decl size,
    1536              :                  type size!) */
    1537           52 :               HOST_WIDE_INT bitsize = tree_to_uhwi (DECL_SIZE (field));
    1538              : 
    1539           52 :               if (rli->remaining_in_alignment < bitsize)
    1540              :                 {
    1541            1 :                   HOST_WIDE_INT typesize = tree_to_uhwi (TYPE_SIZE (type));
    1542              : 
    1543              :                   /* out of bits; bump up to next 'word'.  */
    1544            1 :                   rli->bitpos
    1545            1 :                     = size_binop (PLUS_EXPR, rli->bitpos,
    1546              :                                   bitsize_int (rli->remaining_in_alignment));
    1547            1 :                   rli->prev_field = field;
    1548            1 :                   if (typesize < bitsize)
    1549            0 :                     rli->remaining_in_alignment = 0;
    1550              :                   else
    1551            1 :                     rli->remaining_in_alignment = typesize - bitsize;
    1552              :                 }
    1553              :               else
    1554              :                 {
    1555           51 :                   rli->remaining_in_alignment -= bitsize;
    1556           51 :                   realign_p = false;
    1557              :                 }
    1558              :             }
    1559              :           else
    1560              :             {
    1561              :               /* End of a run: if leaving a run of bitfields of the same type
    1562              :                  size, we have to "use up" the rest of the bits of the type
    1563              :                  size.
    1564              : 
    1565              :                  Compute the new position as the sum of the size for the prior
    1566              :                  type and where we first started working on that type.
    1567              :                  Note: since the beginning of the field was aligned then
    1568              :                  of course the end will be too.  No round needed.  */
    1569              : 
    1570           30 :               if (!integer_zerop (DECL_SIZE (rli->prev_field)))
    1571              :                 {
    1572           20 :                   rli->bitpos
    1573           20 :                     = size_binop (PLUS_EXPR, rli->bitpos,
    1574              :                                   bitsize_int (rli->remaining_in_alignment));
    1575              :                 }
    1576              :               else
    1577              :                 /* We "use up" size zero fields; the code below should behave
    1578              :                    as if the prior field was not a bitfield.  */
    1579              :                 prev_saved = NULL;
    1580              : 
    1581              :               /* Cause a new bitfield to be captured, either this time (if
    1582              :                  currently a bitfield) or next time we see one.  */
    1583           30 :               if (!DECL_BIT_FIELD_TYPE (field)
    1584           30 :                   || integer_zerop (DECL_SIZE (field)))
    1585           26 :                 rli->prev_field = NULL;
    1586              :             }
    1587              : 
    1588              :           /* Does this field automatically have alignment it needs by virtue
    1589              :              of the fields that precede it and the record's own alignment?  */
    1590           82 :           if (realign_p)
    1591              :             {
    1592              :               /* If the alignment is still within offset_align, just align
    1593              :                  the bit position.  */
    1594           13 :               if (desired_align < rli->offset_align)
    1595           11 :                 rli->bitpos = round_up (rli->bitpos, desired_align);
    1596              :               else
    1597              :                 {
    1598              :                   /* First adjust OFFSET by the partial bits, then align.  */
    1599            2 :                   tree d = size_binop (CEIL_DIV_EXPR, rli->bitpos,
    1600              :                                        bitsize_unit_node);
    1601            2 :                   rli->offset = size_binop (PLUS_EXPR, rli->offset,
    1602              :                                             fold_convert (sizetype, d));
    1603            2 :                   rli->bitpos = bitsize_zero_node;
    1604              : 
    1605            2 :                   rli->offset = round_up (rli->offset,
    1606              :                                           desired_align / BITS_PER_UNIT);
    1607              :                 }
    1608              : 
    1609           13 :               if (! TREE_CONSTANT (rli->offset))
    1610            0 :                 rli->offset_align = desired_align;
    1611              :             }
    1612              : 
    1613           82 :           normalize_rli (rli);
    1614              :         }
    1615              : 
    1616              :       /* If we're starting a new run of same type size bitfields
    1617              :          (or a run of non-bitfields), set up the "first of the run"
    1618              :          fields.
    1619              : 
    1620              :          That is, if the current field is not a bitfield, or if there
    1621              :          was a prior bitfield the type sizes differ, or if there wasn't
    1622              :          a prior bitfield the size of the current field is nonzero.
    1623              : 
    1624              :          Note: we must be sure to test ONLY the type size if there was
    1625              :          a prior bitfield and ONLY for the current field being zero if
    1626              :          there wasn't.  */
    1627              : 
    1628          201 :       if (!DECL_BIT_FIELD_TYPE (field)
    1629          261 :           || (prev_saved != NULL
    1630          129 :               ? !simple_cst_equal (TYPE_SIZE (type), TYPE_SIZE (prev_type))
    1631           69 :               : !integer_zerop (DECL_SIZE (field))))
    1632              :         {
    1633              :           /* Never smaller than a byte for compatibility.  */
    1634          143 :           unsigned int type_align = BITS_PER_UNIT;
    1635              : 
    1636              :           /* (When not a bitfield), we could be seeing a flex array (with
    1637              :              no DECL_SIZE).  Since we won't be using remaining_in_alignment
    1638              :              until we see a bitfield (and come by here again) we just skip
    1639              :              calculating it.  */
    1640          143 :           if (DECL_SIZE (field) != NULL
    1641          143 :               && tree_fits_uhwi_p (TYPE_SIZE (TREE_TYPE (field)))
    1642          285 :               && tree_fits_uhwi_p (DECL_SIZE (field)))
    1643              :             {
    1644          142 :               unsigned HOST_WIDE_INT bitsize
    1645          142 :                 = tree_to_uhwi (DECL_SIZE (field));
    1646          142 :               unsigned HOST_WIDE_INT typesize
    1647          142 :                 = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (field)));
    1648              : 
    1649          142 :               if (typesize < bitsize)
    1650            0 :                 rli->remaining_in_alignment = 0;
    1651              :               else
    1652          142 :                 rli->remaining_in_alignment = typesize - bitsize;
    1653              :             }
    1654              : 
    1655              :           /* Now align (conventionally) for the new type.  */
    1656          143 :           if (! DECL_PACKED (field))
    1657          137 :             type_align = TYPE_ALIGN (TREE_TYPE (field));
    1658              : 
    1659          143 :           if (maximum_field_alignment != 0)
    1660           56 :             type_align = MIN (type_align, maximum_field_alignment);
    1661              : 
    1662          143 :           rli->bitpos = round_up (rli->bitpos, type_align);
    1663              : 
    1664              :           /* If we really aligned, don't allow subsequent bitfields
    1665              :              to undo that.  */
    1666          143 :           rli->prev_field = NULL;
    1667              :         }
    1668              :     }
    1669              : 
    1670              :   /* Offset so far becomes the position of this field after normalizing.  */
    1671     60200817 :   normalize_rli (rli);
    1672     60200817 :   DECL_FIELD_OFFSET (field) = rli->offset;
    1673     60200817 :   DECL_FIELD_BIT_OFFSET (field) = rli->bitpos;
    1674     60200817 :   SET_DECL_OFFSET_ALIGN (field, rli->offset_align);
    1675     60200817 :   handle_warn_if_not_align (field, rli->record_align);
    1676              : 
    1677              :   /* Evaluate nonconstant offsets only once, either now or as soon as safe.  */
    1678     60200817 :   if (TREE_CODE (DECL_FIELD_OFFSET (field)) != INTEGER_CST)
    1679         1171 :     DECL_FIELD_OFFSET (field) = variable_size (DECL_FIELD_OFFSET (field));
    1680              : 
    1681              :   /* If this field ended up more aligned than we thought it would be (we
    1682              :      approximate this by seeing if its position changed), lay out the field
    1683              :      again; perhaps we can use an integral mode for it now.  */
    1684     60200817 :   if (! integer_zerop (DECL_FIELD_BIT_OFFSET (field)))
    1685     17573708 :     actual_align = least_bit_hwi (tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field)));
    1686     42627109 :   else if (integer_zerop (DECL_FIELD_OFFSET (field)))
    1687     67386398 :     actual_align = MAX (BIGGEST_ALIGNMENT, rli->record_align);
    1688      8871789 :   else if (tree_fits_uhwi_p (DECL_FIELD_OFFSET (field)))
    1689      8870635 :     actual_align = (BITS_PER_UNIT
    1690      8870635 :                     * least_bit_hwi (tree_to_uhwi (DECL_FIELD_OFFSET (field))));
    1691              :   else
    1692         1154 :     actual_align = DECL_OFFSET_ALIGN (field);
    1693              :   /* ACTUAL_ALIGN is still the actual alignment *within the record* .
    1694              :      store / extract bit field operations will check the alignment of the
    1695              :      record against the mode of bit fields.  */
    1696              : 
    1697     60200817 :   if (known_align != actual_align)
    1698      1458736 :     layout_decl (field, actual_align);
    1699              : 
    1700     60200817 :   if (rli->prev_field == NULL && DECL_BIT_FIELD_TYPE (field))
    1701       162591 :     rli->prev_field = field;
    1702              : 
    1703              :   /* Now add size of this field to the size of the record.  If the size is
    1704              :      not constant, treat the field as being a multiple of bytes and just
    1705              :      adjust the offset, resetting the bit position.  Otherwise, apportion the
    1706              :      size amongst the bit position and offset.  First handle the case of an
    1707              :      unspecified size, which can happen when we have an invalid nested struct
    1708              :      definition, such as struct j { struct j { int i; } }.  The error message
    1709              :      is printed in finish_struct.  */
    1710     60200817 :   if (DECL_SIZE (field) == 0)
    1711              :     /* Do nothing.  */;
    1712     60110157 :   else if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST
    1713     60110157 :            || TREE_OVERFLOW (DECL_SIZE (field)))
    1714              :     {
    1715         1105 :       rli->offset
    1716         1105 :         = size_binop (PLUS_EXPR, rli->offset,
    1717              :                       fold_convert (sizetype,
    1718              :                                     size_binop (CEIL_DIV_EXPR, rli->bitpos,
    1719              :                                                 bitsize_unit_node)));
    1720         1105 :       rli->offset
    1721         1105 :         = size_binop (PLUS_EXPR, rli->offset, DECL_SIZE_UNIT (field));
    1722         1105 :       rli->bitpos = bitsize_zero_node;
    1723         1105 :       rli->offset_align = MIN (rli->offset_align, desired_align);
    1724              : 
    1725         1105 :       if (!multiple_of_p (bitsizetype, DECL_SIZE (field),
    1726         2210 :                           bitsize_int (rli->offset_align)))
    1727              :         {
    1728          304 :           tree type = strip_array_types (TREE_TYPE (field));
    1729              :           /* The above adjusts offset_align just based on the start of the
    1730              :              field.  The field might not have a size that is a multiple of
    1731              :              that offset_align though.  If the field is an array of fixed
    1732              :              sized elements, assume there can be any multiple of those
    1733              :              sizes.  If it is a variable length aggregate or array of
    1734              :              variable length aggregates, assume worst that the end is
    1735              :              just BITS_PER_UNIT aligned.  */
    1736          304 :           if (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
    1737              :             {
    1738          304 :               if (TREE_INT_CST_LOW (TYPE_SIZE (type)))
    1739              :                 {
    1740          304 :                   unsigned HOST_WIDE_INT sz
    1741          304 :                     = least_bit_hwi (TREE_INT_CST_LOW (TYPE_SIZE (type)));
    1742          304 :                   rli->offset_align = MIN (rli->offset_align, sz);
    1743              :                 }
    1744              :             }
    1745              :           else
    1746            0 :             rli->offset_align = MIN (rli->offset_align, BITS_PER_UNIT);
    1747              :         }
    1748              :     }
    1749     60109052 :   else if (targetm.ms_bitfield_layout_p (rli->t))
    1750              :     {
    1751          201 :       rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, DECL_SIZE (field));
    1752              : 
    1753              :       /* If FIELD is the last field and doesn't end at the full length
    1754              :          of the type then pad the struct out to the full length of the
    1755              :          last type.  */
    1756          201 :       if (DECL_BIT_FIELD_TYPE (field)
    1757          201 :           && !integer_zerop (DECL_SIZE (field)))
    1758              :         {
    1759              :           /* We have to scan, because non-field DECLS are also here.  */
    1760              :           tree probe = field;
    1761          182 :           while ((probe = DECL_CHAIN (probe)))
    1762          135 :             if (TREE_CODE (probe) == FIELD_DECL)
    1763              :               break;
    1764          119 :           if (!probe)
    1765           47 :             rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos,
    1766              :                                       bitsize_int (rli->remaining_in_alignment));
    1767              :         }
    1768              : 
    1769          201 :       normalize_rli (rli);
    1770              :     }
    1771              :   else
    1772              :     {
    1773     60108851 :       rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, DECL_SIZE (field));
    1774     60108851 :       normalize_rli (rli);
    1775              :     }
    1776              : }
    1777              : 
    1778              : /* Assuming that all the fields have been laid out, this function uses
    1779              :    RLI to compute the final TYPE_SIZE, TYPE_ALIGN, etc. for the type
    1780              :    indicated by RLI.  */
    1781              : 
    1782              : static void
    1783     55110816 : finalize_record_size (record_layout_info rli)
    1784              : {
    1785     55110816 :   tree unpadded_size, unpadded_size_unit;
    1786              : 
    1787              :   /* Now we want just byte and bit offsets, so set the offset alignment
    1788              :      to be a byte and then normalize.  */
    1789     55110816 :   rli->offset_align = BITS_PER_UNIT;
    1790     55110816 :   normalize_rli (rli);
    1791              : 
    1792              :   /* Determine the desired alignment.  */
    1793              : #ifdef ROUND_TYPE_ALIGN
    1794              :   SET_TYPE_ALIGN (rli->t, ROUND_TYPE_ALIGN (rli->t, TYPE_ALIGN (rli->t),
    1795              :                                             rli->record_align));
    1796              : #else
    1797     55110816 :   SET_TYPE_ALIGN (rli->t, MAX (TYPE_ALIGN (rli->t), rli->record_align));
    1798              : #endif
    1799              : 
    1800              :   /* Compute the size so far.  Be sure to allow for extra bits in the
    1801              :      size in bytes.  We have guaranteed above that it will be no more
    1802              :      than a single byte.  */
    1803     55110816 :   unpadded_size = rli_size_so_far (rli);
    1804     55110816 :   unpadded_size_unit = rli_size_unit_so_far (rli);
    1805     55110816 :   if (! integer_zerop (rli->bitpos))
    1806         2201 :     unpadded_size_unit
    1807         2201 :       = size_binop (PLUS_EXPR, unpadded_size_unit, size_one_node);
    1808              : 
    1809              :   /* Round the size up to be a multiple of the required alignment.  */
    1810     55110816 :   TYPE_SIZE (rli->t) = round_up (unpadded_size, TYPE_ALIGN (rli->t));
    1811     55110816 :   TYPE_SIZE_UNIT (rli->t)
    1812     55110816 :     = round_up (unpadded_size_unit, TYPE_ALIGN_UNIT (rli->t));
    1813              : 
    1814     55110816 :   if (TREE_CONSTANT (unpadded_size)
    1815     55110070 :       && simple_cst_equal (unpadded_size, TYPE_SIZE (rli->t)) == 0
    1816      1201548 :       && input_location != BUILTINS_LOCATION
    1817     56312243 :       && !TYPE_ARTIFICIAL (rli->t))
    1818              :   {
    1819      1193432 :         tree pad_size
    1820      1193432 :           = size_binop (MINUS_EXPR, TYPE_SIZE_UNIT (rli->t), unpadded_size_unit);
    1821      1193432 :           warning (OPT_Wpadded,
    1822              :                 "padding struct size to alignment boundary with %E bytes", pad_size);
    1823              :   }
    1824              : 
    1825           20 :   if (warn_packed && TREE_CODE (rli->t) == RECORD_TYPE
    1826           20 :       && TYPE_PACKED (rli->t) && ! rli->packed_maybe_necessary
    1827     55110818 :       && TREE_CONSTANT (unpadded_size))
    1828              :     {
    1829            2 :       tree unpacked_size;
    1830              : 
    1831              : #ifdef ROUND_TYPE_ALIGN
    1832              :       rli->unpacked_align
    1833              :         = ROUND_TYPE_ALIGN (rli->t, TYPE_ALIGN (rli->t), rli->unpacked_align);
    1834              : #else
    1835            2 :       rli->unpacked_align = MAX (TYPE_ALIGN (rli->t), rli->unpacked_align);
    1836              : #endif
    1837              : 
    1838            2 :       unpacked_size = round_up (TYPE_SIZE (rli->t), rli->unpacked_align);
    1839            2 :       if (simple_cst_equal (unpacked_size, TYPE_SIZE (rli->t)))
    1840              :         {
    1841            2 :           if (TYPE_NAME (rli->t))
    1842              :             {
    1843            2 :               tree name;
    1844              : 
    1845            2 :               if (TREE_CODE (TYPE_NAME (rli->t)) == IDENTIFIER_NODE)
    1846            2 :                 name = TYPE_NAME (rli->t);
    1847              :               else
    1848            0 :                 name = DECL_NAME (TYPE_NAME (rli->t));
    1849              : 
    1850            2 :               if (STRICT_ALIGNMENT)
    1851              :                 warning (OPT_Wpacked, "packed attribute causes inefficient "
    1852              :                          "alignment for %qE", name);
    1853              :               else
    1854            2 :                 warning (OPT_Wpacked,
    1855              :                          "packed attribute is unnecessary for %qE", name);
    1856              :             }
    1857              :           else
    1858              :             {
    1859            0 :               if (STRICT_ALIGNMENT)
    1860              :                 warning (OPT_Wpacked,
    1861              :                          "packed attribute causes inefficient alignment");
    1862              :               else
    1863            0 :                 warning (OPT_Wpacked, "packed attribute is unnecessary");
    1864              :             }
    1865              :         }
    1866              :     }
    1867     55110816 : }
    1868              : 
    1869              : /* Compute the TYPE_MODE for the TYPE (which is a RECORD_TYPE).  */
    1870              : 
    1871              : void
    1872    103187569 : compute_record_mode (tree type)
    1873              : {
    1874    103187569 :   tree field;
    1875    103187569 :   machine_mode mode = VOIDmode;
    1876              : 
    1877              :   /* Most RECORD_TYPEs have BLKmode, so we start off assuming that.
    1878              :      However, if possible, we use a mode that fits in a register
    1879              :      instead, in order to allow for better optimization down the
    1880              :      line.  */
    1881    103187569 :   SET_TYPE_MODE (type, BLKmode);
    1882              : 
    1883    103187569 :   poly_uint64 type_size;
    1884    103187569 :   if (!poly_int_tree_p (TYPE_SIZE (type), &type_size))
    1885      8664157 :     return;
    1886              : 
    1887              :   /* A record which has any BLKmode members must itself be
    1888              :      BLKmode; it can't go in a register.  Unless the member is
    1889              :      BLKmode only because it isn't aligned.  */
    1890    386166800 :   for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
    1891              :     {
    1892    291643388 :       if (TREE_CODE (field) != FIELD_DECL)
    1893    209781974 :         continue;
    1894              : 
    1895     81861414 :       poly_uint64 field_size;
    1896     81861414 :       if (TREE_CODE (TREE_TYPE (field)) == ERROR_MARK
    1897     81861094 :           || (TYPE_MODE (TREE_TYPE (field)) == BLKmode
    1898     48098266 :               && ! TYPE_NO_FORCE_BLK (TREE_TYPE (field))
    1899     96139620 :               && !(TYPE_SIZE (TREE_TYPE (field)) != 0
    1900     48041354 :                    && integer_zerop (TYPE_SIZE (TREE_TYPE (field)))))
    1901     73204993 :           || !tree_fits_poly_uint64_p (bit_position (field))
    1902     73204993 :           || DECL_SIZE (field) == 0
    1903    155066407 :           || !poly_int_tree_p (DECL_SIZE (field), &field_size))
    1904      8663373 :         return;
    1905              : 
    1906              :       /* If this field is the whole struct, remember its mode so
    1907              :          that, say, we can put a double in a class into a DF
    1908              :          register instead of forcing it to live in the stack.  */
    1909     73204993 :       if (known_eq (field_size, type_size)
    1910              :           /* Partial int types (e.g. __int20) may have TYPE_SIZE equal to
    1911              :              wider types (e.g. int32), despite precision being less.  Ensure
    1912              :              that the TYPE_MODE of the struct does not get set to the partial
    1913              :              int mode if there is a wider type also in the struct.  */
    1914     73204993 :           && known_gt (GET_MODE_PRECISION (DECL_MODE (field)),
    1915              :                        GET_MODE_PRECISION (mode)))
    1916      5195160 :         mode = DECL_MODE (field);
    1917              : 
    1918              :       /* With some targets, it is sub-optimal to access an aligned
    1919              :          BLKmode structure as a scalar.  */
    1920     73204993 :       if (targetm.member_type_forces_blk (field, mode))
    1921              :         return;
    1922              :     }
    1923              : 
    1924              :   /* If we only have one real field; use its mode if that mode's size
    1925              :      matches the type's size.  This generally only applies to RECORD_TYPE.
    1926              :      For UNION_TYPE, if the widest field is MODE_INT then use that mode.
    1927              :      If the widest field is MODE_PARTIAL_INT, and the union will be passed
    1928              :      by reference, then use that mode.  */
    1929     94523412 :   if ((TREE_CODE (type) == RECORD_TYPE
    1930       508688 :        || (TREE_CODE (type) == UNION_TYPE
    1931       508688 :            && (GET_MODE_CLASS (mode) == MODE_INT
    1932        67285 :                || (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT
    1933            0 :                    && (targetm.calls.pass_by_reference
    1934            0 :                        (pack_cumulative_args (0),
    1935      5074730 :                         function_arg_info (type, mode, /*named=*/false)))))))
    1936     94456127 :       && mode != VOIDmode
    1937     99598275 :       && known_eq (GET_MODE_BITSIZE (mode), type_size))
    1938              :     ;
    1939              :   else
    1940     89448682 :     mode = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1).else_blk ();
    1941              : 
    1942              :   /* If structure's known alignment is less than what the scalar
    1943              :      mode would need, and it matters, then stick with BLKmode.  */
    1944     94523412 :   if (mode != BLKmode
    1945              :       && STRICT_ALIGNMENT
    1946              :       && ! (TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT
    1947              :             || TYPE_ALIGN (type) >= GET_MODE_ALIGNMENT (mode)))
    1948              :     {
    1949              :       /* If this is the only reason this type is BLKmode, then
    1950              :          don't force containing types to be BLKmode.  */
    1951              :       TYPE_NO_FORCE_BLK (type) = 1;
    1952              :       mode = BLKmode;
    1953              :     }
    1954              : 
    1955     94523412 :   SET_TYPE_MODE (type, mode);
    1956              : }
    1957              : 
    1958              : /* Compute TYPE_SIZE and TYPE_ALIGN for TYPE, once it has been laid
    1959              :    out.  */
    1960              : 
    1961              : static void
    1962   1444410249 : finalize_type_size (tree type)
    1963              : {
    1964              :   /* Normally, use the alignment corresponding to the mode chosen.
    1965              :      However, where strict alignment is not required, avoid
    1966              :      over-aligning structures, since most compilers do not do this
    1967              :      alignment.  */
    1968   1444410249 :   bool tua_cleared_p = false;
    1969   1444410249 :   if (TYPE_MODE (type) != BLKmode
    1970   1372393137 :       && TYPE_MODE (type) != VOIDmode
    1971   2816512866 :       && (STRICT_ALIGNMENT || !AGGREGATE_TYPE_P (type)))
    1972              :     {
    1973   1304089678 :       unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type));
    1974              : 
    1975              :       /* Don't override a larger alignment requirement coming from a user
    1976              :          alignment of one of the fields.  */
    1977   1304089678 :       if (mode_align >= TYPE_ALIGN (type))
    1978              :         {
    1979   1304089678 :           SET_TYPE_ALIGN (type, mode_align);
    1980              :           /* Remember that we're about to reset this flag.  */
    1981   1304089678 :           tua_cleared_p = TYPE_USER_ALIGN (type);
    1982   1304089678 :           TYPE_USER_ALIGN (type) = false;
    1983              :         }
    1984              :     }
    1985              : 
    1986              :   /* Do machine-dependent extra alignment.  */
    1987              : #ifdef ROUND_TYPE_ALIGN
    1988              :   SET_TYPE_ALIGN (type,
    1989              :                   ROUND_TYPE_ALIGN (type, TYPE_ALIGN (type), BITS_PER_UNIT));
    1990              : #endif
    1991              : 
    1992              :   /* If we failed to find a simple way to calculate the unit size
    1993              :      of the type, find it by division.  */
    1994   1444410249 :   if (TYPE_SIZE_UNIT (type) == 0 && TYPE_SIZE (type) != 0)
    1995              :     /* TYPE_SIZE (type) is computed in bitsizetype.  After the division, the
    1996              :        result will fit in sizetype.  We will get more efficient code using
    1997              :        sizetype, so we force a conversion.  */
    1998            0 :     TYPE_SIZE_UNIT (type)
    1999            0 :       = fold_convert (sizetype,
    2000              :                       size_binop (FLOOR_DIV_EXPR, TYPE_SIZE (type),
    2001              :                                   bitsize_unit_node));
    2002              : 
    2003   1444410249 :   if (TYPE_SIZE (type) != 0)
    2004              :     {
    2005   1433039166 :       TYPE_SIZE (type) = round_up (TYPE_SIZE (type), TYPE_ALIGN (type));
    2006   1433039166 :       TYPE_SIZE_UNIT (type)
    2007   2866078332 :         = round_up (TYPE_SIZE_UNIT (type), TYPE_ALIGN_UNIT (type));
    2008              :     }
    2009              : 
    2010              :   /* Evaluate nonconstant sizes only once, either now or as soon as safe.  */
    2011   1444410249 :   if (TYPE_SIZE (type) != 0 && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
    2012       304989 :     TYPE_SIZE (type) = variable_size (TYPE_SIZE (type));
    2013   1444410249 :   if (TYPE_SIZE_UNIT (type) != 0
    2014   1444410249 :       && TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST)
    2015       304989 :     TYPE_SIZE_UNIT (type) = variable_size (TYPE_SIZE_UNIT (type));
    2016              : 
    2017              :   /* Handle empty records as per the x86-64 psABI.  */
    2018   1444410249 :   TYPE_EMPTY_P (type) = targetm.calls.empty_record_p (type);
    2019              : 
    2020              :   /* Also layout any other variants of the type.  */
    2021   1444410249 :   if (TYPE_NEXT_VARIANT (type)
    2022   1444410249 :       || type != TYPE_MAIN_VARIANT (type))
    2023              :     {
    2024     51808098 :       tree variant;
    2025              :       /* Record layout info of this variant.  */
    2026     51808098 :       tree size = TYPE_SIZE (type);
    2027     51808098 :       tree size_unit = TYPE_SIZE_UNIT (type);
    2028     51808098 :       unsigned int align = TYPE_ALIGN (type);
    2029     51808098 :       unsigned int precision = TYPE_PRECISION (type);
    2030     51808098 :       unsigned int user_align = TYPE_USER_ALIGN (type);
    2031     51808098 :       machine_mode mode = TYPE_MODE (type);
    2032     51808098 :       bool empty_p = TYPE_EMPTY_P (type);
    2033     51808098 :       bool typeless = AGGREGATE_TYPE_P (type) && TYPE_TYPELESS_STORAGE (type);
    2034              : 
    2035              :       /* Copy it into all variants.  */
    2036     51808098 :       for (variant = TYPE_MAIN_VARIANT (type);
    2037    172864073 :            variant != NULL_TREE;
    2038    121055975 :            variant = TYPE_NEXT_VARIANT (variant))
    2039              :         {
    2040    121055975 :           TYPE_SIZE (variant) = size;
    2041    121055975 :           TYPE_SIZE_UNIT (variant) = size_unit;
    2042    121055975 :           unsigned valign = align;
    2043    121055975 :           if (TYPE_USER_ALIGN (variant))
    2044              :             {
    2045       808043 :               valign = MAX (valign, TYPE_ALIGN (variant));
    2046              :               /* If we reset TYPE_USER_ALIGN on the main variant, we might
    2047              :                  need to reset it on the variants too.  TYPE_MODE will be set
    2048              :                  to MODE in this variant, so we can use that.  */
    2049       808043 :               if (tua_cleared_p && GET_MODE_ALIGNMENT (mode) >= valign)
    2050            0 :                 TYPE_USER_ALIGN (variant) = false;
    2051              :             }
    2052              :           else
    2053    120247932 :             TYPE_USER_ALIGN (variant) = user_align;
    2054    121055975 :           SET_TYPE_ALIGN (variant, valign);
    2055    121055975 :           TYPE_PRECISION (variant) = precision;
    2056    121055975 :           SET_TYPE_MODE (variant, mode);
    2057    121055975 :           TYPE_EMPTY_P (variant) = empty_p;
    2058    121055975 :           if (AGGREGATE_TYPE_P (variant))
    2059    121055955 :             TYPE_TYPELESS_STORAGE (variant) = typeless;
    2060              :         }
    2061              :     }
    2062   1444410249 : }
    2063              : 
    2064              : /* Return a new underlying object for a bitfield started with FIELD.  */
    2065              : 
    2066              : static tree
    2067       168121 : start_bitfield_representative (tree field)
    2068              : {
    2069       168121 :   tree repr = make_node (FIELD_DECL);
    2070       168121 :   DECL_FIELD_OFFSET (repr) = DECL_FIELD_OFFSET (field);
    2071              :   /* Force the representative to begin at a BITS_PER_UNIT aligned
    2072              :      boundary - C++ may use tail-padding of a base object to
    2073              :      continue packing bits so the bitfield region does not start
    2074              :      at bit zero (see g++.dg/abi/bitfield5.C for example).
    2075              :      Unallocated bits may happen for other reasons as well,
    2076              :      for example Ada which allows explicit bit-granular structure layout.  */
    2077       336242 :   DECL_FIELD_BIT_OFFSET (repr)
    2078       168121 :     = size_binop (BIT_AND_EXPR,
    2079              :                   DECL_FIELD_BIT_OFFSET (field),
    2080              :                   bitsize_int (~(BITS_PER_UNIT - 1)));
    2081       168121 :   SET_DECL_OFFSET_ALIGN (repr, DECL_OFFSET_ALIGN (field));
    2082       168121 :   DECL_SIZE (repr) = DECL_SIZE (field);
    2083       168121 :   DECL_SIZE_UNIT (repr) = DECL_SIZE_UNIT (field);
    2084       168121 :   DECL_PACKED (repr) = DECL_PACKED (field);
    2085       168121 :   DECL_CONTEXT (repr) = DECL_CONTEXT (field);
    2086              :   /* There are no indirect accesses to this field.  If we introduce
    2087              :      some then they have to use the record alias set.  This makes
    2088              :      sure to properly conflict with [indirect] accesses to addressable
    2089              :      fields of the bitfield group.  */
    2090       168121 :   DECL_NONADDRESSABLE_P (repr) = 1;
    2091       168121 :   return repr;
    2092              : }
    2093              : 
    2094              : /* Finish up a bitfield group that was started by creating the underlying
    2095              :    object REPR with the last field in the bitfield group FIELD.  */
    2096              : 
    2097              : static void
    2098       168121 : finish_bitfield_representative (tree repr, tree field)
    2099              : {
    2100       168121 :   unsigned HOST_WIDE_INT bitsize, maxbitsize;
    2101       168121 :   tree nextf, size;
    2102              : 
    2103       168121 :   size = size_diffop (DECL_FIELD_OFFSET (field),
    2104              :                       DECL_FIELD_OFFSET (repr));
    2105       336268 :   while (TREE_CODE (size) == COMPOUND_EXPR)
    2106           26 :     size = TREE_OPERAND (size, 1);
    2107       168121 :   gcc_assert (tree_fits_uhwi_p (size));
    2108       168121 :   bitsize = (tree_to_uhwi (size) * BITS_PER_UNIT
    2109       168121 :              + tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field))
    2110       168121 :              - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr))
    2111       168121 :              + tree_to_uhwi (DECL_SIZE (field)));
    2112              : 
    2113              :   /* Round up bitsize to multiples of BITS_PER_UNIT.  */
    2114       168121 :   bitsize = (bitsize + BITS_PER_UNIT - 1) & ~(BITS_PER_UNIT - 1);
    2115              : 
    2116              :   /* Now nothing tells us how to pad out bitsize ...  */
    2117       168121 :   if (TREE_CODE (DECL_CONTEXT (field)) == RECORD_TYPE)
    2118              :     {
    2119       164679 :       nextf = DECL_CHAIN (field);
    2120       602648 :       while (nextf && TREE_CODE (nextf) != FIELD_DECL)
    2121       437969 :         nextf = DECL_CHAIN (nextf);
    2122              :     }
    2123              :   else
    2124              :     nextf = NULL_TREE;
    2125       164679 :   if (nextf)
    2126              :     {
    2127        74901 :       tree maxsize;
    2128              :       /* If there was an error, the field may be not laid out
    2129              :          correctly.  Don't bother to do anything.  */
    2130        74901 :       if (TREE_TYPE (nextf) == error_mark_node)
    2131              :         {
    2132            1 :           TREE_TYPE (repr) = error_mark_node;
    2133            1 :           return;
    2134              :         }
    2135        74900 :       maxsize = size_diffop (DECL_FIELD_OFFSET (nextf),
    2136              :                              DECL_FIELD_OFFSET (repr));
    2137        74900 :       if (tree_fits_uhwi_p (maxsize))
    2138              :         {
    2139        74884 :           maxbitsize = (tree_to_uhwi (maxsize) * BITS_PER_UNIT
    2140        74884 :                         + tree_to_uhwi (DECL_FIELD_BIT_OFFSET (nextf))
    2141        74884 :                         - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr)));
    2142              :           /* If the group ends within a bitfield nextf does not need to be
    2143              :              aligned to BITS_PER_UNIT.  Thus round up.  */
    2144        74884 :           maxbitsize = (maxbitsize + BITS_PER_UNIT - 1) & ~(BITS_PER_UNIT - 1);
    2145              :         }
    2146              :       else
    2147              :         maxbitsize = bitsize;
    2148              :     }
    2149              :   else
    2150              :     {
    2151              :       /* Note that if the C++ FE sets up tail-padding to be re-used it
    2152              :          creates a as-base variant of the type with TYPE_SIZE adjusted
    2153              :          accordingly.  So it is safe to include tail-padding here.  */
    2154        93220 :       tree aggsize = lang_hooks.types.unit_size_without_reusable_padding
    2155        93220 :                                                         (DECL_CONTEXT (field));
    2156        93220 :       tree maxsize = size_diffop (aggsize, DECL_FIELD_OFFSET (repr));
    2157              :       /* We cannot generally rely on maxsize to fold to an integer constant,
    2158              :          so use bitsize as fallback for this case.  */
    2159        93220 :       if (tree_fits_uhwi_p (maxsize))
    2160        93210 :         maxbitsize = (tree_to_uhwi (maxsize) * BITS_PER_UNIT
    2161        93210 :                       - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr)));
    2162              :       else
    2163              :         maxbitsize = bitsize;
    2164              :     }
    2165              : 
    2166              :   /* Only if we don't artificially break up the representative in
    2167              :      the middle of a large bitfield with different possibly
    2168              :      overlapping representatives.  And all representatives start
    2169              :      at byte offset.  */
    2170       168120 :   gcc_assert (maxbitsize % BITS_PER_UNIT == 0);
    2171              : 
    2172              :   /* Find the smallest nice mode to use.  */
    2173       168120 :   opt_scalar_int_mode mode_iter;
    2174       477107 :   FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
    2175       953898 :     if (GET_MODE_BITSIZE (mode_iter.require ()) >= bitsize)
    2176              :       break;
    2177              : 
    2178       168120 :   scalar_int_mode mode;
    2179       168120 :   if (!mode_iter.exists (&mode)
    2180       167962 :       || GET_MODE_BITSIZE (mode) > maxbitsize
    2181       253460 :       || GET_MODE_BITSIZE (mode) > MAX_FIXED_MODE_SIZE)
    2182              :     {
    2183        42213 :       if (BITINT_TYPE_P (TREE_TYPE (field)))
    2184              :         {
    2185           78 :           struct bitint_info info;
    2186           78 :           unsigned prec = TYPE_PRECISION (TREE_TYPE (field));
    2187           78 :           bool ok = targetm.c.bitint_type_info (prec, &info);
    2188           78 :           gcc_assert (ok);
    2189           78 :           scalar_int_mode limb_mode
    2190           78 :             = as_a <scalar_int_mode> (info.abi_limb_mode);
    2191           78 :           unsigned lprec = GET_MODE_PRECISION (limb_mode);
    2192           78 :           if (prec > lprec)
    2193              :             {
    2194              :               /* For middle/large/huge _BitInt prefer bitsize being a multiple
    2195              :                  of limb precision.  */
    2196           76 :               unsigned HOST_WIDE_INT bsz = CEIL (bitsize, lprec) * lprec;
    2197           76 :               if (bsz <= maxbitsize)
    2198           78 :                 bitsize = bsz;
    2199              :             }
    2200              :         }
    2201              :       /* We really want a BLKmode representative only as a last resort,
    2202              :          considering the member b in
    2203              :            struct { int a : 7; int b : 17; int c; } __attribute__((packed));
    2204              :          Otherwise we simply want to split the representative up
    2205              :          allowing for overlaps within the bitfield region as required for
    2206              :            struct { int a : 7; int b : 7;
    2207              :                     int c : 10; int d; } __attribute__((packed));
    2208              :          [0, 15] HImode for a and b, [8, 23] HImode for c.  */
    2209        42213 :       DECL_SIZE (repr) = bitsize_int (bitsize);
    2210        42213 :       DECL_SIZE_UNIT (repr) = size_int (bitsize / BITS_PER_UNIT);
    2211        42213 :       SET_DECL_MODE (repr, BLKmode);
    2212        42213 :       TREE_TYPE (repr) = build_array_type_nelts (unsigned_char_type_node,
    2213        42213 :                                                  bitsize / BITS_PER_UNIT);
    2214              :     }
    2215              :   else
    2216              :     {
    2217       125907 :       unsigned HOST_WIDE_INT modesize = GET_MODE_BITSIZE (mode);
    2218       125907 :       DECL_SIZE (repr) = bitsize_int (modesize);
    2219       125907 :       DECL_SIZE_UNIT (repr) = size_int (modesize / BITS_PER_UNIT);
    2220       125907 :       SET_DECL_MODE (repr, mode);
    2221       125907 :       TREE_TYPE (repr) = lang_hooks.types.type_for_mode (mode, 1);
    2222              :     }
    2223              : 
    2224              :   /* Remember whether the bitfield group is at the end of the
    2225              :      structure or not.  */
    2226       168120 :   DECL_CHAIN (repr) = nextf;
    2227              : }
    2228              : 
    2229              : /* Compute and set FIELD_DECLs for the underlying objects we should
    2230              :    use for bitfield access for the structure T.  */
    2231              : 
    2232              : void
    2233     55110816 : finish_bitfield_layout (tree t)
    2234              : {
    2235     55110816 :   tree field, prev;
    2236     55110816 :   tree repr = NULL_TREE;
    2237              : 
    2238     55110816 :   if (TREE_CODE (t) == QUAL_UNION_TYPE)
    2239              :     return;
    2240              : 
    2241     55110816 :   for (prev = NULL_TREE, field = TYPE_FIELDS (t);
    2242    439766418 :        field; field = DECL_CHAIN (field))
    2243              :     {
    2244    384655602 :       if (TREE_CODE (field) != FIELD_DECL)
    2245    322141958 :         continue;
    2246              : 
    2247              :       /* In the C++ memory model, consecutive bit fields in a structure are
    2248              :          considered one memory location and updating a memory location
    2249              :          may not store into adjacent memory locations.  */
    2250     62513644 :       if (!repr
    2251     62513644 :           && DECL_BIT_FIELD_TYPE (field))
    2252              :         {
    2253              :           /* Start new representative.  */
    2254       168120 :           repr = start_bitfield_representative (field);
    2255              :         }
    2256     62345524 :       else if (repr
    2257     62345524 :                && ! DECL_BIT_FIELD_TYPE (field))
    2258              :         {
    2259              :           /* Finish off new representative.  */
    2260        74262 :           finish_bitfield_representative (repr, prev);
    2261        74262 :           repr = NULL_TREE;
    2262              :         }
    2263     62271262 :       else if (DECL_BIT_FIELD_TYPE (field))
    2264              :         {
    2265       528651 :           gcc_assert (repr != NULL_TREE);
    2266              : 
    2267              :           /* Zero-size bitfields finish off a representative and
    2268              :              do not have a representative themselves.  This is
    2269              :              required by the C++ memory model.  */
    2270       528651 :           if (integer_zerop (DECL_SIZE (field)))
    2271              :             {
    2272          638 :               finish_bitfield_representative (repr, prev);
    2273          638 :               repr = NULL_TREE;
    2274              :             }
    2275              : 
    2276              :           /* We assume that either DECL_FIELD_OFFSET of the representative
    2277              :              and each bitfield member is a constant or they are equal.
    2278              :              This is because we need to be able to compute the bit-offset
    2279              :              of each field relative to the representative in get_bit_range
    2280              :              during RTL expansion.
    2281              :              If these constraints are not met, simply force a new
    2282              :              representative to be generated.  That will at most
    2283              :              generate worse code but still maintain correctness with
    2284              :              respect to the C++ memory model.  */
    2285       528024 :           else if (!((tree_fits_uhwi_p (DECL_FIELD_OFFSET (repr))
    2286       528002 :                       && tree_fits_uhwi_p (DECL_FIELD_OFFSET (field)))
    2287           11 :                      || operand_equal_p (DECL_FIELD_OFFSET (repr),
    2288           11 :                                          DECL_FIELD_OFFSET (field), 0)))
    2289              :             {
    2290            1 :               finish_bitfield_representative (repr, prev);
    2291            1 :               repr = start_bitfield_representative (field);
    2292              :             }
    2293              :         }
    2294              :       else
    2295     61742611 :         continue;
    2296              : 
    2297       243021 :       if (repr)
    2298       696133 :         DECL_BIT_FIELD_REPRESENTATIVE (field) = repr;
    2299              : 
    2300       771033 :       if (TREE_CODE (t) == RECORD_TYPE)
    2301              :         prev = field;
    2302         3442 :       else if (repr)
    2303              :         {
    2304         3442 :           finish_bitfield_representative (repr, field);
    2305         3442 :           repr = NULL_TREE;
    2306              :         }
    2307              :     }
    2308              : 
    2309     55110816 :   if (repr)
    2310        89778 :     finish_bitfield_representative (repr, prev);
    2311              : }
    2312              : 
    2313              : /* Do all of the work required to layout the type indicated by RLI,
    2314              :    once the fields have been laid out.  This function will call `free'
    2315              :    for RLI, unless FREE_P is false.  Passing a value other than false
    2316              :    for FREE_P is bad practice; this option only exists to support the
    2317              :    G++ 3.2 ABI.  */
    2318              : 
    2319              : void
    2320     55110816 : finish_record_layout (record_layout_info rli, int free_p)
    2321              : {
    2322     55110816 :   tree variant;
    2323              : 
    2324              :   /* Compute the final size.  */
    2325     55110816 :   finalize_record_size (rli);
    2326              : 
    2327              :   /* Compute the TYPE_MODE for the record.  */
    2328     55110816 :   compute_record_mode (rli->t);
    2329              : 
    2330              :   /* Perform any last tweaks to the TYPE_SIZE, etc.  */
    2331     55110816 :   finalize_type_size (rli->t);
    2332              : 
    2333              :   /* Compute bitfield representatives.  */
    2334     55110816 :   finish_bitfield_layout (rli->t);
    2335              : 
    2336              :   /* Propagate TYPE_PACKED and TYPE_REVERSE_STORAGE_ORDER to variants.
    2337              :      With C++ templates, it is too early to do this when the attribute
    2338              :      is being parsed.  */
    2339    122039260 :   for (variant = TYPE_NEXT_VARIANT (rli->t); variant;
    2340     66928444 :        variant = TYPE_NEXT_VARIANT (variant))
    2341              :     {
    2342     66928444 :       TYPE_PACKED (variant) = TYPE_PACKED (rli->t);
    2343    133856888 :       TYPE_REVERSE_STORAGE_ORDER (variant)
    2344     66928444 :         = TYPE_REVERSE_STORAGE_ORDER (rli->t);
    2345              :     }
    2346              : 
    2347              :   /* Lay out any static members.  This is done now because their type
    2348              :      may use the record's type.  */
    2349     68863492 :   while (!vec_safe_is_empty (rli->pending_statics))
    2350     13752676 :     layout_decl (rli->pending_statics->pop (), 0);
    2351              : 
    2352              :   /* Clean up.  */
    2353     55110816 :   if (free_p)
    2354              :     {
    2355     55110816 :       vec_free (rli->pending_statics);
    2356     55110816 :       free (rli);
    2357              :     }
    2358     55110816 : }
    2359              : 
    2360              : 
    2361              : /* Finish processing a builtin RECORD_TYPE type TYPE.  It's name is
    2362              :    NAME, its fields are chained in reverse on FIELDS.
    2363              : 
    2364              :    If ALIGN_TYPE is non-null, it is given the same alignment as
    2365              :    ALIGN_TYPE.  */
    2366              : 
    2367              : void
    2368      1172052 : finish_builtin_struct (tree type, const char *name, tree fields,
    2369              :                        tree align_type)
    2370              : {
    2371      1172052 :   tree tail, next;
    2372              : 
    2373      3663376 :   for (tail = NULL_TREE; fields; tail = fields, fields = next)
    2374              :     {
    2375      2491324 :       DECL_FIELD_CONTEXT (fields) = type;
    2376      2491324 :       next = DECL_CHAIN (fields);
    2377      2491324 :       DECL_CHAIN (fields) = tail;
    2378              :     }
    2379      1172052 :   TYPE_FIELDS (type) = tail;
    2380              : 
    2381      1172052 :   if (align_type)
    2382              :     {
    2383      1034924 :       SET_TYPE_ALIGN (type, TYPE_ALIGN (align_type));
    2384      1034924 :       TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (align_type);
    2385      1034924 :       SET_TYPE_WARN_IF_NOT_ALIGN (type,
    2386              :                                   TYPE_WARN_IF_NOT_ALIGN (align_type));
    2387              :     }
    2388              : 
    2389      1172052 :   layout_type (type);
    2390              : #if 0 /* not yet, should get fixed properly later */
    2391              :   TYPE_NAME (type) = make_type_decl (get_identifier (name), type);
    2392              : #else
    2393      1172052 :   TYPE_NAME (type) = build_decl (BUILTINS_LOCATION,
    2394              :                                  TYPE_DECL, get_identifier (name), type);
    2395              : #endif
    2396      1172052 :   TYPE_STUB_DECL (type) = TYPE_NAME (type);
    2397      1172052 :   layout_decl (TYPE_NAME (type), 0);
    2398      1172052 : }
    2399              : 
    2400              : /* Compute TYPE_MODE for TYPE (which is ARRAY_TYPE).  */
    2401              : 
    2402     80448568 : void compute_array_mode (tree type)
    2403              : {
    2404     80448568 :   gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
    2405              : 
    2406     80448568 :   SET_TYPE_MODE (type, BLKmode);
    2407     80448568 :   if (TYPE_SIZE (type) != 0
    2408     69365948 :       && ! targetm.member_type_forces_blk (type, VOIDmode)
    2409              :       /* BLKmode elements force BLKmode aggregate;
    2410              :          else extract/store fields may lose.  */
    2411    149814516 :       && (TYPE_MODE (TREE_TYPE (type)) != BLKmode
    2412       589923 :           || TYPE_NO_FORCE_BLK (TREE_TYPE (type))))
    2413              :     {
    2414     68776025 :       SET_TYPE_MODE (type, mode_for_array (TREE_TYPE (type),
    2415              :                                            TYPE_SIZE (type)));
    2416     68776025 :       if (TYPE_MODE (type) != BLKmode
    2417              :           && STRICT_ALIGNMENT && TYPE_ALIGN (type) < BIGGEST_ALIGNMENT
    2418              :           && TYPE_ALIGN (type) < GET_MODE_ALIGNMENT (TYPE_MODE (type)))
    2419              :         {
    2420              :           TYPE_NO_FORCE_BLK (type) = 1;
    2421              :           SET_TYPE_MODE (type, BLKmode);
    2422              :         }
    2423              :     }
    2424     80448568 : }
    2425              : 
    2426              : /* Calculate the mode, size, and alignment for TYPE.
    2427              :    For an array type, calculate the element separation as well.
    2428              :    Record TYPE on the chain of permanent or temporary types
    2429              :    so that dbxout will find out about it.
    2430              : 
    2431              :    TYPE_SIZE of a type is nonzero if the type has been laid out already.
    2432              :    layout_type does nothing on such a type.
    2433              : 
    2434              :    If the type is incomplete, its TYPE_SIZE remains zero.  */
    2435              : 
    2436              : void
    2437   2429892054 : layout_type (tree type)
    2438              : {
    2439   2429892054 :   gcc_assert (type);
    2440              : 
    2441   2429892054 :   if (type == error_mark_node)
    2442              :     return;
    2443              : 
    2444              :   /* We don't want finalize_type_size to copy an alignment attribute to
    2445              :      variants that don't have it.  */
    2446   2429892054 :   type = TYPE_MAIN_VARIANT (type);
    2447              : 
    2448              :   /* Do nothing if type has been laid out before.  */
    2449   2429892054 :   if (TYPE_SIZE (type))
    2450              :     return;
    2451              : 
    2452   1394503064 :   switch (TREE_CODE (type))
    2453              :     {
    2454            0 :     case LANG_TYPE:
    2455              :       /* This kind of type is the responsibility
    2456              :          of the language-specific code.  */
    2457            0 :       gcc_unreachable ();
    2458              : 
    2459     14358570 :     case BOOLEAN_TYPE:
    2460     14358570 :     case INTEGER_TYPE:
    2461     14358570 :     case ENUMERAL_TYPE:
    2462     14358570 :       if (TREE_CODE (type) != ENUMERAL_TYPE
    2463       217320 :           || TREE_TYPE (type) == NULL_TREE
    2464     14575890 :           || TREE_CODE (TREE_TYPE (type)) != BITINT_TYPE)
    2465              :         {
    2466     14358552 :           scalar_int_mode mode
    2467     14358552 :             = smallest_int_mode_for_size (TYPE_PRECISION (type)).require ();
    2468     14358552 :           SET_TYPE_MODE (type, mode);
    2469     28717104 :           TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode));
    2470              :           /* Don't set TYPE_PRECISION here, as it may be set by a bitfield.  */
    2471     28717104 :           TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode));
    2472     14358552 :           break;
    2473              :         }
    2474              :       /* FALLTHRU */
    2475              : 
    2476        60396 :     case BITINT_TYPE:
    2477        60396 :       {
    2478        60396 :         struct bitint_info info;
    2479        60396 :         int cnt;
    2480        60396 :         bool ok = targetm.c.bitint_type_info (TYPE_PRECISION (type), &info);
    2481        60396 :         gcc_assert (ok);
    2482        60396 :         scalar_int_mode limb_mode
    2483        60396 :           = as_a <scalar_int_mode> (info.abi_limb_mode);
    2484        60396 :         if (TYPE_PRECISION (type) <= GET_MODE_PRECISION (limb_mode))
    2485              :           {
    2486         1726 :             SET_TYPE_MODE (type, limb_mode);
    2487         1726 :             gcc_assert (info.abi_limb_mode == info.limb_mode);
    2488              :             cnt = 1;
    2489              :           }
    2490              :         else
    2491              :           {
    2492        58670 :             SET_TYPE_MODE (type, BLKmode);
    2493        58670 :             cnt = CEIL (TYPE_PRECISION (type), GET_MODE_PRECISION (limb_mode));
    2494        58670 :             gcc_assert (info.abi_limb_mode == info.limb_mode
    2495              :                         || !info.big_endian == !WORDS_BIG_ENDIAN);
    2496              :           }
    2497       120792 :         TYPE_SIZE (type) = bitsize_int (cnt * GET_MODE_BITSIZE (limb_mode));
    2498       120792 :         TYPE_SIZE_UNIT (type) = size_int (cnt * GET_MODE_SIZE (limb_mode));
    2499        60396 :         SET_TYPE_ALIGN (type, GET_MODE_ALIGNMENT (limb_mode));
    2500        60396 :         if (cnt > 1)
    2501              :           {
    2502              :             /* Use same mode as compute_record_mode would use for a structure
    2503              :                containing cnt limb_mode elements.  */
    2504        58670 :             machine_mode mode = mode_for_size_tree (TYPE_SIZE (type),
    2505        58670 :                                                     MODE_INT, 1).else_blk ();
    2506        58670 :             if (mode == BLKmode)
    2507              :               break;
    2508        12447 :             finalize_type_size (type);
    2509        12447 :             SET_TYPE_MODE (type, mode);
    2510        12447 :             if (STRICT_ALIGNMENT
    2511              :                 && !(TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT
    2512              :                      || TYPE_ALIGN (type) >= GET_MODE_ALIGNMENT (mode)))
    2513              :               {
    2514              :                 /* If this is the only reason this type is BLKmode, then
    2515              :                    don't force containing types to be BLKmode.  */
    2516              :                 TYPE_NO_FORCE_BLK (type) = 1;
    2517              :                 SET_TYPE_MODE (type, BLKmode);
    2518              :               }
    2519        12447 :             if (TYPE_NEXT_VARIANT (type) || type != TYPE_MAIN_VARIANT (type))
    2520            0 :               for (tree variant = TYPE_MAIN_VARIANT (type);
    2521            0 :                    variant != NULL_TREE;
    2522            0 :                    variant = TYPE_NEXT_VARIANT (variant))
    2523              :                 {
    2524            0 :                   SET_TYPE_MODE (variant, mode);
    2525            0 :                   if (STRICT_ALIGNMENT
    2526              :                       && !(TYPE_ALIGN (variant) >= BIGGEST_ALIGNMENT
    2527              :                            || (TYPE_ALIGN (variant)
    2528              :                                >= GET_MODE_ALIGNMENT (mode))))
    2529              :                     {
    2530              :                       TYPE_NO_FORCE_BLK (variant) = 1;
    2531              :                       SET_TYPE_MODE (variant, BLKmode);
    2532              :                     }
    2533              :                 }
    2534        12447 :             return;
    2535              :           }
    2536              :         break;
    2537              :       }
    2538              : 
    2539      4215557 :     case REAL_TYPE:
    2540      4215557 :       {
    2541              :         /* Allow the caller to choose the type mode, which is how decimal
    2542              :            floats are distinguished from binary ones.  */
    2543      4215557 :         if (TYPE_MODE (type) == VOIDmode)
    2544      2097863 :           SET_TYPE_MODE
    2545              :             (type, float_mode_for_size (TYPE_PRECISION (type)).require ());
    2546      4215557 :         scalar_float_mode mode = as_a <scalar_float_mode> (TYPE_MODE (type));
    2547      8431114 :         TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode));
    2548      8431114 :         TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode));
    2549      4215557 :         break;
    2550              :       }
    2551              : 
    2552     10384668 :    case FIXED_POINT_TYPE:
    2553     10384668 :      {
    2554              :        /* TYPE_MODE (type) has been set already.  */
    2555     10384668 :        scalar_mode mode = SCALAR_TYPE_MODE (type);
    2556     20769336 :        TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode));
    2557     20769336 :        TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode));
    2558     10384668 :        break;
    2559              :      }
    2560              : 
    2561      5347778 :     case COMPLEX_TYPE:
    2562      5347778 :       TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TREE_TYPE (type));
    2563      5347778 :       if (TYPE_MODE (TREE_TYPE (type)) == BLKmode)
    2564              :         {
    2565         4693 :           gcc_checking_assert (BITINT_TYPE_P (TREE_TYPE (type)));
    2566         4693 :           SET_TYPE_MODE (type, BLKmode);
    2567         4693 :           TYPE_SIZE (type)
    2568         4693 :             = int_const_binop (MULT_EXPR, TYPE_SIZE (TREE_TYPE (type)),
    2569         4693 :                                bitsize_int (2));
    2570         4693 :           TYPE_SIZE_UNIT (type)
    2571         4693 :             = int_const_binop (MULT_EXPR, TYPE_SIZE_UNIT (TREE_TYPE (type)),
    2572         4693 :                                bitsize_int (2));
    2573         4693 :           break;
    2574              :         }
    2575      5343085 :       SET_TYPE_MODE (type,
    2576              :                      GET_MODE_COMPLEX_MODE (TYPE_MODE (TREE_TYPE (type))));
    2577              : 
    2578     10686170 :       TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
    2579     10686170 :       TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type)));
    2580      5343085 :       break;
    2581              : 
    2582     71974238 :     case VECTOR_TYPE:
    2583     71974238 :       {
    2584     71974238 :         poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (type);
    2585     71974238 :         tree innertype = TREE_TYPE (type);
    2586              : 
    2587              :         /* Find an appropriate mode for the vector type.  */
    2588     71974238 :         if (TYPE_MODE (type) == VOIDmode)
    2589     35666727 :           SET_TYPE_MODE (type,
    2590              :                          mode_for_vector (SCALAR_TYPE_MODE (innertype),
    2591              :                                           nunits).else_blk ());
    2592              : 
    2593     71974238 :         TYPE_SATURATING (type) = TYPE_SATURATING (TREE_TYPE (type));
    2594     71974238 :         TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TREE_TYPE (type));
    2595              :         /* Several boolean vector elements may fit in a single unit.  */
    2596     71974238 :         if (VECTOR_BOOLEAN_TYPE_P (type)
    2597     74538628 :             && type->type_common.mode != BLKmode)
    2598              :           {
    2599      2564387 :             TYPE_SIZE_UNIT (type)
    2600      5128774 :               = size_int (GET_MODE_SIZE (type->type_common.mode));
    2601      2564387 :             TYPE_SIZE (type)
    2602      7693161 :               = bitsize_int (GET_MODE_BITSIZE (type->type_common.mode));
    2603              :           }
    2604              :         else
    2605              :           {
    2606     69409851 :             TYPE_SIZE_UNIT (type)
    2607    138819702 :               = size_int (GET_MODE_SIZE (SCALAR_TYPE_MODE (innertype))
    2608              :                           * nunits);
    2609     69409851 :             TYPE_SIZE (type)
    2610    208229553 :               = bitsize_int (GET_MODE_BITSIZE (SCALAR_TYPE_MODE (innertype))
    2611              :                              * nunits);
    2612              :           }
    2613              : 
    2614              :         /* For vector types, we do not default to the mode's alignment.
    2615              :            Instead, query a target hook, defaulting to natural alignment.
    2616              :            This prevents ABI changes depending on whether or not native
    2617              :            vector modes are supported.  */
    2618     71974238 :         SET_TYPE_ALIGN (type, targetm.vector_alignment (type));
    2619              : 
    2620              :         /* However, if the underlying mode requires a bigger alignment than
    2621              :            what the target hook provides, we cannot use the mode.  For now,
    2622              :            simply reject that case.  */
    2623     71974238 :         gcc_assert (TYPE_ALIGN (type)
    2624              :                     >= GET_MODE_ALIGNMENT (TYPE_MODE (type)));
    2625              :         break;
    2626              :       }
    2627              : 
    2628       288463 :     case VOID_TYPE:
    2629              :       /* This is an incomplete type and so doesn't have a size.  */
    2630       288463 :       SET_TYPE_ALIGN (type, 1);
    2631       288463 :       TYPE_USER_ALIGN (type) = 0;
    2632       288463 :       SET_TYPE_MODE (type, VOIDmode);
    2633       288463 :       break;
    2634              : 
    2635       951691 :     case OFFSET_TYPE:
    2636       955908 :       TYPE_SIZE (type) = bitsize_int (POINTER_SIZE);
    2637       955908 :       TYPE_SIZE_UNIT (type) = size_int (POINTER_SIZE_UNITS);
    2638              :       /* A pointer might be MODE_PARTIAL_INT, but ptrdiff_t must be
    2639              :          integral, which may be an __intN.  */
    2640       955908 :       SET_TYPE_MODE (type, int_mode_for_size (POINTER_SIZE, 0).require ());
    2641       955908 :       TYPE_PRECISION (type) = POINTER_SIZE;
    2642       951691 :       break;
    2643              : 
    2644    966235569 :     case FUNCTION_TYPE:
    2645    966235569 :     case METHOD_TYPE:
    2646              :       /* It's hard to see what the mode and size of a function ought to
    2647              :          be, but we do know the alignment is FUNCTION_BOUNDARY, so
    2648              :          make it consistent with that.  */
    2649    966235569 :       SET_TYPE_MODE (type,
    2650              :                      int_mode_for_size (FUNCTION_BOUNDARY, 0).else_blk ());
    2651    966235569 :       TYPE_SIZE (type) = bitsize_int (FUNCTION_BOUNDARY);
    2652    966235569 :       TYPE_SIZE_UNIT (type) = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
    2653    966235569 :       break;
    2654              : 
    2655    235033953 :     case POINTER_TYPE:
    2656    235033953 :     case REFERENCE_TYPE:
    2657    235033953 :       {
    2658    235033953 :         scalar_int_mode mode = SCALAR_INT_TYPE_MODE (type);
    2659    470067906 :         TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (mode));
    2660    470067906 :         TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (mode));
    2661    235033953 :         TYPE_UNSIGNED (type) = 1;
    2662    235033953 :         TYPE_PRECISION (type) = GET_MODE_PRECISION (mode);
    2663              :       }
    2664    235033953 :       break;
    2665              : 
    2666     80448568 :     case ARRAY_TYPE:
    2667     80448568 :       {
    2668     80448568 :         tree index = TYPE_DOMAIN (type);
    2669     80448568 :         tree element = TREE_TYPE (type);
    2670              : 
    2671              :         /* We need to know both bounds in order to compute the size.  */
    2672     70687794 :         if (index && TYPE_MAX_VALUE (index) && TYPE_MIN_VALUE (index)
    2673    149874123 :             && TYPE_SIZE (element))
    2674              :           {
    2675     69365948 :             tree ub = TYPE_MAX_VALUE (index);
    2676     69365948 :             tree lb = TYPE_MIN_VALUE (index);
    2677     69365948 :             tree element_size = TYPE_SIZE (element);
    2678     69365948 :             tree length;
    2679              : 
    2680              :             /* Make sure that an array of zero-sized element is zero-sized
    2681              :                regardless of its extent.  */
    2682     69365948 :             if (integer_zerop (element_size))
    2683         4723 :               length = size_zero_node;
    2684              : 
    2685              :             /* The computation should happen in the original signedness so
    2686              :                that (possible) negative values are handled appropriately
    2687              :                when determining overflow.  */
    2688              :             else
    2689              :               {
    2690              :                 /* ???  When it is obvious that the range is signed
    2691              :                    represent it using ssizetype.  */
    2692     69361225 :                 if (TREE_CODE (lb) == INTEGER_CST
    2693     69360582 :                     && TREE_CODE (ub) == INTEGER_CST
    2694     69059497 :                     && TYPE_UNSIGNED (TREE_TYPE (lb))
    2695    137541149 :                     && tree_int_cst_lt (ub, lb))
    2696              :                   {
    2697         1275 :                     lb = wide_int_to_tree (ssizetype,
    2698          425 :                                            offset_int::from (wi::to_wide (lb),
    2699              :                                                              SIGNED));
    2700         1275 :                     ub = wide_int_to_tree (ssizetype,
    2701          425 :                                            offset_int::from (wi::to_wide (ub),
    2702              :                                                              SIGNED));
    2703              :                   }
    2704     69361225 :                 length
    2705     69361225 :                   = fold_convert (sizetype,
    2706              :                                   size_binop (PLUS_EXPR,
    2707              :                                               build_int_cst (TREE_TYPE (lb), 1),
    2708              :                                               size_binop (MINUS_EXPR, ub, lb)));
    2709              :               }
    2710              : 
    2711              :             /* ??? We have no way to distinguish a null-sized array from an
    2712              :                array spanning the whole sizetype range, so we arbitrarily
    2713              :                decide that [0, -1] is the only valid representation.  */
    2714     69365948 :             if (integer_zerop (length)
    2715        42747 :                 && TREE_OVERFLOW (length)
    2716     69391703 :                 && integer_zerop (lb))
    2717        25755 :               length = size_zero_node;
    2718              : 
    2719     69365948 :             TYPE_SIZE (type) = size_binop (MULT_EXPR, element_size,
    2720              :                                            bits_from_bytes (length));
    2721              : 
    2722              :             /* If we know the size of the element, calculate the total size
    2723              :                directly, rather than do some division thing below.  This
    2724              :                optimization helps Fortran assumed-size arrays (where the
    2725              :                size of the array is determined at runtime) substantially.  */
    2726     69365948 :             if (TYPE_SIZE_UNIT (element))
    2727     69365948 :               TYPE_SIZE_UNIT (type)
    2728    138731896 :                 = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (element), length);
    2729              :           }
    2730              : 
    2731              :         /* Now round the alignment and size,
    2732              :            using machine-dependent criteria if any.  */
    2733              : 
    2734     80448568 :         unsigned align = TYPE_ALIGN (element);
    2735     80448568 :         if (TYPE_USER_ALIGN (type))
    2736      2727742 :           align = MAX (align, TYPE_ALIGN (type));
    2737              :         else
    2738     77720826 :           TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (element);
    2739     80448568 :         if (!TYPE_WARN_IF_NOT_ALIGN (type))
    2740     80448568 :           SET_TYPE_WARN_IF_NOT_ALIGN (type,
    2741              :                                       TYPE_WARN_IF_NOT_ALIGN (element));
    2742              : #ifdef ROUND_TYPE_ALIGN
    2743              :         align = ROUND_TYPE_ALIGN (type, align, BITS_PER_UNIT);
    2744              : #else
    2745     80448568 :         align = MAX (align, BITS_PER_UNIT);
    2746              : #endif
    2747     80448568 :         SET_TYPE_ALIGN (type, align);
    2748     80448568 :         compute_array_mode (type);
    2749     80448568 :         if (AGGREGATE_TYPE_P (element))
    2750      5515450 :           TYPE_TYPELESS_STORAGE (type) = TYPE_TYPELESS_STORAGE (element);
    2751              :         /* When the element size is constant, check that it is at least as
    2752              :            large as the element alignment.  */
    2753     80448568 :         if (TYPE_SIZE_UNIT (element)
    2754     80380462 :             && TREE_CODE (TYPE_SIZE_UNIT (element)) == INTEGER_CST
    2755              :             /* If TYPE_SIZE_UNIT overflowed, then it is certainly larger than
    2756              :                TYPE_ALIGN_UNIT.  */
    2757     80347614 :             && !TREE_OVERFLOW (TYPE_SIZE_UNIT (element))
    2758    160796167 :             && !integer_zerop (TYPE_SIZE_UNIT (element)))
    2759              :           {
    2760     80337121 :             if (compare_tree_int (TYPE_SIZE_UNIT (element),
    2761     80337121 :                                   TYPE_ALIGN_UNIT (element)) < 0)
    2762           11 :               error ("alignment of array elements is greater than "
    2763              :                      "element size");
    2764     80337110 :             else if (TYPE_ALIGN_UNIT (element) > 1
    2765    115841634 :                      && (wi::zext (wi::to_wide (TYPE_SIZE_UNIT (element)),
    2766     17752262 :                                   ffs_hwi (TYPE_ALIGN_UNIT (element)) - 1)
    2767    115841634 :                          != 0))
    2768            6 :               error ("size of array element is not a multiple of its "
    2769              :                      "alignment");
    2770              :           }
    2771              :         break;
    2772              :       }
    2773              : 
    2774      5203631 :     case RECORD_TYPE:
    2775      5203631 :     case UNION_TYPE:
    2776      5203631 :     case QUAL_UNION_TYPE:
    2777      5203631 :       {
    2778      5203631 :         tree field;
    2779      5203631 :         record_layout_info rli;
    2780              : 
    2781              :         /* Initialize the layout information.  */
    2782      5203631 :         rli = start_record_layout (type);
    2783              : 
    2784              :         /* If this is a QUAL_UNION_TYPE, we want to process the fields
    2785              :            in the reverse order in building the COND_EXPR that denotes
    2786              :            its size.  We reverse them again later.  */
    2787      5203631 :         if (TREE_CODE (type) == QUAL_UNION_TYPE)
    2788            0 :           TYPE_FIELDS (type) = nreverse (TYPE_FIELDS (type));
    2789              : 
    2790              :         /* Place all the fields.  */
    2791     26470011 :         for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
    2792     21266380 :           place_field (rli, field);
    2793              : 
    2794      5203631 :         if (TREE_CODE (type) == QUAL_UNION_TYPE)
    2795            0 :           TYPE_FIELDS (type) = nreverse (TYPE_FIELDS (type));
    2796              : 
    2797              :         /* Finish laying out the record.  */
    2798      5203631 :         finish_record_layout (rli, /*free_p=*/true);
    2799              :       }
    2800      5203631 :       break;
    2801              : 
    2802            0 :     default:
    2803            0 :       gcc_unreachable ();
    2804              :     }
    2805              : 
    2806              :   /* Compute the final TYPE_SIZE, TYPE_ALIGN, etc. for TYPE.  For
    2807              :      records and unions, finish_record_layout already called this
    2808              :      function.  */
    2809   1394490617 :   if (!RECORD_OR_UNION_TYPE_P (type))
    2810   1389286986 :     finalize_type_size (type);
    2811              : 
    2812              :   /* We should never see alias sets on incomplete aggregates.  And we
    2813              :      should not call layout_type on not incomplete aggregates.  */
    2814   1394490617 :   if (AGGREGATE_TYPE_P (type))
    2815     85652199 :     gcc_assert (!TYPE_ALIAS_SET_KNOWN_P (type));
    2816              : }
    2817              : 
    2818              : /* Return the least alignment required for type TYPE.  */
    2819              : 
    2820              : unsigned int
    2821     39875127 : min_align_of_type (tree type)
    2822              : {
    2823     39875127 :   unsigned int align = TYPE_ALIGN (type);
    2824     39875127 :   if (!TYPE_USER_ALIGN (type))
    2825              :     {
    2826     72305769 :       align = MIN (align, BIGGEST_ALIGNMENT);
    2827              : #ifdef BIGGEST_FIELD_ALIGNMENT
    2828              :       align = MIN (align, BIGGEST_FIELD_ALIGNMENT);
    2829              : #endif
    2830     37196219 :       unsigned int field_align = align;
    2831              : #ifdef ADJUST_FIELD_ALIGN
    2832     37196219 :       field_align = ADJUST_FIELD_ALIGN (NULL_TREE, type, field_align);
    2833              : #endif
    2834     37196219 :       align = MIN (align, field_align);
    2835              :     }
    2836     39875127 :   return align / BITS_PER_UNIT;
    2837              : }
    2838              : 
    2839              : /* Create and return a type for signed integers of PRECISION bits.  */
    2840              : 
    2841              : tree
    2842      2722561 : make_signed_type (int precision)
    2843              : {
    2844      2722561 :   tree type = make_node (INTEGER_TYPE);
    2845              : 
    2846      2722561 :   TYPE_PRECISION (type) = precision;
    2847              : 
    2848      2722561 :   fixup_signed_type (type);
    2849      2722561 :   return type;
    2850              : }
    2851              : 
    2852              : /* Create and return a type for unsigned integers of PRECISION bits.  */
    2853              : 
    2854              : tree
    2855     10054881 : make_unsigned_type (int precision)
    2856              : {
    2857     10054881 :   tree type = make_node (INTEGER_TYPE);
    2858              : 
    2859     10054881 :   TYPE_PRECISION (type) = precision;
    2860              : 
    2861     10054881 :   fixup_unsigned_type (type);
    2862     10054881 :   return type;
    2863              : }
    2864              : 
    2865              : /* Create and return a type for fract of PRECISION bits, UNSIGNEDP,
    2866              :    and SATP.  */
    2867              : 
    2868              : tree
    2869      5769260 : make_fract_type (int precision, int unsignedp, int satp)
    2870              : {
    2871      5769260 :   tree type = make_node (FIXED_POINT_TYPE);
    2872              : 
    2873      5769260 :   TYPE_PRECISION (type) = precision;
    2874              : 
    2875      5769260 :   if (satp)
    2876      2884630 :     TYPE_SATURATING (type) = 1;
    2877              : 
    2878              :   /* Lay out the type: set its alignment, size, etc.  */
    2879      5769260 :   TYPE_UNSIGNED (type) = unsignedp;
    2880      5769260 :   enum mode_class mclass = unsignedp ? MODE_UFRACT : MODE_FRACT;
    2881      5769260 :   SET_TYPE_MODE (type, mode_for_size (precision, mclass, 0).require ());
    2882      5769260 :   layout_type (type);
    2883              : 
    2884      5769260 :   return type;
    2885              : }
    2886              : 
    2887              : /* Create and return a type for accum of PRECISION bits, UNSIGNEDP,
    2888              :    and SATP.  */
    2889              : 
    2890              : tree
    2891      4615408 : make_accum_type (int precision, int unsignedp, int satp)
    2892              : {
    2893      4615408 :   tree type = make_node (FIXED_POINT_TYPE);
    2894              : 
    2895      4615408 :   TYPE_PRECISION (type) = precision;
    2896              : 
    2897      4615408 :   if (satp)
    2898      2307704 :     TYPE_SATURATING (type) = 1;
    2899              : 
    2900              :   /* Lay out the type: set its alignment, size, etc.  */
    2901      4615408 :   TYPE_UNSIGNED (type) = unsignedp;
    2902      4615408 :   enum mode_class mclass = unsignedp ? MODE_UACCUM : MODE_ACCUM;
    2903      4615408 :   SET_TYPE_MODE (type, mode_for_size (precision, mclass, 0).require ());
    2904      4615408 :   layout_type (type);
    2905              : 
    2906      4615408 :   return type;
    2907              : }
    2908              : 
    2909              : /* Initialize sizetypes so layout_type can use them.  */
    2910              : 
    2911              : void
    2912       288463 : initialize_sizetypes (void)
    2913              : {
    2914       288463 :   int precision, bprecision;
    2915              : 
    2916              :   /* Get sizetypes precision from the SIZE_TYPE target macro.  */
    2917       295716 :   if (strcmp (SIZETYPE, "unsigned int") == 0)
    2918              :     precision = INT_TYPE_SIZE;
    2919       281210 :   else if (strcmp (SIZETYPE, "long unsigned int") == 0)
    2920       281210 :     precision = LONG_TYPE_SIZE;
    2921            0 :   else if (strcmp (SIZETYPE, "long long unsigned int") == 0)
    2922              :     precision = LONG_LONG_TYPE_SIZE;
    2923            0 :   else if (strcmp (SIZETYPE, "short unsigned int") == 0)
    2924              :     precision = SHORT_TYPE_SIZE;
    2925              :   else
    2926              :     {
    2927              :       int i;
    2928              : 
    2929              :       precision = -1;
    2930            0 :       for (i = 0; i < NUM_INT_N_ENTS; i++)
    2931            0 :         if (int_n_enabled_p[i])
    2932              :           {
    2933            0 :             char name[50], altname[50];
    2934            0 :             sprintf (name, "__int%d unsigned", int_n_data[i].bitsize);
    2935            0 :             sprintf (altname, "__int%d__ unsigned", int_n_data[i].bitsize);
    2936              : 
    2937            0 :             if (strcmp (name, SIZETYPE) == 0
    2938            0 :                 || strcmp (altname, SIZETYPE) == 0)
    2939              :               {
    2940            0 :                 precision = int_n_data[i].bitsize;
    2941              :               }
    2942              :           }
    2943            0 :       if (precision == -1)
    2944            0 :         gcc_unreachable ();
    2945              :     }
    2946              : 
    2947       288463 :   bprecision
    2948       576926 :     = MIN (precision + LOG2_BITS_PER_UNIT + 1, MAX_FIXED_MODE_SIZE);
    2949       288463 :   bprecision
    2950       288463 :     = GET_MODE_PRECISION (smallest_int_mode_for_size (bprecision).require ());
    2951       288463 :   if (bprecision > HOST_BITS_PER_DOUBLE_INT)
    2952              :     bprecision = HOST_BITS_PER_DOUBLE_INT;
    2953              : 
    2954              :   /* Create stubs for sizetype and bitsizetype so we can create constants.  */
    2955       288463 :   sizetype = make_node (INTEGER_TYPE);
    2956       288463 :   TYPE_NAME (sizetype) = get_identifier ("sizetype");
    2957       288463 :   TYPE_PRECISION (sizetype) = precision;
    2958       288463 :   TYPE_UNSIGNED (sizetype) = 1;
    2959       288463 :   bitsizetype = make_node (INTEGER_TYPE);
    2960       288463 :   TYPE_NAME (bitsizetype) = get_identifier ("bitsizetype");
    2961       288463 :   TYPE_PRECISION (bitsizetype) = bprecision;
    2962       288463 :   TYPE_UNSIGNED (bitsizetype) = 1;
    2963              : 
    2964              :   /* Now layout both types manually.  */
    2965       288463 :   scalar_int_mode mode = smallest_int_mode_for_size (precision).require ();
    2966       288463 :   SET_TYPE_MODE (sizetype, mode);
    2967       288463 :   SET_TYPE_ALIGN (sizetype, GET_MODE_ALIGNMENT (TYPE_MODE (sizetype)));
    2968       288463 :   TYPE_SIZE (sizetype) = bitsize_int (precision);
    2969       576926 :   TYPE_SIZE_UNIT (sizetype) = size_int (GET_MODE_SIZE (mode));
    2970       288463 :   set_min_and_max_values_for_integral_type (sizetype, precision, UNSIGNED);
    2971              : 
    2972       288463 :   mode = smallest_int_mode_for_size (bprecision).require ();
    2973       288463 :   SET_TYPE_MODE (bitsizetype, mode);
    2974       288463 :   SET_TYPE_ALIGN (bitsizetype, GET_MODE_ALIGNMENT (TYPE_MODE (bitsizetype)));
    2975       288463 :   TYPE_SIZE (bitsizetype) = bitsize_int (bprecision);
    2976       576926 :   TYPE_SIZE_UNIT (bitsizetype) = size_int (GET_MODE_SIZE (mode));
    2977       288463 :   set_min_and_max_values_for_integral_type (bitsizetype, bprecision, UNSIGNED);
    2978              : 
    2979              :   /* Create the signed variants of *sizetype.  */
    2980       288463 :   ssizetype = make_signed_type (TYPE_PRECISION (sizetype));
    2981       288463 :   TYPE_NAME (ssizetype) = get_identifier ("ssizetype");
    2982       288463 :   sbitsizetype = make_signed_type (TYPE_PRECISION (bitsizetype));
    2983       288463 :   TYPE_NAME (sbitsizetype) = get_identifier ("sbitsizetype");
    2984       288463 : }
    2985              : 
    2986              : /* TYPE is an integral type, i.e., an INTEGRAL_TYPE, ENUMERAL_TYPE
    2987              :    or BOOLEAN_TYPE.  Set TYPE_MIN_VALUE and TYPE_MAX_VALUE
    2988              :    for TYPE, based on the PRECISION and whether or not the TYPE
    2989              :    IS_UNSIGNED.  PRECISION need not correspond to a width supported
    2990              :    natively by the hardware; for example, on a machine with 8-bit,
    2991              :    16-bit, and 32-bit register modes, PRECISION might be 7, 23, or
    2992              :    61.  */
    2993              : 
    2994              : void
    2995     16196052 : set_min_and_max_values_for_integral_type (tree type,
    2996              :                                           int precision,
    2997              :                                           signop sgn)
    2998              : {
    2999              :   /* For bitfields with zero width we end up creating integer types
    3000              :      with zero precision.  Don't assign any minimum/maximum values
    3001              :      to those types, they don't have any valid value.  */
    3002     16196052 :   if (precision < 1)
    3003              :     return;
    3004              : 
    3005     16195727 :   gcc_assert (precision <= WIDE_INT_MAX_PRECISION);
    3006              : 
    3007     16195727 :   TYPE_MIN_VALUE (type)
    3008     32391454 :     = wide_int_to_tree (type, wi::min_value (precision, sgn));
    3009     16195727 :   TYPE_MAX_VALUE (type)
    3010     32393076 :     = wide_int_to_tree (type, wi::max_value (precision, sgn));
    3011              : }
    3012              : 
    3013              : /* Set the extreme values of TYPE based on its precision in bits,
    3014              :    then lay it out.  Used when make_signed_type won't do
    3015              :    because the tree code is not INTEGER_TYPE.  */
    3016              : 
    3017              : void
    3018      3280105 : fixup_signed_type (tree type)
    3019              : {
    3020      3280105 :   int precision = TYPE_PRECISION (type);
    3021              : 
    3022      3280105 :   set_min_and_max_values_for_integral_type (type, precision, SIGNED);
    3023              : 
    3024              :   /* Lay out the type: set its alignment, size, etc.  */
    3025      3280105 :   layout_type (type);
    3026      3280105 : }
    3027              : 
    3028              : /* Set the extreme values of TYPE based on its precision in bits,
    3029              :    then lay it out.  This is used both in `make_unsigned_type'
    3030              :    and for enumeral types.  */
    3031              : 
    3032              : void
    3033     10921523 : fixup_unsigned_type (tree type)
    3034              : {
    3035     10921523 :   int precision = TYPE_PRECISION (type);
    3036              : 
    3037     10921523 :   TYPE_UNSIGNED (type) = 1;
    3038              : 
    3039     10921523 :   set_min_and_max_values_for_integral_type (type, precision, UNSIGNED);
    3040              : 
    3041              :   /* Lay out the type: set its alignment, size, etc.  */
    3042     10921523 :   layout_type (type);
    3043     10921523 : }
    3044              : 
    3045              : /* Construct an iterator for a bitfield that spans BITSIZE bits,
    3046              :    starting at BITPOS.
    3047              : 
    3048              :    BITREGION_START is the bit position of the first bit in this
    3049              :    sequence of bit fields.  BITREGION_END is the last bit in this
    3050              :    sequence.  If these two fields are non-zero, we should restrict the
    3051              :    memory access to that range.  Otherwise, we are allowed to touch
    3052              :    any adjacent non bit-fields.
    3053              : 
    3054              :    ALIGN is the alignment of the underlying object in bits.
    3055              :    VOLATILEP says whether the bitfield is volatile.  */
    3056              : 
    3057      1214825 : bit_field_mode_iterator
    3058              : ::bit_field_mode_iterator (HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
    3059              :                            poly_int64 bitregion_start,
    3060              :                            poly_int64 bitregion_end,
    3061      1214825 :                            unsigned int align, bool volatilep)
    3062      1214825 : : m_mode (NARROWEST_INT_MODE), m_bitsize (bitsize),
    3063      1214825 :   m_bitpos (bitpos), m_bitregion_start (bitregion_start),
    3064      1214825 :   m_bitregion_end (bitregion_end), m_align (align),
    3065      1214825 :   m_volatilep (volatilep), m_count (0)
    3066              : {
    3067      1214825 :   if (known_eq (m_bitregion_end, 0))
    3068              :     {
    3069              :       /* We can assume that any aligned chunk of ALIGN bits that overlaps
    3070              :          the bitfield is mapped and won't trap, provided that ALIGN isn't
    3071              :          too large.  The cap is the biggest required alignment for data,
    3072              :          or at least the word size.  And force one such chunk at least.  */
    3073       289245 :       unsigned HOST_WIDE_INT units
    3074      1054847 :         = MIN (align, MAX (BIGGEST_ALIGNMENT, BITS_PER_WORD));
    3075       289245 :       if (bitsize <= 0)
    3076              :         bitsize = 1;
    3077       289245 :       HOST_WIDE_INT end = bitpos + bitsize + units - 1;
    3078       289245 :       m_bitregion_end = end - end % units - 1;
    3079              :     }
    3080      1214825 : }
    3081              : 
    3082              : /* Calls to this function return successively larger modes that can be used
    3083              :    to represent the bitfield.  Return true if another bitfield mode is
    3084              :    available, storing it in *OUT_MODE if so.  */
    3085              : 
    3086              : bool
    3087      1216065 : bit_field_mode_iterator::next_mode (scalar_int_mode *out_mode)
    3088              : {
    3089      1216065 :   scalar_int_mode mode;
    3090      1961478 :   for (; m_mode.exists (&mode); m_mode = GET_MODE_WIDER_MODE (mode))
    3091              :     {
    3092      1961478 :       unsigned int unit = GET_MODE_BITSIZE (mode);
    3093              : 
    3094              :       /* Skip modes that don't have full precision.  */
    3095      1961478 :       if (unit != GET_MODE_PRECISION (mode))
    3096       745413 :         continue;
    3097              : 
    3098              :       /* Stop if the mode is too wide to handle efficiently.  */
    3099      3922956 :       if (unit > MAX_FIXED_MODE_SIZE)
    3100              :         break;
    3101              : 
    3102              :       /* Don't deliver more than one multiword mode; the smallest one
    3103              :          should be used.  */
    3104      1944861 :       if (m_count > 0 && unit > BITS_PER_WORD)
    3105              :         break;
    3106              : 
    3107              :       /* Skip modes that are too small.  */
    3108      1944721 :       unsigned HOST_WIDE_INT substart = (unsigned HOST_WIDE_INT) m_bitpos % unit;
    3109      1944721 :       unsigned HOST_WIDE_INT subend = substart + m_bitsize;
    3110      1944721 :       if (subend > unit)
    3111       745413 :         continue;
    3112              : 
    3113              :       /* Stop if the mode goes outside the bitregion.  */
    3114      1199308 :       HOST_WIDE_INT start = m_bitpos - substart;
    3115      1199308 :       if (maybe_ne (m_bitregion_start, 0)
    3116      1199308 :           && maybe_lt (start, m_bitregion_start))
    3117              :         break;
    3118      1199282 :       HOST_WIDE_INT end = start + unit;
    3119      1199282 :       if (maybe_gt (end, m_bitregion_end + 1))
    3120              :         break;
    3121              : 
    3122              :       /* Stop if the mode requires too much alignment.  */
    3123      1184667 :       if (GET_MODE_ALIGNMENT (mode) > m_align
    3124      1184667 :           && targetm.slow_unaligned_access (mode, m_align))
    3125              :         break;
    3126              : 
    3127      1184667 :       *out_mode = mode;
    3128      1184667 :       m_mode = GET_MODE_WIDER_MODE (mode);
    3129      1184667 :       m_count++;
    3130      1184667 :       return true;
    3131              :     }
    3132              :   return false;
    3133              : }
    3134              : 
    3135              : /* Return true if smaller modes are generally preferred for this kind
    3136              :    of bitfield.  */
    3137              : 
    3138              : bool
    3139      1165561 : bit_field_mode_iterator::prefer_smaller_modes ()
    3140              : {
    3141      1165561 :   return (m_volatilep
    3142      1165561 :           ? targetm.narrow_volatile_bitfield ()
    3143      1165561 :           : !SLOW_BYTE_ACCESS);
    3144              : }
    3145              : 
    3146              : /* Find the best machine mode to use when referencing a bit field of length
    3147              :    BITSIZE bits starting at BITPOS.
    3148              : 
    3149              :    BITREGION_START is the bit position of the first bit in this
    3150              :    sequence of bit fields.  BITREGION_END is the last bit in this
    3151              :    sequence.  If these two fields are non-zero, we should restrict the
    3152              :    memory access to that range.  Otherwise, we are allowed to touch
    3153              :    any adjacent non bit-fields.
    3154              : 
    3155              :    The chosen mode must have no more than LARGEST_MODE_BITSIZE bits.
    3156              :    INT_MAX is a suitable value for LARGEST_MODE_BITSIZE if the caller
    3157              :    doesn't want to apply a specific limit.
    3158              : 
    3159              :    If no mode meets all these conditions, we return VOIDmode.
    3160              : 
    3161              :    The underlying object is known to be aligned to a boundary of ALIGN bits.
    3162              : 
    3163              :    If VOLATILEP is false and SLOW_BYTE_ACCESS is false, we return the
    3164              :    smallest mode meeting these conditions.
    3165              : 
    3166              :    If VOLATILEP is false and SLOW_BYTE_ACCESS is true, we return the
    3167              :    largest mode (but a mode no wider than UNITS_PER_WORD) that meets
    3168              :    all the conditions.
    3169              : 
    3170              :    If VOLATILEP is true the narrow_volatile_bitfields target hook is used to
    3171              :    decide which of the above modes should be used.  */
    3172              : 
    3173              : bool
    3174      1011044 : get_best_mode (HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
    3175              :                poly_uint64 bitregion_start, poly_uint64 bitregion_end,
    3176              :                unsigned int align,
    3177              :                unsigned HOST_WIDE_INT largest_mode_bitsize, bool volatilep,
    3178              :                scalar_int_mode *best_mode)
    3179              : {
    3180      1011044 :   bit_field_mode_iterator iter (bitsize, bitpos, bitregion_start,
    3181      1011044 :                                 bitregion_end, align, volatilep);
    3182      1011044 :   scalar_int_mode mode;
    3183      1011044 :   bool found = false;
    3184      1011044 :   while (iter.next_mode (&mode)
    3185              :          /* ??? For historical reasons, reject modes that would normally
    3186              :             receive greater alignment, even if unaligned accesses are
    3187              :             acceptable.  This has both advantages and disadvantages.
    3188              :             Removing this check means that something like:
    3189              : 
    3190              :                struct s { unsigned int x; unsigned int y; };
    3191              :                int f (struct s *s) { return s->x == 0 && s->y == 0; }
    3192              : 
    3193              :             can be implemented using a single load and compare on
    3194              :             64-bit machines that have no alignment restrictions.
    3195              :             For example, on powerpc64-linux-gnu, we would generate:
    3196              : 
    3197              :                     ld 3,0(3)
    3198              :                     cntlzd 3,3
    3199              :                     srdi 3,3,6
    3200              :                     blr
    3201              : 
    3202              :             rather than:
    3203              : 
    3204              :                     lwz 9,0(3)
    3205              :                     cmpwi 7,9,0
    3206              :                     bne 7,.L3
    3207              :                     lwz 3,4(3)
    3208              :                     cntlzw 3,3
    3209              :                     srwi 3,3,5
    3210              :                     extsw 3,3
    3211              :                     blr
    3212              :                     .p2align 4,,15
    3213              :             .L3:
    3214              :                     li 3,0
    3215              :                     blr
    3216              : 
    3217              :             However, accessing more than one field can make life harder
    3218              :             for the gimple optimizers.  For example, gcc.dg/vect/bb-slp-5.c
    3219              :             has a series of unsigned short copies followed by a series of
    3220              :             unsigned short comparisons.  With this check, both the copies
    3221              :             and comparisons remain 16-bit accesses and FRE is able
    3222              :             to eliminate the latter.  Without the check, the comparisons
    3223              :             can be done using 2 64-bit operations, which FRE isn't able
    3224              :             to handle in the same way.
    3225              : 
    3226              :             Either way, it would probably be worth disabling this check
    3227              :             during expand.  One particular example where removing the
    3228              :             check would help is the get_best_mode call in store_bit_field.
    3229              :             If we are given a memory bitregion of 128 bits that is aligned
    3230              :             to a 64-bit boundary, and the bitfield we want to modify is
    3231              :             in the second half of the bitregion, this check causes
    3232              :             store_bitfield to turn the memory into a 64-bit reference
    3233              :             to the _first_ half of the region.  We later use
    3234              :             adjust_bitfield_address to get a reference to the correct half,
    3235              :             but doing so looks to adjust_bitfield_address as though we are
    3236              :             moving past the end of the original object, so it drops the
    3237              :             associated MEM_EXPR and MEM_OFFSET.  Removing the check
    3238              :             causes store_bit_field to keep a 128-bit memory reference,
    3239              :             so that the final bitfield reference still has a MEM_EXPR
    3240              :             and MEM_OFFSET.  */
    3241       987072 :          && GET_MODE_ALIGNMENT (mode) <= align
    3242      1981654 :          && GET_MODE_BITSIZE (mode) <= largest_mode_bitsize)
    3243              :     {
    3244       968278 :       *best_mode = mode;
    3245       968278 :       found = true;
    3246       968278 :       if (iter.prefer_smaller_modes ())
    3247              :         break;
    3248              :     }
    3249              : 
    3250      1011044 :   return found;
    3251              : }
    3252              : 
    3253              : /* Gets minimal and maximal values for MODE (signed or unsigned depending on
    3254              :    SIGN).  The returned constants are made to be usable in TARGET_MODE.  */
    3255              : 
    3256              : void
    3257     62036198 : get_mode_bounds (scalar_int_mode mode, int sign,
    3258              :                  scalar_int_mode target_mode,
    3259              :                  rtx *mmin, rtx *mmax)
    3260              : {
    3261     62036198 :   unsigned size = GET_MODE_PRECISION (mode);
    3262     62036198 :   unsigned HOST_WIDE_INT min_val, max_val;
    3263              : 
    3264     62036198 :   gcc_assert (size <= HOST_BITS_PER_WIDE_INT);
    3265              : 
    3266              :   /* Special case BImode, which has values 0 and STORE_FLAG_VALUE.  */
    3267     62036198 :   if (mode == BImode)
    3268              :     {
    3269              :       if (STORE_FLAG_VALUE < 0)
    3270              :         {
    3271              :           min_val = STORE_FLAG_VALUE;
    3272              :           max_val = 0;
    3273              :         }
    3274              :       else
    3275              :         {
    3276              :           min_val = 0;
    3277              :           max_val = STORE_FLAG_VALUE;
    3278              :         }
    3279              :     }
    3280     62036198 :   else if (sign)
    3281              :     {
    3282     55591435 :       min_val = -(HOST_WIDE_INT_1U << (size - 1));
    3283     55591435 :       max_val = (HOST_WIDE_INT_1U << (size - 1)) - 1;
    3284              :     }
    3285              :   else
    3286              :     {
    3287      6444763 :       min_val = 0;
    3288      6444763 :       max_val = (HOST_WIDE_INT_1U << (size - 1) << 1) - 1;
    3289              :     }
    3290              : 
    3291     62036198 :   *mmin = gen_int_mode (min_val, target_mode);
    3292     62036198 :   *mmax = gen_int_mode (max_val, target_mode);
    3293     62036198 : }
    3294              : 
    3295              : #include "gt-stor-layout.h"
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.