OSDN Git Service

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