Annotation of gcc/stor-layout.c, revision 1.1.1.8

1.1       root        1: /* C-compiler utilities for types and variables storage layout
1.1.1.8 ! root        2:    Copyright (C) 1987, 88, 92, 93, 94, 1995 Free Software Foundation, Inc.
1.1       root        3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
1.1.1.8 ! root       18: the Free Software Foundation, 59 Temple Place - Suite 330,
        !            19: Boston, MA 02111-1307, USA.  */
1.1       root       20: 
                     21: 
                     22: #include "config.h"
                     23: #include <stdio.h>
                     24: 
                     25: #include "tree.h"
1.1.1.8 ! root       26: #include "flags.h"
1.1       root       27: #include "function.h"
                     28: 
                     29: #define CEIL(x,y) (((x) + (y) - 1) / (y))
                     30: 
                     31: /* Data type for the expressions representing sizes of data types.
                     32:    It is the first integer type laid out.
                     33:    In C, this is int.  */
                     34: 
                     35: tree sizetype;
                     36: 
                     37: /* An integer constant with value 0 whose type is sizetype.  */
                     38: 
                     39: tree size_zero_node;
                     40: 
                     41: /* An integer constant with value 1 whose type is sizetype.  */
                     42: 
                     43: tree size_one_node;
                     44: 
1.1.1.4   root       45: /* If nonzero, this is an upper limit on alignment of structure fields.
                     46:    The value is measured in bits.  */
                     47: int maximum_field_alignment;
                     48: 
1.1.1.8 ! root       49: /* If non-zero, the alignment of a bitstring or (power-)set value, in bits.
1.1.1.7   root       50:    May be overridden by front-ends.  */
                     51: int set_alignment = 0;
                     52: 
1.1       root       53: #define GET_MODE_ALIGNMENT(MODE)   \
                     54:   MIN (BIGGEST_ALIGNMENT,         \
                     55:        MAX (1, (GET_MODE_UNIT_SIZE (MODE) * BITS_PER_UNIT)))
1.1.1.6   root       56: 
                     57: static enum machine_mode smallest_mode_for_size  PROTO((unsigned int,
                     58:                                                        enum mode_class));
                     59: static tree layout_record      PROTO((tree));
                     60: static void layout_union       PROTO((tree));
1.1       root       61: 
                     62: /* SAVE_EXPRs for sizes of types and decls, waiting to be expanded.  */
                     63: 
                     64: static tree pending_sizes;
                     65: 
                     66: /* Nonzero means cannot safely call expand_expr now,
                     67:    so put variable sizes onto `pending_sizes' instead.  */
                     68: 
                     69: int immediate_size_expand;
                     70: 
                     71: tree
                     72: get_pending_sizes ()
                     73: {
                     74:   tree chain = pending_sizes;
1.1.1.2   root       75:   tree t;
                     76: 
                     77:   /* Put each SAVE_EXPR into the current function.  */
                     78:   for (t = chain; t; t = TREE_CHAIN (t))
                     79:     SAVE_EXPR_CONTEXT (TREE_VALUE (t)) = current_function_decl;
1.1       root       80:   pending_sizes = 0;
                     81:   return chain;
                     82: }
                     83: 
1.1.1.8 ! root       84: void
        !            85: put_pending_sizes (chain)
        !            86:      tree chain;
        !            87: {
        !            88:   if (pending_sizes)
        !            89:     abort ();
        !            90: 
        !            91:   pending_sizes = chain;
        !            92: }
        !            93: 
        !            94: /* Given a size SIZE that may not be a constant, return a SAVE_EXPR
1.1       root       95:    to serve as the actual size-expression for a type or decl.  */
                     96: 
1.1.1.2   root       97: tree
1.1       root       98: variable_size (size)
                     99:      tree size;
                    100: {
1.1.1.6   root      101:   /* If the language-processor is to take responsibility for variable-sized
                    102:      items (e.g., languages which have elaboration procedures like Ada),
1.1.1.7   root      103:      just return SIZE unchanged.  Likewise for self-referential sizes.  */
1.1.1.8 ! root      104:   if (TREE_CONSTANT (size)
        !           105:       || global_bindings_p () < 0 || contains_placeholder_p (size))
1.1.1.6   root      106:     return size;
                    107: 
1.1.1.7   root      108:   size = save_expr (size);
                    109: 
                    110:   if (global_bindings_p ())
1.1       root      111:     {
1.1.1.5   root      112:       if (TREE_CONSTANT (size))
                    113:        error ("type size can't be explicitly evaluated");
                    114:       else
                    115:        error ("variable-size type declared outside of any function");
                    116: 
1.1       root      117:       return size_int (1);
                    118:     }
                    119: 
                    120:   if (immediate_size_expand)
1.1.1.5   root      121:     /* NULL_RTX is not defined; neither is the rtx type. 
                    122:        Also, we would like to pass const0_rtx here, but don't have it.  */
                    123:     expand_expr (size, expand_expr (integer_zero_node, NULL_PTR, VOIDmode, 0),
                    124:                 VOIDmode, 0);
1.1       root      125:   else
1.1.1.4   root      126:     pending_sizes = tree_cons (NULL_TREE, size, pending_sizes);
1.1       root      127: 
                    128:   return size;
                    129: }
                    130: 
                    131: #ifndef MAX_FIXED_MODE_SIZE
                    132: #define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (DImode)
                    133: #endif
                    134: 
                    135: /* Return the machine mode to use for a nonscalar of SIZE bits.
                    136:    The mode must be in class CLASS, and have exactly that many bits.
                    137:    If LIMIT is nonzero, modes of wider than MAX_FIXED_MODE_SIZE will not
                    138:    be used.  */
                    139: 
                    140: enum machine_mode
                    141: mode_for_size (size, class, limit)
                    142:      unsigned int size;
                    143:      enum mode_class class;
                    144:      int limit;
                    145: {
                    146:   register enum machine_mode mode;
                    147: 
                    148:   if (limit && size > MAX_FIXED_MODE_SIZE)
                    149:     return BLKmode;
                    150: 
1.1.1.6   root      151:   /* Get the first mode which has this size, in the specified class.  */
1.1       root      152:   for (mode = GET_CLASS_NARROWEST_MODE (class); mode != VOIDmode;
                    153:        mode = GET_MODE_WIDER_MODE (mode))
                    154:     if (GET_MODE_BITSIZE (mode) == size)
                    155:       return mode;
                    156: 
                    157:   return BLKmode;
                    158: }
                    159: 
1.1.1.6   root      160: /* Similar, but never return BLKmode; return the narrowest mode that
                    161:    contains at least the requested number of bits.  */
                    162: 
                    163: static enum machine_mode
                    164: smallest_mode_for_size (size, class)
                    165:      unsigned int size;
                    166:      enum mode_class class;
                    167: {
                    168:   register enum machine_mode mode;
                    169: 
                    170:   /* Get the first mode which has at least this size, in the
                    171:      specified class.  */
                    172:   for (mode = GET_CLASS_NARROWEST_MODE (class); mode != VOIDmode;
                    173:        mode = GET_MODE_WIDER_MODE (mode))
                    174:     if (GET_MODE_BITSIZE (mode) >= size)
                    175:       return mode;
                    176: 
                    177:   abort ();
                    178: }
                    179: 
1.1       root      180: /* Return the value of VALUE, rounded up to a multiple of DIVISOR.  */
                    181: 
                    182: tree
                    183: round_up (value, divisor)
                    184:      tree value;
                    185:      int divisor;
                    186: {
                    187:   return size_binop (MULT_EXPR,
                    188:                     size_binop (CEIL_DIV_EXPR, value, size_int (divisor)),
                    189:                     size_int (divisor));
                    190: }
                    191: 
                    192: /* Set the size, mode and alignment of a ..._DECL node.
                    193:    TYPE_DECL does need this for C++.
                    194:    Note that LABEL_DECL and CONST_DECL nodes do not need this,
                    195:    and FUNCTION_DECL nodes have them set up in a special (and simple) way.
                    196:    Don't call layout_decl for them.
                    197: 
                    198:    KNOWN_ALIGN is the amount of alignment we can assume this
                    199:    decl has with no special effort.  It is relevant only for FIELD_DECLs
                    200:    and depends on the previous fields.
                    201:    All that matters about KNOWN_ALIGN is which powers of 2 divide it.
                    202:    If KNOWN_ALIGN is 0, it means, "as much alignment as you like":
                    203:    the record will be aligned to suit.  */
                    204: 
                    205: void
                    206: layout_decl (decl, known_align)
                    207:      tree decl;
                    208:      unsigned known_align;
                    209: {
                    210:   register tree type = TREE_TYPE (decl);
                    211:   register enum tree_code code = TREE_CODE (decl);
1.1.1.3   root      212:   int spec_size = DECL_FIELD_SIZE (decl);
1.1       root      213: 
                    214:   if (code == CONST_DECL)
                    215:     return;
                    216: 
                    217:   if (code != VAR_DECL && code != PARM_DECL && code != RESULT_DECL
                    218:       && code != FIELD_DECL && code != TYPE_DECL)
                    219:     abort ();
                    220: 
                    221:   if (type == error_mark_node)
                    222:     {
                    223:       type = void_type_node;
                    224:       spec_size = 0;
                    225:     }
                    226: 
                    227:   /* Usually the size and mode come from the data type without change.  */
                    228: 
                    229:   DECL_MODE (decl) = TYPE_MODE (type);
                    230:   TREE_UNSIGNED (decl) = TREE_UNSIGNED (type);
1.1.1.6   root      231:   if (DECL_SIZE (decl) == 0)
                    232:     DECL_SIZE (decl) = TYPE_SIZE (type);
1.1       root      233: 
                    234:   if (code == FIELD_DECL && DECL_BIT_FIELD (decl))
                    235:     {
                    236:       if (spec_size == 0 && DECL_NAME (decl) != 0)
                    237:        abort ();
                    238: 
                    239:       /* Size is specified number of bits.  */
                    240:       DECL_SIZE (decl) = size_int (spec_size);
                    241:     }
                    242:   /* Force alignment required for the data type.
1.1.1.3   root      243:      But if the decl itself wants greater alignment, don't override that.
                    244:      Likewise, if the decl is packed, don't override it.  */
                    245:   else if (DECL_ALIGN (decl) == 0
                    246:           || (! DECL_PACKED (decl) &&  TYPE_ALIGN (type) > DECL_ALIGN (decl)))
1.1       root      247:     DECL_ALIGN (decl) = TYPE_ALIGN (type);
                    248: 
                    249:   /* See if we can use an ordinary integer mode for a bit-field.  */
                    250:   /* Conditions are: a fixed size that is correct for another mode
                    251:      and occupying a complete byte or bytes on proper boundary.  */
                    252:   if (code == FIELD_DECL)
1.1.1.4   root      253:     {
                    254:       DECL_BIT_FIELD_TYPE (decl) = DECL_BIT_FIELD (decl) ? type : 0;
                    255:       if (maximum_field_alignment != 0)
                    256:        DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
1.1.1.8 ! root      257:       else if (flag_pack_struct)
        !           258:        DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
1.1.1.4   root      259:     }
                    260: 
1.1       root      261:   if (DECL_BIT_FIELD (decl)
                    262:       && TYPE_SIZE (type) != 0
                    263:       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
                    264:     {
                    265:       register enum machine_mode xmode
                    266:        = mode_for_size (TREE_INT_CST_LOW (DECL_SIZE (decl)), MODE_INT, 1);
                    267: 
                    268:       if (xmode != BLKmode
                    269:          && known_align % GET_MODE_ALIGNMENT (xmode) == 0)
                    270:        {
                    271:          DECL_ALIGN (decl) = MAX (GET_MODE_ALIGNMENT (xmode),
                    272:                                   DECL_ALIGN (decl));
                    273:          DECL_MODE (decl) = xmode;
                    274:          DECL_SIZE (decl) = size_int (GET_MODE_BITSIZE (xmode));
                    275:          /* This no longer needs to be accessed as a bit field.  */
                    276:          DECL_BIT_FIELD (decl) = 0;
                    277:        }
                    278:     }
                    279: 
                    280:   /* Evaluate nonconstant size only once, either now or as soon as safe.  */
                    281:   if (DECL_SIZE (decl) != 0 && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
                    282:     DECL_SIZE (decl) = variable_size (DECL_SIZE (decl));
                    283: }
                    284: 
                    285: /* Lay out a RECORD_TYPE type (a C struct).
                    286:    This means laying out the fields, determining their positions,
                    287:    and computing the overall size and required alignment of the record.
                    288:    Note that if you set the TYPE_ALIGN before calling this
                    289:    then the struct is aligned to at least that boundary.
                    290: 
                    291:    If the type has basetypes, you must call layout_basetypes
                    292:    before calling this function.
                    293: 
                    294:    The return value is a list of static members of the record.
                    295:    They still need to be laid out.  */
                    296: 
                    297: static tree
                    298: layout_record (rec)
                    299:      tree rec;
                    300: {
                    301:   register tree field;
                    302: #ifdef STRUCTURE_SIZE_BOUNDARY
                    303:   unsigned record_align = MAX (STRUCTURE_SIZE_BOUNDARY, TYPE_ALIGN (rec));
                    304: #else
                    305:   unsigned record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
                    306: #endif
                    307:   /* These must be laid out *after* the record is.  */
                    308:   tree pending_statics = NULL_TREE;
                    309:   /* Record size so far is CONST_SIZE + VAR_SIZE bits,
                    310:      where CONST_SIZE is an integer
                    311:      and VAR_SIZE is a tree expression.
                    312:      If VAR_SIZE is null, the size is just CONST_SIZE.
                    313:      Naturally we try to avoid using VAR_SIZE.  */
                    314:   register int const_size = 0;
                    315:   register tree var_size = 0;
                    316:   /* Once we start using VAR_SIZE, this is the maximum alignment
                    317:      that we know VAR_SIZE has.  */
                    318:   register int var_align = BITS_PER_UNIT;
                    319: 
                    320: 
                    321:   for (field = TYPE_FIELDS (rec); field; field = TREE_CHAIN (field))
                    322:     {
1.1.1.7   root      323:       register int known_align = var_size ? var_align : const_size;
1.1       root      324:       register int desired_align;
                    325: 
                    326:       /* If FIELD is static, then treat it like a separate variable,
                    327:         not really like a structure field.
                    328:         If it is a FUNCTION_DECL, it's a method.
                    329:         In both cases, all we do is lay out the decl,
                    330:         and we do it *after* the record is laid out.  */
                    331: 
                    332:       if (TREE_STATIC (field))
                    333:        {
1.1.1.4   root      334:          pending_statics = tree_cons (NULL_TREE, field, pending_statics);
1.1       root      335:          continue;
                    336:        }
                    337:       /* Enumerators and enum types which are local to this class need not
                    338:         be laid out.  Likewise for initialized constant fields.  */
                    339:       if (TREE_CODE (field) != FIELD_DECL)
                    340:        continue;
                    341: 
                    342:       /* Lay out the field so we know what alignment it needs.
1.1.1.7   root      343:         For a packed field, use the alignment as specified,
1.1       root      344:         disregarding what the type would want.  */
                    345:       if (DECL_PACKED (field))
                    346:        desired_align = DECL_ALIGN (field);
1.1.1.7   root      347:       layout_decl (field, known_align);
1.1       root      348:       if (! DECL_PACKED (field))
                    349:        desired_align = DECL_ALIGN (field);
                    350:       /* Some targets (i.e. VMS) limit struct field alignment
                    351:         to a lower boundary than alignment of variables.  */
                    352: #ifdef BIGGEST_FIELD_ALIGNMENT
                    353:       desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT);
                    354: #endif
                    355: 
                    356:       /* Record must have at least as much alignment as any field.
                    357:         Otherwise, the alignment of the field within the record
                    358:         is meaningless.  */
                    359: 
                    360: #ifndef PCC_BITFIELD_TYPE_MATTERS
                    361:       record_align = MAX (record_align, desired_align);
                    362: #else
                    363:       if (PCC_BITFIELD_TYPE_MATTERS && TREE_TYPE (field) != error_mark_node
1.1.1.3   root      364:          && DECL_BIT_FIELD_TYPE (field)
1.1       root      365:          && ! integer_zerop (TYPE_SIZE (TREE_TYPE (field))))
                    366:        {
                    367:          /* For these machines, a zero-length field does not
                    368:             affect the alignment of the structure as a whole.
                    369:             It does, however, affect the alignment of the next field
                    370:             within the structure.  */
                    371:          if (! integer_zerop (DECL_SIZE (field)))
                    372:            record_align = MAX (record_align, desired_align);
                    373:          else if (! DECL_PACKED (field))
                    374:            desired_align = TYPE_ALIGN (TREE_TYPE (field));
                    375:          /* A named bit field of declared type `int'
                    376:             forces the entire structure to have `int' alignment.  */
                    377:          if (DECL_NAME (field) != 0)
1.1.1.4   root      378:            {
                    379:              int type_align = TYPE_ALIGN (TREE_TYPE (field));
                    380:              if (maximum_field_alignment != 0)
                    381:                type_align = MIN (type_align, maximum_field_alignment);
1.1.1.8 ! root      382:              else if (flag_pack_struct)
        !           383:                type_align = MIN (type_align, BITS_PER_UNIT);
1.1.1.4   root      384: 
                    385:              record_align = MAX (record_align, type_align);
                    386:            }
1.1       root      387:        }
                    388:       else
                    389:        record_align = MAX (record_align, desired_align);
                    390: #endif
                    391: 
                    392:       /* Does this field automatically have alignment it needs
                    393:         by virtue of the fields that precede it and the record's
                    394:         own alignment?  */
                    395: 
                    396:       if (const_size % desired_align != 0
                    397:          || (var_align % desired_align != 0
                    398:              && var_size != 0))
                    399:        {
                    400:          /* No, we need to skip space before this field.
                    401:             Bump the cumulative size to multiple of field alignment.  */
                    402: 
                    403:          if (var_size == 0
                    404:              || var_align % desired_align == 0)
                    405:            const_size
                    406:              = CEIL (const_size, desired_align) * desired_align;
                    407:          else
                    408:            {
                    409:              if (const_size > 0)
1.1.1.3   root      410:                var_size = size_binop (PLUS_EXPR, var_size,
                    411:                                       size_int (const_size));
1.1       root      412:              const_size = 0;
                    413:              var_size = round_up (var_size, desired_align);
                    414:              var_align = MIN (var_align, desired_align);
                    415:            }
                    416:        }
                    417: 
                    418: #ifdef PCC_BITFIELD_TYPE_MATTERS
                    419:       if (PCC_BITFIELD_TYPE_MATTERS
                    420:          && TREE_CODE (field) == FIELD_DECL
                    421:          && TREE_TYPE (field) != error_mark_node
1.1.1.3   root      422:          && DECL_BIT_FIELD_TYPE (field)
1.1       root      423:          && !DECL_PACKED (field)
1.1.1.6   root      424:          /* If #pragma pack is in effect, turn off this feature.  */
                    425:          && maximum_field_alignment == 0
1.1.1.8 ! root      426:          && !flag_pack_struct
1.1       root      427:          && !integer_zerop (DECL_SIZE (field)))
                    428:        {
                    429:          int type_align = TYPE_ALIGN (TREE_TYPE (field));
                    430:          register tree dsize = DECL_SIZE (field);
                    431:          int field_size = TREE_INT_CST_LOW (dsize);
                    432: 
                    433:          /* A bit field may not span the unit of alignment of its type.
                    434:             Advance to next boundary if necessary.  */
1.1.1.4   root      435:          /* ??? There is some uncertainty here as to what
                    436:             should be done if type_align is less than the width of the type.
                    437:             That can happen because the width exceeds BIGGEST_ALIGNMENT
                    438:             or because it exceeds maximum_field_alignment.  */
1.1       root      439:          if (const_size / type_align
                    440:              != (const_size + field_size - 1) / type_align)
                    441:            const_size = CEIL (const_size, type_align) * type_align;
                    442:        }
                    443: #endif
                    444: 
                    445: /* No existing machine description uses this parameter.
                    446:    So I have made it in this aspect identical to PCC_BITFIELD_TYPE_MATTERS.  */
                    447: #ifdef BITFIELD_NBYTES_LIMITED
                    448:       if (BITFIELD_NBYTES_LIMITED
                    449:          && TREE_CODE (field) == FIELD_DECL
                    450:          && TREE_TYPE (field) != error_mark_node
1.1.1.3   root      451:          && DECL_BIT_FIELD_TYPE (field)
1.1       root      452:          && !DECL_PACKED (field)
                    453:          && !integer_zerop (DECL_SIZE (field)))
                    454:        {
                    455:          int type_align = TYPE_ALIGN (TREE_TYPE (field));
                    456:          register tree dsize = DECL_SIZE (field);
                    457:          int field_size = TREE_INT_CST_LOW (dsize);
                    458: 
1.1.1.4   root      459:          if (maximum_field_alignment != 0)
                    460:            type_align = MIN (type_align, maximum_field_alignment);
1.1.1.8 ! root      461:          else if (flag_pack_struct)
        !           462:            type_align = MIN (type_align, BITS_PER_UNIT);
1.1.1.4   root      463: 
1.1       root      464:          /* A bit field may not span the unit of alignment of its type.
                    465:             Advance to next boundary if necessary.  */
                    466:          if (const_size / type_align
                    467:              != (const_size + field_size - 1) / type_align)
                    468:            const_size = CEIL (const_size, type_align) * type_align;
                    469:        }
                    470: #endif
                    471: 
                    472:       /* Size so far becomes the position of this field.  */
                    473: 
                    474:       if (var_size && const_size)
                    475:        DECL_FIELD_BITPOS (field)
                    476:          = size_binop (PLUS_EXPR, var_size, size_int (const_size));
                    477:       else if (var_size)
                    478:        DECL_FIELD_BITPOS (field) = var_size;
                    479:       else
1.1.1.7   root      480:        {
                    481:          DECL_FIELD_BITPOS (field) = size_int (const_size);
                    482: 
                    483:          /* If this field ended up more aligned than we thought it
                    484:             would be (we approximate this by seeing if its position
                    485:             changed), lay out the field again; perhaps we can use an
                    486:             integral mode for it now.  */
                    487:          if (known_align != const_size)
                    488:            layout_decl (field, const_size);
                    489:        }
1.1       root      490: 
                    491:       /* Now add size of this field to the size of the record.  */
                    492: 
                    493:       {
                    494:         register tree dsize = DECL_SIZE (field);
                    495: 
1.1.1.4   root      496:        /* This can happen when we have an invalid nested struct definition,
                    497:           such as struct j { struct j { int i; } }.  The error message is
                    498:           printed in finish_struct.  */
                    499:        if (dsize == 0)
                    500:          /* Do nothing.  */;
1.1.1.5   root      501:        else if (TREE_CODE (dsize) == INTEGER_CST
                    502:                 && TREE_INT_CST_HIGH (dsize) == 0
                    503:                 && TREE_INT_CST_LOW (dsize) + const_size > const_size)
                    504:          /* Use const_size if there's no overflow.  */
1.1       root      505:          const_size += TREE_INT_CST_LOW (dsize);
                    506:        else
                    507:          {
                    508:            if (var_size == 0)
                    509:              var_size = dsize;
                    510:            else
                    511:              var_size = size_binop (PLUS_EXPR, var_size, dsize);
                    512:          }
                    513:       }
                    514:     }
                    515: 
                    516:   /* Work out the total size and alignment of the record
                    517:      as one expression and store in the record type.
                    518:      Round it up to a multiple of the record's alignment.  */
                    519: 
                    520:   if (var_size == 0)
                    521:     {
                    522:       TYPE_SIZE (rec) = size_int (const_size);
                    523:     }
                    524:   else
                    525:     {
                    526:       if (const_size)
                    527:        var_size
                    528:          = size_binop (PLUS_EXPR, var_size, size_int (const_size));
                    529:       TYPE_SIZE (rec) = var_size;
                    530:     }
                    531: 
                    532:   /* Determine the desired alignment.  */
                    533: #ifdef ROUND_TYPE_ALIGN
                    534:   TYPE_ALIGN (rec) = ROUND_TYPE_ALIGN (rec, TYPE_ALIGN (rec), record_align);
                    535: #else
                    536:   TYPE_ALIGN (rec) = MAX (TYPE_ALIGN (rec), record_align);
                    537: #endif
                    538: 
                    539: #ifdef ROUND_TYPE_SIZE
                    540:   TYPE_SIZE (rec) = ROUND_TYPE_SIZE (rec, TYPE_SIZE (rec), TYPE_ALIGN (rec));
                    541: #else
                    542:   /* Round the size up to be a multiple of the required alignment */
                    543:   TYPE_SIZE (rec) = round_up (TYPE_SIZE (rec), TYPE_ALIGN (rec));
                    544: #endif
                    545: 
                    546:   return pending_statics;
                    547: }
                    548: 
1.1.1.5   root      549: /* Lay out a UNION_TYPE or QUAL_UNION_TYPE type.
1.1       root      550:    Lay out all the fields, set their positions to zero,
                    551:    and compute the size and alignment of the union (maximum of any field).
                    552:    Note that if you set the TYPE_ALIGN before calling this
                    553:    then the union align is aligned to at least that boundary.  */
                    554: 
                    555: static void
                    556: layout_union (rec)
                    557:      tree rec;
                    558: {
                    559:   register tree field;
                    560: #ifdef STRUCTURE_SIZE_BOUNDARY
                    561:   unsigned union_align = STRUCTURE_SIZE_BOUNDARY;
                    562: #else
                    563:   unsigned union_align = BITS_PER_UNIT;
                    564: #endif
                    565: 
                    566:   /* The size of the union, based on the fields scanned so far,
                    567:      is max (CONST_SIZE, VAR_SIZE).
                    568:      VAR_SIZE may be null; then CONST_SIZE by itself is the size.  */
                    569:   register int const_size = 0;
                    570:   register tree var_size = 0;
                    571: 
1.1.1.5   root      572:   /* If this is a QUAL_UNION_TYPE, we want to process the fields in
                    573:      the reverse order in building the COND_EXPR that denotes its
                    574:      size.  We reverse them again later.  */
                    575:   if (TREE_CODE (rec) == QUAL_UNION_TYPE)
                    576:     TYPE_FIELDS (rec) = nreverse (TYPE_FIELDS (rec));
                    577: 
1.1       root      578:   for (field = TYPE_FIELDS (rec); field; field = TREE_CHAIN (field))
                    579:     {
                    580:       /* Enums which are local to this class need not be laid out.  */
                    581:       if (TREE_CODE (field) == CONST_DECL || TREE_CODE (field) == TYPE_DECL)
                    582:        continue;
                    583: 
                    584:       layout_decl (field, 0);
                    585:       DECL_FIELD_BITPOS (field) = size_int (0);
                    586: 
                    587:       /* Union must be at least as aligned as any field requires.  */
                    588: 
                    589:       union_align = MAX (union_align, DECL_ALIGN (field));
                    590: 
                    591: #ifdef PCC_BITFIELD_TYPE_MATTERS
                    592:       /* On the m88000, a bit field of declare type `int'
                    593:         forces the entire union to have `int' alignment.  */
1.1.1.3   root      594:       if (PCC_BITFIELD_TYPE_MATTERS && DECL_BIT_FIELD_TYPE (field))
1.1       root      595:        union_align = MAX (union_align, TYPE_ALIGN (TREE_TYPE (field)));
                    596: #endif
                    597: 
1.1.1.5   root      598:       if (TREE_CODE (rec) == UNION_TYPE)
                    599:        {
                    600:          /* Set union_size to max (decl_size, union_size).
                    601:             There are more and less general ways to do this.
                    602:             Use only CONST_SIZE unless forced to use VAR_SIZE.  */
                    603: 
                    604:          if (TREE_CODE (DECL_SIZE (field)) == INTEGER_CST)
                    605:            const_size
                    606:              = MAX (const_size, TREE_INT_CST_LOW (DECL_SIZE (field)));
                    607:          else if (var_size == 0)
                    608:            var_size = DECL_SIZE (field);
                    609:          else
                    610:            var_size = size_binop (MAX_EXPR, var_size, DECL_SIZE (field));
                    611:        }
                    612:       else if (TREE_CODE (rec) == QUAL_UNION_TYPE)
                    613:        var_size = fold (build (COND_EXPR, sizetype, DECL_QUALIFIER (field),
                    614:                                DECL_SIZE (field),
                    615:                                var_size ? var_size : integer_zero_node));
                    616:       }
                    617: 
                    618:   if (TREE_CODE (rec) == QUAL_UNION_TYPE)
                    619:     TYPE_FIELDS (rec) = nreverse (TYPE_FIELDS (rec));
1.1       root      620: 
                    621:   /* Determine the ultimate size of the union (in bytes).  */
                    622:   if (NULL == var_size)
                    623:     TYPE_SIZE (rec) = size_int (CEIL (const_size, BITS_PER_UNIT)
                    624:                                * BITS_PER_UNIT);
                    625:   else if (const_size == 0)
                    626:     TYPE_SIZE (rec) = var_size;
                    627:   else
                    628:     TYPE_SIZE (rec) = size_binop (MAX_EXPR, var_size,
                    629:                                  round_up (size_int (const_size),
                    630:                                            BITS_PER_UNIT));
                    631: 
                    632:   /* Determine the desired alignment.  */
                    633: #ifdef ROUND_TYPE_ALIGN
                    634:   TYPE_ALIGN (rec) = ROUND_TYPE_ALIGN (rec, TYPE_ALIGN (rec), union_align);
                    635: #else
                    636:   TYPE_ALIGN (rec) = MAX (TYPE_ALIGN (rec), union_align);
                    637: #endif
                    638: 
                    639: #ifdef ROUND_TYPE_SIZE
                    640:   TYPE_SIZE (rec) = ROUND_TYPE_SIZE (rec, TYPE_SIZE (rec), TYPE_ALIGN (rec));
                    641: #else
                    642:   /* Round the size up to be a multiple of the required alignment */
                    643:   TYPE_SIZE (rec) = round_up (TYPE_SIZE (rec), TYPE_ALIGN (rec));
                    644: #endif
                    645: }
                    646: 
                    647: /* Calculate the mode, size, and alignment for TYPE.
                    648:    For an array type, calculate the element separation as well.
                    649:    Record TYPE on the chain of permanent or temporary types
                    650:    so that dbxout will find out about it.
                    651: 
                    652:    TYPE_SIZE of a type is nonzero if the type has been laid out already.
                    653:    layout_type does nothing on such a type.
                    654: 
                    655:    If the type is incomplete, its TYPE_SIZE remains zero.  */
                    656: 
                    657: void
                    658: layout_type (type)
                    659:      tree type;
                    660: {
                    661:   int old;
                    662:   tree pending_statics;
                    663: 
                    664:   if (type == 0)
                    665:     abort ();
                    666: 
                    667:   /* Do nothing if type has been laid out before.  */
                    668:   if (TYPE_SIZE (type))
                    669:     return;
                    670: 
                    671:   /* Make sure all nodes we allocate are not momentary;
                    672:      they must last past the current statement.  */
                    673:   old = suspend_momentary ();
                    674: 
1.1.1.6   root      675:   /* Put all our nodes into the same obstack as the type.  Also,
                    676:      make expressions saveable (this is a no-op for permanent types).  */
                    677: 
                    678:   push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type));
                    679:   saveable_allocation ();
1.1       root      680: 
                    681:   switch (TREE_CODE (type))
                    682:     {
                    683:     case LANG_TYPE:
                    684:       /* This kind of type is the responsibility
1.1.1.8 ! root      685:         of the language-specific code.  */
1.1       root      686:       abort ();
                    687: 
                    688:     case INTEGER_TYPE:
                    689:     case ENUMERAL_TYPE:
1.1.1.7   root      690:       if (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
                    691:          && tree_int_cst_sgn (TYPE_MIN_VALUE (type)) >= 0)
1.1       root      692:        TREE_UNSIGNED (type) = 1;
                    693: 
1.1.1.6   root      694:       TYPE_MODE (type) = smallest_mode_for_size (TYPE_PRECISION (type),
                    695:                                                 MODE_INT);
1.1       root      696:       TYPE_SIZE (type) = size_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
                    697:       break;
                    698: 
                    699:     case REAL_TYPE:
                    700:       TYPE_MODE (type) = mode_for_size (TYPE_PRECISION (type), MODE_FLOAT, 0);
                    701:       TYPE_SIZE (type) = size_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
                    702:       break;
                    703: 
                    704:     case COMPLEX_TYPE:
                    705:       TREE_UNSIGNED (type) = TREE_UNSIGNED (TREE_TYPE (type));
                    706:       TYPE_MODE (type)
                    707:        = mode_for_size (2 * TYPE_PRECISION (TREE_TYPE (type)),
                    708:                         (TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE
                    709:                          ? MODE_COMPLEX_INT : MODE_COMPLEX_FLOAT),
                    710:                         0);
                    711:       TYPE_SIZE (type) = size_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
                    712:       break;
                    713: 
                    714:     case VOID_TYPE:
                    715:       TYPE_SIZE (type) = size_zero_node;
                    716:       TYPE_ALIGN (type) = 1;
                    717:       TYPE_MODE (type) = VOIDmode;
                    718:       break;
                    719: 
1.1.1.2   root      720:     case OFFSET_TYPE:
1.1.1.7   root      721:       TYPE_SIZE (type) = size_int (POINTER_SIZE);
1.1.1.8 ! root      722:       TYPE_MODE (type) = ptr_mode;
1.1.1.2   root      723:       break;
                    724: 
1.1       root      725:     case FUNCTION_TYPE:
                    726:     case METHOD_TYPE:
1.1.1.7   root      727:       TYPE_MODE (type) = mode_for_size (2 * POINTER_SIZE, MODE_INT, 0);
                    728:       TYPE_SIZE (type) = size_int (2 * POINTER_SIZE);
1.1       root      729:       break;
                    730: 
                    731:     case POINTER_TYPE:
                    732:     case REFERENCE_TYPE:
1.1.1.8 ! root      733:       TYPE_MODE (type) = ptr_mode;
1.1.1.7   root      734:       TYPE_SIZE (type) = size_int (POINTER_SIZE);
1.1       root      735:       TREE_UNSIGNED (type) = 1;
1.1.1.7   root      736:       TYPE_PRECISION (type) = POINTER_SIZE;
1.1       root      737:       break;
                    738: 
                    739:     case ARRAY_TYPE:
                    740:       {
                    741:        register tree index = TYPE_DOMAIN (type);
                    742:        register tree element = TREE_TYPE (type);
                    743: 
                    744:        build_pointer_type (element);
                    745: 
                    746:        /* We need to know both bounds in order to compute the size.  */
                    747:        if (index && TYPE_MAX_VALUE (index) && TYPE_MIN_VALUE (index)
                    748:            && TYPE_SIZE (element))
                    749:          {
1.1.1.8 ! root      750:            tree ub = TYPE_MAX_VALUE (index);
        !           751:            tree lb = TYPE_MIN_VALUE (index);
        !           752:            tree length;
        !           753: 
        !           754:            /* If UB is max (lb - 1, x), remove the MAX_EXPR since the
        !           755:               test for negative below covers it.  */
        !           756:            if (TREE_CODE (ub) == MAX_EXPR
        !           757:                && TREE_CODE (TREE_OPERAND (ub, 0)) == MINUS_EXPR
        !           758:                && integer_onep (TREE_OPERAND (TREE_OPERAND (ub, 0), 1))
        !           759:                && operand_equal_p (TREE_OPERAND (TREE_OPERAND (ub, 0), 0),
        !           760:                                    lb, 0))
        !           761:              ub = TREE_OPERAND (ub, 1);
        !           762:            else if (TREE_CODE (ub) == MAX_EXPR
        !           763:                     && TREE_CODE (TREE_OPERAND (ub, 1)) == MINUS_EXPR
        !           764:                     && integer_onep (TREE_OPERAND (TREE_OPERAND (ub, 1), 1))
        !           765:                     && operand_equal_p (TREE_OPERAND (TREE_OPERAND (ub, 1),
        !           766:                                                       0),
        !           767:                                         lb, 0))
        !           768:              ub = TREE_OPERAND (ub, 0);
        !           769: 
        !           770:            length = size_binop (PLUS_EXPR, size_one_node,
        !           771:                                 size_binop (MINUS_EXPR, ub, lb));
        !           772: 
        !           773:            /* If neither bound is a constant and sizetype is signed, make
        !           774:               sure the size is never negative.  We should really do this
        !           775:               if *either* bound is non-constant, but this is the best
        !           776:               compromise between C and Ada.  */
        !           777:            if (! TREE_UNSIGNED (sizetype)
        !           778:                && TREE_CODE (TYPE_MIN_VALUE (index)) != INTEGER_CST
        !           779:                && TREE_CODE (TYPE_MAX_VALUE (index)) != INTEGER_CST)
        !           780:              length = size_binop (MAX_EXPR, length, size_zero_node);
1.1       root      781: 
                    782:            TYPE_SIZE (type) = size_binop (MULT_EXPR, length,
                    783:                                           TYPE_SIZE (element));
                    784:          }
                    785: 
                    786:        /* Now round the alignment and size,
                    787:           using machine-dependent criteria if any.  */
                    788: 
                    789: #ifdef ROUND_TYPE_ALIGN
                    790:        TYPE_ALIGN (type)
                    791:          = ROUND_TYPE_ALIGN (type, TYPE_ALIGN (element), BITS_PER_UNIT);
                    792: #else
                    793:        TYPE_ALIGN (type) = MAX (TYPE_ALIGN (element), BITS_PER_UNIT);
                    794: #endif
                    795: 
                    796: #ifdef ROUND_TYPE_SIZE
                    797:        if (TYPE_SIZE (type) != 0)
                    798:          TYPE_SIZE (type)
                    799:            = ROUND_TYPE_SIZE (type, TYPE_SIZE (type), TYPE_ALIGN (type));
                    800: #endif
                    801: 
                    802:        TYPE_MODE (type) = BLKmode;
                    803:        if (TYPE_SIZE (type) != 0
                    804:            && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
                    805:            /* BLKmode elements force BLKmode aggregate;
                    806:               else extract/store fields may lose.  */
                    807:            && (TYPE_MODE (TREE_TYPE (type)) != BLKmode
                    808:                || TYPE_NO_FORCE_BLK (TREE_TYPE (type))))
                    809:          {
                    810:            TYPE_MODE (type)
                    811:              = mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)),
                    812:                               MODE_INT, 1);
                    813: 
1.1.1.2   root      814:            if (STRICT_ALIGNMENT && TYPE_ALIGN (type) < BIGGEST_ALIGNMENT
1.1       root      815:                && TYPE_ALIGN (type) < TREE_INT_CST_LOW (TYPE_SIZE (type))
                    816:                && TYPE_MODE (type) != BLKmode)
                    817:              {
                    818:                TYPE_NO_FORCE_BLK (type) = 1;
                    819:                TYPE_MODE (type) = BLKmode;
                    820:              }
                    821:          }
                    822:        break;
                    823:       }
                    824: 
                    825:     case RECORD_TYPE:
                    826:       pending_statics = layout_record (type);
                    827:       TYPE_MODE (type) = BLKmode;
                    828:       if (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
                    829:        {
                    830:          tree field;
                    831:          /* A record which has any BLKmode members must itself be BLKmode;
                    832:             it can't go in a register.
                    833:             Unless the member is BLKmode only because it isn't aligned.  */
                    834:          for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
                    835:            {
                    836:              int bitpos;
                    837: 
                    838:              if (TREE_CODE (field) != FIELD_DECL)
                    839:                continue;
                    840: 
                    841:              if (TYPE_MODE (TREE_TYPE (field)) == BLKmode
                    842:                  && ! TYPE_NO_FORCE_BLK (TREE_TYPE (field)))
                    843:                goto record_lose;
                    844: 
                    845:              if (TREE_CODE (DECL_FIELD_BITPOS (field)) != INTEGER_CST)
                    846:                goto record_lose;
                    847: 
                    848:              bitpos = TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field));
                    849: 
                    850:              /* Must be BLKmode if any field crosses a word boundary,
                    851:                 since extract_bit_field can't handle that in registers.  */
                    852:              if (bitpos / BITS_PER_WORD
                    853:                  != ((TREE_INT_CST_LOW (DECL_SIZE (field)) + bitpos - 1)
                    854:                      / BITS_PER_WORD)
                    855:                  /* But there is no problem if the field is entire words.  */
                    856:                  && TREE_INT_CST_LOW (DECL_SIZE (field)) % BITS_PER_WORD == 0)
                    857:                goto record_lose;
                    858:            }
                    859: 
                    860:          TYPE_MODE (type)
                    861:            = mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)),
                    862:                             MODE_INT, 1);
                    863: 
                    864:          /* If structure's known alignment is less than
                    865:             what the scalar mode would need, and it matters,
                    866:             then stick with BLKmode.  */
1.1.1.2   root      867:          if (STRICT_ALIGNMENT
                    868:              && ! (TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT
                    869:                    || (TYPE_ALIGN (type)
                    870:                        >= TREE_INT_CST_LOW (TYPE_SIZE (type)))))
1.1       root      871:            {
                    872:              if (TYPE_MODE (type) != BLKmode)
                    873:                /* If this is the only reason this type is BLKmode,
                    874:                   then don't force containing types to be BLKmode.  */
                    875:                TYPE_NO_FORCE_BLK (type) = 1;
                    876:              TYPE_MODE (type) = BLKmode;
                    877:            }
1.1.1.2   root      878: 
1.1       root      879:        record_lose: ;
                    880:        }
                    881: 
                    882:       /* Lay out any static members.  This is done now
                    883:         because their type may use the record's type.  */
                    884:       while (pending_statics)
                    885:        {
                    886:          layout_decl (TREE_VALUE (pending_statics), 0);
                    887:          pending_statics = TREE_CHAIN (pending_statics);
                    888:        }
                    889:       break;
                    890: 
                    891:     case UNION_TYPE:
1.1.1.5   root      892:     case QUAL_UNION_TYPE:
1.1       root      893:       layout_union (type);
                    894:       TYPE_MODE (type) = BLKmode;
                    895:       if (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
                    896:          /* If structure's known alignment is less than
                    897:             what the scalar mode would need, and it matters,
                    898:             then stick with BLKmode.  */
1.1.1.2   root      899:          && (! STRICT_ALIGNMENT
                    900:              || TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT
                    901:              || TYPE_ALIGN (type) >= TREE_INT_CST_LOW (TYPE_SIZE (type))))
1.1       root      902:        {
                    903:          tree field;
                    904:          /* A union which has any BLKmode members must itself be BLKmode;
                    905:             it can't go in a register.
                    906:             Unless the member is BLKmode only because it isn't aligned.  */
                    907:          for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
                    908:            {
                    909:              if (TREE_CODE (field) != FIELD_DECL)
                    910:                continue;
                    911: 
                    912:              if (TYPE_MODE (TREE_TYPE (field)) == BLKmode
                    913:                  && ! TYPE_NO_FORCE_BLK (TREE_TYPE (field)))
                    914:                goto union_lose;
                    915:            }
                    916: 
                    917:          TYPE_MODE (type)
                    918:            = mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)),
                    919:                             MODE_INT, 1);
                    920: 
                    921:        union_lose: ;
                    922:        }
                    923:       break;
                    924: 
1.1.1.7   root      925:     /* Pascal and Chill types */
1.1.1.4   root      926:     case BOOLEAN_TYPE:          /* store one byte/boolean for now. */
                    927:       TYPE_MODE (type) = QImode;
                    928:       TYPE_SIZE (type) = size_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
                    929:       TYPE_PRECISION (type) = 1;
                    930:       TYPE_ALIGN (type) = GET_MODE_ALIGNMENT (TYPE_MODE (type));
1.1.1.7   root      931:       if (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
                    932:          && tree_int_cst_sgn (TYPE_MIN_VALUE (type)) >= 0)
                    933:        TREE_UNSIGNED (type) = 1;
1.1.1.4   root      934:       break;
                    935: 
                    936:     case CHAR_TYPE:
                    937:       TYPE_MODE (type) = QImode;
                    938:       TYPE_SIZE (type) = size_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
                    939:       TYPE_PRECISION (type) = GET_MODE_BITSIZE (TYPE_MODE (type));
                    940:       TYPE_ALIGN (type) = GET_MODE_ALIGNMENT (TYPE_MODE (type));
                    941:       break;
                    942: 
1.1.1.7   root      943:     case SET_TYPE:
                    944:       if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) != INTEGER_CST
                    945:          || TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) != INTEGER_CST)
                    946:        abort();
                    947:       else
                    948:        {
                    949: #ifndef SET_WORD_SIZE
                    950: #define SET_WORD_SIZE BITS_PER_WORD
                    951: #endif
                    952:          int alignment = set_alignment ? set_alignment : SET_WORD_SIZE;
                    953:          int size_in_bits =
                    954:            TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
                    955:              - TREE_INT_CST_LOW (TYPE_MIN_VALUE (TYPE_DOMAIN (type))) + 1;
                    956:          int rounded_size
                    957:            = ((size_in_bits + alignment - 1) / alignment) * alignment;
                    958:          if (rounded_size > alignment)
                    959:            TYPE_MODE (type) = BLKmode;
                    960:          else
                    961:            TYPE_MODE (type) = mode_for_size (alignment, MODE_INT, 1);
                    962:          TYPE_SIZE (type) = size_int (rounded_size);
                    963:          TYPE_ALIGN (type) = alignment;
                    964:          TYPE_PRECISION (type) = size_in_bits;
                    965:        }
                    966:       break;
                    967: 
1.1.1.4   root      968:     case FILE_TYPE:
                    969:       /* The size may vary in different languages, so the language front end
                    970:         should fill in the size.  */
                    971:       TYPE_ALIGN (type) = BIGGEST_ALIGNMENT;
                    972:       TYPE_MODE  (type) = BLKmode;
                    973:       break;
                    974: 
1.1       root      975:     default:
                    976:       abort ();
                    977:     } /* end switch */
                    978: 
                    979:   /* Normally, use the alignment corresponding to the mode chosen.
                    980:      However, where strict alignment is not required, avoid
                    981:      over-aligning structures, since most compilers do not do this
                    982:      alignment.  */
                    983: 
                    984:   if (TYPE_MODE (type) != BLKmode && TYPE_MODE (type) != VOIDmode
1.1.1.2   root      985:       && (STRICT_ALIGNMENT
                    986:          || (TREE_CODE (type) != RECORD_TYPE && TREE_CODE (type) != UNION_TYPE
1.1.1.5   root      987:              && TREE_CODE (type) != QUAL_UNION_TYPE
1.1.1.2   root      988:              && TREE_CODE (type) != ARRAY_TYPE)))
1.1       root      989:     TYPE_ALIGN (type) = GET_MODE_ALIGNMENT (TYPE_MODE (type));
                    990: 
                    991:   /* Evaluate nonconstant size only once, either now or as soon as safe.  */
                    992:   if (TYPE_SIZE (type) != 0 && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
                    993:     TYPE_SIZE (type) = variable_size (TYPE_SIZE (type));
                    994: 
                    995:   /* Also layout any other variants of the type.  */
                    996:   if (TYPE_NEXT_VARIANT (type)
                    997:       || type != TYPE_MAIN_VARIANT (type))
                    998:     {
                    999:       tree variant;
                   1000:       /* Record layout info of this variant.  */
                   1001:       tree size = TYPE_SIZE (type);
                   1002:       int align = TYPE_ALIGN (type);
                   1003:       enum machine_mode mode = TYPE_MODE (type);
                   1004: 
                   1005:       /* Copy it into all variants.  */
                   1006:       for (variant = TYPE_MAIN_VARIANT (type);
                   1007:           variant;
                   1008:           variant = TYPE_NEXT_VARIANT (variant))
                   1009:        {
                   1010:          TYPE_SIZE (variant) = size;
                   1011:          TYPE_ALIGN (variant) = align;
                   1012:          TYPE_MODE (variant) = mode;
                   1013:        }
                   1014:     }
                   1015:        
                   1016:   pop_obstacks ();
                   1017:   resume_momentary (old);
                   1018: }
                   1019: 
                   1020: /* Create and return a type for signed integers of PRECISION bits.  */
                   1021: 
                   1022: tree
                   1023: make_signed_type (precision)
                   1024:      int precision;
                   1025: {
                   1026:   register tree type = make_node (INTEGER_TYPE);
                   1027: 
                   1028:   TYPE_PRECISION (type) = precision;
                   1029: 
                   1030:   /* Create the extreme values based on the number of bits.  */
                   1031: 
                   1032:   TYPE_MIN_VALUE (type)
1.1.1.4   root     1033:     = build_int_2 ((precision - HOST_BITS_PER_WIDE_INT > 0
                   1034:                    ? 0 : (HOST_WIDE_INT) (-1) << (precision - 1)),
                   1035:                   (((HOST_WIDE_INT) (-1)
                   1036:                     << (precision - HOST_BITS_PER_WIDE_INT - 1 > 0
1.1.1.5   root     1037:                         ? precision - HOST_BITS_PER_WIDE_INT - 1
1.1.1.4   root     1038:                         : 0))));
1.1       root     1039:   TYPE_MAX_VALUE (type)
1.1.1.5   root     1040:     = build_int_2 ((precision - HOST_BITS_PER_WIDE_INT > 0
1.1.1.4   root     1041:                    ? -1 : ((HOST_WIDE_INT) 1 << (precision - 1)) - 1),
                   1042:                   (precision - HOST_BITS_PER_WIDE_INT - 1 > 0
                   1043:                    ? (((HOST_WIDE_INT) 1
1.1.1.5   root     1044:                        << (precision - HOST_BITS_PER_WIDE_INT - 1))) - 1
1.1       root     1045:                    : 0));
                   1046: 
                   1047:   /* Give this type's extreme values this type as their type.  */
                   1048: 
                   1049:   TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
                   1050:   TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
                   1051: 
                   1052:   /* The first type made with this or `make_unsigned_type'
                   1053:      is the type for size values.  */
                   1054: 
                   1055:   if (sizetype == 0)
                   1056:     {
                   1057:       sizetype = type;
                   1058:     }
                   1059: 
                   1060:   /* Lay out the type: set its alignment, size, etc.  */
                   1061: 
                   1062:   layout_type (type);
                   1063: 
                   1064:   return type;
                   1065: }
                   1066: 
                   1067: /* Create and return a type for unsigned integers of PRECISION bits.  */
                   1068: 
                   1069: tree
                   1070: make_unsigned_type (precision)
                   1071:      int precision;
                   1072: {
                   1073:   register tree type = make_node (INTEGER_TYPE);
                   1074: 
                   1075:   TYPE_PRECISION (type) = precision;
                   1076: 
                   1077:   /* The first type made with this or `make_signed_type'
                   1078:      is the type for size values.  */
                   1079: 
                   1080:   if (sizetype == 0)
                   1081:     {
                   1082:       sizetype = type;
                   1083:     }
                   1084: 
                   1085:   fixup_unsigned_type (type);
                   1086:   return type;
                   1087: }
                   1088: 
                   1089: /* Set the extreme values of TYPE based on its precision in bits,
1.1.1.5   root     1090:    then lay it out.  Used when make_signed_type won't do
1.1.1.4   root     1091:    because the tree code is not INTEGER_TYPE.
                   1092:    E.g. for Pascal, when the -fsigned-char option is given.  */
                   1093: 
                   1094: void
                   1095: fixup_signed_type (type)
                   1096:      tree type;
                   1097: {
                   1098:   register int precision = TYPE_PRECISION (type);
                   1099: 
                   1100:   TYPE_MIN_VALUE (type)
1.1.1.5   root     1101:     = build_int_2 ((precision - HOST_BITS_PER_WIDE_INT > 0
                   1102:                    ? 0 : (HOST_WIDE_INT) (-1) << (precision - 1)),
                   1103:                   (((HOST_WIDE_INT) (-1)
                   1104:                     << (precision - HOST_BITS_PER_WIDE_INT - 1 > 0
                   1105:                         ? precision - HOST_BITS_PER_WIDE_INT - 1
                   1106:                         : 0))));
1.1.1.4   root     1107:   TYPE_MAX_VALUE (type)
1.1.1.5   root     1108:     = build_int_2 ((precision - HOST_BITS_PER_WIDE_INT > 0
                   1109:                    ? -1 : ((HOST_WIDE_INT) 1 << (precision - 1)) - 1),
                   1110:                   (precision - HOST_BITS_PER_WIDE_INT - 1 > 0
                   1111:                    ? (((HOST_WIDE_INT) 1
                   1112:                        << (precision - HOST_BITS_PER_WIDE_INT - 1))) - 1
1.1.1.4   root     1113:                    : 0));
                   1114: 
                   1115:   TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
                   1116:   TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
                   1117: 
                   1118:   /* Lay out the type: set its alignment, size, etc.  */
                   1119: 
                   1120:   layout_type (type);
                   1121: }
                   1122: 
                   1123: /* Set the extreme values of TYPE based on its precision in bits,
1.1.1.5   root     1124:    then lay it out.  This is used both in `make_unsigned_type'
1.1       root     1125:    and for enumeral types.  */
                   1126: 
                   1127: void
                   1128: fixup_unsigned_type (type)
                   1129:      tree type;
                   1130: {
                   1131:   register int precision = TYPE_PRECISION (type);
                   1132: 
                   1133:   TYPE_MIN_VALUE (type) = build_int_2 (0, 0);
                   1134:   TYPE_MAX_VALUE (type)
1.1.1.4   root     1135:     = build_int_2 (precision - HOST_BITS_PER_WIDE_INT >= 0
1.1.1.5   root     1136:                   ? -1 : ((HOST_WIDE_INT) 1 << precision) - 1,
1.1.1.4   root     1137:                   precision - HOST_BITS_PER_WIDE_INT > 0
                   1138:                   ? ((unsigned HOST_WIDE_INT) ~0
                   1139:                      >> (HOST_BITS_PER_WIDE_INT
                   1140:                          - (precision - HOST_BITS_PER_WIDE_INT)))
1.1       root     1141:                   : 0);
                   1142:   TREE_TYPE (TYPE_MIN_VALUE (type)) = type;
                   1143:   TREE_TYPE (TYPE_MAX_VALUE (type)) = type;
                   1144: 
                   1145:   /* Lay out the type: set its alignment, size, etc.  */
                   1146: 
                   1147:   layout_type (type);
                   1148: }
                   1149: 
                   1150: /* Find the best machine mode to use when referencing a bit field of length
                   1151:    BITSIZE bits starting at BITPOS.
                   1152: 
                   1153:    The underlying object is known to be aligned to a boundary of ALIGN bits.
                   1154:    If LARGEST_MODE is not VOIDmode, it means that we should not use a mode
                   1155:    larger than LARGEST_MODE (usually SImode).
                   1156: 
                   1157:    If no mode meets all these conditions, we return VOIDmode.  Otherwise, if
                   1158:    VOLATILEP is true or SLOW_BYTE_ACCESS is false, we return the smallest
                   1159:    mode meeting these conditions.
                   1160: 
1.1.1.4   root     1161:    Otherwise (VOLATILEP is false and SLOW_BYTE_ACCESS is true), we return
                   1162:    the largest mode (but a mode no wider than UNITS_PER_WORD) that meets
                   1163:    all the conditions.  */
1.1       root     1164: 
                   1165: enum machine_mode
                   1166: get_best_mode (bitsize, bitpos, align, largest_mode, volatilep)
                   1167:      int bitsize, bitpos;
                   1168:      int align;
                   1169:      enum machine_mode largest_mode;
                   1170:      int volatilep;
                   1171: {
                   1172:   enum machine_mode mode;
                   1173:   int unit;
                   1174: 
                   1175:   /* Find the narrowest integer mode that contains the bit field.  */
                   1176:   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
                   1177:        mode = GET_MODE_WIDER_MODE (mode))
                   1178:     {
                   1179:       unit = GET_MODE_BITSIZE (mode);
                   1180:       if (bitpos / unit == (bitpos + bitsize - 1) / unit)
                   1181:        break;
                   1182:     }
                   1183: 
                   1184:   if (mode == MAX_MACHINE_MODE
                   1185:       /* It is tempting to omit the following line
1.1.1.2   root     1186:         if STRICT_ALIGNMENT is true.
1.1       root     1187:         But that is incorrect, since if the bitfield uses part of 3 bytes
                   1188:         and we use a 4-byte mode, we could get a spurious segv
                   1189:         if the extra 4th byte is past the end of memory.
                   1190:         (Though at least one Unix compiler ignores this problem:
                   1191:         that on the Sequent 386 machine.  */
                   1192:       || MIN (unit, BIGGEST_ALIGNMENT) > align
                   1193:       || (largest_mode != VOIDmode && unit > GET_MODE_BITSIZE (largest_mode)))
                   1194:     return VOIDmode;
                   1195: 
1.1.1.4   root     1196:   if (SLOW_BYTE_ACCESS && ! volatilep)
                   1197:     {
                   1198:       enum machine_mode wide_mode = VOIDmode, tmode;
                   1199: 
                   1200:       for (tmode = GET_CLASS_NARROWEST_MODE (MODE_INT); tmode != VOIDmode;
                   1201:           tmode = GET_MODE_WIDER_MODE (tmode))
                   1202:        {
                   1203:          unit = GET_MODE_BITSIZE (tmode);
                   1204:          if (bitpos / unit == (bitpos + bitsize - 1) / unit
                   1205:              && unit <= BITS_PER_WORD
                   1206:              && unit <= MIN (align, BIGGEST_ALIGNMENT)
                   1207:              && (largest_mode == VOIDmode
                   1208:                  || unit <= GET_MODE_BITSIZE (largest_mode)))
                   1209:            wide_mode = tmode;
                   1210:        }
                   1211: 
                   1212:       if (wide_mode != VOIDmode)
                   1213:        return wide_mode;
                   1214:     }
1.1       root     1215: 
                   1216:   return mode;
                   1217: }
                   1218: 
                   1219: /* Save all variables describing the current status into the structure *P.
                   1220:    This is used before starting a nested function.  */
                   1221: 
                   1222: void
                   1223: save_storage_status (p)
                   1224:      struct function *p;
                   1225: {
                   1226: #if 0  /* Need not save, since always 0 and non0 (resp.) within a function.  */
                   1227:   p->pending_sizes = pending_sizes;
                   1228:   p->immediate_size_expand = immediate_size_expand;
                   1229: #endif /* 0 */
                   1230: }
                   1231: 
                   1232: /* Restore all variables describing the current status from the structure *P.
                   1233:    This is used after a nested function.  */
                   1234: 
                   1235: void
                   1236: restore_storage_status (p)
                   1237:      struct function *p;
                   1238: {
                   1239: #if 0
                   1240:   pending_sizes = p->pending_sizes;
                   1241:   immediate_size_expand = p->immediate_size_expand;
                   1242: #endif /* 0 */
                   1243: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.