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

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

unix.superglobalmegacorp.com

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