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