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