OSDN Git Service

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