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