OSDN Git Service

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