* config/mips/iris6.h (SUBTARGET_ASM_OPTIMIZING_SPEC): Define to
[official-gcc.git] / gcc / c-common.c
blob3e9d962bde9bb4ed4af10afb3a56594ddd6e9615
1 /* Subroutines shared by all languages that are variants of C.
2 Copyright (C) 1992, 93-98, 1999 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 #include "config.h"
22 #include "system.h"
23 #include "tree.h"
24 #include "c-lex.h"
25 #include "c-tree.h"
26 #include "flags.h"
27 #include "obstack.h"
28 #include "toplev.h"
29 #include "output.h"
30 #include "c-pragma.h"
31 #include "rtl.h"
32 #include "ggc.h"
34 #if USE_CPPLIB
35 #include "cpplib.h"
36 cpp_reader parse_in;
37 cpp_options parse_options;
38 enum cpp_token cpp_token;
39 #endif
41 #undef WCHAR_TYPE_SIZE
42 #define WCHAR_TYPE_SIZE TYPE_PRECISION (wchar_type_node)
44 /* The following symbols are subsumed in the c_global_trees array, and
45 listed here individually for documentation purposes.
47 INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
49 tree short_integer_type_node;
50 tree long_integer_type_node;
51 tree long_long_integer_type_node;
53 tree short_unsigned_type_node;
54 tree long_unsigned_type_node;
55 tree long_long_unsigned_type_node;
57 tree boolean_type_node;
58 tree boolean_false_node;
59 tree boolean_true_node;
61 tree ptrdiff_type_node;
63 tree unsigned_char_type_node;
64 tree signed_char_type_node;
65 tree wchar_type_node;
66 tree signed_wchar_type_node;
67 tree unsigned_wchar_type_node;
69 tree float_type_node;
70 tree double_type_node;
71 tree long_double_type_node;
73 tree complex_integer_type_node;
74 tree complex_float_type_node;
75 tree complex_double_type_node;
76 tree complex_long_double_type_node;
78 tree intQI_type_node;
79 tree intHI_type_node;
80 tree intSI_type_node;
81 tree intDI_type_node;
82 tree intTI_type_node;
84 tree unsigned_intQI_type_node;
85 tree unsigned_intHI_type_node;
86 tree unsigned_intSI_type_node;
87 tree unsigned_intDI_type_node;
88 tree unsigned_intTI_type_node;
90 tree widest_integer_literal_type_node;
91 tree widest_unsigned_literal_type_node;
93 Nodes for types `void *' and `const void *'.
95 tree ptr_type_node, const_ptr_type_node;
97 Nodes for types `char *' and `const char *'.
99 tree string_type_node, const_string_type_node;
101 Type `char[SOMENUMBER]'.
102 Used when an array of char is needed and the size is irrelevant.
104 tree char_array_type_node;
106 Type `int[SOMENUMBER]' or something like it.
107 Used when an array of int needed and the size is irrelevant.
109 tree int_array_type_node;
111 Type `wchar_t[SOMENUMBER]' or something like it.
112 Used when a wide string literal is created.
114 tree wchar_array_type_node;
116 Type `int ()' -- used for implicit declaration of functions.
118 tree default_function_type;
120 Function types `int (int)', etc.
122 tree int_ftype_int;
123 tree void_ftype;
124 tree void_ftype_ptr;
125 tree int_ftype_int;
126 tree ptr_ftype_sizetype;
128 A VOID_TYPE node, packaged in a TREE_LIST.
130 tree void_list_node;
134 tree c_global_trees[CTI_MAX];
136 /* Nonzero means the expression being parsed will never be evaluated.
137 This is a count, since unevaluated expressions can nest. */
138 int skip_evaluation;
140 enum attrs {A_PACKED, A_NOCOMMON, A_COMMON, A_NORETURN, A_CONST, A_T_UNION,
141 A_NO_CHECK_MEMORY_USAGE, A_NO_INSTRUMENT_FUNCTION,
142 A_CONSTRUCTOR, A_DESTRUCTOR, A_MODE, A_SECTION, A_ALIGNED,
143 A_UNUSED, A_FORMAT, A_FORMAT_ARG, A_WEAK, A_ALIAS};
145 enum format_type { printf_format_type, scanf_format_type,
146 strftime_format_type };
148 static void declare_hidden_char_array PROTO((const char *, const char *));
149 static void add_attribute PROTO((enum attrs, const char *,
150 int, int, int));
151 static void init_attributes PROTO((void));
152 static void record_function_format PROTO((tree, tree, enum format_type,
153 int, int));
154 static void record_international_format PROTO((tree, tree, int));
155 static tree c_find_base_decl PROTO((tree));
156 static int default_valid_lang_attribute PROTO ((tree, tree, tree, tree));
158 /* Keep a stack of if statements. We record the number of compound
159 statements seen up to the if keyword, as well as the line number
160 and file of the if. If a potentially ambiguous else is seen, that
161 fact is recorded; the warning is issued when we can be sure that
162 the enclosing if statement does not have an else branch. */
163 typedef struct
165 int compstmt_count;
166 int line;
167 const char *file;
168 int needs_warning;
169 } if_elt;
170 static void tfaff PROTO((void));
172 static if_elt *if_stack;
174 /* Amount of space in the if statement stack. */
175 static int if_stack_space = 0;
177 /* Stack pointer. */
178 static int if_stack_pointer = 0;
180 /* Generate RTL for the start of an if-then, and record the start of it
181 for ambiguous else detection. */
183 void
184 c_expand_start_cond (cond, exitflag, compstmt_count)
185 tree cond;
186 int exitflag;
187 int compstmt_count;
189 /* Make sure there is enough space on the stack. */
190 if (if_stack_space == 0)
192 if_stack_space = 10;
193 if_stack = (if_elt *)xmalloc (10 * sizeof (if_elt));
195 else if (if_stack_space == if_stack_pointer)
197 if_stack_space += 10;
198 if_stack = (if_elt *)xrealloc (if_stack, if_stack_space * sizeof (if_elt));
201 /* Record this if statement. */
202 if_stack[if_stack_pointer].compstmt_count = compstmt_count;
203 if_stack[if_stack_pointer].file = input_filename;
204 if_stack[if_stack_pointer].line = lineno;
205 if_stack[if_stack_pointer].needs_warning = 0;
206 if_stack_pointer++;
208 expand_start_cond (cond, exitflag);
211 /* Generate RTL for the end of an if-then. Optionally warn if a nested
212 if statement had an ambiguous else clause. */
214 void
215 c_expand_end_cond ()
217 if_stack_pointer--;
218 if (if_stack[if_stack_pointer].needs_warning)
219 warning_with_file_and_line (if_stack[if_stack_pointer].file,
220 if_stack[if_stack_pointer].line,
221 "suggest explicit braces to avoid ambiguous `else'");
222 expand_end_cond ();
225 /* Generate RTL between the then-clause and the else-clause
226 of an if-then-else. */
228 void
229 c_expand_start_else ()
231 /* An ambiguous else warning must be generated for the enclosing if
232 statement, unless we see an else branch for that one, too. */
233 if (warn_parentheses
234 && if_stack_pointer > 1
235 && (if_stack[if_stack_pointer - 1].compstmt_count
236 == if_stack[if_stack_pointer - 2].compstmt_count))
237 if_stack[if_stack_pointer - 2].needs_warning = 1;
239 /* Even if a nested if statement had an else branch, it can't be
240 ambiguous if this one also has an else. So don't warn in that
241 case. Also don't warn for any if statements nested in this else. */
242 if_stack[if_stack_pointer - 1].needs_warning = 0;
243 if_stack[if_stack_pointer - 1].compstmt_count--;
245 expand_start_else ();
248 /* Make bindings for __FUNCTION__, __PRETTY_FUNCTION__, and __func__. */
250 void
251 declare_function_name ()
253 const char *name, *printable_name;
255 if (current_function_decl == NULL)
257 name = "";
258 printable_name = "top level";
260 else
262 /* Allow functions to be nameless (such as artificial ones). */
263 if (DECL_NAME (current_function_decl))
264 name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
265 else
266 name = "";
267 printable_name = (*decl_printable_name) (current_function_decl, 2);
270 declare_hidden_char_array ("__FUNCTION__", name);
271 declare_hidden_char_array ("__PRETTY_FUNCTION__", printable_name);
272 /* The ISO C people "of course" couldn't use __FUNCTION__ in the
273 ISO C 9x standard; instead a new variable is invented. */
274 declare_hidden_char_array ("__func__", name);
277 static void
278 declare_hidden_char_array (name, value)
279 const char *name, *value;
281 tree decl, type, init;
282 int vlen;
284 /* If the default size of char arrays isn't big enough for the name,
285 or if we want to give warnings for large objects, make a bigger one. */
286 vlen = strlen (value) + 1;
287 type = char_array_type_node;
288 if (TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) < vlen
289 || warn_larger_than)
290 type = build_array_type (char_type_node,
291 build_index_type (build_int_2 (vlen, 0)));
292 push_obstacks_nochange ();
293 decl = build_decl (VAR_DECL, get_identifier (name), type);
294 TREE_STATIC (decl) = 1;
295 TREE_READONLY (decl) = 1;
296 TREE_ASM_WRITTEN (decl) = 1;
297 DECL_SOURCE_LINE (decl) = 0;
298 DECL_ARTIFICIAL (decl) = 1;
299 DECL_IN_SYSTEM_HEADER (decl) = 1;
300 DECL_IGNORED_P (decl) = 1;
301 init = build_string (vlen, value);
302 TREE_TYPE (init) = type;
303 DECL_INITIAL (decl) = init;
304 finish_decl (pushdecl (decl), init, NULL_TREE);
307 /* Given a chain of STRING_CST nodes,
308 concatenate them into one STRING_CST
309 and give it a suitable array-of-chars data type. */
311 tree
312 combine_strings (strings)
313 tree strings;
315 register tree value, t;
316 register int length = 1;
317 int wide_length = 0;
318 int wide_flag = 0;
319 int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
320 int nchars;
322 if (TREE_CHAIN (strings))
324 /* More than one in the chain, so concatenate. */
325 register char *p, *q;
327 /* Don't include the \0 at the end of each substring,
328 except for the last one.
329 Count wide strings and ordinary strings separately. */
330 for (t = strings; t; t = TREE_CHAIN (t))
332 if (TREE_TYPE (t) == wchar_array_type_node)
334 wide_length += (TREE_STRING_LENGTH (t) - wchar_bytes);
335 wide_flag = 1;
337 else
338 length += (TREE_STRING_LENGTH (t) - 1);
341 /* If anything is wide, the non-wides will be converted,
342 which makes them take more space. */
343 if (wide_flag)
344 length = length * wchar_bytes + wide_length;
346 p = ggc_p ? ggc_alloc_string (NULL, length) : savealloc (length);
348 /* Copy the individual strings into the new combined string.
349 If the combined string is wide, convert the chars to ints
350 for any individual strings that are not wide. */
352 q = p;
353 for (t = strings; t; t = TREE_CHAIN (t))
355 int len = (TREE_STRING_LENGTH (t)
356 - ((TREE_TYPE (t) == wchar_array_type_node)
357 ? wchar_bytes : 1));
358 if ((TREE_TYPE (t) == wchar_array_type_node) == wide_flag)
360 memcpy (q, TREE_STRING_POINTER (t), len);
361 q += len;
363 else
365 int i;
366 for (i = 0; i < len; i++)
368 if (WCHAR_TYPE_SIZE == HOST_BITS_PER_SHORT)
369 ((short *) q)[i] = TREE_STRING_POINTER (t)[i];
370 else
371 ((int *) q)[i] = TREE_STRING_POINTER (t)[i];
373 q += len * wchar_bytes;
376 if (wide_flag)
378 int i;
379 for (i = 0; i < wchar_bytes; i++)
380 *q++ = 0;
382 else
383 *q = 0;
385 value = make_node (STRING_CST);
386 TREE_STRING_POINTER (value) = p;
387 TREE_STRING_LENGTH (value) = length;
389 else
391 value = strings;
392 length = TREE_STRING_LENGTH (value);
393 if (TREE_TYPE (value) == wchar_array_type_node)
394 wide_flag = 1;
397 /* Compute the number of elements, for the array type. */
398 nchars = wide_flag ? length / wchar_bytes : length;
400 /* Create the array type for the string constant.
401 -Wwrite-strings says make the string constant an array of const char
402 so that copying it to a non-const pointer will get a warning.
403 For C++, this is the standard behavior. */
404 if (flag_const_strings
405 && (! flag_traditional && ! flag_writable_strings))
407 tree elements
408 = build_type_variant (wide_flag ? wchar_type_node : char_type_node,
409 1, 0);
410 TREE_TYPE (value)
411 = build_array_type (elements,
412 build_index_type (build_int_2 (nchars - 1, 0)));
414 else
415 TREE_TYPE (value)
416 = build_array_type (wide_flag ? wchar_type_node : char_type_node,
417 build_index_type (build_int_2 (nchars - 1, 0)));
419 TREE_CONSTANT (value) = 1;
420 TREE_READONLY (value) = ! flag_writable_strings;
421 TREE_STATIC (value) = 1;
422 return value;
425 /* To speed up processing of attributes, we maintain an array of
426 IDENTIFIER_NODES and the corresponding attribute types. */
428 /* Array to hold attribute information. */
430 static struct {enum attrs id; tree name; int min, max, decl_req;} attrtab[50];
432 static int attrtab_idx = 0;
434 /* Add an entry to the attribute table above. */
436 static void
437 add_attribute (id, string, min_len, max_len, decl_req)
438 enum attrs id;
439 const char *string;
440 int min_len, max_len;
441 int decl_req;
443 char buf[100];
445 attrtab[attrtab_idx].id = id;
446 attrtab[attrtab_idx].name = get_identifier (string);
447 attrtab[attrtab_idx].min = min_len;
448 attrtab[attrtab_idx].max = max_len;
449 attrtab[attrtab_idx++].decl_req = decl_req;
451 sprintf (buf, "__%s__", string);
453 attrtab[attrtab_idx].id = id;
454 attrtab[attrtab_idx].name = get_identifier (buf);
455 attrtab[attrtab_idx].min = min_len;
456 attrtab[attrtab_idx].max = max_len;
457 attrtab[attrtab_idx++].decl_req = decl_req;
460 /* Initialize attribute table. */
462 static void
463 init_attributes ()
465 add_attribute (A_PACKED, "packed", 0, 0, 0);
466 add_attribute (A_NOCOMMON, "nocommon", 0, 0, 1);
467 add_attribute (A_COMMON, "common", 0, 0, 1);
468 add_attribute (A_NORETURN, "noreturn", 0, 0, 1);
469 add_attribute (A_NORETURN, "volatile", 0, 0, 1);
470 add_attribute (A_UNUSED, "unused", 0, 0, 0);
471 add_attribute (A_CONST, "const", 0, 0, 1);
472 add_attribute (A_T_UNION, "transparent_union", 0, 0, 0);
473 add_attribute (A_CONSTRUCTOR, "constructor", 0, 0, 1);
474 add_attribute (A_DESTRUCTOR, "destructor", 0, 0, 1);
475 add_attribute (A_MODE, "mode", 1, 1, 1);
476 add_attribute (A_SECTION, "section", 1, 1, 1);
477 add_attribute (A_ALIGNED, "aligned", 0, 1, 0);
478 add_attribute (A_FORMAT, "format", 3, 3, 1);
479 add_attribute (A_FORMAT_ARG, "format_arg", 1, 1, 1);
480 add_attribute (A_WEAK, "weak", 0, 0, 1);
481 add_attribute (A_ALIAS, "alias", 1, 1, 1);
482 add_attribute (A_NO_INSTRUMENT_FUNCTION, "no_instrument_function", 0, 0, 1);
483 add_attribute (A_NO_CHECK_MEMORY_USAGE, "no_check_memory_usage", 0, 0, 1);
486 /* Default implementation of valid_lang_attribute, below. By default, there
487 are no language-specific attributes. */
489 static int
490 default_valid_lang_attribute (attr_name, attr_args, decl, type)
491 tree attr_name ATTRIBUTE_UNUSED;
492 tree attr_args ATTRIBUTE_UNUSED;
493 tree decl ATTRIBUTE_UNUSED;
494 tree type ATTRIBUTE_UNUSED;
496 return 0;
499 /* Return a 1 if ATTR_NAME and ATTR_ARGS denote a valid language-specific
500 attribute for either declaration DECL or type TYPE and 0 otherwise. */
502 int (*valid_lang_attribute) PROTO ((tree, tree, tree, tree))
503 = default_valid_lang_attribute;
505 /* Process the attributes listed in ATTRIBUTES and PREFIX_ATTRIBUTES
506 and install them in NODE, which is either a DECL (including a TYPE_DECL)
507 or a TYPE. PREFIX_ATTRIBUTES can appear after the declaration specifiers
508 and declaration modifiers but before the declaration proper. */
510 void
511 decl_attributes (node, attributes, prefix_attributes)
512 tree node, attributes, prefix_attributes;
514 tree decl = 0, type = 0;
515 int is_type = 0;
516 tree a;
518 if (attrtab_idx == 0)
519 init_attributes ();
521 if (TREE_CODE_CLASS (TREE_CODE (node)) == 'd')
523 decl = node;
524 type = TREE_TYPE (decl);
525 is_type = TREE_CODE (node) == TYPE_DECL;
527 else if (TREE_CODE_CLASS (TREE_CODE (node)) == 't')
528 type = node, is_type = 1;
530 #ifdef PRAGMA_INSERT_ATTRIBUTES
531 /* If the code in c-pragma.c wants to insert some attributes then
532 allow it to do so. Do this before allowing machine back ends to
533 insert attributes, so that they have the opportunity to override
534 anything done here. */
535 PRAGMA_INSERT_ATTRIBUTES (node, & attributes, & prefix_attributes);
536 #endif
538 #ifdef INSERT_ATTRIBUTES
539 INSERT_ATTRIBUTES (node, & attributes, & prefix_attributes);
540 #endif
542 attributes = chainon (prefix_attributes, attributes);
544 for (a = attributes; a; a = TREE_CHAIN (a))
546 tree name = TREE_PURPOSE (a);
547 tree args = TREE_VALUE (a);
548 int i;
549 enum attrs id;
551 for (i = 0; i < attrtab_idx; i++)
552 if (attrtab[i].name == name)
553 break;
555 if (i == attrtab_idx)
557 if (! valid_machine_attribute (name, args, decl, type)
558 && ! (* valid_lang_attribute) (name, args, decl, type))
559 warning ("`%s' attribute directive ignored",
560 IDENTIFIER_POINTER (name));
561 else if (decl != 0)
562 type = TREE_TYPE (decl);
563 continue;
565 else if (attrtab[i].decl_req && decl == 0)
567 warning ("`%s' attribute does not apply to types",
568 IDENTIFIER_POINTER (name));
569 continue;
571 else if (list_length (args) < attrtab[i].min
572 || list_length (args) > attrtab[i].max)
574 error ("wrong number of arguments specified for `%s' attribute",
575 IDENTIFIER_POINTER (name));
576 continue;
579 id = attrtab[i].id;
580 switch (id)
582 case A_PACKED:
583 if (is_type)
584 TYPE_PACKED (type) = 1;
585 else if (TREE_CODE (decl) == FIELD_DECL)
586 DECL_PACKED (decl) = 1;
587 /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
588 used for DECL_REGISTER. It wouldn't mean anything anyway. */
589 else
590 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
591 break;
593 case A_NOCOMMON:
594 if (TREE_CODE (decl) == VAR_DECL)
595 DECL_COMMON (decl) = 0;
596 else
597 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
598 break;
600 case A_COMMON:
601 if (TREE_CODE (decl) == VAR_DECL)
602 DECL_COMMON (decl) = 1;
603 else
604 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
605 break;
607 case A_NORETURN:
608 if (TREE_CODE (decl) == FUNCTION_DECL)
609 TREE_THIS_VOLATILE (decl) = 1;
610 else if (TREE_CODE (type) == POINTER_TYPE
611 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
612 TREE_TYPE (decl) = type
613 = build_pointer_type
614 (build_type_variant (TREE_TYPE (type),
615 TREE_READONLY (TREE_TYPE (type)), 1));
616 else
617 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
618 break;
620 case A_UNUSED:
621 if (is_type)
622 TREE_USED (type) = 1;
623 else if (TREE_CODE (decl) == PARM_DECL
624 || TREE_CODE (decl) == VAR_DECL
625 || TREE_CODE (decl) == FUNCTION_DECL
626 || TREE_CODE (decl) == LABEL_DECL)
627 TREE_USED (decl) = 1;
628 else
629 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
630 break;
632 case A_CONST:
633 if (TREE_CODE (decl) == FUNCTION_DECL)
634 TREE_READONLY (decl) = 1;
635 else if (TREE_CODE (type) == POINTER_TYPE
636 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
637 TREE_TYPE (decl) = type
638 = build_pointer_type
639 (build_type_variant (TREE_TYPE (type), 1,
640 TREE_THIS_VOLATILE (TREE_TYPE (type))));
641 else
642 warning ( "`%s' attribute ignored", IDENTIFIER_POINTER (name));
643 break;
645 case A_T_UNION:
646 if (is_type
647 && TREE_CODE (type) == UNION_TYPE
648 && (decl == 0
649 || (TYPE_FIELDS (type) != 0
650 && TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type)))))
651 TYPE_TRANSPARENT_UNION (type) = 1;
652 else if (decl != 0 && TREE_CODE (decl) == PARM_DECL
653 && TREE_CODE (type) == UNION_TYPE
654 && TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type)))
655 DECL_TRANSPARENT_UNION (decl) = 1;
656 else
657 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
658 break;
660 case A_CONSTRUCTOR:
661 if (TREE_CODE (decl) == FUNCTION_DECL
662 && TREE_CODE (type) == FUNCTION_TYPE
663 && decl_function_context (decl) == 0)
665 DECL_STATIC_CONSTRUCTOR (decl) = 1;
666 TREE_USED (decl) = 1;
668 else
669 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
670 break;
672 case A_DESTRUCTOR:
673 if (TREE_CODE (decl) == FUNCTION_DECL
674 && TREE_CODE (type) == FUNCTION_TYPE
675 && decl_function_context (decl) == 0)
677 DECL_STATIC_DESTRUCTOR (decl) = 1;
678 TREE_USED (decl) = 1;
680 else
681 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
682 break;
684 case A_MODE:
685 if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
686 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
687 else
689 int j;
690 const char *p = IDENTIFIER_POINTER (TREE_VALUE (args));
691 int len = strlen (p);
692 enum machine_mode mode = VOIDmode;
693 tree typefm;
695 if (len > 4 && p[0] == '_' && p[1] == '_'
696 && p[len - 1] == '_' && p[len - 2] == '_')
698 char *newp = (char *) alloca (len - 1);
700 strcpy (newp, &p[2]);
701 newp[len - 4] = '\0';
702 p = newp;
705 /* Give this decl a type with the specified mode.
706 First check for the special modes. */
707 if (! strcmp (p, "byte"))
708 mode = byte_mode;
709 else if (!strcmp (p, "word"))
710 mode = word_mode;
711 else if (! strcmp (p, "pointer"))
712 mode = ptr_mode;
713 else
714 for (j = 0; j < NUM_MACHINE_MODES; j++)
715 if (!strcmp (p, GET_MODE_NAME (j)))
716 mode = (enum machine_mode) j;
718 if (mode == VOIDmode)
719 error ("unknown machine mode `%s'", p);
720 else if (0 == (typefm = type_for_mode (mode,
721 TREE_UNSIGNED (type))))
722 error ("no data type for mode `%s'", p);
723 else
725 TREE_TYPE (decl) = type = typefm;
726 DECL_SIZE (decl) = 0;
727 layout_decl (decl, 0);
730 break;
732 case A_SECTION:
733 #ifdef ASM_OUTPUT_SECTION_NAME
734 if ((TREE_CODE (decl) == FUNCTION_DECL
735 || TREE_CODE (decl) == VAR_DECL)
736 && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
738 if (TREE_CODE (decl) == VAR_DECL
739 && current_function_decl != NULL_TREE
740 && ! TREE_STATIC (decl))
741 error_with_decl (decl,
742 "section attribute cannot be specified for local variables");
743 /* The decl may have already been given a section attribute from
744 a previous declaration. Ensure they match. */
745 else if (DECL_SECTION_NAME (decl) != NULL_TREE
746 && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
747 TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
748 error_with_decl (node,
749 "section of `%s' conflicts with previous declaration");
750 else
751 DECL_SECTION_NAME (decl) = TREE_VALUE (args);
753 else
754 error_with_decl (node,
755 "section attribute not allowed for `%s'");
756 #else
757 error_with_decl (node,
758 "section attributes are not supported for this target");
759 #endif
760 break;
762 case A_ALIGNED:
764 tree align_expr
765 = (args ? TREE_VALUE (args)
766 : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
767 int align;
769 /* Strip any NOPs of any kind. */
770 while (TREE_CODE (align_expr) == NOP_EXPR
771 || TREE_CODE (align_expr) == CONVERT_EXPR
772 || TREE_CODE (align_expr) == NON_LVALUE_EXPR)
773 align_expr = TREE_OPERAND (align_expr, 0);
775 if (TREE_CODE (align_expr) != INTEGER_CST)
777 error ("requested alignment is not a constant");
778 continue;
781 align = TREE_INT_CST_LOW (align_expr) * BITS_PER_UNIT;
783 if (exact_log2 (align) == -1)
784 error ("requested alignment is not a power of 2");
785 else if (is_type)
786 TYPE_ALIGN (type) = align;
787 else if (TREE_CODE (decl) != VAR_DECL
788 && TREE_CODE (decl) != FIELD_DECL)
789 error_with_decl (decl,
790 "alignment may not be specified for `%s'");
791 else
792 DECL_ALIGN (decl) = align;
794 break;
796 case A_FORMAT:
798 tree format_type_id = TREE_VALUE (args);
799 tree format_num_expr = TREE_VALUE (TREE_CHAIN (args));
800 tree first_arg_num_expr
801 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (args)));
802 int format_num;
803 int first_arg_num;
804 enum format_type format_type;
805 tree argument;
806 int arg_num;
808 if (TREE_CODE (decl) != FUNCTION_DECL)
810 error_with_decl (decl,
811 "argument format specified for non-function `%s'");
812 continue;
815 if (TREE_CODE (format_type_id) != IDENTIFIER_NODE)
817 error ("unrecognized format specifier");
818 continue;
820 else
822 const char *p = IDENTIFIER_POINTER (format_type_id);
824 if (!strcmp (p, "printf") || !strcmp (p, "__printf__"))
825 format_type = printf_format_type;
826 else if (!strcmp (p, "scanf") || !strcmp (p, "__scanf__"))
827 format_type = scanf_format_type;
828 else if (!strcmp (p, "strftime")
829 || !strcmp (p, "__strftime__"))
830 format_type = strftime_format_type;
831 else
833 warning ("`%s' is an unrecognized format function type", p);
834 continue;
838 /* Strip any conversions from the string index and first arg number
839 and verify they are constants. */
840 while (TREE_CODE (format_num_expr) == NOP_EXPR
841 || TREE_CODE (format_num_expr) == CONVERT_EXPR
842 || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
843 format_num_expr = TREE_OPERAND (format_num_expr, 0);
845 while (TREE_CODE (first_arg_num_expr) == NOP_EXPR
846 || TREE_CODE (first_arg_num_expr) == CONVERT_EXPR
847 || TREE_CODE (first_arg_num_expr) == NON_LVALUE_EXPR)
848 first_arg_num_expr = TREE_OPERAND (first_arg_num_expr, 0);
850 if (TREE_CODE (format_num_expr) != INTEGER_CST
851 || TREE_CODE (first_arg_num_expr) != INTEGER_CST)
853 error ("format string has non-constant operand number");
854 continue;
857 format_num = TREE_INT_CST_LOW (format_num_expr);
858 first_arg_num = TREE_INT_CST_LOW (first_arg_num_expr);
859 if (first_arg_num != 0 && first_arg_num <= format_num)
861 error ("format string arg follows the args to be formatted");
862 continue;
865 /* If a parameter list is specified, verify that the format_num
866 argument is actually a string, in case the format attribute
867 is in error. */
868 argument = TYPE_ARG_TYPES (type);
869 if (argument)
871 for (arg_num = 1; ; ++arg_num)
873 if (argument == 0 || arg_num == format_num)
874 break;
875 argument = TREE_CHAIN (argument);
877 if (! argument
878 || TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE
879 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (argument)))
880 != char_type_node))
882 error ("format string arg not a string type");
883 continue;
885 if (first_arg_num != 0)
887 /* Verify that first_arg_num points to the last arg,
888 the ... */
889 while (argument)
890 arg_num++, argument = TREE_CHAIN (argument);
891 if (arg_num != first_arg_num)
893 error ("args to be formatted is not ...");
894 continue;
899 record_function_format (DECL_NAME (decl),
900 DECL_ASSEMBLER_NAME (decl),
901 format_type, format_num, first_arg_num);
902 break;
905 case A_FORMAT_ARG:
907 tree format_num_expr = TREE_VALUE (args);
908 int format_num, arg_num;
909 tree argument;
911 if (TREE_CODE (decl) != FUNCTION_DECL)
913 error_with_decl (decl,
914 "argument format specified for non-function `%s'");
915 continue;
918 /* Strip any conversions from the first arg number and verify it
919 is a constant. */
920 while (TREE_CODE (format_num_expr) == NOP_EXPR
921 || TREE_CODE (format_num_expr) == CONVERT_EXPR
922 || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
923 format_num_expr = TREE_OPERAND (format_num_expr, 0);
925 if (TREE_CODE (format_num_expr) != INTEGER_CST)
927 error ("format string has non-constant operand number");
928 continue;
931 format_num = TREE_INT_CST_LOW (format_num_expr);
933 /* If a parameter list is specified, verify that the format_num
934 argument is actually a string, in case the format attribute
935 is in error. */
936 argument = TYPE_ARG_TYPES (type);
937 if (argument)
939 for (arg_num = 1; ; ++arg_num)
941 if (argument == 0 || arg_num == format_num)
942 break;
943 argument = TREE_CHAIN (argument);
945 if (! argument
946 || TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE
947 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (argument)))
948 != char_type_node))
950 error ("format string arg not a string type");
951 continue;
955 if (TREE_CODE (TREE_TYPE (TREE_TYPE (decl))) != POINTER_TYPE
956 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (TREE_TYPE (decl))))
957 != char_type_node))
959 error ("function does not return string type");
960 continue;
963 record_international_format (DECL_NAME (decl),
964 DECL_ASSEMBLER_NAME (decl),
965 format_num);
966 break;
969 case A_WEAK:
970 declare_weak (decl);
971 break;
973 case A_ALIAS:
974 if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
975 || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl)))
976 error_with_decl (decl,
977 "`%s' defined both normally and as an alias");
978 else if (decl_function_context (decl) == 0)
980 tree id;
982 id = TREE_VALUE (args);
983 if (TREE_CODE (id) != STRING_CST)
985 error ("alias arg not a string");
986 break;
988 id = get_identifier (TREE_STRING_POINTER (id));
990 if (TREE_CODE (decl) == FUNCTION_DECL)
991 DECL_INITIAL (decl) = error_mark_node;
992 else
993 DECL_EXTERNAL (decl) = 0;
994 assemble_alias (decl, id);
996 else
997 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
998 break;
1000 case A_NO_CHECK_MEMORY_USAGE:
1001 if (TREE_CODE (decl) != FUNCTION_DECL)
1003 error_with_decl (decl,
1004 "`%s' attribute applies only to functions",
1005 IDENTIFIER_POINTER (name));
1007 else if (DECL_INITIAL (decl))
1009 error_with_decl (decl,
1010 "can't set `%s' attribute after definition",
1011 IDENTIFIER_POINTER (name));
1013 else
1014 DECL_NO_CHECK_MEMORY_USAGE (decl) = 1;
1015 break;
1017 case A_NO_INSTRUMENT_FUNCTION:
1018 if (TREE_CODE (decl) != FUNCTION_DECL)
1020 error_with_decl (decl,
1021 "`%s' attribute applies only to functions",
1022 IDENTIFIER_POINTER (name));
1024 else if (DECL_INITIAL (decl))
1026 error_with_decl (decl,
1027 "can't set `%s' attribute after definition",
1028 IDENTIFIER_POINTER (name));
1030 else
1031 DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1032 break;
1037 /* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two
1038 lists. SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE).
1040 The head of the declspec list is stored in DECLSPECS.
1041 The head of the attribute list is stored in PREFIX_ATTRIBUTES.
1043 Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of
1044 the list elements. We drop the containing TREE_LIST nodes and link the
1045 resulting attributes together the way decl_attributes expects them. */
1047 void
1048 split_specs_attrs (specs_attrs, declspecs, prefix_attributes)
1049 tree specs_attrs;
1050 tree *declspecs, *prefix_attributes;
1052 tree t, s, a, next, specs, attrs;
1054 /* This can happen in c++ (eg: decl: typespec initdecls ';'). */
1055 if (specs_attrs != NULL_TREE
1056 && TREE_CODE (specs_attrs) != TREE_LIST)
1058 *declspecs = specs_attrs;
1059 *prefix_attributes = NULL_TREE;
1060 return;
1063 /* Remember to keep the lists in the same order, element-wise. */
1065 specs = s = NULL_TREE;
1066 attrs = a = NULL_TREE;
1067 for (t = specs_attrs; t; t = next)
1069 next = TREE_CHAIN (t);
1070 /* Declspecs have a non-NULL TREE_VALUE. */
1071 if (TREE_VALUE (t) != NULL_TREE)
1073 if (specs == NULL_TREE)
1074 specs = s = t;
1075 else
1077 TREE_CHAIN (s) = t;
1078 s = t;
1081 else
1083 if (attrs == NULL_TREE)
1084 attrs = a = TREE_PURPOSE (t);
1085 else
1087 TREE_CHAIN (a) = TREE_PURPOSE (t);
1088 a = TREE_PURPOSE (t);
1090 /* More attrs can be linked here, move A to the end. */
1091 while (TREE_CHAIN (a) != NULL_TREE)
1092 a = TREE_CHAIN (a);
1096 /* Terminate the lists. */
1097 if (s != NULL_TREE)
1098 TREE_CHAIN (s) = NULL_TREE;
1099 if (a != NULL_TREE)
1100 TREE_CHAIN (a) = NULL_TREE;
1102 /* All done. */
1103 *declspecs = specs;
1104 *prefix_attributes = attrs;
1107 /* Strip attributes from SPECS_ATTRS, a list of declspecs and attributes.
1108 This function is used by the parser when a rule will accept attributes
1109 in a particular position, but we don't want to support that just yet.
1111 A warning is issued for every ignored attribute. */
1113 tree
1114 strip_attrs (specs_attrs)
1115 tree specs_attrs;
1117 tree specs, attrs;
1119 split_specs_attrs (specs_attrs, &specs, &attrs);
1121 while (attrs)
1123 warning ("`%s' attribute ignored",
1124 IDENTIFIER_POINTER (TREE_PURPOSE (attrs)));
1125 attrs = TREE_CHAIN (attrs);
1128 return specs;
1131 /* Check a printf/fprintf/sprintf/scanf/fscanf/sscanf format against
1132 a parameter list. */
1134 #define T_I &integer_type_node
1135 #define T_L &long_integer_type_node
1136 #define T_LL &long_long_integer_type_node
1137 #define T_S &short_integer_type_node
1138 #define T_UI &unsigned_type_node
1139 #define T_UL &long_unsigned_type_node
1140 #define T_ULL &long_long_unsigned_type_node
1141 #define T_US &short_unsigned_type_node
1142 #define T_F &float_type_node
1143 #define T_D &double_type_node
1144 #define T_LD &long_double_type_node
1145 #define T_C &char_type_node
1146 #define T_UC &unsigned_char_type_node
1147 #define T_V &void_type_node
1148 #define T_W &wchar_type_node
1149 #define T_ST &sizetype
1151 typedef struct {
1152 const char *format_chars;
1153 int pointer_count;
1154 /* Type of argument if no length modifier is used. */
1155 tree *nolen;
1156 /* Type of argument if length modifier for shortening to byte is used.
1157 If NULL, then this modifier is not allowed. */
1158 tree *hhlen;
1159 /* Type of argument if length modifier for shortening is used.
1160 If NULL, then this modifier is not allowed. */
1161 tree *hlen;
1162 /* Type of argument if length modifier `l' is used.
1163 If NULL, then this modifier is not allowed. */
1164 tree *llen;
1165 /* Type of argument if length modifier `q' or `ll' is used.
1166 If NULL, then this modifier is not allowed. */
1167 tree *qlen;
1168 /* Type of argument if length modifier `L' is used.
1169 If NULL, then this modifier is not allowed. */
1170 tree *bigllen;
1171 /* Type of argument if length modifier `Z' is used.
1172 If NULL, then this modifier is not allowed. */
1173 tree *zlen;
1174 /* List of other modifier characters allowed with these options. */
1175 const char *flag_chars;
1176 } format_char_info;
1178 static format_char_info print_char_table[] = {
1179 { "di", 0, T_I, T_I, T_I, T_L, T_LL, T_LL, T_ST, "-wp0 +" },
1180 { "oxX", 0, T_UI, T_UI, T_UI, T_UL, T_ULL, T_ULL, T_ST, "-wp0#" },
1181 { "u", 0, T_UI, T_UI, T_UI, T_UL, T_ULL, T_ULL, T_ST, "-wp0" },
1182 /* A GNU extension. */
1183 { "m", 0, T_V, NULL, NULL, NULL, NULL, NULL, NULL, "-wp" },
1184 { "feEgGaA", 0, T_D, NULL, NULL, NULL, NULL, T_LD, NULL, "-wp0 +#" },
1185 { "c", 0, T_I, NULL, NULL, T_W, NULL, NULL, NULL, "-w" },
1186 { "C", 0, T_W, NULL, NULL, NULL, NULL, NULL, NULL, "-w" },
1187 { "s", 1, T_C, NULL, NULL, T_W, NULL, NULL, NULL, "-wp" },
1188 { "S", 1, T_W, NULL, NULL, NULL, NULL, NULL, NULL, "-wp" },
1189 { "p", 1, T_V, NULL, NULL, NULL, NULL, NULL, NULL, "-w" },
1190 { "n", 1, T_I, NULL, T_S, T_L, T_LL, NULL, NULL, "" },
1191 { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
1194 static format_char_info scan_char_table[] = {
1195 { "di", 1, T_I, T_C, T_S, T_L, T_LL, T_LL, NULL, "*" },
1196 { "ouxX", 1, T_UI, T_UC, T_US, T_UL, T_ULL, T_ULL, NULL, "*" },
1197 { "efgEGaA", 1, T_F, NULL, NULL, T_D, NULL, T_LD, NULL, "*" },
1198 { "c", 1, T_C, NULL, NULL, T_W, NULL, NULL, NULL, "*" },
1199 { "s", 1, T_C, NULL, NULL, T_W, NULL, NULL, NULL, "*a" },
1200 { "[", 1, T_C, NULL, NULL, NULL, NULL, NULL, NULL, "*a" },
1201 { "C", 1, T_W, NULL, NULL, NULL, NULL, NULL, NULL, "*" },
1202 { "S", 1, T_W, NULL, NULL, NULL, NULL, NULL, NULL, "*a" },
1203 { "p", 2, T_V, NULL, NULL, NULL, NULL, NULL, NULL, "*" },
1204 { "n", 1, T_I, T_C, T_S, T_L, T_LL, NULL, NULL, "" },
1205 { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
1208 /* Handle format characters recognized by glibc's strftime.c.
1209 '2' - MUST do years as only two digits
1210 '3' - MAY do years as only two digits (depending on locale)
1211 'E' - E modifier is acceptable
1212 'O' - O modifier is acceptable to Standard C
1213 'o' - O modifier is acceptable as a GNU extension
1214 'G' - other GNU extensions */
1216 static format_char_info time_char_table[] = {
1217 { "y", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "2EO-_0w" },
1218 { "D", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "2" },
1219 { "g", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "2O-_0w" },
1220 { "cx", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "3E" },
1221 { "%RTXnrt", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "" },
1222 { "P", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "G" },
1223 { "HIMSUWdemw", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "-_0Ow" },
1224 { "Vju", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "-_0Oow" },
1225 { "Gklsz", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "-_0OGw" },
1226 { "ABZa", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "^#" },
1227 { "p", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "#" },
1228 { "bh", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "^" },
1229 { "CY", 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "-_0EOw" },
1230 { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
1233 typedef struct function_format_info
1235 struct function_format_info *next; /* next structure on the list */
1236 tree name; /* identifier such as "printf" */
1237 tree assembler_name; /* optional mangled identifier (for C++) */
1238 enum format_type format_type; /* type of format (printf, scanf, etc.) */
1239 int format_num; /* number of format argument */
1240 int first_arg_num; /* number of first arg (zero for varargs) */
1241 } function_format_info;
1243 static function_format_info *function_format_list = NULL;
1245 typedef struct international_format_info
1247 struct international_format_info *next; /* next structure on the list */
1248 tree name; /* identifier such as "gettext" */
1249 tree assembler_name; /* optional mangled identifier (for C++) */
1250 int format_num; /* number of format argument */
1251 } international_format_info;
1253 static international_format_info *international_format_list = NULL;
1255 static void check_format_info PROTO((function_format_info *, tree));
1257 /* Initialize the table of functions to perform format checking on.
1258 The ANSI functions are always checked (whether <stdio.h> is
1259 included or not), since it is common to call printf without
1260 including <stdio.h>. There shouldn't be a problem with this,
1261 since ANSI reserves these function names whether you include the
1262 header file or not. In any case, the checking is harmless.
1264 Also initialize the name of function that modify the format string for
1265 internationalization purposes. */
1267 void
1268 init_function_format_info ()
1270 record_function_format (get_identifier ("printf"), NULL_TREE,
1271 printf_format_type, 1, 2);
1272 record_function_format (get_identifier ("fprintf"), NULL_TREE,
1273 printf_format_type, 2, 3);
1274 record_function_format (get_identifier ("sprintf"), NULL_TREE,
1275 printf_format_type, 2, 3);
1276 record_function_format (get_identifier ("scanf"), NULL_TREE,
1277 scanf_format_type, 1, 2);
1278 record_function_format (get_identifier ("fscanf"), NULL_TREE,
1279 scanf_format_type, 2, 3);
1280 record_function_format (get_identifier ("sscanf"), NULL_TREE,
1281 scanf_format_type, 2, 3);
1282 record_function_format (get_identifier ("vprintf"), NULL_TREE,
1283 printf_format_type, 1, 0);
1284 record_function_format (get_identifier ("vfprintf"), NULL_TREE,
1285 printf_format_type, 2, 0);
1286 record_function_format (get_identifier ("vsprintf"), NULL_TREE,
1287 printf_format_type, 2, 0);
1288 record_function_format (get_identifier ("strftime"), NULL_TREE,
1289 strftime_format_type, 3, 0);
1291 record_international_format (get_identifier ("gettext"), NULL_TREE, 1);
1292 record_international_format (get_identifier ("dgettext"), NULL_TREE, 2);
1293 record_international_format (get_identifier ("dcgettext"), NULL_TREE, 2);
1296 /* Record information for argument format checking. FUNCTION_IDENT is
1297 the identifier node for the name of the function to check (its decl
1298 need not exist yet).
1299 FORMAT_TYPE specifies the type of format checking. FORMAT_NUM is the number
1300 of the argument which is the format control string (starting from 1).
1301 FIRST_ARG_NUM is the number of the first actual argument to check
1302 against the format string, or zero if no checking is not be done
1303 (e.g. for varargs such as vfprintf). */
1305 static void
1306 record_function_format (name, assembler_name, format_type,
1307 format_num, first_arg_num)
1308 tree name;
1309 tree assembler_name;
1310 enum format_type format_type;
1311 int format_num;
1312 int first_arg_num;
1314 function_format_info *info;
1316 /* Re-use existing structure if it's there. */
1318 for (info = function_format_list; info; info = info->next)
1320 if (info->name == name && info->assembler_name == assembler_name)
1321 break;
1323 if (! info)
1325 info = (function_format_info *) xmalloc (sizeof (function_format_info));
1326 info->next = function_format_list;
1327 function_format_list = info;
1329 info->name = name;
1330 info->assembler_name = assembler_name;
1333 info->format_type = format_type;
1334 info->format_num = format_num;
1335 info->first_arg_num = first_arg_num;
1338 /* Record information for the names of function that modify the format
1339 argument to format functions. FUNCTION_IDENT is the identifier node for
1340 the name of the function (its decl need not exist yet) and FORMAT_NUM is
1341 the number of the argument which is the format control string (starting
1342 from 1). */
1344 static void
1345 record_international_format (name, assembler_name, format_num)
1346 tree name;
1347 tree assembler_name;
1348 int format_num;
1350 international_format_info *info;
1352 /* Re-use existing structure if it's there. */
1354 for (info = international_format_list; info; info = info->next)
1356 if (info->name == name && info->assembler_name == assembler_name)
1357 break;
1360 if (! info)
1362 info
1363 = (international_format_info *)
1364 xmalloc (sizeof (international_format_info));
1365 info->next = international_format_list;
1366 international_format_list = info;
1368 info->name = name;
1369 info->assembler_name = assembler_name;
1372 info->format_num = format_num;
1375 static void
1376 tfaff ()
1378 warning ("too few arguments for format");
1381 /* Check the argument list of a call to printf, scanf, etc.
1382 NAME is the function identifier.
1383 ASSEMBLER_NAME is the function's assembler identifier.
1384 (Either NAME or ASSEMBLER_NAME, but not both, may be NULL_TREE.)
1385 PARAMS is the list of argument values. */
1387 void
1388 check_function_format (name, assembler_name, params)
1389 tree name;
1390 tree assembler_name;
1391 tree params;
1393 function_format_info *info;
1395 /* See if this function is a format function. */
1396 for (info = function_format_list; info; info = info->next)
1398 if (info->assembler_name
1399 ? (info->assembler_name == assembler_name)
1400 : (info->name == name))
1402 /* Yup; check it. */
1403 check_format_info (info, params);
1404 break;
1409 /* Check the argument list of a call to printf, scanf, etc.
1410 INFO points to the function_format_info structure.
1411 PARAMS is the list of argument values. */
1413 static void
1414 check_format_info (info, params)
1415 function_format_info *info;
1416 tree params;
1418 int i;
1419 int arg_num;
1420 int suppressed, wide, precise;
1421 int length_char = 0;
1422 int format_char;
1423 int format_length;
1424 tree format_tree;
1425 tree cur_param;
1426 tree cur_type;
1427 tree wanted_type;
1428 tree first_fillin_param;
1429 const char *format_chars;
1430 format_char_info *fci = NULL;
1431 char flag_chars[8];
1432 int has_operand_number = 0;
1434 /* Skip to format argument. If the argument isn't available, there's
1435 no work for us to do; prototype checking will catch the problem. */
1436 for (arg_num = 1; ; ++arg_num)
1438 if (params == 0)
1439 return;
1440 if (arg_num == info->format_num)
1441 break;
1442 params = TREE_CHAIN (params);
1444 format_tree = TREE_VALUE (params);
1445 params = TREE_CHAIN (params);
1446 if (format_tree == 0)
1447 return;
1449 /* We can only check the format if it's a string constant. */
1450 while (TREE_CODE (format_tree) == NOP_EXPR)
1451 format_tree = TREE_OPERAND (format_tree, 0); /* strip coercion */
1453 if (TREE_CODE (format_tree) == CALL_EXPR
1454 && TREE_CODE (TREE_OPERAND (format_tree, 0)) == ADDR_EXPR
1455 && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (format_tree, 0), 0))
1456 == FUNCTION_DECL))
1458 tree function = TREE_OPERAND (TREE_OPERAND (format_tree, 0), 0);
1460 /* See if this is a call to a known internationalization function
1461 that modifies the format arg. */
1462 international_format_info *info;
1464 for (info = international_format_list; info; info = info->next)
1465 if (info->assembler_name
1466 ? (info->assembler_name == DECL_ASSEMBLER_NAME (function))
1467 : (info->name == DECL_NAME (function)))
1469 tree inner_args;
1470 int i;
1472 for (inner_args = TREE_OPERAND (format_tree, 1), i = 1;
1473 inner_args != 0;
1474 inner_args = TREE_CHAIN (inner_args), i++)
1475 if (i == info->format_num)
1477 format_tree = TREE_VALUE (inner_args);
1479 while (TREE_CODE (format_tree) == NOP_EXPR)
1480 format_tree = TREE_OPERAND (format_tree, 0);
1485 if (integer_zerop (format_tree))
1487 warning ("null format string");
1488 return;
1490 if (TREE_CODE (format_tree) != ADDR_EXPR)
1492 /* The user may get multiple warnings if the supplied argument
1493 isn't even a string pointer. */
1494 warning ("format not a string literal, argument types not checked");
1495 return;
1497 format_tree = TREE_OPERAND (format_tree, 0);
1498 if (TREE_CODE (format_tree) != STRING_CST)
1500 /* The user may get multiple warnings if the supplied argument
1501 isn't even a string pointer. */
1502 warning ("format not a string literal, argument types not checked");
1503 return;
1505 format_chars = TREE_STRING_POINTER (format_tree);
1506 format_length = TREE_STRING_LENGTH (format_tree);
1507 if (format_length <= 1)
1508 warning ("zero-length format string");
1509 if (format_chars[--format_length] != 0)
1511 warning ("unterminated format string");
1512 return;
1514 /* Skip to first argument to check. */
1515 while (arg_num + 1 < info->first_arg_num)
1517 if (params == 0)
1518 return;
1519 params = TREE_CHAIN (params);
1520 ++arg_num;
1523 first_fillin_param = params;
1524 while (1)
1526 int aflag;
1527 if (*format_chars == 0)
1529 if (format_chars - TREE_STRING_POINTER (format_tree) != format_length)
1530 warning ("embedded `\\0' in format");
1531 if (info->first_arg_num != 0 && params != 0 && ! has_operand_number)
1532 warning ("too many arguments for format");
1533 return;
1535 if (*format_chars++ != '%')
1536 continue;
1537 if (*format_chars == 0)
1539 warning ("spurious trailing `%%' in format");
1540 continue;
1542 if (*format_chars == '%')
1544 ++format_chars;
1545 continue;
1547 flag_chars[0] = 0;
1548 suppressed = wide = precise = FALSE;
1549 if (info->format_type == scanf_format_type)
1551 suppressed = *format_chars == '*';
1552 if (suppressed)
1553 ++format_chars;
1554 while (ISDIGIT (*format_chars))
1555 ++format_chars;
1557 else if (info->format_type == strftime_format_type)
1559 while (*format_chars != 0 && index ("_-0^#", *format_chars) != 0)
1561 if (pedantic)
1562 warning ("ANSI C does not support the strftime `%c' flag",
1563 *format_chars);
1564 if (index (flag_chars, *format_chars) != 0)
1566 warning ("repeated `%c' flag in format",
1567 *format_chars);
1568 ++format_chars;
1570 else
1572 i = strlen (flag_chars);
1573 flag_chars[i++] = *format_chars++;
1574 flag_chars[i] = 0;
1577 while (ISDIGIT ((unsigned char) *format_chars))
1579 wide = TRUE;
1580 ++format_chars;
1582 if (wide && pedantic)
1583 warning ("ANSI C does not support strftime format width");
1584 if (*format_chars == 'E' || *format_chars == 'O')
1586 i = strlen (flag_chars);
1587 flag_chars[i++] = *format_chars++;
1588 flag_chars[i] = 0;
1589 if (*format_chars == 'E' || *format_chars == 'O')
1591 warning ("multiple E/O modifiers in format");
1592 while (*format_chars == 'E' || *format_chars == 'O')
1593 ++format_chars;
1597 else if (info->format_type == printf_format_type)
1599 /* See if we have a number followed by a dollar sign. If we do,
1600 it is an operand number, so set PARAMS to that operand. */
1601 if (*format_chars >= '0' && *format_chars <= '9')
1603 const char *p = format_chars;
1605 while (*p >= '0' && *p++ <= '9')
1608 if (*p == '$')
1610 int opnum = atoi (format_chars);
1612 params = first_fillin_param;
1613 format_chars = p + 1;
1614 has_operand_number = 1;
1616 for (i = 1; i < opnum && params != 0; i++)
1617 params = TREE_CHAIN (params);
1619 if (opnum == 0 || params == 0)
1621 warning ("operand number out of range in format");
1622 return;
1627 while (*format_chars != 0 && index (" +#0-", *format_chars) != 0)
1629 if (index (flag_chars, *format_chars) != 0)
1630 warning ("repeated `%c' flag in format", *format_chars++);
1631 else
1633 i = strlen (flag_chars);
1634 flag_chars[i++] = *format_chars++;
1635 flag_chars[i] = 0;
1638 /* "If the space and + flags both appear,
1639 the space flag will be ignored." */
1640 if (index (flag_chars, ' ') != 0
1641 && index (flag_chars, '+') != 0)
1642 warning ("use of both ` ' and `+' flags in format");
1643 /* "If the 0 and - flags both appear,
1644 the 0 flag will be ignored." */
1645 if (index (flag_chars, '0') != 0
1646 && index (flag_chars, '-') != 0)
1647 warning ("use of both `0' and `-' flags in format");
1648 if (*format_chars == '*')
1650 wide = TRUE;
1651 /* "...a field width...may be indicated by an asterisk.
1652 In this case, an int argument supplies the field width..." */
1653 ++format_chars;
1654 if (params == 0)
1656 tfaff ();
1657 return;
1659 if (info->first_arg_num != 0)
1661 cur_param = TREE_VALUE (params);
1662 params = TREE_CHAIN (params);
1663 ++arg_num;
1664 /* size_t is generally not valid here.
1665 It will work on most machines, because size_t and int
1666 have the same mode. But might as well warn anyway,
1667 since it will fail on other machines. */
1668 if ((TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
1669 != integer_type_node)
1671 (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
1672 != unsigned_type_node))
1673 warning ("field width is not type int (arg %d)", arg_num);
1676 else
1678 while (ISDIGIT (*format_chars))
1680 wide = TRUE;
1681 ++format_chars;
1684 if (*format_chars == '.')
1686 precise = TRUE;
1687 ++format_chars;
1688 if (*format_chars != '*' && !ISDIGIT (*format_chars))
1689 warning ("`.' not followed by `*' or digit in format");
1690 /* "...a...precision...may be indicated by an asterisk.
1691 In this case, an int argument supplies the...precision." */
1692 if (*format_chars == '*')
1694 if (info->first_arg_num != 0)
1696 ++format_chars;
1697 if (params == 0)
1699 tfaff ();
1700 return;
1702 cur_param = TREE_VALUE (params);
1703 params = TREE_CHAIN (params);
1704 ++arg_num;
1705 if (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
1706 != integer_type_node)
1707 warning ("field width is not type int (arg %d)",
1708 arg_num);
1711 else
1713 while (ISDIGIT (*format_chars))
1714 ++format_chars;
1719 aflag = 0;
1721 if (info->format_type != strftime_format_type)
1723 if (*format_chars == 'h' || *format_chars == 'l')
1724 length_char = *format_chars++;
1725 else if (*format_chars == 'q' || *format_chars == 'L')
1727 length_char = *format_chars++;
1728 if (pedantic)
1729 warning ("ANSI C does not support the `%c' length modifier",
1730 length_char);
1732 else if (*format_chars == 'Z')
1734 length_char = *format_chars++;
1735 if (pedantic)
1736 warning ("ANSI C does not support the `Z' length modifier");
1738 else
1739 length_char = 0;
1740 if (length_char == 'l' && *format_chars == 'l')
1742 length_char = 'q', format_chars++;
1743 /* FIXME: Is allowed in ISO C 9x. */
1744 if (pedantic)
1745 warning ("ANSI C does not support the `ll' length modifier");
1747 else if (length_char == 'h' && *format_chars == 'h')
1749 length_char = 'H', format_chars++;
1750 /* FIXME: Is allowed in ISO C 9x. */
1751 if (pedantic)
1752 warning ("ANSI C does not support the `hh' length modifier");
1754 if (*format_chars == 'a' && info->format_type == scanf_format_type)
1756 if (format_chars[1] == 's' || format_chars[1] == 'S'
1757 || format_chars[1] == '[')
1759 /* `a' is used as a flag. */
1760 aflag = 1;
1761 format_chars++;
1764 if (suppressed && length_char != 0)
1765 warning ("use of `*' and `%c' together in format", length_char);
1767 format_char = *format_chars;
1768 if (format_char == 0
1769 || (info->format_type != strftime_format_type && format_char == '%'))
1771 warning ("conversion lacks type at end of format");
1772 continue;
1774 /* The m, C, and S formats are GNU extensions. */
1775 if (pedantic && info->format_type != strftime_format_type
1776 && (format_char == 'm' || format_char == 'C' || format_char == 'S'))
1777 warning ("ANSI C does not support the `%c' format", format_char);
1778 /* ??? The a and A formats are C9X extensions, and should be allowed
1779 when a C9X option is added. */
1780 if (pedantic && info->format_type != strftime_format_type
1781 && (format_char == 'a' || format_char == 'A'))
1782 warning ("ANSI C does not support the `%c' format", format_char);
1783 format_chars++;
1784 switch (info->format_type)
1786 case printf_format_type:
1787 fci = print_char_table;
1788 break;
1789 case scanf_format_type:
1790 fci = scan_char_table;
1791 break;
1792 case strftime_format_type:
1793 fci = time_char_table;
1794 break;
1795 default:
1796 abort ();
1798 while (fci->format_chars != 0
1799 && index (fci->format_chars, format_char) == 0)
1800 ++fci;
1801 if (fci->format_chars == 0)
1803 if (ISGRAPH(format_char))
1804 warning ("unknown conversion type character `%c' in format",
1805 format_char);
1806 else
1807 warning ("unknown conversion type character 0x%x in format",
1808 format_char);
1809 continue;
1811 if (pedantic)
1813 if (index (fci->flag_chars, 'G') != 0)
1814 warning ("ANSI C does not support `%%%c'", format_char);
1815 if (index (fci->flag_chars, 'o') != 0
1816 && index (flag_chars, 'O') != 0)
1817 warning ("ANSI C does not support `%%O%c'", format_char);
1819 if (wide && index (fci->flag_chars, 'w') == 0)
1820 warning ("width used with `%c' format", format_char);
1821 if (index (fci->flag_chars, '2') != 0)
1822 warning ("`%%%c' yields only last 2 digits of year", format_char);
1823 else if (index (fci->flag_chars, '3') != 0)
1824 warning ("`%%%c' yields only last 2 digits of year in some locales",
1825 format_char);
1826 if (precise && index (fci->flag_chars, 'p') == 0)
1827 warning ("precision used with `%c' format", format_char);
1828 if (aflag && index (fci->flag_chars, 'a') == 0)
1830 warning ("`a' flag used with `%c' format", format_char);
1831 /* To simplify the following code. */
1832 aflag = 0;
1834 /* The a flag is a GNU extension. */
1835 else if (pedantic && aflag)
1836 warning ("ANSI C does not support the `a' flag");
1837 if (info->format_type == scanf_format_type && format_char == '[')
1839 /* Skip over scan set, in case it happens to have '%' in it. */
1840 if (*format_chars == '^')
1841 ++format_chars;
1842 /* Find closing bracket; if one is hit immediately, then
1843 it's part of the scan set rather than a terminator. */
1844 if (*format_chars == ']')
1845 ++format_chars;
1846 while (*format_chars && *format_chars != ']')
1847 ++format_chars;
1848 if (*format_chars != ']')
1849 /* The end of the format string was reached. */
1850 warning ("no closing `]' for `%%[' format");
1852 if (suppressed)
1854 if (index (fci->flag_chars, '*') == 0)
1855 warning ("suppression of `%c' conversion in format", format_char);
1856 continue;
1858 for (i = 0; flag_chars[i] != 0; ++i)
1860 if (index (fci->flag_chars, flag_chars[i]) == 0)
1861 warning ("flag `%c' used with type `%c'",
1862 flag_chars[i], format_char);
1864 if (info->format_type == strftime_format_type)
1865 continue;
1866 if (precise && index (flag_chars, '0') != 0
1867 && (format_char == 'd' || format_char == 'i'
1868 || format_char == 'o' || format_char == 'u'
1869 || format_char == 'x' || format_char == 'X'))
1870 warning ("`0' flag ignored with precision specifier and `%c' format",
1871 format_char);
1872 switch (length_char)
1874 default: wanted_type = fci->nolen ? *(fci->nolen) : 0; break;
1875 case 'H': wanted_type = fci->hhlen ? *(fci->hhlen) : 0; break;
1876 case 'h': wanted_type = fci->hlen ? *(fci->hlen) : 0; break;
1877 case 'l': wanted_type = fci->llen ? *(fci->llen) : 0; break;
1878 case 'q': wanted_type = fci->qlen ? *(fci->qlen) : 0; break;
1879 case 'L': wanted_type = fci->bigllen ? *(fci->bigllen) : 0; break;
1880 case 'Z': wanted_type = fci->zlen ? *fci->zlen : 0; break;
1882 if (wanted_type == 0)
1883 warning ("use of `%c' length character with `%c' type character",
1884 length_char, format_char);
1886 /* Finally. . .check type of argument against desired type! */
1887 if (info->first_arg_num == 0)
1888 continue;
1889 if (fci->pointer_count == 0 && wanted_type == void_type_node)
1890 /* This specifier takes no argument. */
1891 continue;
1892 if (params == 0)
1894 tfaff ();
1895 return;
1897 cur_param = TREE_VALUE (params);
1898 params = TREE_CHAIN (params);
1899 ++arg_num;
1900 cur_type = TREE_TYPE (cur_param);
1902 STRIP_NOPS (cur_param);
1904 /* Check the types of any additional pointer arguments
1905 that precede the "real" argument. */
1906 for (i = 0; i < fci->pointer_count + aflag; ++i)
1908 if (TREE_CODE (cur_type) == POINTER_TYPE)
1910 cur_type = TREE_TYPE (cur_type);
1912 if (cur_param != 0 && TREE_CODE (cur_param) == ADDR_EXPR)
1913 cur_param = TREE_OPERAND (cur_param, 0);
1914 else
1915 cur_param = 0;
1917 continue;
1919 if (TREE_CODE (cur_type) != ERROR_MARK)
1920 warning ((fci->pointer_count + aflag == 1
1921 ? "format argument is not a pointer (arg %d)"
1922 : "format argument is not a pointer to a pointer (arg %d)"),
1923 arg_num);
1924 break;
1927 /* See if this is an attempt to write into a const type with
1928 scanf or with printf "%n". */
1929 if ((info->format_type == scanf_format_type
1930 || (info->format_type == printf_format_type
1931 && format_char == 'n'))
1932 && i == fci->pointer_count + aflag
1933 && wanted_type != 0
1934 && TREE_CODE (cur_type) != ERROR_MARK
1935 && (TYPE_READONLY (cur_type)
1936 || (cur_param != 0
1937 && (TREE_CODE_CLASS (TREE_CODE (cur_param)) == 'c'
1938 || (TREE_CODE_CLASS (TREE_CODE (cur_param)) == 'd'
1939 && TREE_READONLY (cur_param))))))
1940 warning ("writing into constant object (arg %d)", arg_num);
1942 /* Check the type of the "real" argument, if there's a type we want. */
1943 if (i == fci->pointer_count + aflag && wanted_type != 0
1944 && TREE_CODE (cur_type) != ERROR_MARK
1945 && wanted_type != TYPE_MAIN_VARIANT (cur_type)
1946 /* If we want `void *', allow any pointer type.
1947 (Anything else would already have got a warning.) */
1948 && ! (wanted_type == void_type_node
1949 && fci->pointer_count > 0)
1950 /* Don't warn about differences merely in signedness. */
1951 && !(TREE_CODE (wanted_type) == INTEGER_TYPE
1952 && TREE_CODE (TYPE_MAIN_VARIANT (cur_type)) == INTEGER_TYPE
1953 && (TREE_UNSIGNED (wanted_type)
1954 ? wanted_type == (cur_type = unsigned_type (cur_type))
1955 : wanted_type == (cur_type = signed_type (cur_type))))
1956 /* Likewise, "signed char", "unsigned char" and "char" are
1957 equivalent but the above test won't consider them equivalent. */
1958 && ! (wanted_type == char_type_node
1959 && (TYPE_MAIN_VARIANT (cur_type) == signed_char_type_node
1960 || TYPE_MAIN_VARIANT (cur_type) == unsigned_char_type_node)))
1962 register const char *this;
1963 register const char *that;
1965 this = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (wanted_type)));
1966 that = 0;
1967 if (TREE_CODE (cur_type) != ERROR_MARK
1968 && TYPE_NAME (cur_type) != 0
1969 && TREE_CODE (cur_type) != INTEGER_TYPE
1970 && !(TREE_CODE (cur_type) == POINTER_TYPE
1971 && TREE_CODE (TREE_TYPE (cur_type)) == INTEGER_TYPE))
1973 if (TREE_CODE (TYPE_NAME (cur_type)) == TYPE_DECL
1974 && DECL_NAME (TYPE_NAME (cur_type)) != 0)
1975 that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (cur_type)));
1976 else
1977 that = IDENTIFIER_POINTER (TYPE_NAME (cur_type));
1980 /* A nameless type can't possibly match what the format wants.
1981 So there will be a warning for it.
1982 Make up a string to describe vaguely what it is. */
1983 if (that == 0)
1985 if (TREE_CODE (cur_type) == POINTER_TYPE)
1986 that = "pointer";
1987 else
1988 that = "different type";
1991 /* Make the warning better in case of mismatch of int vs long. */
1992 if (TREE_CODE (cur_type) == INTEGER_TYPE
1993 && TREE_CODE (wanted_type) == INTEGER_TYPE
1994 && TYPE_PRECISION (cur_type) == TYPE_PRECISION (wanted_type)
1995 && TYPE_NAME (cur_type) != 0
1996 && TREE_CODE (TYPE_NAME (cur_type)) == TYPE_DECL)
1997 that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (cur_type)));
1999 if (strcmp (this, that) != 0)
2000 warning ("%s format, %s arg (arg %d)", this, that, arg_num);
2005 /* Print a warning if a constant expression had overflow in folding.
2006 Invoke this function on every expression that the language
2007 requires to be a constant expression.
2008 Note the ANSI C standard says it is erroneous for a
2009 constant expression to overflow. */
2011 void
2012 constant_expression_warning (value)
2013 tree value;
2015 if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
2016 || TREE_CODE (value) == COMPLEX_CST)
2017 && TREE_CONSTANT_OVERFLOW (value) && pedantic)
2018 pedwarn ("overflow in constant expression");
2021 /* Print a warning if an expression had overflow in folding.
2022 Invoke this function on every expression that
2023 (1) appears in the source code, and
2024 (2) might be a constant expression that overflowed, and
2025 (3) is not already checked by convert_and_check;
2026 however, do not invoke this function on operands of explicit casts. */
2028 void
2029 overflow_warning (value)
2030 tree value;
2032 if ((TREE_CODE (value) == INTEGER_CST
2033 || (TREE_CODE (value) == COMPLEX_CST
2034 && TREE_CODE (TREE_REALPART (value)) == INTEGER_CST))
2035 && TREE_OVERFLOW (value))
2037 TREE_OVERFLOW (value) = 0;
2038 if (skip_evaluation == 0)
2039 warning ("integer overflow in expression");
2041 else if ((TREE_CODE (value) == REAL_CST
2042 || (TREE_CODE (value) == COMPLEX_CST
2043 && TREE_CODE (TREE_REALPART (value)) == REAL_CST))
2044 && TREE_OVERFLOW (value))
2046 TREE_OVERFLOW (value) = 0;
2047 if (skip_evaluation == 0)
2048 warning ("floating point overflow in expression");
2052 /* Print a warning if a large constant is truncated to unsigned,
2053 or if -Wconversion is used and a constant < 0 is converted to unsigned.
2054 Invoke this function on every expression that might be implicitly
2055 converted to an unsigned type. */
2057 void
2058 unsigned_conversion_warning (result, operand)
2059 tree result, operand;
2061 if (TREE_CODE (operand) == INTEGER_CST
2062 && TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
2063 && TREE_UNSIGNED (TREE_TYPE (result))
2064 && skip_evaluation == 0
2065 && !int_fits_type_p (operand, TREE_TYPE (result)))
2067 if (!int_fits_type_p (operand, signed_type (TREE_TYPE (result))))
2068 /* This detects cases like converting -129 or 256 to unsigned char. */
2069 warning ("large integer implicitly truncated to unsigned type");
2070 else if (warn_conversion)
2071 warning ("negative integer implicitly converted to unsigned type");
2075 /* Convert EXPR to TYPE, warning about conversion problems with constants.
2076 Invoke this function on every expression that is converted implicitly,
2077 i.e. because of language rules and not because of an explicit cast. */
2079 tree
2080 convert_and_check (type, expr)
2081 tree type, expr;
2083 tree t = convert (type, expr);
2084 if (TREE_CODE (t) == INTEGER_CST)
2086 if (TREE_OVERFLOW (t))
2088 TREE_OVERFLOW (t) = 0;
2090 /* Do not diagnose overflow in a constant expression merely
2091 because a conversion overflowed. */
2092 TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (expr);
2094 /* No warning for converting 0x80000000 to int. */
2095 if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr))
2096 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
2097 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
2098 /* If EXPR fits in the unsigned version of TYPE,
2099 don't warn unless pedantic. */
2100 if ((pedantic
2101 || TREE_UNSIGNED (type)
2102 || ! int_fits_type_p (expr, unsigned_type (type)))
2103 && skip_evaluation == 0)
2104 warning ("overflow in implicit constant conversion");
2106 else
2107 unsigned_conversion_warning (t, expr);
2109 return t;
2112 void
2113 c_expand_expr_stmt (expr)
2114 tree expr;
2116 /* Do default conversion if safe and possibly important,
2117 in case within ({...}). */
2118 if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE && lvalue_p (expr))
2119 || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
2120 expr = default_conversion (expr);
2122 if (TREE_TYPE (expr) != error_mark_node
2123 && TYPE_SIZE (TREE_TYPE (expr)) == 0
2124 && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
2125 error ("expression statement has incomplete type");
2127 expand_expr_stmt (expr);
2130 /* Validate the expression after `case' and apply default promotions. */
2132 tree
2133 check_case_value (value)
2134 tree value;
2136 if (value == NULL_TREE)
2137 return value;
2139 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
2140 STRIP_TYPE_NOPS (value);
2142 if (TREE_CODE (value) != INTEGER_CST
2143 && value != error_mark_node)
2145 error ("case label does not reduce to an integer constant");
2146 value = error_mark_node;
2148 else
2149 /* Promote char or short to int. */
2150 value = default_conversion (value);
2152 constant_expression_warning (value);
2154 return value;
2157 /* Return an integer type with BITS bits of precision,
2158 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
2160 tree
2161 type_for_size (bits, unsignedp)
2162 unsigned bits;
2163 int unsignedp;
2165 if (bits == TYPE_PRECISION (integer_type_node))
2166 return unsignedp ? unsigned_type_node : integer_type_node;
2168 if (bits == TYPE_PRECISION (signed_char_type_node))
2169 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2171 if (bits == TYPE_PRECISION (short_integer_type_node))
2172 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2174 if (bits == TYPE_PRECISION (long_integer_type_node))
2175 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2177 if (bits == TYPE_PRECISION (long_long_integer_type_node))
2178 return (unsignedp ? long_long_unsigned_type_node
2179 : long_long_integer_type_node);
2181 if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
2182 return (unsignedp ? widest_unsigned_literal_type_node
2183 : widest_integer_literal_type_node);
2185 if (bits <= TYPE_PRECISION (intQI_type_node))
2186 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2188 if (bits <= TYPE_PRECISION (intHI_type_node))
2189 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2191 if (bits <= TYPE_PRECISION (intSI_type_node))
2192 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2194 if (bits <= TYPE_PRECISION (intDI_type_node))
2195 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2197 return 0;
2200 /* Return a data type that has machine mode MODE.
2201 If the mode is an integer,
2202 then UNSIGNEDP selects between signed and unsigned types. */
2204 tree
2205 type_for_mode (mode, unsignedp)
2206 enum machine_mode mode;
2207 int unsignedp;
2209 if (mode == TYPE_MODE (integer_type_node))
2210 return unsignedp ? unsigned_type_node : integer_type_node;
2212 if (mode == TYPE_MODE (signed_char_type_node))
2213 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2215 if (mode == TYPE_MODE (short_integer_type_node))
2216 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2218 if (mode == TYPE_MODE (long_integer_type_node))
2219 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2221 if (mode == TYPE_MODE (long_long_integer_type_node))
2222 return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
2224 if (mode == TYPE_MODE (widest_integer_literal_type_node))
2225 return unsignedp ? widest_unsigned_literal_type_node
2226 : widest_integer_literal_type_node;
2228 if (mode == TYPE_MODE (intQI_type_node))
2229 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2231 if (mode == TYPE_MODE (intHI_type_node))
2232 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2234 if (mode == TYPE_MODE (intSI_type_node))
2235 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2237 if (mode == TYPE_MODE (intDI_type_node))
2238 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2240 #if HOST_BITS_PER_WIDE_INT >= 64
2241 if (mode == TYPE_MODE (intTI_type_node))
2242 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2243 #endif
2245 if (mode == TYPE_MODE (float_type_node))
2246 return float_type_node;
2248 if (mode == TYPE_MODE (double_type_node))
2249 return double_type_node;
2251 if (mode == TYPE_MODE (long_double_type_node))
2252 return long_double_type_node;
2254 if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
2255 return build_pointer_type (char_type_node);
2257 if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
2258 return build_pointer_type (integer_type_node);
2260 return 0;
2263 /* Return an unsigned type the same as TYPE in other respects. */
2264 tree
2265 unsigned_type (type)
2266 tree type;
2268 tree type1 = TYPE_MAIN_VARIANT (type);
2269 if (type1 == signed_char_type_node || type1 == char_type_node)
2270 return unsigned_char_type_node;
2271 if (type1 == integer_type_node)
2272 return unsigned_type_node;
2273 if (type1 == short_integer_type_node)
2274 return short_unsigned_type_node;
2275 if (type1 == long_integer_type_node)
2276 return long_unsigned_type_node;
2277 if (type1 == long_long_integer_type_node)
2278 return long_long_unsigned_type_node;
2279 if (type1 == widest_integer_literal_type_node)
2280 return widest_unsigned_literal_type_node;
2281 #if HOST_BITS_PER_WIDE_INT >= 64
2282 if (type1 == intTI_type_node)
2283 return unsigned_intTI_type_node;
2284 #endif
2285 if (type1 == intDI_type_node)
2286 return unsigned_intDI_type_node;
2287 if (type1 == intSI_type_node)
2288 return unsigned_intSI_type_node;
2289 if (type1 == intHI_type_node)
2290 return unsigned_intHI_type_node;
2291 if (type1 == intQI_type_node)
2292 return unsigned_intQI_type_node;
2294 return signed_or_unsigned_type (1, type);
2297 /* Return a signed type the same as TYPE in other respects. */
2299 tree
2300 signed_type (type)
2301 tree type;
2303 tree type1 = TYPE_MAIN_VARIANT (type);
2304 if (type1 == unsigned_char_type_node || type1 == char_type_node)
2305 return signed_char_type_node;
2306 if (type1 == unsigned_type_node)
2307 return integer_type_node;
2308 if (type1 == short_unsigned_type_node)
2309 return short_integer_type_node;
2310 if (type1 == long_unsigned_type_node)
2311 return long_integer_type_node;
2312 if (type1 == long_long_unsigned_type_node)
2313 return long_long_integer_type_node;
2314 if (type1 == widest_unsigned_literal_type_node)
2315 return widest_integer_literal_type_node;
2316 #if HOST_BITS_PER_WIDE_INT >= 64
2317 if (type1 == unsigned_intTI_type_node)
2318 return intTI_type_node;
2319 #endif
2320 if (type1 == unsigned_intDI_type_node)
2321 return intDI_type_node;
2322 if (type1 == unsigned_intSI_type_node)
2323 return intSI_type_node;
2324 if (type1 == unsigned_intHI_type_node)
2325 return intHI_type_node;
2326 if (type1 == unsigned_intQI_type_node)
2327 return intQI_type_node;
2329 return signed_or_unsigned_type (0, type);
2332 /* Return a type the same as TYPE except unsigned or
2333 signed according to UNSIGNEDP. */
2335 tree
2336 signed_or_unsigned_type (unsignedp, type)
2337 int unsignedp;
2338 tree type;
2340 if (! INTEGRAL_TYPE_P (type)
2341 || TREE_UNSIGNED (type) == unsignedp)
2342 return type;
2344 if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
2345 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2346 if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
2347 return unsignedp ? unsigned_type_node : integer_type_node;
2348 if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node))
2349 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2350 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node))
2351 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2352 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node))
2353 return (unsignedp ? long_long_unsigned_type_node
2354 : long_long_integer_type_node);
2355 if (TYPE_PRECISION (type) == TYPE_PRECISION (widest_integer_literal_type_node))
2356 return (unsignedp ? widest_unsigned_literal_type_node
2357 : widest_integer_literal_type_node);
2358 return type;
2361 /* Return the minimum number of bits needed to represent VALUE in a
2362 signed or unsigned type, UNSIGNEDP says which. */
2365 min_precision (value, unsignedp)
2366 tree value;
2367 int unsignedp;
2369 int log;
2371 /* If the value is negative, compute its negative minus 1. The latter
2372 adjustment is because the absolute value of the largest negative value
2373 is one larger than the largest positive value. This is equivalent to
2374 a bit-wise negation, so use that operation instead. */
2376 if (tree_int_cst_sgn (value) < 0)
2377 value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value));
2379 /* Return the number of bits needed, taking into account the fact
2380 that we need one more bit for a signed than unsigned type. */
2382 if (integer_zerop (value))
2383 log = 0;
2384 else if (TREE_INT_CST_HIGH (value) != 0)
2385 log = HOST_BITS_PER_WIDE_INT + floor_log2 (TREE_INT_CST_HIGH (value));
2386 else
2387 log = floor_log2 (TREE_INT_CST_LOW (value));
2389 return log + 1 + ! unsignedp;
2392 /* Print an error message for invalid operands to arith operation CODE.
2393 NOP_EXPR is used as a special case (see truthvalue_conversion). */
2395 void
2396 binary_op_error (code)
2397 enum tree_code code;
2399 register const char *opname;
2401 switch (code)
2403 case NOP_EXPR:
2404 error ("invalid truth-value expression");
2405 return;
2407 case PLUS_EXPR:
2408 opname = "+"; break;
2409 case MINUS_EXPR:
2410 opname = "-"; break;
2411 case MULT_EXPR:
2412 opname = "*"; break;
2413 case MAX_EXPR:
2414 opname = "max"; break;
2415 case MIN_EXPR:
2416 opname = "min"; break;
2417 case EQ_EXPR:
2418 opname = "=="; break;
2419 case NE_EXPR:
2420 opname = "!="; break;
2421 case LE_EXPR:
2422 opname = "<="; break;
2423 case GE_EXPR:
2424 opname = ">="; break;
2425 case LT_EXPR:
2426 opname = "<"; break;
2427 case GT_EXPR:
2428 opname = ">"; break;
2429 case LSHIFT_EXPR:
2430 opname = "<<"; break;
2431 case RSHIFT_EXPR:
2432 opname = ">>"; break;
2433 case TRUNC_MOD_EXPR:
2434 case FLOOR_MOD_EXPR:
2435 opname = "%"; break;
2436 case TRUNC_DIV_EXPR:
2437 case FLOOR_DIV_EXPR:
2438 opname = "/"; break;
2439 case BIT_AND_EXPR:
2440 opname = "&"; break;
2441 case BIT_IOR_EXPR:
2442 opname = "|"; break;
2443 case TRUTH_ANDIF_EXPR:
2444 opname = "&&"; break;
2445 case TRUTH_ORIF_EXPR:
2446 opname = "||"; break;
2447 case BIT_XOR_EXPR:
2448 opname = "^"; break;
2449 case LROTATE_EXPR:
2450 case RROTATE_EXPR:
2451 opname = "rotate"; break;
2452 default:
2453 opname = "unknown"; break;
2455 error ("invalid operands to binary %s", opname);
2458 /* Subroutine of build_binary_op, used for comparison operations.
2459 See if the operands have both been converted from subword integer types
2460 and, if so, perhaps change them both back to their original type.
2461 This function is also responsible for converting the two operands
2462 to the proper common type for comparison.
2464 The arguments of this function are all pointers to local variables
2465 of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
2466 RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
2468 If this function returns nonzero, it means that the comparison has
2469 a constant value. What this function returns is an expression for
2470 that value. */
2472 tree
2473 shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
2474 tree *op0_ptr, *op1_ptr;
2475 tree *restype_ptr;
2476 enum tree_code *rescode_ptr;
2478 register tree type;
2479 tree op0 = *op0_ptr;
2480 tree op1 = *op1_ptr;
2481 int unsignedp0, unsignedp1;
2482 int real1, real2;
2483 tree primop0, primop1;
2484 enum tree_code code = *rescode_ptr;
2486 /* Throw away any conversions to wider types
2487 already present in the operands. */
2489 primop0 = get_narrower (op0, &unsignedp0);
2490 primop1 = get_narrower (op1, &unsignedp1);
2492 /* Handle the case that OP0 does not *contain* a conversion
2493 but it *requires* conversion to FINAL_TYPE. */
2495 if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
2496 unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
2497 if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
2498 unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
2500 /* If one of the operands must be floated, we cannot optimize. */
2501 real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
2502 real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
2504 /* If first arg is constant, swap the args (changing operation
2505 so value is preserved), for canonicalization. Don't do this if
2506 the second arg is 0. */
2508 if (TREE_CONSTANT (primop0)
2509 && ! integer_zerop (primop1) && ! real_zerop (primop1))
2511 register tree tem = primop0;
2512 register int temi = unsignedp0;
2513 primop0 = primop1;
2514 primop1 = tem;
2515 tem = op0;
2516 op0 = op1;
2517 op1 = tem;
2518 *op0_ptr = op0;
2519 *op1_ptr = op1;
2520 unsignedp0 = unsignedp1;
2521 unsignedp1 = temi;
2522 temi = real1;
2523 real1 = real2;
2524 real2 = temi;
2526 switch (code)
2528 case LT_EXPR:
2529 code = GT_EXPR;
2530 break;
2531 case GT_EXPR:
2532 code = LT_EXPR;
2533 break;
2534 case LE_EXPR:
2535 code = GE_EXPR;
2536 break;
2537 case GE_EXPR:
2538 code = LE_EXPR;
2539 break;
2540 default:
2541 break;
2543 *rescode_ptr = code;
2546 /* If comparing an integer against a constant more bits wide,
2547 maybe we can deduce a value of 1 or 0 independent of the data.
2548 Or else truncate the constant now
2549 rather than extend the variable at run time.
2551 This is only interesting if the constant is the wider arg.
2552 Also, it is not safe if the constant is unsigned and the
2553 variable arg is signed, since in this case the variable
2554 would be sign-extended and then regarded as unsigned.
2555 Our technique fails in this case because the lowest/highest
2556 possible unsigned results don't follow naturally from the
2557 lowest/highest possible values of the variable operand.
2558 For just EQ_EXPR and NE_EXPR there is another technique that
2559 could be used: see if the constant can be faithfully represented
2560 in the other operand's type, by truncating it and reextending it
2561 and see if that preserves the constant's value. */
2563 if (!real1 && !real2
2564 && TREE_CODE (primop1) == INTEGER_CST
2565 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
2567 int min_gt, max_gt, min_lt, max_lt;
2568 tree maxval, minval;
2569 /* 1 if comparison is nominally unsigned. */
2570 int unsignedp = TREE_UNSIGNED (*restype_ptr);
2571 tree val;
2573 type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0));
2575 /* If TYPE is an enumeration, then we need to get its min/max
2576 values from it's underlying integral type, not the enumerated
2577 type itself. */
2578 if (TREE_CODE (type) == ENUMERAL_TYPE)
2579 type = type_for_size (TYPE_PRECISION (type), unsignedp0);
2581 maxval = TYPE_MAX_VALUE (type);
2582 minval = TYPE_MIN_VALUE (type);
2584 if (unsignedp && !unsignedp0)
2585 *restype_ptr = signed_type (*restype_ptr);
2587 if (TREE_TYPE (primop1) != *restype_ptr)
2588 primop1 = convert (*restype_ptr, primop1);
2589 if (type != *restype_ptr)
2591 minval = convert (*restype_ptr, minval);
2592 maxval = convert (*restype_ptr, maxval);
2595 if (unsignedp && unsignedp0)
2597 min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
2598 max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
2599 min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
2600 max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
2602 else
2604 min_gt = INT_CST_LT (primop1, minval);
2605 max_gt = INT_CST_LT (primop1, maxval);
2606 min_lt = INT_CST_LT (minval, primop1);
2607 max_lt = INT_CST_LT (maxval, primop1);
2610 val = 0;
2611 /* This used to be a switch, but Genix compiler can't handle that. */
2612 if (code == NE_EXPR)
2614 if (max_lt || min_gt)
2615 val = boolean_true_node;
2617 else if (code == EQ_EXPR)
2619 if (max_lt || min_gt)
2620 val = boolean_false_node;
2622 else if (code == LT_EXPR)
2624 if (max_lt)
2625 val = boolean_true_node;
2626 if (!min_lt)
2627 val = boolean_false_node;
2629 else if (code == GT_EXPR)
2631 if (min_gt)
2632 val = boolean_true_node;
2633 if (!max_gt)
2634 val = boolean_false_node;
2636 else if (code == LE_EXPR)
2638 if (!max_gt)
2639 val = boolean_true_node;
2640 if (min_gt)
2641 val = boolean_false_node;
2643 else if (code == GE_EXPR)
2645 if (!min_lt)
2646 val = boolean_true_node;
2647 if (max_lt)
2648 val = boolean_false_node;
2651 /* If primop0 was sign-extended and unsigned comparison specd,
2652 we did a signed comparison above using the signed type bounds.
2653 But the comparison we output must be unsigned.
2655 Also, for inequalities, VAL is no good; but if the signed
2656 comparison had *any* fixed result, it follows that the
2657 unsigned comparison just tests the sign in reverse
2658 (positive values are LE, negative ones GE).
2659 So we can generate an unsigned comparison
2660 against an extreme value of the signed type. */
2662 if (unsignedp && !unsignedp0)
2664 if (val != 0)
2665 switch (code)
2667 case LT_EXPR:
2668 case GE_EXPR:
2669 primop1 = TYPE_MIN_VALUE (type);
2670 val = 0;
2671 break;
2673 case LE_EXPR:
2674 case GT_EXPR:
2675 primop1 = TYPE_MAX_VALUE (type);
2676 val = 0;
2677 break;
2679 default:
2680 break;
2682 type = unsigned_type (type);
2685 if (!max_gt && !unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
2687 /* This is the case of (char)x >?< 0x80, which people used to use
2688 expecting old C compilers to change the 0x80 into -0x80. */
2689 if (val == boolean_false_node)
2690 warning ("comparison is always false due to limited range of data type");
2691 if (val == boolean_true_node)
2692 warning ("comparison is always true due to limited range of data type");
2695 if (!min_lt && unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
2697 /* This is the case of (unsigned char)x >?< -1 or < 0. */
2698 if (val == boolean_false_node)
2699 warning ("comparison is always false due to limited range of data type");
2700 if (val == boolean_true_node)
2701 warning ("comparison is always true due to limited range of data type");
2704 if (val != 0)
2706 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
2707 if (TREE_SIDE_EFFECTS (primop0))
2708 return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
2709 return val;
2712 /* Value is not predetermined, but do the comparison
2713 in the type of the operand that is not constant.
2714 TYPE is already properly set. */
2716 else if (real1 && real2
2717 && (TYPE_PRECISION (TREE_TYPE (primop0))
2718 == TYPE_PRECISION (TREE_TYPE (primop1))))
2719 type = TREE_TYPE (primop0);
2721 /* If args' natural types are both narrower than nominal type
2722 and both extend in the same manner, compare them
2723 in the type of the wider arg.
2724 Otherwise must actually extend both to the nominal
2725 common type lest different ways of extending
2726 alter the result.
2727 (eg, (short)-1 == (unsigned short)-1 should be 0.) */
2729 else if (unsignedp0 == unsignedp1 && real1 == real2
2730 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
2731 && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
2733 type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
2734 type = signed_or_unsigned_type (unsignedp0
2735 || TREE_UNSIGNED (*restype_ptr),
2736 type);
2737 /* Make sure shorter operand is extended the right way
2738 to match the longer operand. */
2739 primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)),
2740 primop0);
2741 primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
2742 primop1);
2744 else
2746 /* Here we must do the comparison on the nominal type
2747 using the args exactly as we received them. */
2748 type = *restype_ptr;
2749 primop0 = op0;
2750 primop1 = op1;
2752 if (!real1 && !real2 && integer_zerop (primop1)
2753 && TREE_UNSIGNED (*restype_ptr))
2755 tree value = 0;
2756 switch (code)
2758 case GE_EXPR:
2759 /* All unsigned values are >= 0, so we warn if extra warnings
2760 are requested. However, if OP0 is a constant that is
2761 >= 0, the signedness of the comparison isn't an issue,
2762 so suppress the warning. */
2763 if (extra_warnings
2764 && ! (TREE_CODE (primop0) == INTEGER_CST
2765 && ! TREE_OVERFLOW (convert (signed_type (type),
2766 primop0))))
2767 warning ("comparison of unsigned expression >= 0 is always true");
2768 value = boolean_true_node;
2769 break;
2771 case LT_EXPR:
2772 if (extra_warnings
2773 && ! (TREE_CODE (primop0) == INTEGER_CST
2774 && ! TREE_OVERFLOW (convert (signed_type (type),
2775 primop0))))
2776 warning ("comparison of unsigned expression < 0 is always false");
2777 value = boolean_false_node;
2778 break;
2780 default:
2781 break;
2784 if (value != 0)
2786 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
2787 if (TREE_SIDE_EFFECTS (primop0))
2788 return build (COMPOUND_EXPR, TREE_TYPE (value),
2789 primop0, value);
2790 return value;
2795 *op0_ptr = convert (type, primop0);
2796 *op1_ptr = convert (type, primop1);
2798 *restype_ptr = boolean_type_node;
2800 return 0;
2803 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
2804 or validate its data type for an `if' or `while' statement or ?..: exp.
2806 This preparation consists of taking the ordinary
2807 representation of an expression expr and producing a valid tree
2808 boolean expression describing whether expr is nonzero. We could
2809 simply always do build_binary_op (NE_EXPR, expr, boolean_false_node, 1),
2810 but we optimize comparisons, &&, ||, and !.
2812 The resulting type should always be `boolean_type_node'. */
2814 tree
2815 truthvalue_conversion (expr)
2816 tree expr;
2818 if (TREE_CODE (expr) == ERROR_MARK)
2819 return expr;
2821 #if 0 /* This appears to be wrong for C++. */
2822 /* These really should return error_mark_node after 2.4 is stable.
2823 But not all callers handle ERROR_MARK properly. */
2824 switch (TREE_CODE (TREE_TYPE (expr)))
2826 case RECORD_TYPE:
2827 error ("struct type value used where scalar is required");
2828 return boolean_false_node;
2830 case UNION_TYPE:
2831 error ("union type value used where scalar is required");
2832 return boolean_false_node;
2834 case ARRAY_TYPE:
2835 error ("array type value used where scalar is required");
2836 return boolean_false_node;
2838 default:
2839 break;
2841 #endif /* 0 */
2843 switch (TREE_CODE (expr))
2845 /* It is simpler and generates better code to have only TRUTH_*_EXPR
2846 or comparison expressions as truth values at this level. */
2847 #if 0
2848 case COMPONENT_REF:
2849 /* A one-bit unsigned bit-field is already acceptable. */
2850 if (1 == TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (expr, 1)))
2851 && TREE_UNSIGNED (TREE_OPERAND (expr, 1)))
2852 return expr;
2853 break;
2854 #endif
2856 case EQ_EXPR:
2857 /* It is simpler and generates better code to have only TRUTH_*_EXPR
2858 or comparison expressions as truth values at this level. */
2859 #if 0
2860 if (integer_zerop (TREE_OPERAND (expr, 1)))
2861 return build_unary_op (TRUTH_NOT_EXPR, TREE_OPERAND (expr, 0), 0);
2862 #endif
2863 case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2864 case TRUTH_ANDIF_EXPR:
2865 case TRUTH_ORIF_EXPR:
2866 case TRUTH_AND_EXPR:
2867 case TRUTH_OR_EXPR:
2868 case TRUTH_XOR_EXPR:
2869 case TRUTH_NOT_EXPR:
2870 TREE_TYPE (expr) = boolean_type_node;
2871 return expr;
2873 case ERROR_MARK:
2874 return expr;
2876 case INTEGER_CST:
2877 return integer_zerop (expr) ? boolean_false_node : boolean_true_node;
2879 case REAL_CST:
2880 return real_zerop (expr) ? boolean_false_node : boolean_true_node;
2882 case ADDR_EXPR:
2883 /* If we are taking the address of a external decl, it might be zero
2884 if it is weak, so we cannot optimize. */
2885 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (expr, 0))) == 'd'
2886 && DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
2887 break;
2889 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
2890 return build (COMPOUND_EXPR, boolean_type_node,
2891 TREE_OPERAND (expr, 0), boolean_true_node);
2892 else
2893 return boolean_true_node;
2895 case COMPLEX_EXPR:
2896 return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
2897 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2898 truthvalue_conversion (TREE_OPERAND (expr, 0)),
2899 truthvalue_conversion (TREE_OPERAND (expr, 1)),
2902 case NEGATE_EXPR:
2903 case ABS_EXPR:
2904 case FLOAT_EXPR:
2905 case FFS_EXPR:
2906 /* These don't change whether an object is non-zero or zero. */
2907 return truthvalue_conversion (TREE_OPERAND (expr, 0));
2909 case LROTATE_EXPR:
2910 case RROTATE_EXPR:
2911 /* These don't change whether an object is zero or non-zero, but
2912 we can't ignore them if their second arg has side-effects. */
2913 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2914 return build (COMPOUND_EXPR, boolean_type_node, TREE_OPERAND (expr, 1),
2915 truthvalue_conversion (TREE_OPERAND (expr, 0)));
2916 else
2917 return truthvalue_conversion (TREE_OPERAND (expr, 0));
2919 case COND_EXPR:
2920 /* Distribute the conversion into the arms of a COND_EXPR. */
2921 return fold (build (COND_EXPR, boolean_type_node, TREE_OPERAND (expr, 0),
2922 truthvalue_conversion (TREE_OPERAND (expr, 1)),
2923 truthvalue_conversion (TREE_OPERAND (expr, 2))));
2925 case CONVERT_EXPR:
2926 /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
2927 since that affects how `default_conversion' will behave. */
2928 if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
2929 || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
2930 break;
2931 /* fall through... */
2932 case NOP_EXPR:
2933 /* If this is widening the argument, we can ignore it. */
2934 if (TYPE_PRECISION (TREE_TYPE (expr))
2935 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
2936 return truthvalue_conversion (TREE_OPERAND (expr, 0));
2937 break;
2939 case MINUS_EXPR:
2940 /* With IEEE arithmetic, x - x may not equal 0, so we can't optimize
2941 this case. */
2942 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
2943 && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE)
2944 break;
2945 /* fall through... */
2946 case BIT_XOR_EXPR:
2947 /* This and MINUS_EXPR can be changed into a comparison of the
2948 two objects. */
2949 if (TREE_TYPE (TREE_OPERAND (expr, 0))
2950 == TREE_TYPE (TREE_OPERAND (expr, 1)))
2951 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
2952 TREE_OPERAND (expr, 1), 1);
2953 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
2954 fold (build1 (NOP_EXPR,
2955 TREE_TYPE (TREE_OPERAND (expr, 0)),
2956 TREE_OPERAND (expr, 1))), 1);
2958 case BIT_AND_EXPR:
2959 if (integer_onep (TREE_OPERAND (expr, 1))
2960 && TREE_TYPE (expr) != boolean_type_node)
2961 /* Using convert here would cause infinite recursion. */
2962 return build1 (NOP_EXPR, boolean_type_node, expr);
2963 break;
2965 case MODIFY_EXPR:
2966 if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
2967 warning ("suggest parentheses around assignment used as truth value");
2968 break;
2970 default:
2971 break;
2974 if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
2976 tree tem = save_expr (expr);
2977 return (build_binary_op
2978 ((TREE_SIDE_EFFECTS (expr)
2979 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2980 truthvalue_conversion (build_unary_op (REALPART_EXPR, tem, 0)),
2981 truthvalue_conversion (build_unary_op (IMAGPART_EXPR, tem, 0)),
2982 0));
2985 return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
2988 #if USE_CPPLIB
2989 /* Read the rest of a #-directive from input stream FINPUT.
2990 In normal use, the directive name and the white space after it
2991 have already been read, so they won't be included in the result.
2992 We allow for the fact that the directive line may contain
2993 a newline embedded within a character or string literal which forms
2994 a part of the directive.
2996 The value is a string in a reusable buffer. It remains valid
2997 only until the next time this function is called. */
2998 unsigned char *yy_cur, *yy_lim;
3000 #define GETC() (yy_cur < yy_lim ? *yy_cur++ : yy_get_token ())
3001 #define UNGETC(c) ((c) == EOF ? 0 : yy_cur--)
3004 yy_get_token ()
3006 for (;;)
3008 parse_in.limit = parse_in.token_buffer;
3009 cpp_token = cpp_get_token (&parse_in);
3010 if (cpp_token == CPP_EOF)
3011 return -1;
3012 yy_lim = CPP_PWRITTEN (&parse_in);
3013 yy_cur = parse_in.token_buffer;
3014 if (yy_cur < yy_lim)
3015 return *yy_cur++;
3019 char *
3020 get_directive_line ()
3022 static char *directive_buffer = NULL;
3023 static unsigned buffer_length = 0;
3024 register char *p;
3025 register char *buffer_limit;
3026 register int looking_for = 0;
3027 register int char_escaped = 0;
3029 if (buffer_length == 0)
3031 directive_buffer = (char *)xmalloc (128);
3032 buffer_length = 128;
3035 buffer_limit = &directive_buffer[buffer_length];
3037 for (p = directive_buffer; ; )
3039 int c;
3041 /* Make buffer bigger if it is full. */
3042 if (p >= buffer_limit)
3044 register unsigned bytes_used = (p - directive_buffer);
3046 buffer_length *= 2;
3047 directive_buffer
3048 = (char *)xrealloc (directive_buffer, buffer_length);
3049 p = &directive_buffer[bytes_used];
3050 buffer_limit = &directive_buffer[buffer_length];
3053 c = GETC ();
3055 /* Discard initial whitespace. */
3056 if ((c == ' ' || c == '\t') && p == directive_buffer)
3057 continue;
3059 /* Detect the end of the directive. */
3060 if (c == '\n' && looking_for == 0)
3062 UNGETC (c);
3063 c = '\0';
3066 *p++ = c;
3068 if (c == 0)
3069 return directive_buffer;
3071 /* Handle string and character constant syntax. */
3072 if (looking_for)
3074 if (looking_for == c && !char_escaped)
3075 looking_for = 0; /* Found terminator... stop looking. */
3077 else
3078 if (c == '\'' || c == '"')
3079 looking_for = c; /* Don't stop buffering until we see another
3080 another one of these (or an EOF). */
3082 /* Handle backslash. */
3083 char_escaped = (c == '\\' && ! char_escaped);
3086 #else
3087 /* Read the rest of a #-directive from input stream FINPUT.
3088 In normal use, the directive name and the white space after it
3089 have already been read, so they won't be included in the result.
3090 We allow for the fact that the directive line may contain
3091 a newline embedded within a character or string literal which forms
3092 a part of the directive.
3094 The value is a string in a reusable buffer. It remains valid
3095 only until the next time this function is called.
3097 The terminating character ('\n' or EOF) is left in FINPUT for the
3098 caller to re-read. */
3100 char *
3101 get_directive_line (finput)
3102 register FILE *finput;
3104 static char *directive_buffer = NULL;
3105 static unsigned buffer_length = 0;
3106 register char *p;
3107 register char *buffer_limit;
3108 register int looking_for = 0;
3109 register int char_escaped = 0;
3111 if (buffer_length == 0)
3113 directive_buffer = (char *)xmalloc (128);
3114 buffer_length = 128;
3117 buffer_limit = &directive_buffer[buffer_length];
3119 for (p = directive_buffer; ; )
3121 int c;
3123 /* Make buffer bigger if it is full. */
3124 if (p >= buffer_limit)
3126 register unsigned bytes_used = (p - directive_buffer);
3128 buffer_length *= 2;
3129 directive_buffer
3130 = (char *)xrealloc (directive_buffer, buffer_length);
3131 p = &directive_buffer[bytes_used];
3132 buffer_limit = &directive_buffer[buffer_length];
3135 c = getc (finput);
3137 /* Discard initial whitespace. */
3138 if ((c == ' ' || c == '\t') && p == directive_buffer)
3139 continue;
3141 /* Detect the end of the directive. */
3142 if (looking_for == 0
3143 && (c == '\n' || c == EOF))
3145 ungetc (c, finput);
3146 c = '\0';
3149 *p++ = c;
3151 if (c == 0)
3152 return directive_buffer;
3154 /* Handle string and character constant syntax. */
3155 if (looking_for)
3157 if (looking_for == c && !char_escaped)
3158 looking_for = 0; /* Found terminator... stop looking. */
3160 else
3161 if (c == '\'' || c == '"')
3162 looking_for = c; /* Don't stop buffering until we see another
3163 one of these (or an EOF). */
3165 /* Handle backslash. */
3166 char_escaped = (c == '\\' && ! char_escaped);
3169 #endif /* !USE_CPPLIB */
3171 /* Make a variant type in the proper way for C/C++, propagating qualifiers
3172 down to the element type of an array. */
3174 tree
3175 c_build_qualified_type (type, type_quals)
3176 tree type;
3177 int type_quals;
3179 /* A restrict-qualified pointer type must be a pointer to object or
3180 incomplete type. Note that the use of POINTER_TYPE_P also allows
3181 REFERENCE_TYPEs, which is appropriate for C++. Unfortunately,
3182 the C++ front-end also use POINTER_TYPE for pointer-to-member
3183 values, so even though it should be illegal to use `restrict'
3184 with such an entity we don't flag that here. Thus, special case
3185 code for that case is required in the C++ front-end. */
3186 if ((type_quals & TYPE_QUAL_RESTRICT)
3187 && (!POINTER_TYPE_P (type)
3188 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type))))
3190 error ("invalid use of `restrict'");
3191 type_quals &= ~TYPE_QUAL_RESTRICT;
3194 if (TREE_CODE (type) == ARRAY_TYPE)
3195 return build_array_type (c_build_qualified_type (TREE_TYPE (type),
3196 type_quals),
3197 TYPE_DOMAIN (type));
3198 return build_qualified_type (type, type_quals);
3201 /* Apply the TYPE_QUALS to the new DECL. */
3203 void
3204 c_apply_type_quals_to_decl (type_quals, decl)
3205 int type_quals;
3206 tree decl;
3208 if (type_quals & TYPE_QUAL_CONST)
3209 TREE_READONLY (decl) = 1;
3210 if (type_quals & TYPE_QUAL_VOLATILE)
3212 TREE_SIDE_EFFECTS (decl) = 1;
3213 TREE_THIS_VOLATILE (decl) = 1;
3215 if (type_quals & TYPE_QUAL_RESTRICT)
3217 if (!TREE_TYPE (decl)
3218 || !POINTER_TYPE_P (TREE_TYPE (decl))
3219 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (TREE_TYPE (decl))))
3220 error ("invalid use of `restrict'");
3221 else if (flag_strict_aliasing)
3223 /* No two restricted pointers can point at the same thing.
3224 However, a restricted pointer can point at the same thing
3225 as an unrestricted pointer, if that unrestricted pointer
3226 is based on the restricted pointer. So, we make the
3227 alias set for the restricted pointer a subset of the
3228 alias set for the type pointed to by the type of the
3229 decl. */
3231 int pointed_to_alias_set
3232 = get_alias_set (TREE_TYPE (TREE_TYPE (decl)));
3234 if (!pointed_to_alias_set)
3235 /* It's not legal to make a subset of alias set zero. */
3237 else
3239 DECL_POINTER_ALIAS_SET (decl) = new_alias_set ();
3240 record_alias_subset (pointed_to_alias_set,
3241 DECL_POINTER_ALIAS_SET (decl));
3247 /* T is an expression with pointer type. Find the DECL on which this
3248 expression is based. (For example, in `a[i]' this would be `a'.)
3249 If there is no such DECL, or a unique decl cannot be determined,
3250 NULL_TREE is retured. */
3252 static tree
3253 c_find_base_decl (t)
3254 tree t;
3256 int i;
3257 tree decl;
3259 if (t == NULL_TREE || t == error_mark_node)
3260 return NULL_TREE;
3262 if (!POINTER_TYPE_P (TREE_TYPE (t)))
3263 return NULL_TREE;
3265 decl = NULL_TREE;
3267 if (TREE_CODE (t) == FIELD_DECL
3268 || TREE_CODE (t) == PARM_DECL
3269 || TREE_CODE (t) == VAR_DECL)
3270 /* Aha, we found a pointer-typed declaration. */
3271 return t;
3273 /* It would be nice to deal with COMPONENT_REFs here. If we could
3274 tell that `a' and `b' were the same, then `a->f' and `b->f' are
3275 also the same. */
3277 /* Handle general expressions. */
3278 switch (TREE_CODE_CLASS (TREE_CODE (t)))
3280 case '1':
3281 case '2':
3282 case '3':
3283 for (i = tree_code_length [(int) TREE_CODE (t)]; --i >= 0;)
3285 tree d = c_find_base_decl (TREE_OPERAND (t, i));
3286 if (d)
3288 if (!decl)
3289 decl = d;
3290 else if (d && d != decl)
3291 /* Two different declarations. That's confusing; let's
3292 just assume we don't know what's going on. */
3293 decl = NULL_TREE;
3296 break;
3298 default:
3299 break;
3302 return decl;
3305 /* Return the typed-based alias set for T, which may be an expression
3306 or a type. */
3309 c_get_alias_set (t)
3310 tree t;
3312 tree type;
3313 tree u;
3315 if (t == error_mark_node)
3316 return 0;
3318 type = (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
3319 ? t : TREE_TYPE (t);
3321 if (type == error_mark_node)
3322 return 0;
3324 /* Deal with special cases first; for certain kinds of references
3325 we're interested in more than just the type. */
3327 if (TREE_CODE (t) == BIT_FIELD_REF)
3328 /* Perhaps reads and writes to this piece of data alias fields
3329 neighboring the bitfield. Perhaps that's impossible. For now,
3330 let's just assume that bitfields can alias everything, which is
3331 the conservative assumption. */
3332 return 0;
3334 /* Permit type-punning when accessing a union, provided the access
3335 is directly through the union. For example, this code does not
3336 permit taking the address of a union member and then storing
3337 through it. Even the type-punning allowed here is a GCC
3338 extension, albeit a common and useful one; the C standard says
3339 that such accesses have implementation-defined behavior. */
3340 for (u = t;
3341 TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
3342 u = TREE_OPERAND (u, 0))
3343 if (TREE_CODE (u) == COMPONENT_REF
3344 && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
3345 return 0;
3347 if (TREE_CODE (t) == INDIRECT_REF)
3349 /* Check for accesses through restrict-qualified pointers. */
3350 tree decl = c_find_base_decl (TREE_OPERAND (t, 0));
3352 if (decl && DECL_POINTER_ALIAS_SET_KNOWN_P (decl))
3353 /* We use the alias set indicated in the declaration. */
3354 return DECL_POINTER_ALIAS_SET (decl);
3357 /* From here on, only the type matters. */
3359 if (TREE_CODE (t) == COMPONENT_REF
3360 && DECL_BIT_FIELD_TYPE (TREE_OPERAND (t, 1)))
3361 /* Since build_modify_expr calls get_unwidened for stores to
3362 component references, the type of a bit field can be changed
3363 from (say) `unsigned int : 16' to `unsigned short' or from
3364 `enum E : 16' to `short'. We want the real type of the
3365 bit-field in this case, not some the integral equivalent. */
3366 type = DECL_BIT_FIELD_TYPE (TREE_OPERAND (t, 1));
3368 if (TYPE_ALIAS_SET_KNOWN_P (type))
3369 /* If we've already calculated the value, just return it. */
3370 return TYPE_ALIAS_SET (type);
3371 else if (TYPE_MAIN_VARIANT (type) != type)
3372 /* The C standard specifically allows aliasing between
3373 cv-qualified variants of types. */
3374 TYPE_ALIAS_SET (type) = c_get_alias_set (TYPE_MAIN_VARIANT (type));
3375 else if (TREE_CODE (type) == INTEGER_TYPE)
3377 tree signed_variant;
3379 /* The C standard specifically allows aliasing between signed and
3380 unsigned variants of the same type. We treat the signed
3381 variant as canonical. */
3382 signed_variant = signed_type (type);
3384 if (signed_variant != type)
3385 TYPE_ALIAS_SET (type) = c_get_alias_set (signed_variant);
3386 else if (signed_variant == signed_char_type_node)
3387 /* The C standard guarantess that any object may be accessed
3388 via an lvalue that has character type. We don't have to
3389 check for unsigned_char_type_node or char_type_node because
3390 we are specifically looking at the signed variant. */
3391 TYPE_ALIAS_SET (type) = 0;
3393 else if (TREE_CODE (type) == ARRAY_TYPE)
3394 /* Anything that can alias one of the array elements can alias
3395 the entire array as well. */
3396 TYPE_ALIAS_SET (type) = c_get_alias_set (TREE_TYPE (type));
3397 else if (TREE_CODE (type) == FUNCTION_TYPE)
3398 /* There are no objects of FUNCTION_TYPE, so there's no point in
3399 using up an alias set for them. (There are, of course,
3400 pointers and references to functions, but that's
3401 different.) */
3402 TYPE_ALIAS_SET (type) = 0;
3403 else if (TREE_CODE (type) == RECORD_TYPE
3404 || TREE_CODE (type) == UNION_TYPE)
3405 /* If TYPE is a struct or union type then we're reading or
3406 writing an entire struct. Thus, we don't know anything about
3407 aliasing. (In theory, such an access can only alias objects
3408 whose type is the same as one of the fields, recursively, but
3409 we don't yet make any use of that information.) */
3410 TYPE_ALIAS_SET (type) = 0;
3411 else if (TREE_CODE (type) == POINTER_TYPE
3412 || TREE_CODE (type) == REFERENCE_TYPE)
3414 tree t;
3416 /* Unfortunately, there is no canonical form of a pointer type.
3417 In particular, if we have `typedef int I', then `int *', and
3418 `I *' are different types. So, we have to pick a canonical
3419 representative. We do this below.
3421 Technically, this approach is actually more conservative that
3422 it needs to be. In particular, `const int *' and `int *'
3423 chould be in different alias sets, according to the C and C++
3424 standard, since their types are not the same, and so,
3425 technically, an `int **' and `const int **' cannot point at
3426 the same thing.
3428 But, the standard is wrong. In particular, this code is
3429 legal C++:
3431 int *ip;
3432 int **ipp = &ip;
3433 const int* const* cipp = &ip;
3435 And, it doesn't make sense for that to be legal unless you
3436 can dereference IPP and CIPP. So, we ignore cv-qualifiers on
3437 the pointed-to types. This issue has been reported to the
3438 C++ committee. */
3439 t = TYPE_MAIN_VARIANT (TREE_TYPE (type));
3440 t = ((TREE_CODE (type) == POINTER_TYPE)
3441 ? build_pointer_type (t) : build_reference_type (t));
3442 if (t != type)
3443 TYPE_ALIAS_SET (type) = c_get_alias_set (t);
3446 if (!TYPE_ALIAS_SET_KNOWN_P (type))
3448 /* Types that are not allocated on the permanent obstack are not
3449 placed in the type hash table. Thus, there can be multiple
3450 copies of identical types in local scopes. In the long run,
3451 all types should be permanent. */
3452 if (! TREE_PERMANENT (type))
3453 TYPE_ALIAS_SET (type) = 0;
3454 else
3455 /* TYPE is something we haven't seen before. Put it in a new
3456 alias set. */
3457 TYPE_ALIAS_SET (type) = new_alias_set ();
3460 return TYPE_ALIAS_SET (type);
3463 /* Build tree nodes and builtin functions common to both C and C++ language
3464 frontends.
3465 CPLUS_MODE is nonzero if we are called from the C++ frontend, we generate
3466 some stricter prototypes in that case.
3467 NO_BUILTINS and NO_NONANSI_BUILTINS contain the respective values of
3468 the language frontend flags flag_no_builtin and
3469 flag_no_nonansi_builtin. */
3470 void
3471 c_common_nodes_and_builtins (cplus_mode, no_builtins, no_nonansi_builtins)
3472 int cplus_mode, no_builtins, no_nonansi_builtins;
3474 tree temp;
3475 tree memcpy_ftype, memset_ftype, strlen_ftype;
3476 tree endlink, int_endlink, double_endlink, unsigned_endlink;
3477 tree sizetype_endlink;
3478 tree ptr_ftype, ptr_ftype_unsigned;
3479 tree void_ftype_any, void_ftype_int;
3480 tree double_ftype_double, double_ftype_double_double;
3481 tree float_ftype_float, ldouble_ftype_ldouble;
3482 tree int_ftype_cptr_cptr_sizet;
3483 tree int_ftype_string_string, string_ftype_ptr_ptr;
3484 tree long_ftype_long;
3485 /* Either char* or void*. */
3486 tree traditional_ptr_type_node;
3487 tree va_list_ptr_type_node;
3488 tree va_list_arg_type_node;
3490 pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"),
3491 va_list_type_node));
3493 va_list_ptr_type_node = build_pointer_type (va_list_type_node);
3495 if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
3496 va_list_arg_type_node = build_pointer_type (TREE_TYPE (va_list_type_node));
3497 else
3498 va_list_arg_type_node = va_list_type_node;
3500 endlink = void_list_node;
3501 int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink);
3502 double_endlink = tree_cons (NULL_TREE, double_type_node, endlink);
3503 unsigned_endlink = tree_cons (NULL_TREE, unsigned_type_node, endlink);
3505 ptr_ftype = build_function_type (ptr_type_node, NULL_TREE);
3506 ptr_ftype_unsigned = build_function_type (ptr_type_node, unsigned_endlink);
3507 sizetype_endlink = tree_cons (NULL_TREE, sizetype, endlink);
3508 /* We realloc here because sizetype could be int or unsigned. S'ok. */
3509 ptr_ftype_sizetype = build_function_type (ptr_type_node, sizetype_endlink);
3511 void_ftype_any = build_function_type (void_type_node, NULL_TREE);
3512 void_ftype = build_function_type (void_type_node, endlink);
3513 void_ftype_int = build_function_type (void_type_node, int_endlink);
3514 void_ftype_ptr
3515 = build_function_type (void_type_node,
3516 tree_cons (NULL_TREE, ptr_type_node, endlink));
3518 float_ftype_float
3519 = build_function_type (float_type_node,
3520 tree_cons (NULL_TREE, float_type_node, endlink));
3522 double_ftype_double
3523 = build_function_type (double_type_node, double_endlink);
3525 ldouble_ftype_ldouble
3526 = build_function_type (long_double_type_node,
3527 tree_cons (NULL_TREE, long_double_type_node,
3528 endlink));
3530 double_ftype_double_double
3531 = build_function_type (double_type_node,
3532 tree_cons (NULL_TREE, double_type_node,
3533 double_endlink));
3535 int_ftype_int
3536 = build_function_type (integer_type_node, int_endlink);
3538 long_ftype_long
3539 = build_function_type (long_integer_type_node,
3540 tree_cons (NULL_TREE, long_integer_type_node,
3541 endlink));
3543 int_ftype_cptr_cptr_sizet
3544 = build_function_type (integer_type_node,
3545 tree_cons (NULL_TREE, const_ptr_type_node,
3546 tree_cons (NULL_TREE, const_ptr_type_node,
3547 tree_cons (NULL_TREE,
3548 sizetype,
3549 endlink))));
3551 /* Prototype for strcpy. */
3552 string_ftype_ptr_ptr
3553 = build_function_type (string_type_node,
3554 tree_cons (NULL_TREE, string_type_node,
3555 tree_cons (NULL_TREE,
3556 const_string_type_node,
3557 endlink)));
3559 /* Prototype for strcmp. */
3560 int_ftype_string_string
3561 = build_function_type (integer_type_node,
3562 tree_cons (NULL_TREE, const_string_type_node,
3563 tree_cons (NULL_TREE,
3564 const_string_type_node,
3565 endlink)));
3567 /* Prototype for strlen. */
3568 strlen_ftype
3569 = build_function_type ((flag_traditional && ! cplus_mode
3570 ? integer_type_node : sizetype),
3571 tree_cons (NULL_TREE, const_string_type_node,
3572 endlink));
3574 traditional_ptr_type_node = (flag_traditional && ! cplus_mode
3575 ? string_type_node : ptr_type_node);
3577 /* Prototype for memcpy. */
3578 memcpy_ftype
3579 = build_function_type (traditional_ptr_type_node,
3580 tree_cons (NULL_TREE, ptr_type_node,
3581 tree_cons (NULL_TREE, const_ptr_type_node,
3582 sizetype_endlink)));
3584 /* Prototype for memset. */
3585 memset_ftype
3586 = build_function_type (traditional_ptr_type_node,
3587 tree_cons (NULL_TREE, ptr_type_node,
3588 tree_cons (NULL_TREE, integer_type_node,
3589 tree_cons (NULL_TREE,
3590 sizetype,
3591 endlink))));
3593 builtin_function ("__builtin_constant_p", default_function_type,
3594 BUILT_IN_CONSTANT_P, BUILT_IN_NORMAL, NULL_PTR);
3596 builtin_function ("__builtin_return_address", ptr_ftype_unsigned,
3597 BUILT_IN_RETURN_ADDRESS, BUILT_IN_NORMAL, NULL_PTR);
3599 builtin_function ("__builtin_frame_address", ptr_ftype_unsigned,
3600 BUILT_IN_FRAME_ADDRESS, BUILT_IN_NORMAL, NULL_PTR);
3602 builtin_function ("__builtin_alloca", ptr_ftype_sizetype,
3603 BUILT_IN_ALLOCA, BUILT_IN_NORMAL, "alloca");
3604 builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS,
3605 BUILT_IN_NORMAL, NULL_PTR);
3606 /* Define alloca, ffs as builtins.
3607 Declare _exit just to mark it as volatile. */
3608 if (! no_builtins && ! no_nonansi_builtins)
3610 temp = builtin_function ("alloca", ptr_ftype_sizetype,
3611 BUILT_IN_ALLOCA, BUILT_IN_NORMAL, NULL_PTR);
3612 /* Suppress error if redefined as a non-function. */
3613 DECL_BUILT_IN_NONANSI (temp) = 1;
3614 temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS,
3615 BUILT_IN_NORMAL, NULL_PTR);
3616 /* Suppress error if redefined as a non-function. */
3617 DECL_BUILT_IN_NONANSI (temp) = 1;
3618 temp = builtin_function ("_exit", void_ftype_int,
3619 0, NOT_BUILT_IN, NULL_PTR);
3620 TREE_THIS_VOLATILE (temp) = 1;
3621 TREE_SIDE_EFFECTS (temp) = 1;
3622 /* Suppress error if redefined as a non-function. */
3623 DECL_BUILT_IN_NONANSI (temp) = 1;
3626 builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS,
3627 BUILT_IN_NORMAL, NULL_PTR);
3628 builtin_function ("__builtin_fabsf", float_ftype_float, BUILT_IN_FABS,
3629 BUILT_IN_NORMAL, NULL_PTR);
3630 builtin_function ("__builtin_fabs", double_ftype_double, BUILT_IN_FABS,
3631 BUILT_IN_NORMAL, NULL_PTR);
3632 builtin_function ("__builtin_fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS,
3633 BUILT_IN_NORMAL, NULL_PTR);
3634 builtin_function ("__builtin_labs", long_ftype_long, BUILT_IN_LABS,
3635 BUILT_IN_NORMAL, NULL_PTR);
3636 builtin_function ("__builtin_saveregs", ptr_ftype, BUILT_IN_SAVEREGS,
3637 BUILT_IN_NORMAL, NULL_PTR);
3638 builtin_function ("__builtin_classify_type", default_function_type,
3639 BUILT_IN_CLASSIFY_TYPE, BUILT_IN_NORMAL, NULL_PTR);
3640 builtin_function ("__builtin_next_arg", ptr_ftype, BUILT_IN_NEXT_ARG,
3641 BUILT_IN_NORMAL, NULL_PTR);
3642 builtin_function ("__builtin_args_info", int_ftype_int, BUILT_IN_ARGS_INFO,
3643 BUILT_IN_NORMAL, NULL_PTR);
3644 builtin_function ("__builtin_setjmp",
3645 build_function_type (integer_type_node,
3646 tree_cons (NULL_TREE, ptr_type_node,
3647 endlink)),
3648 BUILT_IN_SETJMP, BUILT_IN_NORMAL, NULL_PTR);
3649 builtin_function ("__builtin_longjmp",
3650 build_function_type (void_type_node,
3651 tree_cons (NULL_TREE, ptr_type_node,
3652 tree_cons (NULL_TREE,
3653 integer_type_node,
3654 endlink))),
3655 BUILT_IN_LONGJMP, BUILT_IN_NORMAL, NULL_PTR);
3656 builtin_function ("__builtin_trap", void_ftype, BUILT_IN_TRAP,
3657 BUILT_IN_NORMAL, NULL_PTR);
3659 /* Untyped call and return. */
3660 builtin_function ("__builtin_apply_args", ptr_ftype,
3661 BUILT_IN_APPLY_ARGS, BUILT_IN_NORMAL, NULL_PTR);
3663 temp = tree_cons (NULL_TREE,
3664 build_pointer_type (build_function_type (void_type_node,
3665 NULL_TREE)),
3666 tree_cons (NULL_TREE,
3667 ptr_type_node,
3668 tree_cons (NULL_TREE,
3669 sizetype,
3670 endlink)));
3671 builtin_function ("__builtin_apply",
3672 build_function_type (ptr_type_node, temp),
3673 BUILT_IN_APPLY, BUILT_IN_NORMAL, NULL_PTR);
3674 builtin_function ("__builtin_return", void_ftype_ptr,
3675 BUILT_IN_RETURN, BUILT_IN_NORMAL, NULL_PTR);
3677 /* Support for varargs.h and stdarg.h. */
3678 builtin_function ("__builtin_varargs_start",
3679 build_function_type (void_type_node,
3680 tree_cons (NULL_TREE,
3681 va_list_ptr_type_node,
3682 endlink)),
3683 BUILT_IN_VARARGS_START, BUILT_IN_NORMAL, NULL_PTR);
3685 builtin_function ("__builtin_stdarg_start",
3686 build_function_type (void_type_node,
3687 tree_cons (NULL_TREE,
3688 va_list_ptr_type_node,
3689 NULL_TREE)),
3690 BUILT_IN_STDARG_START, BUILT_IN_NORMAL, NULL_PTR);
3692 builtin_function ("__builtin_va_end",
3693 build_function_type (void_type_node,
3694 tree_cons (NULL_TREE,
3695 va_list_arg_type_node,
3696 endlink)),
3697 BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL_PTR);
3699 builtin_function ("__builtin_va_copy",
3700 build_function_type (void_type_node,
3701 tree_cons (NULL_TREE,
3702 va_list_ptr_type_node,
3703 tree_cons (NULL_TREE,
3704 va_list_arg_type_node,
3705 endlink))),
3706 BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL_PTR);
3708 /* Currently under experimentation. */
3709 builtin_function ("__builtin_memcpy", memcpy_ftype, BUILT_IN_MEMCPY,
3710 BUILT_IN_NORMAL, "memcpy");
3711 builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet,
3712 BUILT_IN_MEMCMP, BUILT_IN_NORMAL, "memcmp");
3713 builtin_function ("__builtin_memset", memset_ftype, BUILT_IN_MEMSET,
3714 BUILT_IN_NORMAL, "memset");
3715 builtin_function ("__builtin_strcmp", int_ftype_string_string,
3716 BUILT_IN_STRCMP, BUILT_IN_NORMAL, "strcmp");
3717 builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr,
3718 BUILT_IN_STRCPY, BUILT_IN_NORMAL, "strcpy");
3719 builtin_function ("__builtin_strlen", strlen_ftype,
3720 BUILT_IN_STRLEN, BUILT_IN_NORMAL, "strlen");
3721 builtin_function ("__builtin_sqrtf", float_ftype_float,
3722 BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrtf");
3723 builtin_function ("__builtin_fsqrt", double_ftype_double,
3724 BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrt");
3725 builtin_function ("__builtin_sqrtl", ldouble_ftype_ldouble,
3726 BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrtl");
3727 builtin_function ("__builtin_sinf", float_ftype_float,
3728 BUILT_IN_SIN, BUILT_IN_NORMAL, "sinf");
3729 builtin_function ("__builtin_sin", double_ftype_double,
3730 BUILT_IN_SIN, BUILT_IN_NORMAL, "sin");
3731 builtin_function ("__builtin_sinl", ldouble_ftype_ldouble,
3732 BUILT_IN_SIN, BUILT_IN_NORMAL, "sinl");
3733 builtin_function ("__builtin_cosf", float_ftype_float,
3734 BUILT_IN_COS, BUILT_IN_NORMAL, "cosf");
3735 builtin_function ("__builtin_cos", double_ftype_double,
3736 BUILT_IN_COS, BUILT_IN_NORMAL, "cos");
3737 builtin_function ("__builtin_cosl", ldouble_ftype_ldouble,
3738 BUILT_IN_COS, BUILT_IN_NORMAL, "cosl");
3740 if (! no_builtins)
3742 builtin_function ("abs", int_ftype_int, BUILT_IN_ABS,
3743 BUILT_IN_NORMAL, NULL_PTR);
3744 builtin_function ("fabsf", float_ftype_float, BUILT_IN_FABS,
3745 BUILT_IN_NORMAL, NULL_PTR);
3746 builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS,
3747 BUILT_IN_NORMAL, NULL_PTR);
3748 builtin_function ("fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS,
3749 BUILT_IN_NORMAL, NULL_PTR);
3750 builtin_function ("labs", long_ftype_long, BUILT_IN_LABS,
3751 BUILT_IN_NORMAL, NULL_PTR);
3752 builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY,
3753 BUILT_IN_NORMAL, NULL_PTR);
3754 builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP,
3755 BUILT_IN_NORMAL, NULL_PTR);
3756 builtin_function ("memset", memset_ftype, BUILT_IN_MEMSET,
3757 BUILT_IN_NORMAL, NULL_PTR);
3758 builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP,
3759 BUILT_IN_NORMAL, NULL_PTR);
3760 builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY,
3761 BUILT_IN_NORMAL, NULL_PTR);
3762 builtin_function ("strlen", strlen_ftype, BUILT_IN_STRLEN,
3763 BUILT_IN_NORMAL, NULL_PTR);
3764 builtin_function ("sqrtf", float_ftype_float, BUILT_IN_FSQRT,
3765 BUILT_IN_NORMAL, NULL_PTR);
3766 builtin_function ("sqrt", double_ftype_double, BUILT_IN_FSQRT,
3767 BUILT_IN_NORMAL, NULL_PTR);
3768 builtin_function ("sqrtl", ldouble_ftype_ldouble, BUILT_IN_FSQRT,
3769 BUILT_IN_NORMAL, NULL_PTR);
3770 builtin_function ("sinf", float_ftype_float, BUILT_IN_SIN,
3771 BUILT_IN_NORMAL, NULL_PTR);
3772 builtin_function ("sin", double_ftype_double, BUILT_IN_SIN,
3773 BUILT_IN_NORMAL, NULL_PTR);
3774 builtin_function ("sinl", ldouble_ftype_ldouble, BUILT_IN_SIN,
3775 BUILT_IN_NORMAL, NULL_PTR);
3776 builtin_function ("cosf", float_ftype_float, BUILT_IN_COS,
3777 BUILT_IN_NORMAL, NULL_PTR);
3778 builtin_function ("cos", double_ftype_double, BUILT_IN_COS,
3779 BUILT_IN_NORMAL, NULL_PTR);
3780 builtin_function ("cosl", ldouble_ftype_ldouble, BUILT_IN_COS,
3781 BUILT_IN_NORMAL, NULL_PTR);
3783 /* Declare these functions volatile
3784 to avoid spurious "control drops through" warnings. */
3785 temp = builtin_function ("abort", cplus_mode ? void_ftype : void_ftype_any,
3786 0, NOT_BUILT_IN, NULL_PTR);
3787 TREE_THIS_VOLATILE (temp) = 1;
3788 TREE_SIDE_EFFECTS (temp) = 1;
3790 #if 0 /* ??? The C++ frontend used to do this. */
3791 /* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on
3792 them... */
3793 DECL_BUILT_IN_NONANSI (temp) = 1;
3794 #endif
3795 temp = builtin_function ("exit",
3796 cplus_mode ? void_ftype_int : void_ftype_any,
3797 0, NOT_BUILT_IN, NULL_PTR);
3798 TREE_THIS_VOLATILE (temp) = 1;
3799 TREE_SIDE_EFFECTS (temp) = 1;
3801 #if 0 /* ??? The C++ frontend used to do this. */
3802 /* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on
3803 them... */
3804 DECL_BUILT_IN_NONANSI (temp) = 1;
3805 #endif
3808 #if 0
3809 /* Support for these has not been written in either expand_builtin
3810 or build_function_call. */
3811 builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV,
3812 BUILT_IN_NORMAL, NULL_PTR);
3813 builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV,
3814 BUILT_IN_NORMAL, NULL_PTR);
3815 builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
3816 BUILT_IN_NORMAL, NULL_PTR);
3817 builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL,
3818 BUILT_IN_NORMAL, NULL_PTR);
3819 builtin_function ("__builtin_fmod", double_ftype_double_double,
3820 BUILT_IN_FMOD, BUILT_IN_NORMAL, NULL_PTR);
3821 builtin_function ("__builtin_frem", double_ftype_double_double,
3822 BUILT_IN_FREM, BUILT_IN_NORMAL, NULL_PTR);
3823 builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
3824 BUILT_IN_NORMAL, NULL_PTR);
3825 builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
3826 BUILT_IN_NORMAL, NULL_PTR);
3827 #endif
3829 /* ??? Perhaps there's a better place to do this. But it is related
3830 to __builtin_va_arg, so it isn't that off-the-wall. */
3831 lang_type_promotes_to = simple_type_promotes_to;
3834 tree
3835 build_va_arg (expr, type)
3836 tree expr, type;
3838 return build1 (VA_ARG_EXPR, type, expr);
3841 /* Return nonzero if VALUE is a valid constant-valued expression
3842 for use in initializing a static variable; one that can be an
3843 element of a "constant" initializer.
3845 Return null_pointer_node if the value is absolute;
3846 if it is relocatable, return the variable that determines the relocation.
3847 We assume that VALUE has been folded as much as possible;
3848 therefore, we do not need to check for such things as
3849 arithmetic-combinations of integers. */
3851 tree
3852 initializer_constant_valid_p (value, endtype)
3853 tree value;
3854 tree endtype;
3856 switch (TREE_CODE (value))
3858 case CONSTRUCTOR:
3859 if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
3860 || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
3861 && TREE_CONSTANT (value)
3862 && CONSTRUCTOR_ELTS (value))
3863 return
3864 initializer_constant_valid_p (TREE_VALUE (CONSTRUCTOR_ELTS (value)),
3865 endtype);
3867 return TREE_STATIC (value) ? null_pointer_node : 0;
3869 case INTEGER_CST:
3870 case REAL_CST:
3871 case STRING_CST:
3872 case COMPLEX_CST:
3873 return null_pointer_node;
3875 case ADDR_EXPR:
3876 return TREE_OPERAND (value, 0);
3878 case NON_LVALUE_EXPR:
3879 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3881 case CONVERT_EXPR:
3882 case NOP_EXPR:
3883 /* Allow conversions between pointer types. */
3884 if (POINTER_TYPE_P (TREE_TYPE (value))
3885 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3886 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3888 /* Allow conversions between real types. */
3889 if (FLOAT_TYPE_P (TREE_TYPE (value))
3890 && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3891 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3893 /* Allow length-preserving conversions between integer types. */
3894 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3895 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3896 && (TYPE_PRECISION (TREE_TYPE (value))
3897 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3898 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3900 /* Allow conversions between other integer types only if
3901 explicit value. */
3902 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3903 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3905 tree inner = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3906 endtype);
3907 if (inner == null_pointer_node)
3908 return null_pointer_node;
3909 break;
3912 /* Allow (int) &foo provided int is as wide as a pointer. */
3913 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3914 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3915 && (TYPE_PRECISION (TREE_TYPE (value))
3916 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3917 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3918 endtype);
3920 /* Likewise conversions from int to pointers, but also allow
3921 conversions from 0. */
3922 if (POINTER_TYPE_P (TREE_TYPE (value))
3923 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3925 if (integer_zerop (TREE_OPERAND (value, 0)))
3926 return null_pointer_node;
3927 else if (TYPE_PRECISION (TREE_TYPE (value))
3928 <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))
3929 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3930 endtype);
3933 /* Allow conversions to union types if the value inside is okay. */
3934 if (TREE_CODE (TREE_TYPE (value)) == UNION_TYPE)
3935 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3936 endtype);
3937 break;
3939 case PLUS_EXPR:
3940 if (! INTEGRAL_TYPE_P (endtype)
3941 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3943 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3944 endtype);
3945 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3946 endtype);
3947 /* If either term is absolute, use the other terms relocation. */
3948 if (valid0 == null_pointer_node)
3949 return valid1;
3950 if (valid1 == null_pointer_node)
3951 return valid0;
3953 break;
3955 case MINUS_EXPR:
3956 if (! INTEGRAL_TYPE_P (endtype)
3957 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3959 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3960 endtype);
3961 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3962 endtype);
3963 /* Win if second argument is absolute. */
3964 if (valid1 == null_pointer_node)
3965 return valid0;
3966 /* Win if both arguments have the same relocation.
3967 Then the value is absolute. */
3968 if (valid0 == valid1)
3969 return null_pointer_node;
3972 /* Support differences between labels. */
3973 if (INTEGRAL_TYPE_P (endtype))
3975 tree op0, op1;
3976 op0 = TREE_OPERAND (value, 0);
3977 op1 = TREE_OPERAND (value, 1);
3978 STRIP_NOPS (op0);
3979 STRIP_NOPS (op1);
3981 if (TREE_CODE (op0) == ADDR_EXPR
3982 && TREE_CODE (TREE_OPERAND (op0, 0)) == LABEL_DECL
3983 && TREE_CODE (op1) == ADDR_EXPR
3984 && TREE_CODE (TREE_OPERAND (op1, 0)) == LABEL_DECL)
3985 return null_pointer_node;
3987 break;
3989 default:
3990 break;
3993 return 0;
3996 /* Given a type, apply default promotions wrt unnamed function arguments
3997 and return the new type. Return NULL_TREE if no change. */
3998 /* ??? There is a function of the same name in the C++ front end that
3999 does something similar, but is more thorough and does not return NULL
4000 if no change. We could perhaps share code, but it would make the
4001 self_promoting_type property harder to identify. */
4003 tree
4004 simple_type_promotes_to (type)
4005 tree type;
4007 if (TYPE_MAIN_VARIANT (type) == float_type_node)
4008 return double_type_node;
4010 if (C_PROMOTING_INTEGER_TYPE_P (type))
4012 /* Traditionally, unsignedness is preserved in default promotions.
4013 Also preserve unsignedness if not really getting any wider. */
4014 if (TREE_UNSIGNED (type)
4015 && (flag_traditional
4016 || TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)))
4017 return unsigned_type_node;
4018 return integer_type_node;
4021 return NULL_TREE;
4024 /* Return 1 if PARMS specifies a fixed number of parameters
4025 and none of their types is affected by default promotions. */
4028 self_promoting_args_p (parms)
4029 tree parms;
4031 register tree t;
4032 for (t = parms; t; t = TREE_CHAIN (t))
4034 register tree type = TREE_VALUE (t);
4036 if (TREE_CHAIN (t) == 0 && type != void_type_node)
4037 return 0;
4039 if (type == 0)
4040 return 0;
4042 if (TYPE_MAIN_VARIANT (type) == float_type_node)
4043 return 0;
4045 if (C_PROMOTING_INTEGER_TYPE_P (type))
4046 return 0;
4048 return 1;