Annotation of gcc/c-common.c, revision 1.1.1.1

1.1       root        1: /* Subroutines shared by all languages that are variants of C.
                      2:    Copyright (C) 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: #include "config.h"
                     21: #include "tree.h"
                     22: #include "c-lex.h"
                     23: #include "c-tree.h"
                     24: #include "flags.h"
                     25: #include <stdio.h>
                     26: 
                     27: #undef NULL
                     28: #define NULL 0
                     29: 
                     30: /* Given a chain of STRING_CST nodes,
                     31:    concatenate them into one STRING_CST
                     32:    and give it a suitable array-of-chars data type.  */
                     33: 
                     34: tree
                     35: combine_strings (strings)
                     36:      tree strings;
                     37: {
                     38:   register tree value, t;
                     39:   register int length = 1;
                     40:   int wide_length = 0;
                     41:   int wide_flag = 0;
                     42:   int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
                     43:   int nchars;
                     44: 
                     45:   if (TREE_CHAIN (strings))
                     46:     {
                     47:       /* More than one in the chain, so concatenate.  */
                     48:       register char *p, *q;
                     49: 
                     50:       /* Don't include the \0 at the end of each substring,
                     51:         except for the last one.
                     52:         Count wide strings and ordinary strings separately.  */
                     53:       for (t = strings; t; t = TREE_CHAIN (t))
                     54:        {
                     55:          if (TREE_TYPE (t) == wchar_array_type_node)
                     56:            {
                     57:              wide_length += (TREE_STRING_LENGTH (t) - wchar_bytes);
                     58:              wide_flag = 1;
                     59:            }
                     60:          else
                     61:            length += (TREE_STRING_LENGTH (t) - 1);
                     62:        }
                     63: 
                     64:       /* If anything is wide, the non-wides will be converted,
                     65:         which makes them take more space.  */
                     66:       if (wide_flag)
                     67:        length = length * wchar_bytes + wide_length;
                     68: 
                     69:       p = savealloc (length);
                     70: 
                     71:       /* Copy the individual strings into the new combined string.
                     72:         If the combined string is wide, convert the chars to ints
                     73:         for any individual strings that are not wide.  */
                     74: 
                     75:       q = p;
                     76:       for (t = strings; t; t = TREE_CHAIN (t))
                     77:        {
                     78:          int len = (TREE_STRING_LENGTH (t)
                     79:                     - ((TREE_TYPE (t) == wchar_array_type_node)
                     80:                        ? wchar_bytes : 1));
                     81:          if ((TREE_TYPE (t) == wchar_array_type_node) == wide_flag)
                     82:            {
                     83:              bcopy (TREE_STRING_POINTER (t), q, len);
                     84:              q += len;
                     85:            }
                     86:          else
                     87:            {
                     88:              int i;
                     89:              for (i = 0; i < len; i++)
                     90:                ((int *) q)[i] = TREE_STRING_POINTER (t)[i];
                     91:              q += len * wchar_bytes;
                     92:            }
                     93:        }
                     94:       if (wide_flag)
                     95:        {
                     96:          int i;
                     97:          for (i = 0; i < wchar_bytes; i++)
                     98:            *q++ = 0;
                     99:        }
                    100:       else
                    101:        *q = 0;
                    102: 
                    103:       value = make_node (STRING_CST);
                    104:       TREE_STRING_POINTER (value) = p;
                    105:       TREE_STRING_LENGTH (value) = length;
                    106:       TREE_CONSTANT (value) = 1;
                    107:     }
                    108:   else
                    109:     {
                    110:       value = strings;
                    111:       length = TREE_STRING_LENGTH (value);
                    112:       if (TREE_TYPE (value) == wchar_array_type_node)
                    113:        wide_flag = 1;
                    114:     }
                    115: 
                    116:   /* Compute the number of elements, for the array type.  */ 
                    117:   nchars = wide_flag ? length / wchar_bytes : length;
                    118: 
                    119:   /* Create the array type for the string constant.
                    120:      -Wwrite-strings says make the string constant an array of const char
                    121:      so that copying it to a non-const pointer will get a warning.  */
                    122:   if (warn_write_strings
                    123:       && (! flag_traditional  && ! flag_writable_strings))
                    124:     {
                    125:       tree elements
                    126:        = build_type_variant (wide_flag ? wchar_type_node : char_type_node,
                    127:                              1, 0);
                    128:       TREE_TYPE (value)
                    129:        = build_array_type (elements,
                    130:                            build_index_type (build_int_2 (nchars - 1, 0)));
                    131:     }
                    132:   else
                    133:     TREE_TYPE (value)
                    134:       = build_array_type (wide_flag ? wchar_type_node : char_type_node,
                    135:                          build_index_type (build_int_2 (nchars - 1, 0)));
                    136:   TREE_CONSTANT (value) = 1;
                    137:   TREE_STATIC (value) = 1;
                    138:   return value;
                    139: }
                    140: 
                    141: /* Process the attributes listed in ATTRIBUTES
                    142:    and install them in DECL.  */
                    143: 
                    144: void
                    145: decl_attributes (decl, attributes)
                    146:      tree decl, attributes;
                    147: {
                    148:   tree a;
                    149:   for (a = attributes; a; a = TREE_CHAIN (a))
                    150:     if (TREE_VALUE (a) != 0
                    151:        && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
                    152:        && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("aligned"))
                    153:       {
                    154:        int align = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (a)))
                    155:                    * BITS_PER_UNIT;
                    156:        
                    157:        if (exact_log2 (align) == -1)
                    158:          warning_with_decl (decl,
                    159:                        "requested alignment of `%s' is not a power of 2");
                    160:        else if (TREE_CODE (decl) != VAR_DECL
                    161:                 && TREE_CODE (decl) != FIELD_DECL)
                    162:          warning_with_decl (decl,
                    163:                "alignment specified for `%s' which is not a variable");
                    164: 
                    165:        /* ??? The maximum alignment gcc can currently handle is 16 bytes!
                    166:           We should change the representation to be the log of the
                    167:           actual alignment since we only handle powers of 2 anyway.  */
                    168:        else if (align > 255)
                    169:          warning_with_decl (decl,
                    170:                "requested alignment of `%s' exceeds compiler limits");
                    171:        else
                    172:          DECL_ALIGN (decl) = align;
                    173:       }
                    174:     else if (TREE_VALUE (a) != 0
                    175:             && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
                    176:             && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("packed"))
                    177:       {
                    178:        if (TREE_CODE (decl) == FIELD_DECL)
                    179:          DECL_PACKED (decl) = 1;
                    180:       }
                    181:     else if (TREE_VALUE (a) != 0
                    182:        && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
                    183:        && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("format"))
                    184:       {
                    185:         tree list = TREE_VALUE (TREE_VALUE (a));
                    186:         tree format_type = TREE_PURPOSE (list);
                    187:        int format_num = TREE_INT_CST_LOW (TREE_PURPOSE (TREE_VALUE (list)));
                    188:        int first_arg_num = TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (list)));
                    189:        int is_scan;
                    190:        
                    191:        if (TREE_CODE (decl) != FUNCTION_DECL)
                    192:          {
                    193:            warning_with_decl (decl,
                    194:                "argument format specified for non-function `%s'");
                    195:            return;
                    196:          }
                    197:        
                    198:        if (format_type == get_identifier ("printf"))
                    199:          is_scan = 0;
                    200:        else if (format_type == get_identifier ("scanf"))
                    201:          is_scan = 1;
                    202:        else
                    203:          {
                    204:            warning_with_decl (decl,"unrecognized format specifier for `%s'");
                    205:            return;
                    206:          }
                    207:        
                    208:        if (first_arg_num != 0 && first_arg_num <= format_num)
                    209:          {
                    210:            warning_with_decl (decl,
                    211:                "format string arg follows the args to be formatted, for `%s'");
                    212:            return;
                    213:          }
                    214:        
                    215:        record_format_info (DECL_NAME (decl), is_scan, format_num,
                    216:                            first_arg_num);
                    217:       }
                    218: }
                    219: 
                    220: void
                    221: c_expand_expr_stmt (expr)
                    222:      tree expr;
                    223: {
                    224:   /* Do default conversion if safe and possibly important,
                    225:      in case within ({...}).  */
                    226:   if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE && lvalue_p (expr))
                    227:       || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
                    228:     expr = default_conversion (expr);
                    229: 
                    230:   if (TREE_TYPE (expr) != error_mark_node
                    231:       && TYPE_SIZE (TREE_TYPE (expr)) == 0
                    232:       && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
                    233:     error ("expression statement has incomplete type");
                    234: 
                    235:   expand_expr_stmt (expr);
                    236: }
                    237: 
                    238: /* Validate the expression after `case' and apply default promotions.  */
                    239: 
                    240: tree
                    241: check_case_value (value)
                    242:      tree value;
                    243: {
                    244:   if (value == NULL_TREE)
                    245:     return value;
                    246: 
                    247:   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
                    248:   if (TREE_CODE (value) == NON_LVALUE_EXPR)
                    249:     value = TREE_OPERAND (value, 0);
                    250: 
                    251:   if (TREE_CODE (value) != INTEGER_CST
                    252:       && value != error_mark_node)
                    253:     {
                    254:       error ("case label does not reduce to an integer constant");
                    255:       value = error_mark_node;
                    256:     }
                    257:   else
                    258:     /* Promote char or short to int.  */
                    259:     value = default_conversion (value);
                    260: 
                    261:   return value;
                    262: }
                    263: 
                    264: /* Return an integer type with BITS bits of precision,
                    265:    that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
                    266: 
                    267: tree
                    268: type_for_size (bits, unsignedp)
                    269:      unsigned bits;
                    270:      int unsignedp;
                    271: {
                    272:   if (bits <= TYPE_PRECISION (signed_char_type_node))
                    273:     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
                    274: 
                    275:   if (bits <= TYPE_PRECISION (short_integer_type_node))
                    276:     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
                    277: 
                    278:   if (bits <= TYPE_PRECISION (integer_type_node))
                    279:     return unsignedp ? unsigned_type_node : integer_type_node;
                    280: 
                    281:   if (bits <= TYPE_PRECISION (long_integer_type_node))
                    282:     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
                    283: 
                    284:   if (bits <= TYPE_PRECISION (long_long_integer_type_node))
                    285:     return (unsignedp ? long_long_unsigned_type_node
                    286:            : long_long_integer_type_node);
                    287: 
                    288:   return 0;
                    289: }
                    290: 
                    291: /* Return a data type that has machine mode MODE.
                    292:    If the mode is an integer,
                    293:    then UNSIGNEDP selects between signed and unsigned types.  */
                    294: 
                    295: tree
                    296: type_for_mode (mode, unsignedp)
                    297:      enum machine_mode mode;
                    298:      int unsignedp;
                    299: {
                    300:   if (mode == TYPE_MODE (signed_char_type_node))
                    301:     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
                    302: 
                    303:   if (mode == TYPE_MODE (short_integer_type_node))
                    304:     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
                    305: 
                    306:   if (mode == TYPE_MODE (integer_type_node))
                    307:     return unsignedp ? unsigned_type_node : integer_type_node;
                    308: 
                    309:   if (mode == TYPE_MODE (long_integer_type_node))
                    310:     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
                    311: 
                    312:   if (mode == TYPE_MODE (long_long_integer_type_node))
                    313:     return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
                    314: 
                    315:   if (mode == TYPE_MODE (float_type_node))
                    316:     return float_type_node;
                    317: 
                    318:   if (mode == TYPE_MODE (double_type_node))
                    319:     return double_type_node;
                    320: 
                    321:   if (mode == TYPE_MODE (long_double_type_node))
                    322:     return long_double_type_node;
                    323: 
                    324:   if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
                    325:     return build_pointer_type (char_type_node);
                    326: 
                    327:   if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
                    328:     return build_pointer_type (integer_type_node);
                    329: 
                    330:   return 0;
                    331: }
                    332: 
                    333: /* Print an error message for invalid operands to arith operation CODE.
                    334:    NOP_EXPR is used as a special case (see truthvalue_conversion).  */
                    335: 
                    336: void
                    337: binary_op_error (code)
                    338:      enum tree_code code;
                    339: {
                    340:   register char *opname;
                    341:   switch (code)
                    342:     {
                    343:     case NOP_EXPR:
                    344:       error ("invalid truth-value expression");
                    345:       return;
                    346: 
                    347:     case PLUS_EXPR:
                    348:       opname = "+"; break;
                    349:     case MINUS_EXPR:
                    350:       opname = "-"; break;
                    351:     case MULT_EXPR:
                    352:       opname = "*"; break;
                    353:     case MAX_EXPR:
                    354:       opname = "max"; break;
                    355:     case MIN_EXPR:
                    356:       opname = "min"; break;
                    357:     case EQ_EXPR:
                    358:       opname = "=="; break;
                    359:     case NE_EXPR:
                    360:       opname = "!="; break;
                    361:     case LE_EXPR:
                    362:       opname = "<="; break;
                    363:     case GE_EXPR:
                    364:       opname = ">="; break;
                    365:     case LT_EXPR:
                    366:       opname = "<"; break;
                    367:     case GT_EXPR:
                    368:       opname = ">"; break;
                    369:     case LSHIFT_EXPR:
                    370:       opname = "<<"; break;
                    371:     case RSHIFT_EXPR:
                    372:       opname = ">>"; break;
                    373:     case TRUNC_MOD_EXPR:
                    374:       opname = "%"; break;
                    375:     case TRUNC_DIV_EXPR:
                    376:       opname = "/"; break;
                    377:     case BIT_AND_EXPR:
                    378:       opname = "&"; break;
                    379:     case BIT_IOR_EXPR:
                    380:       opname = "|"; break;
                    381:     case TRUTH_ANDIF_EXPR:
                    382:       opname = "&&"; break;
                    383:     case TRUTH_ORIF_EXPR:
                    384:       opname = "||"; break;
                    385:     case BIT_XOR_EXPR:
                    386:       opname = "^"; break;
                    387:     }
                    388:   error ("invalid operands to binary %s", opname);
                    389: }
                    390: 
                    391: /* Subroutine of build_binary_op, used for comparison operations.
                    392:    See if the operands have both been converted from subword integer types
                    393:    and, if so, perhaps change them both back to their original type.
                    394: 
                    395:    The arguments of this function are all pointers to local variables
                    396:    of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
                    397:    RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
                    398: 
                    399:    If this function returns nonzero, it means that the comparison has
                    400:    a constant value.  What this function returns is an expression for
                    401:    that value.  */
                    402: 
                    403: tree
                    404: shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
                    405:      tree *op0_ptr, *op1_ptr;
                    406:      tree *restype_ptr;
                    407:      enum tree_code *rescode_ptr;
                    408: {
                    409:   register tree type;
                    410:   tree op0 = *op0_ptr;
                    411:   tree op1 = *op1_ptr;
                    412:   int unsignedp0, unsignedp1;
                    413:   int real1, real2;
                    414:   tree primop0, primop1;
                    415:   enum tree_code code = *rescode_ptr;
                    416: 
                    417:   /* Throw away any conversions to wider types
                    418:      already present in the operands.  */
                    419: 
                    420:   primop0 = get_narrower (op0, &unsignedp0);
                    421:   primop1 = get_narrower (op1, &unsignedp1);
                    422: 
                    423:   /* Handle the case that OP0 does not *contain* a conversion
                    424:      but it *requires* conversion to FINAL_TYPE.  */
                    425: 
                    426:   if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
                    427:     unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
                    428:   if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
                    429:     unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
                    430: 
                    431:   /* If one of the operands must be floated, we cannot optimize.  */
                    432:   real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
                    433:   real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
                    434: 
                    435:   /* If first arg is constant, swap the args (changing operation
                    436:      so value is preserved), for canonicalization.  */
                    437: 
                    438:   if (TREE_CONSTANT (primop0))
                    439:     {
                    440:       register tree tem = primop0;
                    441:       register int temi = unsignedp0;
                    442:       primop0 = primop1;
                    443:       primop1 = tem;
                    444:       tem = op0;
                    445:       op0 = op1;
                    446:       op1 = tem;
                    447:       *op0_ptr = op0;
                    448:       *op1_ptr = op1;
                    449:       unsignedp0 = unsignedp1;
                    450:       unsignedp1 = temi;
                    451:       temi = real1;
                    452:       real1 = real2;
                    453:       real2 = temi;
                    454: 
                    455:       switch (code)
                    456:        {
                    457:        case LT_EXPR:
                    458:          code = GT_EXPR;
                    459:          break;
                    460:        case GT_EXPR:
                    461:          code = LT_EXPR;
                    462:          break;
                    463:        case LE_EXPR:
                    464:          code = GE_EXPR;
                    465:          break;
                    466:        case GE_EXPR:
                    467:          code = LE_EXPR;
                    468:          break;
                    469:        }
                    470:       *rescode_ptr = code;
                    471:     }
                    472: 
                    473:   /* If comparing an integer against a constant more bits wide,
                    474:      maybe we can deduce a value of 1 or 0 independent of the data.
                    475:      Or else truncate the constant now
                    476:      rather than extend the variable at run time.
                    477: 
                    478:      This is only interesting if the constant is the wider arg.
                    479:      Also, it is not safe if the constant is unsigned and the
                    480:      variable arg is signed, since in this case the variable
                    481:      would be sign-extended and then regarded as unsigned.
                    482:      Our technique fails in this case because the lowest/highest
                    483:      possible unsigned results don't follow naturally from the
                    484:      lowest/highest possible values of the variable operand.
                    485:      For just EQ_EXPR and NE_EXPR there is another technique that
                    486:      could be used: see if the constant can be faithfully represented
                    487:      in the other operand's type, by truncating it and reextending it
                    488:      and see if that preserves the constant's value.  */
                    489: 
                    490:   if (!real1 && !real2
                    491:       && TREE_CODE (primop1) == INTEGER_CST
                    492:       && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
                    493:     {
                    494:       int min_gt, max_gt, min_lt, max_lt;
                    495:       tree maxval, minval;
                    496:       /* 1 if comparison is nominally unsigned.  */
                    497:       int unsignedp = TREE_UNSIGNED (*restype_ptr);
                    498:       tree val;
                    499: 
                    500:       type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0));
                    501: 
                    502:       maxval = TYPE_MAX_VALUE (type);
                    503:       minval = TYPE_MIN_VALUE (type);
                    504: 
                    505:       if (unsignedp && !unsignedp0)
                    506:        *restype_ptr = signed_type (*restype_ptr);
                    507: 
                    508:       if (TREE_TYPE (primop1) != *restype_ptr)
                    509:        primop1 = convert (*restype_ptr, primop1);
                    510:       if (type != *restype_ptr)
                    511:        {
                    512:          minval = convert (*restype_ptr, minval);
                    513:          maxval = convert (*restype_ptr, maxval);
                    514:        }
                    515: 
                    516:       if (unsignedp && unsignedp0)
                    517:        {
                    518:          min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
                    519:          max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
                    520:          min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
                    521:          max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
                    522:        }
                    523:       else
                    524:        {
                    525:          min_gt = INT_CST_LT (primop1, minval);
                    526:          max_gt = INT_CST_LT (primop1, maxval);
                    527:          min_lt = INT_CST_LT (minval, primop1);
                    528:          max_lt = INT_CST_LT (maxval, primop1);
                    529:        }
                    530: 
                    531:       val = 0;
                    532:       /* This used to be a switch, but Genix compiler can't handle that.  */
                    533:       if (code == NE_EXPR)
                    534:        {
                    535:          if (max_lt || min_gt)
                    536:            val = integer_one_node;
                    537:        }
                    538:       else if (code == EQ_EXPR)
                    539:        {
                    540:          if (max_lt || min_gt)
                    541:            val = integer_zero_node;
                    542:        }
                    543:       else if (code == LT_EXPR)
                    544:        {
                    545:          if (max_lt)
                    546:            val = integer_one_node;
                    547:          if (!min_lt)
                    548:            val = integer_zero_node;
                    549:        }
                    550:       else if (code == GT_EXPR)
                    551:        {
                    552:          if (min_gt)
                    553:            val = integer_one_node;
                    554:          if (!max_gt)
                    555:            val = integer_zero_node;
                    556:        }
                    557:       else if (code == LE_EXPR)
                    558:        {
                    559:          if (!max_gt)
                    560:            val = integer_one_node;
                    561:          if (min_gt)
                    562:            val = integer_zero_node;
                    563:        }
                    564:       else if (code == GE_EXPR)
                    565:        {
                    566:          if (!min_lt)
                    567:            val = integer_one_node;
                    568:          if (max_lt)
                    569:            val = integer_zero_node;
                    570:        }
                    571: 
                    572:       /* If primop0 was sign-extended and unsigned comparison specd,
                    573:         we did a signed comparison above using the signed type bounds.
                    574:         But the comparison we output must be unsigned.
                    575: 
                    576:         Also, for inequalities, VAL is no good; but if the signed
                    577:         comparison had *any* fixed result, it follows that the
                    578:         unsigned comparison just tests the sign in reverse
                    579:         (positive values are LE, negative ones GE).
                    580:         So we can generate an unsigned comparison
                    581:         against an extreme value of the signed type.  */
                    582: 
                    583:       if (unsignedp && !unsignedp0)
                    584:        {
                    585:          if (val != 0)
                    586:            switch (code)
                    587:              {
                    588:              case LT_EXPR:
                    589:              case GE_EXPR:
                    590:                primop1 = TYPE_MIN_VALUE (type);
                    591:                val = 0;
                    592:                break;
                    593: 
                    594:              case LE_EXPR:
                    595:              case GT_EXPR:
                    596:                primop1 = TYPE_MAX_VALUE (type);
                    597:                val = 0;
                    598:                break;
                    599:              }
                    600:          type = unsigned_type (type);
                    601:        }
                    602: 
                    603:       if (max_lt && !unsignedp0)
                    604:        {
                    605:          /* This is the case of (char)x >?< 0x80, which people used to use
                    606:             expecting old C compilers to change the 0x80 into -0x80.  */
                    607:          if (val == integer_zero_node)
                    608:            warning ("comparison is always 0 due to limited range of data type");
                    609:          if (val == integer_one_node)
                    610:            warning ("comparison is always 1 due to limited range of data type");
                    611:        }
                    612: 
                    613:       if (min_gt && unsignedp0)
                    614:        {
                    615:          /* This is the case of (unsigned char)x >?< -1.  */
                    616:          if (val == integer_zero_node)
                    617:            warning ("comparison is always 0 due to limited range of data type");
                    618:          if (val == integer_one_node)
                    619:            warning ("comparison is always 1 due to limited range of data type");
                    620:        }
                    621: 
                    622:       if (val != 0)
                    623:        {
                    624:          /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
                    625:          if (TREE_SIDE_EFFECTS (primop0))
                    626:            return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
                    627:          return val;
                    628:        }
                    629: 
                    630:       /* Value is not predetermined, but do the comparison
                    631:         in the type of the operand that is not constant.
                    632:         TYPE is already properly set.  */
                    633:     }
                    634:   else if (real1 && real2
                    635:           && TYPE_PRECISION (TREE_TYPE (primop0)) == TYPE_PRECISION (TREE_TYPE (primop1)))
                    636:     type = TREE_TYPE (primop0);
                    637: 
                    638:   /* If args' natural types are both narrower than nominal type
                    639:      and both extend in the same manner, compare them
                    640:      in the type of the wider arg.
                    641:      Otherwise must actually extend both to the nominal
                    642:      common type lest different ways of extending
                    643:      alter the result.
                    644:      (eg, (short)-1 == (unsigned short)-1  should be 0.)  */
                    645: 
                    646:   else if (unsignedp0 == unsignedp1 && real1 == real2
                    647:           && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
                    648:           && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
                    649:     {
                    650:       type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
                    651:       type = signed_or_unsigned_type (unsignedp0
                    652:                                      || TREE_UNSIGNED (*restype_ptr),
                    653:                                      type);
                    654:       /* Make sure shorter operand is extended the right way
                    655:         to match the longer operand.  */
                    656:       primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)),
                    657:                         primop0);
                    658:       primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
                    659:                         primop1);
                    660:     }
                    661:   else
                    662:     {
                    663:       /* Here we must do the comparison on the nominal type
                    664:         using the args exactly as we received them.  */
                    665:       type = *restype_ptr;
                    666:       primop0 = op0;
                    667:       primop1 = op1;
                    668: 
                    669:       if (!real1 && !real2 && integer_zerop (primop1)
                    670:          && TREE_UNSIGNED (TREE_TYPE (primop0)))
                    671:        {
                    672:          tree value = 0;
                    673:          switch (code)
                    674:            {
                    675:            case GE_EXPR:
                    676:              if (extra_warnings)
                    677:                warning ("unsigned value >= 0 is always 1");
                    678:              value = integer_one_node;
                    679:              break;
                    680: 
                    681:            case LT_EXPR:
                    682:              if (extra_warnings)
                    683:                warning ("unsigned value < 0 is always 0");
                    684:              value = integer_zero_node;
                    685:            }
                    686: 
                    687:          if (value != 0)
                    688:            {
                    689:              /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
                    690:              if (TREE_SIDE_EFFECTS (primop0))
                    691:                return build (COMPOUND_EXPR, TREE_TYPE (value),
                    692:                              primop0, value);
                    693:              return value;
                    694:            }
                    695:        }
                    696:     }
                    697: 
                    698:   *op0_ptr = convert (type, primop0);
                    699:   *op1_ptr = convert (type, primop1);
                    700: 
                    701:   *restype_ptr = integer_type_node;
                    702: 
                    703:   return 0;
                    704: }
                    705: 
                    706: /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
                    707:    or validate its data type for an `if' or `while' statement or ?..: exp.
                    708: 
                    709:    This preparation consists of taking the ordinary
                    710:    representation of an expression expr and producing a valid tree
                    711:    boolean expression describing whether expr is nonzero.  We could
                    712:    simply always do build_binary_op (NE_EXPR, expr, integer_zero_node, 1),
                    713:    but we optimize comparisons, &&, ||, and !.
                    714: 
                    715:    The resulting type should always be `integer_type_node'.  */
                    716: 
                    717: tree
                    718: truthvalue_conversion (expr)
                    719:      tree expr;
                    720: {
                    721:   register enum tree_code code;
                    722: 
                    723:   switch (TREE_CODE (expr))
                    724:     {
                    725:       /* It is simpler and generates better code to have only TRUTH_*_EXPR
                    726:         or comparison expressions as truth values at this level.  */
                    727: #if 0
                    728:     case COMPONENT_REF:
                    729:       /* A one-bit unsigned bit-field is already acceptable.  */
                    730:       if (1 == TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (expr, 1)))
                    731:          && TREE_UNSIGNED (TREE_OPERAND (expr, 1)))
                    732:        return expr;
                    733:       break;
                    734: #endif
                    735: 
                    736:     case EQ_EXPR:
                    737:       /* It is simpler and generates better code to have only TRUTH_*_EXPR
                    738:         or comparison expressions as truth values at this level.  */
                    739: #if 0
                    740:       if (integer_zerop (TREE_OPERAND (expr, 1)))
                    741:        return build_unary_op (TRUTH_NOT_EXPR, TREE_OPERAND (expr, 0), 0);
                    742: #endif
                    743:     case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
                    744:     case TRUTH_ANDIF_EXPR:
                    745:     case TRUTH_ORIF_EXPR:
                    746:     case TRUTH_AND_EXPR:
                    747:     case TRUTH_OR_EXPR:
                    748:     case ERROR_MARK:
                    749:       return expr;
                    750: 
                    751:     case INTEGER_CST:
                    752:       return integer_zerop (expr) ? integer_zero_node : integer_one_node;
                    753: 
                    754:     case REAL_CST:
                    755:       return real_zerop (expr) ? integer_zero_node : integer_one_node;
                    756: 
                    757:     case ADDR_EXPR:
                    758:       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
                    759:        return build (COMPOUND_EXPR, integer_type_node,
                    760:                      TREE_OPERAND (expr, 0), integer_one_node);
                    761:       else
                    762:        return integer_one_node;
                    763: 
                    764:     case NEGATE_EXPR:
                    765:     case ABS_EXPR:
                    766:     case FLOAT_EXPR:
                    767:     case FFS_EXPR:
                    768:       /* These don't change whether an object is non-zero or zero.  */
                    769:       return truthvalue_conversion (TREE_OPERAND (expr, 0));
                    770: 
                    771:     case LROTATE_EXPR:
                    772:     case RROTATE_EXPR:
                    773:       /* These don't change whether an object is zero or non-zero, but
                    774:         we can't ignore them if their second arg has side-effects.  */
                    775:       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
                    776:        return build (COMPOUND_EXPR, integer_type_node, TREE_OPERAND (expr, 1),
                    777:                      truthvalue_conversion (TREE_OPERAND (expr, 0)));
                    778:       else
                    779:        return truthvalue_conversion (TREE_OPERAND (expr, 0));
                    780:       
                    781:     case COND_EXPR:
                    782:       /* Distribute the conversion into the arms of a COND_EXPR.  */
                    783:       return fold (build (COND_EXPR, integer_type_node, TREE_OPERAND (expr, 0),
                    784:                          truthvalue_conversion (TREE_OPERAND (expr, 1)),
                    785:                          truthvalue_conversion (TREE_OPERAND (expr, 2))));
                    786: 
                    787:     case CONVERT_EXPR:
                    788:       /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
                    789:         since that affects how `default_conversion' will behave.  */
                    790:       if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
                    791:          || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
                    792:        break;
                    793:       /* fall through... */
                    794:     case NOP_EXPR:
                    795:       /* If this is widening the argument, we can ignore it.  */
                    796:       if (TYPE_PRECISION (TREE_TYPE (expr))
                    797:          >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
                    798:        return truthvalue_conversion (TREE_OPERAND (expr, 0));
                    799:       break;
                    800: 
                    801:     case BIT_XOR_EXPR:
                    802:     case MINUS_EXPR:
                    803:       /* These can be changed into a comparison of the two objects.  */
                    804:       if (TREE_TYPE (TREE_OPERAND (expr, 0))
                    805:          == TREE_TYPE (TREE_OPERAND (expr, 1)))
                    806:        return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
                    807:                                TREE_OPERAND (expr, 1), 1);
                    808:       return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
                    809:                              fold (build1 (NOP_EXPR,
                    810:                                            TREE_TYPE (TREE_OPERAND (expr, 0)),
                    811:                                            TREE_OPERAND (expr, 1))), 1);
                    812:     }
                    813: 
                    814:   return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
                    815: }
                    816: 
                    817: /* Read the rest of a #-directive from input stream FINPUT.
                    818:    In normal use, the directive name and the white space after it
                    819:    have already been read, so they won't be included in the result.
                    820:    We allow for the fact that the directive line may contain
                    821:    a newline embedded within a character or string literal which forms
                    822:    a part of the directive.
                    823: 
                    824:    The value is a string in a reusable buffer.  It remains valid
                    825:    only until the next time this function is called.  */
                    826: 
                    827: char *
                    828: get_directive_line (finput)
                    829:      register FILE *finput;
                    830: {
                    831:   static char *directive_buffer = NULL;
                    832:   static unsigned buffer_length = 0;
                    833:   register char *p;
                    834:   register char *buffer_limit;
                    835:   register int looking_for = 0;
                    836:   register int char_escaped = 0;
                    837: 
                    838:   if (buffer_length == 0)
                    839:     {
                    840:       directive_buffer = (char *)xmalloc (128);
                    841:       buffer_length = 128;
                    842:     }
                    843: 
                    844:   buffer_limit = &directive_buffer[buffer_length];
                    845: 
                    846:   for (p = directive_buffer; ; )
                    847:     {
                    848:       int c;
                    849: 
                    850:       /* Make buffer bigger if it is full.  */
                    851:       if (p >= buffer_limit)
                    852:         {
                    853:          register unsigned bytes_used = (p - directive_buffer);
                    854: 
                    855:          buffer_length *= 2;
                    856:          directive_buffer
                    857:            = (char *)xrealloc (directive_buffer, buffer_length);
                    858:          p = &directive_buffer[bytes_used];
                    859:          buffer_limit = &directive_buffer[buffer_length];
                    860:         }
                    861: 
                    862:       c = getc (finput);
                    863: 
                    864:       /* Discard initial whitespace.  */
                    865:       if ((c == ' ' || c == '\t') && p == directive_buffer)
                    866:        continue;
                    867: 
                    868:       /* Detect the end of the directive.  */
                    869:       if (c == '\n' && looking_for == 0)
                    870:        {
                    871:           ungetc (c, finput);
                    872:          c = '\0';
                    873:        }
                    874: 
                    875:       *p++ = c;
                    876: 
                    877:       if (c == 0)
                    878:        return directive_buffer;
                    879: 
                    880:       /* Handle string and character constant syntax.  */
                    881:       if (looking_for)
                    882:        {
                    883:          if (looking_for == c && !char_escaped)
                    884:            looking_for = 0;    /* Found terminator... stop looking.  */
                    885:        }
                    886:       else
                    887:         if (c == '\'' || c == '"')
                    888:          looking_for = c;      /* Don't stop buffering until we see another
                    889:                                   another one of these (or an EOF).  */
                    890: 
                    891:       /* Handle backslash.  */
                    892:       char_escaped = (c == '\\' && ! char_escaped);
                    893:     }
                    894: }

unix.superglobalmegacorp.com

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