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

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

unix.superglobalmegacorp.com

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