OSDN Git Service

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