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