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