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