]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/gcc/c-common.c
Merge our spelling changes into isc_dhcp_3_0_1_rc11.
[FreeBSD/FreeBSD.git] / contrib / gcc / c-common.c
1 /* Subroutines shared by all languages that are variants of C.
2    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "tree.h"
25 #include "flags.h"
26 #include "toplev.h"
27 #include "output.h"
28 #include "c-pragma.h"
29 #include "rtl.h"
30 #include "ggc.h"
31 #include "expr.h"
32 #include "c-common.h"
33 #include "tree-inline.h"
34 #include "diagnostic.h"
35 #include "tm_p.h"
36 #include "obstack.h"
37 #include "c-lex.h"
38 #include "cpplib.h"
39 #include "target.h"
40 cpp_reader *parse_in;           /* Declared in c-lex.h.  */
41
42 #undef WCHAR_TYPE_SIZE
43 #define WCHAR_TYPE_SIZE TYPE_PRECISION (wchar_type_node)
44
45 /* We let tm.h override the types used here, to handle trivial differences
46    such as the choice of unsigned int or long unsigned int for size_t.
47    When machines start needing nontrivial differences in the size type,
48    it would be best to do something here to figure out automatically
49    from other information what type to use.  */
50
51 #ifndef SIZE_TYPE
52 #define SIZE_TYPE "long unsigned int"
53 #endif
54
55 #ifndef WCHAR_TYPE
56 #define WCHAR_TYPE "int"
57 #endif
58
59 #ifndef PTRDIFF_TYPE
60 #define PTRDIFF_TYPE "long int"
61 #endif
62
63 #ifndef WINT_TYPE
64 #define WINT_TYPE "unsigned int"
65 #endif
66
67 #ifndef INTMAX_TYPE
68 #define INTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE)     \
69                      ? "int"                                    \
70                      : ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \
71                         ? "long int"                            \
72                         : "long long int"))
73 #endif
74
75 #ifndef UINTMAX_TYPE
76 #define UINTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE)    \
77                      ? "unsigned int"                           \
78                      : ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \
79                         ? "long unsigned int"                   \
80                         : "long long unsigned int"))
81 #endif
82
83 /* The variant of the C language being processed.  */
84
85 enum c_language_kind c_language;
86
87 /* The following symbols are subsumed in the c_global_trees array, and
88    listed here individually for documentation purposes.
89
90    INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
91
92         tree short_integer_type_node;
93         tree long_integer_type_node;
94         tree long_long_integer_type_node;
95
96         tree short_unsigned_type_node;
97         tree long_unsigned_type_node;
98         tree long_long_unsigned_type_node;
99
100         tree boolean_type_node;
101         tree boolean_false_node;
102         tree boolean_true_node;
103
104         tree ptrdiff_type_node;
105
106         tree unsigned_char_type_node;
107         tree signed_char_type_node;
108         tree wchar_type_node;
109         tree signed_wchar_type_node;
110         tree unsigned_wchar_type_node;
111
112         tree float_type_node;
113         tree double_type_node;
114         tree long_double_type_node;
115
116         tree complex_integer_type_node;
117         tree complex_float_type_node;
118         tree complex_double_type_node;
119         tree complex_long_double_type_node;
120
121         tree intQI_type_node;
122         tree intHI_type_node;
123         tree intSI_type_node;
124         tree intDI_type_node;
125         tree intTI_type_node;
126
127         tree unsigned_intQI_type_node;
128         tree unsigned_intHI_type_node;
129         tree unsigned_intSI_type_node;
130         tree unsigned_intDI_type_node;
131         tree unsigned_intTI_type_node;
132
133         tree widest_integer_literal_type_node;
134         tree widest_unsigned_literal_type_node;
135
136    Nodes for types `void *' and `const void *'.
137
138         tree ptr_type_node, const_ptr_type_node;
139
140    Nodes for types `char *' and `const char *'.
141
142         tree string_type_node, const_string_type_node;
143
144    Type `char[SOMENUMBER]'.
145    Used when an array of char is needed and the size is irrelevant.
146
147         tree char_array_type_node;
148
149    Type `int[SOMENUMBER]' or something like it.
150    Used when an array of int needed and the size is irrelevant.
151
152         tree int_array_type_node;
153
154    Type `wchar_t[SOMENUMBER]' or something like it.
155    Used when a wide string literal is created.
156
157         tree wchar_array_type_node;
158
159    Type `int ()' -- used for implicit declaration of functions.
160
161         tree default_function_type;
162
163    A VOID_TYPE node, packaged in a TREE_LIST.
164
165         tree void_list_node;
166
167   The lazily created VAR_DECLs for __FUNCTION__, __PRETTY_FUNCTION__,
168   and __func__. (C doesn't generate __FUNCTION__ and__PRETTY_FUNCTION__
169   VAR_DECLS, but C++ does.)
170
171         tree function_name_decl_node;
172         tree pretty_function_name_decl_node;
173         tree c99_function_name_decl_node;
174
175   Stack of nested function name VAR_DECLs.
176   
177         tree saved_function_name_decls;
178
179 */
180
181 tree c_global_trees[CTI_MAX];
182
183 /* Nonzero means don't recognize the non-ANSI builtin functions.  */
184
185 int flag_no_builtin;
186
187 /* Nonzero means don't recognize the non-ANSI builtin functions.
188    -ansi sets this.  */
189
190 int flag_no_nonansi_builtin;
191
192 /* Nonzero means give `double' the same size as `float'.  */
193
194 int flag_short_double;
195
196 /* Nonzero means give `wchar_t' the same size as `short'.  */
197
198 int flag_short_wchar;
199
200 /* Nonzero means warn about possible violations of sequence point rules.  */
201
202 int warn_sequence_point;
203
204 /* Nonzero means to warn about compile-time division by zero.  */
205 int warn_div_by_zero = 1;
206
207 /* The elements of `ridpointers' are identifier nodes for the reserved
208    type names and storage classes.  It is indexed by a RID_... value.  */
209 tree *ridpointers;
210
211 tree (*make_fname_decl)                PARAMS ((tree, int));
212
213 /* If non-NULL, the address of a language-specific function that
214    returns 1 for language-specific statement codes.  */
215 int (*lang_statement_code_p)           PARAMS ((enum tree_code));
216
217 /* If non-NULL, the address of a language-specific function that takes
218    any action required right before expand_function_end is called.  */
219 void (*lang_expand_function_end)       PARAMS ((void));
220
221 /* Nonzero means the expression being parsed will never be evaluated.
222    This is a count, since unevaluated expressions can nest.  */
223 int skip_evaluation;
224
225 /* Information about how a function name is generated.  */
226 struct fname_var_t
227 {
228   tree *const decl;     /* pointer to the VAR_DECL.  */
229   const unsigned rid;   /* RID number for the identifier.  */
230   const int pretty;     /* How pretty is it? */
231 };
232
233 /* The three ways of getting then name of the current function.  */
234
235 const struct fname_var_t fname_vars[] =
236 {
237   /* C99 compliant __func__, must be first.  */
238   {&c99_function_name_decl_node, RID_C99_FUNCTION_NAME, 0},
239   /* GCC __FUNCTION__ compliant.  */
240   {&function_name_decl_node, RID_FUNCTION_NAME, 0},
241   /* GCC __PRETTY_FUNCTION__ compliant.  */
242   {&pretty_function_name_decl_node, RID_PRETTY_FUNCTION_NAME, 1},
243   {NULL, 0, 0},
244 };
245
246 static int constant_fits_type_p         PARAMS ((tree, tree));
247
248 /* Keep a stack of if statements.  We record the number of compound
249    statements seen up to the if keyword, as well as the line number
250    and file of the if.  If a potentially ambiguous else is seen, that
251    fact is recorded; the warning is issued when we can be sure that
252    the enclosing if statement does not have an else branch.  */
253 typedef struct
254 {
255   int compstmt_count;
256   int line;
257   const char *file;
258   int needs_warning;
259   tree if_stmt;
260 } if_elt;
261
262 static if_elt *if_stack;
263
264 /* Amount of space in the if statement stack.  */
265 static int if_stack_space = 0;
266
267 /* Stack pointer.  */
268 static int if_stack_pointer = 0;
269
270 /* Record the start of an if-then, and record the start of it
271    for ambiguous else detection.
272
273    COND is the condition for the if-then statement.
274
275    IF_STMT is the statement node that has already been created for
276    this if-then statement.  It is created before parsing the
277    condition to keep line number information accurate.  */
278
279 void
280 c_expand_start_cond (cond, compstmt_count, if_stmt)
281      tree cond;
282      int compstmt_count;
283      tree if_stmt;
284 {
285   /* Make sure there is enough space on the stack.  */
286   if (if_stack_space == 0)
287     {
288       if_stack_space = 10;
289       if_stack = (if_elt *) xmalloc (10 * sizeof (if_elt));
290     }
291   else if (if_stack_space == if_stack_pointer)
292     {
293       if_stack_space += 10;
294       if_stack = (if_elt *) xrealloc (if_stack, if_stack_space * sizeof (if_elt));
295     }
296
297   IF_COND (if_stmt) = cond;
298   add_stmt (if_stmt);
299
300   /* Record this if statement.  */
301   if_stack[if_stack_pointer].compstmt_count = compstmt_count;
302   if_stack[if_stack_pointer].file = input_filename;
303   if_stack[if_stack_pointer].line = lineno;
304   if_stack[if_stack_pointer].needs_warning = 0;
305   if_stack[if_stack_pointer].if_stmt = if_stmt;
306   if_stack_pointer++;
307 }
308
309 /* Called after the then-clause for an if-statement is processed.  */
310
311 void
312 c_finish_then ()
313 {
314   tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
315   RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt));
316 }
317
318 /* Record the end of an if-then.  Optionally warn if a nested
319    if statement had an ambiguous else clause.  */
320
321 void
322 c_expand_end_cond ()
323 {
324   if_stack_pointer--;
325   if (if_stack[if_stack_pointer].needs_warning)
326     warning_with_file_and_line (if_stack[if_stack_pointer].file,
327                                 if_stack[if_stack_pointer].line,
328                                 "suggest explicit braces to avoid ambiguous `else'");
329   last_expr_type = NULL_TREE;
330 }
331
332 /* Called between the then-clause and the else-clause
333    of an if-then-else.  */
334
335 void
336 c_expand_start_else ()
337 {
338   /* An ambiguous else warning must be generated for the enclosing if
339      statement, unless we see an else branch for that one, too.  */
340   if (warn_parentheses
341       && if_stack_pointer > 1
342       && (if_stack[if_stack_pointer - 1].compstmt_count
343           == if_stack[if_stack_pointer - 2].compstmt_count))
344     if_stack[if_stack_pointer - 2].needs_warning = 1;
345
346   /* Even if a nested if statement had an else branch, it can't be
347      ambiguous if this one also has an else.  So don't warn in that
348      case.  Also don't warn for any if statements nested in this else.  */
349   if_stack[if_stack_pointer - 1].needs_warning = 0;
350   if_stack[if_stack_pointer - 1].compstmt_count--;
351 }
352
353 /* Called after the else-clause for an if-statement is processed.  */
354
355 void
356 c_finish_else ()
357 {
358   tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
359   RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt));
360 }
361
362 /* Begin an if-statement.  Returns a newly created IF_STMT if
363    appropriate.
364
365    Unlike the C++ front-end, we do not call add_stmt here; it is
366    probably safe to do so, but I am not very familiar with this
367    code so I am being extra careful not to change its behavior
368    beyond what is strictly necessary for correctness.  */
369
370 tree
371 c_begin_if_stmt ()
372 {
373   tree r;
374   r = build_stmt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
375   return r;
376 }
377
378 /* Begin a while statement.  Returns a newly created WHILE_STMT if
379    appropriate.
380
381    Unlike the C++ front-end, we do not call add_stmt here; it is
382    probably safe to do so, but I am not very familiar with this
383    code so I am being extra careful not to change its behavior
384    beyond what is strictly necessary for correctness.  */
385
386 tree
387 c_begin_while_stmt ()
388 {
389   tree r;
390   r = build_stmt (WHILE_STMT, NULL_TREE, NULL_TREE);
391   return r;
392 }
393
394 void
395 c_finish_while_stmt_cond (cond, while_stmt)
396      tree while_stmt;
397      tree cond;
398 {
399   WHILE_COND (while_stmt) = cond;
400 }
401
402 /* Push current bindings for the function name VAR_DECLS.  */
403
404 void
405 start_fname_decls ()
406 {
407   unsigned ix;
408   tree saved = NULL_TREE;
409   
410   for (ix = 0; fname_vars[ix].decl; ix++)
411     {
412       tree decl = *fname_vars[ix].decl;
413
414       if (decl)
415         {
416           saved = tree_cons (decl, build_int_2 (ix, 0), saved);
417           *fname_vars[ix].decl = NULL_TREE;
418         }
419     }
420   if (saved || saved_function_name_decls)
421     /* Normally they'll have been NULL, so only push if we've got a
422        stack, or they are non-NULL.  */
423     saved_function_name_decls = tree_cons (saved, NULL_TREE,
424                                            saved_function_name_decls);
425 }
426
427 /* Finish up the current bindings, adding them into the
428    current function's statement tree. This is done by wrapping the
429    function's body in a COMPOUND_STMT containing these decls too. This
430    must be done _before_ finish_stmt_tree is called. If there is no
431    current function, we must be at file scope and no statements are
432    involved. Pop the previous bindings.  */
433
434 void
435 finish_fname_decls ()
436 {
437   unsigned ix;
438   tree body = NULL_TREE;
439   tree stack = saved_function_name_decls;
440
441   for (; stack && TREE_VALUE (stack); stack = TREE_CHAIN (stack))
442     body = chainon (TREE_VALUE (stack), body);
443   
444   if (body)
445     {
446       /* They were called into existence, so add to statement tree.  */
447       body = chainon (body,
448                       TREE_CHAIN (DECL_SAVED_TREE (current_function_decl)));
449       body = build_stmt (COMPOUND_STMT, body);
450       
451       COMPOUND_STMT_NO_SCOPE (body) = 1;
452       TREE_CHAIN (DECL_SAVED_TREE (current_function_decl)) = body;
453     }
454   
455   for (ix = 0; fname_vars[ix].decl; ix++)
456     *fname_vars[ix].decl = NULL_TREE;
457   
458   if (stack)
459     {
460       /* We had saved values, restore them.  */
461       tree saved;
462
463       for (saved = TREE_PURPOSE (stack); saved; saved = TREE_CHAIN (saved))
464         {
465           tree decl = TREE_PURPOSE (saved);
466           unsigned ix = TREE_INT_CST_LOW (TREE_VALUE (saved));
467           
468           *fname_vars[ix].decl = decl;
469         }
470       stack = TREE_CHAIN (stack);
471     }
472   saved_function_name_decls = stack;
473 }
474
475 /* Return the text name of the current function, suitable prettified
476    by PRETTY_P.  */
477
478 const char *
479 fname_as_string (pretty_p)
480      int pretty_p;
481 {
482   const char *name = NULL;
483   
484   if (pretty_p)
485     name = (current_function_decl
486             ? (*decl_printable_name) (current_function_decl, 2)
487             : "top level");
488   else if (current_function_decl && DECL_NAME (current_function_decl))
489     name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
490   else
491     name = "";
492   return name;
493 }
494
495 /* Return the text name of the current function, formatted as
496    required by the supplied RID value.  */
497
498 const char *
499 fname_string (rid)
500      unsigned rid;
501 {
502   unsigned ix;
503   
504   for (ix = 0; fname_vars[ix].decl; ix++)
505     if (fname_vars[ix].rid == rid)
506       break;
507   return fname_as_string (fname_vars[ix].pretty);
508 }
509
510 /* Return the VAR_DECL for a const char array naming the current
511    function. If the VAR_DECL has not yet been created, create it
512    now. RID indicates how it should be formatted and IDENTIFIER_NODE
513    ID is its name (unfortunately C and C++ hold the RID values of
514    keywords in different places, so we can't derive RID from ID in
515    this language independent code.  */
516
517 tree
518 fname_decl (rid, id)
519      unsigned rid;
520      tree id;
521 {
522   unsigned ix;
523   tree decl = NULL_TREE;
524
525   for (ix = 0; fname_vars[ix].decl; ix++)
526     if (fname_vars[ix].rid == rid)
527       break;
528
529   decl = *fname_vars[ix].decl;
530   if (!decl)
531     {
532       tree saved_last_tree = last_tree;
533       
534       decl = (*make_fname_decl) (id, fname_vars[ix].pretty);
535       if (last_tree != saved_last_tree)
536         {
537           /* We created some statement tree for the decl. This belongs
538              at the start of the function, so remove it now and reinsert
539              it after the function is complete.  */
540           tree stmts = TREE_CHAIN (saved_last_tree);
541
542           TREE_CHAIN (saved_last_tree) = NULL_TREE;
543           last_tree = saved_last_tree;
544           saved_function_name_decls = tree_cons (decl, stmts,
545                                                  saved_function_name_decls);
546         }
547       *fname_vars[ix].decl = decl;
548     }
549   if (!ix && !current_function_decl)
550     pedwarn_with_decl (decl, "`%s' is not defined outside of function scope");
551   
552   return decl;
553 }
554
555 /* Given a chain of STRING_CST nodes,
556    concatenate them into one STRING_CST
557    and give it a suitable array-of-chars data type.  */
558
559 tree
560 combine_strings (strings)
561      tree strings;
562 {
563   tree value, t;
564   int length = 1;
565   int wide_length = 0;
566   int wide_flag = 0;
567   int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
568   int nchars;
569   const int nchars_max = flag_isoc99 ? 4095 : 509;
570
571   if (TREE_CHAIN (strings))
572     {
573       /* More than one in the chain, so concatenate.  */
574       char *p, *q;
575
576       /* Don't include the \0 at the end of each substring,
577          except for the last one.
578          Count wide strings and ordinary strings separately.  */
579       for (t = strings; t; t = TREE_CHAIN (t))
580         {
581           if (TREE_TYPE (t) == wchar_array_type_node)
582             {
583               wide_length += (TREE_STRING_LENGTH (t) - wchar_bytes);
584               wide_flag = 1;
585             }
586           else
587             {
588               length += (TREE_STRING_LENGTH (t) - 1);
589               if (C_ARTIFICIAL_STRING_P (t) && !in_system_header)
590                 warning ("concatenation of string literals with __FUNCTION__ is deprecated"); 
591             }
592         }
593
594       /* If anything is wide, the non-wides will be converted,
595          which makes them take more space.  */
596       if (wide_flag)
597         length = length * wchar_bytes + wide_length;
598
599       p = xmalloc (length);
600
601       /* Copy the individual strings into the new combined string.
602          If the combined string is wide, convert the chars to ints
603          for any individual strings that are not wide.  */
604
605       q = p;
606       for (t = strings; t; t = TREE_CHAIN (t))
607         {
608           int len = (TREE_STRING_LENGTH (t)
609                      - ((TREE_TYPE (t) == wchar_array_type_node)
610                         ? wchar_bytes : 1));
611           if ((TREE_TYPE (t) == wchar_array_type_node) == wide_flag)
612             {
613               memcpy (q, TREE_STRING_POINTER (t), len);
614               q += len;
615             }
616           else
617             {
618               int i, j;
619               for (i = 0; i < len; i++)
620                 {
621                   if (BYTES_BIG_ENDIAN)
622                     {
623                       for (j=0; j<(WCHAR_TYPE_SIZE / BITS_PER_UNIT)-1; j++)
624                         *q++ = 0;
625                       *q++ = TREE_STRING_POINTER (t)[i];
626                     }
627                   else
628                     {
629                       *q++ = TREE_STRING_POINTER (t)[i];
630                       for (j=0; j<(WCHAR_TYPE_SIZE / BITS_PER_UNIT)-1; j++)
631                         *q++ = 0;
632                     }
633                 }
634             }
635         }
636       if (wide_flag)
637         {
638           int i;
639           for (i = 0; i < wchar_bytes; i++)
640             *q++ = 0;
641         }
642       else
643         *q = 0;
644
645       value = build_string (length, p);
646       free (p);
647     }
648   else
649     {
650       value = strings;
651       length = TREE_STRING_LENGTH (value);
652       if (TREE_TYPE (value) == wchar_array_type_node)
653         wide_flag = 1;
654     }
655
656   /* Compute the number of elements, for the array type.  */
657   nchars = wide_flag ? length / wchar_bytes : length;
658
659   if (pedantic && nchars - 1 > nchars_max && c_language == clk_c)
660     pedwarn ("string length `%d' is greater than the length `%d' ISO C%d compilers are required to support",
661              nchars - 1, nchars_max, flag_isoc99 ? 99 : 89);
662
663   /* Create the array type for the string constant.
664      -Wwrite-strings says make the string constant an array of const char
665      so that copying it to a non-const pointer will get a warning.
666      For C++, this is the standard behavior.  */
667   if (flag_const_strings
668       && (! flag_traditional  && ! flag_writable_strings))
669     {
670       tree elements
671         = build_type_variant (wide_flag ? wchar_type_node : char_type_node,
672                               1, 0);
673       TREE_TYPE (value)
674         = build_array_type (elements,
675                             build_index_type (build_int_2 (nchars - 1, 0)));
676     }
677   else
678     TREE_TYPE (value)
679       = build_array_type (wide_flag ? wchar_type_node : char_type_node,
680                           build_index_type (build_int_2 (nchars - 1, 0)));
681
682   TREE_CONSTANT (value) = 1;
683   TREE_READONLY (value) = ! flag_writable_strings;
684   TREE_STATIC (value) = 1;
685   return value;
686 }
687 \f
688 static int is_valid_printf_arglist PARAMS ((tree));
689 static rtx c_expand_builtin PARAMS ((tree, rtx, enum machine_mode, enum expand_modifier));
690 static rtx c_expand_builtin_printf PARAMS ((tree, rtx, enum machine_mode,
691                                             enum expand_modifier, int, int));
692 static rtx c_expand_builtin_fprintf PARAMS ((tree, rtx, enum machine_mode,
693                                              enum expand_modifier, int, int));
694 \f
695 /* Print a warning if a constant expression had overflow in folding.
696    Invoke this function on every expression that the language
697    requires to be a constant expression.
698    Note the ANSI C standard says it is erroneous for a
699    constant expression to overflow.  */
700
701 void
702 constant_expression_warning (value)
703      tree value;
704 {
705   if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
706        || TREE_CODE (value) == VECTOR_CST
707        || TREE_CODE (value) == COMPLEX_CST)
708       && TREE_CONSTANT_OVERFLOW (value) && pedantic)
709     pedwarn ("overflow in constant expression");
710 }
711
712 /* Print a warning if an expression had overflow in folding.
713    Invoke this function on every expression that
714    (1) appears in the source code, and
715    (2) might be a constant expression that overflowed, and
716    (3) is not already checked by convert_and_check;
717    however, do not invoke this function on operands of explicit casts.  */
718
719 void
720 overflow_warning (value)
721      tree value;
722 {
723   if ((TREE_CODE (value) == INTEGER_CST
724        || (TREE_CODE (value) == COMPLEX_CST
725            && TREE_CODE (TREE_REALPART (value)) == INTEGER_CST))
726       && TREE_OVERFLOW (value))
727     {
728       TREE_OVERFLOW (value) = 0;
729       if (skip_evaluation == 0)
730         warning ("integer overflow in expression");
731     }
732   else if ((TREE_CODE (value) == REAL_CST
733             || (TREE_CODE (value) == COMPLEX_CST
734                 && TREE_CODE (TREE_REALPART (value)) == REAL_CST))
735            && TREE_OVERFLOW (value))
736     {
737       TREE_OVERFLOW (value) = 0;
738       if (skip_evaluation == 0)
739         warning ("floating point overflow in expression");
740     }
741   else if (TREE_CODE (value) == VECTOR_CST && TREE_OVERFLOW (value))
742     {
743       TREE_OVERFLOW (value) = 0;
744       if (skip_evaluation == 0)
745         warning ("vector overflow in expression");
746     }
747 }
748
749 /* Print a warning if a large constant is truncated to unsigned,
750    or if -Wconversion is used and a constant < 0 is converted to unsigned.
751    Invoke this function on every expression that might be implicitly
752    converted to an unsigned type.  */
753
754 void
755 unsigned_conversion_warning (result, operand)
756      tree result, operand;
757 {
758   if (TREE_CODE (operand) == INTEGER_CST
759       && TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
760       && TREE_UNSIGNED (TREE_TYPE (result))
761       && skip_evaluation == 0
762       && !int_fits_type_p (operand, TREE_TYPE (result)))
763     {
764       if (!int_fits_type_p (operand, signed_type (TREE_TYPE (result))))
765         /* This detects cases like converting -129 or 256 to unsigned char.  */
766         warning ("large integer implicitly truncated to unsigned type");
767       else if (warn_conversion)
768         warning ("negative integer implicitly converted to unsigned type");
769     }
770 }
771
772 /* Nonzero if constant C has a value that is permissible
773    for type TYPE (an INTEGER_TYPE).  */
774
775 static int
776 constant_fits_type_p (c, type)
777      tree c, type;
778 {
779   if (TREE_CODE (c) == INTEGER_CST)
780     return int_fits_type_p (c, type);
781
782   c = convert (type, c);
783   return !TREE_OVERFLOW (c);
784 }     
785
786 /* Convert EXPR to TYPE, warning about conversion problems with constants.
787    Invoke this function on every expression that is converted implicitly,
788    i.e. because of language rules and not because of an explicit cast.  */
789
790 tree
791 convert_and_check (type, expr)
792      tree type, expr;
793 {
794   tree t = convert (type, expr);
795   if (TREE_CODE (t) == INTEGER_CST)
796     {
797       if (TREE_OVERFLOW (t))
798         {
799           TREE_OVERFLOW (t) = 0;
800
801           /* Do not diagnose overflow in a constant expression merely
802              because a conversion overflowed.  */
803           TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (expr);
804
805           /* No warning for converting 0x80000000 to int.  */
806           if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr))
807                 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
808                 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
809             /* If EXPR fits in the unsigned version of TYPE,
810                don't warn unless pedantic.  */
811             if ((pedantic
812                  || TREE_UNSIGNED (type)
813                  || ! constant_fits_type_p (expr, unsigned_type (type)))
814                 && skip_evaluation == 0)
815               warning ("overflow in implicit constant conversion");
816         }
817       else
818         unsigned_conversion_warning (t, expr);
819     }
820   return t;
821 }
822 \f
823 /* A node in a list that describes references to variables (EXPR), which are
824    either read accesses if WRITER is zero, or write accesses, in which case
825    WRITER is the parent of EXPR.  */
826 struct tlist
827 {
828   struct tlist *next;
829   tree expr, writer;
830 };
831
832 /* Used to implement a cache the results of a call to verify_tree.  We only
833    use this for SAVE_EXPRs.  */
834 struct tlist_cache
835 {
836   struct tlist_cache *next;
837   struct tlist *cache_before_sp;
838   struct tlist *cache_after_sp;
839   tree expr;
840 };
841
842 /* Obstack to use when allocating tlist structures, and corresponding
843    firstobj.  */
844 static struct obstack tlist_obstack;
845 static char *tlist_firstobj = 0;
846
847 /* Keep track of the identifiers we've warned about, so we can avoid duplicate
848    warnings.  */
849 static struct tlist *warned_ids;
850 /* SAVE_EXPRs need special treatment.  We process them only once and then
851    cache the results.  */
852 static struct tlist_cache *save_expr_cache;
853
854 static void add_tlist PARAMS ((struct tlist **, struct tlist *, tree, int));
855 static void merge_tlist PARAMS ((struct tlist **, struct tlist *, int));
856 static void verify_tree PARAMS ((tree, struct tlist **, struct tlist **, tree));
857 static int warning_candidate_p PARAMS ((tree));
858 static void warn_for_collisions PARAMS ((struct tlist *));
859 static void warn_for_collisions_1 PARAMS ((tree, tree, struct tlist *, int));
860 static struct tlist *new_tlist PARAMS ((struct tlist *, tree, tree));
861 static void verify_sequence_points PARAMS ((tree));
862
863 /* Create a new struct tlist and fill in its fields.  */
864 static struct tlist *
865 new_tlist (next, t, writer)
866      struct tlist *next;
867      tree t;
868      tree writer;
869 {
870   struct tlist *l;
871   l = (struct tlist *) obstack_alloc (&tlist_obstack, sizeof *l);
872   l->next = next;
873   l->expr = t;
874   l->writer = writer;
875   return l;
876 }
877
878 /* Add duplicates of the nodes found in ADD to the list *TO.  If EXCLUDE_WRITER
879    is nonnull, we ignore any node we find which has a writer equal to it.  */
880
881 static void
882 add_tlist (to, add, exclude_writer, copy)
883      struct tlist **to;
884      struct tlist *add;
885      tree exclude_writer;
886      int copy;
887 {
888   while (add)
889     {
890       struct tlist *next = add->next;
891       if (! copy)
892         add->next = *to;
893       if (! exclude_writer || add->writer != exclude_writer)
894         *to = copy ? new_tlist (*to, add->expr, add->writer) : add;
895       add = next;
896     }
897 }
898
899 /* Merge the nodes of ADD into TO.  This merging process is done so that for
900    each variable that already exists in TO, no new node is added; however if
901    there is a write access recorded in ADD, and an occurrence on TO is only
902    a read access, then the occurrence in TO will be modified to record the
903    write.  */
904
905 static void
906 merge_tlist (to, add, copy)
907      struct tlist **to;
908      struct tlist *add;
909      int copy;
910 {
911   struct tlist **end = to;
912
913   while (*end)
914     end = &(*end)->next;
915
916   while (add)
917     {
918       int found = 0;
919       struct tlist *tmp2;
920       struct tlist *next = add->next;
921
922       for (tmp2 = *to; tmp2; tmp2 = tmp2->next)
923         if (tmp2->expr == add->expr)
924           {
925             found = 1;
926             if (! tmp2->writer)
927               tmp2->writer = add->writer;
928           }
929       if (! found)
930         {
931           *end = copy ? add : new_tlist (NULL, add->expr, add->writer);
932           end = &(*end)->next;
933           *end = 0;
934         }
935       add = next;
936     }
937 }
938
939 /* WRITTEN is a variable, WRITER is its parent.  Warn if any of the variable
940    references in list LIST conflict with it, excluding reads if ONLY writers
941    is nonzero.  */
942
943 static void
944 warn_for_collisions_1 (written, writer, list, only_writes)
945      tree written, writer;
946      struct tlist *list;
947      int only_writes;
948 {
949   struct tlist *tmp;
950
951   /* Avoid duplicate warnings.  */
952   for (tmp = warned_ids; tmp; tmp = tmp->next)
953     if (tmp->expr == written)
954       return;
955
956   while (list)
957     {
958       if (list->expr == written
959           && list->writer != writer
960           && (! only_writes || list->writer))
961         {
962           warned_ids = new_tlist (warned_ids, written, NULL_TREE);
963           warning ("operation on `%s' may be undefined",
964                    IDENTIFIER_POINTER (DECL_NAME (list->expr)));
965         }
966       list = list->next;
967     }
968 }
969
970 /* Given a list LIST of references to variables, find whether any of these
971    can cause conflicts due to missing sequence points.  */
972
973 static void
974 warn_for_collisions (list)
975      struct tlist *list;
976 {
977   struct tlist *tmp;
978   
979   for (tmp = list; tmp; tmp = tmp->next)
980     {
981       if (tmp->writer)
982         warn_for_collisions_1 (tmp->expr, tmp->writer, list, 0);
983     }
984 }
985
986 /* Return nonzero if X is a tree that can be verified by the sequence point
987    warnings.  */
988 static int
989 warning_candidate_p (x)
990      tree x;
991 {
992   return TREE_CODE (x) == VAR_DECL || TREE_CODE (x) == PARM_DECL;
993 }
994
995 /* Walk the tree X, and record accesses to variables.  If X is written by the
996    parent tree, WRITER is the parent.
997    We store accesses in one of the two lists: PBEFORE_SP, and PNO_SP.  If this
998    expression or its only operand forces a sequence point, then everything up
999    to the sequence point is stored in PBEFORE_SP.  Everything else gets stored
1000    in PNO_SP.
1001    Once we return, we will have emitted warnings if any subexpression before
1002    such a sequence point could be undefined.  On a higher level, however, the
1003    sequence point may not be relevant, and we'll merge the two lists.
1004
1005    Example: (b++, a) + b;
1006    The call that processes the COMPOUND_EXPR will store the increment of B
1007    in PBEFORE_SP, and the use of A in PNO_SP.  The higher-level call that
1008    processes the PLUS_EXPR will need to merge the two lists so that
1009    eventually, all accesses end up on the same list (and we'll warn about the
1010    unordered subexpressions b++ and b.
1011
1012    A note on merging.  If we modify the former example so that our expression
1013    becomes
1014      (b++, b) + a
1015    care must be taken not simply to add all three expressions into the final
1016    PNO_SP list.  The function merge_tlist takes care of that by merging the
1017    before-SP list of the COMPOUND_EXPR into its after-SP list in a special
1018    way, so that no more than one access to B is recorded.  */
1019
1020 static void
1021 verify_tree (x, pbefore_sp, pno_sp, writer)
1022      tree x;
1023      struct tlist **pbefore_sp, **pno_sp;
1024      tree writer;
1025 {
1026   struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3;
1027   enum tree_code code;
1028   char class;
1029
1030   /* X may be NULL if it is the operand of an empty statement expression
1031      ({ }).  */
1032   if (x == NULL)
1033     return;
1034
1035  restart:
1036   code = TREE_CODE (x);
1037   class = TREE_CODE_CLASS (code);
1038
1039   if (warning_candidate_p (x))
1040     {
1041       *pno_sp = new_tlist (*pno_sp, x, writer);
1042       return;
1043     }
1044
1045   switch (code)
1046     {
1047     case CONSTRUCTOR:
1048       return;
1049
1050     case COMPOUND_EXPR:
1051     case TRUTH_ANDIF_EXPR:
1052     case TRUTH_ORIF_EXPR:
1053       tmp_before = tmp_nosp = tmp_list3 = 0;
1054       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1055       warn_for_collisions (tmp_nosp);
1056       merge_tlist (pbefore_sp, tmp_before, 0);
1057       merge_tlist (pbefore_sp, tmp_nosp, 0);
1058       verify_tree (TREE_OPERAND (x, 1), &tmp_list3, pno_sp, NULL_TREE);
1059       merge_tlist (pbefore_sp, tmp_list3, 0);
1060       return;
1061
1062     case COND_EXPR:
1063       tmp_before = tmp_list2 = 0;
1064       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_list2, NULL_TREE);
1065       warn_for_collisions (tmp_list2);
1066       merge_tlist (pbefore_sp, tmp_before, 0);
1067       merge_tlist (pbefore_sp, tmp_list2, 1);
1068
1069       tmp_list3 = tmp_nosp = 0;
1070       verify_tree (TREE_OPERAND (x, 1), &tmp_list3, &tmp_nosp, NULL_TREE);
1071       warn_for_collisions (tmp_nosp);
1072       merge_tlist (pbefore_sp, tmp_list3, 0);
1073
1074       tmp_list3 = tmp_list2 = 0;
1075       verify_tree (TREE_OPERAND (x, 2), &tmp_list3, &tmp_list2, NULL_TREE);
1076       warn_for_collisions (tmp_list2);
1077       merge_tlist (pbefore_sp, tmp_list3, 0);
1078       /* Rather than add both tmp_nosp and tmp_list2, we have to merge the
1079          two first, to avoid warning for (a ? b++ : b++).  */
1080       merge_tlist (&tmp_nosp, tmp_list2, 0);
1081       add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1082       return;
1083
1084     case PREDECREMENT_EXPR:
1085     case PREINCREMENT_EXPR:
1086     case POSTDECREMENT_EXPR:
1087     case POSTINCREMENT_EXPR:
1088       verify_tree (TREE_OPERAND (x, 0), pno_sp, pno_sp, x);
1089       return;
1090
1091     case MODIFY_EXPR:
1092       tmp_before = tmp_nosp = tmp_list3 = 0;
1093       verify_tree (TREE_OPERAND (x, 1), &tmp_before, &tmp_nosp, NULL_TREE);
1094       verify_tree (TREE_OPERAND (x, 0), &tmp_list3, &tmp_list3, x);
1095       /* Expressions inside the LHS are not ordered wrt. the sequence points
1096          in the RHS.  Example:
1097            *a = (a++, 2)
1098          Despite the fact that the modification of "a" is in the before_sp
1099          list (tmp_before), it conflicts with the use of "a" in the LHS.
1100          We can handle this by adding the contents of tmp_list3
1101          to those of tmp_before, and redoing the collision warnings for that
1102          list.  */
1103       add_tlist (&tmp_before, tmp_list3, x, 1);
1104       warn_for_collisions (tmp_before);
1105       /* Exclude the LHS itself here; we first have to merge it into the
1106          tmp_nosp list.  This is done to avoid warning for "a = a"; if we
1107          didn't exclude the LHS, we'd get it twice, once as a read and once
1108          as a write.  */
1109       add_tlist (pno_sp, tmp_list3, x, 0);
1110       warn_for_collisions_1 (TREE_OPERAND (x, 0), x, tmp_nosp, 1);
1111
1112       merge_tlist (pbefore_sp, tmp_before, 0);
1113       if (warning_candidate_p (TREE_OPERAND (x, 0)))
1114         merge_tlist (&tmp_nosp, new_tlist (NULL, TREE_OPERAND (x, 0), x), 0);
1115       add_tlist (pno_sp, tmp_nosp, NULL_TREE, 1);
1116       return;
1117
1118     case CALL_EXPR:
1119       /* We need to warn about conflicts among arguments and conflicts between
1120          args and the function address.  Side effects of the function address,
1121          however, are not ordered by the sequence point of the call.  */
1122       tmp_before = tmp_nosp = tmp_list2 = tmp_list3 = 0;
1123       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1124       if (TREE_OPERAND (x, 1))
1125         verify_tree (TREE_OPERAND (x, 1), &tmp_list2, &tmp_list3, NULL_TREE);
1126       merge_tlist (&tmp_list3, tmp_list2, 0);
1127       add_tlist (&tmp_before, tmp_list3, NULL_TREE, 0);
1128       add_tlist (&tmp_before, tmp_nosp, NULL_TREE, 0);
1129       warn_for_collisions (tmp_before);
1130       add_tlist (pbefore_sp, tmp_before, NULL_TREE, 0);
1131       return;
1132
1133     case TREE_LIST:
1134       /* Scan all the list, e.g. indices of multi dimensional array.  */
1135       while (x)
1136         {
1137           tmp_before = tmp_nosp = 0;
1138           verify_tree (TREE_VALUE (x), &tmp_before, &tmp_nosp, NULL_TREE);
1139           merge_tlist (&tmp_nosp, tmp_before, 0);
1140           add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1141           x = TREE_CHAIN (x);
1142         }
1143       return;
1144
1145     case SAVE_EXPR:
1146       {
1147         struct tlist_cache *t;
1148         for (t = save_expr_cache; t; t = t->next)
1149           if (t->expr == x)
1150             break;
1151
1152         if (! t)
1153           {
1154             t = (struct tlist_cache *) obstack_alloc (&tlist_obstack,
1155                                                       sizeof *t);
1156             t->next = save_expr_cache;
1157             t->expr = x;
1158             save_expr_cache = t;
1159
1160             tmp_before = tmp_nosp = 0;
1161             verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1162             warn_for_collisions (tmp_nosp);
1163
1164             tmp_list3 = 0;
1165             while (tmp_nosp)
1166               {
1167                 struct tlist *t = tmp_nosp;
1168                 tmp_nosp = t->next;
1169                 merge_tlist (&tmp_list3, t, 0);
1170               }
1171             t->cache_before_sp = tmp_before;
1172             t->cache_after_sp = tmp_list3;
1173           }
1174         merge_tlist (pbefore_sp, t->cache_before_sp, 1);
1175         add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1);
1176         return;
1177       }
1178     default:
1179       break;
1180     }
1181
1182   if (class == '1')
1183     {
1184       if (first_rtl_op (code) == 0)
1185         return;
1186       x = TREE_OPERAND (x, 0);
1187       writer = 0;
1188       goto restart;
1189     }
1190
1191   switch (class)
1192     {
1193     case 'r':
1194     case '<':
1195     case '2':
1196     case 'b':
1197     case 'e':
1198     case 's':
1199     case 'x':
1200       {
1201         int lp;
1202         int max = first_rtl_op (TREE_CODE (x));
1203         for (lp = 0; lp < max; lp++)
1204           {
1205             tmp_before = tmp_nosp = 0;
1206             verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, NULL_TREE);
1207             merge_tlist (&tmp_nosp, tmp_before, 0);
1208             add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1209           }
1210         break;
1211       }
1212     }
1213 }
1214
1215 /* Try to warn for undefined behaviour in EXPR due to missing sequence
1216    points.  */
1217
1218 static void
1219 verify_sequence_points (expr)
1220      tree expr;
1221 {
1222   struct tlist *before_sp = 0, *after_sp = 0;
1223
1224   warned_ids = 0;
1225   save_expr_cache = 0;
1226   if (tlist_firstobj == 0)
1227     {
1228       gcc_obstack_init (&tlist_obstack);
1229       tlist_firstobj = obstack_alloc (&tlist_obstack, 0);
1230     }
1231
1232   verify_tree (expr, &before_sp, &after_sp, 0);
1233   warn_for_collisions (after_sp);
1234   obstack_free (&tlist_obstack, tlist_firstobj);
1235 }
1236
1237 tree
1238 c_expand_expr_stmt (expr)
1239      tree expr;
1240 {
1241   /* Do default conversion if safe and possibly important,
1242      in case within ({...}).  */
1243   if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
1244        && (flag_isoc99 || lvalue_p (expr)))
1245       || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
1246     expr = default_conversion (expr);
1247
1248   if (warn_sequence_point)
1249     verify_sequence_points (expr);
1250
1251   if (TREE_TYPE (expr) != error_mark_node
1252       && !COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (expr))
1253       && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
1254     error ("expression statement has incomplete type");
1255
1256   last_expr_type = TREE_TYPE (expr); 
1257   return add_stmt (build_stmt (EXPR_STMT, expr));
1258 }
1259 \f
1260 /* Validate the expression after `case' and apply default promotions.  */
1261
1262 tree
1263 check_case_value (value)
1264      tree value;
1265 {
1266   if (value == NULL_TREE)
1267     return value;
1268
1269   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
1270   STRIP_TYPE_NOPS (value);
1271   /* In C++, the following is allowed:
1272
1273        const int i = 3;
1274        switch (...) { case i: ... }
1275
1276      So, we try to reduce the VALUE to a constant that way.  */
1277   if (c_language == clk_cplusplus)
1278     {
1279       value = decl_constant_value (value);
1280       STRIP_TYPE_NOPS (value);
1281       value = fold (value);
1282     }
1283
1284   if (TREE_CODE (value) != INTEGER_CST
1285       && value != error_mark_node)
1286     {
1287       error ("case label does not reduce to an integer constant");
1288       value = error_mark_node;
1289     }
1290   else
1291     /* Promote char or short to int.  */
1292     value = default_conversion (value);
1293
1294   constant_expression_warning (value);
1295
1296   return value;
1297 }
1298 \f
1299 /* Return an integer type with BITS bits of precision,
1300    that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
1301
1302 tree
1303 type_for_size (bits, unsignedp)
1304      unsigned bits;
1305      int unsignedp;
1306 {
1307   if (bits == TYPE_PRECISION (integer_type_node))
1308     return unsignedp ? unsigned_type_node : integer_type_node;
1309
1310   if (bits == TYPE_PRECISION (signed_char_type_node))
1311     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1312
1313   if (bits == TYPE_PRECISION (short_integer_type_node))
1314     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1315
1316   if (bits == TYPE_PRECISION (long_integer_type_node))
1317     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1318
1319   if (bits == TYPE_PRECISION (long_long_integer_type_node))
1320     return (unsignedp ? long_long_unsigned_type_node
1321             : long_long_integer_type_node);
1322
1323   if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
1324     return (unsignedp ? widest_unsigned_literal_type_node
1325             : widest_integer_literal_type_node);
1326
1327   if (bits <= TYPE_PRECISION (intQI_type_node))
1328     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1329
1330   if (bits <= TYPE_PRECISION (intHI_type_node))
1331     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1332
1333   if (bits <= TYPE_PRECISION (intSI_type_node))
1334     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1335
1336   if (bits <= TYPE_PRECISION (intDI_type_node))
1337     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1338
1339   return 0;
1340 }
1341
1342 /* Return a data type that has machine mode MODE.
1343    If the mode is an integer,
1344    then UNSIGNEDP selects between signed and unsigned types.  */
1345
1346 tree
1347 type_for_mode (mode, unsignedp)
1348      enum machine_mode mode;
1349      int unsignedp;
1350 {
1351   if (mode == TYPE_MODE (integer_type_node))
1352     return unsignedp ? unsigned_type_node : integer_type_node;
1353
1354   if (mode == TYPE_MODE (signed_char_type_node))
1355     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1356
1357   if (mode == TYPE_MODE (short_integer_type_node))
1358     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1359
1360   if (mode == TYPE_MODE (long_integer_type_node))
1361     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1362
1363   if (mode == TYPE_MODE (long_long_integer_type_node))
1364     return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
1365
1366   if (mode == TYPE_MODE (widest_integer_literal_type_node))
1367     return unsignedp ? widest_unsigned_literal_type_node
1368                      : widest_integer_literal_type_node;
1369
1370   if (mode == QImode)
1371     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1372
1373   if (mode == HImode)
1374     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1375
1376   if (mode == SImode)
1377     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1378
1379   if (mode == DImode)
1380     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1381
1382 #if HOST_BITS_PER_WIDE_INT >= 64
1383   if (mode == TYPE_MODE (intTI_type_node))
1384     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
1385 #endif
1386
1387   if (mode == TYPE_MODE (float_type_node))
1388     return float_type_node;
1389
1390   if (mode == TYPE_MODE (double_type_node))
1391     return double_type_node;
1392
1393   if (mode == TYPE_MODE (long_double_type_node))
1394     return long_double_type_node;
1395
1396   if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
1397     return build_pointer_type (char_type_node);
1398
1399   if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
1400     return build_pointer_type (integer_type_node);
1401
1402 #ifdef VECTOR_MODE_SUPPORTED_P
1403   if (VECTOR_MODE_SUPPORTED_P (mode))
1404     {
1405       switch (mode)
1406         {
1407         case V16QImode:
1408           return unsignedp ? unsigned_V16QI_type_node : V16QI_type_node;
1409         case V8HImode:
1410           return unsignedp ? unsigned_V8HI_type_node : V8HI_type_node;
1411         case V4SImode:
1412           return unsignedp ? unsigned_V4SI_type_node : V4SI_type_node;
1413         case V2SImode:
1414           return unsignedp ? unsigned_V2SI_type_node : V2SI_type_node;
1415         case V4HImode:
1416           return unsignedp ? unsigned_V4HI_type_node : V4HI_type_node;
1417         case V8QImode:
1418           return unsignedp ? unsigned_V8QI_type_node : V8QI_type_node;
1419         case V16SFmode:
1420           return V16SF_type_node;
1421         case V4SFmode:
1422           return V4SF_type_node;
1423         case V2SFmode:
1424           return V2SF_type_node;
1425         default:
1426           break;
1427         }
1428     }
1429 #endif
1430
1431   return 0;
1432 }
1433
1434 /* Return an unsigned type the same as TYPE in other respects.  */
1435 tree
1436 unsigned_type (type)
1437      tree type;
1438 {
1439   tree type1 = TYPE_MAIN_VARIANT (type);
1440   if (type1 == signed_char_type_node || type1 == char_type_node)
1441     return unsigned_char_type_node;
1442   if (type1 == integer_type_node)
1443     return unsigned_type_node;
1444   if (type1 == short_integer_type_node)
1445     return short_unsigned_type_node;
1446   if (type1 == long_integer_type_node)
1447     return long_unsigned_type_node;
1448   if (type1 == long_long_integer_type_node)
1449     return long_long_unsigned_type_node;
1450   if (type1 == widest_integer_literal_type_node)
1451     return widest_unsigned_literal_type_node;
1452 #if HOST_BITS_PER_WIDE_INT >= 64
1453   if (type1 == intTI_type_node)
1454     return unsigned_intTI_type_node;
1455 #endif
1456   if (type1 == intDI_type_node)
1457     return unsigned_intDI_type_node;
1458   if (type1 == intSI_type_node)
1459     return unsigned_intSI_type_node;
1460   if (type1 == intHI_type_node)
1461     return unsigned_intHI_type_node;
1462   if (type1 == intQI_type_node)
1463     return unsigned_intQI_type_node;
1464
1465   return signed_or_unsigned_type (1, type);
1466 }
1467
1468 /* Return a signed type the same as TYPE in other respects.  */
1469
1470 tree
1471 signed_type (type)
1472      tree type;
1473 {
1474   tree type1 = TYPE_MAIN_VARIANT (type);
1475   if (type1 == unsigned_char_type_node || type1 == char_type_node)
1476     return signed_char_type_node;
1477   if (type1 == unsigned_type_node)
1478     return integer_type_node;
1479   if (type1 == short_unsigned_type_node)
1480     return short_integer_type_node;
1481   if (type1 == long_unsigned_type_node)
1482     return long_integer_type_node;
1483   if (type1 == long_long_unsigned_type_node)
1484     return long_long_integer_type_node;
1485   if (type1 == widest_unsigned_literal_type_node)
1486     return widest_integer_literal_type_node;
1487 #if HOST_BITS_PER_WIDE_INT >= 64
1488   if (type1 == unsigned_intTI_type_node)
1489     return intTI_type_node;
1490 #endif
1491   if (type1 == unsigned_intDI_type_node)
1492     return intDI_type_node;
1493   if (type1 == unsigned_intSI_type_node)
1494     return intSI_type_node;
1495   if (type1 == unsigned_intHI_type_node)
1496     return intHI_type_node;
1497   if (type1 == unsigned_intQI_type_node)
1498     return intQI_type_node;
1499
1500   return signed_or_unsigned_type (0, type);
1501 }
1502
1503 /* Return a type the same as TYPE except unsigned or
1504    signed according to UNSIGNEDP.  */
1505
1506 tree
1507 signed_or_unsigned_type (unsignedp, type)
1508      int unsignedp;
1509      tree type;
1510 {
1511   if (! INTEGRAL_TYPE_P (type)
1512       || TREE_UNSIGNED (type) == unsignedp)
1513     return type;
1514
1515   if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
1516     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1517   if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
1518     return unsignedp ? unsigned_type_node : integer_type_node;
1519   if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node))
1520     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1521   if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node))
1522     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1523   if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node))
1524     return (unsignedp ? long_long_unsigned_type_node
1525             : long_long_integer_type_node);
1526   if (TYPE_PRECISION (type) == TYPE_PRECISION (widest_integer_literal_type_node))
1527     return (unsignedp ? widest_unsigned_literal_type_node
1528             : widest_integer_literal_type_node);
1529
1530 #if HOST_BITS_PER_WIDE_INT >= 64
1531   if (TYPE_PRECISION (type) == TYPE_PRECISION (intTI_type_node))
1532     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
1533 #endif
1534   if (TYPE_PRECISION (type) == TYPE_PRECISION (intDI_type_node))
1535     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1536   if (TYPE_PRECISION (type) == TYPE_PRECISION (intSI_type_node))
1537     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1538   if (TYPE_PRECISION (type) == TYPE_PRECISION (intHI_type_node))
1539     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1540   if (TYPE_PRECISION (type) == TYPE_PRECISION (intQI_type_node))
1541     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1542
1543   return type;
1544 }
1545 \f
1546 /* Return the minimum number of bits needed to represent VALUE in a
1547    signed or unsigned type, UNSIGNEDP says which.  */
1548
1549 unsigned int
1550 min_precision (value, unsignedp)
1551      tree value;
1552      int unsignedp;
1553 {
1554   int log;
1555
1556   /* If the value is negative, compute its negative minus 1.  The latter
1557      adjustment is because the absolute value of the largest negative value
1558      is one larger than the largest positive value.  This is equivalent to
1559      a bit-wise negation, so use that operation instead.  */
1560
1561   if (tree_int_cst_sgn (value) < 0)
1562     value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value));
1563
1564   /* Return the number of bits needed, taking into account the fact
1565      that we need one more bit for a signed than unsigned type.  */
1566
1567   if (integer_zerop (value))
1568     log = 0;
1569   else
1570     log = tree_floor_log2 (value);
1571
1572   return log + 1 + ! unsignedp;
1573 }
1574 \f
1575 /* Print an error message for invalid operands to arith operation CODE.
1576    NOP_EXPR is used as a special case (see truthvalue_conversion).  */
1577
1578 void
1579 binary_op_error (code)
1580      enum tree_code code;
1581 {
1582   const char *opname;
1583
1584   switch (code)
1585     {
1586     case NOP_EXPR:
1587       error ("invalid truth-value expression");
1588       return;
1589
1590     case PLUS_EXPR:
1591       opname = "+"; break;
1592     case MINUS_EXPR:
1593       opname = "-"; break;
1594     case MULT_EXPR:
1595       opname = "*"; break;
1596     case MAX_EXPR:
1597       opname = "max"; break;
1598     case MIN_EXPR:
1599       opname = "min"; break;
1600     case EQ_EXPR:
1601       opname = "=="; break;
1602     case NE_EXPR:
1603       opname = "!="; break;
1604     case LE_EXPR:
1605       opname = "<="; break;
1606     case GE_EXPR:
1607       opname = ">="; break;
1608     case LT_EXPR:
1609       opname = "<"; break;
1610     case GT_EXPR:
1611       opname = ">"; break;
1612     case LSHIFT_EXPR:
1613       opname = "<<"; break;
1614     case RSHIFT_EXPR:
1615       opname = ">>"; break;
1616     case TRUNC_MOD_EXPR:
1617     case FLOOR_MOD_EXPR:
1618       opname = "%"; break;
1619     case TRUNC_DIV_EXPR:
1620     case FLOOR_DIV_EXPR:
1621       opname = "/"; break;
1622     case BIT_AND_EXPR:
1623       opname = "&"; break;
1624     case BIT_IOR_EXPR:
1625       opname = "|"; break;
1626     case TRUTH_ANDIF_EXPR:
1627       opname = "&&"; break;
1628     case TRUTH_ORIF_EXPR:
1629       opname = "||"; break;
1630     case BIT_XOR_EXPR:
1631       opname = "^"; break;
1632     case LROTATE_EXPR:
1633     case RROTATE_EXPR:
1634       opname = "rotate"; break;
1635     default:
1636       opname = "unknown"; break;
1637     }
1638   error ("invalid operands to binary %s", opname);
1639 }
1640 \f
1641 /* Subroutine of build_binary_op, used for comparison operations.
1642    See if the operands have both been converted from subword integer types
1643    and, if so, perhaps change them both back to their original type.
1644    This function is also responsible for converting the two operands
1645    to the proper common type for comparison.
1646
1647    The arguments of this function are all pointers to local variables
1648    of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
1649    RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
1650
1651    If this function returns nonzero, it means that the comparison has
1652    a constant value.  What this function returns is an expression for
1653    that value.  */
1654
1655 tree
1656 shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
1657      tree *op0_ptr, *op1_ptr;
1658      tree *restype_ptr;
1659      enum tree_code *rescode_ptr;
1660 {
1661   tree type;
1662   tree op0 = *op0_ptr;
1663   tree op1 = *op1_ptr;
1664   int unsignedp0, unsignedp1;
1665   int real1, real2;
1666   tree primop0, primop1;
1667   enum tree_code code = *rescode_ptr;
1668
1669   /* Throw away any conversions to wider types
1670      already present in the operands.  */
1671
1672   primop0 = get_narrower (op0, &unsignedp0);
1673   primop1 = get_narrower (op1, &unsignedp1);
1674
1675   /* Handle the case that OP0 does not *contain* a conversion
1676      but it *requires* conversion to FINAL_TYPE.  */
1677
1678   if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
1679     unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
1680   if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
1681     unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
1682
1683   /* If one of the operands must be floated, we cannot optimize.  */
1684   real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
1685   real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
1686
1687   /* If first arg is constant, swap the args (changing operation
1688      so value is preserved), for canonicalization.  Don't do this if
1689      the second arg is 0.  */
1690
1691   if (TREE_CONSTANT (primop0)
1692       && ! integer_zerop (primop1) && ! real_zerop (primop1))
1693     {
1694       tree tem = primop0;
1695       int temi = unsignedp0;
1696       primop0 = primop1;
1697       primop1 = tem;
1698       tem = op0;
1699       op0 = op1;
1700       op1 = tem;
1701       *op0_ptr = op0;
1702       *op1_ptr = op1;
1703       unsignedp0 = unsignedp1;
1704       unsignedp1 = temi;
1705       temi = real1;
1706       real1 = real2;
1707       real2 = temi;
1708
1709       switch (code)
1710         {
1711         case LT_EXPR:
1712           code = GT_EXPR;
1713           break;
1714         case GT_EXPR:
1715           code = LT_EXPR;
1716           break;
1717         case LE_EXPR:
1718           code = GE_EXPR;
1719           break;
1720         case GE_EXPR:
1721           code = LE_EXPR;
1722           break;
1723         default:
1724           break;
1725         }
1726       *rescode_ptr = code;
1727     }
1728
1729   /* If comparing an integer against a constant more bits wide,
1730      maybe we can deduce a value of 1 or 0 independent of the data.
1731      Or else truncate the constant now
1732      rather than extend the variable at run time.
1733
1734      This is only interesting if the constant is the wider arg.
1735      Also, it is not safe if the constant is unsigned and the
1736      variable arg is signed, since in this case the variable
1737      would be sign-extended and then regarded as unsigned.
1738      Our technique fails in this case because the lowest/highest
1739      possible unsigned results don't follow naturally from the
1740      lowest/highest possible values of the variable operand.
1741      For just EQ_EXPR and NE_EXPR there is another technique that
1742      could be used: see if the constant can be faithfully represented
1743      in the other operand's type, by truncating it and reextending it
1744      and see if that preserves the constant's value.  */
1745
1746   if (!real1 && !real2
1747       && TREE_CODE (primop1) == INTEGER_CST
1748       && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
1749     {
1750       int min_gt, max_gt, min_lt, max_lt;
1751       tree maxval, minval;
1752       /* 1 if comparison is nominally unsigned.  */
1753       int unsignedp = TREE_UNSIGNED (*restype_ptr);
1754       tree val;
1755
1756       type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0));
1757
1758       /* If TYPE is an enumeration, then we need to get its min/max
1759          values from it's underlying integral type, not the enumerated
1760          type itself.  */
1761       if (TREE_CODE (type) == ENUMERAL_TYPE)
1762         type = type_for_size (TYPE_PRECISION (type), unsignedp0);
1763
1764       maxval = TYPE_MAX_VALUE (type);
1765       minval = TYPE_MIN_VALUE (type);
1766
1767       if (unsignedp && !unsignedp0)
1768         *restype_ptr = signed_type (*restype_ptr);
1769
1770       if (TREE_TYPE (primop1) != *restype_ptr)
1771         primop1 = convert (*restype_ptr, primop1);
1772       if (type != *restype_ptr)
1773         {
1774           minval = convert (*restype_ptr, minval);
1775           maxval = convert (*restype_ptr, maxval);
1776         }
1777
1778       if (unsignedp && unsignedp0)
1779         {
1780           min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
1781           max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
1782           min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
1783           max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
1784         }
1785       else
1786         {
1787           min_gt = INT_CST_LT (primop1, minval);
1788           max_gt = INT_CST_LT (primop1, maxval);
1789           min_lt = INT_CST_LT (minval, primop1);
1790           max_lt = INT_CST_LT (maxval, primop1);
1791         }
1792
1793       val = 0;
1794       /* This used to be a switch, but Genix compiler can't handle that.  */
1795       if (code == NE_EXPR)
1796         {
1797           if (max_lt || min_gt)
1798             val = boolean_true_node;
1799         }
1800       else if (code == EQ_EXPR)
1801         {
1802           if (max_lt || min_gt)
1803             val = boolean_false_node;
1804         }
1805       else if (code == LT_EXPR)
1806         {
1807           if (max_lt)
1808             val = boolean_true_node;
1809           if (!min_lt)
1810             val = boolean_false_node;
1811         }
1812       else if (code == GT_EXPR)
1813         {
1814           if (min_gt)
1815             val = boolean_true_node;
1816           if (!max_gt)
1817             val = boolean_false_node;
1818         }
1819       else if (code == LE_EXPR)
1820         {
1821           if (!max_gt)
1822             val = boolean_true_node;
1823           if (min_gt)
1824             val = boolean_false_node;
1825         }
1826       else if (code == GE_EXPR)
1827         {
1828           if (!min_lt)
1829             val = boolean_true_node;
1830           if (max_lt)
1831             val = boolean_false_node;
1832         }
1833
1834       /* If primop0 was sign-extended and unsigned comparison specd,
1835          we did a signed comparison above using the signed type bounds.
1836          But the comparison we output must be unsigned.
1837
1838          Also, for inequalities, VAL is no good; but if the signed
1839          comparison had *any* fixed result, it follows that the
1840          unsigned comparison just tests the sign in reverse
1841          (positive values are LE, negative ones GE).
1842          So we can generate an unsigned comparison
1843          against an extreme value of the signed type.  */
1844
1845       if (unsignedp && !unsignedp0)
1846         {
1847           if (val != 0)
1848             switch (code)
1849               {
1850               case LT_EXPR:
1851               case GE_EXPR:
1852                 primop1 = TYPE_MIN_VALUE (type);
1853                 val = 0;
1854                 break;
1855
1856               case LE_EXPR:
1857               case GT_EXPR:
1858                 primop1 = TYPE_MAX_VALUE (type);
1859                 val = 0;
1860                 break;
1861
1862               default:
1863                 break;
1864               }
1865           type = unsigned_type (type);
1866         }
1867
1868       if (!max_gt && !unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
1869         {
1870           /* This is the case of (char)x >?< 0x80, which people used to use
1871              expecting old C compilers to change the 0x80 into -0x80.  */
1872           if (val == boolean_false_node)
1873             warning ("comparison is always false due to limited range of data type");
1874           if (val == boolean_true_node)
1875             warning ("comparison is always true due to limited range of data type");
1876         }
1877
1878       if (!min_lt && unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
1879         {
1880           /* This is the case of (unsigned char)x >?< -1 or < 0.  */
1881           if (val == boolean_false_node)
1882             warning ("comparison is always false due to limited range of data type");
1883           if (val == boolean_true_node)
1884             warning ("comparison is always true due to limited range of data type");
1885         }
1886
1887       if (val != 0)
1888         {
1889           /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
1890           if (TREE_SIDE_EFFECTS (primop0))
1891             return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
1892           return val;
1893         }
1894
1895       /* Value is not predetermined, but do the comparison
1896          in the type of the operand that is not constant.
1897          TYPE is already properly set.  */
1898     }
1899   else if (real1 && real2
1900            && (TYPE_PRECISION (TREE_TYPE (primop0))
1901                == TYPE_PRECISION (TREE_TYPE (primop1))))
1902     type = TREE_TYPE (primop0);
1903
1904   /* If args' natural types are both narrower than nominal type
1905      and both extend in the same manner, compare them
1906      in the type of the wider arg.
1907      Otherwise must actually extend both to the nominal
1908      common type lest different ways of extending
1909      alter the result.
1910      (eg, (short)-1 == (unsigned short)-1  should be 0.)  */
1911
1912   else if (unsignedp0 == unsignedp1 && real1 == real2
1913            && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
1914            && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
1915     {
1916       type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
1917       type = signed_or_unsigned_type (unsignedp0
1918                                       || TREE_UNSIGNED (*restype_ptr),
1919                                       type);
1920       /* Make sure shorter operand is extended the right way
1921          to match the longer operand.  */
1922       primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)),
1923                          primop0);
1924       primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
1925                          primop1);
1926     }
1927   else
1928     {
1929       /* Here we must do the comparison on the nominal type
1930          using the args exactly as we received them.  */
1931       type = *restype_ptr;
1932       primop0 = op0;
1933       primop1 = op1;
1934
1935       if (!real1 && !real2 && integer_zerop (primop1)
1936           && TREE_UNSIGNED (*restype_ptr))
1937         {
1938           tree value = 0;
1939           switch (code)
1940             {
1941             case GE_EXPR:
1942               /* All unsigned values are >= 0, so we warn if extra warnings
1943                  are requested.  However, if OP0 is a constant that is
1944                  >= 0, the signedness of the comparison isn't an issue,
1945                  so suppress the warning.  */
1946               if (extra_warnings && !in_system_header
1947                   && ! (TREE_CODE (primop0) == INTEGER_CST
1948                         && ! TREE_OVERFLOW (convert (signed_type (type),
1949                                                      primop0))))
1950                 warning ("comparison of unsigned expression >= 0 is always true");
1951               value = boolean_true_node;
1952               break;
1953
1954             case LT_EXPR:
1955               if (extra_warnings && !in_system_header
1956                   && ! (TREE_CODE (primop0) == INTEGER_CST
1957                         && ! TREE_OVERFLOW (convert (signed_type (type),
1958                                                      primop0))))
1959                 warning ("comparison of unsigned expression < 0 is always false");
1960               value = boolean_false_node;
1961               break;
1962
1963             default:
1964               break;
1965             }
1966
1967           if (value != 0)
1968             {
1969               /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
1970               if (TREE_SIDE_EFFECTS (primop0))
1971                 return build (COMPOUND_EXPR, TREE_TYPE (value),
1972                               primop0, value);
1973               return value;
1974             }
1975         }
1976     }
1977
1978   *op0_ptr = convert (type, primop0);
1979   *op1_ptr = convert (type, primop1);
1980
1981   *restype_ptr = boolean_type_node;
1982
1983   return 0;
1984 }
1985 \f
1986 /* Return a tree for the sum or difference (RESULTCODE says which)
1987    of pointer PTROP and integer INTOP.  */
1988
1989 tree
1990 pointer_int_sum (resultcode, ptrop, intop)
1991      enum tree_code resultcode;
1992      tree ptrop, intop;
1993 {
1994   tree size_exp;
1995
1996   tree result;
1997   tree folded;
1998
1999   /* The result is a pointer of the same type that is being added.  */
2000
2001   tree result_type = TREE_TYPE (ptrop);
2002
2003   if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
2004     {
2005       if (pedantic || warn_pointer_arith)
2006         pedwarn ("pointer of type `void *' used in arithmetic");
2007       size_exp = integer_one_node;
2008     }
2009   else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
2010     {
2011       if (pedantic || warn_pointer_arith)
2012         pedwarn ("pointer to a function used in arithmetic");
2013       size_exp = integer_one_node;
2014     }
2015   else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
2016     {
2017       if (pedantic || warn_pointer_arith)
2018         pedwarn ("pointer to member function used in arithmetic");
2019       size_exp = integer_one_node;
2020     }
2021   else if (TREE_CODE (TREE_TYPE (result_type)) == OFFSET_TYPE)
2022     {
2023       if (pedantic || warn_pointer_arith)
2024         pedwarn ("pointer to a member used in arithmetic");
2025       size_exp = integer_one_node;
2026     }
2027   else
2028     size_exp = size_in_bytes (TREE_TYPE (result_type));
2029
2030   /* If what we are about to multiply by the size of the elements
2031      contains a constant term, apply distributive law
2032      and multiply that constant term separately.
2033      This helps produce common subexpressions.  */
2034
2035   if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
2036       && ! TREE_CONSTANT (intop)
2037       && TREE_CONSTANT (TREE_OPERAND (intop, 1))
2038       && TREE_CONSTANT (size_exp)
2039       /* If the constant comes from pointer subtraction,
2040          skip this optimization--it would cause an error.  */
2041       && TREE_CODE (TREE_TYPE (TREE_OPERAND (intop, 0))) == INTEGER_TYPE
2042       /* If the constant is unsigned, and smaller than the pointer size,
2043          then we must skip this optimization.  This is because it could cause
2044          an overflow error if the constant is negative but INTOP is not.  */
2045       && (! TREE_UNSIGNED (TREE_TYPE (intop))
2046           || (TYPE_PRECISION (TREE_TYPE (intop))
2047               == TYPE_PRECISION (TREE_TYPE (ptrop)))))
2048     {
2049       enum tree_code subcode = resultcode;
2050       tree int_type = TREE_TYPE (intop);
2051       if (TREE_CODE (intop) == MINUS_EXPR)
2052         subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
2053       /* Convert both subexpression types to the type of intop,
2054          because weird cases involving pointer arithmetic
2055          can result in a sum or difference with different type args.  */
2056       ptrop = build_binary_op (subcode, ptrop,
2057                                convert (int_type, TREE_OPERAND (intop, 1)), 1);
2058       intop = convert (int_type, TREE_OPERAND (intop, 0));
2059     }
2060
2061   /* Convert the integer argument to a type the same size as sizetype
2062      so the multiply won't overflow spuriously.  */
2063
2064   if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
2065       || TREE_UNSIGNED (TREE_TYPE (intop)) != TREE_UNSIGNED (sizetype))
2066     intop = convert (type_for_size (TYPE_PRECISION (sizetype), 
2067                                     TREE_UNSIGNED (sizetype)), intop);
2068
2069   /* Replace the integer argument with a suitable product by the object size.
2070      Do this multiplication as signed, then convert to the appropriate
2071      pointer type (actually unsigned integral).  */
2072
2073   intop = convert (result_type,
2074                    build_binary_op (MULT_EXPR, intop,
2075                                     convert (TREE_TYPE (intop), size_exp), 1));
2076
2077   /* Create the sum or difference.  */
2078
2079   result = build (resultcode, result_type, ptrop, intop);
2080
2081   folded = fold (result);
2082   if (folded == result)
2083     TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop);
2084   return folded;
2085 }
2086 \f
2087 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
2088    or validate its data type for an `if' or `while' statement or ?..: exp.
2089
2090    This preparation consists of taking the ordinary
2091    representation of an expression expr and producing a valid tree
2092    boolean expression describing whether expr is nonzero.  We could
2093    simply always do build_binary_op (NE_EXPR, expr, boolean_false_node, 1),
2094    but we optimize comparisons, &&, ||, and !.
2095
2096    The resulting type should always be `boolean_type_node'.  */
2097
2098 tree
2099 truthvalue_conversion (expr)
2100      tree expr;
2101 {
2102   if (TREE_CODE (expr) == ERROR_MARK)
2103     return expr;
2104
2105 #if 0 /* This appears to be wrong for C++.  */
2106   /* These really should return error_mark_node after 2.4 is stable.
2107      But not all callers handle ERROR_MARK properly.  */
2108   switch (TREE_CODE (TREE_TYPE (expr)))
2109     {
2110     case RECORD_TYPE:
2111       error ("struct type value used where scalar is required");
2112       return boolean_false_node;
2113
2114     case UNION_TYPE:
2115       error ("union type value used where scalar is required");
2116       return boolean_false_node;
2117
2118     case ARRAY_TYPE:
2119       error ("array type value used where scalar is required");
2120       return boolean_false_node;
2121
2122     default:
2123       break;
2124     }
2125 #endif /* 0 */
2126
2127   switch (TREE_CODE (expr))
2128     {
2129     case EQ_EXPR:
2130     case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2131     case TRUTH_ANDIF_EXPR:
2132     case TRUTH_ORIF_EXPR:
2133     case TRUTH_AND_EXPR:
2134     case TRUTH_OR_EXPR:
2135     case TRUTH_XOR_EXPR:
2136     case TRUTH_NOT_EXPR:
2137       TREE_TYPE (expr) = boolean_type_node;
2138       return expr;
2139
2140     case ERROR_MARK:
2141       return expr;
2142
2143     case INTEGER_CST:
2144       return integer_zerop (expr) ? boolean_false_node : boolean_true_node;
2145
2146     case REAL_CST:
2147       return real_zerop (expr) ? boolean_false_node : boolean_true_node;
2148
2149     case ADDR_EXPR:
2150       /* If we are taking the address of an external decl, it might be zero
2151          if it is weak, so we cannot optimize.  */
2152       if (DECL_P (TREE_OPERAND (expr, 0))
2153           && DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
2154         break;
2155
2156       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
2157         return build (COMPOUND_EXPR, boolean_type_node,
2158                       TREE_OPERAND (expr, 0), boolean_true_node);
2159       else
2160         return boolean_true_node;
2161
2162     case COMPLEX_EXPR:
2163       return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
2164                                ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2165                               truthvalue_conversion (TREE_OPERAND (expr, 0)),
2166                               truthvalue_conversion (TREE_OPERAND (expr, 1)),
2167                               0);
2168
2169     case NEGATE_EXPR:
2170     case ABS_EXPR:
2171     case FLOAT_EXPR:
2172     case FFS_EXPR:
2173       /* These don't change whether an object is non-zero or zero.  */
2174       return truthvalue_conversion (TREE_OPERAND (expr, 0));
2175
2176     case LROTATE_EXPR:
2177     case RROTATE_EXPR:
2178       /* These don't change whether an object is zero or non-zero, but
2179          we can't ignore them if their second arg has side-effects.  */
2180       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2181         return build (COMPOUND_EXPR, boolean_type_node, TREE_OPERAND (expr, 1),
2182                       truthvalue_conversion (TREE_OPERAND (expr, 0)));
2183       else
2184         return truthvalue_conversion (TREE_OPERAND (expr, 0));
2185
2186     case COND_EXPR:
2187       /* Distribute the conversion into the arms of a COND_EXPR.  */
2188       return fold (build (COND_EXPR, boolean_type_node, TREE_OPERAND (expr, 0),
2189                           truthvalue_conversion (TREE_OPERAND (expr, 1)),
2190                           truthvalue_conversion (TREE_OPERAND (expr, 2))));
2191
2192     case CONVERT_EXPR:
2193       /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
2194          since that affects how `default_conversion' will behave.  */
2195       if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
2196           || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
2197         break;
2198       /* fall through...  */
2199     case NOP_EXPR:
2200       /* If this is widening the argument, we can ignore it.  */
2201       if (TYPE_PRECISION (TREE_TYPE (expr))
2202           >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
2203         return truthvalue_conversion (TREE_OPERAND (expr, 0));
2204       break;
2205
2206     case MINUS_EXPR:
2207       /* With IEEE arithmetic, x - x may not equal 0, so we can't optimize
2208          this case.  */
2209       if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
2210           && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE)
2211         break;
2212       /* fall through...  */
2213     case BIT_XOR_EXPR:
2214       /* This and MINUS_EXPR can be changed into a comparison of the
2215          two objects.  */
2216       if (TREE_TYPE (TREE_OPERAND (expr, 0))
2217           == TREE_TYPE (TREE_OPERAND (expr, 1)))
2218         return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
2219                                 TREE_OPERAND (expr, 1), 1);
2220       return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
2221                               fold (build1 (NOP_EXPR,
2222                                             TREE_TYPE (TREE_OPERAND (expr, 0)),
2223                                             TREE_OPERAND (expr, 1))), 1);
2224
2225     case BIT_AND_EXPR:
2226       if (integer_onep (TREE_OPERAND (expr, 1))
2227           && TREE_TYPE (expr) != boolean_type_node)
2228         /* Using convert here would cause infinite recursion.  */
2229         return build1 (NOP_EXPR, boolean_type_node, expr);
2230       break;
2231
2232     case MODIFY_EXPR:
2233       if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
2234         warning ("suggest parentheses around assignment used as truth value");
2235       break;
2236
2237     default:
2238       break;
2239     }
2240
2241   if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
2242     {
2243       tree tem = save_expr (expr);
2244       return (build_binary_op
2245               ((TREE_SIDE_EFFECTS (expr)
2246                 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2247                truthvalue_conversion (build_unary_op (REALPART_EXPR, tem, 0)),
2248                truthvalue_conversion (build_unary_op (IMAGPART_EXPR, tem, 0)),
2249                0));
2250     }
2251
2252   return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
2253 }
2254 \f
2255 static tree builtin_function_2 PARAMS ((const char *, const char *, tree, tree,
2256                                         int, enum built_in_class, int, int,
2257                                         int));
2258
2259 /* Make a variant type in the proper way for C/C++, propagating qualifiers
2260    down to the element type of an array.  */
2261
2262 tree
2263 c_build_qualified_type (type, type_quals)
2264      tree type;
2265      int type_quals;
2266 {
2267   /* A restrict-qualified pointer type must be a pointer to object or
2268      incomplete type.  Note that the use of POINTER_TYPE_P also allows
2269      REFERENCE_TYPEs, which is appropriate for C++.  Unfortunately,
2270      the C++ front-end also use POINTER_TYPE for pointer-to-member
2271      values, so even though it should be illegal to use `restrict'
2272      with such an entity we don't flag that here.  Thus, special case
2273      code for that case is required in the C++ front-end.  */
2274   if ((type_quals & TYPE_QUAL_RESTRICT)
2275       && (!POINTER_TYPE_P (type)
2276           || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type))))
2277     {
2278       error ("invalid use of `restrict'");
2279       type_quals &= ~TYPE_QUAL_RESTRICT;
2280     }
2281
2282   if (TREE_CODE (type) == ARRAY_TYPE)
2283     return build_array_type (c_build_qualified_type (TREE_TYPE (type),
2284                                                      type_quals),
2285                              TYPE_DOMAIN (type));
2286   return build_qualified_type (type, type_quals);
2287 }
2288
2289 /* Apply the TYPE_QUALS to the new DECL.  */
2290
2291 void
2292 c_apply_type_quals_to_decl (type_quals, decl)
2293      int type_quals;
2294      tree decl;
2295 {
2296   if ((type_quals & TYPE_QUAL_CONST)
2297       || (TREE_TYPE (decl) 
2298           && TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE))
2299     TREE_READONLY (decl) = 1;
2300   if (type_quals & TYPE_QUAL_VOLATILE)
2301     {
2302       TREE_SIDE_EFFECTS (decl) = 1;
2303       TREE_THIS_VOLATILE (decl) = 1;
2304     }
2305   if (type_quals & TYPE_QUAL_RESTRICT)
2306     {
2307       if (!TREE_TYPE (decl)
2308           || !POINTER_TYPE_P (TREE_TYPE (decl))
2309           || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (TREE_TYPE (decl))))
2310         error ("invalid use of `restrict'");
2311       else if (flag_strict_aliasing)
2312         /* Indicate we need to make a unique alias set for this pointer.
2313            We can't do it here because it might be pointing to an
2314            incomplete type.  */
2315         DECL_POINTER_ALIAS_SET (decl) = -2;
2316     }
2317 }
2318
2319
2320 /* Return the typed-based alias set for T, which may be an expression
2321    or a type.  Return -1 if we don't do anything special.  */
2322
2323 HOST_WIDE_INT
2324 c_common_get_alias_set (t)
2325      tree t;
2326 {
2327   tree u;
2328   
2329   /* Permit type-punning when accessing a union, provided the access
2330      is directly through the union.  For example, this code does not
2331      permit taking the address of a union member and then storing
2332      through it.  Even the type-punning allowed here is a GCC
2333      extension, albeit a common and useful one; the C standard says
2334      that such accesses have implementation-defined behavior.  */
2335   for (u = t;
2336        TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
2337        u = TREE_OPERAND (u, 0))
2338     if (TREE_CODE (u) == COMPONENT_REF
2339         && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
2340       return 0;
2341
2342   /* That's all the expressions we handle specially.  */
2343   if (! TYPE_P (t))
2344     return -1;
2345
2346   /* The C standard guarantess that any object may be accessed via an
2347      lvalue that has character type.  */
2348   if (t == char_type_node
2349       || t == signed_char_type_node
2350       || t == unsigned_char_type_node)
2351     return 0;
2352   
2353   /* The C standard specifically allows aliasing between signed and
2354      unsigned variants of the same type.  We treat the signed
2355      variant as canonical.  */
2356   if (TREE_CODE (t) == INTEGER_TYPE && TREE_UNSIGNED (t))
2357     {
2358       tree t1 = signed_type (t);
2359
2360       /* t1 == t can happen for boolean nodes which are always unsigned.  */
2361       if (t1 != t)
2362         return get_alias_set (t1);
2363     }
2364   else if (POINTER_TYPE_P (t))
2365     {
2366       tree t1;
2367
2368       /* Unfortunately, there is no canonical form of a pointer type.
2369          In particular, if we have `typedef int I', then `int *', and
2370          `I *' are different types.  So, we have to pick a canonical
2371          representative.  We do this below.
2372
2373          Technically, this approach is actually more conservative that
2374          it needs to be.  In particular, `const int *' and `int *'
2375          should be in different alias sets, according to the C and C++
2376          standard, since their types are not the same, and so,
2377          technically, an `int **' and `const int **' cannot point at
2378          the same thing.
2379
2380          But, the standard is wrong.  In particular, this code is
2381          legal C++:
2382
2383             int *ip;
2384             int **ipp = &ip;
2385             const int* const* cipp = &ipp;
2386
2387          And, it doesn't make sense for that to be legal unless you
2388          can dereference IPP and CIPP.  So, we ignore cv-qualifiers on
2389          the pointed-to types.  This issue has been reported to the
2390          C++ committee.  */
2391       t1 = build_type_no_quals (t);
2392       if (t1 != t)
2393         return get_alias_set (t1);
2394     }
2395
2396   return -1;
2397 }
2398 \f
2399 /* Implement the __alignof keyword: Return the minimum required
2400    alignment of TYPE, measured in bytes.  */
2401
2402 tree
2403 c_alignof (type)
2404      tree type;
2405 {
2406   enum tree_code code = TREE_CODE (type);
2407   tree t;
2408
2409   /* In C++, sizeof applies to the referent.  Handle alignof the same way.  */
2410   if (code == REFERENCE_TYPE)
2411     {
2412       type = TREE_TYPE (type);
2413       code = TREE_CODE (type);
2414     }
2415
2416   if (code == FUNCTION_TYPE)
2417     t = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
2418   else if (code == VOID_TYPE || code == ERROR_MARK)
2419     t = size_one_node;
2420   else if (!COMPLETE_TYPE_P (type))
2421     {
2422       error ("__alignof__ applied to an incomplete type");
2423       t = size_zero_node;
2424     }
2425   else
2426     t = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT);
2427
2428   return fold (build1 (NOP_EXPR, c_size_type_node, t));
2429 }
2430
2431 /* Implement the __alignof keyword: Return the minimum required
2432    alignment of EXPR, measured in bytes.  For VAR_DECL's and
2433    FIELD_DECL's return DECL_ALIGN (which can be set from an
2434    "aligned" __attribute__ specification).  */
2435
2436 tree
2437 c_alignof_expr (expr)
2438      tree expr;
2439 {
2440   tree t;
2441
2442   if (TREE_CODE (expr) == VAR_DECL)
2443     t = size_int (DECL_ALIGN (expr) / BITS_PER_UNIT);
2444  
2445   else if (TREE_CODE (expr) == COMPONENT_REF
2446            && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1)))
2447     {
2448       error ("`__alignof' applied to a bit-field");
2449       t = size_one_node;
2450     }
2451   else if (TREE_CODE (expr) == COMPONENT_REF
2452            && TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL)
2453     t = size_int (DECL_ALIGN (TREE_OPERAND (expr, 1)) / BITS_PER_UNIT);
2454  
2455   else if (TREE_CODE (expr) == INDIRECT_REF)
2456     {
2457       tree t = TREE_OPERAND (expr, 0);
2458       tree best = t;
2459       int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
2460  
2461       while (TREE_CODE (t) == NOP_EXPR
2462              && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE)
2463         {
2464           int thisalign;
2465
2466           t = TREE_OPERAND (t, 0);
2467           thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
2468           if (thisalign > bestalign)
2469             best = t, bestalign = thisalign;
2470         }
2471       return c_alignof (TREE_TYPE (TREE_TYPE (best)));
2472     }
2473   else
2474     return c_alignof (TREE_TYPE (expr));
2475
2476   return fold (build1 (NOP_EXPR, c_size_type_node, t));
2477 }
2478 \f
2479 /* Give the specifications for the format attributes, used by C and all
2480    descendents.  */
2481
2482 static const struct attribute_spec c_format_attribute_table[] =
2483 {
2484   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
2485   { "format",                 3, 3, false, true,  true,
2486                               handle_format_attribute },
2487   { "format_arg",             1, 1, false, true,  true,
2488                               handle_format_arg_attribute },
2489   { NULL,                     0, 0, false, false, false, NULL }
2490 };
2491
2492 /* Build tree nodes and builtin functions common to both C and C++ language
2493    frontends.  */
2494
2495 void
2496 c_common_nodes_and_builtins ()
2497 {
2498   enum builtin_type 
2499   {
2500 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
2501 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
2502 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
2503 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
2504 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
2505 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
2506 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
2507 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
2508 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
2509 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
2510 #include "builtin-types.def"
2511 #undef DEF_PRIMITIVE_TYPE
2512 #undef DEF_FUNCTION_TYPE_0
2513 #undef DEF_FUNCTION_TYPE_1
2514 #undef DEF_FUNCTION_TYPE_2
2515 #undef DEF_FUNCTION_TYPE_3
2516 #undef DEF_FUNCTION_TYPE_4
2517 #undef DEF_FUNCTION_TYPE_VAR_0
2518 #undef DEF_FUNCTION_TYPE_VAR_1
2519 #undef DEF_FUNCTION_TYPE_VAR_2
2520 #undef DEF_POINTER_TYPE
2521     BT_LAST
2522   };
2523
2524   typedef enum builtin_type builtin_type;
2525
2526   tree builtin_types[(int) BT_LAST];
2527   int wchar_type_size;
2528   tree array_domain_type;
2529   /* Either char* or void*.  */
2530   tree traditional_ptr_type_node;
2531   /* Either const char* or const void*.  */
2532   tree traditional_cptr_type_node;
2533   tree traditional_len_type_node;
2534   tree va_list_ref_type_node;
2535   tree va_list_arg_type_node;
2536
2537   /* We must initialize this before any builtin functions (which might have
2538      attributes) are declared.  (c_common_init is too late.)  */
2539   format_attribute_table = c_format_attribute_table;
2540
2541   /* Define `int' and `char' first so that dbx will output them first.  */
2542   record_builtin_type (RID_INT, NULL, integer_type_node);
2543   record_builtin_type (RID_CHAR, "char", char_type_node);
2544
2545   /* `signed' is the same as `int'.  FIXME: the declarations of "signed",
2546      "unsigned long", "long long unsigned" and "unsigned short" were in C++
2547      but not C.  Are the conditionals here needed?  */
2548   if (c_language == clk_cplusplus)
2549     record_builtin_type (RID_SIGNED, NULL, integer_type_node);
2550   record_builtin_type (RID_LONG, "long int", long_integer_type_node);
2551   record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
2552   record_builtin_type (RID_MAX, "long unsigned int",
2553                        long_unsigned_type_node);
2554   if (c_language == clk_cplusplus)
2555     record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
2556   record_builtin_type (RID_MAX, "long long int",
2557                        long_long_integer_type_node);
2558   record_builtin_type (RID_MAX, "long long unsigned int",
2559                        long_long_unsigned_type_node);
2560   if (c_language == clk_cplusplus)
2561     record_builtin_type (RID_MAX, "long long unsigned",
2562                          long_long_unsigned_type_node);
2563   record_builtin_type (RID_SHORT, "short int", short_integer_type_node);
2564   record_builtin_type (RID_MAX, "short unsigned int",
2565                        short_unsigned_type_node);
2566   if (c_language == clk_cplusplus)
2567     record_builtin_type (RID_MAX, "unsigned short",
2568                          short_unsigned_type_node);
2569
2570   /* Define both `signed char' and `unsigned char'.  */
2571   record_builtin_type (RID_MAX, "signed char", signed_char_type_node);
2572   record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
2573
2574   /* These are types that type_for_size and type_for_mode use.  */
2575   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node));
2576   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node));
2577   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node));
2578   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node));
2579 #if HOST_BITS_PER_WIDE_INT >= 64
2580   pushdecl (build_decl (TYPE_DECL, get_identifier ("__int128_t"), intTI_type_node));
2581 #endif
2582   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node));
2583   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node));
2584   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node));
2585   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node));
2586 #if HOST_BITS_PER_WIDE_INT >= 64
2587   pushdecl (build_decl (TYPE_DECL, get_identifier ("__uint128_t"), unsigned_intTI_type_node));
2588 #endif
2589
2590   /* Create the widest literal types.  */
2591   widest_integer_literal_type_node
2592     = make_signed_type (HOST_BITS_PER_WIDE_INT * 2);
2593   pushdecl (build_decl (TYPE_DECL, NULL_TREE,
2594                         widest_integer_literal_type_node));
2595
2596   widest_unsigned_literal_type_node
2597     = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2);
2598   pushdecl (build_decl (TYPE_DECL, NULL_TREE,
2599                         widest_unsigned_literal_type_node));
2600
2601   /* `unsigned long' is the standard type for sizeof.
2602      Note that stddef.h uses `unsigned long',
2603      and this must agree, even if long and int are the same size.  */
2604   c_size_type_node =
2605     TREE_TYPE (identifier_global_value (get_identifier (SIZE_TYPE)));
2606   signed_size_type_node = signed_type (c_size_type_node);
2607   if (flag_traditional)
2608     c_size_type_node = signed_size_type_node;
2609   set_sizetype (c_size_type_node);
2610
2611   build_common_tree_nodes_2 (flag_short_double);
2612
2613   record_builtin_type (RID_FLOAT, NULL, float_type_node);
2614   record_builtin_type (RID_DOUBLE, NULL, double_type_node);
2615   record_builtin_type (RID_MAX, "long double", long_double_type_node);
2616
2617   pushdecl (build_decl (TYPE_DECL, get_identifier ("complex int"),
2618                         complex_integer_type_node));
2619   pushdecl (build_decl (TYPE_DECL, get_identifier ("complex float"),
2620                         complex_float_type_node));
2621   pushdecl (build_decl (TYPE_DECL, get_identifier ("complex double"),
2622                         complex_double_type_node));
2623   pushdecl (build_decl (TYPE_DECL, get_identifier ("complex long double"),
2624                         complex_long_double_type_node));
2625
2626   record_builtin_type (RID_VOID, NULL, void_type_node);
2627
2628   void_zero_node = build_int_2 (0, 0);
2629   TREE_TYPE (void_zero_node) = void_type_node;
2630
2631   void_list_node = build_void_list_node ();
2632
2633   /* Make a type to be the domain of a few array types
2634      whose domains don't really matter.
2635      200 is small enough that it always fits in size_t
2636      and large enough that it can hold most function names for the
2637      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
2638   array_domain_type = build_index_type (size_int (200));
2639
2640   /* Make a type for arrays of characters.
2641      With luck nothing will ever really depend on the length of this
2642      array type.  */
2643   char_array_type_node
2644     = build_array_type (char_type_node, array_domain_type);
2645
2646   /* Likewise for arrays of ints.  */
2647   int_array_type_node
2648     = build_array_type (integer_type_node, array_domain_type);
2649
2650   string_type_node = build_pointer_type (char_type_node);
2651   const_string_type_node
2652     = build_pointer_type (build_qualified_type
2653                           (char_type_node, TYPE_QUAL_CONST));
2654
2655   traditional_ptr_type_node = ((flag_traditional && 
2656                                 c_language != clk_cplusplus)
2657                                ? string_type_node : ptr_type_node);
2658   traditional_cptr_type_node = ((flag_traditional && 
2659                                  c_language != clk_cplusplus)
2660                                ? const_string_type_node : const_ptr_type_node);
2661
2662   (*targetm.init_builtins) ();
2663
2664   /* This is special for C++ so functions can be overloaded.  */
2665   wchar_type_node = get_identifier (flag_short_wchar
2666                                     ? "short unsigned int"
2667                                     : WCHAR_TYPE);
2668   wchar_type_node = TREE_TYPE (identifier_global_value (wchar_type_node));
2669   wchar_type_size = TYPE_PRECISION (wchar_type_node);
2670   if (c_language == clk_cplusplus)
2671     {
2672       if (TREE_UNSIGNED (wchar_type_node))
2673         wchar_type_node = make_unsigned_type (wchar_type_size);
2674       else
2675         wchar_type_node = make_signed_type (wchar_type_size);
2676       record_builtin_type (RID_WCHAR, "wchar_t", wchar_type_node);
2677     }
2678   else
2679     {
2680       signed_wchar_type_node = signed_type (wchar_type_node);
2681       unsigned_wchar_type_node = unsigned_type (wchar_type_node);
2682     }
2683
2684   /* This is for wide string constants.  */
2685   wchar_array_type_node
2686     = build_array_type (wchar_type_node, array_domain_type);
2687
2688   wint_type_node =
2689     TREE_TYPE (identifier_global_value (get_identifier (WINT_TYPE)));
2690
2691   intmax_type_node =
2692     TREE_TYPE (identifier_global_value (get_identifier (INTMAX_TYPE)));
2693   uintmax_type_node =
2694     TREE_TYPE (identifier_global_value (get_identifier (UINTMAX_TYPE)));
2695
2696   default_function_type = build_function_type (integer_type_node, NULL_TREE);
2697   ptrdiff_type_node
2698     = TREE_TYPE (identifier_global_value (get_identifier (PTRDIFF_TYPE)));
2699   unsigned_ptrdiff_type_node = unsigned_type (ptrdiff_type_node);
2700
2701   pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"),
2702                         va_list_type_node));
2703
2704   pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"),
2705                         ptrdiff_type_node));
2706
2707   pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"),
2708                         sizetype));
2709
2710   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
2711     {
2712       va_list_arg_type_node = va_list_ref_type_node =
2713         build_pointer_type (TREE_TYPE (va_list_type_node));
2714     }
2715   else
2716     {
2717       va_list_arg_type_node = va_list_type_node;
2718       va_list_ref_type_node = build_reference_type (va_list_type_node);
2719     }
2720  
2721   traditional_len_type_node = ((flag_traditional && 
2722                                 c_language != clk_cplusplus)
2723                                ? integer_type_node : sizetype);
2724
2725 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
2726   builtin_types[(int) ENUM] = VALUE;
2727 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN)               \
2728   builtin_types[(int) ENUM]                             \
2729     = build_function_type (builtin_types[(int) RETURN], \
2730                            void_list_node);
2731 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1)                         \
2732   builtin_types[(int) ENUM]                                             \
2733     = build_function_type (builtin_types[(int) RETURN],                 \
2734                            tree_cons (NULL_TREE,                        \
2735                                       builtin_types[(int) ARG1],        \
2736                                       void_list_node));
2737 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2)   \
2738   builtin_types[(int) ENUM]                             \
2739     = build_function_type                               \
2740       (builtin_types[(int) RETURN],                     \
2741        tree_cons (NULL_TREE,                            \
2742                   builtin_types[(int) ARG1],            \
2743                   tree_cons (NULL_TREE,                 \
2744                              builtin_types[(int) ARG2], \
2745                              void_list_node)));
2746 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3)              \
2747   builtin_types[(int) ENUM]                                              \
2748     = build_function_type                                                \
2749       (builtin_types[(int) RETURN],                                      \
2750        tree_cons (NULL_TREE,                                             \
2751                   builtin_types[(int) ARG1],                             \
2752                   tree_cons (NULL_TREE,                                  \
2753                              builtin_types[(int) ARG2],                  \
2754                              tree_cons (NULL_TREE,                       \
2755                                         builtin_types[(int) ARG3],       \
2756                                         void_list_node))));
2757 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4)       \
2758   builtin_types[(int) ENUM]                                             \
2759     = build_function_type                                               \
2760       (builtin_types[(int) RETURN],                                     \
2761        tree_cons (NULL_TREE,                                            \
2762                   builtin_types[(int) ARG1],                            \
2763                   tree_cons (NULL_TREE,                                 \
2764                              builtin_types[(int) ARG2],                 \
2765                              tree_cons                                  \
2766                              (NULL_TREE,                                \
2767                               builtin_types[(int) ARG3],                \
2768                               tree_cons (NULL_TREE,                     \
2769                                          builtin_types[(int) ARG4],     \
2770                                          void_list_node)))));
2771 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN)                           \
2772   builtin_types[(int) ENUM]                                             \
2773     = build_function_type (builtin_types[(int) RETURN], NULL_TREE);
2774 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1)                      \
2775    builtin_types[(int) ENUM]                                             \
2776     = build_function_type (builtin_types[(int) RETURN],                  \
2777                            tree_cons (NULL_TREE,                         \
2778                                       builtin_types[(int) ARG1],         \
2779                                       NULL_TREE));
2780
2781 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2)       \
2782    builtin_types[(int) ENUM]                                    \
2783     = build_function_type                                       \
2784       (builtin_types[(int) RETURN],                             \
2785        tree_cons (NULL_TREE,                                    \
2786                   builtin_types[(int) ARG1],                    \
2787                   tree_cons (NULL_TREE,                         \
2788                              builtin_types[(int) ARG2],         \
2789                              NULL_TREE)));
2790 #define DEF_POINTER_TYPE(ENUM, TYPE)                    \
2791   builtin_types[(int) ENUM]                             \
2792     = build_pointer_type (builtin_types[(int) TYPE]);
2793 #include "builtin-types.def"
2794 #undef DEF_PRIMITIVE_TYPE
2795 #undef DEF_FUNCTION_TYPE_1
2796 #undef DEF_FUNCTION_TYPE_2
2797 #undef DEF_FUNCTION_TYPE_3
2798 #undef DEF_FUNCTION_TYPE_4
2799 #undef DEF_FUNCTION_TYPE_VAR_0
2800 #undef DEF_FUNCTION_TYPE_VAR_1
2801 #undef DEF_POINTER_TYPE
2802
2803 #define DEF_BUILTIN(ENUM, NAME, CLASS,                                  \
2804                     TYPE, LIBTYPE, BOTH_P, FALLBACK_P, NONANSI_P)       \
2805   if (NAME)                                                             \
2806     {                                                                   \
2807       tree decl;                                                        \
2808                                                                         \
2809       if (strncmp (NAME, "__builtin_", strlen ("__builtin_")) != 0)     \
2810         abort ();                                                       \
2811                                                                         \
2812       if (!BOTH_P)                                                      \
2813         decl = builtin_function (NAME, builtin_types[TYPE], ENUM,       \
2814                                  CLASS,                                 \
2815                                  (FALLBACK_P                            \
2816                                   ? (NAME + strlen ("__builtin_"))      \
2817                                   : NULL));                             \
2818       else                                                              \
2819         decl = builtin_function_2 (NAME,                                \
2820                                    NAME + strlen ("__builtin_"),        \
2821                                    builtin_types[TYPE],                 \
2822                                    builtin_types[LIBTYPE],              \
2823                                    ENUM,                                \
2824                                    CLASS,                               \
2825                                    FALLBACK_P,                          \
2826                                    NONANSI_P,                           \
2827                                    /*noreturn_p=*/0);                   \
2828                                                                         \
2829       built_in_decls[(int) ENUM] = decl;                                \
2830     }                                                                   
2831 #include "builtins.def"
2832 #undef DEF_BUILTIN
2833
2834   /* Declare _exit and _Exit just to mark them as non-returning.  */
2835   builtin_function_2 (NULL, "_exit", NULL_TREE, 
2836                       builtin_types[BT_FN_VOID_INT],
2837                       0, NOT_BUILT_IN, 0, 1, 1);
2838   builtin_function_2 (NULL, "_Exit", NULL_TREE, 
2839                       builtin_types[BT_FN_VOID_INT],
2840                       0, NOT_BUILT_IN, 0, !flag_isoc99, 1);
2841
2842   /* Declare these functions non-returning
2843      to avoid spurious "control drops through" warnings.  */
2844   builtin_function_2 (NULL, "abort",
2845                       NULL_TREE, ((c_language == clk_cplusplus)
2846                                   ? builtin_types[BT_FN_VOID]
2847                                   : builtin_types[BT_FN_VOID_VAR]),
2848                       0, NOT_BUILT_IN, 0, 0, 1);
2849
2850   builtin_function_2 (NULL, "exit",
2851                       NULL_TREE, ((c_language == clk_cplusplus)
2852                                   ? builtin_types[BT_FN_VOID_INT]
2853                                   : builtin_types[BT_FN_VOID_VAR]),
2854                       0, NOT_BUILT_IN, 0, 0, 1);
2855
2856   main_identifier_node = get_identifier ("main");
2857
2858   /* ??? Perhaps there's a better place to do this.  But it is related
2859      to __builtin_va_arg, so it isn't that off-the-wall.  */
2860   lang_type_promotes_to = simple_type_promotes_to;
2861 }
2862
2863 tree
2864 build_va_arg (expr, type)
2865      tree expr, type;
2866 {
2867   return build1 (VA_ARG_EXPR, type, expr);
2868 }
2869
2870
2871 /* Linked list of disabled built-in functions.  */
2872
2873 typedef struct disabled_builtin
2874 {
2875   const char *name;
2876   struct disabled_builtin *next;
2877 } disabled_builtin;
2878 static disabled_builtin *disabled_builtins = NULL;
2879
2880 static bool builtin_function_disabled_p PARAMS ((const char *));
2881
2882 /* Disable a built-in function specified by -fno-builtin-NAME.  If NAME
2883    begins with "__builtin_", give an error.  */
2884
2885 void
2886 disable_builtin_function (name)
2887      const char *name;
2888 {
2889   if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
2890     error ("cannot disable built-in function `%s'", name);
2891   else
2892     {
2893       disabled_builtin *new = xmalloc (sizeof (disabled_builtin));
2894       new->name = name;
2895       new->next = disabled_builtins;
2896       disabled_builtins = new;
2897     }
2898 }
2899
2900
2901 /* Return true if the built-in function NAME has been disabled, false
2902    otherwise.  */
2903
2904 static bool
2905 builtin_function_disabled_p (name)
2906      const char *name;
2907 {
2908   disabled_builtin *p;
2909   for (p = disabled_builtins; p != NULL; p = p->next)
2910     {
2911       if (strcmp (name, p->name) == 0)
2912         return true;
2913     }
2914   return false;
2915 }
2916
2917
2918 /* Possibly define a builtin function with one or two names.  BUILTIN_NAME
2919    is an __builtin_-prefixed name; NAME is the ordinary name; one or both
2920    of these may be NULL (though both being NULL is useless).
2921    BUILTIN_TYPE is the type of the __builtin_-prefixed function;
2922    TYPE is the type of the function with the ordinary name.  These
2923    may differ if the ordinary name is declared with a looser type to avoid
2924    conflicts with headers.  FUNCTION_CODE and CLASS are as for
2925    builtin_function.  If LIBRARY_NAME_P is nonzero, NAME is passed as
2926    the LIBRARY_NAME parameter to builtin_function when declaring BUILTIN_NAME.
2927    If NONANSI_P is nonzero, the name NAME is treated as a non-ANSI name; if
2928    NORETURN_P is nonzero, the function is marked as non-returning.
2929    Returns the declaration of BUILTIN_NAME, if any, otherwise
2930    the declaration of NAME.  Does not declare NAME if flag_no_builtin,
2931    or if NONANSI_P and flag_no_nonansi_builtin.  */
2932
2933 static tree
2934 builtin_function_2 (builtin_name, name, builtin_type, type, function_code,
2935                     class, library_name_p, nonansi_p, noreturn_p)
2936      const char *builtin_name;
2937      const char *name;
2938      tree builtin_type;
2939      tree type;
2940      int function_code;
2941      enum built_in_class class;
2942      int library_name_p;
2943      int nonansi_p;
2944      int noreturn_p;
2945 {
2946   tree bdecl = NULL_TREE;
2947   tree decl = NULL_TREE;
2948   if (builtin_name != 0)
2949     {
2950       bdecl = builtin_function (builtin_name, builtin_type, function_code,
2951                                 class, library_name_p ? name : NULL);
2952       if (noreturn_p)
2953         {
2954           TREE_THIS_VOLATILE (bdecl) = 1;
2955           TREE_SIDE_EFFECTS (bdecl) = 1;
2956         }
2957     }
2958   if (name != 0 && !flag_no_builtin && !builtin_function_disabled_p (name)
2959       && !(nonansi_p && flag_no_nonansi_builtin))
2960     {
2961       decl = builtin_function (name, type, function_code, class, NULL);
2962       if (nonansi_p)
2963         DECL_BUILT_IN_NONANSI (decl) = 1;
2964       if (noreturn_p)
2965         {
2966           TREE_THIS_VOLATILE (decl) = 1;
2967           TREE_SIDE_EFFECTS (decl) = 1;
2968         }
2969     }
2970   return (bdecl != 0 ? bdecl : decl);
2971 }
2972 \f
2973 /* Nonzero if the type T promotes to int.  This is (nearly) the
2974    integral promotions defined in ISO C99 6.3.1.1/2.  */
2975
2976 bool
2977 c_promoting_integer_type_p (t)
2978      tree t;
2979 {
2980   switch (TREE_CODE (t))
2981     {
2982     case INTEGER_TYPE:
2983       return (TYPE_MAIN_VARIANT (t) == char_type_node
2984               || TYPE_MAIN_VARIANT (t) == signed_char_type_node
2985               || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node
2986               || TYPE_MAIN_VARIANT (t) == short_integer_type_node
2987               || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node
2988               || TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node));
2989
2990     case ENUMERAL_TYPE:
2991       /* ??? Technically all enumerations not larger than an int
2992          promote to an int.  But this is used along code paths
2993          that only want to notice a size change.  */
2994       return TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node);
2995
2996     case BOOLEAN_TYPE:
2997       return 1;
2998
2999     default:
3000       return 0;
3001     }
3002 }
3003
3004 /* Given a type, apply default promotions wrt unnamed function arguments
3005    and return the new type.  Return NULL_TREE if no change.  */
3006 /* ??? There is a function of the same name in the C++ front end that
3007    does something similar, but is more thorough and does not return NULL
3008    if no change.  We could perhaps share code, but it would make the
3009    self_promoting_type property harder to identify.  */
3010
3011 tree
3012 simple_type_promotes_to (type)
3013      tree type;
3014 {
3015   if (TYPE_MAIN_VARIANT (type) == float_type_node)
3016     return double_type_node;
3017
3018   if (c_promoting_integer_type_p (type))
3019     {
3020       /* Traditionally, unsignedness is preserved in default promotions.
3021          Also preserve unsignedness if not really getting any wider.  */
3022       if (TREE_UNSIGNED (type)
3023           && (flag_traditional
3024               || TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)))
3025         return unsigned_type_node;
3026       return integer_type_node;
3027     }
3028
3029   return NULL_TREE;
3030 }
3031
3032 /* Return 1 if PARMS specifies a fixed number of parameters
3033    and none of their types is affected by default promotions.  */
3034
3035 int
3036 self_promoting_args_p (parms)
3037      tree parms;
3038 {
3039   tree t;
3040   for (t = parms; t; t = TREE_CHAIN (t))
3041     {
3042       tree type = TREE_VALUE (t);
3043
3044       if (TREE_CHAIN (t) == 0 && type != void_type_node)
3045         return 0;
3046
3047       if (type == 0)
3048         return 0;
3049
3050       if (TYPE_MAIN_VARIANT (type) == float_type_node)
3051         return 0;
3052
3053       if (c_promoting_integer_type_p (type))
3054         return 0;
3055     }
3056   return 1;
3057 }
3058
3059 /* Recursively examines the array elements of TYPE, until a non-array
3060    element type is found.  */
3061
3062 tree
3063 strip_array_types (type)
3064      tree type;
3065 {
3066   while (TREE_CODE (type) == ARRAY_TYPE)
3067     type = TREE_TYPE (type);
3068
3069   return type;
3070 }
3071
3072 /* Recognize certain built-in functions so we can make tree-codes
3073    other than CALL_EXPR.  We do this when it enables fold-const.c
3074    to do something useful.  */
3075 /* ??? By rights this should go in builtins.c, but only C and C++
3076    implement build_{binary,unary}_op.  Not exactly sure what bits
3077    of functionality are actually needed from those functions, or
3078    where the similar functionality exists in the other front ends.  */
3079
3080 tree
3081 expand_tree_builtin (function, params, coerced_params)
3082      tree function, params, coerced_params;
3083 {
3084   enum tree_code code;
3085
3086   if (DECL_BUILT_IN_CLASS (function) != BUILT_IN_NORMAL)
3087     return NULL_TREE;
3088
3089   switch (DECL_FUNCTION_CODE (function))
3090     {
3091     case BUILT_IN_ABS:
3092     case BUILT_IN_LABS:
3093     case BUILT_IN_LLABS:
3094     case BUILT_IN_IMAXABS:
3095     case BUILT_IN_FABS:
3096     case BUILT_IN_FABSL:
3097     case BUILT_IN_FABSF:
3098       if (coerced_params == 0)
3099         return integer_zero_node;
3100       return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
3101
3102     case BUILT_IN_CONJ:
3103     case BUILT_IN_CONJF:
3104     case BUILT_IN_CONJL:
3105       if (coerced_params == 0)
3106         return integer_zero_node;
3107       return build_unary_op (CONJ_EXPR, TREE_VALUE (coerced_params), 0);
3108
3109     case BUILT_IN_CREAL:
3110     case BUILT_IN_CREALF:
3111     case BUILT_IN_CREALL:
3112       if (coerced_params == 0)
3113         return integer_zero_node;
3114       return build_unary_op (REALPART_EXPR, TREE_VALUE (coerced_params), 0);
3115
3116     case BUILT_IN_CIMAG:
3117     case BUILT_IN_CIMAGF:
3118     case BUILT_IN_CIMAGL:
3119       if (coerced_params == 0)
3120         return integer_zero_node;
3121       return build_unary_op (IMAGPART_EXPR, TREE_VALUE (coerced_params), 0);
3122
3123     case BUILT_IN_ISGREATER:
3124       if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
3125         code = UNLE_EXPR;
3126       else
3127         code = LE_EXPR;
3128       goto unordered_cmp;
3129
3130     case BUILT_IN_ISGREATEREQUAL:
3131       if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
3132         code = UNLT_EXPR;
3133       else
3134         code = LT_EXPR;
3135       goto unordered_cmp;
3136
3137     case BUILT_IN_ISLESS:
3138       if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
3139         code = UNGE_EXPR;
3140       else
3141         code = GE_EXPR;
3142       goto unordered_cmp;
3143
3144     case BUILT_IN_ISLESSEQUAL:
3145       if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
3146         code = UNGT_EXPR;
3147       else
3148         code = GT_EXPR;
3149       goto unordered_cmp;
3150
3151     case BUILT_IN_ISLESSGREATER:
3152       if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
3153         code = UNEQ_EXPR;
3154       else
3155         code = EQ_EXPR;
3156       goto unordered_cmp;
3157
3158     case BUILT_IN_ISUNORDERED:
3159       if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT)
3160         return integer_zero_node;
3161       code = UNORDERED_EXPR;
3162       goto unordered_cmp;
3163
3164     unordered_cmp:
3165       {
3166         tree arg0, arg1;
3167
3168         if (params == 0
3169             || TREE_CHAIN (params) == 0)
3170           {
3171             error ("too few arguments to function `%s'",
3172                    IDENTIFIER_POINTER (DECL_NAME (function)));
3173             return error_mark_node;
3174           }
3175         else if (TREE_CHAIN (TREE_CHAIN (params)) != 0)
3176           {
3177             error ("too many arguments to function `%s'",
3178                    IDENTIFIER_POINTER (DECL_NAME (function)));
3179             return error_mark_node;
3180           }
3181
3182         arg0 = TREE_VALUE (params);
3183         arg1 = TREE_VALUE (TREE_CHAIN (params));
3184         arg0 = build_binary_op (code, arg0, arg1, 0);
3185         if (code != UNORDERED_EXPR)
3186           arg0 = build_unary_op (TRUTH_NOT_EXPR, arg0, 0);
3187         return arg0;
3188       }
3189       break;
3190
3191     default:
3192       break;
3193     }
3194
3195   return NULL_TREE;
3196 }
3197
3198 /* Returns non-zero if CODE is the code for a statement.  */
3199
3200 int
3201 statement_code_p (code)
3202      enum tree_code code;
3203 {
3204   switch (code)
3205     {
3206     case CLEANUP_STMT:
3207     case EXPR_STMT:
3208     case COMPOUND_STMT:
3209     case DECL_STMT:
3210     case IF_STMT:
3211     case FOR_STMT:
3212     case WHILE_STMT:
3213     case DO_STMT:
3214     case RETURN_STMT:
3215     case BREAK_STMT:
3216     case CONTINUE_STMT:
3217     case SCOPE_STMT:
3218     case SWITCH_STMT:
3219     case GOTO_STMT:
3220     case LABEL_STMT:
3221     case ASM_STMT:
3222     case FILE_STMT:
3223     case CASE_LABEL:
3224       return 1;
3225
3226     default:
3227       if (lang_statement_code_p)
3228         return (*lang_statement_code_p) (code);
3229       return 0;
3230     }
3231 }
3232
3233 /* Walk the statement tree, rooted at *tp.  Apply FUNC to all the
3234    sub-trees of *TP in a pre-order traversal.  FUNC is called with the
3235    DATA and the address of each sub-tree.  If FUNC returns a non-NULL
3236    value, the traversal is aborted, and the value returned by FUNC is
3237    returned.  If FUNC sets WALK_SUBTREES to zero, then the subtrees of
3238    the node being visited are not walked.
3239
3240    We don't need a without_duplicates variant of this one because the
3241    statement tree is a tree, not a graph.  */
3242
3243 tree 
3244 walk_stmt_tree (tp, func, data)
3245      tree *tp;
3246      walk_tree_fn func;
3247      void *data;
3248 {
3249   enum tree_code code;
3250   int walk_subtrees;
3251   tree result;
3252   int i, len;
3253
3254 #define WALK_SUBTREE(NODE)                              \
3255   do                                                    \
3256     {                                                   \
3257       result = walk_stmt_tree (&(NODE), func, data);    \
3258       if (result)                                       \
3259         return result;                                  \
3260     }                                                   \
3261   while (0)
3262
3263   /* Skip empty subtrees.  */
3264   if (!*tp)
3265     return NULL_TREE;
3266
3267   /* Skip subtrees below non-statement nodes.  */
3268   if (!statement_code_p (TREE_CODE (*tp)))
3269     return NULL_TREE;
3270
3271   /* Call the function.  */
3272   walk_subtrees = 1;
3273   result = (*func) (tp, &walk_subtrees, data);
3274
3275   /* If we found something, return it.  */
3276   if (result)
3277     return result;
3278
3279   /* FUNC may have modified the tree, recheck that we're looking at a
3280      statement node.  */
3281   code = TREE_CODE (*tp);
3282   if (!statement_code_p (code))
3283     return NULL_TREE;
3284
3285   /* Visit the subtrees unless FUNC decided that there was nothing
3286      interesting below this point in the tree.  */
3287   if (walk_subtrees)
3288     {
3289       /* Walk over all the sub-trees of this operand.  Statement nodes
3290          never contain RTL, and we needn't worry about TARGET_EXPRs.  */
3291       len = TREE_CODE_LENGTH (code);
3292
3293       /* Go through the subtrees.  We need to do this in forward order so
3294          that the scope of a FOR_EXPR is handled properly.  */
3295       for (i = 0; i < len; ++i)
3296         WALK_SUBTREE (TREE_OPERAND (*tp, i));
3297     }
3298
3299   /* Finally visit the chain.  This can be tail-recursion optimized if
3300      we write it this way.  */
3301   return walk_stmt_tree (&TREE_CHAIN (*tp), func, data);
3302
3303 #undef WALK_SUBTREE
3304 }
3305
3306 /* Used to compare case labels.  K1 and K2 are actually tree nodes
3307    representing case labels, or NULL_TREE for a `default' label.
3308    Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
3309    K2, and 0 if K1 and K2 are equal.  */
3310
3311 int
3312 case_compare (k1, k2)
3313      splay_tree_key k1;
3314      splay_tree_key k2;
3315 {
3316   /* Consider a NULL key (such as arises with a `default' label) to be
3317      smaller than anything else.  */
3318   if (!k1)
3319     return k2 ? -1 : 0;
3320   else if (!k2)
3321     return k1 ? 1 : 0;
3322
3323   return tree_int_cst_compare ((tree) k1, (tree) k2);
3324 }
3325
3326 /* Process a case label for the range LOW_VALUE ... HIGH_VALUE.  If
3327    LOW_VALUE and HIGH_VALUE are both NULL_TREE then this case label is
3328    actually a `default' label.  If only HIGH_VALUE is NULL_TREE, then
3329    case label was declared using the usual C/C++ syntax, rather than
3330    the GNU case range extension.  CASES is a tree containing all the
3331    case ranges processed so far; COND is the condition for the
3332    switch-statement itself.  Returns the CASE_LABEL created, or
3333    ERROR_MARK_NODE if no CASE_LABEL is created.  */
3334
3335 tree
3336 c_add_case_label (cases, cond, low_value, high_value)
3337      splay_tree cases;
3338      tree cond;
3339      tree low_value;
3340      tree high_value;
3341 {
3342   tree type;
3343   tree label;
3344   tree case_label;
3345   splay_tree_node node;
3346
3347   /* Create the LABEL_DECL itself.  */
3348   label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
3349   DECL_CONTEXT (label) = current_function_decl;
3350
3351   /* If there was an error processing the switch condition, bail now
3352      before we get more confused.  */
3353   if (!cond || cond == error_mark_node)
3354     {
3355       /* Add a label anyhow so that the back-end doesn't think that
3356          the beginning of the switch is unreachable.  */
3357       if (!cases->root)
3358         add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
3359       return error_mark_node;
3360     }
3361
3362   if ((low_value && TREE_TYPE (low_value) 
3363        && POINTER_TYPE_P (TREE_TYPE (low_value))) 
3364       || (high_value && TREE_TYPE (high_value)
3365           && POINTER_TYPE_P (TREE_TYPE (high_value))))
3366     error ("pointers are not permitted as case values");
3367
3368   /* Case ranges are a GNU extension.  */
3369   if (high_value && pedantic)
3370     {
3371       if (c_language == clk_cplusplus)
3372         pedwarn ("ISO C++ forbids range expressions in switch statements");
3373       else
3374         pedwarn ("ISO C forbids range expressions in switch statements");
3375     }
3376
3377   type = TREE_TYPE (cond);
3378   if (low_value)
3379     {
3380       low_value = check_case_value (low_value);
3381       low_value = convert_and_check (type, low_value);
3382     }
3383   if (high_value)
3384     {
3385       high_value = check_case_value (high_value);
3386       high_value = convert_and_check (type, high_value);
3387     }
3388
3389   /* If an error has occurred, bail out now.  */
3390   if (low_value == error_mark_node || high_value == error_mark_node)
3391     {
3392       if (!cases->root)
3393         add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
3394       return error_mark_node;
3395     }
3396
3397   /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
3398      really a case range, even though it was written that way.  Remove
3399      the HIGH_VALUE to simplify later processing.  */
3400   if (tree_int_cst_equal (low_value, high_value))
3401     high_value = NULL_TREE;
3402   if (low_value && high_value 
3403       && !tree_int_cst_lt (low_value, high_value)) 
3404     warning ("empty range specified");
3405
3406   /* Look up the LOW_VALUE in the table of case labels we already
3407      have.  */
3408   node = splay_tree_lookup (cases, (splay_tree_key) low_value);
3409   /* If there was not an exact match, check for overlapping ranges.
3410      There's no need to do this if there's no LOW_VALUE or HIGH_VALUE;
3411      that's a `default' label and the only overlap is an exact match.  */
3412   if (!node && (low_value || high_value))
3413     {
3414       splay_tree_node low_bound;
3415       splay_tree_node high_bound;
3416
3417       /* Even though there wasn't an exact match, there might be an
3418          overlap between this case range and another case range.
3419          Since we've (inductively) not allowed any overlapping case
3420          ranges, we simply need to find the greatest low case label
3421          that is smaller that LOW_VALUE, and the smallest low case
3422          label that is greater than LOW_VALUE.  If there is an overlap
3423          it will occur in one of these two ranges.  */
3424       low_bound = splay_tree_predecessor (cases,
3425                                           (splay_tree_key) low_value);
3426       high_bound = splay_tree_successor (cases,
3427                                          (splay_tree_key) low_value);
3428
3429       /* Check to see if the LOW_BOUND overlaps.  It is smaller than
3430          the LOW_VALUE, so there is no need to check unless the
3431          LOW_BOUND is in fact itself a case range.  */
3432       if (low_bound
3433           && CASE_HIGH ((tree) low_bound->value)
3434           && tree_int_cst_compare (CASE_HIGH ((tree) low_bound->value),
3435                                     low_value) >= 0)
3436         node = low_bound;
3437       /* Check to see if the HIGH_BOUND overlaps.  The low end of that
3438          range is bigger than the low end of the current range, so we
3439          are only interested if the current range is a real range, and
3440          not an ordinary case label.  */
3441       else if (high_bound 
3442                && high_value
3443                && (tree_int_cst_compare ((tree) high_bound->key,
3444                                          high_value)
3445                    <= 0))
3446         node = high_bound;
3447     }
3448   /* If there was an overlap, issue an error.  */
3449   if (node)
3450     {
3451       tree duplicate = CASE_LABEL_DECL ((tree) node->value);
3452
3453       if (high_value)
3454         {
3455           error ("duplicate (or overlapping) case value");
3456           error_with_decl (duplicate, 
3457                            "this is the first entry overlapping that value");
3458         }
3459       else if (low_value)
3460         {
3461           error ("duplicate case value") ;
3462           error_with_decl (duplicate, "previously used here");
3463         }
3464       else
3465         {
3466           error ("multiple default labels in one switch");
3467           error_with_decl (duplicate, "this is the first default label");
3468         }
3469       if (!cases->root)
3470         add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
3471     }
3472
3473   /* Add a CASE_LABEL to the statement-tree.  */
3474   case_label = add_stmt (build_case_label (low_value, high_value, label));
3475   /* Register this case label in the splay tree.  */
3476   splay_tree_insert (cases, 
3477                      (splay_tree_key) low_value,
3478                      (splay_tree_value) case_label);
3479
3480   return case_label;
3481 }
3482
3483 /* Finish an expression taking the address of LABEL.  Returns an
3484    expression for the address.  */
3485
3486 tree 
3487 finish_label_address_expr (label)
3488      tree label;
3489 {
3490   tree result;
3491
3492   if (pedantic)
3493     {
3494       if (c_language == clk_cplusplus)
3495         pedwarn ("ISO C++ forbids taking the address of a label");
3496       else
3497         pedwarn ("ISO C forbids taking the address of a label");
3498     }
3499
3500   label = lookup_label (label);
3501   if (label == NULL_TREE)
3502     result = null_pointer_node;
3503   else
3504     {
3505       TREE_USED (label) = 1;
3506       result = build1 (ADDR_EXPR, ptr_type_node, label);
3507       TREE_CONSTANT (result) = 1;
3508       /* The current function in not necessarily uninlinable.
3509          Computed gotos are incompatible with inlining, but the value
3510          here could be used only in a diagnostic, for example.  */
3511     }
3512
3513   return result;
3514 }
3515
3516 /* Mark P (a stmt_tree) for GC.  The use of a `void *' for the
3517    parameter allows this function to be used as a GC-marking
3518    function.  */
3519
3520 void
3521 mark_stmt_tree (p)
3522      void *p;
3523 {
3524   stmt_tree st = (stmt_tree) p;
3525
3526   ggc_mark_tree (st->x_last_stmt);
3527   ggc_mark_tree (st->x_last_expr_type);
3528 }
3529
3530 /* Mark LD for GC.  */
3531
3532 void
3533 c_mark_lang_decl (c)
3534      struct c_lang_decl *c ATTRIBUTE_UNUSED;
3535 {
3536 }
3537
3538 /* Mark F for GC.  */
3539
3540 void
3541 mark_c_language_function (f)
3542      struct language_function *f;
3543 {
3544   if (!f)
3545     return;
3546
3547   mark_stmt_tree (&f->x_stmt_tree);
3548   ggc_mark_tree (f->x_scope_stmt_stack);
3549 }
3550
3551 /* Hook used by expand_expr to expand language-specific tree codes.  */
3552
3553 rtx
3554 c_expand_expr (exp, target, tmode, modifier)
3555      tree exp;
3556      rtx target;
3557      enum machine_mode tmode;
3558      enum expand_modifier modifier;
3559 {
3560   switch (TREE_CODE (exp))
3561     {
3562     case STMT_EXPR:
3563       {
3564         tree rtl_expr;
3565         rtx result;
3566         bool preserve_result = false;
3567         bool return_target = false;
3568
3569         /* Since expand_expr_stmt calls free_temp_slots after every
3570            expression statement, we must call push_temp_slots here.
3571            Otherwise, any temporaries in use now would be considered
3572            out-of-scope after the first EXPR_STMT from within the
3573            STMT_EXPR.  */
3574         push_temp_slots ();
3575         rtl_expr = expand_start_stmt_expr (!STMT_EXPR_NO_SCOPE (exp));
3576
3577         /* If we want the result of this expression, find the last
3578            EXPR_STMT in the COMPOUND_STMT and mark it as addressable.  */
3579         if (target != const0_rtx
3580             && TREE_CODE (STMT_EXPR_STMT (exp)) == COMPOUND_STMT
3581             && TREE_CODE (COMPOUND_BODY (STMT_EXPR_STMT (exp))) == SCOPE_STMT)
3582           {
3583             tree expr = COMPOUND_BODY (STMT_EXPR_STMT (exp));
3584             tree last = TREE_CHAIN (expr);
3585
3586             while (TREE_CHAIN (last))
3587               {
3588                 expr = last;
3589                 last = TREE_CHAIN (last);
3590               }
3591
3592             if (TREE_CODE (last) == SCOPE_STMT
3593                 && TREE_CODE (expr) == EXPR_STMT)
3594               {
3595                 if (target && TREE_CODE (EXPR_STMT_EXPR (expr)) == VAR_DECL
3596                     && DECL_RTL_IF_SET (EXPR_STMT_EXPR (expr)) == target)
3597                   /* If the last expression is a variable whose RTL is the
3598                      same as our target, just return the target; if it
3599                      isn't valid expanding the decl would produce different
3600                      RTL, and store_expr would try to do a copy.  */
3601                   return_target = true;
3602                 else
3603                   {
3604                     /* Otherwise, note that we want the value from the last
3605                        expression.  */
3606                     TREE_ADDRESSABLE (expr) = 1;
3607                     preserve_result = true;
3608                   }
3609               }
3610           }
3611
3612         expand_stmt (STMT_EXPR_STMT (exp));
3613         expand_end_stmt_expr (rtl_expr);
3614
3615         result = expand_expr (rtl_expr, target, tmode, modifier);
3616         if (return_target)
3617           result = target;
3618         else if (preserve_result && GET_CODE (result) == MEM)
3619           {
3620             if (GET_MODE (result) != BLKmode)
3621               result = copy_to_reg (result);
3622             else
3623               preserve_temp_slots (result);
3624           }
3625
3626         /* If the statment-expression does not have a scope, then the
3627            new temporaries we created within it must live beyond the
3628            statement-expression.  */
3629         if (STMT_EXPR_NO_SCOPE (exp))
3630           preserve_temp_slots (NULL_RTX);
3631
3632         pop_temp_slots ();
3633         return result;
3634       }
3635       break;
3636       
3637     case CALL_EXPR:
3638       {
3639         if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
3640             && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
3641                 == FUNCTION_DECL)
3642             && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
3643             && (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
3644                 == BUILT_IN_FRONTEND))
3645           return c_expand_builtin (exp, target, tmode, modifier);
3646         else
3647           abort ();
3648       }
3649       break;
3650
3651     case COMPOUND_LITERAL_EXPR:
3652       {
3653         /* Initialize the anonymous variable declared in the compound
3654            literal, then return the variable.  */
3655         tree decl = COMPOUND_LITERAL_EXPR_DECL (exp);
3656         emit_local_var (decl);
3657         return expand_expr (decl, target, tmode, modifier);
3658       }
3659
3660     default:
3661       abort ();
3662     }
3663
3664   abort ();
3665   return NULL;
3666 }
3667
3668 /* Hook used by safe_from_p to handle language-specific tree codes.  */
3669
3670 int
3671 c_safe_from_p (target, exp)
3672      rtx target;
3673      tree exp;
3674 {
3675   /* We can see statements here when processing the body of a
3676      statement-expression.  For a declaration statement declaring a
3677      variable, look at the variable's initializer.  */
3678   if (TREE_CODE (exp) == DECL_STMT) 
3679     {
3680       tree decl = DECL_STMT_DECL (exp);
3681
3682       if (TREE_CODE (decl) == VAR_DECL
3683           && DECL_INITIAL (decl)
3684           && !safe_from_p (target, DECL_INITIAL (decl), /*top_p=*/0))
3685         return 0;
3686     }
3687
3688   /* For any statement, we must follow the statement-chain.  */
3689   if (statement_code_p (TREE_CODE (exp)) && TREE_CHAIN (exp))
3690     return safe_from_p (target, TREE_CHAIN (exp), /*top_p=*/0);
3691
3692   /* Assume everything else is safe.  */
3693   return 1;
3694 }
3695
3696 /* Hook used by unsafe_for_reeval to handle language-specific tree codes.  */
3697
3698 int
3699 c_unsafe_for_reeval (exp)
3700      tree exp;
3701 {
3702   /* Statement expressions may not be reevaluated, likewise compound
3703      literals.  */
3704   if (TREE_CODE (exp) == STMT_EXPR
3705       || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
3706     return 2;
3707
3708   /* Walk all other expressions.  */
3709   return -1;
3710 }
3711
3712 /* Hook used by staticp to handle language-specific tree codes.  */
3713
3714 int
3715 c_staticp (exp)
3716      tree exp;
3717 {
3718   if (TREE_CODE (exp) == COMPOUND_LITERAL_EXPR
3719       && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp)))
3720     return 1;
3721   return 0;
3722 }
3723
3724 /* Tree code classes.  */
3725
3726 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
3727
3728 static const char c_tree_code_type[] = {
3729   'x',
3730 #include "c-common.def"
3731 };
3732 #undef DEFTREECODE
3733
3734 /* Table indexed by tree code giving number of expression
3735    operands beyond the fixed part of the node structure.
3736    Not used for types or decls.  */
3737
3738 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
3739
3740 static const int c_tree_code_length[] = {
3741   0,
3742 #include "c-common.def"
3743 };
3744 #undef DEFTREECODE
3745
3746 /* Names of tree components.
3747    Used for printing out the tree and error messages.  */
3748 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
3749
3750 static const char *const c_tree_code_name[] = {
3751   "@@dummy",
3752 #include "c-common.def"
3753 };
3754 #undef DEFTREECODE
3755
3756 /* Adds the tree codes specific to the C front end to the list of all
3757    tree codes.  */
3758
3759 void
3760 add_c_tree_codes ()
3761 {
3762   memcpy (tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE,
3763           c_tree_code_type,
3764           (int) LAST_C_TREE_CODE - (int) LAST_AND_UNUSED_TREE_CODE);
3765   memcpy (tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE,
3766           c_tree_code_length,
3767           (LAST_C_TREE_CODE - (int) LAST_AND_UNUSED_TREE_CODE) * sizeof (int));
3768   memcpy (tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE,
3769           c_tree_code_name,
3770           (LAST_C_TREE_CODE - (int) LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
3771   lang_unsafe_for_reeval = c_unsafe_for_reeval;
3772 }
3773
3774 #define CALLED_AS_BUILT_IN(NODE) \
3775    (!strncmp (IDENTIFIER_POINTER (DECL_NAME (NODE)), "__builtin_", 10))
3776
3777 static rtx
3778 c_expand_builtin (exp, target, tmode, modifier)
3779      tree exp;
3780      rtx target;
3781      enum machine_mode tmode;
3782      enum expand_modifier modifier;
3783 {
3784   tree type = TREE_TYPE (exp);
3785   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
3786   tree arglist = TREE_OPERAND (exp, 1);
3787   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
3788   enum tree_code code = TREE_CODE (exp);
3789   const int ignore = (target == const0_rtx
3790                       || ((code == NON_LVALUE_EXPR || code == NOP_EXPR
3791                            || code == CONVERT_EXPR || code == REFERENCE_EXPR
3792                            || code == COND_EXPR)
3793                           && TREE_CODE (type) == VOID_TYPE));
3794
3795   if (! optimize && ! CALLED_AS_BUILT_IN (fndecl))
3796     return expand_call (exp, target, ignore);
3797
3798   switch (fcode)
3799     {
3800     case BUILT_IN_PRINTF:
3801       target = c_expand_builtin_printf (arglist, target, tmode,
3802                                         modifier, ignore, /*unlocked=*/ 0);
3803       if (target)
3804         return target;
3805       break;
3806
3807     case BUILT_IN_PRINTF_UNLOCKED:
3808       target = c_expand_builtin_printf (arglist, target, tmode,
3809                                         modifier, ignore, /*unlocked=*/ 1);
3810       if (target)
3811         return target;
3812       break;
3813
3814     case BUILT_IN_FPRINTF:
3815       target = c_expand_builtin_fprintf (arglist, target, tmode,
3816                                          modifier, ignore, /*unlocked=*/ 0);
3817       if (target)
3818         return target;
3819       break;
3820
3821     case BUILT_IN_FPRINTF_UNLOCKED:
3822       target = c_expand_builtin_fprintf (arglist, target, tmode,
3823                                          modifier, ignore, /*unlocked=*/ 1);
3824       if (target)
3825         return target;
3826       break;
3827
3828     default:                    /* just do library call, if unknown builtin */
3829       error ("built-in function `%s' not currently supported",
3830              IDENTIFIER_POINTER (DECL_NAME (fndecl)));
3831     }
3832
3833   /* The switch statement above can drop through to cause the function
3834      to be called normally.  */
3835   return expand_call (exp, target, ignore);
3836 }
3837
3838 /* Check an arglist to *printf for problems.  The arglist should start
3839    at the format specifier, with the remaining arguments immediately
3840    following it.  */
3841 static int
3842 is_valid_printf_arglist (arglist)
3843      tree arglist;
3844 {
3845   /* Save this value so we can restore it later.  */
3846   const int SAVE_pedantic = pedantic;
3847   int diagnostic_occurred = 0;
3848   tree attrs;
3849
3850   /* Set this to a known value so the user setting won't affect code
3851      generation.  */
3852   pedantic = 1;
3853   /* Check to make sure there are no format specifier errors.  */
3854   attrs = tree_cons (get_identifier ("format"),
3855                      tree_cons (NULL_TREE,
3856                                 get_identifier ("printf"),
3857                                 tree_cons (NULL_TREE,
3858                                            integer_one_node,
3859                                            tree_cons (NULL_TREE,
3860                                                       build_int_2 (2, 0),
3861                                                       NULL_TREE))),
3862                      NULL_TREE);
3863   check_function_format (&diagnostic_occurred, attrs, arglist);
3864
3865   /* Restore the value of `pedantic'.  */
3866   pedantic = SAVE_pedantic;
3867
3868   /* If calling `check_function_format_ptr' produces a warning, we
3869      return false, otherwise we return true.  */
3870   return ! diagnostic_occurred;
3871 }
3872
3873 /* If the arguments passed to printf are suitable for optimizations,
3874    we attempt to transform the call.  */
3875 static rtx
3876 c_expand_builtin_printf (arglist, target, tmode, modifier, ignore, unlocked)
3877      tree arglist;
3878      rtx target;
3879      enum machine_mode tmode;
3880      enum expand_modifier modifier;
3881      int ignore;
3882      int unlocked;
3883 {
3884   tree fn_putchar = unlocked ?
3885     built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED] : built_in_decls[BUILT_IN_PUTCHAR];
3886   tree fn_puts = unlocked ?
3887     built_in_decls[BUILT_IN_PUTS_UNLOCKED] : built_in_decls[BUILT_IN_PUTS];
3888   tree fn, format_arg, stripped_string;
3889
3890   /* If the return value is used, or the replacement _DECL isn't
3891      initialized, don't do the transformation.  */
3892   if (!ignore || !fn_putchar || !fn_puts)
3893     return 0;
3894
3895   /* Verify the required arguments in the original call.  */
3896   if (arglist == 0
3897       || (TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE))
3898     return 0;
3899   
3900   /* Check the specifier vs. the parameters.  */
3901   if (!is_valid_printf_arglist (arglist))
3902     return 0;
3903   
3904   format_arg = TREE_VALUE (arglist);
3905   stripped_string = format_arg;
3906   STRIP_NOPS (stripped_string);
3907   if (stripped_string && TREE_CODE (stripped_string) == ADDR_EXPR)
3908     stripped_string = TREE_OPERAND (stripped_string, 0);
3909
3910   /* If the format specifier isn't a STRING_CST, punt.  */
3911   if (TREE_CODE (stripped_string) != STRING_CST)
3912     return 0;
3913   
3914   /* OK!  We can attempt optimization.  */
3915
3916   /* If the format specifier was "%s\n", call __builtin_puts(arg2).  */
3917   if (strcmp (TREE_STRING_POINTER (stripped_string), "%s\n") == 0)
3918     {
3919       arglist = TREE_CHAIN (arglist);
3920       fn = fn_puts;
3921     }
3922   /* If the format specifier was "%c", call __builtin_putchar (arg2).  */
3923   else if (strcmp (TREE_STRING_POINTER (stripped_string), "%c") == 0)
3924     {
3925       arglist = TREE_CHAIN (arglist);
3926       fn = fn_putchar;
3927     }
3928   else
3929     {
3930       /* We can't handle anything else with % args or %% ... yet.  */
3931       if (strchr (TREE_STRING_POINTER (stripped_string), '%'))
3932         return 0;
3933       
3934       /* If the resulting constant string has a length of 1, call
3935          putchar.  Note, TREE_STRING_LENGTH includes the terminating
3936          NULL in its count.  */
3937       if (TREE_STRING_LENGTH (stripped_string) == 2)
3938         {
3939           /* Given printf("c"), (where c is any one character,)
3940              convert "c"[0] to an int and pass that to the replacement
3941              function.  */
3942           arglist = build_int_2 (TREE_STRING_POINTER (stripped_string)[0], 0);
3943           arglist = build_tree_list (NULL_TREE, arglist);
3944           
3945           fn = fn_putchar;
3946         }
3947       /* If the resulting constant was "string\n", call
3948          __builtin_puts("string").  Ensure "string" has at least one
3949          character besides the trailing \n.  Note, TREE_STRING_LENGTH
3950          includes the terminating NULL in its count.  */
3951       else if (TREE_STRING_LENGTH (stripped_string) > 2
3952                && TREE_STRING_POINTER (stripped_string)
3953                [TREE_STRING_LENGTH (stripped_string) - 2] == '\n')
3954         {
3955           /* Create a NULL-terminated string that's one char shorter
3956              than the original, stripping off the trailing '\n'.  */
3957           const int newlen = TREE_STRING_LENGTH (stripped_string) - 1;
3958           char *newstr = (char *) alloca (newlen);
3959           memcpy (newstr, TREE_STRING_POINTER (stripped_string), newlen - 1);
3960           newstr[newlen - 1] = 0;
3961           
3962           arglist = combine_strings (build_string (newlen, newstr));
3963           arglist = build_tree_list (NULL_TREE, arglist);
3964           fn = fn_puts;
3965         }
3966       else
3967         /* We'd like to arrange to call fputs(string) here, but we
3968            need stdout and don't have a way to get it ... yet.  */
3969         return 0;
3970     }
3971   
3972   return expand_expr (build_function_call (fn, arglist),
3973                       (ignore ? const0_rtx : target),
3974                       tmode, modifier);
3975 }
3976
3977 /* If the arguments passed to fprintf are suitable for optimizations,
3978    we attempt to transform the call.  */
3979 static rtx
3980 c_expand_builtin_fprintf (arglist, target, tmode, modifier, ignore, unlocked)
3981      tree arglist;
3982      rtx target;
3983      enum machine_mode tmode;
3984      enum expand_modifier modifier;
3985      int ignore;
3986      int unlocked;
3987 {
3988   tree fn_fputc = unlocked ?
3989     built_in_decls[BUILT_IN_FPUTC_UNLOCKED] : built_in_decls[BUILT_IN_FPUTC];
3990   tree fn_fputs = unlocked ?
3991     built_in_decls[BUILT_IN_FPUTS_UNLOCKED] : built_in_decls[BUILT_IN_FPUTS];
3992   tree fn, format_arg, stripped_string;
3993
3994   /* If the return value is used, or the replacement _DECL isn't
3995      initialized, don't do the transformation.  */
3996   if (!ignore || !fn_fputc || !fn_fputs)
3997     return 0;
3998
3999   /* Verify the required arguments in the original call.  */
4000   if (arglist == 0
4001       || (TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
4002       || (TREE_CHAIN (arglist) == 0)
4003       || (TREE_CODE (TREE_TYPE (TREE_VALUE (TREE_CHAIN (arglist)))) !=
4004           POINTER_TYPE))
4005     return 0;
4006   
4007   /* Check the specifier vs. the parameters.  */
4008   if (!is_valid_printf_arglist (TREE_CHAIN (arglist)))
4009     return 0;
4010   
4011   format_arg = TREE_VALUE (TREE_CHAIN (arglist));
4012   stripped_string = format_arg;
4013   STRIP_NOPS (stripped_string);
4014   if (stripped_string && TREE_CODE (stripped_string) == ADDR_EXPR)
4015     stripped_string = TREE_OPERAND (stripped_string, 0);
4016
4017   /* If the format specifier isn't a STRING_CST, punt.  */
4018   if (TREE_CODE (stripped_string) != STRING_CST)
4019     return 0;
4020   
4021   /* OK!  We can attempt optimization.  */
4022
4023   /* If the format specifier was "%s", call __builtin_fputs(arg3, arg1).  */
4024   if (strcmp (TREE_STRING_POINTER (stripped_string), "%s") == 0)
4025     {
4026       tree newarglist = build_tree_list (NULL_TREE, TREE_VALUE (arglist));
4027       arglist = tree_cons (NULL_TREE,
4028                            TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))),
4029                            newarglist);
4030       fn = fn_fputs;
4031     }
4032   /* If the format specifier was "%c", call __builtin_fputc (arg3, arg1).  */
4033   else if (strcmp (TREE_STRING_POINTER (stripped_string), "%c") == 0)
4034     {
4035       tree newarglist = build_tree_list (NULL_TREE, TREE_VALUE (arglist));
4036       arglist = tree_cons (NULL_TREE,
4037                            TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))),
4038                            newarglist);
4039       fn = fn_fputc;
4040     }
4041   else
4042     {
4043       /* We can't handle anything else with % args or %% ... yet.  */
4044       if (strchr (TREE_STRING_POINTER (stripped_string), '%'))
4045         return 0;
4046       
4047       /* When "string" doesn't contain %, replace all cases of
4048          fprintf(stream,string) with fputs(string,stream).  The fputs
4049          builtin will take take of special cases like length==1.  */
4050       arglist = tree_cons (NULL_TREE, TREE_VALUE (TREE_CHAIN (arglist)),
4051                            build_tree_list (NULL_TREE, TREE_VALUE (arglist)));
4052       fn = fn_fputs;
4053     }
4054   
4055   return expand_expr (build_function_call (fn, arglist),
4056                       (ignore ? const0_rtx : target),
4057                       tmode, modifier);
4058 }
4059 \f
4060
4061 /* Given a boolean expression ARG, return a tree representing an increment
4062    or decrement (as indicated by CODE) of ARG.  The front end must check for
4063    invalid cases (e.g., decrement in C++).  */
4064 tree
4065 boolean_increment (code, arg)
4066      enum tree_code code;
4067      tree arg;
4068 {
4069   tree val;
4070   tree true_res = (c_language == clk_cplusplus
4071                    ? boolean_true_node
4072                    : c_bool_true_node);
4073   arg = stabilize_reference (arg);
4074   switch (code)
4075     {
4076     case PREINCREMENT_EXPR:
4077       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
4078       break;
4079     case POSTINCREMENT_EXPR:
4080       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
4081       arg = save_expr (arg);
4082       val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4083       val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4084       break;
4085     case PREDECREMENT_EXPR:
4086       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg));
4087       break;
4088     case POSTDECREMENT_EXPR:
4089       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg));
4090       arg = save_expr (arg);
4091       val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4092       val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4093       break;
4094     default:
4095       abort ();
4096     }
4097   TREE_SIDE_EFFECTS (val) = 1;
4098   return val;
4099 }
4100 \f
4101 /* Handle C and C++ default attributes.  */
4102
4103 enum built_in_attribute
4104 {
4105 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
4106 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
4107 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
4108 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
4109 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) /* No entry needed in enum.  */
4110 #include "builtin-attrs.def"
4111 #undef DEF_ATTR_NULL_TREE
4112 #undef DEF_ATTR_INT
4113 #undef DEF_ATTR_IDENT
4114 #undef DEF_ATTR_TREE_LIST
4115 #undef DEF_FN_ATTR
4116   ATTR_LAST
4117 };
4118
4119 static tree built_in_attributes[(int) ATTR_LAST];
4120
4121 static bool c_attrs_initialized = false;
4122
4123 static void c_init_attributes PARAMS ((void));
4124
4125 /* Common initialization before parsing options.  */
4126 void
4127 c_common_init_options (lang)
4128      enum c_language_kind lang;
4129 {
4130   c_language = lang;
4131   parse_in = cpp_create_reader (lang == clk_c ? CLK_GNUC89:
4132                                 lang == clk_cplusplus ? CLK_GNUCXX: CLK_OBJC);
4133
4134   /* Mark as "unspecified" (see c_common_post_options).  */
4135   flag_bounds_check = -1;
4136 }
4137
4138 /* Post-switch processing.  */
4139 void
4140 c_common_post_options ()
4141 {
4142   cpp_post_options (parse_in);
4143
4144   flag_inline_trees = 1;
4145
4146   /* Use tree inlining if possible.  Function instrumentation is only
4147      done in the RTL level, so we disable tree inlining.  */
4148   if (! flag_instrument_function_entry_exit)
4149     {
4150       if (!flag_no_inline)
4151         flag_no_inline = 1;
4152       if (flag_inline_functions)
4153         {
4154           flag_inline_trees = 2;
4155           flag_inline_functions = 0;
4156         }
4157     }
4158
4159   /* If still "unspecified", make it match -fbounded-pointers.  */
4160   if (flag_bounds_check == -1)
4161     flag_bounds_check = flag_bounded_pointers;
4162
4163   /* Special format checking options don't work without -Wformat; warn if
4164      they are used.  */
4165   if (warn_format_y2k && !warn_format)
4166     warning ("-Wformat-y2k ignored without -Wformat");
4167   if (warn_format_extra_args && !warn_format)
4168     warning ("-Wformat-extra-args ignored without -Wformat");
4169   if (warn_format_nonliteral && !warn_format)
4170     warning ("-Wformat-nonliteral ignored without -Wformat");
4171   if (warn_format_security && !warn_format)
4172     warning ("-Wformat-security ignored without -Wformat");
4173   if (warn_missing_format_attribute && !warn_format)
4174     warning ("-Wmissing-format-attribute ignored without -Wformat");
4175
4176   /* If an error has occurred in cpplib, note it so we fail
4177      immediately.  */
4178   errorcount += cpp_errors (parse_in);
4179 }
4180
4181 /* Front end initialization common to C, ObjC and C++.  */
4182 const char *
4183 c_common_init (filename)
4184      const char *filename;
4185 {
4186   /* Do this before initializing pragmas, as then cpplib's hash table
4187      has been set up.  */
4188   filename = init_c_lex (filename);
4189
4190   init_pragma ();
4191
4192   if (!c_attrs_initialized)
4193     c_init_attributes ();
4194
4195   return filename;
4196 }
4197
4198 /* Common finish hook for the C, ObjC and C++ front ends.  */
4199 void
4200 c_common_finish ()
4201 {
4202   cpp_finish (parse_in);
4203
4204   /* For performance, avoid tearing down cpplib's internal structures.
4205      Call cpp_errors () instead of cpp_destroy ().  */
4206   errorcount += cpp_errors (parse_in);
4207 }
4208
4209 static void
4210 c_init_attributes ()
4211 {
4212   /* Fill in the built_in_attributes array.  */
4213 #define DEF_ATTR_NULL_TREE(ENUM)                \
4214   built_in_attributes[(int) ENUM] = NULL_TREE;
4215 #define DEF_ATTR_INT(ENUM, VALUE)                                            \
4216   built_in_attributes[(int) ENUM] = build_int_2 (VALUE, VALUE < 0 ? -1 : 0);
4217 #define DEF_ATTR_IDENT(ENUM, STRING)                            \
4218   built_in_attributes[(int) ENUM] = get_identifier (STRING);
4219 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
4220   built_in_attributes[(int) ENUM]                       \
4221     = tree_cons (built_in_attributes[(int) PURPOSE],    \
4222                  built_in_attributes[(int) VALUE],      \
4223                  built_in_attributes[(int) CHAIN]);
4224 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) /* No initialization needed.  */
4225 #include "builtin-attrs.def"
4226 #undef DEF_ATTR_NULL_TREE
4227 #undef DEF_ATTR_INT
4228 #undef DEF_ATTR_IDENT
4229 #undef DEF_ATTR_TREE_LIST
4230 #undef DEF_FN_ATTR
4231   ggc_add_tree_root (built_in_attributes, (int) ATTR_LAST);
4232   c_attrs_initialized = true;
4233 }
4234
4235 /* Depending on the name of DECL, apply default attributes to it.  */
4236
4237 void
4238 c_common_insert_default_attributes (decl)
4239      tree decl;
4240 {
4241   tree name = DECL_NAME (decl);
4242
4243   if (!c_attrs_initialized)
4244     c_init_attributes ();
4245
4246 #define DEF_ATTR_NULL_TREE(ENUM) /* Nothing needed after initialization.  */
4247 #define DEF_ATTR_INT(ENUM, VALUE)
4248 #define DEF_ATTR_IDENT(ENUM, STRING)
4249 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN)
4250 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE)                     \
4251   if ((PREDICATE) && name == built_in_attributes[(int) NAME])   \
4252     decl_attributes (&decl, built_in_attributes[(int) ATTRS],   \
4253                      ATTR_FLAG_BUILT_IN);
4254 #include "builtin-attrs.def"
4255 #undef DEF_ATTR_NULL_TREE
4256 #undef DEF_ATTR_INT
4257 #undef DEF_ATTR_IDENT
4258 #undef DEF_ATTR_TREE_LIST
4259 #undef DEF_FN_ATTR
4260 }
4261
4262 /* Output a -Wshadow warning MSGID about NAME, an IDENTIFIER_NODE, and
4263    additionally give the location of the previous declaration DECL.  */
4264 void
4265 shadow_warning (msgid, name, decl)
4266      const char *msgid;
4267      tree name, decl;
4268 {
4269   warning ("declaration of `%s' shadows %s", IDENTIFIER_POINTER (name), msgid);
4270   warning_with_file_and_line (DECL_SOURCE_FILE (decl),
4271                               DECL_SOURCE_LINE (decl),
4272                               "shadowed declaration is here");
4273 }
4274