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

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

unix.superglobalmegacorp.com

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