Annotation of GNUtools/cc/stor-layout.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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