oops - minor formatting tidy ups to previous delta
[official-gcc.git] / gcc / c-common.c
blobe09eac29476cd1334afdb15802601f2fa135f66e
1 /* Subroutines shared by all languages that are variants of C.
2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "tree.h"
25 #include "real.h"
26 #include "flags.h"
27 #include "toplev.h"
28 #include "output.h"
29 #include "c-pragma.h"
30 #include "rtl.h"
31 #include "ggc.h"
32 #include "expr.h"
33 #include "c-common.h"
34 #include "diagnostic.h"
35 #include "tm_p.h"
36 #include "obstack.h"
37 #include "cpplib.h"
38 #include "target.h"
39 #include "langhooks.h"
40 #include "except.h" /* For USING_SJLJ_EXCEPTIONS. */
42 cpp_reader *parse_in; /* Declared in c-pragma.h. */
44 /* We let tm.h override the types used here, to handle trivial differences
45 such as the choice of unsigned int or long unsigned int for size_t.
46 When machines start needing nontrivial differences in the size type,
47 it would be best to do something here to figure out automatically
48 from other information what type to use. */
50 #ifndef SIZE_TYPE
51 #define SIZE_TYPE "long unsigned int"
52 #endif
54 #ifndef WCHAR_TYPE
55 #define WCHAR_TYPE "int"
56 #endif
58 /* WCHAR_TYPE gets overridden by -fshort-wchar. */
59 #define MODIFIED_WCHAR_TYPE \
60 (flag_short_wchar ? "short unsigned int" : WCHAR_TYPE)
62 #ifndef PTRDIFF_TYPE
63 #define PTRDIFF_TYPE "long int"
64 #endif
66 #ifndef WINT_TYPE
67 #define WINT_TYPE "unsigned int"
68 #endif
70 #ifndef INTMAX_TYPE
71 #define INTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \
72 ? "int" \
73 : ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \
74 ? "long int" \
75 : "long long int"))
76 #endif
78 #ifndef UINTMAX_TYPE
79 #define UINTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \
80 ? "unsigned int" \
81 : ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \
82 ? "long unsigned int" \
83 : "long long unsigned int"))
84 #endif
86 #ifndef STDC_0_IN_SYSTEM_HEADERS
87 #define STDC_0_IN_SYSTEM_HEADERS 0
88 #endif
90 #ifndef REGISTER_PREFIX
91 #define REGISTER_PREFIX ""
92 #endif
94 /* The variant of the C language being processed. */
96 enum c_language_kind c_language;
98 /* The following symbols are subsumed in the c_global_trees array, and
99 listed here individually for documentation purposes.
101 INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
103 tree short_integer_type_node;
104 tree long_integer_type_node;
105 tree long_long_integer_type_node;
107 tree short_unsigned_type_node;
108 tree long_unsigned_type_node;
109 tree long_long_unsigned_type_node;
111 tree boolean_type_node;
112 tree boolean_false_node;
113 tree boolean_true_node;
115 tree ptrdiff_type_node;
117 tree unsigned_char_type_node;
118 tree signed_char_type_node;
119 tree wchar_type_node;
120 tree signed_wchar_type_node;
121 tree unsigned_wchar_type_node;
123 tree float_type_node;
124 tree double_type_node;
125 tree long_double_type_node;
127 tree complex_integer_type_node;
128 tree complex_float_type_node;
129 tree complex_double_type_node;
130 tree complex_long_double_type_node;
132 tree intQI_type_node;
133 tree intHI_type_node;
134 tree intSI_type_node;
135 tree intDI_type_node;
136 tree intTI_type_node;
138 tree unsigned_intQI_type_node;
139 tree unsigned_intHI_type_node;
140 tree unsigned_intSI_type_node;
141 tree unsigned_intDI_type_node;
142 tree unsigned_intTI_type_node;
144 tree widest_integer_literal_type_node;
145 tree widest_unsigned_literal_type_node;
147 Nodes for types `void *' and `const void *'.
149 tree ptr_type_node, const_ptr_type_node;
151 Nodes for types `char *' and `const char *'.
153 tree string_type_node, const_string_type_node;
155 Type `char[SOMENUMBER]'.
156 Used when an array of char is needed and the size is irrelevant.
158 tree char_array_type_node;
160 Type `int[SOMENUMBER]' or something like it.
161 Used when an array of int needed and the size is irrelevant.
163 tree int_array_type_node;
165 Type `wchar_t[SOMENUMBER]' or something like it.
166 Used when a wide string literal is created.
168 tree wchar_array_type_node;
170 Type `int ()' -- used for implicit declaration of functions.
172 tree default_function_type;
174 A VOID_TYPE node, packaged in a TREE_LIST.
176 tree void_list_node;
178 The lazily created VAR_DECLs for __FUNCTION__, __PRETTY_FUNCTION__,
179 and __func__. (C doesn't generate __FUNCTION__ and__PRETTY_FUNCTION__
180 VAR_DECLS, but C++ does.)
182 tree function_name_decl_node;
183 tree pretty_function_name_decl_node;
184 tree c99_function_name_decl_node;
186 Stack of nested function name VAR_DECLs.
188 tree saved_function_name_decls;
192 tree c_global_trees[CTI_MAX];
194 /* Switches common to the C front ends. */
196 /* Nonzero if prepreprocessing only. */
197 int flag_preprocess_only;
199 /* Nonzero if an ISO standard was selected. It rejects macros in the
200 user's namespace. */
201 int flag_iso;
203 /* Nonzero if -undef was given. It suppresses target built-in macros
204 and assertions. */
205 int flag_undef;
207 /* Nonzero means don't recognize the non-ANSI builtin functions. */
209 int flag_no_builtin;
211 /* Nonzero means don't recognize the non-ANSI builtin functions.
212 -ansi sets this. */
214 int flag_no_nonansi_builtin;
216 /* Nonzero means give `double' the same size as `float'. */
218 int flag_short_double;
220 /* Nonzero means give `wchar_t' the same size as `short'. */
222 int flag_short_wchar;
224 /* Nonzero means allow Microsoft extensions without warnings or errors. */
225 int flag_ms_extensions;
227 /* Nonzero means don't recognize the keyword `asm'. */
229 int flag_no_asm;
231 /* Nonzero means give string constants the type `const char *', as mandated
232 by the standard. */
234 int flag_const_strings;
236 /* Nonzero means `$' can be in an identifier. */
238 #ifndef DOLLARS_IN_IDENTIFIERS
239 #define DOLLARS_IN_IDENTIFIERS 1
240 #endif
241 int dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
243 /* Nonzero means to treat bitfields as signed unless they say `unsigned'. */
245 int flag_signed_bitfields = 1;
246 int explicit_flag_signed_bitfields;
248 /* Nonzero means warn about pointer casts that can drop a type qualifier
249 from the pointer target type. */
251 int warn_cast_qual;
253 /* Warn about functions which might be candidates for format attributes. */
255 int warn_missing_format_attribute;
257 /* Nonzero means warn about sizeof(function) or addition/subtraction
258 of function pointers. */
260 int warn_pointer_arith;
262 /* Nonzero means warn for any global function def
263 without separate previous prototype decl. */
265 int warn_missing_prototypes;
267 /* Warn if adding () is suggested. */
269 int warn_parentheses;
271 /* Warn if initializer is not completely bracketed. */
273 int warn_missing_braces;
275 /* Warn about comparison of signed and unsigned values.
276 If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified. */
278 int warn_sign_compare;
280 /* Nonzero means warn about usage of long long when `-pedantic'. */
282 int warn_long_long = 1;
284 /* Nonzero means warn about deprecated conversion from string constant to
285 `char *'. */
287 int warn_write_strings;
289 /* Nonzero means warn about multiple (redundant) decls for the same single
290 variable or function. */
292 int warn_redundant_decls;
294 /* Warn about testing equality of floating point numbers. */
296 int warn_float_equal;
298 /* Warn about a subscript that has type char. */
300 int warn_char_subscripts;
302 /* Warn if a type conversion is done that might have confusing results. */
304 int warn_conversion;
306 /* Warn about #pragma directives that are not recognised. */
308 int warn_unknown_pragmas; /* Tri state variable. */
310 /* Nonzero means warn about use of multicharacter literals. */
312 int warn_multichar = 1;
314 /* Warn about format/argument anomalies in calls to formatted I/O functions
315 (*printf, *scanf, strftime, strfmon, etc.). */
317 int warn_format;
319 /* Warn about Y2K problems with strftime formats. */
321 int warn_format_y2k;
323 /* Warn about excess arguments to formats. */
325 int warn_format_extra_args;
327 /* Warn about zero-length formats. */
329 int warn_format_zero_length;
331 /* Warn about non-literal format arguments. */
333 int warn_format_nonliteral;
335 /* Warn about possible security problems with calls to format functions. */
337 int warn_format_security;
340 /* C/ObjC language option variables. */
343 /* Nonzero means message about use of implicit function declarations;
344 1 means warning; 2 means error. */
346 int mesg_implicit_function_declaration = -1;
348 /* Nonzero means allow type mismatches in conditional expressions;
349 just make their values `void'. */
351 int flag_cond_mismatch;
353 /* Nonzero means enable C89 Amendment 1 features. */
355 int flag_isoc94;
357 /* Nonzero means use the ISO C99 dialect of C. */
359 int flag_isoc99;
361 /* Nonzero means that we have builtin functions, and main is an int */
363 int flag_hosted = 1;
365 /* Nonzero means add default format_arg attributes for functions not
366 in ISO C. */
368 int flag_noniso_default_format_attributes = 1;
370 /* Nonzero means warn when casting a function call to a type that does
371 not match the return type (e.g. (float)sqrt() or (anything*)malloc()
372 when there is no previous declaration of sqrt or malloc. */
374 int warn_bad_function_cast;
376 /* Warn about traditional constructs whose meanings changed in ANSI C. */
378 int warn_traditional;
380 /* Nonzero means warn for non-prototype function decls
381 or non-prototyped defs without previous prototype. */
383 int warn_strict_prototypes;
385 /* Nonzero means warn for any global function def
386 without separate previous decl. */
388 int warn_missing_declarations;
390 /* Nonzero means warn about declarations of objects not at
391 file-scope level and about *all* declarations of functions (whether
392 or static) not at file-scope level. Note that we exclude
393 implicit function declarations. To get warnings about those, use
394 -Wimplicit. */
396 int warn_nested_externs;
398 /* Warn if main is suspicious. */
400 int warn_main;
402 /* Nonzero means warn about possible violations of sequence point rules. */
404 int warn_sequence_point;
406 /* Nonzero means to warn about compile-time division by zero. */
407 int warn_div_by_zero = 1;
409 /* Nonzero means warn about use of implicit int. */
411 int warn_implicit_int;
413 /* Warn about NULL being passed to argument slots marked as requiring
414 non-NULL. */
416 int warn_nonnull;
419 /* ObjC language option variables. */
422 /* Open and close the file for outputting class declarations, if
423 requested (ObjC). */
425 int flag_gen_declaration;
427 /* Generate code for GNU or NeXT runtime environment. */
429 #ifdef NEXT_OBJC_RUNTIME
430 int flag_next_runtime = 1;
431 #else
432 int flag_next_runtime = 0;
433 #endif
435 /* Tells the compiler that this is a special run. Do not perform any
436 compiling, instead we are to test some platform dependent features
437 and output a C header file with appropriate definitions. */
439 int print_struct_values;
441 /* ???. Undocumented. */
443 const char *constant_string_class_name;
445 /* Warn if multiple methods are seen for the same selector, but with
446 different argument types. */
448 int warn_selector;
450 /* Warn if methods required by a protocol are not implemented in the
451 class adopting it. When turned off, methods inherited to that
452 class are also considered implemented. */
454 int warn_protocol = 1;
457 /* C++ language option variables. */
460 /* Nonzero means don't recognize any extension keywords. */
462 int flag_no_gnu_keywords;
464 /* Nonzero means do emit exported implementations of functions even if
465 they can be inlined. */
467 int flag_implement_inlines = 1;
469 /* Nonzero means do emit exported implementations of templates, instead of
470 multiple static copies in each file that needs a definition. */
472 int flag_external_templates;
474 /* Nonzero means that the decision to emit or not emit the implementation of a
475 template depends on where the template is instantiated, rather than where
476 it is defined. */
478 int flag_alt_external_templates;
480 /* Nonzero means that implicit instantiations will be emitted if needed. */
482 int flag_implicit_templates = 1;
484 /* Nonzero means that implicit instantiations of inline templates will be
485 emitted if needed, even if instantiations of non-inline templates
486 aren't. */
488 int flag_implicit_inline_templates = 1;
490 /* Nonzero means generate separate instantiation control files and
491 juggle them at link time. */
493 int flag_use_repository;
495 /* Nonzero if we want to issue diagnostics that the standard says are not
496 required. */
498 int flag_optional_diags = 1;
500 /* Nonzero means we should attempt to elide constructors when possible. */
502 int flag_elide_constructors = 1;
504 /* Nonzero means that member functions defined in class scope are
505 inline by default. */
507 int flag_default_inline = 1;
509 /* Controls whether compiler generates 'type descriptor' that give
510 run-time type information. */
512 int flag_rtti = 1;
514 /* Nonzero if we want to conserve space in the .o files. We do this
515 by putting uninitialized data and runtime initialized data into
516 .common instead of .data at the expense of not flagging multiple
517 definitions. */
519 int flag_conserve_space;
521 /* Nonzero if we want to obey access control semantics. */
523 int flag_access_control = 1;
525 /* Nonzero if we want to check the return value of new and avoid calling
526 constructors if it is a null pointer. */
528 int flag_check_new;
530 /* Nonzero if we want the new ISO rules for pushing a new scope for `for'
531 initialization variables.
532 0: Old rules, set by -fno-for-scope.
533 2: New ISO rules, set by -ffor-scope.
534 1: Try to implement new ISO rules, but with backup compatibility
535 (and warnings). This is the default, for now. */
537 int flag_new_for_scope = 1;
539 /* Nonzero if we want to emit defined symbols with common-like linkage as
540 weak symbols where possible, in order to conform to C++ semantics.
541 Otherwise, emit them as local symbols. */
543 int flag_weak = 1;
545 /* Nonzero to use __cxa_atexit, rather than atexit, to register
546 destructors for local statics and global objects. */
548 int flag_use_cxa_atexit = DEFAULT_USE_CXA_ATEXIT;
550 /* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc. */
552 int flag_vtable_gc;
554 /* Nonzero means make the default pedwarns warnings instead of errors.
555 The value of this flag is ignored if -pedantic is specified. */
557 int flag_permissive;
559 /* Nonzero means to implement standard semantics for exception
560 specifications, calling unexpected if an exception is thrown that
561 doesn't match the specification. Zero means to treat them as
562 assertions and optimize accordingly, but not check them. */
564 int flag_enforce_eh_specs = 1;
566 /* Nonzero means warn about implicit declarations. */
568 int warn_implicit = 1;
570 /* Nonzero means warn when all ctors or dtors are private, and the class
571 has no friends. */
573 int warn_ctor_dtor_privacy = 1;
575 /* Non-zero means warn in function declared in derived class has the
576 same name as a virtual in the base class, but fails to match the
577 type signature of any virtual function in the base class. */
579 int warn_overloaded_virtual;
581 /* Non-zero means warn when declaring a class that has a non virtual
582 destructor, when it really ought to have a virtual one. */
584 int warn_nonvdtor;
586 /* Non-zero means warn when the compiler will reorder code. */
588 int warn_reorder;
590 /* Non-zero means warn when synthesis behavior differs from Cfront's. */
592 int warn_synth;
594 /* Non-zero means warn when we convert a pointer to member function
595 into a pointer to (void or function). */
597 int warn_pmf2ptr = 1;
599 /* Nonzero means warn about violation of some Effective C++ style rules. */
601 int warn_ecpp;
603 /* Nonzero means warn where overload resolution chooses a promotion from
604 unsigned to signed over a conversion to an unsigned of the same size. */
606 int warn_sign_promo;
608 /* Nonzero means warn when an old-style cast is used. */
610 int warn_old_style_cast;
612 /* Nonzero means warn when non-templatized friend functions are
613 declared within a template */
615 int warn_nontemplate_friend = 1;
617 /* Nonzero means complain about deprecated features. */
619 int warn_deprecated = 1;
621 /* Maximum template instantiation depth. This limit is rather
622 arbitrary, but it exists to limit the time it takes to notice
623 infinite template instantiations. */
625 int max_tinst_depth = 500;
629 /* The elements of `ridpointers' are identifier nodes for the reserved
630 type names and storage classes. It is indexed by a RID_... value. */
631 tree *ridpointers;
633 tree (*make_fname_decl) PARAMS ((tree, int));
635 /* If non-NULL, the address of a language-specific function that
636 returns 1 for language-specific statement codes. */
637 int (*lang_statement_code_p) PARAMS ((enum tree_code));
639 /* If non-NULL, the address of a language-specific function that takes
640 any action required right before expand_function_end is called. */
641 void (*lang_expand_function_end) PARAMS ((void));
643 /* Nonzero means the expression being parsed will never be evaluated.
644 This is a count, since unevaluated expressions can nest. */
645 int skip_evaluation;
647 /* Information about how a function name is generated. */
648 struct fname_var_t
650 tree *const decl; /* pointer to the VAR_DECL. */
651 const unsigned rid; /* RID number for the identifier. */
652 const int pretty; /* How pretty is it? */
655 /* The three ways of getting then name of the current function. */
657 const struct fname_var_t fname_vars[] =
659 /* C99 compliant __func__, must be first. */
660 {&c99_function_name_decl_node, RID_C99_FUNCTION_NAME, 0},
661 /* GCC __FUNCTION__ compliant. */
662 {&function_name_decl_node, RID_FUNCTION_NAME, 0},
663 /* GCC __PRETTY_FUNCTION__ compliant. */
664 {&pretty_function_name_decl_node, RID_PRETTY_FUNCTION_NAME, 1},
665 {NULL, 0, 0},
668 static int constant_fits_type_p PARAMS ((tree, tree));
670 /* Keep a stack of if statements. We record the number of compound
671 statements seen up to the if keyword, as well as the line number
672 and file of the if. If a potentially ambiguous else is seen, that
673 fact is recorded; the warning is issued when we can be sure that
674 the enclosing if statement does not have an else branch. */
675 typedef struct
677 int compstmt_count;
678 int line;
679 const char *file;
680 int needs_warning;
681 tree if_stmt;
682 } if_elt;
684 static if_elt *if_stack;
686 /* Amount of space in the if statement stack. */
687 static int if_stack_space = 0;
689 /* Stack pointer. */
690 static int if_stack_pointer = 0;
692 static void cb_register_builtins PARAMS ((cpp_reader *));
694 static tree handle_packed_attribute PARAMS ((tree *, tree, tree, int,
695 bool *));
696 static tree handle_nocommon_attribute PARAMS ((tree *, tree, tree, int,
697 bool *));
698 static tree handle_common_attribute PARAMS ((tree *, tree, tree, int,
699 bool *));
700 static tree handle_noreturn_attribute PARAMS ((tree *, tree, tree, int,
701 bool *));
702 static tree handle_noinline_attribute PARAMS ((tree *, tree, tree, int,
703 bool *));
704 static tree handle_always_inline_attribute PARAMS ((tree *, tree, tree, int,
705 bool *));
706 static tree handle_used_attribute PARAMS ((tree *, tree, tree, int,
707 bool *));
708 static tree handle_unused_attribute PARAMS ((tree *, tree, tree, int,
709 bool *));
710 static tree handle_const_attribute PARAMS ((tree *, tree, tree, int,
711 bool *));
712 static tree handle_transparent_union_attribute PARAMS ((tree *, tree, tree,
713 int, bool *));
714 static tree handle_constructor_attribute PARAMS ((tree *, tree, tree, int,
715 bool *));
716 static tree handle_destructor_attribute PARAMS ((tree *, tree, tree, int,
717 bool *));
718 static tree handle_mode_attribute PARAMS ((tree *, tree, tree, int,
719 bool *));
720 static tree handle_section_attribute PARAMS ((tree *, tree, tree, int,
721 bool *));
722 static tree handle_aligned_attribute PARAMS ((tree *, tree, tree, int,
723 bool *));
724 static tree handle_weak_attribute PARAMS ((tree *, tree, tree, int,
725 bool *));
726 static tree handle_alias_attribute PARAMS ((tree *, tree, tree, int,
727 bool *));
728 static tree handle_visibility_attribute PARAMS ((tree *, tree, tree, int,
729 bool *));
730 static tree handle_no_instrument_function_attribute PARAMS ((tree *, tree,
731 tree, int,
732 bool *));
733 static tree handle_malloc_attribute PARAMS ((tree *, tree, tree, int,
734 bool *));
735 static tree handle_no_limit_stack_attribute PARAMS ((tree *, tree, tree, int,
736 bool *));
737 static tree handle_pure_attribute PARAMS ((tree *, tree, tree, int,
738 bool *));
739 static tree handle_deprecated_attribute PARAMS ((tree *, tree, tree, int,
740 bool *));
741 static tree handle_vector_size_attribute PARAMS ((tree *, tree, tree, int,
742 bool *));
743 static tree handle_nonnull_attribute PARAMS ((tree *, tree, tree, int,
744 bool *));
745 static tree handle_nothrow_attribute PARAMS ((tree *, tree, tree, int,
746 bool *));
747 static tree vector_size_helper PARAMS ((tree, tree));
749 static void check_function_nonnull PARAMS ((tree, tree));
750 static void check_nonnull_arg PARAMS ((void *, tree,
751 unsigned HOST_WIDE_INT));
752 static bool nonnull_check_p PARAMS ((tree, unsigned HOST_WIDE_INT));
753 static bool get_nonnull_operand PARAMS ((tree,
754 unsigned HOST_WIDE_INT *));
755 void builtin_define_std PARAMS ((const char *));
756 static void builtin_define_with_value PARAMS ((const char *, const char *,
757 int));
758 static void builtin_define_type_max PARAMS ((const char *, tree, int));
760 /* Table of machine-independent attributes common to all C-like languages. */
761 const struct attribute_spec c_common_attribute_table[] =
763 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
764 { "packed", 0, 0, false, false, false,
765 handle_packed_attribute },
766 { "nocommon", 0, 0, true, false, false,
767 handle_nocommon_attribute },
768 { "common", 0, 0, true, false, false,
769 handle_common_attribute },
770 /* FIXME: logically, noreturn attributes should be listed as
771 "false, true, true" and apply to function types. But implementing this
772 would require all the places in the compiler that use TREE_THIS_VOLATILE
773 on a decl to identify non-returning functions to be located and fixed
774 to check the function type instead. */
775 { "noreturn", 0, 0, true, false, false,
776 handle_noreturn_attribute },
777 { "volatile", 0, 0, true, false, false,
778 handle_noreturn_attribute },
779 { "noinline", 0, 0, true, false, false,
780 handle_noinline_attribute },
781 { "always_inline", 0, 0, true, false, false,
782 handle_always_inline_attribute },
783 { "used", 0, 0, true, false, false,
784 handle_used_attribute },
785 { "unused", 0, 0, false, false, false,
786 handle_unused_attribute },
787 /* The same comments as for noreturn attributes apply to const ones. */
788 { "const", 0, 0, true, false, false,
789 handle_const_attribute },
790 { "transparent_union", 0, 0, false, false, false,
791 handle_transparent_union_attribute },
792 { "constructor", 0, 0, true, false, false,
793 handle_constructor_attribute },
794 { "destructor", 0, 0, true, false, false,
795 handle_destructor_attribute },
796 { "mode", 1, 1, false, true, false,
797 handle_mode_attribute },
798 { "section", 1, 1, true, false, false,
799 handle_section_attribute },
800 { "aligned", 0, 1, false, false, false,
801 handle_aligned_attribute },
802 { "weak", 0, 0, true, false, false,
803 handle_weak_attribute },
804 { "alias", 1, 1, true, false, false,
805 handle_alias_attribute },
806 { "no_instrument_function", 0, 0, true, false, false,
807 handle_no_instrument_function_attribute },
808 { "malloc", 0, 0, true, false, false,
809 handle_malloc_attribute },
810 { "no_stack_limit", 0, 0, true, false, false,
811 handle_no_limit_stack_attribute },
812 { "pure", 0, 0, true, false, false,
813 handle_pure_attribute },
814 { "deprecated", 0, 0, false, false, false,
815 handle_deprecated_attribute },
816 { "vector_size", 1, 1, false, true, false,
817 handle_vector_size_attribute },
818 { "visibility", 1, 1, true, false, false,
819 handle_visibility_attribute },
820 { "nonnull", 0, -1, false, true, true,
821 handle_nonnull_attribute },
822 { "nothrow", 0, 0, true, false, false,
823 handle_nothrow_attribute },
824 { "may_alias", 0, 0, false, true, false, NULL },
825 { NULL, 0, 0, false, false, false, NULL }
828 /* Give the specifications for the format attributes, used by C and all
829 descendents. */
831 const struct attribute_spec c_common_format_attribute_table[] =
833 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
834 { "format", 3, 3, false, true, true,
835 handle_format_attribute },
836 { "format_arg", 1, 1, false, true, true,
837 handle_format_arg_attribute },
838 { NULL, 0, 0, false, false, false, NULL }
841 /* Record the start of an if-then, and record the start of it
842 for ambiguous else detection.
844 COND is the condition for the if-then statement.
846 IF_STMT is the statement node that has already been created for
847 this if-then statement. It is created before parsing the
848 condition to keep line number information accurate. */
850 void
851 c_expand_start_cond (cond, compstmt_count, if_stmt)
852 tree cond;
853 int compstmt_count;
854 tree if_stmt;
856 /* Make sure there is enough space on the stack. */
857 if (if_stack_space == 0)
859 if_stack_space = 10;
860 if_stack = (if_elt *) xmalloc (10 * sizeof (if_elt));
862 else if (if_stack_space == if_stack_pointer)
864 if_stack_space += 10;
865 if_stack = (if_elt *) xrealloc (if_stack, if_stack_space * sizeof (if_elt));
868 IF_COND (if_stmt) = cond;
869 add_stmt (if_stmt);
871 /* Record this if statement. */
872 if_stack[if_stack_pointer].compstmt_count = compstmt_count;
873 if_stack[if_stack_pointer].file = input_filename;
874 if_stack[if_stack_pointer].line = lineno;
875 if_stack[if_stack_pointer].needs_warning = 0;
876 if_stack[if_stack_pointer].if_stmt = if_stmt;
877 if_stack_pointer++;
880 /* Called after the then-clause for an if-statement is processed. */
882 void
883 c_finish_then ()
885 tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
886 RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt));
889 /* Record the end of an if-then. Optionally warn if a nested
890 if statement had an ambiguous else clause. */
892 void
893 c_expand_end_cond ()
895 if_stack_pointer--;
896 if (if_stack[if_stack_pointer].needs_warning)
897 warning_with_file_and_line (if_stack[if_stack_pointer].file,
898 if_stack[if_stack_pointer].line,
899 "suggest explicit braces to avoid ambiguous `else'");
900 last_expr_type = NULL_TREE;
903 /* Called between the then-clause and the else-clause
904 of an if-then-else. */
906 void
907 c_expand_start_else ()
909 /* An ambiguous else warning must be generated for the enclosing if
910 statement, unless we see an else branch for that one, too. */
911 if (warn_parentheses
912 && if_stack_pointer > 1
913 && (if_stack[if_stack_pointer - 1].compstmt_count
914 == if_stack[if_stack_pointer - 2].compstmt_count))
915 if_stack[if_stack_pointer - 2].needs_warning = 1;
917 /* Even if a nested if statement had an else branch, it can't be
918 ambiguous if this one also has an else. So don't warn in that
919 case. Also don't warn for any if statements nested in this else. */
920 if_stack[if_stack_pointer - 1].needs_warning = 0;
921 if_stack[if_stack_pointer - 1].compstmt_count--;
924 /* Called after the else-clause for an if-statement is processed. */
926 void
927 c_finish_else ()
929 tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
930 RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt));
933 /* Begin an if-statement. Returns a newly created IF_STMT if
934 appropriate.
936 Unlike the C++ front-end, we do not call add_stmt here; it is
937 probably safe to do so, but I am not very familiar with this
938 code so I am being extra careful not to change its behavior
939 beyond what is strictly necessary for correctness. */
941 tree
942 c_begin_if_stmt ()
944 tree r;
945 r = build_stmt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
946 return r;
949 /* Begin a while statement. Returns a newly created WHILE_STMT if
950 appropriate.
952 Unlike the C++ front-end, we do not call add_stmt here; it is
953 probably safe to do so, but I am not very familiar with this
954 code so I am being extra careful not to change its behavior
955 beyond what is strictly necessary for correctness. */
957 tree
958 c_begin_while_stmt ()
960 tree r;
961 r = build_stmt (WHILE_STMT, NULL_TREE, NULL_TREE);
962 return r;
965 void
966 c_finish_while_stmt_cond (cond, while_stmt)
967 tree while_stmt;
968 tree cond;
970 WHILE_COND (while_stmt) = cond;
973 /* Push current bindings for the function name VAR_DECLS. */
975 void
976 start_fname_decls ()
978 unsigned ix;
979 tree saved = NULL_TREE;
981 for (ix = 0; fname_vars[ix].decl; ix++)
983 tree decl = *fname_vars[ix].decl;
985 if (decl)
987 saved = tree_cons (decl, build_int_2 (ix, 0), saved);
988 *fname_vars[ix].decl = NULL_TREE;
991 if (saved || saved_function_name_decls)
992 /* Normally they'll have been NULL, so only push if we've got a
993 stack, or they are non-NULL. */
994 saved_function_name_decls = tree_cons (saved, NULL_TREE,
995 saved_function_name_decls);
998 /* Finish up the current bindings, adding them into the
999 current function's statement tree. This is done by wrapping the
1000 function's body in a COMPOUND_STMT containing these decls too. This
1001 must be done _before_ finish_stmt_tree is called. If there is no
1002 current function, we must be at file scope and no statements are
1003 involved. Pop the previous bindings. */
1005 void
1006 finish_fname_decls ()
1008 unsigned ix;
1009 tree body = NULL_TREE;
1010 tree stack = saved_function_name_decls;
1012 for (; stack && TREE_VALUE (stack); stack = TREE_CHAIN (stack))
1013 body = chainon (TREE_VALUE (stack), body);
1015 if (body)
1017 /* They were called into existence, so add to statement tree. */
1018 body = chainon (body,
1019 TREE_CHAIN (DECL_SAVED_TREE (current_function_decl)));
1020 body = build_stmt (COMPOUND_STMT, body);
1022 COMPOUND_STMT_NO_SCOPE (body) = 1;
1023 TREE_CHAIN (DECL_SAVED_TREE (current_function_decl)) = body;
1026 for (ix = 0; fname_vars[ix].decl; ix++)
1027 *fname_vars[ix].decl = NULL_TREE;
1029 if (stack)
1031 /* We had saved values, restore them. */
1032 tree saved;
1034 for (saved = TREE_PURPOSE (stack); saved; saved = TREE_CHAIN (saved))
1036 tree decl = TREE_PURPOSE (saved);
1037 unsigned ix = TREE_INT_CST_LOW (TREE_VALUE (saved));
1039 *fname_vars[ix].decl = decl;
1041 stack = TREE_CHAIN (stack);
1043 saved_function_name_decls = stack;
1046 /* Return the text name of the current function, suitable prettified
1047 by PRETTY_P. */
1049 const char *
1050 fname_as_string (pretty_p)
1051 int pretty_p;
1053 const char *name = NULL;
1055 if (pretty_p)
1056 name = (current_function_decl
1057 ? (*lang_hooks.decl_printable_name) (current_function_decl, 2)
1058 : "top level");
1059 else if (current_function_decl && DECL_NAME (current_function_decl))
1060 name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
1061 else
1062 name = "";
1063 return name;
1066 /* Return the text name of the current function, formatted as
1067 required by the supplied RID value. */
1069 const char *
1070 fname_string (rid)
1071 unsigned rid;
1073 unsigned ix;
1075 for (ix = 0; fname_vars[ix].decl; ix++)
1076 if (fname_vars[ix].rid == rid)
1077 break;
1078 return fname_as_string (fname_vars[ix].pretty);
1081 /* Return the VAR_DECL for a const char array naming the current
1082 function. If the VAR_DECL has not yet been created, create it
1083 now. RID indicates how it should be formatted and IDENTIFIER_NODE
1084 ID is its name (unfortunately C and C++ hold the RID values of
1085 keywords in different places, so we can't derive RID from ID in
1086 this language independent code. */
1088 tree
1089 fname_decl (rid, id)
1090 unsigned rid;
1091 tree id;
1093 unsigned ix;
1094 tree decl = NULL_TREE;
1096 for (ix = 0; fname_vars[ix].decl; ix++)
1097 if (fname_vars[ix].rid == rid)
1098 break;
1100 decl = *fname_vars[ix].decl;
1101 if (!decl)
1103 tree saved_last_tree = last_tree;
1104 /* If a tree is built here, it would normally have the lineno of
1105 the current statement. Later this tree will be moved to the
1106 beginning of the function and this line number will be wrong.
1107 To avoid this problem set the lineno to 0 here; that prevents
1108 it from appearing in the RTL. */
1109 int saved_lineno = lineno;
1110 lineno = 0;
1112 decl = (*make_fname_decl) (id, fname_vars[ix].pretty);
1113 if (last_tree != saved_last_tree)
1115 /* We created some statement tree for the decl. This belongs
1116 at the start of the function, so remove it now and reinsert
1117 it after the function is complete. */
1118 tree stmts = TREE_CHAIN (saved_last_tree);
1120 TREE_CHAIN (saved_last_tree) = NULL_TREE;
1121 last_tree = saved_last_tree;
1122 saved_function_name_decls = tree_cons (decl, stmts,
1123 saved_function_name_decls);
1125 *fname_vars[ix].decl = decl;
1126 lineno = saved_lineno;
1128 if (!ix && !current_function_decl)
1129 pedwarn_with_decl (decl, "`%s' is not defined outside of function scope");
1131 return decl;
1134 /* Given a STRING_CST, give it a suitable array-of-chars data type. */
1136 tree
1137 fix_string_type (value)
1138 tree value;
1140 const int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
1141 const int wide_flag = TREE_TYPE (value) == wchar_array_type_node;
1142 const int nchars_max = flag_isoc99 ? 4095 : 509;
1143 int length = TREE_STRING_LENGTH (value);
1144 int nchars;
1146 /* Compute the number of elements, for the array type. */
1147 nchars = wide_flag ? length / wchar_bytes : length;
1149 if (pedantic && nchars - 1 > nchars_max && c_language == clk_c)
1150 pedwarn ("string length `%d' is greater than the length `%d' ISO C%d compilers are required to support",
1151 nchars - 1, nchars_max, flag_isoc99 ? 99 : 89);
1153 /* Create the array type for the string constant.
1154 -Wwrite-strings says make the string constant an array of const char
1155 so that copying it to a non-const pointer will get a warning.
1156 For C++, this is the standard behavior. */
1157 if (flag_const_strings && ! flag_writable_strings)
1159 tree elements
1160 = build_type_variant (wide_flag ? wchar_type_node : char_type_node,
1161 1, 0);
1162 TREE_TYPE (value)
1163 = build_array_type (elements,
1164 build_index_type (build_int_2 (nchars - 1, 0)));
1166 else
1167 TREE_TYPE (value)
1168 = build_array_type (wide_flag ? wchar_type_node : char_type_node,
1169 build_index_type (build_int_2 (nchars - 1, 0)));
1171 TREE_CONSTANT (value) = 1;
1172 TREE_READONLY (value) = ! flag_writable_strings;
1173 TREE_STATIC (value) = 1;
1174 return value;
1177 /* Given a VARRAY of STRING_CST nodes, concatenate them into one
1178 STRING_CST. */
1180 tree
1181 combine_strings (strings)
1182 varray_type strings;
1184 const int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
1185 const int nstrings = VARRAY_ACTIVE_SIZE (strings);
1186 tree value, t;
1187 int length = 1;
1188 int wide_length = 0;
1189 int wide_flag = 0;
1190 int i;
1191 char *p, *q;
1193 /* Don't include the \0 at the end of each substring. Count wide
1194 strings and ordinary strings separately. */
1195 for (i = 0; i < nstrings; ++i)
1197 t = VARRAY_TREE (strings, i);
1199 if (TREE_TYPE (t) == wchar_array_type_node)
1201 wide_length += TREE_STRING_LENGTH (t) - wchar_bytes;
1202 wide_flag = 1;
1204 else
1206 length += (TREE_STRING_LENGTH (t) - 1);
1207 if (C_ARTIFICIAL_STRING_P (t) && !in_system_header)
1208 warning ("concatenation of string literals with __FUNCTION__ is deprecated");
1212 /* If anything is wide, the non-wides will be converted,
1213 which makes them take more space. */
1214 if (wide_flag)
1215 length = length * wchar_bytes + wide_length;
1217 p = xmalloc (length);
1219 /* Copy the individual strings into the new combined string.
1220 If the combined string is wide, convert the chars to ints
1221 for any individual strings that are not wide. */
1223 q = p;
1224 for (i = 0; i < nstrings; ++i)
1226 int len, this_wide;
1228 t = VARRAY_TREE (strings, i);
1229 this_wide = TREE_TYPE (t) == wchar_array_type_node;
1230 len = TREE_STRING_LENGTH (t) - (this_wide ? wchar_bytes : 1);
1231 if (this_wide == wide_flag)
1233 memcpy (q, TREE_STRING_POINTER (t), len);
1234 q += len;
1236 else
1238 const int nzeros = (TYPE_PRECISION (wchar_type_node)
1239 / BITS_PER_UNIT) - 1;
1240 int j, k;
1242 if (BYTES_BIG_ENDIAN)
1244 for (k = 0; k < len; k++)
1246 for (j = 0; j < nzeros; j++)
1247 *q++ = 0;
1248 *q++ = TREE_STRING_POINTER (t)[k];
1251 else
1253 for (k = 0; k < len; k++)
1255 *q++ = TREE_STRING_POINTER (t)[k];
1256 for (j = 0; j < nzeros; j++)
1257 *q++ = 0;
1263 /* Nul terminate the string. */
1264 if (wide_flag)
1266 for (i = 0; i < wchar_bytes; i++)
1267 *q++ = 0;
1269 else
1270 *q = 0;
1272 value = build_string (length, p);
1273 free (p);
1275 if (wide_flag)
1276 TREE_TYPE (value) = wchar_array_type_node;
1277 else
1278 TREE_TYPE (value) = char_array_type_node;
1280 return value;
1283 static int is_valid_printf_arglist PARAMS ((tree));
1284 static rtx c_expand_builtin PARAMS ((tree, rtx, enum machine_mode, enum expand_modifier));
1285 static rtx c_expand_builtin_printf PARAMS ((tree, rtx, enum machine_mode,
1286 enum expand_modifier, int, int));
1287 static rtx c_expand_builtin_fprintf PARAMS ((tree, rtx, enum machine_mode,
1288 enum expand_modifier, int, int));
1290 /* Print a warning if a constant expression had overflow in folding.
1291 Invoke this function on every expression that the language
1292 requires to be a constant expression.
1293 Note the ANSI C standard says it is erroneous for a
1294 constant expression to overflow. */
1296 void
1297 constant_expression_warning (value)
1298 tree value;
1300 if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
1301 || TREE_CODE (value) == VECTOR_CST
1302 || TREE_CODE (value) == COMPLEX_CST)
1303 && TREE_CONSTANT_OVERFLOW (value) && pedantic)
1304 pedwarn ("overflow in constant expression");
1307 /* Print a warning if an expression had overflow in folding.
1308 Invoke this function on every expression that
1309 (1) appears in the source code, and
1310 (2) might be a constant expression that overflowed, and
1311 (3) is not already checked by convert_and_check;
1312 however, do not invoke this function on operands of explicit casts. */
1314 void
1315 overflow_warning (value)
1316 tree value;
1318 if ((TREE_CODE (value) == INTEGER_CST
1319 || (TREE_CODE (value) == COMPLEX_CST
1320 && TREE_CODE (TREE_REALPART (value)) == INTEGER_CST))
1321 && TREE_OVERFLOW (value))
1323 TREE_OVERFLOW (value) = 0;
1324 if (skip_evaluation == 0)
1325 warning ("integer overflow in expression");
1327 else if ((TREE_CODE (value) == REAL_CST
1328 || (TREE_CODE (value) == COMPLEX_CST
1329 && TREE_CODE (TREE_REALPART (value)) == REAL_CST))
1330 && TREE_OVERFLOW (value))
1332 TREE_OVERFLOW (value) = 0;
1333 if (skip_evaluation == 0)
1334 warning ("floating point overflow in expression");
1336 else if (TREE_CODE (value) == VECTOR_CST && TREE_OVERFLOW (value))
1338 TREE_OVERFLOW (value) = 0;
1339 if (skip_evaluation == 0)
1340 warning ("vector overflow in expression");
1344 /* Print a warning if a large constant is truncated to unsigned,
1345 or if -Wconversion is used and a constant < 0 is converted to unsigned.
1346 Invoke this function on every expression that might be implicitly
1347 converted to an unsigned type. */
1349 void
1350 unsigned_conversion_warning (result, operand)
1351 tree result, operand;
1353 tree type = TREE_TYPE (result);
1355 if (TREE_CODE (operand) == INTEGER_CST
1356 && TREE_CODE (type) == INTEGER_TYPE
1357 && TREE_UNSIGNED (type)
1358 && skip_evaluation == 0
1359 && !int_fits_type_p (operand, type))
1361 if (!int_fits_type_p (operand, c_common_signed_type (type)))
1362 /* This detects cases like converting -129 or 256 to unsigned char. */
1363 warning ("large integer implicitly truncated to unsigned type");
1364 else if (warn_conversion)
1365 warning ("negative integer implicitly converted to unsigned type");
1369 /* Nonzero if constant C has a value that is permissible
1370 for type TYPE (an INTEGER_TYPE). */
1372 static int
1373 constant_fits_type_p (c, type)
1374 tree c, type;
1376 if (TREE_CODE (c) == INTEGER_CST)
1377 return int_fits_type_p (c, type);
1379 c = convert (type, c);
1380 return !TREE_OVERFLOW (c);
1383 /* Convert EXPR to TYPE, warning about conversion problems with constants.
1384 Invoke this function on every expression that is converted implicitly,
1385 i.e. because of language rules and not because of an explicit cast. */
1387 tree
1388 convert_and_check (type, expr)
1389 tree type, expr;
1391 tree t = convert (type, expr);
1392 if (TREE_CODE (t) == INTEGER_CST)
1394 if (TREE_OVERFLOW (t))
1396 TREE_OVERFLOW (t) = 0;
1398 /* Do not diagnose overflow in a constant expression merely
1399 because a conversion overflowed. */
1400 TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (expr);
1402 /* No warning for converting 0x80000000 to int. */
1403 if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr))
1404 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
1405 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
1406 /* If EXPR fits in the unsigned version of TYPE,
1407 don't warn unless pedantic. */
1408 if ((pedantic
1409 || TREE_UNSIGNED (type)
1410 || ! constant_fits_type_p (expr,
1411 c_common_unsigned_type (type)))
1412 && skip_evaluation == 0)
1413 warning ("overflow in implicit constant conversion");
1415 else
1416 unsigned_conversion_warning (t, expr);
1418 return t;
1421 /* A node in a list that describes references to variables (EXPR), which are
1422 either read accesses if WRITER is zero, or write accesses, in which case
1423 WRITER is the parent of EXPR. */
1424 struct tlist
1426 struct tlist *next;
1427 tree expr, writer;
1430 /* Used to implement a cache the results of a call to verify_tree. We only
1431 use this for SAVE_EXPRs. */
1432 struct tlist_cache
1434 struct tlist_cache *next;
1435 struct tlist *cache_before_sp;
1436 struct tlist *cache_after_sp;
1437 tree expr;
1440 /* Obstack to use when allocating tlist structures, and corresponding
1441 firstobj. */
1442 static struct obstack tlist_obstack;
1443 static char *tlist_firstobj = 0;
1445 /* Keep track of the identifiers we've warned about, so we can avoid duplicate
1446 warnings. */
1447 static struct tlist *warned_ids;
1448 /* SAVE_EXPRs need special treatment. We process them only once and then
1449 cache the results. */
1450 static struct tlist_cache *save_expr_cache;
1452 static void add_tlist PARAMS ((struct tlist **, struct tlist *, tree, int));
1453 static void merge_tlist PARAMS ((struct tlist **, struct tlist *, int));
1454 static void verify_tree PARAMS ((tree, struct tlist **, struct tlist **, tree));
1455 static int warning_candidate_p PARAMS ((tree));
1456 static void warn_for_collisions PARAMS ((struct tlist *));
1457 static void warn_for_collisions_1 PARAMS ((tree, tree, struct tlist *, int));
1458 static struct tlist *new_tlist PARAMS ((struct tlist *, tree, tree));
1459 static void verify_sequence_points PARAMS ((tree));
1461 /* Create a new struct tlist and fill in its fields. */
1462 static struct tlist *
1463 new_tlist (next, t, writer)
1464 struct tlist *next;
1465 tree t;
1466 tree writer;
1468 struct tlist *l;
1469 l = (struct tlist *) obstack_alloc (&tlist_obstack, sizeof *l);
1470 l->next = next;
1471 l->expr = t;
1472 l->writer = writer;
1473 return l;
1476 /* Add duplicates of the nodes found in ADD to the list *TO. If EXCLUDE_WRITER
1477 is nonnull, we ignore any node we find which has a writer equal to it. */
1479 static void
1480 add_tlist (to, add, exclude_writer, copy)
1481 struct tlist **to;
1482 struct tlist *add;
1483 tree exclude_writer;
1484 int copy;
1486 while (add)
1488 struct tlist *next = add->next;
1489 if (! copy)
1490 add->next = *to;
1491 if (! exclude_writer || add->writer != exclude_writer)
1492 *to = copy ? new_tlist (*to, add->expr, add->writer) : add;
1493 add = next;
1497 /* Merge the nodes of ADD into TO. This merging process is done so that for
1498 each variable that already exists in TO, no new node is added; however if
1499 there is a write access recorded in ADD, and an occurrence on TO is only
1500 a read access, then the occurrence in TO will be modified to record the
1501 write. */
1503 static void
1504 merge_tlist (to, add, copy)
1505 struct tlist **to;
1506 struct tlist *add;
1507 int copy;
1509 struct tlist **end = to;
1511 while (*end)
1512 end = &(*end)->next;
1514 while (add)
1516 int found = 0;
1517 struct tlist *tmp2;
1518 struct tlist *next = add->next;
1520 for (tmp2 = *to; tmp2; tmp2 = tmp2->next)
1521 if (tmp2->expr == add->expr)
1523 found = 1;
1524 if (! tmp2->writer)
1525 tmp2->writer = add->writer;
1527 if (! found)
1529 *end = copy ? add : new_tlist (NULL, add->expr, add->writer);
1530 end = &(*end)->next;
1531 *end = 0;
1533 add = next;
1537 /* WRITTEN is a variable, WRITER is its parent. Warn if any of the variable
1538 references in list LIST conflict with it, excluding reads if ONLY writers
1539 is nonzero. */
1541 static void
1542 warn_for_collisions_1 (written, writer, list, only_writes)
1543 tree written, writer;
1544 struct tlist *list;
1545 int only_writes;
1547 struct tlist *tmp;
1549 /* Avoid duplicate warnings. */
1550 for (tmp = warned_ids; tmp; tmp = tmp->next)
1551 if (tmp->expr == written)
1552 return;
1554 while (list)
1556 if (list->expr == written
1557 && list->writer != writer
1558 && (! only_writes || list->writer))
1560 warned_ids = new_tlist (warned_ids, written, NULL_TREE);
1561 warning ("operation on `%s' may be undefined",
1562 IDENTIFIER_POINTER (DECL_NAME (list->expr)));
1564 list = list->next;
1568 /* Given a list LIST of references to variables, find whether any of these
1569 can cause conflicts due to missing sequence points. */
1571 static void
1572 warn_for_collisions (list)
1573 struct tlist *list;
1575 struct tlist *tmp;
1577 for (tmp = list; tmp; tmp = tmp->next)
1579 if (tmp->writer)
1580 warn_for_collisions_1 (tmp->expr, tmp->writer, list, 0);
1584 /* Return nonzero if X is a tree that can be verified by the sequence point
1585 warnings. */
1586 static int
1587 warning_candidate_p (x)
1588 tree x;
1590 return TREE_CODE (x) == VAR_DECL || TREE_CODE (x) == PARM_DECL;
1593 /* Walk the tree X, and record accesses to variables. If X is written by the
1594 parent tree, WRITER is the parent.
1595 We store accesses in one of the two lists: PBEFORE_SP, and PNO_SP. If this
1596 expression or its only operand forces a sequence point, then everything up
1597 to the sequence point is stored in PBEFORE_SP. Everything else gets stored
1598 in PNO_SP.
1599 Once we return, we will have emitted warnings if any subexpression before
1600 such a sequence point could be undefined. On a higher level, however, the
1601 sequence point may not be relevant, and we'll merge the two lists.
1603 Example: (b++, a) + b;
1604 The call that processes the COMPOUND_EXPR will store the increment of B
1605 in PBEFORE_SP, and the use of A in PNO_SP. The higher-level call that
1606 processes the PLUS_EXPR will need to merge the two lists so that
1607 eventually, all accesses end up on the same list (and we'll warn about the
1608 unordered subexpressions b++ and b.
1610 A note on merging. If we modify the former example so that our expression
1611 becomes
1612 (b++, b) + a
1613 care must be taken not simply to add all three expressions into the final
1614 PNO_SP list. The function merge_tlist takes care of that by merging the
1615 before-SP list of the COMPOUND_EXPR into its after-SP list in a special
1616 way, so that no more than one access to B is recorded. */
1618 static void
1619 verify_tree (x, pbefore_sp, pno_sp, writer)
1620 tree x;
1621 struct tlist **pbefore_sp, **pno_sp;
1622 tree writer;
1624 struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3;
1625 enum tree_code code;
1626 char class;
1628 /* X may be NULL if it is the operand of an empty statement expression
1629 ({ }). */
1630 if (x == NULL)
1631 return;
1633 restart:
1634 code = TREE_CODE (x);
1635 class = TREE_CODE_CLASS (code);
1637 if (warning_candidate_p (x))
1639 *pno_sp = new_tlist (*pno_sp, x, writer);
1640 return;
1643 switch (code)
1645 case CONSTRUCTOR:
1646 return;
1648 case COMPOUND_EXPR:
1649 case TRUTH_ANDIF_EXPR:
1650 case TRUTH_ORIF_EXPR:
1651 tmp_before = tmp_nosp = tmp_list3 = 0;
1652 verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1653 warn_for_collisions (tmp_nosp);
1654 merge_tlist (pbefore_sp, tmp_before, 0);
1655 merge_tlist (pbefore_sp, tmp_nosp, 0);
1656 verify_tree (TREE_OPERAND (x, 1), &tmp_list3, pno_sp, NULL_TREE);
1657 merge_tlist (pbefore_sp, tmp_list3, 0);
1658 return;
1660 case COND_EXPR:
1661 tmp_before = tmp_list2 = 0;
1662 verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_list2, NULL_TREE);
1663 warn_for_collisions (tmp_list2);
1664 merge_tlist (pbefore_sp, tmp_before, 0);
1665 merge_tlist (pbefore_sp, tmp_list2, 1);
1667 tmp_list3 = tmp_nosp = 0;
1668 verify_tree (TREE_OPERAND (x, 1), &tmp_list3, &tmp_nosp, NULL_TREE);
1669 warn_for_collisions (tmp_nosp);
1670 merge_tlist (pbefore_sp, tmp_list3, 0);
1672 tmp_list3 = tmp_list2 = 0;
1673 verify_tree (TREE_OPERAND (x, 2), &tmp_list3, &tmp_list2, NULL_TREE);
1674 warn_for_collisions (tmp_list2);
1675 merge_tlist (pbefore_sp, tmp_list3, 0);
1676 /* Rather than add both tmp_nosp and tmp_list2, we have to merge the
1677 two first, to avoid warning for (a ? b++ : b++). */
1678 merge_tlist (&tmp_nosp, tmp_list2, 0);
1679 add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1680 return;
1682 case PREDECREMENT_EXPR:
1683 case PREINCREMENT_EXPR:
1684 case POSTDECREMENT_EXPR:
1685 case POSTINCREMENT_EXPR:
1686 verify_tree (TREE_OPERAND (x, 0), pno_sp, pno_sp, x);
1687 return;
1689 case MODIFY_EXPR:
1690 tmp_before = tmp_nosp = tmp_list3 = 0;
1691 verify_tree (TREE_OPERAND (x, 1), &tmp_before, &tmp_nosp, NULL_TREE);
1692 verify_tree (TREE_OPERAND (x, 0), &tmp_list3, &tmp_list3, x);
1693 /* Expressions inside the LHS are not ordered wrt. the sequence points
1694 in the RHS. Example:
1695 *a = (a++, 2)
1696 Despite the fact that the modification of "a" is in the before_sp
1697 list (tmp_before), it conflicts with the use of "a" in the LHS.
1698 We can handle this by adding the contents of tmp_list3
1699 to those of tmp_before, and redoing the collision warnings for that
1700 list. */
1701 add_tlist (&tmp_before, tmp_list3, x, 1);
1702 warn_for_collisions (tmp_before);
1703 /* Exclude the LHS itself here; we first have to merge it into the
1704 tmp_nosp list. This is done to avoid warning for "a = a"; if we
1705 didn't exclude the LHS, we'd get it twice, once as a read and once
1706 as a write. */
1707 add_tlist (pno_sp, tmp_list3, x, 0);
1708 warn_for_collisions_1 (TREE_OPERAND (x, 0), x, tmp_nosp, 1);
1710 merge_tlist (pbefore_sp, tmp_before, 0);
1711 if (warning_candidate_p (TREE_OPERAND (x, 0)))
1712 merge_tlist (&tmp_nosp, new_tlist (NULL, TREE_OPERAND (x, 0), x), 0);
1713 add_tlist (pno_sp, tmp_nosp, NULL_TREE, 1);
1714 return;
1716 case CALL_EXPR:
1717 /* We need to warn about conflicts among arguments and conflicts between
1718 args and the function address. Side effects of the function address,
1719 however, are not ordered by the sequence point of the call. */
1720 tmp_before = tmp_nosp = tmp_list2 = tmp_list3 = 0;
1721 verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1722 if (TREE_OPERAND (x, 1))
1723 verify_tree (TREE_OPERAND (x, 1), &tmp_list2, &tmp_list3, NULL_TREE);
1724 merge_tlist (&tmp_list3, tmp_list2, 0);
1725 add_tlist (&tmp_before, tmp_list3, NULL_TREE, 0);
1726 add_tlist (&tmp_before, tmp_nosp, NULL_TREE, 0);
1727 warn_for_collisions (tmp_before);
1728 add_tlist (pbefore_sp, tmp_before, NULL_TREE, 0);
1729 return;
1731 case TREE_LIST:
1732 /* Scan all the list, e.g. indices of multi dimensional array. */
1733 while (x)
1735 tmp_before = tmp_nosp = 0;
1736 verify_tree (TREE_VALUE (x), &tmp_before, &tmp_nosp, NULL_TREE);
1737 merge_tlist (&tmp_nosp, tmp_before, 0);
1738 add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1739 x = TREE_CHAIN (x);
1741 return;
1743 case SAVE_EXPR:
1745 struct tlist_cache *t;
1746 for (t = save_expr_cache; t; t = t->next)
1747 if (t->expr == x)
1748 break;
1750 if (! t)
1752 t = (struct tlist_cache *) obstack_alloc (&tlist_obstack,
1753 sizeof *t);
1754 t->next = save_expr_cache;
1755 t->expr = x;
1756 save_expr_cache = t;
1758 tmp_before = tmp_nosp = 0;
1759 verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1760 warn_for_collisions (tmp_nosp);
1762 tmp_list3 = 0;
1763 while (tmp_nosp)
1765 struct tlist *t = tmp_nosp;
1766 tmp_nosp = t->next;
1767 merge_tlist (&tmp_list3, t, 0);
1769 t->cache_before_sp = tmp_before;
1770 t->cache_after_sp = tmp_list3;
1772 merge_tlist (pbefore_sp, t->cache_before_sp, 1);
1773 add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1);
1774 return;
1776 default:
1777 break;
1780 if (class == '1')
1782 if (first_rtl_op (code) == 0)
1783 return;
1784 x = TREE_OPERAND (x, 0);
1785 writer = 0;
1786 goto restart;
1789 switch (class)
1791 case 'r':
1792 case '<':
1793 case '2':
1794 case 'b':
1795 case 'e':
1796 case 's':
1797 case 'x':
1799 int lp;
1800 int max = first_rtl_op (TREE_CODE (x));
1801 for (lp = 0; lp < max; lp++)
1803 tmp_before = tmp_nosp = 0;
1804 verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, NULL_TREE);
1805 merge_tlist (&tmp_nosp, tmp_before, 0);
1806 add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1808 break;
1813 /* Try to warn for undefined behaviour in EXPR due to missing sequence
1814 points. */
1816 static void
1817 verify_sequence_points (expr)
1818 tree expr;
1820 struct tlist *before_sp = 0, *after_sp = 0;
1822 warned_ids = 0;
1823 save_expr_cache = 0;
1824 if (tlist_firstobj == 0)
1826 gcc_obstack_init (&tlist_obstack);
1827 tlist_firstobj = obstack_alloc (&tlist_obstack, 0);
1830 verify_tree (expr, &before_sp, &after_sp, 0);
1831 warn_for_collisions (after_sp);
1832 obstack_free (&tlist_obstack, tlist_firstobj);
1835 tree
1836 c_expand_expr_stmt (expr)
1837 tree expr;
1839 /* Do default conversion if safe and possibly important,
1840 in case within ({...}). */
1841 if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
1842 && (flag_isoc99 || lvalue_p (expr)))
1843 || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
1844 expr = default_conversion (expr);
1846 if (warn_sequence_point)
1847 verify_sequence_points (expr);
1849 if (TREE_TYPE (expr) != error_mark_node
1850 && !COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (expr))
1851 && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
1852 error ("expression statement has incomplete type");
1854 last_expr_type = TREE_TYPE (expr);
1855 return add_stmt (build_stmt (EXPR_STMT, expr));
1858 /* Validate the expression after `case' and apply default promotions. */
1860 tree
1861 check_case_value (value)
1862 tree value;
1864 if (value == NULL_TREE)
1865 return value;
1867 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
1868 STRIP_TYPE_NOPS (value);
1869 /* In C++, the following is allowed:
1871 const int i = 3;
1872 switch (...) { case i: ... }
1874 So, we try to reduce the VALUE to a constant that way. */
1875 if (c_language == clk_cplusplus)
1877 value = decl_constant_value (value);
1878 STRIP_TYPE_NOPS (value);
1879 value = fold (value);
1882 if (TREE_CODE (value) != INTEGER_CST
1883 && value != error_mark_node)
1885 error ("case label does not reduce to an integer constant");
1886 value = error_mark_node;
1888 else
1889 /* Promote char or short to int. */
1890 value = default_conversion (value);
1892 constant_expression_warning (value);
1894 return value;
1897 /* Return an integer type with BITS bits of precision,
1898 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
1900 tree
1901 c_common_type_for_size (bits, unsignedp)
1902 unsigned bits;
1903 int unsignedp;
1905 if (bits == TYPE_PRECISION (integer_type_node))
1906 return unsignedp ? unsigned_type_node : integer_type_node;
1908 if (bits == TYPE_PRECISION (signed_char_type_node))
1909 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1911 if (bits == TYPE_PRECISION (short_integer_type_node))
1912 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1914 if (bits == TYPE_PRECISION (long_integer_type_node))
1915 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1917 if (bits == TYPE_PRECISION (long_long_integer_type_node))
1918 return (unsignedp ? long_long_unsigned_type_node
1919 : long_long_integer_type_node);
1921 if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
1922 return (unsignedp ? widest_unsigned_literal_type_node
1923 : widest_integer_literal_type_node);
1925 if (bits <= TYPE_PRECISION (intQI_type_node))
1926 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1928 if (bits <= TYPE_PRECISION (intHI_type_node))
1929 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1931 if (bits <= TYPE_PRECISION (intSI_type_node))
1932 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1934 if (bits <= TYPE_PRECISION (intDI_type_node))
1935 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1937 return 0;
1940 /* Return a data type that has machine mode MODE.
1941 If the mode is an integer,
1942 then UNSIGNEDP selects between signed and unsigned types. */
1944 tree
1945 c_common_type_for_mode (mode, unsignedp)
1946 enum machine_mode mode;
1947 int unsignedp;
1949 if (mode == TYPE_MODE (integer_type_node))
1950 return unsignedp ? unsigned_type_node : integer_type_node;
1952 if (mode == TYPE_MODE (signed_char_type_node))
1953 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1955 if (mode == TYPE_MODE (short_integer_type_node))
1956 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1958 if (mode == TYPE_MODE (long_integer_type_node))
1959 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1961 if (mode == TYPE_MODE (long_long_integer_type_node))
1962 return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
1964 if (mode == TYPE_MODE (widest_integer_literal_type_node))
1965 return unsignedp ? widest_unsigned_literal_type_node
1966 : widest_integer_literal_type_node;
1968 if (mode == QImode)
1969 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1971 if (mode == HImode)
1972 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1974 if (mode == SImode)
1975 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1977 if (mode == DImode)
1978 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1980 #if HOST_BITS_PER_WIDE_INT >= 64
1981 if (mode == TYPE_MODE (intTI_type_node))
1982 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
1983 #endif
1985 if (mode == TYPE_MODE (float_type_node))
1986 return float_type_node;
1988 if (mode == TYPE_MODE (double_type_node))
1989 return double_type_node;
1991 if (mode == TYPE_MODE (long_double_type_node))
1992 return long_double_type_node;
1994 if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
1995 return build_pointer_type (char_type_node);
1997 if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
1998 return build_pointer_type (integer_type_node);
2000 switch (mode)
2002 case V16QImode:
2003 return unsignedp ? unsigned_V16QI_type_node : V16QI_type_node;
2004 case V8HImode:
2005 return unsignedp ? unsigned_V8HI_type_node : V8HI_type_node;
2006 case V4SImode:
2007 return unsignedp ? unsigned_V4SI_type_node : V4SI_type_node;
2008 case V2DImode:
2009 return unsignedp ? unsigned_V2DI_type_node : V2DI_type_node;
2010 case V2SImode:
2011 return unsignedp ? unsigned_V2SI_type_node : V2SI_type_node;
2012 case V4HImode:
2013 return unsignedp ? unsigned_V4HI_type_node : V4HI_type_node;
2014 case V8QImode:
2015 return unsignedp ? unsigned_V8QI_type_node : V8QI_type_node;
2016 case V16SFmode:
2017 return V16SF_type_node;
2018 case V4SFmode:
2019 return V4SF_type_node;
2020 case V2SFmode:
2021 return V2SF_type_node;
2022 case V2DFmode:
2023 return V2DF_type_node;
2024 default:
2025 break;
2028 return 0;
2031 /* Return an unsigned type the same as TYPE in other respects. */
2032 tree
2033 c_common_unsigned_type (type)
2034 tree type;
2036 tree type1 = TYPE_MAIN_VARIANT (type);
2037 if (type1 == signed_char_type_node || type1 == char_type_node)
2038 return unsigned_char_type_node;
2039 if (type1 == integer_type_node)
2040 return unsigned_type_node;
2041 if (type1 == short_integer_type_node)
2042 return short_unsigned_type_node;
2043 if (type1 == long_integer_type_node)
2044 return long_unsigned_type_node;
2045 if (type1 == long_long_integer_type_node)
2046 return long_long_unsigned_type_node;
2047 if (type1 == widest_integer_literal_type_node)
2048 return widest_unsigned_literal_type_node;
2049 #if HOST_BITS_PER_WIDE_INT >= 64
2050 if (type1 == intTI_type_node)
2051 return unsigned_intTI_type_node;
2052 #endif
2053 if (type1 == intDI_type_node)
2054 return unsigned_intDI_type_node;
2055 if (type1 == intSI_type_node)
2056 return unsigned_intSI_type_node;
2057 if (type1 == intHI_type_node)
2058 return unsigned_intHI_type_node;
2059 if (type1 == intQI_type_node)
2060 return unsigned_intQI_type_node;
2062 return c_common_signed_or_unsigned_type (1, type);
2065 /* Return a signed type the same as TYPE in other respects. */
2067 tree
2068 c_common_signed_type (type)
2069 tree type;
2071 tree type1 = TYPE_MAIN_VARIANT (type);
2072 if (type1 == unsigned_char_type_node || type1 == char_type_node)
2073 return signed_char_type_node;
2074 if (type1 == unsigned_type_node)
2075 return integer_type_node;
2076 if (type1 == short_unsigned_type_node)
2077 return short_integer_type_node;
2078 if (type1 == long_unsigned_type_node)
2079 return long_integer_type_node;
2080 if (type1 == long_long_unsigned_type_node)
2081 return long_long_integer_type_node;
2082 if (type1 == widest_unsigned_literal_type_node)
2083 return widest_integer_literal_type_node;
2084 #if HOST_BITS_PER_WIDE_INT >= 64
2085 if (type1 == unsigned_intTI_type_node)
2086 return intTI_type_node;
2087 #endif
2088 if (type1 == unsigned_intDI_type_node)
2089 return intDI_type_node;
2090 if (type1 == unsigned_intSI_type_node)
2091 return intSI_type_node;
2092 if (type1 == unsigned_intHI_type_node)
2093 return intHI_type_node;
2094 if (type1 == unsigned_intQI_type_node)
2095 return intQI_type_node;
2097 return c_common_signed_or_unsigned_type (0, type);
2100 /* Return a type the same as TYPE except unsigned or
2101 signed according to UNSIGNEDP. */
2103 tree
2104 c_common_signed_or_unsigned_type (unsignedp, type)
2105 int unsignedp;
2106 tree type;
2108 if (! INTEGRAL_TYPE_P (type)
2109 || TREE_UNSIGNED (type) == unsignedp)
2110 return type;
2112 if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
2113 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2114 if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
2115 return unsignedp ? unsigned_type_node : integer_type_node;
2116 if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node))
2117 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2118 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node))
2119 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2120 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node))
2121 return (unsignedp ? long_long_unsigned_type_node
2122 : long_long_integer_type_node);
2123 if (TYPE_PRECISION (type) == TYPE_PRECISION (widest_integer_literal_type_node))
2124 return (unsignedp ? widest_unsigned_literal_type_node
2125 : widest_integer_literal_type_node);
2127 #if HOST_BITS_PER_WIDE_INT >= 64
2128 if (TYPE_PRECISION (type) == TYPE_PRECISION (intTI_type_node))
2129 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2130 #endif
2131 if (TYPE_PRECISION (type) == TYPE_PRECISION (intDI_type_node))
2132 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2133 if (TYPE_PRECISION (type) == TYPE_PRECISION (intSI_type_node))
2134 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2135 if (TYPE_PRECISION (type) == TYPE_PRECISION (intHI_type_node))
2136 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2137 if (TYPE_PRECISION (type) == TYPE_PRECISION (intQI_type_node))
2138 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2140 return type;
2143 /* Return the minimum number of bits needed to represent VALUE in a
2144 signed or unsigned type, UNSIGNEDP says which. */
2146 unsigned int
2147 min_precision (value, unsignedp)
2148 tree value;
2149 int unsignedp;
2151 int log;
2153 /* If the value is negative, compute its negative minus 1. The latter
2154 adjustment is because the absolute value of the largest negative value
2155 is one larger than the largest positive value. This is equivalent to
2156 a bit-wise negation, so use that operation instead. */
2158 if (tree_int_cst_sgn (value) < 0)
2159 value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value));
2161 /* Return the number of bits needed, taking into account the fact
2162 that we need one more bit for a signed than unsigned type. */
2164 if (integer_zerop (value))
2165 log = 0;
2166 else
2167 log = tree_floor_log2 (value);
2169 return log + 1 + ! unsignedp;
2172 /* Print an error message for invalid operands to arith operation
2173 CODE. NOP_EXPR is used as a special case (see
2174 c_common_truthvalue_conversion). */
2176 void
2177 binary_op_error (code)
2178 enum tree_code code;
2180 const char *opname;
2182 switch (code)
2184 case NOP_EXPR:
2185 error ("invalid truth-value expression");
2186 return;
2188 case PLUS_EXPR:
2189 opname = "+"; break;
2190 case MINUS_EXPR:
2191 opname = "-"; break;
2192 case MULT_EXPR:
2193 opname = "*"; break;
2194 case MAX_EXPR:
2195 opname = "max"; break;
2196 case MIN_EXPR:
2197 opname = "min"; break;
2198 case EQ_EXPR:
2199 opname = "=="; break;
2200 case NE_EXPR:
2201 opname = "!="; break;
2202 case LE_EXPR:
2203 opname = "<="; break;
2204 case GE_EXPR:
2205 opname = ">="; break;
2206 case LT_EXPR:
2207 opname = "<"; break;
2208 case GT_EXPR:
2209 opname = ">"; break;
2210 case LSHIFT_EXPR:
2211 opname = "<<"; break;
2212 case RSHIFT_EXPR:
2213 opname = ">>"; break;
2214 case TRUNC_MOD_EXPR:
2215 case FLOOR_MOD_EXPR:
2216 opname = "%"; break;
2217 case TRUNC_DIV_EXPR:
2218 case FLOOR_DIV_EXPR:
2219 opname = "/"; break;
2220 case BIT_AND_EXPR:
2221 opname = "&"; break;
2222 case BIT_IOR_EXPR:
2223 opname = "|"; break;
2224 case TRUTH_ANDIF_EXPR:
2225 opname = "&&"; break;
2226 case TRUTH_ORIF_EXPR:
2227 opname = "||"; break;
2228 case BIT_XOR_EXPR:
2229 opname = "^"; break;
2230 case LROTATE_EXPR:
2231 case RROTATE_EXPR:
2232 opname = "rotate"; break;
2233 default:
2234 opname = "unknown"; break;
2236 error ("invalid operands to binary %s", opname);
2239 /* Subroutine of build_binary_op, used for comparison operations.
2240 See if the operands have both been converted from subword integer types
2241 and, if so, perhaps change them both back to their original type.
2242 This function is also responsible for converting the two operands
2243 to the proper common type for comparison.
2245 The arguments of this function are all pointers to local variables
2246 of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
2247 RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
2249 If this function returns nonzero, it means that the comparison has
2250 a constant value. What this function returns is an expression for
2251 that value. */
2253 tree
2254 shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
2255 tree *op0_ptr, *op1_ptr;
2256 tree *restype_ptr;
2257 enum tree_code *rescode_ptr;
2259 tree type;
2260 tree op0 = *op0_ptr;
2261 tree op1 = *op1_ptr;
2262 int unsignedp0, unsignedp1;
2263 int real1, real2;
2264 tree primop0, primop1;
2265 enum tree_code code = *rescode_ptr;
2267 /* Throw away any conversions to wider types
2268 already present in the operands. */
2270 primop0 = get_narrower (op0, &unsignedp0);
2271 primop1 = get_narrower (op1, &unsignedp1);
2273 /* Handle the case that OP0 does not *contain* a conversion
2274 but it *requires* conversion to FINAL_TYPE. */
2276 if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
2277 unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
2278 if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
2279 unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
2281 /* If one of the operands must be floated, we cannot optimize. */
2282 real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
2283 real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
2285 /* If first arg is constant, swap the args (changing operation
2286 so value is preserved), for canonicalization. Don't do this if
2287 the second arg is 0. */
2289 if (TREE_CONSTANT (primop0)
2290 && ! integer_zerop (primop1) && ! real_zerop (primop1))
2292 tree tem = primop0;
2293 int temi = unsignedp0;
2294 primop0 = primop1;
2295 primop1 = tem;
2296 tem = op0;
2297 op0 = op1;
2298 op1 = tem;
2299 *op0_ptr = op0;
2300 *op1_ptr = op1;
2301 unsignedp0 = unsignedp1;
2302 unsignedp1 = temi;
2303 temi = real1;
2304 real1 = real2;
2305 real2 = temi;
2307 switch (code)
2309 case LT_EXPR:
2310 code = GT_EXPR;
2311 break;
2312 case GT_EXPR:
2313 code = LT_EXPR;
2314 break;
2315 case LE_EXPR:
2316 code = GE_EXPR;
2317 break;
2318 case GE_EXPR:
2319 code = LE_EXPR;
2320 break;
2321 default:
2322 break;
2324 *rescode_ptr = code;
2327 /* If comparing an integer against a constant more bits wide,
2328 maybe we can deduce a value of 1 or 0 independent of the data.
2329 Or else truncate the constant now
2330 rather than extend the variable at run time.
2332 This is only interesting if the constant is the wider arg.
2333 Also, it is not safe if the constant is unsigned and the
2334 variable arg is signed, since in this case the variable
2335 would be sign-extended and then regarded as unsigned.
2336 Our technique fails in this case because the lowest/highest
2337 possible unsigned results don't follow naturally from the
2338 lowest/highest possible values of the variable operand.
2339 For just EQ_EXPR and NE_EXPR there is another technique that
2340 could be used: see if the constant can be faithfully represented
2341 in the other operand's type, by truncating it and reextending it
2342 and see if that preserves the constant's value. */
2344 if (!real1 && !real2
2345 && TREE_CODE (primop1) == INTEGER_CST
2346 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
2348 int min_gt, max_gt, min_lt, max_lt;
2349 tree maxval, minval;
2350 /* 1 if comparison is nominally unsigned. */
2351 int unsignedp = TREE_UNSIGNED (*restype_ptr);
2352 tree val;
2354 type = c_common_signed_or_unsigned_type (unsignedp0,
2355 TREE_TYPE (primop0));
2357 /* If TYPE is an enumeration, then we need to get its min/max
2358 values from it's underlying integral type, not the enumerated
2359 type itself. */
2360 if (TREE_CODE (type) == ENUMERAL_TYPE)
2361 type = c_common_type_for_size (TYPE_PRECISION (type), unsignedp0);
2363 maxval = TYPE_MAX_VALUE (type);
2364 minval = TYPE_MIN_VALUE (type);
2366 if (unsignedp && !unsignedp0)
2367 *restype_ptr = c_common_signed_type (*restype_ptr);
2369 if (TREE_TYPE (primop1) != *restype_ptr)
2370 primop1 = convert (*restype_ptr, primop1);
2371 if (type != *restype_ptr)
2373 minval = convert (*restype_ptr, minval);
2374 maxval = convert (*restype_ptr, maxval);
2377 if (unsignedp && unsignedp0)
2379 min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
2380 max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
2381 min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
2382 max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
2384 else
2386 min_gt = INT_CST_LT (primop1, minval);
2387 max_gt = INT_CST_LT (primop1, maxval);
2388 min_lt = INT_CST_LT (minval, primop1);
2389 max_lt = INT_CST_LT (maxval, primop1);
2392 val = 0;
2393 /* This used to be a switch, but Genix compiler can't handle that. */
2394 if (code == NE_EXPR)
2396 if (max_lt || min_gt)
2397 val = boolean_true_node;
2399 else if (code == EQ_EXPR)
2401 if (max_lt || min_gt)
2402 val = boolean_false_node;
2404 else if (code == LT_EXPR)
2406 if (max_lt)
2407 val = boolean_true_node;
2408 if (!min_lt)
2409 val = boolean_false_node;
2411 else if (code == GT_EXPR)
2413 if (min_gt)
2414 val = boolean_true_node;
2415 if (!max_gt)
2416 val = boolean_false_node;
2418 else if (code == LE_EXPR)
2420 if (!max_gt)
2421 val = boolean_true_node;
2422 if (min_gt)
2423 val = boolean_false_node;
2425 else if (code == GE_EXPR)
2427 if (!min_lt)
2428 val = boolean_true_node;
2429 if (max_lt)
2430 val = boolean_false_node;
2433 /* If primop0 was sign-extended and unsigned comparison specd,
2434 we did a signed comparison above using the signed type bounds.
2435 But the comparison we output must be unsigned.
2437 Also, for inequalities, VAL is no good; but if the signed
2438 comparison had *any* fixed result, it follows that the
2439 unsigned comparison just tests the sign in reverse
2440 (positive values are LE, negative ones GE).
2441 So we can generate an unsigned comparison
2442 against an extreme value of the signed type. */
2444 if (unsignedp && !unsignedp0)
2446 if (val != 0)
2447 switch (code)
2449 case LT_EXPR:
2450 case GE_EXPR:
2451 primop1 = TYPE_MIN_VALUE (type);
2452 val = 0;
2453 break;
2455 case LE_EXPR:
2456 case GT_EXPR:
2457 primop1 = TYPE_MAX_VALUE (type);
2458 val = 0;
2459 break;
2461 default:
2462 break;
2464 type = c_common_unsigned_type (type);
2467 if (TREE_CODE (primop0) != INTEGER_CST)
2469 if (val == boolean_false_node)
2470 warning ("comparison is always false due to limited range of data type");
2471 if (val == boolean_true_node)
2472 warning ("comparison is always true due to limited range of data type");
2475 if (val != 0)
2477 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
2478 if (TREE_SIDE_EFFECTS (primop0))
2479 return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
2480 return val;
2483 /* Value is not predetermined, but do the comparison
2484 in the type of the operand that is not constant.
2485 TYPE is already properly set. */
2487 else if (real1 && real2
2488 && (TYPE_PRECISION (TREE_TYPE (primop0))
2489 == TYPE_PRECISION (TREE_TYPE (primop1))))
2490 type = TREE_TYPE (primop0);
2492 /* If args' natural types are both narrower than nominal type
2493 and both extend in the same manner, compare them
2494 in the type of the wider arg.
2495 Otherwise must actually extend both to the nominal
2496 common type lest different ways of extending
2497 alter the result.
2498 (eg, (short)-1 == (unsigned short)-1 should be 0.) */
2500 else if (unsignedp0 == unsignedp1 && real1 == real2
2501 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
2502 && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
2504 type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
2505 type = c_common_signed_or_unsigned_type (unsignedp0
2506 || TREE_UNSIGNED (*restype_ptr),
2507 type);
2508 /* Make sure shorter operand is extended the right way
2509 to match the longer operand. */
2510 primop0
2511 = convert (c_common_signed_or_unsigned_type (unsignedp0,
2512 TREE_TYPE (primop0)),
2513 primop0);
2514 primop1
2515 = convert (c_common_signed_or_unsigned_type (unsignedp1,
2516 TREE_TYPE (primop1)),
2517 primop1);
2519 else
2521 /* Here we must do the comparison on the nominal type
2522 using the args exactly as we received them. */
2523 type = *restype_ptr;
2524 primop0 = op0;
2525 primop1 = op1;
2527 if (!real1 && !real2 && integer_zerop (primop1)
2528 && TREE_UNSIGNED (*restype_ptr))
2530 tree value = 0;
2531 switch (code)
2533 case GE_EXPR:
2534 /* All unsigned values are >= 0, so we warn if extra warnings
2535 are requested. However, if OP0 is a constant that is
2536 >= 0, the signedness of the comparison isn't an issue,
2537 so suppress the warning. */
2538 if (extra_warnings && !in_system_header
2539 && ! (TREE_CODE (primop0) == INTEGER_CST
2540 && ! TREE_OVERFLOW (convert (c_common_signed_type (type),
2541 primop0))))
2542 warning ("comparison of unsigned expression >= 0 is always true");
2543 value = boolean_true_node;
2544 break;
2546 case LT_EXPR:
2547 if (extra_warnings && !in_system_header
2548 && ! (TREE_CODE (primop0) == INTEGER_CST
2549 && ! TREE_OVERFLOW (convert (c_common_signed_type (type),
2550 primop0))))
2551 warning ("comparison of unsigned expression < 0 is always false");
2552 value = boolean_false_node;
2553 break;
2555 default:
2556 break;
2559 if (value != 0)
2561 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
2562 if (TREE_SIDE_EFFECTS (primop0))
2563 return build (COMPOUND_EXPR, TREE_TYPE (value),
2564 primop0, value);
2565 return value;
2570 *op0_ptr = convert (type, primop0);
2571 *op1_ptr = convert (type, primop1);
2573 *restype_ptr = boolean_type_node;
2575 return 0;
2578 /* Return a tree for the sum or difference (RESULTCODE says which)
2579 of pointer PTROP and integer INTOP. */
2581 tree
2582 pointer_int_sum (resultcode, ptrop, intop)
2583 enum tree_code resultcode;
2584 tree ptrop, intop;
2586 tree size_exp;
2588 tree result;
2589 tree folded;
2591 /* The result is a pointer of the same type that is being added. */
2593 tree result_type = TREE_TYPE (ptrop);
2595 if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
2597 if (pedantic || warn_pointer_arith)
2598 pedwarn ("pointer of type `void *' used in arithmetic");
2599 size_exp = integer_one_node;
2601 else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
2603 if (pedantic || warn_pointer_arith)
2604 pedwarn ("pointer to a function used in arithmetic");
2605 size_exp = integer_one_node;
2607 else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
2609 if (pedantic || warn_pointer_arith)
2610 pedwarn ("pointer to member function used in arithmetic");
2611 size_exp = integer_one_node;
2613 else if (TREE_CODE (TREE_TYPE (result_type)) == OFFSET_TYPE)
2615 if (pedantic || warn_pointer_arith)
2616 pedwarn ("pointer to a member used in arithmetic");
2617 size_exp = integer_one_node;
2619 else
2620 size_exp = size_in_bytes (TREE_TYPE (result_type));
2622 /* If what we are about to multiply by the size of the elements
2623 contains a constant term, apply distributive law
2624 and multiply that constant term separately.
2625 This helps produce common subexpressions. */
2627 if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
2628 && ! TREE_CONSTANT (intop)
2629 && TREE_CONSTANT (TREE_OPERAND (intop, 1))
2630 && TREE_CONSTANT (size_exp)
2631 /* If the constant comes from pointer subtraction,
2632 skip this optimization--it would cause an error. */
2633 && TREE_CODE (TREE_TYPE (TREE_OPERAND (intop, 0))) == INTEGER_TYPE
2634 /* If the constant is unsigned, and smaller than the pointer size,
2635 then we must skip this optimization. This is because it could cause
2636 an overflow error if the constant is negative but INTOP is not. */
2637 && (! TREE_UNSIGNED (TREE_TYPE (intop))
2638 || (TYPE_PRECISION (TREE_TYPE (intop))
2639 == TYPE_PRECISION (TREE_TYPE (ptrop)))))
2641 enum tree_code subcode = resultcode;
2642 tree int_type = TREE_TYPE (intop);
2643 if (TREE_CODE (intop) == MINUS_EXPR)
2644 subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
2645 /* Convert both subexpression types to the type of intop,
2646 because weird cases involving pointer arithmetic
2647 can result in a sum or difference with different type args. */
2648 ptrop = build_binary_op (subcode, ptrop,
2649 convert (int_type, TREE_OPERAND (intop, 1)), 1);
2650 intop = convert (int_type, TREE_OPERAND (intop, 0));
2653 /* Convert the integer argument to a type the same size as sizetype
2654 so the multiply won't overflow spuriously. */
2656 if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
2657 || TREE_UNSIGNED (TREE_TYPE (intop)) != TREE_UNSIGNED (sizetype))
2658 intop = convert (c_common_type_for_size (TYPE_PRECISION (sizetype),
2659 TREE_UNSIGNED (sizetype)), intop);
2661 /* Replace the integer argument with a suitable product by the object size.
2662 Do this multiplication as signed, then convert to the appropriate
2663 pointer type (actually unsigned integral). */
2665 intop = convert (result_type,
2666 build_binary_op (MULT_EXPR, intop,
2667 convert (TREE_TYPE (intop), size_exp), 1));
2669 /* Create the sum or difference. */
2671 result = build (resultcode, result_type, ptrop, intop);
2673 folded = fold (result);
2674 if (folded == result)
2675 TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop);
2676 return folded;
2679 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
2680 or validate its data type for an `if' or `while' statement or ?..: exp.
2682 This preparation consists of taking the ordinary
2683 representation of an expression expr and producing a valid tree
2684 boolean expression describing whether expr is nonzero. We could
2685 simply always do build_binary_op (NE_EXPR, expr, boolean_false_node, 1),
2686 but we optimize comparisons, &&, ||, and !.
2688 The resulting type should always be `boolean_type_node'. */
2690 tree
2691 c_common_truthvalue_conversion (expr)
2692 tree expr;
2694 if (TREE_CODE (expr) == ERROR_MARK)
2695 return expr;
2697 #if 0 /* This appears to be wrong for C++. */
2698 /* These really should return error_mark_node after 2.4 is stable.
2699 But not all callers handle ERROR_MARK properly. */
2700 switch (TREE_CODE (TREE_TYPE (expr)))
2702 case RECORD_TYPE:
2703 error ("struct type value used where scalar is required");
2704 return boolean_false_node;
2706 case UNION_TYPE:
2707 error ("union type value used where scalar is required");
2708 return boolean_false_node;
2710 case ARRAY_TYPE:
2711 error ("array type value used where scalar is required");
2712 return boolean_false_node;
2714 default:
2715 break;
2717 #endif /* 0 */
2719 switch (TREE_CODE (expr))
2721 case EQ_EXPR:
2722 case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
2723 case TRUTH_ANDIF_EXPR:
2724 case TRUTH_ORIF_EXPR:
2725 case TRUTH_AND_EXPR:
2726 case TRUTH_OR_EXPR:
2727 case TRUTH_XOR_EXPR:
2728 case TRUTH_NOT_EXPR:
2729 TREE_TYPE (expr) = boolean_type_node;
2730 return expr;
2732 case ERROR_MARK:
2733 return expr;
2735 case INTEGER_CST:
2736 return integer_zerop (expr) ? boolean_false_node : boolean_true_node;
2738 case REAL_CST:
2739 return real_zerop (expr) ? boolean_false_node : boolean_true_node;
2741 case ADDR_EXPR:
2742 /* If we are taking the address of an external decl, it might be zero
2743 if it is weak, so we cannot optimize. */
2744 if (DECL_P (TREE_OPERAND (expr, 0))
2745 && DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
2746 break;
2748 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
2749 return build (COMPOUND_EXPR, boolean_type_node,
2750 TREE_OPERAND (expr, 0), boolean_true_node);
2751 else
2752 return boolean_true_node;
2754 case COMPLEX_EXPR:
2755 return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
2756 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2757 c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)),
2758 c_common_truthvalue_conversion (TREE_OPERAND (expr, 1)),
2761 case NEGATE_EXPR:
2762 case ABS_EXPR:
2763 case FLOAT_EXPR:
2764 case FFS_EXPR:
2765 /* These don't change whether an object is non-zero or zero. */
2766 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0));
2768 case LROTATE_EXPR:
2769 case RROTATE_EXPR:
2770 /* These don't change whether an object is zero or non-zero, but
2771 we can't ignore them if their second arg has side-effects. */
2772 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2773 return build (COMPOUND_EXPR, boolean_type_node, TREE_OPERAND (expr, 1),
2774 c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)));
2775 else
2776 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0));
2778 case COND_EXPR:
2779 /* Distribute the conversion into the arms of a COND_EXPR. */
2780 return fold (build (COND_EXPR, boolean_type_node, TREE_OPERAND (expr, 0),
2781 c_common_truthvalue_conversion (TREE_OPERAND (expr, 1)),
2782 c_common_truthvalue_conversion (TREE_OPERAND (expr, 2))));
2784 case CONVERT_EXPR:
2785 /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
2786 since that affects how `default_conversion' will behave. */
2787 if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
2788 || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
2789 break;
2790 /* fall through... */
2791 case NOP_EXPR:
2792 /* If this is widening the argument, we can ignore it. */
2793 if (TYPE_PRECISION (TREE_TYPE (expr))
2794 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
2795 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0));
2796 break;
2798 case MINUS_EXPR:
2799 /* Perhaps reduce (x - y) != 0 to (x != y). The expressions
2800 aren't guaranteed to the be same for modes that can represent
2801 infinity, since if x and y are both +infinity, or both
2802 -infinity, then x - y is not a number.
2804 Note that this transformation is safe when x or y is NaN.
2805 (x - y) is then NaN, and both (x - y) != 0 and x != y will
2806 be false. */
2807 if (HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr, 0)))))
2808 break;
2809 /* fall through... */
2810 case BIT_XOR_EXPR:
2811 /* This and MINUS_EXPR can be changed into a comparison of the
2812 two objects. */
2813 if (TREE_TYPE (TREE_OPERAND (expr, 0))
2814 == TREE_TYPE (TREE_OPERAND (expr, 1)))
2815 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
2816 TREE_OPERAND (expr, 1), 1);
2817 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
2818 fold (build1 (NOP_EXPR,
2819 TREE_TYPE (TREE_OPERAND (expr, 0)),
2820 TREE_OPERAND (expr, 1))), 1);
2822 case BIT_AND_EXPR:
2823 if (integer_onep (TREE_OPERAND (expr, 1))
2824 && TREE_TYPE (expr) != boolean_type_node)
2825 /* Using convert here would cause infinite recursion. */
2826 return build1 (NOP_EXPR, boolean_type_node, expr);
2827 break;
2829 case MODIFY_EXPR:
2830 if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
2831 warning ("suggest parentheses around assignment used as truth value");
2832 break;
2834 default:
2835 break;
2838 if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
2840 tree t = save_expr (expr);
2841 return (build_binary_op
2842 ((TREE_SIDE_EFFECTS (expr)
2843 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2844 c_common_truthvalue_conversion (build_unary_op (REALPART_EXPR, t, 0)),
2845 c_common_truthvalue_conversion (build_unary_op (IMAGPART_EXPR, t, 0)),
2846 0));
2849 return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
2852 static tree builtin_function_2 PARAMS ((const char *, const char *, tree, tree,
2853 int, enum built_in_class, int, int,
2854 tree));
2856 /* Make a variant type in the proper way for C/C++, propagating qualifiers
2857 down to the element type of an array. */
2859 tree
2860 c_build_qualified_type (type, type_quals)
2861 tree type;
2862 int type_quals;
2864 /* A restrict-qualified pointer type must be a pointer to object or
2865 incomplete type. Note that the use of POINTER_TYPE_P also allows
2866 REFERENCE_TYPEs, which is appropriate for C++. Unfortunately,
2867 the C++ front-end also use POINTER_TYPE for pointer-to-member
2868 values, so even though it should be illegal to use `restrict'
2869 with such an entity we don't flag that here. Thus, special case
2870 code for that case is required in the C++ front-end. */
2871 if ((type_quals & TYPE_QUAL_RESTRICT)
2872 && (!POINTER_TYPE_P (type)
2873 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type))))
2875 error ("invalid use of `restrict'");
2876 type_quals &= ~TYPE_QUAL_RESTRICT;
2879 if (TREE_CODE (type) == ARRAY_TYPE)
2880 return build_array_type (c_build_qualified_type (TREE_TYPE (type),
2881 type_quals),
2882 TYPE_DOMAIN (type));
2883 return build_qualified_type (type, type_quals);
2886 /* Apply the TYPE_QUALS to the new DECL. */
2888 void
2889 c_apply_type_quals_to_decl (type_quals, decl)
2890 int type_quals;
2891 tree decl;
2893 if ((type_quals & TYPE_QUAL_CONST)
2894 || (TREE_TYPE (decl)
2895 && TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE))
2896 TREE_READONLY (decl) = 1;
2897 if (type_quals & TYPE_QUAL_VOLATILE)
2899 TREE_SIDE_EFFECTS (decl) = 1;
2900 TREE_THIS_VOLATILE (decl) = 1;
2902 if (type_quals & TYPE_QUAL_RESTRICT)
2904 if (!TREE_TYPE (decl)
2905 || !POINTER_TYPE_P (TREE_TYPE (decl))
2906 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (TREE_TYPE (decl))))
2907 error ("invalid use of `restrict'");
2908 else if (flag_strict_aliasing)
2909 /* Indicate we need to make a unique alias set for this pointer.
2910 We can't do it here because it might be pointing to an
2911 incomplete type. */
2912 DECL_POINTER_ALIAS_SET (decl) = -2;
2916 /* Return the typed-based alias set for T, which may be an expression
2917 or a type. Return -1 if we don't do anything special. */
2919 HOST_WIDE_INT
2920 c_common_get_alias_set (t)
2921 tree t;
2923 tree u;
2925 /* Permit type-punning when accessing a union, provided the access
2926 is directly through the union. For example, this code does not
2927 permit taking the address of a union member and then storing
2928 through it. Even the type-punning allowed here is a GCC
2929 extension, albeit a common and useful one; the C standard says
2930 that such accesses have implementation-defined behavior. */
2931 for (u = t;
2932 TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
2933 u = TREE_OPERAND (u, 0))
2934 if (TREE_CODE (u) == COMPONENT_REF
2935 && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
2936 return 0;
2938 /* That's all the expressions we handle specially. */
2939 if (! TYPE_P (t))
2940 return -1;
2942 /* The C standard guarantess that any object may be accessed via an
2943 lvalue that has character type. */
2944 if (t == char_type_node
2945 || t == signed_char_type_node
2946 || t == unsigned_char_type_node)
2947 return 0;
2949 /* If it has the may_alias attribute, it can alias anything. */
2950 if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (t)))
2951 return 0;
2953 /* The C standard specifically allows aliasing between signed and
2954 unsigned variants of the same type. We treat the signed
2955 variant as canonical. */
2956 if (TREE_CODE (t) == INTEGER_TYPE && TREE_UNSIGNED (t))
2958 tree t1 = c_common_signed_type (t);
2960 /* t1 == t can happen for boolean nodes which are always unsigned. */
2961 if (t1 != t)
2962 return get_alias_set (t1);
2964 else if (POINTER_TYPE_P (t))
2966 tree t1;
2968 /* Unfortunately, there is no canonical form of a pointer type.
2969 In particular, if we have `typedef int I', then `int *', and
2970 `I *' are different types. So, we have to pick a canonical
2971 representative. We do this below.
2973 Technically, this approach is actually more conservative that
2974 it needs to be. In particular, `const int *' and `int *'
2975 should be in different alias sets, according to the C and C++
2976 standard, since their types are not the same, and so,
2977 technically, an `int **' and `const int **' cannot point at
2978 the same thing.
2980 But, the standard is wrong. In particular, this code is
2981 legal C++:
2983 int *ip;
2984 int **ipp = &ip;
2985 const int* const* cipp = &ipp;
2987 And, it doesn't make sense for that to be legal unless you
2988 can dereference IPP and CIPP. So, we ignore cv-qualifiers on
2989 the pointed-to types. This issue has been reported to the
2990 C++ committee. */
2991 t1 = build_type_no_quals (t);
2992 if (t1 != t)
2993 return get_alias_set (t1);
2996 return -1;
2999 /* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where the
3000 second parameter indicates which OPERATOR is being applied. The COMPLAIN
3001 flag controls whether we should diagnose possibly ill-formed
3002 constructs or not. */
3003 tree
3004 c_sizeof_or_alignof_type (type, op, complain)
3005 tree type;
3006 enum tree_code op;
3007 int complain;
3009 const char *op_name;
3010 tree value = NULL;
3011 enum tree_code type_code = TREE_CODE (type);
3013 my_friendly_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR, 20020720);
3014 op_name = op == SIZEOF_EXPR ? "sizeof" : "__alignof__";
3016 if (type_code == FUNCTION_TYPE)
3018 if (op == SIZEOF_EXPR)
3020 if (complain && (pedantic || warn_pointer_arith))
3021 pedwarn ("invalid application of `sizeof' to a function type");
3022 value = size_one_node;
3024 else
3025 value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
3027 else if (type_code == VOID_TYPE || type_code == ERROR_MARK)
3029 if (type_code == VOID_TYPE
3030 && complain && (pedantic || warn_pointer_arith))
3031 pedwarn ("invalid application of `%s' to a void type", op_name);
3032 value = size_one_node;
3034 else if (!COMPLETE_TYPE_P (type))
3036 if (complain)
3037 error ("invalid application of `%s' to an incomplete type", op_name);
3038 value = size_zero_node;
3040 else
3042 if (op == SIZEOF_EXPR)
3043 /* Convert in case a char is more than one unit. */
3044 value = size_binop (CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type),
3045 size_int (TYPE_PRECISION (char_type_node)
3046 / BITS_PER_UNIT));
3047 else
3048 value = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT);
3051 /* VALUE will have an integer type with TYPE_IS_SIZETYPE set.
3052 TYPE_IS_SIZETYPE means that certain things (like overflow) will
3053 never happen. However, this node should really have type
3054 `size_t', which is just a typedef for an ordinary integer type. */
3055 value = fold (build1 (NOP_EXPR, c_size_type_node, value));
3056 my_friendly_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (value)), 20001021);
3058 return value;
3061 /* Implement the __alignof keyword: Return the minimum required
3062 alignment of EXPR, measured in bytes. For VAR_DECL's and
3063 FIELD_DECL's return DECL_ALIGN (which can be set from an
3064 "aligned" __attribute__ specification). */
3066 tree
3067 c_alignof_expr (expr)
3068 tree expr;
3070 tree t;
3072 if (TREE_CODE (expr) == VAR_DECL)
3073 t = size_int (DECL_ALIGN (expr) / BITS_PER_UNIT);
3075 else if (TREE_CODE (expr) == COMPONENT_REF
3076 && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1)))
3078 error ("`__alignof' applied to a bit-field");
3079 t = size_one_node;
3081 else if (TREE_CODE (expr) == COMPONENT_REF
3082 && TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL)
3083 t = size_int (DECL_ALIGN (TREE_OPERAND (expr, 1)) / BITS_PER_UNIT);
3085 else if (TREE_CODE (expr) == INDIRECT_REF)
3087 tree t = TREE_OPERAND (expr, 0);
3088 tree best = t;
3089 int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
3091 while (TREE_CODE (t) == NOP_EXPR
3092 && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE)
3094 int thisalign;
3096 t = TREE_OPERAND (t, 0);
3097 thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
3098 if (thisalign > bestalign)
3099 best = t, bestalign = thisalign;
3101 return c_alignof (TREE_TYPE (TREE_TYPE (best)));
3103 else
3104 return c_alignof (TREE_TYPE (expr));
3106 return fold (build1 (NOP_EXPR, c_size_type_node, t));
3109 /* Handle C and C++ default attributes. */
3111 enum built_in_attribute
3113 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
3114 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
3115 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
3116 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
3117 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) /* No entry needed in enum. */
3118 #include "builtin-attrs.def"
3119 #undef DEF_ATTR_NULL_TREE
3120 #undef DEF_ATTR_INT
3121 #undef DEF_ATTR_IDENT
3122 #undef DEF_ATTR_TREE_LIST
3123 #undef DEF_FN_ATTR
3124 ATTR_LAST
3127 static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
3129 static bool c_attrs_initialized = false;
3131 static void c_init_attributes PARAMS ((void));
3133 /* Build tree nodes and builtin functions common to both C and C++ language
3134 frontends. */
3136 void
3137 c_common_nodes_and_builtins ()
3139 enum builtin_type
3141 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
3142 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
3143 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
3144 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
3145 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
3146 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
3147 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
3148 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
3149 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
3150 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
3151 #include "builtin-types.def"
3152 #undef DEF_PRIMITIVE_TYPE
3153 #undef DEF_FUNCTION_TYPE_0
3154 #undef DEF_FUNCTION_TYPE_1
3155 #undef DEF_FUNCTION_TYPE_2
3156 #undef DEF_FUNCTION_TYPE_3
3157 #undef DEF_FUNCTION_TYPE_4
3158 #undef DEF_FUNCTION_TYPE_VAR_0
3159 #undef DEF_FUNCTION_TYPE_VAR_1
3160 #undef DEF_FUNCTION_TYPE_VAR_2
3161 #undef DEF_POINTER_TYPE
3162 BT_LAST
3165 typedef enum builtin_type builtin_type;
3167 tree builtin_types[(int) BT_LAST];
3168 int wchar_type_size;
3169 tree array_domain_type;
3170 tree va_list_ref_type_node;
3171 tree va_list_arg_type_node;
3173 /* Define `int' and `char' first so that dbx will output them first. */
3174 record_builtin_type (RID_INT, NULL, integer_type_node);
3175 record_builtin_type (RID_CHAR, "char", char_type_node);
3177 /* `signed' is the same as `int'. FIXME: the declarations of "signed",
3178 "unsigned long", "long long unsigned" and "unsigned short" were in C++
3179 but not C. Are the conditionals here needed? */
3180 if (c_language == clk_cplusplus)
3181 record_builtin_type (RID_SIGNED, NULL, integer_type_node);
3182 record_builtin_type (RID_LONG, "long int", long_integer_type_node);
3183 record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
3184 record_builtin_type (RID_MAX, "long unsigned int",
3185 long_unsigned_type_node);
3186 if (c_language == clk_cplusplus)
3187 record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
3188 record_builtin_type (RID_MAX, "long long int",
3189 long_long_integer_type_node);
3190 record_builtin_type (RID_MAX, "long long unsigned int",
3191 long_long_unsigned_type_node);
3192 if (c_language == clk_cplusplus)
3193 record_builtin_type (RID_MAX, "long long unsigned",
3194 long_long_unsigned_type_node);
3195 record_builtin_type (RID_SHORT, "short int", short_integer_type_node);
3196 record_builtin_type (RID_MAX, "short unsigned int",
3197 short_unsigned_type_node);
3198 if (c_language == clk_cplusplus)
3199 record_builtin_type (RID_MAX, "unsigned short",
3200 short_unsigned_type_node);
3202 /* Define both `signed char' and `unsigned char'. */
3203 record_builtin_type (RID_MAX, "signed char", signed_char_type_node);
3204 record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
3206 /* These are types that c_common_type_for_size and
3207 c_common_type_for_mode use. */
3208 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3209 intQI_type_node));
3210 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3211 intHI_type_node));
3212 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3213 intSI_type_node));
3214 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3215 intDI_type_node));
3216 #if HOST_BITS_PER_WIDE_INT >= 64
3217 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3218 get_identifier ("__int128_t"),
3219 intTI_type_node));
3220 #endif
3221 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3222 unsigned_intQI_type_node));
3223 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3224 unsigned_intHI_type_node));
3225 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3226 unsigned_intSI_type_node));
3227 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3228 unsigned_intDI_type_node));
3229 #if HOST_BITS_PER_WIDE_INT >= 64
3230 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3231 get_identifier ("__uint128_t"),
3232 unsigned_intTI_type_node));
3233 #endif
3235 /* Create the widest literal types. */
3236 widest_integer_literal_type_node
3237 = make_signed_type (HOST_BITS_PER_WIDE_INT * 2);
3238 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3239 widest_integer_literal_type_node));
3241 widest_unsigned_literal_type_node
3242 = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2);
3243 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE,
3244 widest_unsigned_literal_type_node));
3246 /* `unsigned long' is the standard type for sizeof.
3247 Note that stddef.h uses `unsigned long',
3248 and this must agree, even if long and int are the same size. */
3249 c_size_type_node =
3250 TREE_TYPE (identifier_global_value (get_identifier (SIZE_TYPE)));
3251 signed_size_type_node = c_common_signed_type (c_size_type_node);
3252 set_sizetype (c_size_type_node);
3254 build_common_tree_nodes_2 (flag_short_double);
3256 record_builtin_type (RID_FLOAT, NULL, float_type_node);
3257 record_builtin_type (RID_DOUBLE, NULL, double_type_node);
3258 record_builtin_type (RID_MAX, "long double", long_double_type_node);
3260 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3261 get_identifier ("complex int"),
3262 complex_integer_type_node));
3263 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3264 get_identifier ("complex float"),
3265 complex_float_type_node));
3266 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3267 get_identifier ("complex double"),
3268 complex_double_type_node));
3269 (*lang_hooks.decls.pushdecl)
3270 (build_decl (TYPE_DECL, get_identifier ("complex long double"),
3271 complex_long_double_type_node));
3273 /* Types which are common to the fortran compiler and libf2c. When
3274 changing these, you also need to be concerned with f/com.h. */
3276 if (TYPE_PRECISION (float_type_node)
3277 == TYPE_PRECISION (long_integer_type_node))
3279 g77_integer_type_node = long_integer_type_node;
3280 g77_uinteger_type_node = long_unsigned_type_node;
3282 else if (TYPE_PRECISION (float_type_node)
3283 == TYPE_PRECISION (integer_type_node))
3285 g77_integer_type_node = integer_type_node;
3286 g77_uinteger_type_node = unsigned_type_node;
3288 else
3289 g77_integer_type_node = g77_uinteger_type_node = NULL_TREE;
3291 if (g77_integer_type_node != NULL_TREE)
3293 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3294 get_identifier ("__g77_integer"),
3295 g77_integer_type_node));
3296 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3297 get_identifier ("__g77_uinteger"),
3298 g77_uinteger_type_node));
3301 if (TYPE_PRECISION (float_type_node) * 2
3302 == TYPE_PRECISION (long_integer_type_node))
3304 g77_longint_type_node = long_integer_type_node;
3305 g77_ulongint_type_node = long_unsigned_type_node;
3307 else if (TYPE_PRECISION (float_type_node) * 2
3308 == TYPE_PRECISION (long_long_integer_type_node))
3310 g77_longint_type_node = long_long_integer_type_node;
3311 g77_ulongint_type_node = long_long_unsigned_type_node;
3313 else
3314 g77_longint_type_node = g77_ulongint_type_node = NULL_TREE;
3316 if (g77_longint_type_node != NULL_TREE)
3318 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3319 get_identifier ("__g77_longint"),
3320 g77_longint_type_node));
3321 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL,
3322 get_identifier ("__g77_ulongint"),
3323 g77_ulongint_type_node));
3326 record_builtin_type (RID_VOID, NULL, void_type_node);
3328 void_zero_node = build_int_2 (0, 0);
3329 TREE_TYPE (void_zero_node) = void_type_node;
3331 void_list_node = build_void_list_node ();
3333 /* Make a type to be the domain of a few array types
3334 whose domains don't really matter.
3335 200 is small enough that it always fits in size_t
3336 and large enough that it can hold most function names for the
3337 initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
3338 array_domain_type = build_index_type (size_int (200));
3340 /* Make a type for arrays of characters.
3341 With luck nothing will ever really depend on the length of this
3342 array type. */
3343 char_array_type_node
3344 = build_array_type (char_type_node, array_domain_type);
3346 /* Likewise for arrays of ints. */
3347 int_array_type_node
3348 = build_array_type (integer_type_node, array_domain_type);
3350 string_type_node = build_pointer_type (char_type_node);
3351 const_string_type_node
3352 = build_pointer_type (build_qualified_type
3353 (char_type_node, TYPE_QUAL_CONST));
3355 (*targetm.init_builtins) ();
3357 /* This is special for C++ so functions can be overloaded. */
3358 wchar_type_node = get_identifier (MODIFIED_WCHAR_TYPE);
3359 wchar_type_node = TREE_TYPE (identifier_global_value (wchar_type_node));
3360 wchar_type_size = TYPE_PRECISION (wchar_type_node);
3361 if (c_language == clk_cplusplus)
3363 if (TREE_UNSIGNED (wchar_type_node))
3364 wchar_type_node = make_unsigned_type (wchar_type_size);
3365 else
3366 wchar_type_node = make_signed_type (wchar_type_size);
3367 record_builtin_type (RID_WCHAR, "wchar_t", wchar_type_node);
3369 else
3371 signed_wchar_type_node = c_common_signed_type (wchar_type_node);
3372 unsigned_wchar_type_node = c_common_unsigned_type (wchar_type_node);
3375 /* This is for wide string constants. */
3376 wchar_array_type_node
3377 = build_array_type (wchar_type_node, array_domain_type);
3379 wint_type_node =
3380 TREE_TYPE (identifier_global_value (get_identifier (WINT_TYPE)));
3382 intmax_type_node =
3383 TREE_TYPE (identifier_global_value (get_identifier (INTMAX_TYPE)));
3384 uintmax_type_node =
3385 TREE_TYPE (identifier_global_value (get_identifier (UINTMAX_TYPE)));
3387 default_function_type = build_function_type (integer_type_node, NULL_TREE);
3388 ptrdiff_type_node
3389 = TREE_TYPE (identifier_global_value (get_identifier (PTRDIFF_TYPE)));
3390 unsigned_ptrdiff_type_node = c_common_unsigned_type (ptrdiff_type_node);
3392 (*lang_hooks.decls.pushdecl)
3393 (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"),
3394 va_list_type_node));
3396 (*lang_hooks.decls.pushdecl)
3397 (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"),
3398 ptrdiff_type_node));
3400 (*lang_hooks.decls.pushdecl)
3401 (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"),
3402 sizetype));
3404 if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
3406 va_list_arg_type_node = va_list_ref_type_node =
3407 build_pointer_type (TREE_TYPE (va_list_type_node));
3409 else
3411 va_list_arg_type_node = va_list_type_node;
3412 va_list_ref_type_node = build_reference_type (va_list_type_node);
3415 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
3416 builtin_types[(int) ENUM] = VALUE;
3417 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
3418 builtin_types[(int) ENUM] \
3419 = build_function_type (builtin_types[(int) RETURN], \
3420 void_list_node);
3421 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
3422 builtin_types[(int) ENUM] \
3423 = build_function_type (builtin_types[(int) RETURN], \
3424 tree_cons (NULL_TREE, \
3425 builtin_types[(int) ARG1], \
3426 void_list_node));
3427 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
3428 builtin_types[(int) ENUM] \
3429 = build_function_type \
3430 (builtin_types[(int) RETURN], \
3431 tree_cons (NULL_TREE, \
3432 builtin_types[(int) ARG1], \
3433 tree_cons (NULL_TREE, \
3434 builtin_types[(int) ARG2], \
3435 void_list_node)));
3436 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
3437 builtin_types[(int) ENUM] \
3438 = build_function_type \
3439 (builtin_types[(int) RETURN], \
3440 tree_cons (NULL_TREE, \
3441 builtin_types[(int) ARG1], \
3442 tree_cons (NULL_TREE, \
3443 builtin_types[(int) ARG2], \
3444 tree_cons (NULL_TREE, \
3445 builtin_types[(int) ARG3], \
3446 void_list_node))));
3447 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
3448 builtin_types[(int) ENUM] \
3449 = build_function_type \
3450 (builtin_types[(int) RETURN], \
3451 tree_cons (NULL_TREE, \
3452 builtin_types[(int) ARG1], \
3453 tree_cons (NULL_TREE, \
3454 builtin_types[(int) ARG2], \
3455 tree_cons \
3456 (NULL_TREE, \
3457 builtin_types[(int) ARG3], \
3458 tree_cons (NULL_TREE, \
3459 builtin_types[(int) ARG4], \
3460 void_list_node)))));
3461 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
3462 builtin_types[(int) ENUM] \
3463 = build_function_type (builtin_types[(int) RETURN], NULL_TREE);
3464 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
3465 builtin_types[(int) ENUM] \
3466 = build_function_type (builtin_types[(int) RETURN], \
3467 tree_cons (NULL_TREE, \
3468 builtin_types[(int) ARG1], \
3469 NULL_TREE));
3471 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
3472 builtin_types[(int) ENUM] \
3473 = build_function_type \
3474 (builtin_types[(int) RETURN], \
3475 tree_cons (NULL_TREE, \
3476 builtin_types[(int) ARG1], \
3477 tree_cons (NULL_TREE, \
3478 builtin_types[(int) ARG2], \
3479 NULL_TREE)));
3480 #define DEF_POINTER_TYPE(ENUM, TYPE) \
3481 builtin_types[(int) ENUM] \
3482 = build_pointer_type (builtin_types[(int) TYPE]);
3483 #include "builtin-types.def"
3484 #undef DEF_PRIMITIVE_TYPE
3485 #undef DEF_FUNCTION_TYPE_1
3486 #undef DEF_FUNCTION_TYPE_2
3487 #undef DEF_FUNCTION_TYPE_3
3488 #undef DEF_FUNCTION_TYPE_4
3489 #undef DEF_FUNCTION_TYPE_VAR_0
3490 #undef DEF_FUNCTION_TYPE_VAR_1
3491 #undef DEF_POINTER_TYPE
3493 if (!c_attrs_initialized)
3494 c_init_attributes ();
3496 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, \
3497 BOTH_P, FALLBACK_P, NONANSI_P, ATTRS) \
3498 if (NAME) \
3500 tree decl; \
3502 if (strncmp (NAME, "__builtin_", strlen ("__builtin_")) != 0) \
3503 abort (); \
3505 if (!BOTH_P) \
3506 decl = builtin_function (NAME, builtin_types[TYPE], ENUM, \
3507 CLASS, \
3508 (FALLBACK_P \
3509 ? (NAME + strlen ("__builtin_")) \
3510 : NULL), \
3511 built_in_attributes[(int) ATTRS]); \
3512 else \
3513 decl = builtin_function_2 (NAME, \
3514 NAME + strlen ("__builtin_"), \
3515 builtin_types[TYPE], \
3516 builtin_types[LIBTYPE], \
3517 ENUM, \
3518 CLASS, \
3519 FALLBACK_P, \
3520 NONANSI_P, \
3521 built_in_attributes[(int) ATTRS]); \
3523 built_in_decls[(int) ENUM] = decl; \
3525 #include "builtins.def"
3526 #undef DEF_BUILTIN
3528 main_identifier_node = get_identifier ("main");
3531 tree
3532 build_va_arg (expr, type)
3533 tree expr, type;
3535 return build1 (VA_ARG_EXPR, type, expr);
3539 /* Linked list of disabled built-in functions. */
3541 typedef struct disabled_builtin
3543 const char *name;
3544 struct disabled_builtin *next;
3545 } disabled_builtin;
3546 static disabled_builtin *disabled_builtins = NULL;
3548 static bool builtin_function_disabled_p PARAMS ((const char *));
3550 /* Disable a built-in function specified by -fno-builtin-NAME. If NAME
3551 begins with "__builtin_", give an error. */
3553 void
3554 disable_builtin_function (name)
3555 const char *name;
3557 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
3558 error ("cannot disable built-in function `%s'", name);
3559 else
3561 disabled_builtin *new = xmalloc (sizeof (disabled_builtin));
3562 new->name = name;
3563 new->next = disabled_builtins;
3564 disabled_builtins = new;
3569 /* Return true if the built-in function NAME has been disabled, false
3570 otherwise. */
3572 static bool
3573 builtin_function_disabled_p (name)
3574 const char *name;
3576 disabled_builtin *p;
3577 for (p = disabled_builtins; p != NULL; p = p->next)
3579 if (strcmp (name, p->name) == 0)
3580 return true;
3582 return false;
3586 /* Possibly define a builtin function with one or two names. BUILTIN_NAME
3587 is an __builtin_-prefixed name; NAME is the ordinary name; one or both
3588 of these may be NULL (though both being NULL is useless).
3589 BUILTIN_TYPE is the type of the __builtin_-prefixed function;
3590 TYPE is the type of the function with the ordinary name. These
3591 may differ if the ordinary name is declared with a looser type to avoid
3592 conflicts with headers. FUNCTION_CODE and CLASS are as for
3593 builtin_function. If LIBRARY_NAME_P is nonzero, NAME is passed as
3594 the LIBRARY_NAME parameter to builtin_function when declaring BUILTIN_NAME.
3595 If NONANSI_P is nonzero, the name NAME is treated as a non-ANSI name;
3596 ATTRS is the tree list representing the builtin's function attributes.
3597 Returns the declaration of BUILTIN_NAME, if any, otherwise
3598 the declaration of NAME. Does not declare NAME if flag_no_builtin,
3599 or if NONANSI_P and flag_no_nonansi_builtin. */
3601 static tree
3602 builtin_function_2 (builtin_name, name, builtin_type, type, function_code,
3603 class, library_name_p, nonansi_p, attrs)
3604 const char *builtin_name;
3605 const char *name;
3606 tree builtin_type;
3607 tree type;
3608 int function_code;
3609 enum built_in_class class;
3610 int library_name_p;
3611 int nonansi_p;
3612 tree attrs;
3614 tree bdecl = NULL_TREE;
3615 tree decl = NULL_TREE;
3616 if (builtin_name != 0)
3618 bdecl = builtin_function (builtin_name, builtin_type, function_code,
3619 class, library_name_p ? name : NULL,
3620 attrs);
3622 if (name != 0 && !flag_no_builtin && !builtin_function_disabled_p (name)
3623 && !(nonansi_p && flag_no_nonansi_builtin))
3625 decl = builtin_function (name, type, function_code, class, NULL,
3626 attrs);
3627 if (nonansi_p)
3628 DECL_BUILT_IN_NONANSI (decl) = 1;
3630 return (bdecl != 0 ? bdecl : decl);
3633 /* Nonzero if the type T promotes to int. This is (nearly) the
3634 integral promotions defined in ISO C99 6.3.1.1/2. */
3636 bool
3637 c_promoting_integer_type_p (t)
3638 tree t;
3640 switch (TREE_CODE (t))
3642 case INTEGER_TYPE:
3643 return (TYPE_MAIN_VARIANT (t) == char_type_node
3644 || TYPE_MAIN_VARIANT (t) == signed_char_type_node
3645 || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node
3646 || TYPE_MAIN_VARIANT (t) == short_integer_type_node
3647 || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node
3648 || TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node));
3650 case ENUMERAL_TYPE:
3651 /* ??? Technically all enumerations not larger than an int
3652 promote to an int. But this is used along code paths
3653 that only want to notice a size change. */
3654 return TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node);
3656 case BOOLEAN_TYPE:
3657 return 1;
3659 default:
3660 return 0;
3664 /* Return 1 if PARMS specifies a fixed number of parameters
3665 and none of their types is affected by default promotions. */
3668 self_promoting_args_p (parms)
3669 tree parms;
3671 tree t;
3672 for (t = parms; t; t = TREE_CHAIN (t))
3674 tree type = TREE_VALUE (t);
3676 if (TREE_CHAIN (t) == 0 && type != void_type_node)
3677 return 0;
3679 if (type == 0)
3680 return 0;
3682 if (TYPE_MAIN_VARIANT (type) == float_type_node)
3683 return 0;
3685 if (c_promoting_integer_type_p (type))
3686 return 0;
3688 return 1;
3691 /* Recursively examines the array elements of TYPE, until a non-array
3692 element type is found. */
3694 tree
3695 strip_array_types (type)
3696 tree type;
3698 while (TREE_CODE (type) == ARRAY_TYPE)
3699 type = TREE_TYPE (type);
3701 return type;
3704 static tree expand_unordered_cmp PARAMS ((tree, tree, enum tree_code,
3705 enum tree_code));
3707 /* Expand a call to an unordered comparison function such as
3708 __builtin_isgreater(). FUNCTION is the function's declaration and
3709 PARAMS a list of the values passed. For __builtin_isunordered(),
3710 UNORDERED_CODE is UNORDERED_EXPR and ORDERED_CODE is NOP_EXPR. In
3711 other cases, UNORDERED_CODE and ORDERED_CODE are comparison codes
3712 that give the opposite of the desired result. UNORDERED_CODE is
3713 used for modes that can hold NaNs and ORDERED_CODE is used for the
3714 rest. */
3716 static tree
3717 expand_unordered_cmp (function, params, unordered_code, ordered_code)
3718 tree function, params;
3719 enum tree_code unordered_code, ordered_code;
3721 tree arg0, arg1, type;
3722 enum tree_code code0, code1;
3724 /* Check that we have exactly two arguments. */
3725 if (params == 0 || TREE_CHAIN (params) == 0)
3727 error ("too few arguments to function `%s'",
3728 IDENTIFIER_POINTER (DECL_NAME (function)));
3729 return error_mark_node;
3731 else if (TREE_CHAIN (TREE_CHAIN (params)) != 0)
3733 error ("too many arguments to function `%s'",
3734 IDENTIFIER_POINTER (DECL_NAME (function)));
3735 return error_mark_node;
3738 arg0 = TREE_VALUE (params);
3739 arg1 = TREE_VALUE (TREE_CHAIN (params));
3741 code0 = TREE_CODE (TREE_TYPE (arg0));
3742 code1 = TREE_CODE (TREE_TYPE (arg1));
3744 /* Make sure that the arguments have a common type of REAL. */
3745 type = 0;
3746 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3747 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3748 type = common_type (TREE_TYPE (arg0), TREE_TYPE (arg1));
3750 if (type == 0 || TREE_CODE (type) != REAL_TYPE)
3752 error ("non-floating-point argument to function `%s'",
3753 IDENTIFIER_POINTER (DECL_NAME (function)));
3754 return error_mark_node;
3757 if (unordered_code == UNORDERED_EXPR)
3759 if (MODE_HAS_NANS (TYPE_MODE (type)))
3760 return build_binary_op (unordered_code,
3761 convert (type, arg0),
3762 convert (type, arg1),
3764 else
3765 return integer_zero_node;
3768 return build_unary_op (TRUTH_NOT_EXPR,
3769 build_binary_op (MODE_HAS_NANS (TYPE_MODE (type))
3770 ? unordered_code
3771 : ordered_code,
3772 convert (type, arg0),
3773 convert (type, arg1),
3779 /* Recognize certain built-in functions so we can make tree-codes
3780 other than CALL_EXPR. We do this when it enables fold-const.c
3781 to do something useful. */
3782 /* ??? By rights this should go in builtins.c, but only C and C++
3783 implement build_{binary,unary}_op. Not exactly sure what bits
3784 of functionality are actually needed from those functions, or
3785 where the similar functionality exists in the other front ends. */
3787 tree
3788 expand_tree_builtin (function, params, coerced_params)
3789 tree function, params, coerced_params;
3791 if (DECL_BUILT_IN_CLASS (function) != BUILT_IN_NORMAL)
3792 return NULL_TREE;
3794 switch (DECL_FUNCTION_CODE (function))
3796 case BUILT_IN_ABS:
3797 case BUILT_IN_LABS:
3798 case BUILT_IN_LLABS:
3799 case BUILT_IN_IMAXABS:
3800 case BUILT_IN_FABS:
3801 case BUILT_IN_FABSL:
3802 case BUILT_IN_FABSF:
3803 if (coerced_params == 0)
3804 return integer_zero_node;
3805 return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
3807 case BUILT_IN_CONJ:
3808 case BUILT_IN_CONJF:
3809 case BUILT_IN_CONJL:
3810 if (coerced_params == 0)
3811 return integer_zero_node;
3812 return build_unary_op (CONJ_EXPR, TREE_VALUE (coerced_params), 0);
3814 case BUILT_IN_CREAL:
3815 case BUILT_IN_CREALF:
3816 case BUILT_IN_CREALL:
3817 if (coerced_params == 0)
3818 return integer_zero_node;
3819 return build_unary_op (REALPART_EXPR, TREE_VALUE (coerced_params), 0);
3821 case BUILT_IN_CIMAG:
3822 case BUILT_IN_CIMAGF:
3823 case BUILT_IN_CIMAGL:
3824 if (coerced_params == 0)
3825 return integer_zero_node;
3826 return build_unary_op (IMAGPART_EXPR, TREE_VALUE (coerced_params), 0);
3828 case BUILT_IN_ISGREATER:
3829 return expand_unordered_cmp (function, params, UNLE_EXPR, LE_EXPR);
3831 case BUILT_IN_ISGREATEREQUAL:
3832 return expand_unordered_cmp (function, params, UNLT_EXPR, LT_EXPR);
3834 case BUILT_IN_ISLESS:
3835 return expand_unordered_cmp (function, params, UNGE_EXPR, GE_EXPR);
3837 case BUILT_IN_ISLESSEQUAL:
3838 return expand_unordered_cmp (function, params, UNGT_EXPR, GT_EXPR);
3840 case BUILT_IN_ISLESSGREATER:
3841 return expand_unordered_cmp (function, params, UNEQ_EXPR, EQ_EXPR);
3843 case BUILT_IN_ISUNORDERED:
3844 return expand_unordered_cmp (function, params, UNORDERED_EXPR, NOP_EXPR);
3846 default:
3847 break;
3850 return NULL_TREE;
3853 /* Returns non-zero if CODE is the code for a statement. */
3856 statement_code_p (code)
3857 enum tree_code code;
3859 switch (code)
3861 case CLEANUP_STMT:
3862 case EXPR_STMT:
3863 case COMPOUND_STMT:
3864 case DECL_STMT:
3865 case IF_STMT:
3866 case FOR_STMT:
3867 case WHILE_STMT:
3868 case DO_STMT:
3869 case RETURN_STMT:
3870 case BREAK_STMT:
3871 case CONTINUE_STMT:
3872 case SCOPE_STMT:
3873 case SWITCH_STMT:
3874 case GOTO_STMT:
3875 case LABEL_STMT:
3876 case ASM_STMT:
3877 case FILE_STMT:
3878 case CASE_LABEL:
3879 return 1;
3881 default:
3882 if (lang_statement_code_p)
3883 return (*lang_statement_code_p) (code);
3884 return 0;
3888 /* Walk the statement tree, rooted at *tp. Apply FUNC to all the
3889 sub-trees of *TP in a pre-order traversal. FUNC is called with the
3890 DATA and the address of each sub-tree. If FUNC returns a non-NULL
3891 value, the traversal is aborted, and the value returned by FUNC is
3892 returned. If FUNC sets WALK_SUBTREES to zero, then the subtrees of
3893 the node being visited are not walked.
3895 We don't need a without_duplicates variant of this one because the
3896 statement tree is a tree, not a graph. */
3898 tree
3899 walk_stmt_tree (tp, func, data)
3900 tree *tp;
3901 walk_tree_fn func;
3902 void *data;
3904 enum tree_code code;
3905 int walk_subtrees;
3906 tree result;
3907 int i, len;
3909 #define WALK_SUBTREE(NODE) \
3910 do \
3912 result = walk_stmt_tree (&(NODE), func, data); \
3913 if (result) \
3914 return result; \
3916 while (0)
3918 /* Skip empty subtrees. */
3919 if (!*tp)
3920 return NULL_TREE;
3922 /* Skip subtrees below non-statement nodes. */
3923 if (!statement_code_p (TREE_CODE (*tp)))
3924 return NULL_TREE;
3926 /* Call the function. */
3927 walk_subtrees = 1;
3928 result = (*func) (tp, &walk_subtrees, data);
3930 /* If we found something, return it. */
3931 if (result)
3932 return result;
3934 /* FUNC may have modified the tree, recheck that we're looking at a
3935 statement node. */
3936 code = TREE_CODE (*tp);
3937 if (!statement_code_p (code))
3938 return NULL_TREE;
3940 /* Visit the subtrees unless FUNC decided that there was nothing
3941 interesting below this point in the tree. */
3942 if (walk_subtrees)
3944 /* Walk over all the sub-trees of this operand. Statement nodes
3945 never contain RTL, and we needn't worry about TARGET_EXPRs. */
3946 len = TREE_CODE_LENGTH (code);
3948 /* Go through the subtrees. We need to do this in forward order so
3949 that the scope of a FOR_EXPR is handled properly. */
3950 for (i = 0; i < len; ++i)
3951 WALK_SUBTREE (TREE_OPERAND (*tp, i));
3954 /* Finally visit the chain. This can be tail-recursion optimized if
3955 we write it this way. */
3956 return walk_stmt_tree (&TREE_CHAIN (*tp), func, data);
3958 #undef WALK_SUBTREE
3961 /* Used to compare case labels. K1 and K2 are actually tree nodes
3962 representing case labels, or NULL_TREE for a `default' label.
3963 Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
3964 K2, and 0 if K1 and K2 are equal. */
3967 case_compare (k1, k2)
3968 splay_tree_key k1;
3969 splay_tree_key k2;
3971 /* Consider a NULL key (such as arises with a `default' label) to be
3972 smaller than anything else. */
3973 if (!k1)
3974 return k2 ? -1 : 0;
3975 else if (!k2)
3976 return k1 ? 1 : 0;
3978 return tree_int_cst_compare ((tree) k1, (tree) k2);
3981 /* Process a case label for the range LOW_VALUE ... HIGH_VALUE. If
3982 LOW_VALUE and HIGH_VALUE are both NULL_TREE then this case label is
3983 actually a `default' label. If only HIGH_VALUE is NULL_TREE, then
3984 case label was declared using the usual C/C++ syntax, rather than
3985 the GNU case range extension. CASES is a tree containing all the
3986 case ranges processed so far; COND is the condition for the
3987 switch-statement itself. Returns the CASE_LABEL created, or
3988 ERROR_MARK_NODE if no CASE_LABEL is created. */
3990 tree
3991 c_add_case_label (cases, cond, low_value, high_value)
3992 splay_tree cases;
3993 tree cond;
3994 tree low_value;
3995 tree high_value;
3997 tree type;
3998 tree label;
3999 tree case_label;
4000 splay_tree_node node;
4002 /* Create the LABEL_DECL itself. */
4003 label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
4004 DECL_CONTEXT (label) = current_function_decl;
4006 /* If there was an error processing the switch condition, bail now
4007 before we get more confused. */
4008 if (!cond || cond == error_mark_node)
4010 /* Add a label anyhow so that the back-end doesn't think that
4011 the beginning of the switch is unreachable. */
4012 if (!cases->root)
4013 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
4014 return error_mark_node;
4017 if ((low_value && TREE_TYPE (low_value)
4018 && POINTER_TYPE_P (TREE_TYPE (low_value)))
4019 || (high_value && TREE_TYPE (high_value)
4020 && POINTER_TYPE_P (TREE_TYPE (high_value))))
4021 error ("pointers are not permitted as case values");
4023 /* Case ranges are a GNU extension. */
4024 if (high_value && pedantic)
4026 if (c_language == clk_cplusplus)
4027 pedwarn ("ISO C++ forbids range expressions in switch statements");
4028 else
4029 pedwarn ("ISO C forbids range expressions in switch statements");
4032 type = TREE_TYPE (cond);
4033 if (low_value)
4035 low_value = check_case_value (low_value);
4036 low_value = convert_and_check (type, low_value);
4038 if (high_value)
4040 high_value = check_case_value (high_value);
4041 high_value = convert_and_check (type, high_value);
4044 /* If an error has occurred, bail out now. */
4045 if (low_value == error_mark_node || high_value == error_mark_node)
4047 if (!cases->root)
4048 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
4049 return error_mark_node;
4052 /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
4053 really a case range, even though it was written that way. Remove
4054 the HIGH_VALUE to simplify later processing. */
4055 if (tree_int_cst_equal (low_value, high_value))
4056 high_value = NULL_TREE;
4057 if (low_value && high_value
4058 && !tree_int_cst_lt (low_value, high_value))
4059 warning ("empty range specified");
4061 /* Look up the LOW_VALUE in the table of case labels we already
4062 have. */
4063 node = splay_tree_lookup (cases, (splay_tree_key) low_value);
4064 /* If there was not an exact match, check for overlapping ranges.
4065 There's no need to do this if there's no LOW_VALUE or HIGH_VALUE;
4066 that's a `default' label and the only overlap is an exact match. */
4067 if (!node && (low_value || high_value))
4069 splay_tree_node low_bound;
4070 splay_tree_node high_bound;
4072 /* Even though there wasn't an exact match, there might be an
4073 overlap between this case range and another case range.
4074 Since we've (inductively) not allowed any overlapping case
4075 ranges, we simply need to find the greatest low case label
4076 that is smaller that LOW_VALUE, and the smallest low case
4077 label that is greater than LOW_VALUE. If there is an overlap
4078 it will occur in one of these two ranges. */
4079 low_bound = splay_tree_predecessor (cases,
4080 (splay_tree_key) low_value);
4081 high_bound = splay_tree_successor (cases,
4082 (splay_tree_key) low_value);
4084 /* Check to see if the LOW_BOUND overlaps. It is smaller than
4085 the LOW_VALUE, so there is no need to check unless the
4086 LOW_BOUND is in fact itself a case range. */
4087 if (low_bound
4088 && CASE_HIGH ((tree) low_bound->value)
4089 && tree_int_cst_compare (CASE_HIGH ((tree) low_bound->value),
4090 low_value) >= 0)
4091 node = low_bound;
4092 /* Check to see if the HIGH_BOUND overlaps. The low end of that
4093 range is bigger than the low end of the current range, so we
4094 are only interested if the current range is a real range, and
4095 not an ordinary case label. */
4096 else if (high_bound
4097 && high_value
4098 && (tree_int_cst_compare ((tree) high_bound->key,
4099 high_value)
4100 <= 0))
4101 node = high_bound;
4103 /* If there was an overlap, issue an error. */
4104 if (node)
4106 tree duplicate = CASE_LABEL_DECL ((tree) node->value);
4108 if (high_value)
4110 error ("duplicate (or overlapping) case value");
4111 error_with_decl (duplicate,
4112 "this is the first entry overlapping that value");
4114 else if (low_value)
4116 error ("duplicate case value") ;
4117 error_with_decl (duplicate, "previously used here");
4119 else
4121 error ("multiple default labels in one switch");
4122 error_with_decl (duplicate, "this is the first default label");
4124 if (!cases->root)
4125 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
4128 /* Add a CASE_LABEL to the statement-tree. */
4129 case_label = add_stmt (build_case_label (low_value, high_value, label));
4130 /* Register this case label in the splay tree. */
4131 splay_tree_insert (cases,
4132 (splay_tree_key) low_value,
4133 (splay_tree_value) case_label);
4135 return case_label;
4138 /* Finish an expression taking the address of LABEL. Returns an
4139 expression for the address. */
4141 tree
4142 finish_label_address_expr (label)
4143 tree label;
4145 tree result;
4147 if (pedantic)
4149 if (c_language == clk_cplusplus)
4150 pedwarn ("ISO C++ forbids taking the address of a label");
4151 else
4152 pedwarn ("ISO C forbids taking the address of a label");
4155 label = lookup_label (label);
4156 if (label == NULL_TREE)
4157 result = null_pointer_node;
4158 else
4160 TREE_USED (label) = 1;
4161 result = build1 (ADDR_EXPR, ptr_type_node, label);
4162 TREE_CONSTANT (result) = 1;
4163 /* The current function in not necessarily uninlinable.
4164 Computed gotos are incompatible with inlining, but the value
4165 here could be used only in a diagnostic, for example. */
4168 return result;
4171 /* Hook used by expand_expr to expand language-specific tree codes. */
4174 c_expand_expr (exp, target, tmode, modifier)
4175 tree exp;
4176 rtx target;
4177 enum machine_mode tmode;
4178 int modifier; /* Actually enum_modifier. */
4180 switch (TREE_CODE (exp))
4182 case STMT_EXPR:
4184 tree rtl_expr;
4185 rtx result;
4186 bool preserve_result = false;
4187 bool return_target = false;
4189 /* Since expand_expr_stmt calls free_temp_slots after every
4190 expression statement, we must call push_temp_slots here.
4191 Otherwise, any temporaries in use now would be considered
4192 out-of-scope after the first EXPR_STMT from within the
4193 STMT_EXPR. */
4194 push_temp_slots ();
4195 rtl_expr = expand_start_stmt_expr (!STMT_EXPR_NO_SCOPE (exp));
4197 /* If we want the result of this expression, find the last
4198 EXPR_STMT in the COMPOUND_STMT and mark it as addressable. */
4199 if (target != const0_rtx
4200 && TREE_CODE (STMT_EXPR_STMT (exp)) == COMPOUND_STMT
4201 && TREE_CODE (COMPOUND_BODY (STMT_EXPR_STMT (exp))) == SCOPE_STMT)
4203 tree expr = COMPOUND_BODY (STMT_EXPR_STMT (exp));
4204 tree last = TREE_CHAIN (expr);
4206 while (TREE_CHAIN (last))
4208 expr = last;
4209 last = TREE_CHAIN (last);
4212 if (TREE_CODE (last) == SCOPE_STMT
4213 && TREE_CODE (expr) == EXPR_STMT)
4215 if (target && TREE_CODE (EXPR_STMT_EXPR (expr)) == VAR_DECL
4216 && DECL_RTL_IF_SET (EXPR_STMT_EXPR (expr)) == target)
4217 /* If the last expression is a variable whose RTL is the
4218 same as our target, just return the target; if it
4219 isn't valid expanding the decl would produce different
4220 RTL, and store_expr would try to do a copy. */
4221 return_target = true;
4222 else
4224 /* Otherwise, note that we want the value from the last
4225 expression. */
4226 TREE_ADDRESSABLE (expr) = 1;
4227 preserve_result = true;
4232 expand_stmt (STMT_EXPR_STMT (exp));
4233 expand_end_stmt_expr (rtl_expr);
4235 result = expand_expr (rtl_expr, target, tmode, modifier);
4236 if (return_target)
4237 result = target;
4238 else if (preserve_result && GET_CODE (result) == MEM)
4240 if (GET_MODE (result) != BLKmode)
4241 result = copy_to_reg (result);
4242 else
4243 preserve_temp_slots (result);
4246 /* If the statment-expression does not have a scope, then the
4247 new temporaries we created within it must live beyond the
4248 statement-expression. */
4249 if (STMT_EXPR_NO_SCOPE (exp))
4250 preserve_temp_slots (NULL_RTX);
4252 pop_temp_slots ();
4253 return result;
4255 break;
4257 case CALL_EXPR:
4259 if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
4260 && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
4261 == FUNCTION_DECL)
4262 && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
4263 && (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
4264 == BUILT_IN_FRONTEND))
4265 return c_expand_builtin (exp, target, tmode, modifier);
4266 else
4267 abort ();
4269 break;
4271 case COMPOUND_LITERAL_EXPR:
4273 /* Initialize the anonymous variable declared in the compound
4274 literal, then return the variable. */
4275 tree decl = COMPOUND_LITERAL_EXPR_DECL (exp);
4276 emit_local_var (decl);
4277 return expand_expr (decl, target, tmode, modifier);
4280 default:
4281 abort ();
4284 abort ();
4285 return NULL;
4288 /* Hook used by safe_from_p to handle language-specific tree codes. */
4291 c_safe_from_p (target, exp)
4292 rtx target;
4293 tree exp;
4295 /* We can see statements here when processing the body of a
4296 statement-expression. For a declaration statement declaring a
4297 variable, look at the variable's initializer. */
4298 if (TREE_CODE (exp) == DECL_STMT)
4300 tree decl = DECL_STMT_DECL (exp);
4302 if (TREE_CODE (decl) == VAR_DECL
4303 && DECL_INITIAL (decl)
4304 && !safe_from_p (target, DECL_INITIAL (decl), /*top_p=*/0))
4305 return 0;
4308 /* For any statement, we must follow the statement-chain. */
4309 if (statement_code_p (TREE_CODE (exp)) && TREE_CHAIN (exp))
4310 return safe_from_p (target, TREE_CHAIN (exp), /*top_p=*/0);
4312 /* Assume everything else is safe. */
4313 return 1;
4316 /* Hook used by unsafe_for_reeval to handle language-specific tree codes. */
4319 c_common_unsafe_for_reeval (exp)
4320 tree exp;
4322 /* Statement expressions may not be reevaluated, likewise compound
4323 literals. */
4324 if (TREE_CODE (exp) == STMT_EXPR
4325 || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
4326 return 2;
4328 /* Walk all other expressions. */
4329 return -1;
4332 /* Hook used by staticp to handle language-specific tree codes. */
4335 c_staticp (exp)
4336 tree exp;
4338 if (TREE_CODE (exp) == COMPOUND_LITERAL_EXPR
4339 && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp)))
4340 return 1;
4341 return 0;
4344 #define CALLED_AS_BUILT_IN(NODE) \
4345 (!strncmp (IDENTIFIER_POINTER (DECL_NAME (NODE)), "__builtin_", 10))
4347 static rtx
4348 c_expand_builtin (exp, target, tmode, modifier)
4349 tree exp;
4350 rtx target;
4351 enum machine_mode tmode;
4352 enum expand_modifier modifier;
4354 tree type = TREE_TYPE (exp);
4355 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4356 tree arglist = TREE_OPERAND (exp, 1);
4357 enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
4358 enum tree_code code = TREE_CODE (exp);
4359 const int ignore = (target == const0_rtx
4360 || ((code == NON_LVALUE_EXPR || code == NOP_EXPR
4361 || code == CONVERT_EXPR || code == REFERENCE_EXPR
4362 || code == COND_EXPR)
4363 && TREE_CODE (type) == VOID_TYPE));
4365 if (! optimize && ! CALLED_AS_BUILT_IN (fndecl))
4366 return expand_call (exp, target, ignore);
4368 switch (fcode)
4370 case BUILT_IN_PRINTF:
4371 target = c_expand_builtin_printf (arglist, target, tmode,
4372 modifier, ignore, /*unlocked=*/ 0);
4373 if (target)
4374 return target;
4375 break;
4377 case BUILT_IN_PRINTF_UNLOCKED:
4378 target = c_expand_builtin_printf (arglist, target, tmode,
4379 modifier, ignore, /*unlocked=*/ 1);
4380 if (target)
4381 return target;
4382 break;
4384 case BUILT_IN_FPRINTF:
4385 target = c_expand_builtin_fprintf (arglist, target, tmode,
4386 modifier, ignore, /*unlocked=*/ 0);
4387 if (target)
4388 return target;
4389 break;
4391 case BUILT_IN_FPRINTF_UNLOCKED:
4392 target = c_expand_builtin_fprintf (arglist, target, tmode,
4393 modifier, ignore, /*unlocked=*/ 1);
4394 if (target)
4395 return target;
4396 break;
4398 default: /* just do library call, if unknown builtin */
4399 error ("built-in function `%s' not currently supported",
4400 IDENTIFIER_POINTER (DECL_NAME (fndecl)));
4403 /* The switch statement above can drop through to cause the function
4404 to be called normally. */
4405 return expand_call (exp, target, ignore);
4408 /* Check an arglist to *printf for problems. The arglist should start
4409 at the format specifier, with the remaining arguments immediately
4410 following it. */
4411 static int
4412 is_valid_printf_arglist (arglist)
4413 tree arglist;
4415 /* Save this value so we can restore it later. */
4416 const int SAVE_pedantic = pedantic;
4417 int diagnostic_occurred = 0;
4418 tree attrs;
4420 /* Set this to a known value so the user setting won't affect code
4421 generation. */
4422 pedantic = 1;
4423 /* Check to make sure there are no format specifier errors. */
4424 attrs = tree_cons (get_identifier ("format"),
4425 tree_cons (NULL_TREE,
4426 get_identifier ("printf"),
4427 tree_cons (NULL_TREE,
4428 integer_one_node,
4429 tree_cons (NULL_TREE,
4430 build_int_2 (2, 0),
4431 NULL_TREE))),
4432 NULL_TREE);
4433 check_function_format (&diagnostic_occurred, attrs, arglist);
4435 /* Restore the value of `pedantic'. */
4436 pedantic = SAVE_pedantic;
4438 /* If calling `check_function_format_ptr' produces a warning, we
4439 return false, otherwise we return true. */
4440 return ! diagnostic_occurred;
4443 /* If the arguments passed to printf are suitable for optimizations,
4444 we attempt to transform the call. */
4445 static rtx
4446 c_expand_builtin_printf (arglist, target, tmode, modifier, ignore, unlocked)
4447 tree arglist;
4448 rtx target;
4449 enum machine_mode tmode;
4450 enum expand_modifier modifier;
4451 int ignore;
4452 int unlocked;
4454 tree fn_putchar = unlocked ?
4455 built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED] : built_in_decls[BUILT_IN_PUTCHAR];
4456 tree fn_puts = unlocked ?
4457 built_in_decls[BUILT_IN_PUTS_UNLOCKED] : built_in_decls[BUILT_IN_PUTS];
4458 tree fn, format_arg, stripped_string;
4460 /* If the return value is used, or the replacement _DECL isn't
4461 initialized, don't do the transformation. */
4462 if (!ignore || !fn_putchar || !fn_puts)
4463 return 0;
4465 /* Verify the required arguments in the original call. */
4466 if (arglist == 0
4467 || (TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE))
4468 return 0;
4470 /* Check the specifier vs. the parameters. */
4471 if (!is_valid_printf_arglist (arglist))
4472 return 0;
4474 format_arg = TREE_VALUE (arglist);
4475 stripped_string = format_arg;
4476 STRIP_NOPS (stripped_string);
4477 if (stripped_string && TREE_CODE (stripped_string) == ADDR_EXPR)
4478 stripped_string = TREE_OPERAND (stripped_string, 0);
4480 /* If the format specifier isn't a STRING_CST, punt. */
4481 if (TREE_CODE (stripped_string) != STRING_CST)
4482 return 0;
4484 /* OK! We can attempt optimization. */
4486 /* If the format specifier was "%s\n", call __builtin_puts(arg2). */
4487 if (strcmp (TREE_STRING_POINTER (stripped_string), "%s\n") == 0)
4489 arglist = TREE_CHAIN (arglist);
4490 fn = fn_puts;
4492 /* If the format specifier was "%c", call __builtin_putchar (arg2). */
4493 else if (strcmp (TREE_STRING_POINTER (stripped_string), "%c") == 0)
4495 arglist = TREE_CHAIN (arglist);
4496 fn = fn_putchar;
4498 else
4500 /* We can't handle anything else with % args or %% ... yet. */
4501 if (strchr (TREE_STRING_POINTER (stripped_string), '%'))
4502 return 0;
4504 /* If the resulting constant string has a length of 1, call
4505 putchar. Note, TREE_STRING_LENGTH includes the terminating
4506 NULL in its count. */
4507 if (TREE_STRING_LENGTH (stripped_string) == 2)
4509 /* Given printf("c"), (where c is any one character,)
4510 convert "c"[0] to an int and pass that to the replacement
4511 function. */
4512 arglist = build_int_2 (TREE_STRING_POINTER (stripped_string)[0], 0);
4513 arglist = build_tree_list (NULL_TREE, arglist);
4515 fn = fn_putchar;
4517 /* If the resulting constant was "string\n", call
4518 __builtin_puts("string"). Ensure "string" has at least one
4519 character besides the trailing \n. Note, TREE_STRING_LENGTH
4520 includes the terminating NULL in its count. */
4521 else if (TREE_STRING_LENGTH (stripped_string) > 2
4522 && TREE_STRING_POINTER (stripped_string)
4523 [TREE_STRING_LENGTH (stripped_string) - 2] == '\n')
4525 /* Create a NULL-terminated string that's one char shorter
4526 than the original, stripping off the trailing '\n'. */
4527 const int newlen = TREE_STRING_LENGTH (stripped_string) - 1;
4528 char *newstr = (char *) alloca (newlen);
4529 memcpy (newstr, TREE_STRING_POINTER (stripped_string), newlen - 1);
4530 newstr[newlen - 1] = 0;
4532 arglist = fix_string_type (build_string (newlen, newstr));
4533 arglist = build_tree_list (NULL_TREE, arglist);
4534 fn = fn_puts;
4536 else
4537 /* We'd like to arrange to call fputs(string) here, but we
4538 need stdout and don't have a way to get it ... yet. */
4539 return 0;
4542 return expand_expr (build_function_call (fn, arglist),
4543 (ignore ? const0_rtx : target),
4544 tmode, modifier);
4547 /* If the arguments passed to fprintf are suitable for optimizations,
4548 we attempt to transform the call. */
4549 static rtx
4550 c_expand_builtin_fprintf (arglist, target, tmode, modifier, ignore, unlocked)
4551 tree arglist;
4552 rtx target;
4553 enum machine_mode tmode;
4554 enum expand_modifier modifier;
4555 int ignore;
4556 int unlocked;
4558 tree fn_fputc = unlocked ?
4559 built_in_decls[BUILT_IN_FPUTC_UNLOCKED] : built_in_decls[BUILT_IN_FPUTC];
4560 tree fn_fputs = unlocked ?
4561 built_in_decls[BUILT_IN_FPUTS_UNLOCKED] : built_in_decls[BUILT_IN_FPUTS];
4562 tree fn, format_arg, stripped_string;
4564 /* If the return value is used, or the replacement _DECL isn't
4565 initialized, don't do the transformation. */
4566 if (!ignore || !fn_fputc || !fn_fputs)
4567 return 0;
4569 /* Verify the required arguments in the original call. */
4570 if (arglist == 0
4571 || (TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
4572 || (TREE_CHAIN (arglist) == 0)
4573 || (TREE_CODE (TREE_TYPE (TREE_VALUE (TREE_CHAIN (arglist)))) !=
4574 POINTER_TYPE))
4575 return 0;
4577 /* Check the specifier vs. the parameters. */
4578 if (!is_valid_printf_arglist (TREE_CHAIN (arglist)))
4579 return 0;
4581 format_arg = TREE_VALUE (TREE_CHAIN (arglist));
4582 stripped_string = format_arg;
4583 STRIP_NOPS (stripped_string);
4584 if (stripped_string && TREE_CODE (stripped_string) == ADDR_EXPR)
4585 stripped_string = TREE_OPERAND (stripped_string, 0);
4587 /* If the format specifier isn't a STRING_CST, punt. */
4588 if (TREE_CODE (stripped_string) != STRING_CST)
4589 return 0;
4591 /* OK! We can attempt optimization. */
4593 /* If the format specifier was "%s", call __builtin_fputs(arg3, arg1). */
4594 if (strcmp (TREE_STRING_POINTER (stripped_string), "%s") == 0)
4596 tree newarglist = build_tree_list (NULL_TREE, TREE_VALUE (arglist));
4597 arglist = tree_cons (NULL_TREE,
4598 TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))),
4599 newarglist);
4600 fn = fn_fputs;
4602 /* If the format specifier was "%c", call __builtin_fputc (arg3, arg1). */
4603 else if (strcmp (TREE_STRING_POINTER (stripped_string), "%c") == 0)
4605 tree newarglist = build_tree_list (NULL_TREE, TREE_VALUE (arglist));
4606 arglist = tree_cons (NULL_TREE,
4607 TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))),
4608 newarglist);
4609 fn = fn_fputc;
4611 else
4613 /* We can't handle anything else with % args or %% ... yet. */
4614 if (strchr (TREE_STRING_POINTER (stripped_string), '%'))
4615 return 0;
4617 /* When "string" doesn't contain %, replace all cases of
4618 fprintf(stream,string) with fputs(string,stream). The fputs
4619 builtin will take take of special cases like length==1. */
4620 arglist = tree_cons (NULL_TREE, TREE_VALUE (TREE_CHAIN (arglist)),
4621 build_tree_list (NULL_TREE, TREE_VALUE (arglist)));
4622 fn = fn_fputs;
4625 return expand_expr (build_function_call (fn, arglist),
4626 (ignore ? const0_rtx : target),
4627 tmode, modifier);
4631 /* Given a boolean expression ARG, return a tree representing an increment
4632 or decrement (as indicated by CODE) of ARG. The front end must check for
4633 invalid cases (e.g., decrement in C++). */
4634 tree
4635 boolean_increment (code, arg)
4636 enum tree_code code;
4637 tree arg;
4639 tree val;
4640 tree true_res = (c_language == clk_cplusplus
4641 ? boolean_true_node
4642 : c_bool_true_node);
4643 arg = stabilize_reference (arg);
4644 switch (code)
4646 case PREINCREMENT_EXPR:
4647 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
4648 break;
4649 case POSTINCREMENT_EXPR:
4650 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
4651 arg = save_expr (arg);
4652 val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4653 val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4654 break;
4655 case PREDECREMENT_EXPR:
4656 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg));
4657 break;
4658 case POSTDECREMENT_EXPR:
4659 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg));
4660 arg = save_expr (arg);
4661 val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4662 val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4663 break;
4664 default:
4665 abort ();
4667 TREE_SIDE_EFFECTS (val) = 1;
4668 return val;
4671 /* Hook that registers front end and target-specific built-ins. */
4672 static void
4673 cb_register_builtins (pfile)
4674 cpp_reader *pfile;
4676 /* -undef turns off target-specific built-ins. */
4677 if (flag_undef)
4678 return;
4680 if (c_language == clk_cplusplus)
4682 if (SUPPORTS_ONE_ONLY)
4683 cpp_define (pfile, "__GXX_WEAK__=1");
4684 else
4685 cpp_define (pfile, "__GXX_WEAK__=0");
4686 if (flag_exceptions)
4687 cpp_define (pfile, "__EXCEPTIONS");
4688 if (warn_deprecated)
4689 cpp_define (pfile, "__DEPRECATED");
4692 /* represents the C++ ABI version, always defined so it can be used while
4693 preprocessing C and assembler. */
4694 cpp_define (pfile, "__GXX_ABI_VERSION=102");
4696 /* libgcc needs to know this. */
4697 if (USING_SJLJ_EXCEPTIONS)
4698 cpp_define (pfile, "__USING_SJLJ_EXCEPTIONS__");
4700 /* stddef.h needs to know these. */
4701 builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0);
4702 builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
4703 builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
4704 builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
4706 /* limits.h needs to know these. */
4707 builtin_define_type_max ("__SCHAR_MAX__", signed_char_type_node, 0);
4708 builtin_define_type_max ("__SHRT_MAX__", short_integer_type_node, 0);
4709 builtin_define_type_max ("__INT_MAX__", integer_type_node, 0);
4710 builtin_define_type_max ("__LONG_MAX__", long_integer_type_node, 1);
4711 builtin_define_type_max ("__LONG_LONG_MAX__", long_long_integer_type_node, 2);
4714 char buf[8];
4715 sprintf (buf, "%d", (int) TYPE_PRECISION (signed_char_type_node));
4716 builtin_define_with_value ("__CHAR_BIT__", buf, 0);
4719 /* For use in assembly language. */
4720 builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
4721 builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
4723 /* Misc. */
4724 builtin_define_with_value ("__VERSION__", version_string, 1);
4726 /* Other target-independent built-ins determined by command-line
4727 options. */
4728 if (optimize_size)
4729 cpp_define (pfile, "__OPTIMIZE_SIZE__");
4730 if (optimize)
4731 cpp_define (pfile, "__OPTIMIZE__");
4733 if (flag_hosted)
4734 cpp_define (pfile, "__STDC_HOSTED__=1");
4735 else
4736 cpp_define (pfile, "__STDC_HOSTED__=0");
4738 if (fast_math_flags_set_p ())
4739 cpp_define (pfile, "__FAST_MATH__");
4740 if (flag_no_inline)
4741 cpp_define (pfile, "__NO_INLINE__");
4742 if (flag_signaling_nans)
4743 cpp_define (pfile, "__SUPPORT_SNAN__");
4744 if (flag_finite_math_only)
4745 cpp_define (pfile, "__FINITE_MATH_ONLY__=1");
4746 else
4747 cpp_define (pfile, "__FINITE_MATH_ONLY__=0");
4749 if (flag_iso)
4750 cpp_define (pfile, "__STRICT_ANSI__");
4752 if (!flag_signed_char)
4753 cpp_define (pfile, "__CHAR_UNSIGNED__");
4755 /* A straightforward target hook doesn't work, because of problems
4756 linking that hook's body when part of non-C front ends. */
4757 # define preprocessing_asm_p() (cpp_get_options (pfile)->lang == CLK_ASM)
4758 # define builtin_define(TXT) cpp_define (pfile, TXT)
4759 # define builtin_assert(TXT) cpp_assert (pfile, TXT)
4760 TARGET_CPU_CPP_BUILTINS ();
4761 TARGET_OS_CPP_BUILTINS ();
4764 /* Pass an object-like macro. If it doesn't lie in the user's
4765 namespace, defines it unconditionally. Otherwise define a version
4766 with two leading underscores, and another version with two leading
4767 and trailing underscores, and define the original only if an ISO
4768 standard was not nominated.
4770 e.g. passing "unix" defines "__unix", "__unix__" and possibly
4771 "unix". Passing "_mips" defines "__mips", "__mips__" and possibly
4772 "_mips". */
4773 void
4774 builtin_define_std (macro)
4775 const char *macro;
4777 size_t len = strlen (macro);
4778 char *buff = alloca (len + 5);
4779 char *p = buff + 2;
4780 char *q = p + len;
4782 /* prepend __ (or maybe just _) if in user's namespace. */
4783 memcpy (p, macro, len + 1);
4784 if (!( *p == '_' && (p[1] == '_' || ISUPPER (p[1]))))
4786 if (*p != '_')
4787 *--p = '_';
4788 if (p[1] != '_')
4789 *--p = '_';
4791 cpp_define (parse_in, p);
4793 /* If it was in user's namespace... */
4794 if (p != buff + 2)
4796 /* Define the macro with leading and following __. */
4797 if (q[-1] != '_')
4798 *q++ = '_';
4799 if (q[-2] != '_')
4800 *q++ = '_';
4801 *q = '\0';
4802 cpp_define (parse_in, p);
4804 /* Finally, define the original macro if permitted. */
4805 if (!flag_iso)
4806 cpp_define (parse_in, macro);
4810 /* Pass an object-like macro and a value to define it to. The third
4811 parameter says whether or not to turn the value into a string
4812 constant. */
4813 static void
4814 builtin_define_with_value (macro, expansion, is_str)
4815 const char *macro;
4816 const char *expansion;
4817 int is_str;
4819 char *buf;
4820 size_t mlen = strlen (macro);
4821 size_t elen = strlen (expansion);
4822 size_t extra = 2; /* space for an = and a NUL */
4824 if (is_str)
4825 extra += 2; /* space for two quote marks */
4827 buf = alloca (mlen + elen + extra);
4828 if (is_str)
4829 sprintf (buf, "%s=\"%s\"", macro, expansion);
4830 else
4831 sprintf (buf, "%s=%s", macro, expansion);
4833 cpp_define (parse_in, buf);
4836 /* Define MAX for TYPE based on the precision of the type, which is assumed
4837 to be signed. IS_LONG is 1 for type "long" and 2 for "long long". */
4839 static void
4840 builtin_define_type_max (macro, type, is_long)
4841 const char *macro;
4842 tree type;
4843 int is_long;
4845 const char *value;
4846 char *buf;
4847 size_t mlen, vlen, extra;
4849 /* Pre-rendering the values mean we don't have to futz with printing a
4850 multi-word decimal value. There are also a very limited number of
4851 precisions that we support, so it's really a waste of time. */
4852 switch (TYPE_PRECISION (type))
4854 case 8:
4855 value = "127";
4856 break;
4857 case 16:
4858 value = "32767";
4859 break;
4860 case 32:
4861 value = "2147483647";
4862 break;
4863 case 64:
4864 value = "9223372036854775807";
4865 break;
4866 case 128:
4867 value = "170141183460469231731687303715884105727";
4868 break;
4869 default:
4870 abort ();
4873 mlen = strlen (macro);
4874 vlen = strlen (value);
4875 extra = 2 + is_long;
4876 buf = alloca (mlen + vlen + extra);
4878 sprintf (buf, "%s=%s%s", macro, value,
4879 (is_long == 1 ? "L" : is_long == 2 ? "LL" : ""));
4881 cpp_define (parse_in, buf);
4884 /* Front end initialization common to C, ObjC and C++. */
4885 const char *
4886 c_common_init (filename)
4887 const char *filename;
4889 cpp_options *options = cpp_get_options (parse_in);
4891 /* Set up preprocessor arithmetic. Must be done after call to
4892 c_common_nodes_and_builtins for wchar_type_node to be good. */
4893 options->precision = TYPE_PRECISION (intmax_type_node);
4894 options->char_precision = TYPE_PRECISION (char_type_node);
4895 options->int_precision = TYPE_PRECISION (integer_type_node);
4896 options->wchar_precision = TYPE_PRECISION (wchar_type_node);
4897 options->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
4898 options->unsigned_char = !flag_signed_char;
4899 options->warn_multichar = warn_multichar;
4900 options->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
4902 /* We want -Wno-long-long to override -pedantic -std=non-c99
4903 and/or -Wtraditional, whatever the ordering. */
4904 options->warn_long_long
4905 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
4907 /* Register preprocessor built-ins before calls to
4908 cpp_main_file. */
4909 cpp_get_callbacks (parse_in)->register_builtins = cb_register_builtins;
4911 /* NULL is passed up to toplev.c and we exit quickly. */
4912 if (flag_preprocess_only)
4914 cpp_preprocess_file (parse_in);
4915 return NULL;
4918 /* Do this before initializing pragmas, as then cpplib's hash table
4919 has been set up. */
4920 filename = init_c_lex (filename);
4922 init_pragma ();
4924 if (!c_attrs_initialized)
4925 c_init_attributes ();
4927 return filename;
4930 /* Common finish hook for the C, ObjC and C++ front ends. */
4931 void
4932 c_common_finish ()
4934 cpp_finish (parse_in);
4936 /* For performance, avoid tearing down cpplib's internal structures.
4937 Call cpp_errors () instead of cpp_destroy (). */
4938 errorcount += cpp_errors (parse_in);
4941 static void
4942 c_init_attributes ()
4944 /* Fill in the built_in_attributes array. */
4945 #define DEF_ATTR_NULL_TREE(ENUM) \
4946 built_in_attributes[(int) ENUM] = NULL_TREE;
4947 #define DEF_ATTR_INT(ENUM, VALUE) \
4948 built_in_attributes[(int) ENUM] = build_int_2 (VALUE, VALUE < 0 ? -1 : 0);
4949 #define DEF_ATTR_IDENT(ENUM, STRING) \
4950 built_in_attributes[(int) ENUM] = get_identifier (STRING);
4951 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
4952 built_in_attributes[(int) ENUM] \
4953 = tree_cons (built_in_attributes[(int) PURPOSE], \
4954 built_in_attributes[(int) VALUE], \
4955 built_in_attributes[(int) CHAIN]);
4956 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) /* No initialization needed. */
4957 #include "builtin-attrs.def"
4958 #undef DEF_ATTR_NULL_TREE
4959 #undef DEF_ATTR_INT
4960 #undef DEF_ATTR_IDENT
4961 #undef DEF_ATTR_TREE_LIST
4962 #undef DEF_FN_ATTR
4963 c_attrs_initialized = true;
4966 /* Depending on the name of DECL, apply default attributes to it. */
4968 void
4969 c_common_insert_default_attributes (decl)
4970 tree decl;
4972 tree name = DECL_NAME (decl);
4974 if (!c_attrs_initialized)
4975 c_init_attributes ();
4977 #define DEF_ATTR_NULL_TREE(ENUM) /* Nothing needed after initialization. */
4978 #define DEF_ATTR_INT(ENUM, VALUE)
4979 #define DEF_ATTR_IDENT(ENUM, STRING)
4980 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN)
4981 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) \
4982 if ((PREDICATE) && name == built_in_attributes[(int) NAME]) \
4983 decl_attributes (&decl, built_in_attributes[(int) ATTRS], \
4984 ATTR_FLAG_BUILT_IN);
4985 #include "builtin-attrs.def"
4986 #undef DEF_ATTR_NULL_TREE
4987 #undef DEF_ATTR_INT
4988 #undef DEF_ATTR_IDENT
4989 #undef DEF_ATTR_TREE_LIST
4990 #undef DEF_FN_ATTR
4993 /* Output a -Wshadow warning MSGID about NAME, an IDENTIFIER_NODE, and
4994 additionally give the location of the previous declaration DECL. */
4995 void
4996 shadow_warning (msgid, name, decl)
4997 const char *msgid;
4998 tree name, decl;
5000 warning ("declaration of `%s' shadows %s", IDENTIFIER_POINTER (name), msgid);
5001 warning_with_file_and_line (DECL_SOURCE_FILE (decl),
5002 DECL_SOURCE_LINE (decl),
5003 "shadowed declaration is here");
5006 /* Attribute handlers common to C front ends. */
5008 /* Handle a "packed" attribute; arguments as in
5009 struct attribute_spec.handler. */
5011 static tree
5012 handle_packed_attribute (node, name, args, flags, no_add_attrs)
5013 tree *node;
5014 tree name;
5015 tree args ATTRIBUTE_UNUSED;
5016 int flags;
5017 bool *no_add_attrs;
5019 tree *type = NULL;
5020 if (DECL_P (*node))
5022 if (TREE_CODE (*node) == TYPE_DECL)
5023 type = &TREE_TYPE (*node);
5025 else
5026 type = node;
5028 if (type)
5030 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5031 *type = build_type_copy (*type);
5032 TYPE_PACKED (*type) = 1;
5034 else if (TREE_CODE (*node) == FIELD_DECL)
5035 DECL_PACKED (*node) = 1;
5036 /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
5037 used for DECL_REGISTER. It wouldn't mean anything anyway. */
5038 else
5040 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5041 *no_add_attrs = true;
5044 return NULL_TREE;
5047 /* Handle a "nocommon" attribute; arguments as in
5048 struct attribute_spec.handler. */
5050 static tree
5051 handle_nocommon_attribute (node, name, args, flags, no_add_attrs)
5052 tree *node;
5053 tree name;
5054 tree args ATTRIBUTE_UNUSED;
5055 int flags ATTRIBUTE_UNUSED;
5056 bool *no_add_attrs;
5058 if (TREE_CODE (*node) == VAR_DECL)
5059 DECL_COMMON (*node) = 0;
5060 else
5062 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5063 *no_add_attrs = true;
5066 return NULL_TREE;
5069 /* Handle a "common" attribute; arguments as in
5070 struct attribute_spec.handler. */
5072 static tree
5073 handle_common_attribute (node, name, args, flags, no_add_attrs)
5074 tree *node;
5075 tree name;
5076 tree args ATTRIBUTE_UNUSED;
5077 int flags ATTRIBUTE_UNUSED;
5078 bool *no_add_attrs;
5080 if (TREE_CODE (*node) == VAR_DECL)
5081 DECL_COMMON (*node) = 1;
5082 else
5084 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5085 *no_add_attrs = true;
5088 return NULL_TREE;
5091 /* Handle a "noreturn" attribute; arguments as in
5092 struct attribute_spec.handler. */
5094 static tree
5095 handle_noreturn_attribute (node, name, args, flags, no_add_attrs)
5096 tree *node;
5097 tree name;
5098 tree args ATTRIBUTE_UNUSED;
5099 int flags ATTRIBUTE_UNUSED;
5100 bool *no_add_attrs;
5102 tree type = TREE_TYPE (*node);
5104 /* See FIXME comment in c_common_attribute_table. */
5105 if (TREE_CODE (*node) == FUNCTION_DECL)
5106 TREE_THIS_VOLATILE (*node) = 1;
5107 else if (TREE_CODE (type) == POINTER_TYPE
5108 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5109 TREE_TYPE (*node)
5110 = build_pointer_type
5111 (build_type_variant (TREE_TYPE (type),
5112 TREE_READONLY (TREE_TYPE (type)), 1));
5113 else
5115 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5116 *no_add_attrs = true;
5119 return NULL_TREE;
5122 /* Handle a "noinline" attribute; arguments as in
5123 struct attribute_spec.handler. */
5125 static tree
5126 handle_noinline_attribute (node, name, args, flags, no_add_attrs)
5127 tree *node;
5128 tree name;
5129 tree args ATTRIBUTE_UNUSED;
5130 int flags ATTRIBUTE_UNUSED;
5131 bool *no_add_attrs;
5133 if (TREE_CODE (*node) == FUNCTION_DECL)
5134 DECL_UNINLINABLE (*node) = 1;
5135 else
5137 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5138 *no_add_attrs = true;
5141 return NULL_TREE;
5144 /* Handle a "always_inline" attribute; arguments as in
5145 struct attribute_spec.handler. */
5147 static tree
5148 handle_always_inline_attribute (node, name, args, flags, no_add_attrs)
5149 tree *node;
5150 tree name;
5151 tree args ATTRIBUTE_UNUSED;
5152 int flags ATTRIBUTE_UNUSED;
5153 bool *no_add_attrs;
5155 if (TREE_CODE (*node) == FUNCTION_DECL)
5157 /* Do nothing else, just set the attribute. We'll get at
5158 it later with lookup_attribute. */
5160 else
5162 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5163 *no_add_attrs = true;
5166 return NULL_TREE;
5169 /* Handle a "used" attribute; arguments as in
5170 struct attribute_spec.handler. */
5172 static tree
5173 handle_used_attribute (node, name, args, flags, no_add_attrs)
5174 tree *node;
5175 tree name;
5176 tree args ATTRIBUTE_UNUSED;
5177 int flags ATTRIBUTE_UNUSED;
5178 bool *no_add_attrs;
5180 if (TREE_CODE (*node) == FUNCTION_DECL)
5181 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (*node))
5182 = TREE_USED (*node) = 1;
5183 else
5185 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5186 *no_add_attrs = true;
5189 return NULL_TREE;
5192 /* Handle a "unused" attribute; arguments as in
5193 struct attribute_spec.handler. */
5195 static tree
5196 handle_unused_attribute (node, name, args, flags, no_add_attrs)
5197 tree *node;
5198 tree name;
5199 tree args ATTRIBUTE_UNUSED;
5200 int flags;
5201 bool *no_add_attrs;
5203 if (DECL_P (*node))
5205 tree decl = *node;
5207 if (TREE_CODE (decl) == PARM_DECL
5208 || TREE_CODE (decl) == VAR_DECL
5209 || TREE_CODE (decl) == FUNCTION_DECL
5210 || TREE_CODE (decl) == LABEL_DECL
5211 || TREE_CODE (decl) == TYPE_DECL)
5212 TREE_USED (decl) = 1;
5213 else
5215 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5216 *no_add_attrs = true;
5219 else
5221 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5222 *node = build_type_copy (*node);
5223 TREE_USED (*node) = 1;
5226 return NULL_TREE;
5229 /* Handle a "const" attribute; arguments as in
5230 struct attribute_spec.handler. */
5232 static tree
5233 handle_const_attribute (node, name, args, flags, no_add_attrs)
5234 tree *node;
5235 tree name;
5236 tree args ATTRIBUTE_UNUSED;
5237 int flags ATTRIBUTE_UNUSED;
5238 bool *no_add_attrs;
5240 tree type = TREE_TYPE (*node);
5242 /* See FIXME comment on noreturn in c_common_attribute_table. */
5243 if (TREE_CODE (*node) == FUNCTION_DECL)
5244 TREE_READONLY (*node) = 1;
5245 else if (TREE_CODE (type) == POINTER_TYPE
5246 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5247 TREE_TYPE (*node)
5248 = build_pointer_type
5249 (build_type_variant (TREE_TYPE (type), 1,
5250 TREE_THIS_VOLATILE (TREE_TYPE (type))));
5251 else
5253 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5254 *no_add_attrs = true;
5257 return NULL_TREE;
5260 /* Handle a "transparent_union" attribute; arguments as in
5261 struct attribute_spec.handler. */
5263 static tree
5264 handle_transparent_union_attribute (node, name, args, flags, no_add_attrs)
5265 tree *node;
5266 tree name;
5267 tree args ATTRIBUTE_UNUSED;
5268 int flags;
5269 bool *no_add_attrs;
5271 tree decl = NULL_TREE;
5272 tree *type = NULL;
5273 int is_type = 0;
5275 if (DECL_P (*node))
5277 decl = *node;
5278 type = &TREE_TYPE (decl);
5279 is_type = TREE_CODE (*node) == TYPE_DECL;
5281 else if (TYPE_P (*node))
5282 type = node, is_type = 1;
5284 if (is_type
5285 && TREE_CODE (*type) == UNION_TYPE
5286 && (decl == 0
5287 || (TYPE_FIELDS (*type) != 0
5288 && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))))
5290 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5291 *type = build_type_copy (*type);
5292 TYPE_TRANSPARENT_UNION (*type) = 1;
5294 else if (decl != 0 && TREE_CODE (decl) == PARM_DECL
5295 && TREE_CODE (*type) == UNION_TYPE
5296 && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))
5297 DECL_TRANSPARENT_UNION (decl) = 1;
5298 else
5300 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5301 *no_add_attrs = true;
5304 return NULL_TREE;
5307 /* Handle a "constructor" attribute; arguments as in
5308 struct attribute_spec.handler. */
5310 static tree
5311 handle_constructor_attribute (node, name, args, flags, no_add_attrs)
5312 tree *node;
5313 tree name;
5314 tree args ATTRIBUTE_UNUSED;
5315 int flags ATTRIBUTE_UNUSED;
5316 bool *no_add_attrs;
5318 tree decl = *node;
5319 tree type = TREE_TYPE (decl);
5321 if (TREE_CODE (decl) == FUNCTION_DECL
5322 && TREE_CODE (type) == FUNCTION_TYPE
5323 && decl_function_context (decl) == 0)
5325 DECL_STATIC_CONSTRUCTOR (decl) = 1;
5326 TREE_USED (decl) = 1;
5328 else
5330 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5331 *no_add_attrs = true;
5334 return NULL_TREE;
5337 /* Handle a "destructor" attribute; arguments as in
5338 struct attribute_spec.handler. */
5340 static tree
5341 handle_destructor_attribute (node, name, args, flags, no_add_attrs)
5342 tree *node;
5343 tree name;
5344 tree args ATTRIBUTE_UNUSED;
5345 int flags ATTRIBUTE_UNUSED;
5346 bool *no_add_attrs;
5348 tree decl = *node;
5349 tree type = TREE_TYPE (decl);
5351 if (TREE_CODE (decl) == FUNCTION_DECL
5352 && TREE_CODE (type) == FUNCTION_TYPE
5353 && decl_function_context (decl) == 0)
5355 DECL_STATIC_DESTRUCTOR (decl) = 1;
5356 TREE_USED (decl) = 1;
5358 else
5360 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5361 *no_add_attrs = true;
5364 return NULL_TREE;
5367 /* Handle a "mode" attribute; arguments as in
5368 struct attribute_spec.handler. */
5370 static tree
5371 handle_mode_attribute (node, name, args, flags, no_add_attrs)
5372 tree *node;
5373 tree name;
5374 tree args;
5375 int flags ATTRIBUTE_UNUSED;
5376 bool *no_add_attrs;
5378 tree type = *node;
5380 *no_add_attrs = true;
5382 if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
5383 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5384 else
5386 int j;
5387 const char *p = IDENTIFIER_POINTER (TREE_VALUE (args));
5388 int len = strlen (p);
5389 enum machine_mode mode = VOIDmode;
5390 tree typefm;
5392 if (len > 4 && p[0] == '_' && p[1] == '_'
5393 && p[len - 1] == '_' && p[len - 2] == '_')
5395 char *newp = (char *) alloca (len - 1);
5397 strcpy (newp, &p[2]);
5398 newp[len - 4] = '\0';
5399 p = newp;
5402 /* Change this type to have a type with the specified mode.
5403 First check for the special modes. */
5404 if (! strcmp (p, "byte"))
5405 mode = byte_mode;
5406 else if (!strcmp (p, "word"))
5407 mode = word_mode;
5408 else if (! strcmp (p, "pointer"))
5409 mode = ptr_mode;
5410 else
5411 for (j = 0; j < NUM_MACHINE_MODES; j++)
5412 if (!strcmp (p, GET_MODE_NAME (j)))
5413 mode = (enum machine_mode) j;
5415 if (mode == VOIDmode)
5416 error ("unknown machine mode `%s'", p);
5417 else if (0 == (typefm = (*lang_hooks.types.type_for_mode)
5418 (mode, TREE_UNSIGNED (type))))
5419 error ("no data type for mode `%s'", p);
5420 else
5422 /* If this is a vector, make sure we either have hardware
5423 support, or we can emulate it. */
5424 if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
5425 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
5426 && !vector_mode_valid_p (mode))
5428 error ("unable to emulate '%s'", GET_MODE_NAME (mode));
5429 return NULL_TREE;
5432 *node = typefm;
5433 /* No need to layout the type here. The caller should do this. */
5437 return NULL_TREE;
5440 /* Handle a "section" attribute; arguments as in
5441 struct attribute_spec.handler. */
5443 static tree
5444 handle_section_attribute (node, name, args, flags, no_add_attrs)
5445 tree *node;
5446 tree name ATTRIBUTE_UNUSED;
5447 tree args;
5448 int flags ATTRIBUTE_UNUSED;
5449 bool *no_add_attrs;
5451 tree decl = *node;
5453 if (targetm.have_named_sections)
5455 if ((TREE_CODE (decl) == FUNCTION_DECL
5456 || TREE_CODE (decl) == VAR_DECL)
5457 && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
5459 if (TREE_CODE (decl) == VAR_DECL
5460 && current_function_decl != NULL_TREE
5461 && ! TREE_STATIC (decl))
5463 error_with_decl (decl,
5464 "section attribute cannot be specified for local variables");
5465 *no_add_attrs = true;
5468 /* The decl may have already been given a section attribute
5469 from a previous declaration. Ensure they match. */
5470 else if (DECL_SECTION_NAME (decl) != NULL_TREE
5471 && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
5472 TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
5474 error_with_decl (*node,
5475 "section of `%s' conflicts with previous declaration");
5476 *no_add_attrs = true;
5478 else
5479 DECL_SECTION_NAME (decl) = TREE_VALUE (args);
5481 else
5483 error_with_decl (*node,
5484 "section attribute not allowed for `%s'");
5485 *no_add_attrs = true;
5488 else
5490 error_with_decl (*node,
5491 "section attributes are not supported for this target");
5492 *no_add_attrs = true;
5495 return NULL_TREE;
5498 /* Handle a "aligned" attribute; arguments as in
5499 struct attribute_spec.handler. */
5501 static tree
5502 handle_aligned_attribute (node, name, args, flags, no_add_attrs)
5503 tree *node;
5504 tree name ATTRIBUTE_UNUSED;
5505 tree args;
5506 int flags;
5507 bool *no_add_attrs;
5509 tree decl = NULL_TREE;
5510 tree *type = NULL;
5511 int is_type = 0;
5512 tree align_expr = (args ? TREE_VALUE (args)
5513 : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
5514 int i;
5516 if (DECL_P (*node))
5518 decl = *node;
5519 type = &TREE_TYPE (decl);
5520 is_type = TREE_CODE (*node) == TYPE_DECL;
5522 else if (TYPE_P (*node))
5523 type = node, is_type = 1;
5525 /* Strip any NOPs of any kind. */
5526 while (TREE_CODE (align_expr) == NOP_EXPR
5527 || TREE_CODE (align_expr) == CONVERT_EXPR
5528 || TREE_CODE (align_expr) == NON_LVALUE_EXPR)
5529 align_expr = TREE_OPERAND (align_expr, 0);
5531 if (TREE_CODE (align_expr) != INTEGER_CST)
5533 error ("requested alignment is not a constant");
5534 *no_add_attrs = true;
5536 else if ((i = tree_log2 (align_expr)) == -1)
5538 error ("requested alignment is not a power of 2");
5539 *no_add_attrs = true;
5541 else if (i > HOST_BITS_PER_INT - 2)
5543 error ("requested alignment is too large");
5544 *no_add_attrs = true;
5546 else if (is_type)
5548 /* If we have a TYPE_DECL, then copy the type, so that we
5549 don't accidentally modify a builtin type. See pushdecl. */
5550 if (decl && TREE_TYPE (decl) != error_mark_node
5551 && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
5553 tree tt = TREE_TYPE (decl);
5554 *type = build_type_copy (*type);
5555 DECL_ORIGINAL_TYPE (decl) = tt;
5556 TYPE_NAME (*type) = decl;
5557 TREE_USED (*type) = TREE_USED (decl);
5558 TREE_TYPE (decl) = *type;
5560 else if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5561 *type = build_type_copy (*type);
5563 TYPE_ALIGN (*type) = (1 << i) * BITS_PER_UNIT;
5564 TYPE_USER_ALIGN (*type) = 1;
5566 else if (TREE_CODE (decl) != VAR_DECL
5567 && TREE_CODE (decl) != FIELD_DECL)
5569 error_with_decl (decl,
5570 "alignment may not be specified for `%s'");
5571 *no_add_attrs = true;
5573 else
5575 DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;
5576 DECL_USER_ALIGN (decl) = 1;
5579 return NULL_TREE;
5582 /* Handle a "weak" attribute; arguments as in
5583 struct attribute_spec.handler. */
5585 static tree
5586 handle_weak_attribute (node, name, args, flags, no_add_attrs)
5587 tree *node;
5588 tree name ATTRIBUTE_UNUSED;
5589 tree args ATTRIBUTE_UNUSED;
5590 int flags ATTRIBUTE_UNUSED;
5591 bool *no_add_attrs ATTRIBUTE_UNUSED;
5593 declare_weak (*node);
5595 return NULL_TREE;
5598 /* Handle an "alias" attribute; arguments as in
5599 struct attribute_spec.handler. */
5601 static tree
5602 handle_alias_attribute (node, name, args, flags, no_add_attrs)
5603 tree *node;
5604 tree name;
5605 tree args;
5606 int flags ATTRIBUTE_UNUSED;
5607 bool *no_add_attrs;
5609 tree decl = *node;
5611 if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
5612 || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl)))
5614 error_with_decl (decl,
5615 "`%s' defined both normally and as an alias");
5616 *no_add_attrs = true;
5618 else if (decl_function_context (decl) == 0)
5620 tree id;
5622 id = TREE_VALUE (args);
5623 if (TREE_CODE (id) != STRING_CST)
5625 error ("alias arg not a string");
5626 *no_add_attrs = true;
5627 return NULL_TREE;
5629 id = get_identifier (TREE_STRING_POINTER (id));
5630 /* This counts as a use of the object pointed to. */
5631 TREE_USED (id) = 1;
5633 if (TREE_CODE (decl) == FUNCTION_DECL)
5634 DECL_INITIAL (decl) = error_mark_node;
5635 else
5636 DECL_EXTERNAL (decl) = 0;
5638 else
5640 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5641 *no_add_attrs = true;
5644 return NULL_TREE;
5647 /* Handle an "visibility" attribute; arguments as in
5648 struct attribute_spec.handler. */
5650 static tree
5651 handle_visibility_attribute (node, name, args, flags, no_add_attrs)
5652 tree *node;
5653 tree name;
5654 tree args;
5655 int flags ATTRIBUTE_UNUSED;
5656 bool *no_add_attrs;
5658 tree decl = *node;
5660 if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl))
5662 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5663 *no_add_attrs = true;
5665 else
5667 tree id;
5669 id = TREE_VALUE (args);
5670 if (TREE_CODE (id) != STRING_CST)
5672 error ("visibility arg not a string");
5673 *no_add_attrs = true;
5674 return NULL_TREE;
5676 if (strcmp (TREE_STRING_POINTER (id), "hidden")
5677 && strcmp (TREE_STRING_POINTER (id), "protected")
5678 && strcmp (TREE_STRING_POINTER (id), "internal"))
5680 error ("visibility arg must be one of \"hidden\", \"protected\" or \"internal\"");
5681 *no_add_attrs = true;
5682 return NULL_TREE;
5686 return NULL_TREE;
5689 /* Handle a "no_instrument_function" attribute; arguments as in
5690 struct attribute_spec.handler. */
5692 static tree
5693 handle_no_instrument_function_attribute (node, name, args, flags, no_add_attrs)
5694 tree *node;
5695 tree name;
5696 tree args ATTRIBUTE_UNUSED;
5697 int flags ATTRIBUTE_UNUSED;
5698 bool *no_add_attrs;
5700 tree decl = *node;
5702 if (TREE_CODE (decl) != FUNCTION_DECL)
5704 error_with_decl (decl,
5705 "`%s' attribute applies only to functions",
5706 IDENTIFIER_POINTER (name));
5707 *no_add_attrs = true;
5709 else if (DECL_INITIAL (decl))
5711 error_with_decl (decl,
5712 "can't set `%s' attribute after definition",
5713 IDENTIFIER_POINTER (name));
5714 *no_add_attrs = true;
5716 else
5717 DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
5719 return NULL_TREE;
5722 /* Handle a "malloc" attribute; arguments as in
5723 struct attribute_spec.handler. */
5725 static tree
5726 handle_malloc_attribute (node, name, args, flags, no_add_attrs)
5727 tree *node;
5728 tree name;
5729 tree args ATTRIBUTE_UNUSED;
5730 int flags ATTRIBUTE_UNUSED;
5731 bool *no_add_attrs;
5733 if (TREE_CODE (*node) == FUNCTION_DECL)
5734 DECL_IS_MALLOC (*node) = 1;
5735 /* ??? TODO: Support types. */
5736 else
5738 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5739 *no_add_attrs = true;
5742 return NULL_TREE;
5745 /* Handle a "no_limit_stack" attribute; arguments as in
5746 struct attribute_spec.handler. */
5748 static tree
5749 handle_no_limit_stack_attribute (node, name, args, flags, no_add_attrs)
5750 tree *node;
5751 tree name;
5752 tree args ATTRIBUTE_UNUSED;
5753 int flags ATTRIBUTE_UNUSED;
5754 bool *no_add_attrs;
5756 tree decl = *node;
5758 if (TREE_CODE (decl) != FUNCTION_DECL)
5760 error_with_decl (decl,
5761 "`%s' attribute applies only to functions",
5762 IDENTIFIER_POINTER (name));
5763 *no_add_attrs = true;
5765 else if (DECL_INITIAL (decl))
5767 error_with_decl (decl,
5768 "can't set `%s' attribute after definition",
5769 IDENTIFIER_POINTER (name));
5770 *no_add_attrs = true;
5772 else
5773 DECL_NO_LIMIT_STACK (decl) = 1;
5775 return NULL_TREE;
5778 /* Handle a "pure" attribute; arguments as in
5779 struct attribute_spec.handler. */
5781 static tree
5782 handle_pure_attribute (node, name, args, flags, no_add_attrs)
5783 tree *node;
5784 tree name;
5785 tree args ATTRIBUTE_UNUSED;
5786 int flags ATTRIBUTE_UNUSED;
5787 bool *no_add_attrs;
5789 if (TREE_CODE (*node) == FUNCTION_DECL)
5790 DECL_IS_PURE (*node) = 1;
5791 /* ??? TODO: Support types. */
5792 else
5794 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5795 *no_add_attrs = true;
5798 return NULL_TREE;
5801 /* Handle a "deprecated" attribute; arguments as in
5802 struct attribute_spec.handler. */
5804 static tree
5805 handle_deprecated_attribute (node, name, args, flags, no_add_attrs)
5806 tree *node;
5807 tree name;
5808 tree args ATTRIBUTE_UNUSED;
5809 int flags;
5810 bool *no_add_attrs;
5812 tree type = NULL_TREE;
5813 int warn = 0;
5814 const char *what = NULL;
5816 if (DECL_P (*node))
5818 tree decl = *node;
5819 type = TREE_TYPE (decl);
5821 if (TREE_CODE (decl) == TYPE_DECL
5822 || TREE_CODE (decl) == PARM_DECL
5823 || TREE_CODE (decl) == VAR_DECL
5824 || TREE_CODE (decl) == FUNCTION_DECL
5825 || TREE_CODE (decl) == FIELD_DECL)
5826 TREE_DEPRECATED (decl) = 1;
5827 else
5828 warn = 1;
5830 else if (TYPE_P (*node))
5832 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5833 *node = build_type_copy (*node);
5834 TREE_DEPRECATED (*node) = 1;
5835 type = *node;
5837 else
5838 warn = 1;
5840 if (warn)
5842 *no_add_attrs = true;
5843 if (type && TYPE_NAME (type))
5845 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
5846 what = IDENTIFIER_POINTER (TYPE_NAME (*node));
5847 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
5848 && DECL_NAME (TYPE_NAME (type)))
5849 what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
5851 if (what)
5852 warning ("`%s' attribute ignored for `%s'",
5853 IDENTIFIER_POINTER (name), what);
5854 else
5855 warning ("`%s' attribute ignored",
5856 IDENTIFIER_POINTER (name));
5859 return NULL_TREE;
5862 /* Keep a list of vector type nodes we created in handle_vector_size_attribute,
5863 to prevent us from duplicating type nodes unnecessarily.
5864 The normal mechanism to prevent duplicates is to use type_hash_canon, but
5865 since we want to distinguish types that are essentially identical (except
5866 for their debug representation), we use a local list here. */
5867 static tree vector_type_node_list = 0;
5869 /* Handle a "vector_size" attribute; arguments as in
5870 struct attribute_spec.handler. */
5872 static tree
5873 handle_vector_size_attribute (node, name, args, flags, no_add_attrs)
5874 tree *node;
5875 tree name;
5876 tree args;
5877 int flags ATTRIBUTE_UNUSED;
5878 bool *no_add_attrs;
5880 unsigned HOST_WIDE_INT vecsize, nunits;
5881 enum machine_mode mode, orig_mode, new_mode;
5882 tree type = *node, new_type = NULL_TREE;
5883 tree type_list_node;
5885 *no_add_attrs = true;
5887 if (! host_integerp (TREE_VALUE (args), 1))
5889 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5890 return NULL_TREE;
5893 /* Get the vector size (in bytes). */
5894 vecsize = tree_low_cst (TREE_VALUE (args), 1);
5896 /* We need to provide for vector pointers, vector arrays, and
5897 functions returning vectors. For example:
5899 __attribute__((vector_size(16))) short *foo;
5901 In this case, the mode is SI, but the type being modified is
5902 HI, so we need to look further. */
5904 while (POINTER_TYPE_P (type)
5905 || TREE_CODE (type) == FUNCTION_TYPE
5906 || TREE_CODE (type) == ARRAY_TYPE)
5907 type = TREE_TYPE (type);
5909 /* Get the mode of the type being modified. */
5910 orig_mode = TYPE_MODE (type);
5912 if (TREE_CODE (type) == RECORD_TYPE
5913 || (GET_MODE_CLASS (orig_mode) != MODE_FLOAT
5914 && GET_MODE_CLASS (orig_mode) != MODE_INT)
5915 || ! host_integerp (TYPE_SIZE_UNIT (type), 1))
5917 error ("invalid vector type for attribute `%s'",
5918 IDENTIFIER_POINTER (name));
5919 return NULL_TREE;
5922 /* Calculate how many units fit in the vector. */
5923 nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5925 /* Find a suitably sized vector. */
5926 new_mode = VOIDmode;
5927 for (mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_mode) == MODE_INT
5928 ? MODE_VECTOR_INT
5929 : MODE_VECTOR_FLOAT);
5930 mode != VOIDmode;
5931 mode = GET_MODE_WIDER_MODE (mode))
5932 if (vecsize == GET_MODE_SIZE (mode)
5933 && nunits == (unsigned HOST_WIDE_INT) GET_MODE_NUNITS (mode))
5935 new_mode = mode;
5936 break;
5939 if (new_mode == VOIDmode)
5941 error ("no vector mode with the size and type specified could be found");
5942 return NULL_TREE;
5945 for (type_list_node = vector_type_node_list; type_list_node;
5946 type_list_node = TREE_CHAIN (type_list_node))
5948 tree other_type = TREE_VALUE (type_list_node);
5949 tree record = TYPE_DEBUG_REPRESENTATION_TYPE (other_type);
5950 tree fields = TYPE_FIELDS (record);
5951 tree field_type = TREE_TYPE (fields);
5952 tree array_type = TREE_TYPE (field_type);
5953 if (TREE_CODE (fields) != FIELD_DECL
5954 || TREE_CODE (field_type) != ARRAY_TYPE)
5955 abort ();
5957 if (TYPE_MODE (other_type) == mode && type == array_type)
5959 new_type = other_type;
5960 break;
5964 if (new_type == NULL_TREE)
5966 tree index, array, rt, list_node;
5968 new_type = (*lang_hooks.types.type_for_mode) (new_mode,
5969 TREE_UNSIGNED (type));
5971 if (!new_type)
5973 error ("no vector mode with the size and type specified could be found");
5974 return NULL_TREE;
5977 new_type = build_type_copy (new_type);
5979 /* If this is a vector, make sure we either have hardware
5980 support, or we can emulate it. */
5981 if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
5982 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
5983 && !vector_mode_valid_p (mode))
5985 error ("unable to emulate '%s'", GET_MODE_NAME (mode));
5986 return NULL_TREE;
5989 /* Set the debug information here, because this is the only
5990 place where we know the underlying type for a vector made
5991 with vector_size. For debugging purposes we pretend a vector
5992 is an array within a structure. */
5993 index = build_int_2 (TYPE_VECTOR_SUBPARTS (new_type) - 1, 0);
5994 array = build_array_type (type, build_index_type (index));
5995 rt = make_node (RECORD_TYPE);
5997 TYPE_FIELDS (rt) = build_decl (FIELD_DECL, get_identifier ("f"), array);
5998 DECL_CONTEXT (TYPE_FIELDS (rt)) = rt;
5999 layout_type (rt);
6000 TYPE_DEBUG_REPRESENTATION_TYPE (new_type) = rt;
6002 list_node = build_tree_list (NULL, new_type);
6003 TREE_CHAIN (list_node) = vector_type_node_list;
6004 vector_type_node_list = list_node;
6007 /* Build back pointers if needed. */
6008 *node = vector_size_helper (*node, new_type);
6010 return NULL_TREE;
6013 /* HACK. GROSS. This is absolutely disgusting. I wish there was a
6014 better way.
6016 If we requested a pointer to a vector, build up the pointers that
6017 we stripped off while looking for the inner type. Similarly for
6018 return values from functions.
6020 The argument "type" is the top of the chain, and "bottom" is the
6021 new type which we will point to. */
6023 static tree
6024 vector_size_helper (type, bottom)
6025 tree type, bottom;
6027 tree inner, outer;
6029 if (POINTER_TYPE_P (type))
6031 inner = vector_size_helper (TREE_TYPE (type), bottom);
6032 outer = build_pointer_type (inner);
6034 else if (TREE_CODE (type) == ARRAY_TYPE)
6036 inner = vector_size_helper (TREE_TYPE (type), bottom);
6037 outer = build_array_type (inner, TYPE_VALUES (type));
6039 else if (TREE_CODE (type) == FUNCTION_TYPE)
6041 inner = vector_size_helper (TREE_TYPE (type), bottom);
6042 outer = build_function_type (inner, TYPE_VALUES (type));
6044 else
6045 return bottom;
6047 TREE_READONLY (outer) = TREE_READONLY (type);
6048 TREE_THIS_VOLATILE (outer) = TREE_THIS_VOLATILE (type);
6050 return outer;
6053 /* Handle the "nonnull" attribute. */
6054 static tree
6055 handle_nonnull_attribute (node, name, args, flags, no_add_attrs)
6056 tree *node;
6057 tree name ATTRIBUTE_UNUSED;
6058 tree args;
6059 int flags ATTRIBUTE_UNUSED;
6060 bool *no_add_attrs;
6062 tree type = *node;
6063 unsigned HOST_WIDE_INT attr_arg_num;
6065 /* If no arguments are specified, all pointer arguments should be
6066 non-null. Veryify a full prototype is given so that the arguments
6067 will have the correct types when we actually check them later. */
6068 if (! args)
6070 if (! TYPE_ARG_TYPES (type))
6072 error ("nonnull attribute without arguments on a non-prototype");
6073 *no_add_attrs = true;
6075 return NULL_TREE;
6078 /* Argument list specified. Verify that each argument number references
6079 a pointer argument. */
6080 for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
6082 tree argument;
6083 unsigned HOST_WIDE_INT arg_num, ck_num;
6085 if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
6087 error ("nonnull argument has invalid operand number (arg %lu)",
6088 (unsigned long) attr_arg_num);
6089 *no_add_attrs = true;
6090 return NULL_TREE;
6093 argument = TYPE_ARG_TYPES (type);
6094 if (argument)
6096 for (ck_num = 1; ; ck_num++)
6098 if (! argument || ck_num == arg_num)
6099 break;
6100 argument = TREE_CHAIN (argument);
6103 if (! argument
6104 || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
6106 error ("nonnull argument with out-of-range operand number (arg %lu, operand %lu)",
6107 (unsigned long) attr_arg_num, (unsigned long) arg_num);
6108 *no_add_attrs = true;
6109 return NULL_TREE;
6112 if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
6114 error ("nonnull argument references non-pointer operand (arg %lu, operand %lu)",
6115 (unsigned long) attr_arg_num, (unsigned long) arg_num);
6116 *no_add_attrs = true;
6117 return NULL_TREE;
6122 return NULL_TREE;
6125 /* Check the argument list of a function call for null in argument slots
6126 that are marked as requiring a non-null pointer argument. */
6128 static void
6129 check_function_nonnull (attrs, params)
6130 tree attrs;
6131 tree params;
6133 tree a, args, param;
6134 int param_num;
6136 for (a = attrs; a; a = TREE_CHAIN (a))
6138 if (is_attribute_p ("nonnull", TREE_PURPOSE (a)))
6140 args = TREE_VALUE (a);
6142 /* Walk the argument list. If we encounter an argument number we
6143 should check for non-null, do it. If the attribute has no args,
6144 then every pointer argument is checked (in which case the check
6145 for pointer type is done in check_nonnull_arg). */
6146 for (param = params, param_num = 1; ;
6147 param_num++, param = TREE_CHAIN (param))
6149 if (! param)
6150 break;
6151 if (! args || nonnull_check_p (args, param_num))
6152 check_function_arguments_recurse (check_nonnull_arg, NULL,
6153 TREE_VALUE (param),
6154 param_num);
6160 /* Helper for check_function_nonnull; given a list of operands which
6161 must be non-null in ARGS, determine if operand PARAM_NUM should be
6162 checked. */
6164 static bool
6165 nonnull_check_p (args, param_num)
6166 tree args;
6167 unsigned HOST_WIDE_INT param_num;
6169 unsigned HOST_WIDE_INT arg_num;
6171 for (; args; args = TREE_CHAIN (args))
6173 if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
6174 abort ();
6176 if (arg_num == param_num)
6177 return true;
6179 return false;
6182 /* Check that the function argument PARAM (which is operand number
6183 PARAM_NUM) is non-null. This is called by check_function_nonnull
6184 via check_function_arguments_recurse. */
6186 static void
6187 check_nonnull_arg (ctx, param, param_num)
6188 void *ctx ATTRIBUTE_UNUSED;
6189 tree param;
6190 unsigned HOST_WIDE_INT param_num;
6192 /* Just skip checking the argument if it's not a pointer. This can
6193 happen if the "nonnull" attribute was given without an operand
6194 list (which means to check every pointer argument). */
6196 if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE)
6197 return;
6199 if (integer_zerop (param))
6200 warning ("null argument where non-null required (arg %lu)",
6201 (unsigned long) param_num);
6204 /* Helper for nonnull attribute handling; fetch the operand number
6205 from the attribute argument list. */
6207 static bool
6208 get_nonnull_operand (arg_num_expr, valp)
6209 tree arg_num_expr;
6210 unsigned HOST_WIDE_INT *valp;
6212 /* Strip any conversions from the arg number and verify they
6213 are constants. */
6214 while (TREE_CODE (arg_num_expr) == NOP_EXPR
6215 || TREE_CODE (arg_num_expr) == CONVERT_EXPR
6216 || TREE_CODE (arg_num_expr) == NON_LVALUE_EXPR)
6217 arg_num_expr = TREE_OPERAND (arg_num_expr, 0);
6219 if (TREE_CODE (arg_num_expr) != INTEGER_CST
6220 || TREE_INT_CST_HIGH (arg_num_expr) != 0)
6221 return false;
6223 *valp = TREE_INT_CST_LOW (arg_num_expr);
6224 return true;
6227 /* Handle a "nothrow" attribute; arguments as in
6228 struct attribute_spec.handler. */
6230 static tree
6231 handle_nothrow_attribute (node, name, args, flags, no_add_attrs)
6232 tree *node;
6233 tree name;
6234 tree args ATTRIBUTE_UNUSED;
6235 int flags ATTRIBUTE_UNUSED;
6236 bool *no_add_attrs;
6238 if (TREE_CODE (*node) == FUNCTION_DECL)
6239 TREE_NOTHROW (*node) = 1;
6240 /* ??? TODO: Support types. */
6241 else
6243 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
6244 *no_add_attrs = true;
6247 return NULL_TREE;
6250 /* Check for valid arguments being passed to a function. */
6251 void
6252 check_function_arguments (attrs, params)
6253 tree attrs;
6254 tree params;
6256 /* Check for null being passed in a pointer argument that must be
6257 non-null. We also need to do this if format checking is enabled. */
6259 if (warn_nonnull)
6260 check_function_nonnull (attrs, params);
6262 /* Check for errors in format strings. */
6264 if (warn_format)
6265 check_function_format (NULL, attrs, params);
6268 /* Generic argument checking recursion routine. PARAM is the argument to
6269 be checked. PARAM_NUM is the number of the argument. CALLBACK is invoked
6270 once the argument is resolved. CTX is context for the callback. */
6271 void
6272 check_function_arguments_recurse (callback, ctx, param, param_num)
6273 void (*callback) PARAMS ((void *, tree, unsigned HOST_WIDE_INT));
6274 void *ctx;
6275 tree param;
6276 unsigned HOST_WIDE_INT param_num;
6278 if (TREE_CODE (param) == NOP_EXPR)
6280 /* Strip coercion. */
6281 check_function_arguments_recurse (callback, ctx,
6282 TREE_OPERAND (param, 0), param_num);
6283 return;
6286 if (TREE_CODE (param) == CALL_EXPR)
6288 tree type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (param, 0)));
6289 tree attrs;
6290 bool found_format_arg = false;
6292 /* See if this is a call to a known internationalization function
6293 that modifies a format arg. Such a function may have multiple
6294 format_arg attributes (for example, ngettext). */
6296 for (attrs = TYPE_ATTRIBUTES (type);
6297 attrs;
6298 attrs = TREE_CHAIN (attrs))
6299 if (is_attribute_p ("format_arg", TREE_PURPOSE (attrs)))
6301 tree inner_args;
6302 tree format_num_expr;
6303 int format_num;
6304 int i;
6306 /* Extract the argument number, which was previously checked
6307 to be valid. */
6308 format_num_expr = TREE_VALUE (TREE_VALUE (attrs));
6309 while (TREE_CODE (format_num_expr) == NOP_EXPR
6310 || TREE_CODE (format_num_expr) == CONVERT_EXPR
6311 || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
6312 format_num_expr = TREE_OPERAND (format_num_expr, 0);
6314 if (TREE_CODE (format_num_expr) != INTEGER_CST
6315 || TREE_INT_CST_HIGH (format_num_expr) != 0)
6316 abort ();
6318 format_num = TREE_INT_CST_LOW (format_num_expr);
6320 for (inner_args = TREE_OPERAND (param, 1), i = 1;
6321 inner_args != 0;
6322 inner_args = TREE_CHAIN (inner_args), i++)
6323 if (i == format_num)
6325 check_function_arguments_recurse (callback, ctx,
6326 TREE_VALUE (inner_args),
6327 param_num);
6328 found_format_arg = true;
6329 break;
6333 /* If we found a format_arg attribute and did a recursive check,
6334 we are done with checking this argument. Otherwise, we continue
6335 and this will be considered a non-literal. */
6336 if (found_format_arg)
6337 return;
6340 if (TREE_CODE (param) == COND_EXPR)
6342 /* Check both halves of the conditional expression. */
6343 check_function_arguments_recurse (callback, ctx,
6344 TREE_OPERAND (param, 1), param_num);
6345 check_function_arguments_recurse (callback, ctx,
6346 TREE_OPERAND (param, 2), param_num);
6347 return;
6350 (*callback) (ctx, param, param_num);
6353 #include "gt-c-common.h"