]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-common.c
2000-10-16 Benjamin Kosnik <bkoz@gnu.org>
[thirdparty/gcc.git] / gcc / c-common.c
CommitLineData
b0fc3e72 1/* Subroutines shared by all languages that are variants of C.
b278476e 2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
3 Free Software Foundation, Inc.
b0fc3e72 4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
8d62a21c 19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
b0fc3e72 21
22#include "config.h"
405711de 23#include "system.h"
b0fc3e72 24#include "tree.h"
b0fc3e72 25#include "flags.h"
9cdfa0b0 26#include "toplev.h"
cd03a192 27#include "output.h"
a3fa7feb 28#include "c-pragma.h"
a5b1863e 29#include "rtl.h"
dc12af01 30#include "ggc.h"
74647769 31#include "expr.h"
e41f0d80 32#include "c-common.h"
d8c9779c 33#include "tm_p.h"
c7ca8f11 34#include "intl.h"
e0bc5413 35#include "diagnostic.h"
3ef9782d 36
a654e028 37#if USE_CPPLIB
38#include "cpplib.h"
39cpp_reader parse_in;
a654e028 40#endif
41
be37a9cb 42#undef WCHAR_TYPE_SIZE
43#define WCHAR_TYPE_SIZE TYPE_PRECISION (wchar_type_node)
c83bcd28 44
72040e7e 45/* The following symbols are subsumed in the c_global_trees array, and
44e9fa65 46 listed here individually for documentation purposes.
72040e7e 47
48 INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
49
50 tree short_integer_type_node;
51 tree long_integer_type_node;
52 tree long_long_integer_type_node;
53
54 tree short_unsigned_type_node;
55 tree long_unsigned_type_node;
56 tree long_long_unsigned_type_node;
57
58 tree boolean_type_node;
59 tree boolean_false_node;
60 tree boolean_true_node;
61
62 tree ptrdiff_type_node;
63
64 tree unsigned_char_type_node;
65 tree signed_char_type_node;
66 tree wchar_type_node;
67 tree signed_wchar_type_node;
68 tree unsigned_wchar_type_node;
69
70 tree float_type_node;
71 tree double_type_node;
72 tree long_double_type_node;
73
74 tree complex_integer_type_node;
75 tree complex_float_type_node;
76 tree complex_double_type_node;
77 tree complex_long_double_type_node;
78
79 tree intQI_type_node;
80 tree intHI_type_node;
81 tree intSI_type_node;
82 tree intDI_type_node;
83 tree intTI_type_node;
84
85 tree unsigned_intQI_type_node;
86 tree unsigned_intHI_type_node;
87 tree unsigned_intSI_type_node;
88 tree unsigned_intDI_type_node;
89 tree unsigned_intTI_type_node;
90
91 tree widest_integer_literal_type_node;
92 tree widest_unsigned_literal_type_node;
93
94 Nodes for types `void *' and `const void *'.
95
96 tree ptr_type_node, const_ptr_type_node;
97
98 Nodes for types `char *' and `const char *'.
99
100 tree string_type_node, const_string_type_node;
101
102 Type `char[SOMENUMBER]'.
103 Used when an array of char is needed and the size is irrelevant.
104
105 tree char_array_type_node;
106
107 Type `int[SOMENUMBER]' or something like it.
108 Used when an array of int needed and the size is irrelevant.
109
110 tree int_array_type_node;
111
112 Type `wchar_t[SOMENUMBER]' or something like it.
113 Used when a wide string literal is created.
114
115 tree wchar_array_type_node;
116
117 Type `int ()' -- used for implicit declaration of functions.
118
119 tree default_function_type;
120
121 Function types `int (int)', etc.
122
123 tree int_ftype_int;
124 tree void_ftype;
125 tree void_ftype_ptr;
126 tree int_ftype_int;
127 tree ptr_ftype_sizetype;
128
129 A VOID_TYPE node, packaged in a TREE_LIST.
130
131 tree void_list_node;
132
71d9fc9b 133 The identifiers __FUNCTION__, __PRETTY_FUNCTION__, and __func__.
134
135 tree function_id_node;
136 tree pretty_function_id_node;
137 tree func_id_node;
138
72040e7e 139*/
140
141tree c_global_trees[CTI_MAX];
ceee5ef4 142
988fc1d1 143/* The elements of `ridpointers' are identifier nodes for the reserved
144 type names and storage classes. It is indexed by a RID_... value. */
145tree *ridpointers;
146
9e5a737d 147tree (*make_fname_decl) PARAMS ((tree, const char *, int));
148
a08e60ae 149/* If non-NULL, the address of a language-specific function that
150 returns 1 for language-specific statement codes. */
151int (*lang_statement_code_p) PARAMS ((enum tree_code));
152
e41f0d80 153/* If non-NULL, the address of a language-specific function that takes
154 any action required right before expand_function_end is called. */
155void (*lang_expand_function_end) PARAMS ((void));
156
e78703c1 157/* Nonzero means the expression being parsed will never be evaluated.
158 This is a count, since unevaluated expressions can nest. */
159int skip_evaluation;
160
9493f142 161enum attrs {A_PACKED, A_NOCOMMON, A_COMMON, A_NORETURN, A_CONST, A_T_UNION,
efea460c 162 A_NO_CHECK_MEMORY_USAGE, A_NO_INSTRUMENT_FUNCTION,
1f57d1e5 163 A_CONSTRUCTOR, A_DESTRUCTOR, A_MODE, A_SECTION, A_ALIGNED,
8f8ac140 164 A_UNUSED, A_FORMAT, A_FORMAT_ARG, A_WEAK, A_ALIAS, A_MALLOC,
26dfc457 165 A_NO_LIMIT_STACK, A_PURE};
550e135c 166
d1f11193 167enum format_type { printf_format_type, scanf_format_type,
168 strftime_format_type };
169
6a9a24a5 170static void add_attribute PARAMS ((enum attrs, const char *,
171 int, int, int));
172static void init_attributes PARAMS ((void));
173static void record_function_format PARAMS ((tree, tree, enum format_type,
174 int, int));
175static void record_international_format PARAMS ((tree, tree, int));
6a9a24a5 176static int default_valid_lang_attribute PARAMS ((tree, tree, tree, tree));
be43ff5a 177
9fc84d48 178/* Keep a stack of if statements. We record the number of compound
179 statements seen up to the if keyword, as well as the line number
180 and file of the if. If a potentially ambiguous else is seen, that
181 fact is recorded; the warning is issued when we can be sure that
182 the enclosing if statement does not have an else branch. */
183typedef struct
184{
185 int compstmt_count;
186 int line;
3eee82c5 187 const char *file;
9fc84d48 188 int needs_warning;
e41f0d80 189 tree if_stmt;
9fc84d48 190} if_elt;
191
192static if_elt *if_stack;
31f820d2 193
194/* Amount of space in the if statement stack. */
195static int if_stack_space = 0;
196
197/* Stack pointer. */
198static int if_stack_pointer = 0;
199
e41f0d80 200/* Record the start of an if-then, and record the start of it
9fc84d48 201 for ambiguous else detection. */
202
31f820d2 203void
e41f0d80 204c_expand_start_cond (cond, compstmt_count)
31f820d2 205 tree cond;
31f820d2 206 int compstmt_count;
207{
e41f0d80 208 tree if_stmt;
209
31f820d2 210 /* Make sure there is enough space on the stack. */
211 if (if_stack_space == 0)
212 {
213 if_stack_space = 10;
9fc84d48 214 if_stack = (if_elt *)xmalloc (10 * sizeof (if_elt));
31f820d2 215 }
216 else if (if_stack_space == if_stack_pointer)
217 {
218 if_stack_space += 10;
9fc84d48 219 if_stack = (if_elt *)xrealloc (if_stack, if_stack_space * sizeof (if_elt));
31f820d2 220 }
9fc84d48 221
e41f0d80 222 if_stmt = build_stmt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
223 IF_COND (if_stmt) = cond;
224 add_stmt (if_stmt);
225
31f820d2 226 /* Record this if statement. */
9fc84d48 227 if_stack[if_stack_pointer].compstmt_count = compstmt_count;
228 if_stack[if_stack_pointer].file = input_filename;
229 if_stack[if_stack_pointer].line = lineno;
230 if_stack[if_stack_pointer].needs_warning = 0;
e41f0d80 231 if_stack[if_stack_pointer].if_stmt = if_stmt;
9fc84d48 232 if_stack_pointer++;
e41f0d80 233}
31f820d2 234
e41f0d80 235/* Called after the then-clause for an if-statement is processed. */
236
237void
238c_finish_then ()
239{
240 tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
241 RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt));
31f820d2 242}
243
e41f0d80 244/* Record the end of an if-then. Optionally warn if a nested
9fc84d48 245 if statement had an ambiguous else clause. */
246
31f820d2 247void
248c_expand_end_cond ()
249{
250 if_stack_pointer--;
9fc84d48 251 if (if_stack[if_stack_pointer].needs_warning)
252 warning_with_file_and_line (if_stack[if_stack_pointer].file,
253 if_stack[if_stack_pointer].line,
254 "suggest explicit braces to avoid ambiguous `else'");
e41f0d80 255 last_expr_type = NULL_TREE;
31f820d2 256}
257
e41f0d80 258/* Called between the then-clause and the else-clause
9fc84d48 259 of an if-then-else. */
260
31f820d2 261void
262c_expand_start_else ()
263{
9fc84d48 264 /* An ambiguous else warning must be generated for the enclosing if
265 statement, unless we see an else branch for that one, too. */
31f820d2 266 if (warn_parentheses
267 && if_stack_pointer > 1
9fc84d48 268 && (if_stack[if_stack_pointer - 1].compstmt_count
269 == if_stack[if_stack_pointer - 2].compstmt_count))
270 if_stack[if_stack_pointer - 2].needs_warning = 1;
271
272 /* Even if a nested if statement had an else branch, it can't be
273 ambiguous if this one also has an else. So don't warn in that
274 case. Also don't warn for any if statements nested in this else. */
275 if_stack[if_stack_pointer - 1].needs_warning = 0;
276 if_stack[if_stack_pointer - 1].compstmt_count--;
e41f0d80 277}
278
279/* Called after the else-clause for an if-statement is processed. */
31f820d2 280
e41f0d80 281void
282c_finish_else ()
283{
284 tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
285 RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt));
31f820d2 286}
287
75bd5ada 288/* Make bindings for __FUNCTION__, __PRETTY_FUNCTION__, and __func__. */
f4e3c278 289
290void
291declare_function_name ()
292{
3eee82c5 293 const char *name, *printable_name;
f4e3c278 294
295 if (current_function_decl == NULL)
296 {
297 name = "";
298 printable_name = "top level";
299 }
300 else
301 {
3f3680c7 302 /* Allow functions to be nameless (such as artificial ones). */
303 if (DECL_NAME (current_function_decl))
304 name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
305 else
306 name = "";
59561872 307 printable_name = (*decl_printable_name) (current_function_decl, 2);
71d9fc9b 308
309 /* ISO C99 defines __func__, which is a variable, not a string
310 constant, and which is not a defined symbol at file scope. */
311 (*make_fname_decl) (func_id_node, name, 0);
f4e3c278 312 }
9e5a737d 313
71d9fc9b 314 (*make_fname_decl) (function_id_node, name, 0);
315 (*make_fname_decl) (pretty_function_id_node, printable_name, 1);
f4e3c278 316}
317
b0fc3e72 318/* Given a chain of STRING_CST nodes,
319 concatenate them into one STRING_CST
320 and give it a suitable array-of-chars data type. */
321
322tree
323combine_strings (strings)
324 tree strings;
325{
326 register tree value, t;
327 register int length = 1;
328 int wide_length = 0;
329 int wide_flag = 0;
330 int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
331 int nchars;
82cfc7f7 332 const int nchars_max = flag_isoc99 ? 4095 : 509;
b0fc3e72 333
334 if (TREE_CHAIN (strings))
335 {
336 /* More than one in the chain, so concatenate. */
337 register char *p, *q;
338
339 /* Don't include the \0 at the end of each substring,
340 except for the last one.
341 Count wide strings and ordinary strings separately. */
342 for (t = strings; t; t = TREE_CHAIN (t))
343 {
344 if (TREE_TYPE (t) == wchar_array_type_node)
345 {
346 wide_length += (TREE_STRING_LENGTH (t) - wchar_bytes);
347 wide_flag = 1;
348 }
349 else
350 length += (TREE_STRING_LENGTH (t) - 1);
351 }
352
353 /* If anything is wide, the non-wides will be converted,
354 which makes them take more space. */
355 if (wide_flag)
356 length = length * wchar_bytes + wide_length;
357
f8b540f2 358 p = ggc_alloc_string (NULL, length);
b0fc3e72 359
360 /* Copy the individual strings into the new combined string.
361 If the combined string is wide, convert the chars to ints
362 for any individual strings that are not wide. */
363
364 q = p;
365 for (t = strings; t; t = TREE_CHAIN (t))
366 {
367 int len = (TREE_STRING_LENGTH (t)
368 - ((TREE_TYPE (t) == wchar_array_type_node)
369 ? wchar_bytes : 1));
370 if ((TREE_TYPE (t) == wchar_array_type_node) == wide_flag)
371 {
d7e36a01 372 memcpy (q, TREE_STRING_POINTER (t), len);
b0fc3e72 373 q += len;
374 }
375 else
376 {
377 int i;
378 for (i = 0; i < len; i++)
c9dcb798 379 {
380 if (WCHAR_TYPE_SIZE == HOST_BITS_PER_SHORT)
381 ((short *) q)[i] = TREE_STRING_POINTER (t)[i];
382 else
383 ((int *) q)[i] = TREE_STRING_POINTER (t)[i];
384 }
b0fc3e72 385 q += len * wchar_bytes;
386 }
387 }
388 if (wide_flag)
389 {
390 int i;
391 for (i = 0; i < wchar_bytes; i++)
392 *q++ = 0;
393 }
394 else
395 *q = 0;
396
397 value = make_node (STRING_CST);
398 TREE_STRING_POINTER (value) = p;
399 TREE_STRING_LENGTH (value) = length;
b0fc3e72 400 }
401 else
402 {
403 value = strings;
404 length = TREE_STRING_LENGTH (value);
405 if (TREE_TYPE (value) == wchar_array_type_node)
406 wide_flag = 1;
407 }
408
73be5127 409 /* Compute the number of elements, for the array type. */
b0fc3e72 410 nchars = wide_flag ? length / wchar_bytes : length;
411
82cfc7f7 412 if (pedantic && nchars > nchars_max)
d494b123 413 pedwarn ("string length `%d' is greater than the minimum length `%d' ISO C%d is required to support",
414 nchars, nchars_max, flag_isoc99 ? 99 : 89);
82cfc7f7 415
b0fc3e72 416 /* Create the array type for the string constant.
417 -Wwrite-strings says make the string constant an array of const char
3a10ba35 418 so that copying it to a non-const pointer will get a warning.
419 For C++, this is the standard behavior. */
420 if (flag_const_strings
b0fc3e72 421 && (! flag_traditional && ! flag_writable_strings))
422 {
423 tree elements
424 = build_type_variant (wide_flag ? wchar_type_node : char_type_node,
425 1, 0);
426 TREE_TYPE (value)
427 = build_array_type (elements,
428 build_index_type (build_int_2 (nchars - 1, 0)));
429 }
430 else
431 TREE_TYPE (value)
432 = build_array_type (wide_flag ? wchar_type_node : char_type_node,
433 build_index_type (build_int_2 (nchars - 1, 0)));
3a10ba35 434
b8e3b7ad 435 TREE_CONSTANT (value) = 1;
436 TREE_READONLY (value) = ! flag_writable_strings;
b0fc3e72 437 TREE_STATIC (value) = 1;
438 return value;
439}
440\f
550e135c 441/* To speed up processing of attributes, we maintain an array of
442 IDENTIFIER_NODES and the corresponding attribute types. */
443
444/* Array to hold attribute information. */
445
446static struct {enum attrs id; tree name; int min, max, decl_req;} attrtab[50];
447
448static int attrtab_idx = 0;
449
450/* Add an entry to the attribute table above. */
451
452static void
453add_attribute (id, string, min_len, max_len, decl_req)
454 enum attrs id;
3eee82c5 455 const char *string;
550e135c 456 int min_len, max_len;
457 int decl_req;
458{
459 char buf[100];
460
461 attrtab[attrtab_idx].id = id;
462 attrtab[attrtab_idx].name = get_identifier (string);
463 attrtab[attrtab_idx].min = min_len;
464 attrtab[attrtab_idx].max = max_len;
465 attrtab[attrtab_idx++].decl_req = decl_req;
466
467 sprintf (buf, "__%s__", string);
468
469 attrtab[attrtab_idx].id = id;
470 attrtab[attrtab_idx].name = get_identifier (buf);
471 attrtab[attrtab_idx].min = min_len;
472 attrtab[attrtab_idx].max = max_len;
473 attrtab[attrtab_idx++].decl_req = decl_req;
474}
475
476/* Initialize attribute table. */
477
478static void
479init_attributes ()
480{
cf333338 481 add_attribute (A_PACKED, "packed", 0, 0, 0);
1f57d1e5 482 add_attribute (A_NOCOMMON, "nocommon", 0, 0, 1);
9493f142 483 add_attribute (A_COMMON, "common", 0, 0, 1);
550e135c 484 add_attribute (A_NORETURN, "noreturn", 0, 0, 1);
485 add_attribute (A_NORETURN, "volatile", 0, 0, 1);
31f820d2 486 add_attribute (A_UNUSED, "unused", 0, 0, 0);
550e135c 487 add_attribute (A_CONST, "const", 0, 0, 1);
488 add_attribute (A_T_UNION, "transparent_union", 0, 0, 0);
489 add_attribute (A_CONSTRUCTOR, "constructor", 0, 0, 1);
490 add_attribute (A_DESTRUCTOR, "destructor", 0, 0, 1);
491 add_attribute (A_MODE, "mode", 1, 1, 1);
492 add_attribute (A_SECTION, "section", 1, 1, 1);
493 add_attribute (A_ALIGNED, "aligned", 0, 1, 0);
24f0e20d 494 add_attribute (A_FORMAT, "format", 3, 3, 1);
b91b108f 495 add_attribute (A_FORMAT_ARG, "format_arg", 1, 1, 1);
df1c8607 496 add_attribute (A_WEAK, "weak", 0, 0, 1);
497 add_attribute (A_ALIAS, "alias", 1, 1, 1);
abd28cef 498 add_attribute (A_NO_INSTRUMENT_FUNCTION, "no_instrument_function", 0, 0, 1);
efea460c 499 add_attribute (A_NO_CHECK_MEMORY_USAGE, "no_check_memory_usage", 0, 0, 1);
7259f3f8 500 add_attribute (A_MALLOC, "malloc", 0, 0, 1);
8f8ac140 501 add_attribute (A_NO_LIMIT_STACK, "no_stack_limit", 0, 0, 1);
26dfc457 502 add_attribute (A_PURE, "pure", 0, 0, 1);
550e135c 503}
504\f
695d6519 505/* Default implementation of valid_lang_attribute, below. By default, there
506 are no language-specific attributes. */
507
508static int
509default_valid_lang_attribute (attr_name, attr_args, decl, type)
510 tree attr_name ATTRIBUTE_UNUSED;
511 tree attr_args ATTRIBUTE_UNUSED;
512 tree decl ATTRIBUTE_UNUSED;
513 tree type ATTRIBUTE_UNUSED;
514{
515 return 0;
516}
517
518/* Return a 1 if ATTR_NAME and ATTR_ARGS denote a valid language-specific
519 attribute for either declaration DECL or type TYPE and 0 otherwise. */
520
6a9a24a5 521int (*valid_lang_attribute) PARAMS ((tree, tree, tree, tree))
695d6519 522 = default_valid_lang_attribute;
523
528adc5a 524/* Process the attributes listed in ATTRIBUTES and PREFIX_ATTRIBUTES
550e135c 525 and install them in NODE, which is either a DECL (including a TYPE_DECL)
526 or a TYPE. PREFIX_ATTRIBUTES can appear after the declaration specifiers
a92771b8 527 and declaration modifiers but before the declaration proper. */
b0fc3e72 528
529void
550e135c 530decl_attributes (node, attributes, prefix_attributes)
531 tree node, attributes, prefix_attributes;
b0fc3e72 532{
7ad3893d 533 tree decl = 0, type = 0;
534 int is_type = 0;
550e135c 535 tree a;
536
537 if (attrtab_idx == 0)
538 init_attributes ();
539
9308e976 540 if (DECL_P (node))
550e135c 541 {
542 decl = node;
543 type = TREE_TYPE (decl);
544 is_type = TREE_CODE (node) == TYPE_DECL;
545 }
9308e976 546 else if (TYPE_P (node))
550e135c 547 type = node, is_type = 1;
252b13bb 548
a3fa7feb 549#ifdef PRAGMA_INSERT_ATTRIBUTES
550 /* If the code in c-pragma.c wants to insert some attributes then
551 allow it to do so. Do this before allowing machine back ends to
552 insert attributes, so that they have the opportunity to override
553 anything done here. */
554 PRAGMA_INSERT_ATTRIBUTES (node, & attributes, & prefix_attributes);
555#endif
44e9fa65 556
2f491b41 557#ifdef INSERT_ATTRIBUTES
558 INSERT_ATTRIBUTES (node, & attributes, & prefix_attributes);
559#endif
44e9fa65 560
d9df9e36 561 attributes = chainon (prefix_attributes, attributes);
e532650d 562
b0fc3e72 563 for (a = attributes; a; a = TREE_CHAIN (a))
550e135c 564 {
565 tree name = TREE_PURPOSE (a);
566 tree args = TREE_VALUE (a);
567 int i;
568 enum attrs id;
73be5127 569
550e135c 570 for (i = 0; i < attrtab_idx; i++)
571 if (attrtab[i].name == name)
572 break;
573
606926f8 574 if (i == attrtab_idx)
550e135c 575 {
695d6519 576 if (! valid_machine_attribute (name, args, decl, type)
577 && ! (* valid_lang_attribute) (name, args, decl, type))
606926f8 578 warning ("`%s' attribute directive ignored",
579 IDENTIFIER_POINTER (name));
4b708a9e 580 else if (decl != 0)
581 type = TREE_TYPE (decl);
550e135c 582 continue;
583 }
584 else if (attrtab[i].decl_req && decl == 0)
585 {
586 warning ("`%s' attribute does not apply to types",
587 IDENTIFIER_POINTER (name));
588 continue;
589 }
590 else if (list_length (args) < attrtab[i].min
591 || list_length (args) > attrtab[i].max)
592 {
593 error ("wrong number of arguments specified for `%s' attribute",
594 IDENTIFIER_POINTER (name));
595 continue;
596 }
597
598 id = attrtab[i].id;
599 switch (id)
600 {
601 case A_PACKED:
4f21bc40 602 if (is_type)
cf333338 603 TYPE_PACKED (type) = 1;
604 else if (TREE_CODE (decl) == FIELD_DECL)
550e135c 605 DECL_PACKED (decl) = 1;
606 /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
607 used for DECL_REGISTER. It wouldn't mean anything anyway. */
608 else
609 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
610 break;
611
1f57d1e5 612 case A_NOCOMMON:
613 if (TREE_CODE (decl) == VAR_DECL)
614 DECL_COMMON (decl) = 0;
615 else
616 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
617 break;
618
9493f142 619 case A_COMMON:
620 if (TREE_CODE (decl) == VAR_DECL)
621 DECL_COMMON (decl) = 1;
622 else
623 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
624 break;
625
550e135c 626 case A_NORETURN:
627 if (TREE_CODE (decl) == FUNCTION_DECL)
628 TREE_THIS_VOLATILE (decl) = 1;
629 else if (TREE_CODE (type) == POINTER_TYPE
630 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
73be5127 631 TREE_TYPE (decl) = type
550e135c 632 = build_pointer_type
633 (build_type_variant (TREE_TYPE (type),
634 TREE_READONLY (TREE_TYPE (type)), 1));
635 else
636 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
637 break;
638
7259f3f8 639 case A_MALLOC:
640 if (TREE_CODE (decl) == FUNCTION_DECL)
641 DECL_IS_MALLOC (decl) = 1;
26dfc457 642 /* ??? TODO: Support types. */
7259f3f8 643 else
644 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
645 break;
646
3cf4cf22 647 case A_UNUSED:
31f820d2 648 if (is_type)
2fe4a282 649 if (decl)
650 TREE_USED (decl) = 1;
651 else
652 TREE_USED (type) = 1;
73be5127 653 else if (TREE_CODE (decl) == PARM_DECL
31f820d2 654 || TREE_CODE (decl) == VAR_DECL
41e80e4b 655 || TREE_CODE (decl) == FUNCTION_DECL
656 || TREE_CODE (decl) == LABEL_DECL)
3cf4cf22 657 TREE_USED (decl) = 1;
658 else
659 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
660 break;
661
550e135c 662 case A_CONST:
663 if (TREE_CODE (decl) == FUNCTION_DECL)
664 TREE_READONLY (decl) = 1;
665 else if (TREE_CODE (type) == POINTER_TYPE
666 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
667 TREE_TYPE (decl) = type
668 = build_pointer_type
669 (build_type_variant (TREE_TYPE (type), 1,
670 TREE_THIS_VOLATILE (TREE_TYPE (type))));
671 else
672 warning ( "`%s' attribute ignored", IDENTIFIER_POINTER (name));
673 break;
674
26dfc457 675 case A_PURE:
676 if (TREE_CODE (decl) == FUNCTION_DECL)
677 DECL_IS_PURE (decl) = 1;
678 /* ??? TODO: Support types. */
679 else
680 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
681 break;
682
683
550e135c 684 case A_T_UNION:
4f21bc40 685 if (is_type
550e135c 686 && TREE_CODE (type) == UNION_TYPE
4f21bc40 687 && (decl == 0
207bece5 688 || (TYPE_FIELDS (type) != 0
689 && TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type)))))
4f21bc40 690 TYPE_TRANSPARENT_UNION (type) = 1;
691 else if (decl != 0 && TREE_CODE (decl) == PARM_DECL
550e135c 692 && TREE_CODE (type) == UNION_TYPE
693 && TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type)))
4f21bc40 694 DECL_TRANSPARENT_UNION (decl) = 1;
550e135c 695 else
696 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
697 break;
698
699 case A_CONSTRUCTOR:
700 if (TREE_CODE (decl) == FUNCTION_DECL
701 && TREE_CODE (type) == FUNCTION_TYPE
702 && decl_function_context (decl) == 0)
6d3e85e7 703 {
704 DECL_STATIC_CONSTRUCTOR (decl) = 1;
705 TREE_USED (decl) = 1;
706 }
550e135c 707 else
708 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
709 break;
710
711 case A_DESTRUCTOR:
712 if (TREE_CODE (decl) == FUNCTION_DECL
713 && TREE_CODE (type) == FUNCTION_TYPE
714 && decl_function_context (decl) == 0)
6d3e85e7 715 {
716 DECL_STATIC_DESTRUCTOR (decl) = 1;
717 TREE_USED (decl) = 1;
718 }
550e135c 719 else
720 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
721 break;
722
723 case A_MODE:
724 if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
725 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
726 else
727 {
728 int j;
3eee82c5 729 const char *p = IDENTIFIER_POINTER (TREE_VALUE (args));
550e135c 730 int len = strlen (p);
731 enum machine_mode mode = VOIDmode;
732 tree typefm;
733
734 if (len > 4 && p[0] == '_' && p[1] == '_'
735 && p[len - 1] == '_' && p[len - 2] == '_')
736 {
22573d05 737 char *newp = (char *) alloca (len - 1);
550e135c 738
739 strcpy (newp, &p[2]);
740 newp[len - 4] = '\0';
741 p = newp;
742 }
743
744 /* Give this decl a type with the specified mode.
745 First check for the special modes. */
746 if (! strcmp (p, "byte"))
747 mode = byte_mode;
748 else if (!strcmp (p, "word"))
749 mode = word_mode;
750 else if (! strcmp (p, "pointer"))
751 mode = ptr_mode;
752 else
753 for (j = 0; j < NUM_MACHINE_MODES; j++)
754 if (!strcmp (p, GET_MODE_NAME (j)))
755 mode = (enum machine_mode) j;
756
757 if (mode == VOIDmode)
758 error ("unknown machine mode `%s'", p);
759 else if (0 == (typefm = type_for_mode (mode,
760 TREE_UNSIGNED (type))))
761 error ("no data type for mode `%s'", p);
762 else
763 {
e3fff6f2 764 if (TYPE_PRECISION (typefm) > (TREE_UNSIGNED (type)
765 ? TYPE_PRECISION(uintmax_type_node)
766 : TYPE_PRECISION(intmax_type_node))
767 && pedantic)
768 pedwarn ("type with more precision than %s",
769 TREE_UNSIGNED (type) ? "uintmax_t" : "intmax_t");
550e135c 770 TREE_TYPE (decl) = type = typefm;
b278476e 771 DECL_SIZE (decl) = DECL_SIZE_UNIT (decl) = 0;
550e135c 772 layout_decl (decl, 0);
773 }
774 }
775 break;
776
777 case A_SECTION:
e532650d 778#ifdef ASM_OUTPUT_SECTION_NAME
550e135c 779 if ((TREE_CODE (decl) == FUNCTION_DECL
780 || TREE_CODE (decl) == VAR_DECL)
781 && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
782 {
73be5127 783 if (TREE_CODE (decl) == VAR_DECL
28f4825b 784 && current_function_decl != NULL_TREE
785 && ! TREE_STATIC (decl))
550e135c 786 error_with_decl (decl,
787 "section attribute cannot be specified for local variables");
788 /* The decl may have already been given a section attribute from
789 a previous declaration. Ensure they match. */
790 else if (DECL_SECTION_NAME (decl) != NULL_TREE
791 && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
792 TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
793 error_with_decl (node,
794 "section of `%s' conflicts with previous declaration");
795 else
796 DECL_SECTION_NAME (decl) = TREE_VALUE (args);
797 }
798 else
799 error_with_decl (node,
e532650d 800 "section attribute not allowed for `%s'");
801#else
550e135c 802 error_with_decl (node,
803 "section attributes are not supported for this target");
e532650d 804#endif
550e135c 805 break;
806
807 case A_ALIGNED:
245de75a 808 {
550e135c 809 tree align_expr
21e3a120 810 = (args ? TREE_VALUE (args)
811 : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
a0c2c45b 812 int i;
44e9fa65 813
550e135c 814 /* Strip any NOPs of any kind. */
815 while (TREE_CODE (align_expr) == NOP_EXPR
816 || TREE_CODE (align_expr) == CONVERT_EXPR
817 || TREE_CODE (align_expr) == NON_LVALUE_EXPR)
818 align_expr = TREE_OPERAND (align_expr, 0);
73be5127 819
550e135c 820 if (TREE_CODE (align_expr) != INTEGER_CST)
821 {
822 error ("requested alignment is not a constant");
823 continue;
824 }
825
a0c2c45b 826 if ((i = tree_log2 (align_expr)) == -1)
550e135c 827 error ("requested alignment is not a power of 2");
a0c2c45b 828 else if (i > HOST_BITS_PER_INT - 2)
829 error ("requested alignment is too large");
550e135c 830 else if (is_type)
aca14577 831 {
3f50b833 832 /* If we have a TYPE_DECL, then copy the type, so that we
833 don't accidentally modify a builtin type. See pushdecl. */
834 if (decl && TREE_TYPE (decl) != error_mark_node
835 && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
43106ad9 836 {
3f50b833 837 tree tt = TREE_TYPE (decl);
838 DECL_ORIGINAL_TYPE (decl) = tt;
839 tt = build_type_copy (tt);
840 TYPE_NAME (tt) = decl;
841 TREE_USED (tt) = TREE_USED (decl);
842 TREE_TYPE (decl) = tt;
843 type = tt;
43106ad9 844 }
3f50b833 845
846 TYPE_ALIGN (type) = (1 << i) * BITS_PER_UNIT;
847 TYPE_USER_ALIGN (type) = 1;
aca14577 848 }
550e135c 849 else if (TREE_CODE (decl) != VAR_DECL
850 && TREE_CODE (decl) != FIELD_DECL)
851 error_with_decl (decl,
852 "alignment may not be specified for `%s'");
853 else
aca14577 854 {
855 DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;
856 DECL_USER_ALIGN (decl) = 1;
857 }
245de75a 858 }
550e135c 859 break;
245de75a 860
550e135c 861 case A_FORMAT:
b0fc3e72 862 {
d1f11193 863 tree format_type_id = TREE_VALUE (args);
550e135c 864 tree format_num_expr = TREE_VALUE (TREE_CHAIN (args));
865 tree first_arg_num_expr
866 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (args)));
a0c2c45b 867 unsigned HOST_WIDE_INT format_num, first_arg_num;
d1f11193 868 enum format_type format_type;
550e135c 869 tree argument;
a0c2c45b 870 unsigned int arg_num;
73be5127 871
550e135c 872 if (TREE_CODE (decl) != FUNCTION_DECL)
873 {
874 error_with_decl (decl,
875 "argument format specified for non-function `%s'");
876 continue;
877 }
44e9fa65 878
d1f11193 879 if (TREE_CODE (format_type_id) != IDENTIFIER_NODE)
b91b108f 880 {
d1f11193 881 error ("unrecognized format specifier");
b91b108f 882 continue;
883 }
550e135c 884 else
885 {
3eee82c5 886 const char *p = IDENTIFIER_POINTER (format_type_id);
44e9fa65 887
d1f11193 888 if (!strcmp (p, "printf") || !strcmp (p, "__printf__"))
889 format_type = printf_format_type;
890 else if (!strcmp (p, "scanf") || !strcmp (p, "__scanf__"))
891 format_type = scanf_format_type;
892 else if (!strcmp (p, "strftime")
893 || !strcmp (p, "__strftime__"))
894 format_type = strftime_format_type;
895 else
896 {
f1959ea2 897 warning ("`%s' is an unrecognized format function type", p);
d1f11193 898 continue;
899 }
550e135c 900 }
245de75a 901
550e135c 902 /* Strip any conversions from the string index and first arg number
903 and verify they are constants. */
904 while (TREE_CODE (format_num_expr) == NOP_EXPR
905 || TREE_CODE (format_num_expr) == CONVERT_EXPR
906 || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
907 format_num_expr = TREE_OPERAND (format_num_expr, 0);
d6cd1111 908
550e135c 909 while (TREE_CODE (first_arg_num_expr) == NOP_EXPR
910 || TREE_CODE (first_arg_num_expr) == CONVERT_EXPR
911 || TREE_CODE (first_arg_num_expr) == NON_LVALUE_EXPR)
912 first_arg_num_expr = TREE_OPERAND (first_arg_num_expr, 0);
913
914 if (TREE_CODE (format_num_expr) != INTEGER_CST
a0c2c45b 915 || TREE_INT_CST_HIGH (format_num_expr) != 0
916 || TREE_CODE (first_arg_num_expr) != INTEGER_CST
917 || TREE_INT_CST_HIGH (first_arg_num_expr) != 0)
557b092e 918 {
a0c2c45b 919 error ("format string has invalid operand number");
550e135c 920 continue;
557b092e 921 }
550e135c 922
923 format_num = TREE_INT_CST_LOW (format_num_expr);
924 first_arg_num = TREE_INT_CST_LOW (first_arg_num_expr);
925 if (first_arg_num != 0 && first_arg_num <= format_num)
5d730828 926 {
550e135c 927 error ("format string arg follows the args to be formatted");
245de75a 928 continue;
5d730828 929 }
550e135c 930
931 /* If a parameter list is specified, verify that the format_num
932 argument is actually a string, in case the format attribute
933 is in error. */
934 argument = TYPE_ARG_TYPES (type);
935 if (argument)
557b092e 936 {
a0c2c45b 937 for (arg_num = 1; argument != 0 && arg_num != format_num;
938 ++arg_num, argument = TREE_CHAIN (argument))
939 ;
940
550e135c 941 if (! argument
942 || TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE
943 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (argument)))
944 != char_type_node))
945 {
946 error ("format string arg not a string type");
557b092e 947 continue;
948 }
a0c2c45b 949
950 else if (first_arg_num != 0)
550e135c 951 {
952 /* Verify that first_arg_num points to the last arg,
a92771b8 953 the ... */
550e135c 954 while (argument)
955 arg_num++, argument = TREE_CHAIN (argument);
a0c2c45b 956
957 if (arg_num != first_arg_num)
958 {
959 error ("args to be formatted is not '...'");
960 continue;
961 }
550e135c 962 }
557b092e 963 }
252b13bb 964
e6dd34f1 965 if (format_type == strftime_format_type && first_arg_num != 0)
966 {
967 error ("strftime formats cannot format arguments");
968 continue;
969 }
970
550e135c 971 record_function_format (DECL_NAME (decl),
972 DECL_ASSEMBLER_NAME (decl),
d1f11193 973 format_type, format_num, first_arg_num);
550e135c 974 break;
975 }
df1c8607 976
b91b108f 977 case A_FORMAT_ARG:
978 {
979 tree format_num_expr = TREE_VALUE (args);
a0c2c45b 980 unsigned HOST_WIDE_INT format_num;
981 unsigned int arg_num;
b91b108f 982 tree argument;
73be5127 983
b91b108f 984 if (TREE_CODE (decl) != FUNCTION_DECL)
985 {
986 error_with_decl (decl,
987 "argument format specified for non-function `%s'");
988 continue;
989 }
73be5127 990
b91b108f 991 /* Strip any conversions from the first arg number and verify it
992 is a constant. */
993 while (TREE_CODE (format_num_expr) == NOP_EXPR
994 || TREE_CODE (format_num_expr) == CONVERT_EXPR
995 || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
996 format_num_expr = TREE_OPERAND (format_num_expr, 0);
997
a0c2c45b 998 if (TREE_CODE (format_num_expr) != INTEGER_CST
999 || TREE_INT_CST_HIGH (format_num_expr) != 0)
b91b108f 1000 {
a0c2c45b 1001 error ("format string has invalid operand number");
b91b108f 1002 continue;
1003 }
1004
1005 format_num = TREE_INT_CST_LOW (format_num_expr);
1006
1007 /* If a parameter list is specified, verify that the format_num
1008 argument is actually a string, in case the format attribute
1009 is in error. */
1010 argument = TYPE_ARG_TYPES (type);
1011 if (argument)
1012 {
a0c2c45b 1013 for (arg_num = 1; argument != 0 && arg_num != format_num;
1014 ++arg_num, argument = TREE_CHAIN (argument))
1015 ;
1016
b91b108f 1017 if (! argument
1018 || TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE
1019 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (argument)))
1020 != char_type_node))
1021 {
1022 error ("format string arg not a string type");
1023 continue;
1024 }
1025 }
1026
1027 if (TREE_CODE (TREE_TYPE (TREE_TYPE (decl))) != POINTER_TYPE
1028 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (TREE_TYPE (decl))))
1029 != char_type_node))
1030 {
1031 error ("function does not return string type");
1032 continue;
1033 }
1034
1035 record_international_format (DECL_NAME (decl),
1036 DECL_ASSEMBLER_NAME (decl),
1037 format_num);
1038 break;
1039 }
1040
df1c8607 1041 case A_WEAK:
1042 declare_weak (decl);
1043 break;
1044
1045 case A_ALIAS:
1046 if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
65dab9aa 1047 || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl)))
df1c8607 1048 error_with_decl (decl,
1049 "`%s' defined both normally and as an alias");
1050 else if (decl_function_context (decl) == 0)
1051 {
17971af5 1052 tree id;
1053
1054 id = TREE_VALUE (args);
1055 if (TREE_CODE (id) != STRING_CST)
1056 {
1057 error ("alias arg not a string");
1058 break;
1059 }
1060 id = get_identifier (TREE_STRING_POINTER (id));
24d8c4e4 1061 /* This counts as a use of the object pointed to. */
1062 TREE_USED (id) = 1;
17971af5 1063
df1c8607 1064 if (TREE_CODE (decl) == FUNCTION_DECL)
1065 DECL_INITIAL (decl) = error_mark_node;
1066 else
1067 DECL_EXTERNAL (decl) = 0;
1068 assemble_alias (decl, id);
1069 }
1070 else
1071 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
1072 break;
abd28cef 1073
efea460c 1074 case A_NO_CHECK_MEMORY_USAGE:
1075 if (TREE_CODE (decl) != FUNCTION_DECL)
1076 {
1077 error_with_decl (decl,
1078 "`%s' attribute applies only to functions",
1079 IDENTIFIER_POINTER (name));
1080 }
1081 else if (DECL_INITIAL (decl))
1082 {
1083 error_with_decl (decl,
1084 "can't set `%s' attribute after definition",
1085 IDENTIFIER_POINTER (name));
1086 }
1087 else
1088 DECL_NO_CHECK_MEMORY_USAGE (decl) = 1;
1089 break;
1090
abd28cef 1091 case A_NO_INSTRUMENT_FUNCTION:
1092 if (TREE_CODE (decl) != FUNCTION_DECL)
1093 {
1094 error_with_decl (decl,
1095 "`%s' attribute applies only to functions",
1096 IDENTIFIER_POINTER (name));
1097 }
1098 else if (DECL_INITIAL (decl))
1099 {
1100 error_with_decl (decl,
1101 "can't set `%s' attribute after definition",
1102 IDENTIFIER_POINTER (name));
1103 }
1104 else
1105 DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1106 break;
8f8ac140 1107
1108 case A_NO_LIMIT_STACK:
1109 if (TREE_CODE (decl) != FUNCTION_DECL)
1110 {
1111 error_with_decl (decl,
1112 "`%s' attribute applies only to functions",
1113 IDENTIFIER_POINTER (name));
1114 }
1115 else if (DECL_INITIAL (decl))
1116 {
1117 error_with_decl (decl,
1118 "can't set `%s' attribute after definition",
1119 IDENTIFIER_POINTER (name));
1120 }
1121 else
1122 DECL_NO_LIMIT_STACK (decl) = 1;
1123 break;
550e135c 1124 }
1125 }
b0fc3e72 1126}
d53e9dc0 1127
1128/* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two
1129 lists. SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE).
1130
1131 The head of the declspec list is stored in DECLSPECS.
1132 The head of the attribute list is stored in PREFIX_ATTRIBUTES.
1133
1134 Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of
1135 the list elements. We drop the containing TREE_LIST nodes and link the
1136 resulting attributes together the way decl_attributes expects them. */
1137
1138void
1139split_specs_attrs (specs_attrs, declspecs, prefix_attributes)
1140 tree specs_attrs;
1141 tree *declspecs, *prefix_attributes;
1142{
1143 tree t, s, a, next, specs, attrs;
1144
ece7cbbe 1145 /* This can happen after an __extension__ in pedantic mode. */
1146 if (specs_attrs != NULL_TREE
1147 && TREE_CODE (specs_attrs) == INTEGER_CST)
1148 {
1149 *declspecs = NULL_TREE;
1150 *prefix_attributes = NULL_TREE;
1151 return;
1152 }
1153
d53e9dc0 1154 /* This can happen in c++ (eg: decl: typespec initdecls ';'). */
1155 if (specs_attrs != NULL_TREE
1156 && TREE_CODE (specs_attrs) != TREE_LIST)
1157 {
1158 *declspecs = specs_attrs;
1159 *prefix_attributes = NULL_TREE;
1160 return;
1161 }
1162
1163 /* Remember to keep the lists in the same order, element-wise. */
1164
1165 specs = s = NULL_TREE;
1166 attrs = a = NULL_TREE;
1167 for (t = specs_attrs; t; t = next)
1168 {
1169 next = TREE_CHAIN (t);
1170 /* Declspecs have a non-NULL TREE_VALUE. */
1171 if (TREE_VALUE (t) != NULL_TREE)
1172 {
1173 if (specs == NULL_TREE)
1174 specs = s = t;
1175 else
1176 {
1177 TREE_CHAIN (s) = t;
1178 s = t;
1179 }
1180 }
1181 else
1182 {
1183 if (attrs == NULL_TREE)
1184 attrs = a = TREE_PURPOSE (t);
1185 else
1186 {
1187 TREE_CHAIN (a) = TREE_PURPOSE (t);
1188 a = TREE_PURPOSE (t);
1189 }
1190 /* More attrs can be linked here, move A to the end. */
1191 while (TREE_CHAIN (a) != NULL_TREE)
1192 a = TREE_CHAIN (a);
1193 }
1194 }
1195
1196 /* Terminate the lists. */
1197 if (s != NULL_TREE)
1198 TREE_CHAIN (s) = NULL_TREE;
1199 if (a != NULL_TREE)
1200 TREE_CHAIN (a) = NULL_TREE;
1201
1202 /* All done. */
1203 *declspecs = specs;
1204 *prefix_attributes = attrs;
1205}
0bf60c2b 1206
1207/* Strip attributes from SPECS_ATTRS, a list of declspecs and attributes.
1208 This function is used by the parser when a rule will accept attributes
1209 in a particular position, but we don't want to support that just yet.
1210
1211 A warning is issued for every ignored attribute. */
1212
1213tree
1214strip_attrs (specs_attrs)
1215 tree specs_attrs;
1216{
1217 tree specs, attrs;
1218
1219 split_specs_attrs (specs_attrs, &specs, &attrs);
1220
1221 while (attrs)
1222 {
1223 warning ("`%s' attribute ignored",
1224 IDENTIFIER_POINTER (TREE_PURPOSE (attrs)));
1225 attrs = TREE_CHAIN (attrs);
1226 }
1227
1228 return specs;
1229}
b0fc3e72 1230\f
fce9faf9 1231/* Check a printf/fprintf/sprintf/scanf/fscanf/sscanf format against
1232 a parameter list. */
1233
6659e606 1234/* The meaningfully distinct length modifiers for format checking recognised
1235 by GCC. */
1236enum format_lengths
1237{
1238 FMT_LEN_none,
1239 FMT_LEN_hh,
1240 FMT_LEN_h,
1241 FMT_LEN_l,
1242 FMT_LEN_ll,
1243 FMT_LEN_L,
1244 FMT_LEN_z,
1245 FMT_LEN_t,
1246 FMT_LEN_j,
1247 FMT_LEN_MAX
1248};
1249
1250
1251/* The standard versions in which various format features appeared. */
1252enum format_std_version
1253{
1254 STD_C89,
1255 STD_C94,
1256 STD_C99,
1257 STD_EXT
1258};
1259
1260
8f4541cf 1261/* Flags that may apply to a particular kind of format checked by GCC. */
1262enum
1263{
1264 /* This format converts arguments of types determined by the
1265 format string. */
1266 FMT_FLAG_ARG_CONVERT = 1,
1267 /* The scanf allocation 'a' kludge applies to this format kind. */
1268 FMT_FLAG_SCANF_A_KLUDGE = 2,
1269 /* A % during parsing a specifier is allowed to be a modified % rather
1270 that indicating the format is broken and we are out-of-sync. */
1271 FMT_FLAG_FANCY_PERCENT_OK = 4
1272 /* Not included here: details of whether width or precision may occur
1273 (controlled by width_char and precision_char); details of whether
1274 '*' can be used for these (width_type and precision_type); details
1275 of whether length modifiers can occur (length_char_specs); details
1276 of when $ operand numbers are allowed (always, for the formats
1277 supported, if arguments are converted). */
1278};
1279
1280
6659e606 1281/* Structure describing a length modifier supported in format checking, and
1282 possibly a doubled version such as "hh". */
1283typedef struct
1284{
1285 /* Name of the single-character length modifier. */
1286 const char *name;
1287 /* Index into a format_char_info.types array. */
1288 enum format_lengths index;
1289 /* Standard version this length appears in. */
1290 enum format_std_version std;
1291 /* Same, if the modifier can be repeated, or NULL if it can't. */
1292 const char *double_name;
1293 enum format_lengths double_index;
1294 enum format_std_version double_std;
1295} format_length_info;
1296
1297
1298/* Structure desribing the combination of a conversion specifier
1299 (or a set of specifiers which act identically) and a length modifier. */
1300typedef struct
1301{
1302 /* The standard version this combination of length and type appeared in.
1303 This is only relevant if greater than those for length and type
1304 individually; otherwise it is ignored. */
1305 enum format_std_version std;
1306 /* The name to use for the type, if different from that generated internally
1307 (e.g., "signed size_t"). */
1308 const char *name;
1309 /* The type itself. */
1310 tree *type;
1311} format_type_detail;
1312
1313
1314/* Macros to fill out tables of these. */
1315#define BADLEN { 0, NULL, NULL }
1316#define NOLENGTHS { BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }
1317
1318
1319/* Structure desribing a format conversion specifier (or a set of specifiers
1320 which act identically), and the length modifiers used with it. */
1321typedef struct
1322{
1323 const char *format_chars;
1324 int pointer_count;
1325 enum format_std_version std;
1326 /* Types accepted for each length modifier. */
1327 format_type_detail types[FMT_LEN_MAX];
20fda0bf 1328 /* List of other modifier characters allowed with these specifiers.
6659e606 1329 This lists flags, and additionally "w" for width, "p" for precision,
20fda0bf 1330 "a" for scanf "a" allocation extension (not applicable in C99 mode),
1331 "*" for scanf suppression, and "E" and "O" for those strftime
1332 modifiers. */
6659e606 1333 const char *flag_chars;
20fda0bf 1334 /* List of additional flags describing these conversion specifiers.
1335 "c" for generic character pointers being allowed, "2" for strftime
1336 two digit year formats, "3" for strftime formats giving two digit
8f4541cf 1337 years in some locales, "4" for "2" which becomes "3" with an "E" modifier,
1338 "o" if use of strftime "O" is a GNU extension beyond C99,
1339 "W" if the argument is a pointer which is dereferenced and written into,
1340 "i" for printf integer formats where the '0' flag is ignored with
1341 precision, and "[" for the starting character of a scanf scanset. */
20fda0bf 1342 const char *flags2;
6659e606 1343} format_char_info;
1344
1345
8f4541cf 1346/* Structure describing a flag accepted by some kind of format. */
1347typedef struct
1348{
1349 /* The flag character in question (0 for end of array). */
1350 int flag_char;
1351 /* Zero if this entry describes the flag character in general, or a
1352 non-zero character that may be found in flags2 if it describes the
1353 flag when used with certain formats only. If the latter, only
1354 the first such entry found that applies to the current conversion
1355 specifier is used; the values of `name' and `long_name' it supplies
1356 will be used, if non-NULL and the standard version is higher than
1357 the unpredicated one, for any pedantic warning. For example, 'o'
1358 for strftime formats (meaning 'O' is an extension over C99). */
1359 int predicate;
1360 /* The name to use for this flag in diagnostic messages. For example,
1361 N_("`0' flag"), N_("field width"). */
1362 const char *name;
1363 /* Long name for this flag in diagnostic messages; currently only used for
1364 "ISO C does not support ...". For example, N_("the `I' printf flag"). */
1365 const char *long_name;
1366 /* The standard version in which it appeared. */
1367 enum format_std_version std;
1368} format_flag_spec;
1369
1370
1371/* Structure describing a combination of flags that is bad for some kind
1372 of format. */
1373typedef struct
1374{
1375 /* The first flag character in question (0 for end of array). */
1376 int flag_char1;
1377 /* The second flag character. */
1378 int flag_char2;
1379 /* Non-zero if the message should say that the first flag is ignored with
1380 the second, zero if the combination should simply be objected to. */
1381 int ignored;
1382 /* Zero if this entry applies whenever this flag combination occurs,
1383 a non-zero character from flags2 if it only applies in some
1384 circumstances (e.g. 'i' for printf formats ignoring 0 with precision). */
1385 int predicate;
1386} format_flag_pair;
1387
1388
6659e606 1389/* Structure describing a particular kind of format processed by GCC. */
1390typedef struct
1391{
1392 /* The name of this kind of format, for use in diagnostics. */
1393 const char *name;
1394 /* Specifications of the length modifiers accepted; possibly NULL. */
1395 const format_length_info *length_char_specs;
1396 /* Details of the conversion specification characters accepted. */
1397 const format_char_info *conversion_specs;
8f4541cf 1398 /* String listing the flag characters that are accepted. */
1399 const char *flag_chars;
1400 /* String listing modifier characters (strftime) accepted. May be NULL. */
1401 const char *modifier_chars;
1402 /* Details of the flag characters, including pseudo-flags. */
1403 const format_flag_spec *flag_specs;
1404 /* Details of bad combinations of flags. */
1405 const format_flag_pair *bad_flag_pairs;
1406 /* Flags applicable to this kind of format. */
1407 int flags;
1408 /* Flag character to treat a width as, or 0 if width not used. */
1409 int width_char;
1410 /* Flag character to treat a precision as, or 0 if precision not used. */
1411 int precision_char;
1412 /* If a flag character has the effect of suppressing the conversion of
1413 an argument ('*' in scanf), that flag character, otherwise 0. */
1414 int suppression_char;
1415 /* Flag character to treat a length modifier as (ignored if length
1416 modifiers not used). Need not be placed in flag_chars for conversion
1417 specifiers, but is used to check for bad combinations such as length
1418 modifier with assignment suppression in scanf. */
1419 int length_code_char;
1420 /* Pointer to type of argument expected if '*' is used for a width,
1421 or NULL if '*' not used for widths. */
1422 tree *width_type;
1423 /* Pointer to type of argument expected if '*' is used for a precision,
1424 or NULL if '*' not used for precisions. */
1425 tree *precision_type;
6659e606 1426} format_kind_info;
1427
1428
c7ca8f11 1429/* Structure describing details of a type expected in format checking,
1430 and the type to check against it. */
1431typedef struct format_wanted_type
1432{
1433 /* The type wanted. */
1434 tree wanted_type;
1435 /* The name of this type to use in diagnostics. */
1436 const char *wanted_type_name;
1437 /* The level of indirection through pointers at which this type occurs. */
1438 int pointer_count;
1439 /* Whether, when pointer_count is 1, to allow any character type when
1440 pedantic, rather than just the character or void type specified. */
1441 int char_lenient_flag;
1442 /* Whether the argument, dereferenced once, is written into and so the
1443 argument must not be a pointer to a const-qualified type. */
1444 int writing_in_flag;
1445 /* If warnings should be of the form "field precision is not type int",
1446 the name to use (in this case "field precision"), otherwise NULL,
1447 for "%s format, %s arg" type messages. If (in an extension), this
1448 is a pointer type, wanted_type_name should be set to include the
1449 terminating '*' characters of the type name to give a correct
1450 message. */
1451 const char *name;
1452 /* The actual parameter to check against the wanted type. */
1453 tree param;
1454 /* The argument number of that parameter. */
1455 int arg_num;
1456 /* The next type to check for this format conversion, or NULL if none. */
1457 struct format_wanted_type *next;
1458} format_wanted_type;
1459
1460
6659e606 1461static const format_length_info printf_length_specs[] =
1462{
1463 { "h", FMT_LEN_h, STD_C89, "hh", FMT_LEN_hh, STD_C99 },
1464 { "l", FMT_LEN_l, STD_C89, "ll", FMT_LEN_ll, STD_C99 },
1465 { "q", FMT_LEN_ll, STD_EXT, NULL, 0, 0 },
1466 { "L", FMT_LEN_L, STD_C89, NULL, 0, 0 },
1467 { "z", FMT_LEN_z, STD_C99, NULL, 0, 0 },
1468 { "Z", FMT_LEN_z, STD_EXT, NULL, 0, 0 },
1469 { "t", FMT_LEN_t, STD_C99, NULL, 0, 0 },
1470 { "j", FMT_LEN_j, STD_C99, NULL, 0, 0 },
1471 { NULL, 0, 0, NULL, 0, 0 }
1472};
1473
1474
1475/* This differs from printf_length_specs only in that "Z" is not accepted. */
1476static const format_length_info scanf_length_specs[] =
1477{
1478 { "h", FMT_LEN_h, STD_C89, "hh", FMT_LEN_hh, STD_C99 },
1479 { "l", FMT_LEN_l, STD_C89, "ll", FMT_LEN_ll, STD_C99 },
1480 { "q", FMT_LEN_ll, STD_EXT, NULL, 0, 0 },
1481 { "L", FMT_LEN_L, STD_C89, NULL, 0, 0 },
1482 { "z", FMT_LEN_z, STD_C99, NULL, 0, 0 },
1483 { "t", FMT_LEN_t, STD_C99, NULL, 0, 0 },
1484 { "j", FMT_LEN_j, STD_C99, NULL, 0, 0 },
1485 { NULL, 0, 0, NULL, 0, 0 }
1486};
1487
1488
8f4541cf 1489static const format_flag_spec printf_flag_specs[] =
1490{
1491 { ' ', 0, N_("` ' flag"), N_("the ` ' printf flag"), STD_C89 },
1492 { '+', 0, N_("`+' flag"), N_("the `+' printf flag"), STD_C89 },
1493 { '#', 0, N_("`#' flag"), N_("the `#' printf flag"), STD_C89 },
1494 { '0', 0, N_("`0' flag"), N_("the `0' printf flag"), STD_C89 },
1495 { '-', 0, N_("`-' flag"), N_("the `-' printf flag"), STD_C89 },
1496 { '\'', 0, N_("`'' flag"), N_("the `'' printf flag"), STD_EXT },
1497 { 'I', 0, N_("`I' flag"), N_("the `I' printf flag"), STD_EXT },
1498 { 'w', 0, N_("field width"), N_("field width in printf format"), STD_C89 },
1499 { 'p', 0, N_("precision"), N_("precision in printf format"), STD_C89 },
1500 { 'L', 0, N_("length modifier"), N_("length modifier in printf format"), STD_C89 },
1501 { 0, 0, NULL, NULL, 0 }
1502};
1503
1504
1505static const format_flag_pair printf_flag_pairs[] =
1506{
1507 { ' ', '+', 1, 0 },
1508 { '0', '-', 1, 0 },
1509 { '0', 'p', 1, 'i' },
1510 { 0, 0, 0, 0 }
1511};
1512
1513
1514static const format_flag_spec scanf_flag_specs[] =
1515{
4a0f78f6 1516 { '*', 0, N_("assignment suppression"), N_("assignment suppression"), STD_C89 },
1517 { 'a', 0, N_("`a' flag"), N_("the `a' scanf flag"), STD_EXT },
1518 { 'w', 0, N_("field width"), N_("field width in scanf format"), STD_C89 },
1519 { 'L', 0, N_("length modifier"), N_("length modifier in scanf format"), STD_C89 },
1520 { '\'', 0, N_("`'' flag"), N_("the `'' scanf flag"), STD_EXT },
1521 { 'I', 0, N_("`I' flag"), N_("the `I' scanf flag"), STD_EXT },
8f4541cf 1522 { 0, 0, NULL, NULL, 0 }
1523};
1524
1525
1526static const format_flag_pair scanf_flag_pairs[] =
1527{
1528 { '*', 'L', 0, 0 },
1529 { 0, 0, 0, 0 }
1530};
1531
1532
1533static const format_flag_spec strftime_flag_specs[] =
1534{
1535 { '_', 0, N_("`_' flag"), N_("the `_' strftime flag"), STD_EXT },
1536 { '-', 0, N_("`-' flag"), N_("the `-' strftime flag"), STD_EXT },
1537 { '0', 0, N_("`0' flag"), N_("the `0' strftime flag"), STD_EXT },
1538 { '^', 0, N_("`^' flag"), N_("the `^' strftime flag"), STD_EXT },
1539 { '#', 0, N_("`#' flag"), N_("the `#' strftime flag"), STD_EXT },
1540 { 'w', 0, N_("field width"), N_("field width in strftime format"), STD_EXT },
1541 { 'E', 0, N_("`E' modifier"), N_("the `E' strftime modifier"), STD_C99 },
1542 { 'O', 0, N_("`O' modifier"), N_("the `O' strftime modifier"), STD_C99 },
1543 { 'O', 'o', NULL, N_("the `O' modifier"), STD_EXT },
1544 { 0, 0, NULL, NULL, 0 }
1545};
1546
1547
1548static const format_flag_pair strftime_flag_pairs[] =
1549{
1550 { 'E', 'O', 0, 0 },
4a0f78f6 1551 { '_', '-', 0, 0 },
1552 { '_', '0', 0, 0 },
1553 { '-', '0', 0, 0 },
1554 { '^', '#', 0, 0 },
8f4541cf 1555 { 0, 0, 0, 0 }
1556};
1557
1558
fce9faf9 1559#define T_I &integer_type_node
6659e606 1560#define T89_I { STD_C89, NULL, T_I }
1561#define T99_I { STD_C99, NULL, T_I }
fce9faf9 1562#define T_L &long_integer_type_node
6659e606 1563#define T89_L { STD_C89, NULL, T_L }
93fccc0a 1564#define T_LL &long_long_integer_type_node
6659e606 1565#define T99_LL { STD_C99, NULL, T_LL }
1566#define TEX_LL { STD_EXT, NULL, T_LL }
fce9faf9 1567#define T_S &short_integer_type_node
6659e606 1568#define T89_S { STD_C89, NULL, T_S }
fce9faf9 1569#define T_UI &unsigned_type_node
6659e606 1570#define T89_UI { STD_C89, NULL, T_UI }
1571#define T99_UI { STD_C99, NULL, T_UI }
fce9faf9 1572#define T_UL &long_unsigned_type_node
6659e606 1573#define T89_UL { STD_C89, NULL, T_UL }
93fccc0a 1574#define T_ULL &long_long_unsigned_type_node
6659e606 1575#define T99_ULL { STD_C99, NULL, T_ULL }
1576#define TEX_ULL { STD_EXT, NULL, T_ULL }
fce9faf9 1577#define T_US &short_unsigned_type_node
6659e606 1578#define T89_US { STD_C89, NULL, T_US }
fce9faf9 1579#define T_F &float_type_node
6659e606 1580#define T89_F { STD_C89, NULL, T_F }
1581#define T99_F { STD_C99, NULL, T_F }
fce9faf9 1582#define T_D &double_type_node
6659e606 1583#define T89_D { STD_C89, NULL, T_D }
1584#define T99_D { STD_C99, NULL, T_D }
fce9faf9 1585#define T_LD &long_double_type_node
6659e606 1586#define T89_LD { STD_C89, NULL, T_LD }
1587#define T99_LD { STD_C99, NULL, T_LD }
fce9faf9 1588#define T_C &char_type_node
6659e606 1589#define T89_C { STD_C89, NULL, T_C }
428a1c21 1590#define T_SC &signed_char_type_node
6659e606 1591#define T99_SC { STD_C99, NULL, T_SC }
73be5127 1592#define T_UC &unsigned_char_type_node
6659e606 1593#define T99_UC { STD_C99, NULL, T_UC }
fce9faf9 1594#define T_V &void_type_node
6659e606 1595#define T89_V { STD_C89, NULL, T_V }
fce9faf9 1596#define T_W &wchar_type_node
6659e606 1597#define T94_W { STD_C94, "wchar_t", T_W }
1598#define TEX_W { STD_EXT, "wchar_t", T_W }
55dbcdfe 1599#define T_WI &wint_type_node
6659e606 1600#define T94_WI { STD_C94, "wint_t", T_WI }
1601#define TEX_WI { STD_EXT, "wint_t", T_WI }
1602#define T_ST &c_size_type_node
1603#define T99_ST { STD_C99, "size_t", T_ST }
428a1c21 1604#define T_SST &signed_size_type_node
6659e606 1605#define T99_SST { STD_C99, "signed size_t", T_SST }
49bc3768 1606#define T_PD &ptrdiff_type_node
6659e606 1607#define T99_PD { STD_C99, "ptrdiff_t", T_PD }
428a1c21 1608#define T_UPD &unsigned_ptrdiff_type_node
6659e606 1609#define T99_UPD { STD_C99, "unsigned ptrdiff_t", T_UPD }
e3fff6f2 1610#define T_IM &intmax_type_node
6659e606 1611#define T99_IM { STD_C99, "intmax_t", T_IM }
e3fff6f2 1612#define T_UIM &uintmax_type_node
6659e606 1613#define T99_UIM { STD_C99, "uintmax_t", T_UIM }
fce9faf9 1614
6659e606 1615static const format_char_info print_char_table[] =
1616{
1617 /* C89 conversion specifiers. */
659b28b5 1618 { "di", 0, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, TEX_LL, T99_SST, T99_PD, T99_IM }, "-wp0 +'I", "i" },
1619 { "oxX", 0, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "-wp0#", "i" },
1620 { "u", 0, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "-wp0'I", "i" },
20fda0bf 1621 { "fgG", 0, STD_C89, { T89_D, BADLEN, BADLEN, T99_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#'", "" },
1622 { "eE", 0, STD_C89, { T89_D, BADLEN, BADLEN, T99_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#", "" },
1623 { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, T94_WI, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "" },
1624 { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "c" },
1625 { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "c" },
1626 { "n", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, BADLEN, T99_SST, T99_PD, T99_IM }, "", "W" },
6659e606 1627 /* C99 conversion specifiers. */
20fda0bf 1628 { "F", 0, STD_C99, { T99_D, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#'", "" },
1629 { "aA", 0, STD_C99, { T99_D, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "-wp0 +#", "" },
6659e606 1630 /* X/Open conversion specifiers. */
20fda0bf 1631 { "C", 0, STD_EXT, { TEX_WI, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-w", "" },
1632 { "S", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "" },
6659e606 1633 /* GNU conversion specifiers. */
20fda0bf 1634 { "m", 0, STD_EXT, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "-wp", "" },
1635 { NULL, 0, 0, NOLENGTHS, NULL, NULL }
6659e606 1636};
fce9faf9 1637
6659e606 1638static const format_char_info scan_char_table[] =
1639{
1640 /* C89 conversion specifiers. */
4a0f78f6 1641 { "di", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, TEX_LL, T99_SST, T99_PD, T99_IM }, "*w'I", "W" },
1642 { "u", 1, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "*w'I", "W" },
1643 { "oxX", 1, STD_C89, { T89_UI, T99_UC, T89_US, T89_UL, T99_ULL, TEX_ULL, T99_ST, T99_UPD, T99_UIM }, "*w", "W" },
1644 { "efgEG", 1, STD_C89, { T89_F, BADLEN, BADLEN, T89_D, BADLEN, T89_LD, BADLEN, BADLEN, BADLEN }, "*w'", "W" },
1645 { "c", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "cW" },
1646 { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "cW" },
1647 { "[", 1, STD_C89, { T89_C, BADLEN, BADLEN, T94_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "cW[" },
1648 { "p", 2, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "W" },
1649 { "n", 1, STD_C89, { T89_I, T99_SC, T89_S, T89_L, T99_LL, BADLEN, T99_SST, T99_PD, T99_IM }, "", "W" },
6659e606 1650 /* C99 conversion specifiers. */
4a0f78f6 1651 { "FaA", 1, STD_C99, { T99_F, BADLEN, BADLEN, T99_D, BADLEN, T99_LD, BADLEN, BADLEN, BADLEN }, "*w'", "W" },
6659e606 1652 /* X/Open conversion specifiers. */
4a0f78f6 1653 { "C", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*w", "W" },
1654 { "S", 1, STD_EXT, { TEX_W, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "*aw", "W" },
20fda0bf 1655 { NULL, 0, 0, NOLENGTHS, NULL, NULL }
fce9faf9 1656};
1657
6659e606 1658static format_char_info time_char_table[] =
1659{
1660 /* C89 conversion specifiers. */
20fda0bf 1661 { "ABZab", 0, STD_C89, NOLENGTHS, "^#", "" },
1662 { "cx", 0, STD_C89, NOLENGTHS, "E", "3" },
1663 { "HIMSUWdmw", 0, STD_C89, NOLENGTHS, "-_0Ow", "" },
1664 { "j", 0, STD_C89, NOLENGTHS, "-_0Ow", "o" },
1665 { "p", 0, STD_C89, NOLENGTHS, "#", "" },
1666 { "X", 0, STD_C89, NOLENGTHS, "E", "" },
8f4541cf 1667 { "y", 0, STD_C89, NOLENGTHS, "EO-_0w", "4" },
20fda0bf 1668 { "Y", 0, STD_C89, NOLENGTHS, "-_0EOw", "o" },
1669 { "%", 0, STD_C89, NOLENGTHS, "", "" },
6659e606 1670 /* C99 conversion specifiers. */
20fda0bf 1671 { "C", 0, STD_C99, NOLENGTHS, "-_0EOw", "o" },
1672 { "D", 0, STD_C99, NOLENGTHS, "", "2" },
1673 { "eVu", 0, STD_C99, NOLENGTHS, "-_0Ow", "" },
1674 { "FRTnrt", 0, STD_C99, NOLENGTHS, "", "" },
1675 { "g", 0, STD_C99, NOLENGTHS, "O-_0w", "2o" },
1676 { "G", 0, STD_C99, NOLENGTHS, "-_0Ow", "o" },
1677 { "h", 0, STD_C99, NOLENGTHS, "^#", "" },
1678 { "z", 0, STD_C99, NOLENGTHS, "O", "o" },
6659e606 1679 /* GNU conversion specifiers. */
20fda0bf 1680 { "kls", 0, STD_EXT, NOLENGTHS, "-_0Ow", "" },
1681 { "P", 0, STD_EXT, NOLENGTHS, "", "" },
1682 { NULL, 0, 0, NOLENGTHS, NULL, NULL }
fce9faf9 1683};
1684
6659e606 1685
1686/* This must be in the same order as enum format_type. */
1687static const format_kind_info format_types[] =
1688{
8f4541cf 1689 { "printf", printf_length_specs, print_char_table, " +#0-'I", NULL,
1690 printf_flag_specs, printf_flag_pairs,
1691 FMT_FLAG_ARG_CONVERT, 'w', 'p', 0, 'L',
1692 &integer_type_node, &integer_type_node
1693 },
4a0f78f6 1694 { "scanf", scanf_length_specs, scan_char_table, "*'I", NULL,
8f4541cf 1695 scanf_flag_specs, scanf_flag_pairs,
1696 FMT_FLAG_ARG_CONVERT|FMT_FLAG_SCANF_A_KLUDGE, 'w', 0, '*', 'L',
1697 NULL, NULL
1698 },
1699 { "strftime", NULL, time_char_table, "_-0^#", "EO",
1700 strftime_flag_specs, strftime_flag_pairs,
1701 FMT_FLAG_FANCY_PERCENT_OK, 'w', 0, 0, 0,
1702 NULL, NULL
1703 }
d1f11193 1704};
1705
6659e606 1706
b91b108f 1707typedef struct function_format_info
1708{
fce9faf9 1709 struct function_format_info *next; /* next structure on the list */
1710 tree name; /* identifier such as "printf" */
1711 tree assembler_name; /* optional mangled identifier (for C++) */
d1f11193 1712 enum format_type format_type; /* type of format (printf, scanf, etc.) */
fce9faf9 1713 int format_num; /* number of format argument */
1714 int first_arg_num; /* number of first arg (zero for varargs) */
1715} function_format_info;
1716
1717static function_format_info *function_format_list = NULL;
1718
b91b108f 1719typedef struct international_format_info
1720{
1721 struct international_format_info *next; /* next structure on the list */
1722 tree name; /* identifier such as "gettext" */
1723 tree assembler_name; /* optional mangled identifier (for C++) */
1724 int format_num; /* number of format argument */
1725} international_format_info;
1726
1727static international_format_info *international_format_list = NULL;
1728
e8227183 1729/* Structure detailing the results of checking a format function call
1730 where the format expression may be a conditional expression with
1731 many leaves resulting from nested conditional expressions. */
1732typedef struct
1733{
1734 /* Number of leaves of the format argument that could not be checked
1735 as they were not string literals. */
1736 int number_non_literal;
1737 /* Number of leaves of the format argument that were null pointers or
1738 string literals, but had extra format arguments. */
1739 int number_extra_args;
1740 /* Number of leaves of the format argument that were null pointers or
1741 string literals, but had extra format arguments and used $ operand
1742 numbers. */
1743 int number_dollar_extra_args;
1744 /* Number of leaves of the format argument that were wide string
1745 literals. */
1746 int number_wide;
1747 /* Number of leaves of the format argument that were empty strings. */
1748 int number_empty;
1749 /* Number of leaves of the format argument that were unterminated
1750 strings. */
1751 int number_unterminated;
1752 /* Number of leaves of the format argument that were not counted above. */
1753 int number_other;
1754} format_check_results;
1755
e0bc5413 1756static void check_format_info PARAMS ((int *, function_format_info *, tree));
e8227183 1757static void check_format_info_recurse PARAMS ((int *, format_check_results *,
1758 function_format_info *, tree,
1759 tree, int));
1760static void check_format_info_main PARAMS ((int *, format_check_results *,
1761 function_format_info *,
1762 const char *, int, tree, int));
e0bc5413 1763static void status_warning PARAMS ((int *, const char *, ...))
1764 ATTRIBUTE_PRINTF_2;
fce9faf9 1765
96ab3ac7 1766static void init_dollar_format_checking PARAMS ((int, tree));
e0bc5413 1767static int maybe_read_dollar_number PARAMS ((int *, const char **, int,
96ab3ac7 1768 tree, tree *));
e8227183 1769static void finish_dollar_format_checking PARAMS ((int *, format_check_results *));
96ab3ac7 1770
8f4541cf 1771static const format_flag_spec *get_flag_spec PARAMS ((const format_flag_spec *,
1772 int, const char *));
1773
e0bc5413 1774static void check_format_types PARAMS ((int *, format_wanted_type *));
edbbe5ca 1775static int is_valid_printf_arglist PARAMS ((tree));
f4e55e4d 1776static rtx c_expand_builtin PARAMS ((tree, rtx, enum machine_mode, enum expand_modifier));
edbbe5ca 1777static rtx c_expand_builtin_printf PARAMS ((tree, rtx, enum machine_mode,
1778 enum expand_modifier, int));
c7ca8f11 1779
fce9faf9 1780/* Initialize the table of functions to perform format checking on.
9bee1c90 1781 The ISO C functions are always checked (whether <stdio.h> is
fce9faf9 1782 included or not), since it is common to call printf without
1783 including <stdio.h>. There shouldn't be a problem with this,
9bee1c90 1784 since ISO C reserves these function names whether you include the
1785 header file or not. In any case, the checking is harmless. With
1786 -ffreestanding, these default attributes are disabled, and must be
1787 specified manually if desired.
b91b108f 1788
1789 Also initialize the name of function that modify the format string for
1790 internationalization purposes. */
fce9faf9 1791
1792void
1793init_function_format_info ()
1794{
9bee1c90 1795 if (flag_hosted)
1796 {
1797 /* Functions from ISO/IEC 9899:1990. */
1798 record_function_format (get_identifier ("printf"), NULL_TREE,
1799 printf_format_type, 1, 2);
3311f67b 1800 record_function_format (get_identifier ("__builtin_printf"), NULL_TREE,
1801 printf_format_type, 1, 2);
9bee1c90 1802 record_function_format (get_identifier ("fprintf"), NULL_TREE,
1803 printf_format_type, 2, 3);
1804 record_function_format (get_identifier ("sprintf"), NULL_TREE,
1805 printf_format_type, 2, 3);
1806 record_function_format (get_identifier ("scanf"), NULL_TREE,
1807 scanf_format_type, 1, 2);
1808 record_function_format (get_identifier ("fscanf"), NULL_TREE,
1809 scanf_format_type, 2, 3);
1810 record_function_format (get_identifier ("sscanf"), NULL_TREE,
1811 scanf_format_type, 2, 3);
1812 record_function_format (get_identifier ("vprintf"), NULL_TREE,
1813 printf_format_type, 1, 0);
1814 record_function_format (get_identifier ("vfprintf"), NULL_TREE,
1815 printf_format_type, 2, 0);
1816 record_function_format (get_identifier ("vsprintf"), NULL_TREE,
1817 printf_format_type, 2, 0);
1818 record_function_format (get_identifier ("strftime"), NULL_TREE,
1819 strftime_format_type, 3, 0);
1820 }
1821
1822 if (flag_hosted && flag_isoc99)
9f426305 1823 {
1824 /* ISO C99 adds the snprintf and vscanf family functions. */
1825 record_function_format (get_identifier ("snprintf"), NULL_TREE,
1826 printf_format_type, 3, 4);
1827 record_function_format (get_identifier ("vsnprintf"), NULL_TREE,
1828 printf_format_type, 3, 0);
1829 record_function_format (get_identifier ("vscanf"), NULL_TREE,
1830 scanf_format_type, 1, 0);
1831 record_function_format (get_identifier ("vfscanf"), NULL_TREE,
1832 scanf_format_type, 2, 0);
1833 record_function_format (get_identifier ("vsscanf"), NULL_TREE,
1834 scanf_format_type, 2, 0);
1835 }
1836
9bee1c90 1837 if (flag_hosted && flag_noniso_default_format_attributes)
1838 {
1839 /* Uniforum/GNU gettext functions, not in ISO C. */
1840 record_international_format (get_identifier ("gettext"), NULL_TREE, 1);
1841 record_international_format (get_identifier ("dgettext"), NULL_TREE, 2);
1842 record_international_format (get_identifier ("dcgettext"), NULL_TREE, 2);
1843 }
fce9faf9 1844}
1845
1846/* Record information for argument format checking. FUNCTION_IDENT is
1847 the identifier node for the name of the function to check (its decl
d1f11193 1848 need not exist yet).
1849 FORMAT_TYPE specifies the type of format checking. FORMAT_NUM is the number
fce9faf9 1850 of the argument which is the format control string (starting from 1).
1851 FIRST_ARG_NUM is the number of the first actual argument to check
b91b108f 1852 against the format string, or zero if no checking is not be done
fce9faf9 1853 (e.g. for varargs such as vfprintf). */
1854
d1f11193 1855static void
1856record_function_format (name, assembler_name, format_type,
fce9faf9 1857 format_num, first_arg_num)
1858 tree name;
1859 tree assembler_name;
d1f11193 1860 enum format_type format_type;
fce9faf9 1861 int format_num;
1862 int first_arg_num;
1863{
1864 function_format_info *info;
1865
1866 /* Re-use existing structure if it's there. */
1867
1868 for (info = function_format_list; info; info = info->next)
1869 {
1870 if (info->name == name && info->assembler_name == assembler_name)
1871 break;
1872 }
1873 if (! info)
1874 {
1875 info = (function_format_info *) xmalloc (sizeof (function_format_info));
1876 info->next = function_format_list;
1877 function_format_list = info;
1878
1879 info->name = name;
1880 info->assembler_name = assembler_name;
1881 }
1882
d1f11193 1883 info->format_type = format_type;
fce9faf9 1884 info->format_num = format_num;
1885 info->first_arg_num = first_arg_num;
1886}
1887
b91b108f 1888/* Record information for the names of function that modify the format
1889 argument to format functions. FUNCTION_IDENT is the identifier node for
1890 the name of the function (its decl need not exist yet) and FORMAT_NUM is
1891 the number of the argument which is the format control string (starting
1892 from 1). */
1893
a5c74c6a 1894static void
b91b108f 1895record_international_format (name, assembler_name, format_num)
1896 tree name;
1897 tree assembler_name;
1898 int format_num;
1899{
1900 international_format_info *info;
1901
1902 /* Re-use existing structure if it's there. */
1903
1904 for (info = international_format_list; info; info = info->next)
1905 {
1906 if (info->name == name && info->assembler_name == assembler_name)
1907 break;
1908 }
1909
1910 if (! info)
1911 {
1912 info
1913 = (international_format_info *)
1914 xmalloc (sizeof (international_format_info));
1915 info->next = international_format_list;
1916 international_format_list = info;
1917
1918 info->name = name;
1919 info->assembler_name = assembler_name;
1920 }
1921
1922 info->format_num = format_num;
1923}
fce9faf9 1924\f
1925/* Check the argument list of a call to printf, scanf, etc.
1926 NAME is the function identifier.
1927 ASSEMBLER_NAME is the function's assembler identifier.
1928 (Either NAME or ASSEMBLER_NAME, but not both, may be NULL_TREE.)
e37414d8 1929 PARAMS is the list of argument values. Also, if -Wmissing-format-attribute,
1930 warn for calls to vprintf or vscanf in functions with no such format
1931 attribute themselves. */
fce9faf9 1932
1933void
e0bc5413 1934check_function_format (status, name, assembler_name, params)
1935 int *status;
fce9faf9 1936 tree name;
1937 tree assembler_name;
1938 tree params;
1939{
1940 function_format_info *info;
1941
1942 /* See if this function is a format function. */
1943 for (info = function_format_list; info; info = info->next)
1944 {
236236da 1945 if (info->assembler_name
fce9faf9 1946 ? (info->assembler_name == assembler_name)
1947 : (info->name == name))
1948 {
1949 /* Yup; check it. */
e0bc5413 1950 check_format_info (status, info, params);
e37414d8 1951 if (warn_missing_format_attribute && info->first_arg_num == 0
1952 && (format_types[info->format_type].flags & FMT_FLAG_ARG_CONVERT))
1953 {
1954 function_format_info *info2;
1955 for (info2 = function_format_list; info2; info2 = info2->next)
1956 if ((info2->assembler_name
1957 ? (info2->assembler_name == DECL_ASSEMBLER_NAME (current_function_decl))
1958 : (info2->name == DECL_NAME (current_function_decl)))
1959 && info2->format_type == info->format_type)
1960 break;
1961 if (info2 == NULL)
1962 warning ("function might be possible candidate for `%s' format attribute",
1963 format_types[info->format_type].name);
1964 }
fce9faf9 1965 break;
1966 }
1967 }
1968}
1969
e0bc5413 1970/* This function replaces `warning' inside the printf format checking
1971 functions. If the `status' parameter is non-NULL, then it is
1972 dereferenced and set to 1 whenever a warning is caught. Otherwise
1973 it warns as usual by replicating the innards of the warning
1974 function from diagnostic.c. */
1975static void
1976status_warning VPARAMS ((int *status, const char *msgid, ...))
1977{
1978#ifndef ANSI_PROTOTYPES
1979 int *status;
1980 const char *msgid;
1981#endif
1982 va_list ap;
1983 diagnostic_context dc;
1984
1985 if (status)
1986 *status = 1;
1987 else
1988 {
1989 VA_START (ap, msgid);
1990
1991#ifndef ANSI_PROTOTYPES
1992 status = va_arg (ap, int *);
1993 msgid = va_arg (ap, const char *);
1994#endif
1995
1996 /* This duplicates the warning function behavior. */
1997 set_diagnostic_context
1998 (&dc, msgid, &ap, input_filename, lineno, /* warn = */ 1);
1999 report_diagnostic (&dc);
2000
2001 va_end (ap);
2002 }
2003}
96ab3ac7 2004
2005/* Variables used by the checking of $ operand number formats. */
2006static char *dollar_arguments_used = NULL;
2007static int dollar_arguments_alloc = 0;
2008static int dollar_arguments_count;
2009static int dollar_first_arg_num;
2010static int dollar_max_arg_used;
2011static int dollar_format_warned;
2012
2013/* Initialize the checking for a format string that may contain $
2014 parameter number specifications; we will need to keep track of whether
2015 each parameter has been used. FIRST_ARG_NUM is the number of the first
2016 argument that is a parameter to the format, or 0 for a vprintf-style
2017 function; PARAMS is the list of arguments starting at this argument. */
2018
2019static void
2020init_dollar_format_checking (first_arg_num, params)
2021 int first_arg_num;
2022 tree params;
2023{
2024 dollar_first_arg_num = first_arg_num;
2025 dollar_arguments_count = 0;
2026 dollar_max_arg_used = 0;
2027 dollar_format_warned = 0;
2028 if (first_arg_num > 0)
2029 {
2030 while (params)
2031 {
2032 dollar_arguments_count++;
2033 params = TREE_CHAIN (params);
2034 }
2035 }
2036 if (dollar_arguments_alloc < dollar_arguments_count)
2037 {
2038 if (dollar_arguments_used)
2039 free (dollar_arguments_used);
2040 dollar_arguments_alloc = dollar_arguments_count;
2041 dollar_arguments_used = xmalloc (dollar_arguments_alloc);
2042 }
2043 if (dollar_arguments_alloc)
2044 memset (dollar_arguments_used, 0, dollar_arguments_alloc);
2045}
2046
2047
2048/* Look for a decimal number followed by a $ in *FORMAT. If DOLLAR_NEEDED
2049 is set, it is an error if one is not found; otherwise, it is OK. If
2050 such a number is found, check whether it is within range and mark that
2051 numbered operand as being used for later checking. Returns the operand
2052 number if found and within range, zero if no such number was found and
2053 this is OK, or -1 on error. PARAMS points to the first operand of the
2054 format; PARAM_PTR is made to point to the parameter referred to. If
2055 a $ format is found, *FORMAT is updated to point just after it. */
2056
2057static int
e0bc5413 2058maybe_read_dollar_number (status, format, dollar_needed, params, param_ptr)
2059 int *status;
96ab3ac7 2060 const char **format;
2061 int dollar_needed;
2062 tree params;
2063 tree *param_ptr;
2064{
2065 int argnum;
2066 int overflow_flag;
2067 const char *fcp = *format;
2068 if (*fcp < '0' || *fcp > '9')
2069 {
2070 if (dollar_needed)
2071 {
e0bc5413 2072 status_warning (status, "missing $ operand number in format");
96ab3ac7 2073 return -1;
2074 }
2075 else
2076 return 0;
2077 }
2078 argnum = 0;
2079 overflow_flag = 0;
2080 while (*fcp >= '0' && *fcp <= '9')
2081 {
2082 int nargnum;
2083 nargnum = 10 * argnum + (*fcp - '0');
2084 if (nargnum < 0 || nargnum / 10 != argnum)
2085 overflow_flag = 1;
2086 argnum = nargnum;
2087 fcp++;
2088 }
2089 if (*fcp != '$')
2090 {
2091 if (dollar_needed)
2092 {
e0bc5413 2093 status_warning (status, "missing $ operand number in format");
96ab3ac7 2094 return -1;
2095 }
2096 else
2097 return 0;
2098 }
2099 *format = fcp + 1;
2100 if (pedantic && !dollar_format_warned)
2101 {
e0bc5413 2102 status_warning (status, "ISO C does not support %%n$ operand number formats");
96ab3ac7 2103 dollar_format_warned = 1;
2104 }
2105 if (overflow_flag || argnum == 0
2106 || (dollar_first_arg_num && argnum > dollar_arguments_count))
2107 {
e0bc5413 2108 status_warning (status, "operand number out of range in format");
96ab3ac7 2109 return -1;
2110 }
2111 if (argnum > dollar_max_arg_used)
2112 dollar_max_arg_used = argnum;
2113 /* For vprintf-style functions we may need to allocate more memory to
2114 track which arguments are used. */
2115 while (dollar_arguments_alloc < dollar_max_arg_used)
2116 {
2117 int nalloc;
2118 nalloc = 2 * dollar_arguments_alloc + 16;
2119 dollar_arguments_used = xrealloc (dollar_arguments_used, nalloc);
2120 memset (dollar_arguments_used + dollar_arguments_alloc, 0,
2121 nalloc - dollar_arguments_alloc);
2122 dollar_arguments_alloc = nalloc;
2123 }
2124 dollar_arguments_used[argnum - 1] = 1;
2125 if (dollar_first_arg_num)
2126 {
2127 int i;
2128 *param_ptr = params;
2129 for (i = 1; i < argnum && *param_ptr != 0; i++)
2130 *param_ptr = TREE_CHAIN (*param_ptr);
2131
2132 if (*param_ptr == 0)
2133 {
2134 /* This case shouldn't be caught here. */
2135 abort ();
2136 }
2137 }
2138 else
2139 *param_ptr = 0;
2140 return argnum;
2141}
2142
2143
2144/* Finish the checking for a format string that used $ operand number formats
2145 instead of non-$ formats. We check for unused operands before used ones
2146 (a serious error, since the implementation of the format function
2147 can't know what types to pass to va_arg to find the later arguments).
2148 and for unused operands at the end of the format (if we know how many
2149 arguments the format had, so not for vprintf). If there were operand
2150 numbers out of range on a non-vprintf-style format, we won't have reached
2151 here. */
2152
2153static void
e8227183 2154finish_dollar_format_checking (status, res)
e0bc5413 2155 int *status;
e8227183 2156 format_check_results *res;
96ab3ac7 2157{
2158 int i;
2159 for (i = 0; i < dollar_max_arg_used; i++)
2160 {
2161 if (!dollar_arguments_used[i])
e0bc5413 2162 status_warning (status, "format argument %d unused before used argument %d in $-style format",
96ab3ac7 2163 i + 1, dollar_max_arg_used);
2164 }
2165 if (dollar_first_arg_num && dollar_max_arg_used < dollar_arguments_count)
e8227183 2166 {
2167 res->number_other--;
2168 res->number_dollar_extra_args++;
2169 }
96ab3ac7 2170}
2171
2172
8f4541cf 2173/* Retrieve the specification for a format flag. SPEC contains the
2174 specifications for format flags for the applicable kind of format.
2175 FLAG is the flag in question. If PREDICATES is NULL, the basic
2176 spec for that flag must be retrieved and this function aborts if
2177 it cannot be found. If PREDICATES is not NULL, it is a string listing
2178 possible predicates for the spec entry; if an entry predicated on any
2179 of these is found, it is returned, otherwise NULL is returned. */
2180
2181static const format_flag_spec *
2182get_flag_spec (spec, flag, predicates)
2183 const format_flag_spec *spec;
2184 int flag;
2185 const char *predicates;
2186{
2187 int i;
2188 for (i = 0; spec[i].flag_char != 0; i++)
2189 {
2190 if (spec[i].flag_char != flag)
2191 continue;
2192 if (predicates != NULL)
2193 {
2194 if (spec[i].predicate != 0
2195 && index (predicates, spec[i].predicate) != 0)
2196 return &spec[i];
2197 }
2198 else if (spec[i].predicate == 0)
2199 return &spec[i];
2200 }
2201 if (predicates == NULL)
2202 abort ();
2203 else
2204 return NULL;
2205}
2206
2207
fce9faf9 2208/* Check the argument list of a call to printf, scanf, etc.
2209 INFO points to the function_format_info structure.
2210 PARAMS is the list of argument values. */
2211
2212static void
e0bc5413 2213check_format_info (status, info, params)
2214 int *status;
fce9faf9 2215 function_format_info *info;
2216 tree params;
2217{
fce9faf9 2218 int arg_num;
fce9faf9 2219 tree format_tree;
e8227183 2220 format_check_results res;
fce9faf9 2221 /* Skip to format argument. If the argument isn't available, there's
2222 no work for us to do; prototype checking will catch the problem. */
2223 for (arg_num = 1; ; ++arg_num)
2224 {
2225 if (params == 0)
2226 return;
2227 if (arg_num == info->format_num)
2228 break;
2229 params = TREE_CHAIN (params);
2230 }
2231 format_tree = TREE_VALUE (params);
2232 params = TREE_CHAIN (params);
2233 if (format_tree == 0)
2234 return;
b91b108f 2235
e8227183 2236 res.number_non_literal = 0;
2237 res.number_extra_args = 0;
2238 res.number_dollar_extra_args = 0;
2239 res.number_wide = 0;
2240 res.number_empty = 0;
2241 res.number_unterminated = 0;
2242 res.number_other = 0;
2243
2244 check_format_info_recurse (status, &res, info, format_tree, params, arg_num);
2245
2246 if (res.number_non_literal > 0)
2247 {
2248 /* Functions taking a va_list normally pass a non-literal format
2249 string. These functions typically are declared with
2250 first_arg_num == 0, so avoid warning in those cases. */
2251 if (info->first_arg_num != 0 && warn_format > 1)
2252 status_warning (status, "format not a string literal, argument types not checked");
2253 }
2254
2255 /* If there were extra arguments to the format, normally warn. However,
2256 the standard does say extra arguments are ignored, so in the specific
2257 case where we have multiple leaves (conditional expressions or
2258 ngettext) allow extra arguments if at least one leaf didn't have extra
2259 arguments, but was otherwise OK (either non-literal or checked OK).
2260 If the format is an empty string, this should be counted similarly to the
2261 case of extra format arguments. */
2262 if (res.number_extra_args > 0 && res.number_non_literal == 0
2263 && res.number_other == 0)
2264 status_warning (status, "too many arguments for format");
2265 if (res.number_dollar_extra_args > 0 && res.number_non_literal == 0
2266 && res.number_other == 0)
2267 status_warning (status, "unused arguments in $-style format");
2268 if (res.number_empty > 0 && res.number_non_literal == 0
2269 && res.number_other == 0)
2270 status_warning (status, "zero-length format string");
2271
2272 if (res.number_wide > 0)
2273 status_warning (status, "format is a wide character string");
2274
2275 if (res.number_unterminated > 0)
2276 status_warning (status, "unterminated format string");
2277}
2278
2279
2280/* Recursively check a call to a format function. FORMAT_TREE is the
2281 format parameter, which may be a conditional expression in which
2282 both halves should be checked. ARG_NUM is the number of the
2283 format argument; PARAMS points just after it in the argument list. */
2284
2285static void
2286check_format_info_recurse (status, res, info, format_tree, params, arg_num)
2287 int *status;
2288 format_check_results *res;
2289 function_format_info *info;
2290 tree format_tree;
2291 tree params;
2292 int arg_num;
2293{
2294 int format_length;
2295 const char *format_chars;
2296
2297 if (TREE_CODE (format_tree) == NOP_EXPR)
2298 {
2299 /* Strip coercion. */
2300 check_format_info_recurse (status, res, info,
2301 TREE_OPERAND (format_tree, 0), params,
2302 arg_num);
2303 return;
2304 }
b91b108f 2305
2306 if (TREE_CODE (format_tree) == CALL_EXPR
2307 && TREE_CODE (TREE_OPERAND (format_tree, 0)) == ADDR_EXPR
2308 && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (format_tree, 0), 0))
2309 == FUNCTION_DECL))
2310 {
2311 tree function = TREE_OPERAND (TREE_OPERAND (format_tree, 0), 0);
2312
2313 /* See if this is a call to a known internationalization function
2314 that modifies the format arg. */
e8227183 2315 international_format_info *iinfo;
b91b108f 2316
e8227183 2317 for (iinfo = international_format_list; iinfo; iinfo = iinfo->next)
2318 if (iinfo->assembler_name
2319 ? (iinfo->assembler_name == DECL_ASSEMBLER_NAME (function))
2320 : (iinfo->name == DECL_NAME (function)))
b91b108f 2321 {
2322 tree inner_args;
2323 int i;
2324
2325 for (inner_args = TREE_OPERAND (format_tree, 1), i = 1;
2326 inner_args != 0;
2327 inner_args = TREE_CHAIN (inner_args), i++)
e8227183 2328 if (i == iinfo->format_num)
b91b108f 2329 {
e8227183 2330 /* FIXME: with Marc Espie's __attribute__((nonnull))
2331 patch in GCC, we will have chained attributes,
2332 and be able to handle functions like ngettext
2333 with multiple format_arg attributes properly. */
2334 check_format_info_recurse (status, res, info,
2335 TREE_VALUE (inner_args), params,
2336 arg_num);
2337 return;
b91b108f 2338 }
2339 }
2340 }
2341
e8227183 2342 if (TREE_CODE (format_tree) == COND_EXPR)
2343 {
2344 /* Check both halves of the conditional expression. */
2345 check_format_info_recurse (status, res, info,
2346 TREE_OPERAND (format_tree, 1), params,
2347 arg_num);
2348 check_format_info_recurse (status, res, info,
2349 TREE_OPERAND (format_tree, 2), params,
2350 arg_num);
2351 return;
2352 }
2353
a8a713e9 2354 if (integer_zerop (format_tree))
fce9faf9 2355 {
e8227183 2356 /* FIXME: this warning should go away once Marc Espie's
2357 __attribute__((nonnull)) patch is in. Instead, checking for
2358 nonnull attributes should probably change this function to act
2359 specially if info == NULL and add a res->number_null entry for
2360 that case, or maybe add a function pointer to be called at
2361 the end instead of hardcoding check_format_info_main. */
e0bc5413 2362 status_warning (status, "null format string");
e8227183 2363
2364 /* Skip to first argument to check, so we can see if this format
2365 has any arguments (it shouldn't). */
2366 while (arg_num + 1 < info->first_arg_num)
2367 {
2368 if (params == 0)
2369 return;
2370 params = TREE_CHAIN (params);
2371 ++arg_num;
2372 }
2373
2374 if (params == 0)
2375 res->number_other++;
2376 else
2377 res->number_extra_args++;
2378
fce9faf9 2379 return;
2380 }
e8227183 2381
fce9faf9 2382 if (TREE_CODE (format_tree) != ADDR_EXPR)
b7e644ba 2383 {
e8227183 2384 res->number_non_literal++;
b7e644ba 2385 return;
2386 }
fce9faf9 2387 format_tree = TREE_OPERAND (format_tree, 0);
2388 if (TREE_CODE (format_tree) != STRING_CST)
b7e644ba 2389 {
e8227183 2390 res->number_non_literal++;
b7e644ba 2391 return;
2392 }
f542d4f1 2393 if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (format_tree))) != char_type_node)
2394 {
e8227183 2395 res->number_wide++;
f542d4f1 2396 return;
2397 }
fce9faf9 2398 format_chars = TREE_STRING_POINTER (format_tree);
2399 format_length = TREE_STRING_LENGTH (format_tree);
e8227183 2400 if (format_length < 1)
2401 {
2402 res->number_unterminated++;
2403 return;
2404 }
2405 if (format_length == 1)
2406 {
2407 res->number_empty++;
2408 return;
2409 }
fce9faf9 2410 if (format_chars[--format_length] != 0)
2411 {
e8227183 2412 res->number_unterminated++;
fce9faf9 2413 return;
2414 }
e8227183 2415
fce9faf9 2416 /* Skip to first argument to check. */
2417 while (arg_num + 1 < info->first_arg_num)
2418 {
2419 if (params == 0)
2420 return;
2421 params = TREE_CHAIN (params);
2422 ++arg_num;
2423 }
e8227183 2424 /* Provisionally increment res->number_other; check_format_info_main
2425 will decrement it if it finds there are extra arguments, but this way
2426 need not adjust it for every return. */
2427 res->number_other++;
2428 check_format_info_main (status, res, info, format_chars, format_length,
2429 params, arg_num);
2430}
2431
2432
2433/* Do the main part of checking a call to a format function. FORMAT_CHARS
2434 is the NUL-terminated format string (which at this point may contain
2435 internal NUL characters); FORMAT_LENGTH is its length (excluding the
2436 terminating NUL character). ARG_NUM is one less than the number of
2437 the first format argument to check; PARAMS points to that format
2438 argument in the list of arguments. */
2439
2440static void
2441check_format_info_main (status, res, info, format_chars, format_length,
2442 params, arg_num)
2443 int *status;
2444 format_check_results *res;
2445 function_format_info *info;
2446 const char *format_chars;
2447 int format_length;
2448 tree params;
2449 int arg_num;
2450{
2451 int i;
2452 int suppressed;
2453 const char *length_chars = NULL;
2454 enum format_lengths length_chars_val = FMT_LEN_none;
2455 enum format_std_version length_chars_std = STD_C89;
2456 int format_char;
2457 const char *orig_format_chars = format_chars;
2458 tree cur_param;
2459 tree wanted_type;
2460 int main_arg_num;
2461 tree main_arg_params;
2462 enum format_std_version wanted_type_std;
2463 const char *wanted_type_name;
2464 format_wanted_type width_wanted_type;
2465 format_wanted_type precision_wanted_type;
2466 format_wanted_type main_wanted_type;
2467 format_wanted_type *first_wanted_type;
2468 format_wanted_type *last_wanted_type;
2469 tree first_fillin_param;
2470 const format_kind_info *fki = NULL;
2471 const format_flag_spec *flag_specs = NULL;
2472 const format_flag_pair *bad_flag_pairs = NULL;
2473 const format_length_info *fli = NULL;
2474 const format_char_info *fci = NULL;
2475 char flag_chars[256];
2476 /* -1 if no conversions taking an operand have been found; 0 if one has
2477 and it didn't use $; 1 if $ formats are in use. */
2478 int has_operand_number = -1;
f19cab4a 2479
2480 first_fillin_param = params;
96ab3ac7 2481 init_dollar_format_checking (info->first_arg_num, first_fillin_param);
6659e606 2482 fki = &format_types[info->format_type];
8f4541cf 2483 flag_specs = fki->flag_specs;
2484 bad_flag_pairs = fki->bad_flag_pairs;
fce9faf9 2485 while (1)
2486 {
63b97047 2487 int aflag;
c7ca8f11 2488 first_wanted_type = NULL;
2489 last_wanted_type = NULL;
fce9faf9 2490 if (*format_chars == 0)
2491 {
e8227183 2492 if (format_chars - orig_format_chars != format_length)
e0bc5413 2493 status_warning (status, "embedded `\\0' in format");
96ab3ac7 2494 if (info->first_arg_num != 0 && params != 0
2495 && has_operand_number <= 0)
e8227183 2496 {
2497 res->number_other--;
2498 res->number_extra_args++;
2499 }
96ab3ac7 2500 if (has_operand_number > 0)
e8227183 2501 finish_dollar_format_checking (status, res);
fce9faf9 2502 return;
2503 }
2504 if (*format_chars++ != '%')
2505 continue;
2506 if (*format_chars == 0)
2507 {
e0bc5413 2508 status_warning (status, "spurious trailing `%%' in format");
fce9faf9 2509 continue;
2510 }
2511 if (*format_chars == '%')
2512 {
2513 ++format_chars;
2514 continue;
2515 }
2516 flag_chars[0] = 0;
8f4541cf 2517 suppressed = FALSE;
715638cc 2518 main_arg_num = 0;
2519 main_arg_params = 0;
8f4541cf 2520
2521 if ((fki->flags & FMT_FLAG_ARG_CONVERT) && has_operand_number != 0)
fce9faf9 2522 {
8f4541cf 2523 /* Possibly read a $ operand number at the start of the format.
2524 If one was previously used, one is required here. If one
2525 is not used here, we can't immediately conclude this is a
2526 format without them, since it could be printf %m or scanf %*. */
2527 int opnum;
2528 opnum = maybe_read_dollar_number (status, &format_chars, 0,
2529 first_fillin_param,
2530 &main_arg_params);
2531 if (opnum == -1)
2532 return;
2533 else if (opnum > 0)
96ab3ac7 2534 {
8f4541cf 2535 has_operand_number = 1;
2536 main_arg_num = opnum + info->first_arg_num - 1;
96ab3ac7 2537 }
fce9faf9 2538 }
8f4541cf 2539
2540 /* Read any format flags, but do not yet validate them beyond removing
2541 duplicates, since in general validation depends on the rest of
2542 the format. */
2543 while (*format_chars != 0 && index (fki->flag_chars, *format_chars) != 0)
2544 {
2545 if (index (flag_chars, *format_chars) != 0)
d1f11193 2546 {
8f4541cf 2547 const format_flag_spec *s = get_flag_spec (flag_specs,
2548 *format_chars, NULL);
2549 status_warning (status, "repeated %s in format", _(s->name));
d1f11193 2550 }
8f4541cf 2551 else
d1f11193 2552 {
2553 i = strlen (flag_chars);
8f4541cf 2554 flag_chars[i++] = *format_chars;
d1f11193 2555 flag_chars[i] = 0;
d1f11193 2556 }
8f4541cf 2557 ++format_chars;
d1f11193 2558 }
f19cab4a 2559
8f4541cf 2560 /* Read any format width, possibly * or *m$. */
2561 if (fki->width_char != 0)
2562 {
2563 if (fki->width_type != NULL && *format_chars == '*')
fce9faf9 2564 {
8f4541cf 2565 i = strlen (flag_chars);
2566 flag_chars[i++] = fki->width_char;
2567 flag_chars[i] = 0;
fce9faf9 2568 /* "...a field width...may be indicated by an asterisk.
2569 In this case, an int argument supplies the field width..." */
2570 ++format_chars;
2571 if (params == 0)
2572 {
e0bc5413 2573 status_warning (status, "too few arguments for format");
fce9faf9 2574 return;
2575 }
715638cc 2576 if (has_operand_number != 0)
96ab3ac7 2577 {
2578 int opnum;
e0bc5413 2579 opnum = maybe_read_dollar_number (status, &format_chars,
715638cc 2580 has_operand_number == 1,
96ab3ac7 2581 first_fillin_param,
2582 &params);
715638cc 2583 if (opnum == -1)
96ab3ac7 2584 return;
715638cc 2585 else if (opnum > 0)
2586 {
2587 has_operand_number = 1;
2588 arg_num = opnum + info->first_arg_num - 1;
2589 }
96ab3ac7 2590 else
715638cc 2591 has_operand_number = 0;
96ab3ac7 2592 }
fce9faf9 2593 if (info->first_arg_num != 0)
2594 {
2595 cur_param = TREE_VALUE (params);
96ab3ac7 2596 if (has_operand_number <= 0)
2597 {
2598 params = TREE_CHAIN (params);
2599 ++arg_num;
2600 }
8f4541cf 2601 width_wanted_type.wanted_type = *fki->width_type;
c7ca8f11 2602 width_wanted_type.wanted_type_name = NULL;
2603 width_wanted_type.pointer_count = 0;
2604 width_wanted_type.char_lenient_flag = 0;
2605 width_wanted_type.writing_in_flag = 0;
2606 width_wanted_type.name = _("field width");
2607 width_wanted_type.param = cur_param;
2608 width_wanted_type.arg_num = arg_num;
2609 width_wanted_type.next = NULL;
2610 if (last_wanted_type != 0)
2611 last_wanted_type->next = &width_wanted_type;
2612 if (first_wanted_type == 0)
2613 first_wanted_type = &width_wanted_type;
2614 last_wanted_type = &width_wanted_type;
fce9faf9 2615 }
2616 }
2617 else
2618 {
8f4541cf 2619 /* Possibly read a numeric width. If the width is zero,
2620 we complain; for scanf this is bad according to the
2621 standard, and for printf and strftime it cannot occur
2622 because 0 is a flag. */
2623 int non_zero_width_char = FALSE;
2624 int found_width = FALSE;
cc404a47 2625 while (ISDIGIT (*format_chars))
fce9faf9 2626 {
8f4541cf 2627 found_width = TRUE;
2628 if (*format_chars != '0')
2629 non_zero_width_char = TRUE;
fce9faf9 2630 ++format_chars;
2631 }
8f4541cf 2632 if (found_width && !non_zero_width_char)
2633 status_warning (status, "zero width in scanf format");
2634 if (found_width)
2635 {
2636 i = strlen (flag_chars);
2637 flag_chars[i++] = fki->width_char;
2638 flag_chars[i] = 0;
2639 }
fce9faf9 2640 }
8f4541cf 2641 }
2642
2643 /* Read any format precision, possibly * or *m$. */
2644 if (fki->precision_char != 0 && *format_chars == '.')
2645 {
2646 ++format_chars;
2647 i = strlen (flag_chars);
2648 flag_chars[i++] = fki->precision_char;
2649 flag_chars[i] = 0;
2650 if (fki->precision_type != NULL && *format_chars == '*')
fce9faf9 2651 {
fce9faf9 2652 /* "...a...precision...may be indicated by an asterisk.
2653 In this case, an int argument supplies the...precision." */
8f4541cf 2654 ++format_chars;
2655 if (has_operand_number != 0)
fce9faf9 2656 {
8f4541cf 2657 int opnum;
2658 opnum = maybe_read_dollar_number (status, &format_chars,
2659 has_operand_number == 1,
2660 first_fillin_param,
2661 &params);
2662 if (opnum == -1)
2663 return;
2664 else if (opnum > 0)
fce9faf9 2665 {
8f4541cf 2666 has_operand_number = 1;
2667 arg_num = opnum + info->first_arg_num - 1;
fce9faf9 2668 }
8f4541cf 2669 else
2670 has_operand_number = 0;
fce9faf9 2671 }
8f4541cf 2672 if (info->first_arg_num != 0)
fce9faf9 2673 {
8f4541cf 2674 if (params == 0)
2675 {
2676 status_warning (status, "too few arguments for format");
2677 return;
2678 }
2679 cur_param = TREE_VALUE (params);
2680 if (has_operand_number <= 0)
2681 {
2682 params = TREE_CHAIN (params);
2683 ++arg_num;
2684 }
2685 precision_wanted_type.wanted_type = *fki->precision_type;
2686 precision_wanted_type.wanted_type_name = NULL;
2687 precision_wanted_type.pointer_count = 0;
2688 precision_wanted_type.char_lenient_flag = 0;
2689 precision_wanted_type.writing_in_flag = 0;
2690 precision_wanted_type.name = _("field precision");
2691 precision_wanted_type.param = cur_param;
2692 precision_wanted_type.arg_num = arg_num;
2693 precision_wanted_type.next = NULL;
2694 if (last_wanted_type != 0)
2695 last_wanted_type->next = &precision_wanted_type;
2696 if (first_wanted_type == 0)
2697 first_wanted_type = &precision_wanted_type;
2698 last_wanted_type = &precision_wanted_type;
fce9faf9 2699 }
2700 }
8f4541cf 2701 else
2702 {
2703 while (ISDIGIT (*format_chars))
2704 ++format_chars;
2705 }
fce9faf9 2706 }
d1f11193 2707
8f4541cf 2708 /* Read any length modifier, if this kind of format has them. */
6659e606 2709 fli = fki->length_char_specs;
8f4541cf 2710 length_chars = NULL;
2711 length_chars_val = FMT_LEN_none;
2712 length_chars_std = STD_C89;
6659e606 2713 if (fli)
63b97047 2714 {
6659e606 2715 while (fli->name != 0 && fli->name[0] != *format_chars)
2716 fli++;
2717 if (fli->name != 0)
d1f11193 2718 {
6659e606 2719 format_chars++;
2720 if (fli->double_name != 0 && fli->name[0] == *format_chars)
d494b123 2721 {
6659e606 2722 format_chars++;
2723 length_chars = fli->double_name;
2724 length_chars_val = fli->double_index;
2725 length_chars_std = fli->double_std;
2726 }
2727 else
2728 {
2729 length_chars = fli->name;
2730 length_chars_val = fli->index;
2731 length_chars_std = fli->std;
d494b123 2732 }
8f4541cf 2733 i = strlen (flag_chars);
2734 flag_chars[i++] = fki->length_code_char;
2735 flag_chars[i] = 0;
d1f11193 2736 }
6659e606 2737 if (pedantic)
33b8b501 2738 {
6659e606 2739 /* Warn if the length modifier is non-standard. */
2740 if (length_chars_std == STD_EXT)
e0bc5413 2741 status_warning (status, "ISO C does not support the `%s' %s length modifier",
6659e606 2742 length_chars, fki->name);
2743 else if ((length_chars_std == STD_C99 && !flag_isoc99)
2744 || (length_chars_std == STD_C94 && !flag_isoc94))
e0bc5413 2745 status_warning (status, "ISO C89 does not support the `%s' %s length modifier",
6659e606 2746 length_chars, fki->name);
33b8b501 2747 }
8f4541cf 2748 }
2749
2750 /* Read any modifier (strftime E/O). */
2751 if (fki->modifier_chars != NULL)
2752 {
2753 while (*format_chars != 0
2754 && index (fki->modifier_chars, *format_chars) != 0)
2755 {
2756 if (index (flag_chars, *format_chars) != 0)
2757 {
2758 const format_flag_spec *s = get_flag_spec (flag_specs,
2759 *format_chars, NULL);
2760 status_warning (status, "repeated %s in format", _(s->name));
2761 }
2762 else
2763 {
2764 i = strlen (flag_chars);
2765 flag_chars[i++] = *format_chars;
2766 flag_chars[i] = 0;
2767 }
2768 ++format_chars;
2769 }
2770 }
2771
2772 /* Handle the scanf allocation kludge. */
2773 if (fki->flags & FMT_FLAG_SCANF_A_KLUDGE)
2774 {
2775 if (*format_chars == 'a' && !flag_isoc99)
d1f11193 2776 {
2777 if (format_chars[1] == 's' || format_chars[1] == 'S'
2778 || format_chars[1] == '[')
2779 {
2780 /* `a' is used as a flag. */
8f4541cf 2781 i = strlen (flag_chars);
2782 flag_chars[i++] = 'a';
2783 flag_chars[i] = 0;
d1f11193 2784 format_chars++;
2785 }
2786 }
fce9faf9 2787 }
8f4541cf 2788
fce9faf9 2789 format_char = *format_chars;
d1f11193 2790 if (format_char == 0
8f4541cf 2791 || (!(fki->flags & FMT_FLAG_FANCY_PERCENT_OK) && format_char == '%'))
fce9faf9 2792 {
e0bc5413 2793 status_warning (status, "conversion lacks type at end of format");
fce9faf9 2794 continue;
2795 }
2796 format_chars++;
6659e606 2797 fci = fki->conversion_specs;
fce9faf9 2798 while (fci->format_chars != 0
2799 && index (fci->format_chars, format_char) == 0)
2800 ++fci;
2801 if (fci->format_chars == 0)
2802 {
38330f30 2803 if (ISGRAPH(format_char))
e0bc5413 2804 status_warning (status, "unknown conversion type character `%c' in format",
fce9faf9 2805 format_char);
2806 else
e0bc5413 2807 status_warning (status, "unknown conversion type character 0x%x in format",
fce9faf9 2808 format_char);
fce9faf9 2809 continue;
2810 }
d1f11193 2811 if (pedantic)
fce9faf9 2812 {
6659e606 2813 if (fci->std == STD_EXT)
e0bc5413 2814 status_warning (status, "ISO C does not support the `%%%c' %s format",
6659e606 2815 format_char, fki->name);
2816 else if ((fci->std == STD_C99 && !flag_isoc99)
2817 || (fci->std == STD_C94 && !flag_isoc94))
e0bc5413 2818 status_warning (status, "ISO C89 does not support the `%%%c' %s format",
6659e606 2819 format_char, fki->name);
fce9faf9 2820 }
8f4541cf 2821
2822 /* Validate the individual flags used, removing any that are invalid. */
2823 {
2824 int d = 0;
2825 for (i = 0; flag_chars[i] != 0; i++)
2826 {
2827 const format_flag_spec *s = get_flag_spec (flag_specs,
2828 flag_chars[i], NULL);
2829 flag_chars[i - d] = flag_chars[i];
2830 if (flag_chars[i] == fki->length_code_char)
2831 continue;
2832 if (index (fci->flag_chars, flag_chars[i]) == 0)
2833 {
2834 status_warning (status, "%s used with `%%%c' %s format",
2835 _(s->name), format_char, fki->name);
2836 d++;
2837 continue;
2838 }
2839 if (pedantic)
2840 {
2841 const format_flag_spec *t;
2842 if (s->std == STD_EXT)
2843 status_warning (status, "ISO C does not support %s",
2844 _(s->long_name));
2845 else if ((s->std == STD_C99 && !flag_isoc99)
2846 || (s->std == STD_C94 && !flag_isoc94))
2847 status_warning (status, "ISO C89 does not support %s",
2848 _(s->long_name));
2849 t = get_flag_spec (flag_specs, flag_chars[i], fci->flags2);
2850 if (t != NULL && t->std > s->std)
2851 {
2852 const char *long_name = (t->long_name != NULL
2853 ? t->long_name
2854 : s->long_name);
2855 if (t->std == STD_EXT)
2856 status_warning (status, "ISO C does not support %s with the `%%%c' %s format",
2857 _(long_name), format_char, fki->name);
2858 else if ((t->std == STD_C99 && !flag_isoc99)
2859 || (t->std == STD_C94 && !flag_isoc94))
2860 status_warning (status, "ISO C89 does not support %s with the `%%%c' %s format",
2861 _(long_name), format_char, fki->name);
2862 }
2863 }
2864 }
2865 flag_chars[i - d] = 0;
2866 }
2867
2868 aflag = 0;
2869 if ((fki->flags & FMT_FLAG_SCANF_A_KLUDGE)
2870 && index (flag_chars, 'a') != 0)
2871 aflag = 1;
2872
2873 if (fki->suppression_char
2874 && index (flag_chars, fki->suppression_char) != 0)
2875 suppressed = 1;
2876
2877 /* Validate the pairs of flags used. */
2878 for (i = 0; bad_flag_pairs[i].flag_char1 != 0; i++)
63b97047 2879 {
8f4541cf 2880 const format_flag_spec *s, *t;
2881 if (index (flag_chars, bad_flag_pairs[i].flag_char1) == 0)
2882 continue;
2883 if (index (flag_chars, bad_flag_pairs[i].flag_char2) == 0)
2884 continue;
2885 if (bad_flag_pairs[i].predicate != 0
2886 && index (fci->flags2, bad_flag_pairs[i].predicate) == 0)
2887 continue;
2888 s = get_flag_spec (flag_specs, bad_flag_pairs[i].flag_char1, NULL);
2889 t = get_flag_spec (flag_specs, bad_flag_pairs[i].flag_char2, NULL);
2890 if (bad_flag_pairs[i].ignored)
2891 {
2892 if (bad_flag_pairs[i].predicate != 0)
2893 status_warning (status, "%s ignored with %s and `%%%c' %s format",
2894 _(s->name), _(t->name), format_char,
2895 fki->name);
2896 else
2897 status_warning (status, "%s ignored with %s in %s format",
2898 _(s->name), _(t->name), fki->name);
2899 }
2900 else
2901 {
2902 if (bad_flag_pairs[i].predicate != 0)
2903 status_warning (status, "use of %s and %s together with `%%%c' %s format",
2904 _(s->name), _(t->name), format_char,
2905 fki->name);
2906 else
2907 status_warning (status, "use of %s and %s together in %s format",
2908 _(s->name), _(t->name), fki->name);
2909 }
fce9faf9 2910 }
8f4541cf 2911
2912 /* Give Y2K warnings. */
2913 {
2914 int y2k_level = 0;
2915 if (index (fci->flags2, '4') != 0)
2916 if (index (flag_chars, 'E') != 0)
2917 y2k_level = 3;
2918 else
2919 y2k_level = 2;
2920 else if (index (fci->flags2, '3') != 0)
2921 y2k_level = 3;
2922 else if (index (fci->flags2, '2') != 0)
2923 y2k_level = 2;
2924 if (y2k_level == 3)
2925 status_warning (status, "`%%%c' yields only last 2 digits of year in some locales",
2926 format_char);
2927 else if (y2k_level == 2)
2928 status_warning (status, "`%%%c' yields only last 2 digits of year", format_char);
2929 }
2930
20fda0bf 2931 if (index (fci->flags2, '[') != 0)
fce9faf9 2932 {
2933 /* Skip over scan set, in case it happens to have '%' in it. */
2934 if (*format_chars == '^')
2935 ++format_chars;
2936 /* Find closing bracket; if one is hit immediately, then
2937 it's part of the scan set rather than a terminator. */
2938 if (*format_chars == ']')
2939 ++format_chars;
2940 while (*format_chars && *format_chars != ']')
2941 ++format_chars;
2942 if (*format_chars != ']')
d1f11193 2943 /* The end of the format string was reached. */
e0bc5413 2944 status_warning (status, "no closing `]' for `%%[' format");
fce9faf9 2945 }
8f4541cf 2946
e6dd34f1 2947 wanted_type = 0;
2948 wanted_type_name = 0;
8f4541cf 2949 if (fki->flags & FMT_FLAG_ARG_CONVERT)
c7ca8f11 2950 {
8f4541cf 2951 wanted_type = (fci->types[length_chars_val].type
2952 ? *fci->types[length_chars_val].type : 0);
2953 wanted_type_name = fci->types[length_chars_val].name;
2954 wanted_type_std = fci->types[length_chars_val].std;
2955 if (wanted_type == 0)
2956 {
2957 status_warning (status, "use of `%s' length modifier with `%c' type character",
2958 length_chars, format_char);
2959 /* Heuristic: skip one argument when an invalid length/type
2960 combination is encountered. */
2961 arg_num++;
2962 if (params == 0)
2963 {
2964 status_warning (status, "too few arguments for format");
2965 return;
2966 }
2967 params = TREE_CHAIN (params);
2968 continue;
2969 }
2970 else if (pedantic
2971 /* Warn if non-standard, provided it is more non-standard
2972 than the length and type characters that may already
2973 have been warned for. */
2974 && wanted_type_std > length_chars_std
2975 && wanted_type_std > fci->std)
c7ca8f11 2976 {
8f4541cf 2977 if (wanted_type_std == STD_EXT)
2978 status_warning (status, "ISO C does not support the `%%%s%c' %s format",
2979 length_chars, format_char, fki->name);
2980 else if ((wanted_type_std == STD_C99 && !flag_isoc99)
2981 || (wanted_type_std == STD_C94 && !flag_isoc94))
2982 status_warning (status, "ISO C89 does not support the `%%%s%c' %s format",
2983 length_chars, format_char, fki->name);
c7ca8f11 2984 }
fce9faf9 2985 }
fce9faf9 2986
fce9faf9 2987 /* Finally. . .check type of argument against desired type! */
2988 if (info->first_arg_num == 0)
2989 continue;
8f4541cf 2990 if ((fci->pointer_count == 0 && wanted_type == void_type_node)
2991 || suppressed)
fce9faf9 2992 {
715638cc 2993 if (main_arg_num != 0)
8f4541cf 2994 {
2995 if (suppressed)
2996 status_warning (status, "operand number specified with suppressed assignment");
2997 else
2998 status_warning (status, "operand number specified for format taking no argument");
2999 }
715638cc 3000 }
3001 else
3002 {
3003 if (main_arg_num != 0)
c7ca8f11 3004 {
715638cc 3005 arg_num = main_arg_num;
3006 params = main_arg_params;
3007 }
3008 else
3009 {
3010 ++arg_num;
3011 if (has_operand_number > 0)
3012 {
e0bc5413 3013 status_warning (status, "missing $ operand number in format");
715638cc 3014 return;
3015 }
3016 else
3017 has_operand_number = 0;
3018 if (params == 0)
3019 {
e0bc5413 3020 status_warning (status, "too few arguments for format");
715638cc 3021 return;
3022 }
c7ca8f11 3023 }
3024 cur_param = TREE_VALUE (params);
3025 params = TREE_CHAIN (params);
c7ca8f11 3026 main_wanted_type.wanted_type = wanted_type;
3027 main_wanted_type.wanted_type_name = wanted_type_name;
3028 main_wanted_type.pointer_count = fci->pointer_count + aflag;
3029 main_wanted_type.char_lenient_flag = 0;
20fda0bf 3030 if (index (fci->flags2, 'c') != 0)
c7ca8f11 3031 main_wanted_type.char_lenient_flag = 1;
3032 main_wanted_type.writing_in_flag = 0;
20fda0bf 3033 if (index (fci->flags2, 'W') != 0)
c7ca8f11 3034 main_wanted_type.writing_in_flag = 1;
3035 main_wanted_type.name = NULL;
3036 main_wanted_type.param = cur_param;
3037 main_wanted_type.arg_num = arg_num;
3038 main_wanted_type.next = NULL;
3039 if (last_wanted_type != 0)
3040 last_wanted_type->next = &main_wanted_type;
3041 if (first_wanted_type == 0)
3042 first_wanted_type = &main_wanted_type;
3043 last_wanted_type = &main_wanted_type;
fce9faf9 3044 }
c7ca8f11 3045
3046 if (first_wanted_type != 0)
e0bc5413 3047 check_format_types (status, first_wanted_type);
c7ca8f11 3048
3049 }
3050}
3051
3052
3053/* Check the argument types from a single format conversion (possibly
3054 including width and precision arguments). */
3055static void
e0bc5413 3056check_format_types (status, types)
3057 int *status;
c7ca8f11 3058 format_wanted_type *types;
3059{
3060 for (; types != 0; types = types->next)
3061 {
3062 tree cur_param;
3063 tree cur_type;
aa8ad6ba 3064 tree orig_cur_type;
c7ca8f11 3065 tree wanted_type;
659b28b5 3066 tree promoted_type;
c7ca8f11 3067 int arg_num;
3068 int i;
3069 int char_type_flag;
3070 cur_param = types->param;
fce9faf9 3071 cur_type = TREE_TYPE (cur_param);
aa8ad6ba 3072 if (TREE_CODE (cur_type) == ERROR_MARK)
3073 continue;
c7ca8f11 3074 char_type_flag = 0;
3075 wanted_type = types->wanted_type;
3076 arg_num = types->arg_num;
fce9faf9 3077
aa8ad6ba 3078 /* The following should not occur here. */
3079 if (wanted_type == 0)
3080 abort ();
3081 if (wanted_type == void_type_node && types->pointer_count == 0)
3082 abort ();
3083
659b28b5 3084 if (types->pointer_count == 0)
3085 {
3086 promoted_type = simple_type_promotes_to (wanted_type);
3087 if (promoted_type != NULL_TREE)
3088 wanted_type = promoted_type;
3089 }
3090
31f820d2 3091 STRIP_NOPS (cur_param);
3092
fce9faf9 3093 /* Check the types of any additional pointer arguments
3094 that precede the "real" argument. */
c7ca8f11 3095 for (i = 0; i < types->pointer_count; ++i)
fce9faf9 3096 {
3097 if (TREE_CODE (cur_type) == POINTER_TYPE)
3098 {
3099 cur_type = TREE_TYPE (cur_type);
aa8ad6ba 3100 if (TREE_CODE (cur_type) == ERROR_MARK)
3101 break;
31f820d2 3102
c5aa1e92 3103 if (cur_param != 0 && TREE_CODE (cur_param) == ADDR_EXPR)
31f820d2 3104 cur_param = TREE_OPERAND (cur_param, 0);
3105 else
3106 cur_param = 0;
3107
4caacdba 3108 /* See if this is an attempt to write into a const type with
3109 scanf or with printf "%n". Note: the writing in happens
3110 at the first indirection only, if for example
3111 void * const * is passed to scanf %p; passing
3112 const void ** is simply passing an incompatible type. */
c7ca8f11 3113 if (types->writing_in_flag
4caacdba 3114 && i == 0
4caacdba 3115 && (TYPE_READONLY (cur_type)
3116 || (cur_param != 0
3117 && (TREE_CODE_CLASS (TREE_CODE (cur_param)) == 'c'
3118 || (DECL_P (cur_param)
3119 && TREE_READONLY (cur_param))))))
e0bc5413 3120 status_warning (status, "writing into constant object (arg %d)", arg_num);
4caacdba 3121
3122 /* If there are extra type qualifiers beyond the first
3123 indirection, then this makes the types technically
3124 incompatible. */
3125 if (i > 0
3126 && pedantic
4caacdba 3127 && (TYPE_READONLY (cur_type)
3128 || TYPE_VOLATILE (cur_type)
3129 || TYPE_RESTRICT (cur_type)))
e0bc5413 3130 status_warning (status, "extra type qualifiers in format argument (arg %d)",
4caacdba 3131 arg_num);
3132
fce9faf9 3133 }
aa8ad6ba 3134 else
e4ba8ded 3135 {
c7ca8f11 3136 if (types->pointer_count == 1)
e0bc5413 3137 status_warning (status, "format argument is not a pointer (arg %d)", arg_num);
e4ba8ded 3138 else
e0bc5413 3139 status_warning (status, "format argument is not a pointer to a pointer (arg %d)", arg_num);
aa8ad6ba 3140 break;
e4ba8ded 3141 }
fce9faf9 3142 }
3143
aa8ad6ba 3144 if (i < types->pointer_count)
3145 continue;
3146
3147 orig_cur_type = cur_type;
3148 cur_type = TYPE_MAIN_VARIANT (cur_type);
3149
428a1c21 3150 /* Check whether the argument type is a character type. This leniency
3151 only applies to certain formats, flagged with 'c'.
3152 */
aa8ad6ba 3153 if (types->char_lenient_flag)
3154 char_type_flag = (cur_type == char_type_node
3155 || cur_type == signed_char_type_node
3156 || cur_type == unsigned_char_type_node);
49bc3768 3157
fce9faf9 3158 /* Check the type of the "real" argument, if there's a type we want. */
aa8ad6ba 3159 if (wanted_type == cur_type)
3160 continue;
3161 /* If we want `void *', allow any pointer type.
3162 (Anything else would already have got a warning.)
3163 With -pedantic, only allow pointers to void and to character
3164 types. */
3165 if (wanted_type == void_type_node
3166 && (!pedantic || (i == 1 && char_type_flag)))
3167 continue;
3168 /* Don't warn about differences merely in signedness, unless
3169 -pedantic. With -pedantic, warn if the type is a pointer
3170 target and not a character type, and for character types at
3171 a second level of indirection. */
3172 if (TREE_CODE (wanted_type) == INTEGER_TYPE
3173 && TREE_CODE (cur_type) == INTEGER_TYPE
3174 && (! pedantic || i == 0 || (i == 1 && char_type_flag))
3175 && (TREE_UNSIGNED (wanted_type)
3176 ? wanted_type == unsigned_type (cur_type)
3177 : wanted_type == signed_type (cur_type)))
3178 continue;
3179 /* Likewise, "signed char", "unsigned char" and "char" are
3180 equivalent but the above test won't consider them equivalent. */
3181 if (wanted_type == char_type_node
3182 && (! pedantic || i < 2)
3183 && char_type_flag)
3184 continue;
3185 /* Now we have a type mismatch. */
3186 {
3187 register const char *this;
3188 register const char *that;
3189
3190 this = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (wanted_type)));
3191 that = 0;
3192 if (TYPE_NAME (orig_cur_type) != 0
3193 && TREE_CODE (orig_cur_type) != INTEGER_TYPE
3194 && !(TREE_CODE (orig_cur_type) == POINTER_TYPE
3195 && TREE_CODE (TREE_TYPE (orig_cur_type)) == INTEGER_TYPE))
3196 {
3197 if (TREE_CODE (TYPE_NAME (orig_cur_type)) == TYPE_DECL
3198 && DECL_NAME (TYPE_NAME (orig_cur_type)) != 0)
3199 that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (orig_cur_type)));
3200 else
3201 that = IDENTIFIER_POINTER (TYPE_NAME (orig_cur_type));
3202 }
fce9faf9 3203
aa8ad6ba 3204 /* A nameless type can't possibly match what the format wants.
3205 So there will be a warning for it.
3206 Make up a string to describe vaguely what it is. */
3207 if (that == 0)
3208 {
3209 if (TREE_CODE (orig_cur_type) == POINTER_TYPE)
3210 that = "pointer";
3211 else
3212 that = "different type";
3213 }
fce9faf9 3214
aa8ad6ba 3215 /* Make the warning better in case of mismatch of int vs long. */
3216 if (TREE_CODE (orig_cur_type) == INTEGER_TYPE
3217 && TREE_CODE (wanted_type) == INTEGER_TYPE
3218 && TYPE_PRECISION (orig_cur_type) == TYPE_PRECISION (wanted_type)
3219 && TYPE_NAME (orig_cur_type) != 0
3220 && TREE_CODE (TYPE_NAME (orig_cur_type)) == TYPE_DECL)
3221 that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (orig_cur_type)));
cbc5b7d9 3222
aa8ad6ba 3223 if (strcmp (this, that) != 0)
3224 {
3225 /* There may be a better name for the format, e.g. size_t,
3226 but we should allow for programs with a perverse typedef
3227 making size_t something other than what the compiler
3228 thinks. */
3229 if (types->wanted_type_name != 0
3230 && strcmp (types->wanted_type_name, that) != 0)
3231 this = types->wanted_type_name;
3232 if (types->name != 0)
e0bc5413 3233 status_warning (status, "%s is not type %s (arg %d)", types->name, this,
aa8ad6ba 3234 arg_num);
3235 else
e0bc5413 3236 status_warning (status, "%s format, %s arg (arg %d)", this, that, arg_num);
aa8ad6ba 3237 }
3238 }
fce9faf9 3239 }
3240}
3241\f
2a1736ed 3242/* Print a warning if a constant expression had overflow in folding.
3243 Invoke this function on every expression that the language
3244 requires to be a constant expression.
3245 Note the ANSI C standard says it is erroneous for a
3246 constant expression to overflow. */
b2806639 3247
3248void
3249constant_expression_warning (value)
3250 tree value;
3251{
837e1122 3252 if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
3253 || TREE_CODE (value) == COMPLEX_CST)
3254 && TREE_CONSTANT_OVERFLOW (value) && pedantic)
3255 pedwarn ("overflow in constant expression");
2a1736ed 3256}
3257
3258/* Print a warning if an expression had overflow in folding.
3259 Invoke this function on every expression that
3260 (1) appears in the source code, and
3261 (2) might be a constant expression that overflowed, and
3262 (3) is not already checked by convert_and_check;
3263 however, do not invoke this function on operands of explicit casts. */
3264
3265void
3266overflow_warning (value)
3267 tree value;
3268{
837e1122 3269 if ((TREE_CODE (value) == INTEGER_CST
3270 || (TREE_CODE (value) == COMPLEX_CST
3271 && TREE_CODE (TREE_REALPART (value)) == INTEGER_CST))
3272 && TREE_OVERFLOW (value))
2a1736ed 3273 {
b04da9b5 3274 TREE_OVERFLOW (value) = 0;
e78703c1 3275 if (skip_evaluation == 0)
3276 warning ("integer overflow in expression");
2a1736ed 3277 }
837e1122 3278 else if ((TREE_CODE (value) == REAL_CST
3279 || (TREE_CODE (value) == COMPLEX_CST
3280 && TREE_CODE (TREE_REALPART (value)) == REAL_CST))
3281 && TREE_OVERFLOW (value))
3282 {
3283 TREE_OVERFLOW (value) = 0;
e78703c1 3284 if (skip_evaluation == 0)
3285 warning ("floating point overflow in expression");
837e1122 3286 }
2a1736ed 3287}
3288
3289/* Print a warning if a large constant is truncated to unsigned,
3290 or if -Wconversion is used and a constant < 0 is converted to unsigned.
3291 Invoke this function on every expression that might be implicitly
3292 converted to an unsigned type. */
3293
3294void
3295unsigned_conversion_warning (result, operand)
3296 tree result, operand;
3297{
3298 if (TREE_CODE (operand) == INTEGER_CST
3299 && TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
3300 && TREE_UNSIGNED (TREE_TYPE (result))
e78703c1 3301 && skip_evaluation == 0
2a1736ed 3302 && !int_fits_type_p (operand, TREE_TYPE (result)))
3303 {
3304 if (!int_fits_type_p (operand, signed_type (TREE_TYPE (result))))
3305 /* This detects cases like converting -129 or 256 to unsigned char. */
454b5afb 3306 warning ("large integer implicitly truncated to unsigned type");
2a1736ed 3307 else if (warn_conversion)
454b5afb 3308 warning ("negative integer implicitly converted to unsigned type");
2a1736ed 3309 }
3310}
3311
3312/* Convert EXPR to TYPE, warning about conversion problems with constants.
3313 Invoke this function on every expression that is converted implicitly,
3314 i.e. because of language rules and not because of an explicit cast. */
3315
3316tree
3317convert_and_check (type, expr)
3318 tree type, expr;
3319{
3320 tree t = convert (type, expr);
3321 if (TREE_CODE (t) == INTEGER_CST)
3322 {
b04da9b5 3323 if (TREE_OVERFLOW (t))
2a1736ed 3324 {
b04da9b5 3325 TREE_OVERFLOW (t) = 0;
3326
2c4232f8 3327 /* Do not diagnose overflow in a constant expression merely
3328 because a conversion overflowed. */
3329 TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (expr);
3330
b04da9b5 3331 /* No warning for converting 0x80000000 to int. */
3332 if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr))
3333 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
3334 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
96730c20 3335 /* If EXPR fits in the unsigned version of TYPE,
3336 don't warn unless pedantic. */
e78703c1 3337 if ((pedantic
3338 || TREE_UNSIGNED (type)
3339 || ! int_fits_type_p (expr, unsigned_type (type)))
3340 && skip_evaluation == 0)
d1f11193 3341 warning ("overflow in implicit constant conversion");
2a1736ed 3342 }
3343 else
3344 unsigned_conversion_warning (t, expr);
3345 }
3346 return t;
b2806639 3347}
3348\f
b0fc3e72 3349void
3350c_expand_expr_stmt (expr)
3351 tree expr;
3352{
3353 /* Do default conversion if safe and possibly important,
3354 in case within ({...}). */
3355 if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE && lvalue_p (expr))
3356 || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
3357 expr = default_conversion (expr);
3358
3359 if (TREE_TYPE (expr) != error_mark_node
5fd5d738 3360 && !COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (expr))
b0fc3e72 3361 && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
3362 error ("expression statement has incomplete type");
3363
e41f0d80 3364 last_expr_type = TREE_TYPE (expr);
3365 add_stmt (build_stmt (EXPR_STMT, expr));
b0fc3e72 3366}
3367\f
3368/* Validate the expression after `case' and apply default promotions. */
3369
3370tree
3371check_case_value (value)
3372 tree value;
3373{
3374 if (value == NULL_TREE)
3375 return value;
3376
3377 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
fce1d6af 3378 STRIP_TYPE_NOPS (value);
225ec6aa 3379 /* In C++, the following is allowed:
3380
3381 const int i = 3;
3382 switch (...) { case i: ... }
3383
3384 So, we try to reduce the VALUE to a constant that way. */
3385 if (c_language == clk_cplusplus)
3386 {
3387 value = decl_constant_value (value);
3388 STRIP_TYPE_NOPS (value);
3389 value = fold (value);
3390 }
b0fc3e72 3391
3392 if (TREE_CODE (value) != INTEGER_CST
3393 && value != error_mark_node)
3394 {
3395 error ("case label does not reduce to an integer constant");
3396 value = error_mark_node;
3397 }
3398 else
3399 /* Promote char or short to int. */
3400 value = default_conversion (value);
3401
6433f1c2 3402 constant_expression_warning (value);
3403
b0fc3e72 3404 return value;
3405}
3406\f
3407/* Return an integer type with BITS bits of precision,
3408 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */
3409
3410tree
3411type_for_size (bits, unsignedp)
3412 unsigned bits;
3413 int unsignedp;
3414{
46375237 3415 if (bits == TYPE_PRECISION (integer_type_node))
3416 return unsignedp ? unsigned_type_node : integer_type_node;
3417
bacde65a 3418 if (bits == TYPE_PRECISION (signed_char_type_node))
b0fc3e72 3419 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
3420
bacde65a 3421 if (bits == TYPE_PRECISION (short_integer_type_node))
b0fc3e72 3422 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
3423
bacde65a 3424 if (bits == TYPE_PRECISION (long_integer_type_node))
b0fc3e72 3425 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
3426
bacde65a 3427 if (bits == TYPE_PRECISION (long_long_integer_type_node))
b0fc3e72 3428 return (unsignedp ? long_long_unsigned_type_node
3429 : long_long_integer_type_node);
3430
f57fa2ea 3431 if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
3432 return (unsignedp ? widest_unsigned_literal_type_node
3433 : widest_integer_literal_type_node);
3434
bacde65a 3435 if (bits <= TYPE_PRECISION (intQI_type_node))
3436 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
3437
3438 if (bits <= TYPE_PRECISION (intHI_type_node))
3439 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
3440
3441 if (bits <= TYPE_PRECISION (intSI_type_node))
3442 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
3443
3444 if (bits <= TYPE_PRECISION (intDI_type_node))
3445 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
3446
b0fc3e72 3447 return 0;
3448}
3449
3450/* Return a data type that has machine mode MODE.
3451 If the mode is an integer,
3452 then UNSIGNEDP selects between signed and unsigned types. */
3453
3454tree
3455type_for_mode (mode, unsignedp)
3456 enum machine_mode mode;
3457 int unsignedp;
3458{
46375237 3459 if (mode == TYPE_MODE (integer_type_node))
3460 return unsignedp ? unsigned_type_node : integer_type_node;
3461
b0fc3e72 3462 if (mode == TYPE_MODE (signed_char_type_node))
3463 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
3464
3465 if (mode == TYPE_MODE (short_integer_type_node))
3466 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
3467
b0fc3e72 3468 if (mode == TYPE_MODE (long_integer_type_node))
3469 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
3470
3471 if (mode == TYPE_MODE (long_long_integer_type_node))
3472 return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
3473
f57fa2ea 3474 if (mode == TYPE_MODE (widest_integer_literal_type_node))
44e9fa65 3475 return unsignedp ? widest_unsigned_literal_type_node
f57fa2ea 3476 : widest_integer_literal_type_node;
3477
bacde65a 3478 if (mode == TYPE_MODE (intQI_type_node))
3479 return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
3480
3481 if (mode == TYPE_MODE (intHI_type_node))
3482 return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
3483
3484 if (mode == TYPE_MODE (intSI_type_node))
3485 return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
3486
3487 if (mode == TYPE_MODE (intDI_type_node))
3488 return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
3489
cc1cc1c7 3490#if HOST_BITS_PER_WIDE_INT >= 64
6274009c 3491 if (mode == TYPE_MODE (intTI_type_node))
3492 return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
cc1cc1c7 3493#endif
6274009c 3494
b0fc3e72 3495 if (mode == TYPE_MODE (float_type_node))
3496 return float_type_node;
3497
3498 if (mode == TYPE_MODE (double_type_node))
3499 return double_type_node;
3500
3501 if (mode == TYPE_MODE (long_double_type_node))
3502 return long_double_type_node;
3503
3504 if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
3505 return build_pointer_type (char_type_node);
3506
3507 if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
3508 return build_pointer_type (integer_type_node);
3509
e2ea7e3a 3510#ifdef VECTOR_MODE_SUPPORTED_P
3511 if (mode == TYPE_MODE (V4SF_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
3512 return V4SF_type_node;
3513 if (mode == TYPE_MODE (V4SI_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
3514 return V4SI_type_node;
3515 if (mode == TYPE_MODE (V2SI_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
3516 return V2SI_type_node;
3517 if (mode == TYPE_MODE (V4HI_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
3518 return V4HI_type_node;
3519 if (mode == TYPE_MODE (V8QI_type_node) && VECTOR_MODE_SUPPORTED_P (mode))
3520 return V8QI_type_node;
3521#endif
3522
b0fc3e72 3523 return 0;
3524}
20d39783 3525
3526/* Return an unsigned type the same as TYPE in other respects. */
3527tree
3528unsigned_type (type)
3529 tree type;
3530{
3531 tree type1 = TYPE_MAIN_VARIANT (type);
3532 if (type1 == signed_char_type_node || type1 == char_type_node)
3533 return unsigned_char_type_node;
3534 if (type1 == integer_type_node)
3535 return unsigned_type_node;
3536 if (type1 == short_integer_type_node)
3537 return short_unsigned_type_node;
3538 if (type1 == long_integer_type_node)
3539 return long_unsigned_type_node;
3540 if (type1 == long_long_integer_type_node)
3541 return long_long_unsigned_type_node;
3542 if (type1 == widest_integer_literal_type_node)
3543 return widest_unsigned_literal_type_node;
3544#if HOST_BITS_PER_WIDE_INT >= 64
3545 if (type1 == intTI_type_node)
3546 return unsigned_intTI_type_node;
3547#endif
3548 if (type1 == intDI_type_node)
3549 return unsigned_intDI_type_node;
3550 if (type1 == intSI_type_node)
3551 return unsigned_intSI_type_node;
3552 if (type1 == intHI_type_node)
3553 return unsigned_intHI_type_node;
3554 if (type1 == intQI_type_node)
3555 return unsigned_intQI_type_node;
3556
3557 return signed_or_unsigned_type (1, type);
3558}
3559
3560/* Return a signed type the same as TYPE in other respects. */
3561
3562tree
3563signed_type (type)
3564 tree type;
3565{
3566 tree type1 = TYPE_MAIN_VARIANT (type);
3567 if (type1 == unsigned_char_type_node || type1 == char_type_node)
3568 return signed_char_type_node;
3569 if (type1 == unsigned_type_node)
3570 return integer_type_node;
3571 if (type1 == short_unsigned_type_node)
3572 return short_integer_type_node;
3573 if (type1 == long_unsigned_type_node)
3574 return long_integer_type_node;
3575 if (type1 == long_long_unsigned_type_node)
3576 return long_long_integer_type_node;
3577 if (type1 == widest_unsigned_literal_type_node)
3578 return widest_integer_literal_type_node;
3579#if HOST_BITS_PER_WIDE_INT >= 64
3580 if (type1 == unsigned_intTI_type_node)
3581 return intTI_type_node;
3582#endif
3583 if (type1 == unsigned_intDI_type_node)
3584 return intDI_type_node;
3585 if (type1 == unsigned_intSI_type_node)
3586 return intSI_type_node;
3587 if (type1 == unsigned_intHI_type_node)
3588 return intHI_type_node;
3589 if (type1 == unsigned_intQI_type_node)
3590 return intQI_type_node;
3591
3592 return signed_or_unsigned_type (0, type);
3593}
3594
3595/* Return a type the same as TYPE except unsigned or
3596 signed according to UNSIGNEDP. */
3597
3598tree
3599signed_or_unsigned_type (unsignedp, type)
3600 int unsignedp;
3601 tree type;
3602{
3603 if (! INTEGRAL_TYPE_P (type)
3604 || TREE_UNSIGNED (type) == unsignedp)
3605 return type;
3606
3607 if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
3608 return unsignedp ? unsigned_char_type_node : signed_char_type_node;
44e9fa65 3609 if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
20d39783 3610 return unsignedp ? unsigned_type_node : integer_type_node;
44e9fa65 3611 if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node))
20d39783 3612 return unsignedp ? short_unsigned_type_node : short_integer_type_node;
44e9fa65 3613 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node))
20d39783 3614 return unsignedp ? long_unsigned_type_node : long_integer_type_node;
44e9fa65 3615 if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node))
20d39783 3616 return (unsignedp ? long_long_unsigned_type_node
3617 : long_long_integer_type_node);
44e9fa65 3618 if (TYPE_PRECISION (type) == TYPE_PRECISION (widest_integer_literal_type_node))
20d39783 3619 return (unsignedp ? widest_unsigned_literal_type_node
3620 : widest_integer_literal_type_node);
3621 return type;
3622}
b0fc3e72 3623\f
a9b9d10c 3624/* Return the minimum number of bits needed to represent VALUE in a
3625 signed or unsigned type, UNSIGNEDP says which. */
3626
a0c2c45b 3627unsigned int
a9b9d10c 3628min_precision (value, unsignedp)
3629 tree value;
3630 int unsignedp;
3631{
3632 int log;
3633
3634 /* If the value is negative, compute its negative minus 1. The latter
3635 adjustment is because the absolute value of the largest negative value
3636 is one larger than the largest positive value. This is equivalent to
3637 a bit-wise negation, so use that operation instead. */
3638
3639 if (tree_int_cst_sgn (value) < 0)
3640 value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value));
3641
3642 /* Return the number of bits needed, taking into account the fact
3643 that we need one more bit for a signed than unsigned type. */
3644
3645 if (integer_zerop (value))
3646 log = 0;
a9b9d10c 3647 else
a0c2c45b 3648 log = tree_floor_log2 (value);
a9b9d10c 3649
3650 return log + 1 + ! unsignedp;
3651}
3652\f
b0fc3e72 3653/* Print an error message for invalid operands to arith operation CODE.
3654 NOP_EXPR is used as a special case (see truthvalue_conversion). */
3655
3656void
3657binary_op_error (code)
3658 enum tree_code code;
3659{
3eee82c5 3660 register const char *opname;
f03946e4 3661
b0fc3e72 3662 switch (code)
3663 {
3664 case NOP_EXPR:
3665 error ("invalid truth-value expression");
3666 return;
3667
3668 case PLUS_EXPR:
3669 opname = "+"; break;
3670 case MINUS_EXPR:
3671 opname = "-"; break;
3672 case MULT_EXPR:
3673 opname = "*"; break;
3674 case MAX_EXPR:
3675 opname = "max"; break;
3676 case MIN_EXPR:
3677 opname = "min"; break;
3678 case EQ_EXPR:
3679 opname = "=="; break;
3680 case NE_EXPR:
3681 opname = "!="; break;
3682 case LE_EXPR:
3683 opname = "<="; break;
3684 case GE_EXPR:
3685 opname = ">="; break;
3686 case LT_EXPR:
3687 opname = "<"; break;
3688 case GT_EXPR:
3689 opname = ">"; break;
3690 case LSHIFT_EXPR:
3691 opname = "<<"; break;
3692 case RSHIFT_EXPR:
3693 opname = ">>"; break;
3694 case TRUNC_MOD_EXPR:
66618a1e 3695 case FLOOR_MOD_EXPR:
b0fc3e72 3696 opname = "%"; break;
3697 case TRUNC_DIV_EXPR:
66618a1e 3698 case FLOOR_DIV_EXPR:
b0fc3e72 3699 opname = "/"; break;
3700 case BIT_AND_EXPR:
3701 opname = "&"; break;
3702 case BIT_IOR_EXPR:
3703 opname = "|"; break;
3704 case TRUTH_ANDIF_EXPR:
3705 opname = "&&"; break;
3706 case TRUTH_ORIF_EXPR:
3707 opname = "||"; break;
3708 case BIT_XOR_EXPR:
3709 opname = "^"; break;
66618a1e 3710 case LROTATE_EXPR:
3711 case RROTATE_EXPR:
3712 opname = "rotate"; break;
31f820d2 3713 default:
3714 opname = "unknown"; break;
b0fc3e72 3715 }
3716 error ("invalid operands to binary %s", opname);
3717}
3718\f
3719/* Subroutine of build_binary_op, used for comparison operations.
3720 See if the operands have both been converted from subword integer types
3721 and, if so, perhaps change them both back to their original type.
5b511807 3722 This function is also responsible for converting the two operands
3723 to the proper common type for comparison.
b0fc3e72 3724
3725 The arguments of this function are all pointers to local variables
3726 of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
3727 RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
3728
3729 If this function returns nonzero, it means that the comparison has
3730 a constant value. What this function returns is an expression for
3731 that value. */
3732
3733tree
3734shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
3735 tree *op0_ptr, *op1_ptr;
3736 tree *restype_ptr;
3737 enum tree_code *rescode_ptr;
3738{
3739 register tree type;
3740 tree op0 = *op0_ptr;
3741 tree op1 = *op1_ptr;
3742 int unsignedp0, unsignedp1;
3743 int real1, real2;
3744 tree primop0, primop1;
3745 enum tree_code code = *rescode_ptr;
3746
3747 /* Throw away any conversions to wider types
3748 already present in the operands. */
3749
3750 primop0 = get_narrower (op0, &unsignedp0);
3751 primop1 = get_narrower (op1, &unsignedp1);
3752
3753 /* Handle the case that OP0 does not *contain* a conversion
3754 but it *requires* conversion to FINAL_TYPE. */
3755
3756 if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
3757 unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
3758 if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
3759 unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
3760
3761 /* If one of the operands must be floated, we cannot optimize. */
3762 real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
3763 real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
3764
3765 /* If first arg is constant, swap the args (changing operation
2bd278cc 3766 so value is preserved), for canonicalization. Don't do this if
3767 the second arg is 0. */
b0fc3e72 3768
2bd278cc 3769 if (TREE_CONSTANT (primop0)
3770 && ! integer_zerop (primop1) && ! real_zerop (primop1))
b0fc3e72 3771 {
3772 register tree tem = primop0;
3773 register int temi = unsignedp0;
3774 primop0 = primop1;
3775 primop1 = tem;
3776 tem = op0;
3777 op0 = op1;
3778 op1 = tem;
3779 *op0_ptr = op0;
3780 *op1_ptr = op1;
3781 unsignedp0 = unsignedp1;
3782 unsignedp1 = temi;
3783 temi = real1;
3784 real1 = real2;
3785 real2 = temi;
3786
3787 switch (code)
3788 {
3789 case LT_EXPR:
3790 code = GT_EXPR;
3791 break;
3792 case GT_EXPR:
3793 code = LT_EXPR;
3794 break;
3795 case LE_EXPR:
3796 code = GE_EXPR;
3797 break;
3798 case GE_EXPR:
3799 code = LE_EXPR;
3800 break;
31f820d2 3801 default:
3802 break;
b0fc3e72 3803 }
3804 *rescode_ptr = code;
3805 }
3806
3807 /* If comparing an integer against a constant more bits wide,
3808 maybe we can deduce a value of 1 or 0 independent of the data.
3809 Or else truncate the constant now
3810 rather than extend the variable at run time.
3811
3812 This is only interesting if the constant is the wider arg.
3813 Also, it is not safe if the constant is unsigned and the
3814 variable arg is signed, since in this case the variable
3815 would be sign-extended and then regarded as unsigned.
3816 Our technique fails in this case because the lowest/highest
3817 possible unsigned results don't follow naturally from the
3818 lowest/highest possible values of the variable operand.
3819 For just EQ_EXPR and NE_EXPR there is another technique that
3820 could be used: see if the constant can be faithfully represented
3821 in the other operand's type, by truncating it and reextending it
3822 and see if that preserves the constant's value. */
3823
3824 if (!real1 && !real2
3825 && TREE_CODE (primop1) == INTEGER_CST
3826 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
3827 {
3828 int min_gt, max_gt, min_lt, max_lt;
3829 tree maxval, minval;
3830 /* 1 if comparison is nominally unsigned. */
3831 int unsignedp = TREE_UNSIGNED (*restype_ptr);
3832 tree val;
3833
3834 type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0));
cda09c61 3835
3836 /* If TYPE is an enumeration, then we need to get its min/max
3837 values from it's underlying integral type, not the enumerated
3838 type itself. */
3839 if (TREE_CODE (type) == ENUMERAL_TYPE)
3840 type = type_for_size (TYPE_PRECISION (type), unsignedp0);
b0fc3e72 3841
3842 maxval = TYPE_MAX_VALUE (type);
3843 minval = TYPE_MIN_VALUE (type);
3844
3845 if (unsignedp && !unsignedp0)
3846 *restype_ptr = signed_type (*restype_ptr);
3847
3848 if (TREE_TYPE (primop1) != *restype_ptr)
3849 primop1 = convert (*restype_ptr, primop1);
3850 if (type != *restype_ptr)
3851 {
3852 minval = convert (*restype_ptr, minval);
3853 maxval = convert (*restype_ptr, maxval);
3854 }
3855
3856 if (unsignedp && unsignedp0)
3857 {
3858 min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
3859 max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
3860 min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
3861 max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
3862 }
3863 else
3864 {
3865 min_gt = INT_CST_LT (primop1, minval);
3866 max_gt = INT_CST_LT (primop1, maxval);
3867 min_lt = INT_CST_LT (minval, primop1);
3868 max_lt = INT_CST_LT (maxval, primop1);
3869 }
3870
3871 val = 0;
3872 /* This used to be a switch, but Genix compiler can't handle that. */
3873 if (code == NE_EXPR)
3874 {
3875 if (max_lt || min_gt)
8a7e5d0d 3876 val = boolean_true_node;
b0fc3e72 3877 }
3878 else if (code == EQ_EXPR)
3879 {
3880 if (max_lt || min_gt)
8a7e5d0d 3881 val = boolean_false_node;
b0fc3e72 3882 }
3883 else if (code == LT_EXPR)
3884 {
3885 if (max_lt)
8a7e5d0d 3886 val = boolean_true_node;
b0fc3e72 3887 if (!min_lt)
8a7e5d0d 3888 val = boolean_false_node;
b0fc3e72 3889 }
3890 else if (code == GT_EXPR)
3891 {
3892 if (min_gt)
8a7e5d0d 3893 val = boolean_true_node;
b0fc3e72 3894 if (!max_gt)
8a7e5d0d 3895 val = boolean_false_node;
b0fc3e72 3896 }
3897 else if (code == LE_EXPR)
3898 {
3899 if (!max_gt)
8a7e5d0d 3900 val = boolean_true_node;
b0fc3e72 3901 if (min_gt)
8a7e5d0d 3902 val = boolean_false_node;
b0fc3e72 3903 }
3904 else if (code == GE_EXPR)
3905 {
3906 if (!min_lt)
8a7e5d0d 3907 val = boolean_true_node;
b0fc3e72 3908 if (max_lt)
8a7e5d0d 3909 val = boolean_false_node;
b0fc3e72 3910 }
3911
3912 /* If primop0 was sign-extended and unsigned comparison specd,
3913 we did a signed comparison above using the signed type bounds.
3914 But the comparison we output must be unsigned.
3915
3916 Also, for inequalities, VAL is no good; but if the signed
3917 comparison had *any* fixed result, it follows that the
3918 unsigned comparison just tests the sign in reverse
3919 (positive values are LE, negative ones GE).
3920 So we can generate an unsigned comparison
3921 against an extreme value of the signed type. */
3922
3923 if (unsignedp && !unsignedp0)
3924 {
3925 if (val != 0)
3926 switch (code)
3927 {
3928 case LT_EXPR:
3929 case GE_EXPR:
3930 primop1 = TYPE_MIN_VALUE (type);
3931 val = 0;
3932 break;
3933
3934 case LE_EXPR:
3935 case GT_EXPR:
3936 primop1 = TYPE_MAX_VALUE (type);
3937 val = 0;
3938 break;
31f820d2 3939
3940 default:
3941 break;
b0fc3e72 3942 }
3943 type = unsigned_type (type);
3944 }
3945
78dafd61 3946 if (!max_gt && !unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
b0fc3e72 3947 {
3948 /* This is the case of (char)x >?< 0x80, which people used to use
3949 expecting old C compilers to change the 0x80 into -0x80. */
8a7e5d0d 3950 if (val == boolean_false_node)
9a64a879 3951 warning ("comparison is always false due to limited range of data type");
8a7e5d0d 3952 if (val == boolean_true_node)
9a64a879 3953 warning ("comparison is always true due to limited range of data type");
b0fc3e72 3954 }
3955
78dafd61 3956 if (!min_lt && unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
b0fc3e72 3957 {
a693ee7d 3958 /* This is the case of (unsigned char)x >?< -1 or < 0. */
8a7e5d0d 3959 if (val == boolean_false_node)
9a64a879 3960 warning ("comparison is always false due to limited range of data type");
8a7e5d0d 3961 if (val == boolean_true_node)
9a64a879 3962 warning ("comparison is always true due to limited range of data type");
b0fc3e72 3963 }
3964
3965 if (val != 0)
3966 {
3967 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
3968 if (TREE_SIDE_EFFECTS (primop0))
3969 return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
3970 return val;
3971 }
3972
3973 /* Value is not predetermined, but do the comparison
3974 in the type of the operand that is not constant.
3975 TYPE is already properly set. */
3976 }
3977 else if (real1 && real2
2203bd5c 3978 && (TYPE_PRECISION (TREE_TYPE (primop0))
3979 == TYPE_PRECISION (TREE_TYPE (primop1))))
b0fc3e72 3980 type = TREE_TYPE (primop0);
3981
3982 /* If args' natural types are both narrower than nominal type
3983 and both extend in the same manner, compare them
3984 in the type of the wider arg.
3985 Otherwise must actually extend both to the nominal
3986 common type lest different ways of extending
3987 alter the result.
3988 (eg, (short)-1 == (unsigned short)-1 should be 0.) */
3989
3990 else if (unsignedp0 == unsignedp1 && real1 == real2
3991 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
3992 && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
3993 {
3994 type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
3995 type = signed_or_unsigned_type (unsignedp0
3996 || TREE_UNSIGNED (*restype_ptr),
3997 type);
3998 /* Make sure shorter operand is extended the right way
3999 to match the longer operand. */
4000 primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)),
4001 primop0);
4002 primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
4003 primop1);
4004 }
4005 else
4006 {
4007 /* Here we must do the comparison on the nominal type
4008 using the args exactly as we received them. */
4009 type = *restype_ptr;
4010 primop0 = op0;
4011 primop1 = op1;
4012
4013 if (!real1 && !real2 && integer_zerop (primop1)
32ab5039 4014 && TREE_UNSIGNED (*restype_ptr))
b0fc3e72 4015 {
4016 tree value = 0;
4017 switch (code)
4018 {
4019 case GE_EXPR:
2bd278cc 4020 /* All unsigned values are >= 0, so we warn if extra warnings
4021 are requested. However, if OP0 is a constant that is
4022 >= 0, the signedness of the comparison isn't an issue,
4023 so suppress the warning. */
da99cd78 4024 if (extra_warnings && !in_system_header
2bd278cc 4025 && ! (TREE_CODE (primop0) == INTEGER_CST
4026 && ! TREE_OVERFLOW (convert (signed_type (type),
4027 primop0))))
9a64a879 4028 warning ("comparison of unsigned expression >= 0 is always true");
8a7e5d0d 4029 value = boolean_true_node;
b0fc3e72 4030 break;
4031
4032 case LT_EXPR:
da99cd78 4033 if (extra_warnings && !in_system_header
2bd278cc 4034 && ! (TREE_CODE (primop0) == INTEGER_CST
4035 && ! TREE_OVERFLOW (convert (signed_type (type),
4036 primop0))))
9a64a879 4037 warning ("comparison of unsigned expression < 0 is always false");
8a7e5d0d 4038 value = boolean_false_node;
31f820d2 4039 break;
4040
4041 default:
4042 break;
b0fc3e72 4043 }
4044
4045 if (value != 0)
4046 {
4047 /* Don't forget to evaluate PRIMOP0 if it has side effects. */
4048 if (TREE_SIDE_EFFECTS (primop0))
4049 return build (COMPOUND_EXPR, TREE_TYPE (value),
4050 primop0, value);
4051 return value;
4052 }
4053 }
4054 }
4055
4056 *op0_ptr = convert (type, primop0);
4057 *op1_ptr = convert (type, primop1);
4058
8a7e5d0d 4059 *restype_ptr = boolean_type_node;
b0fc3e72 4060
4061 return 0;
4062}
4063\f
4064/* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
4065 or validate its data type for an `if' or `while' statement or ?..: exp.
4066
4067 This preparation consists of taking the ordinary
4068 representation of an expression expr and producing a valid tree
4069 boolean expression describing whether expr is nonzero. We could
8a7e5d0d 4070 simply always do build_binary_op (NE_EXPR, expr, boolean_false_node, 1),
b0fc3e72 4071 but we optimize comparisons, &&, ||, and !.
4072
8a7e5d0d 4073 The resulting type should always be `boolean_type_node'. */
b0fc3e72 4074
4075tree
4076truthvalue_conversion (expr)
4077 tree expr;
4078{
baa1f4f5 4079 if (TREE_CODE (expr) == ERROR_MARK)
4080 return expr;
4081
a70adbe5 4082#if 0 /* This appears to be wrong for C++. */
baa1f4f5 4083 /* These really should return error_mark_node after 2.4 is stable.
4084 But not all callers handle ERROR_MARK properly. */
4085 switch (TREE_CODE (TREE_TYPE (expr)))
4086 {
4087 case RECORD_TYPE:
4088 error ("struct type value used where scalar is required");
8a7e5d0d 4089 return boolean_false_node;
baa1f4f5 4090
4091 case UNION_TYPE:
4092 error ("union type value used where scalar is required");
8a7e5d0d 4093 return boolean_false_node;
baa1f4f5 4094
4095 case ARRAY_TYPE:
4096 error ("array type value used where scalar is required");
8a7e5d0d 4097 return boolean_false_node;
baa1f4f5 4098
4099 default:
4100 break;
4101 }
a70adbe5 4102#endif /* 0 */
baa1f4f5 4103
b0fc3e72 4104 switch (TREE_CODE (expr))
4105 {
b0fc3e72 4106 case EQ_EXPR:
b0fc3e72 4107 case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
4108 case TRUTH_ANDIF_EXPR:
4109 case TRUTH_ORIF_EXPR:
4110 case TRUTH_AND_EXPR:
4111 case TRUTH_OR_EXPR:
31f6e93c 4112 case TRUTH_XOR_EXPR:
7bbc42b5 4113 case TRUTH_NOT_EXPR:
8a7e5d0d 4114 TREE_TYPE (expr) = boolean_type_node;
4115 return expr;
3e851b85 4116
b0fc3e72 4117 case ERROR_MARK:
4118 return expr;
4119
4120 case INTEGER_CST:
8a7e5d0d 4121 return integer_zerop (expr) ? boolean_false_node : boolean_true_node;
b0fc3e72 4122
4123 case REAL_CST:
8a7e5d0d 4124 return real_zerop (expr) ? boolean_false_node : boolean_true_node;
b0fc3e72 4125
4126 case ADDR_EXPR:
65b5e6a6 4127 /* If we are taking the address of a external decl, it might be zero
4128 if it is weak, so we cannot optimize. */
9308e976 4129 if (DECL_P (TREE_OPERAND (expr, 0))
65b5e6a6 4130 && DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
4131 break;
4132
b0fc3e72 4133 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
8a7e5d0d 4134 return build (COMPOUND_EXPR, boolean_type_node,
4135 TREE_OPERAND (expr, 0), boolean_true_node);
b0fc3e72 4136 else
8a7e5d0d 4137 return boolean_true_node;
b0fc3e72 4138
2203bd5c 4139 case COMPLEX_EXPR:
2ba726d2 4140 return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
95809de4 4141 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2ba726d2 4142 truthvalue_conversion (TREE_OPERAND (expr, 0)),
4143 truthvalue_conversion (TREE_OPERAND (expr, 1)),
2203bd5c 4144 0);
4145
b0fc3e72 4146 case NEGATE_EXPR:
4147 case ABS_EXPR:
4148 case FLOAT_EXPR:
4149 case FFS_EXPR:
4150 /* These don't change whether an object is non-zero or zero. */
4151 return truthvalue_conversion (TREE_OPERAND (expr, 0));
4152
4153 case LROTATE_EXPR:
4154 case RROTATE_EXPR:
4155 /* These don't change whether an object is zero or non-zero, but
4156 we can't ignore them if their second arg has side-effects. */
4157 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
8a7e5d0d 4158 return build (COMPOUND_EXPR, boolean_type_node, TREE_OPERAND (expr, 1),
b0fc3e72 4159 truthvalue_conversion (TREE_OPERAND (expr, 0)));
4160 else
4161 return truthvalue_conversion (TREE_OPERAND (expr, 0));
73be5127 4162
b0fc3e72 4163 case COND_EXPR:
4164 /* Distribute the conversion into the arms of a COND_EXPR. */
8a7e5d0d 4165 return fold (build (COND_EXPR, boolean_type_node, TREE_OPERAND (expr, 0),
b0fc3e72 4166 truthvalue_conversion (TREE_OPERAND (expr, 1)),
4167 truthvalue_conversion (TREE_OPERAND (expr, 2))));
4168
4169 case CONVERT_EXPR:
4170 /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
4171 since that affects how `default_conversion' will behave. */
4172 if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
4173 || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
4174 break;
a92771b8 4175 /* fall through... */
b0fc3e72 4176 case NOP_EXPR:
4177 /* If this is widening the argument, we can ignore it. */
4178 if (TYPE_PRECISION (TREE_TYPE (expr))
4179 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
4180 return truthvalue_conversion (TREE_OPERAND (expr, 0));
4181 break;
4182
b0fc3e72 4183 case MINUS_EXPR:
fe0a0255 4184 /* With IEEE arithmetic, x - x may not equal 0, so we can't optimize
4185 this case. */
4186 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
4187 && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE)
4188 break;
a92771b8 4189 /* fall through... */
fe0a0255 4190 case BIT_XOR_EXPR:
a70adbe5 4191 /* This and MINUS_EXPR can be changed into a comparison of the
fe0a0255 4192 two objects. */
b0fc3e72 4193 if (TREE_TYPE (TREE_OPERAND (expr, 0))
4194 == TREE_TYPE (TREE_OPERAND (expr, 1)))
4195 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
4196 TREE_OPERAND (expr, 1), 1);
4197 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
4198 fold (build1 (NOP_EXPR,
4199 TREE_TYPE (TREE_OPERAND (expr, 0)),
4200 TREE_OPERAND (expr, 1))), 1);
16837b18 4201
c2edbca4 4202 case BIT_AND_EXPR:
cc4c7eaf 4203 if (integer_onep (TREE_OPERAND (expr, 1))
4204 && TREE_TYPE (expr) != boolean_type_node)
4205 /* Using convert here would cause infinite recursion. */
4206 return build1 (NOP_EXPR, boolean_type_node, expr);
4207 break;
c2edbca4 4208
16837b18 4209 case MODIFY_EXPR:
4210 if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
4211 warning ("suggest parentheses around assignment used as truth value");
4212 break;
73be5127 4213
31f820d2 4214 default:
4215 break;
b0fc3e72 4216 }
4217
2ba726d2 4218 if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
a0748b7d 4219 {
4220 tree tem = save_expr (expr);
4221 return (build_binary_op
4222 ((TREE_SIDE_EFFECTS (expr)
4223 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
4224 truthvalue_conversion (build_unary_op (REALPART_EXPR, tem, 0)),
4225 truthvalue_conversion (build_unary_op (IMAGPART_EXPR, tem, 0)),
4226 0));
4227 }
2ba726d2 4228
b0fc3e72 4229 return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
4230}
4231\f
518796ad 4232#if !USE_CPPLIB
b0fc3e72 4233/* Read the rest of a #-directive from input stream FINPUT.
4234 In normal use, the directive name and the white space after it
4235 have already been read, so they won't be included in the result.
4236 We allow for the fact that the directive line may contain
4237 a newline embedded within a character or string literal which forms
4238 a part of the directive.
4239
4240 The value is a string in a reusable buffer. It remains valid
b97b38c0 4241 only until the next time this function is called.
4242
4243 The terminating character ('\n' or EOF) is left in FINPUT for the
4244 caller to re-read. */
b0fc3e72 4245
4246char *
4247get_directive_line (finput)
4248 register FILE *finput;
4249{
4250 static char *directive_buffer = NULL;
4251 static unsigned buffer_length = 0;
4252 register char *p;
4253 register char *buffer_limit;
4254 register int looking_for = 0;
4255 register int char_escaped = 0;
4256
4257 if (buffer_length == 0)
4258 {
4259 directive_buffer = (char *)xmalloc (128);
4260 buffer_length = 128;
4261 }
4262
4263 buffer_limit = &directive_buffer[buffer_length];
4264
4265 for (p = directive_buffer; ; )
4266 {
4267 int c;
4268
4269 /* Make buffer bigger if it is full. */
4270 if (p >= buffer_limit)
4271 {
4272 register unsigned bytes_used = (p - directive_buffer);
4273
4274 buffer_length *= 2;
4275 directive_buffer
4276 = (char *)xrealloc (directive_buffer, buffer_length);
4277 p = &directive_buffer[bytes_used];
4278 buffer_limit = &directive_buffer[buffer_length];
4279 }
4280
4281 c = getc (finput);
4282
4283 /* Discard initial whitespace. */
4284 if ((c == ' ' || c == '\t') && p == directive_buffer)
4285 continue;
4286
4287 /* Detect the end of the directive. */
b97b38c0 4288 if (looking_for == 0
4289 && (c == '\n' || c == EOF))
b0fc3e72 4290 {
4291 ungetc (c, finput);
4292 c = '\0';
4293 }
4294
4295 *p++ = c;
4296
4297 if (c == 0)
4298 return directive_buffer;
4299
4300 /* Handle string and character constant syntax. */
4301 if (looking_for)
4302 {
4303 if (looking_for == c && !char_escaped)
4304 looking_for = 0; /* Found terminator... stop looking. */
4305 }
4306 else
4307 if (c == '\'' || c == '"')
4308 looking_for = c; /* Don't stop buffering until we see another
3398e91d 4309 one of these (or an EOF). */
b0fc3e72 4310
4311 /* Handle backslash. */
4312 char_escaped = (c == '\\' && ! char_escaped);
4313 }
4314}
518796ad 4315#endif /* USE_CPPLIB */
ceee5ef4 4316\f
4317/* Make a variant type in the proper way for C/C++, propagating qualifiers
4318 down to the element type of an array. */
4319
4320tree
a5b1863e 4321c_build_qualified_type (type, type_quals)
ceee5ef4 4322 tree type;
a5b1863e 4323 int type_quals;
ceee5ef4 4324{
a5b1863e 4325 /* A restrict-qualified pointer type must be a pointer to object or
4326 incomplete type. Note that the use of POINTER_TYPE_P also allows
4327 REFERENCE_TYPEs, which is appropriate for C++. Unfortunately,
4328 the C++ front-end also use POINTER_TYPE for pointer-to-member
4329 values, so even though it should be illegal to use `restrict'
4330 with such an entity we don't flag that here. Thus, special case
4331 code for that case is required in the C++ front-end. */
4332 if ((type_quals & TYPE_QUAL_RESTRICT)
4333 && (!POINTER_TYPE_P (type)
4334 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type))))
4335 {
4336 error ("invalid use of `restrict'");
4337 type_quals &= ~TYPE_QUAL_RESTRICT;
4338 }
4339
ceee5ef4 4340 if (TREE_CODE (type) == ARRAY_TYPE)
a5b1863e 4341 return build_array_type (c_build_qualified_type (TREE_TYPE (type),
4342 type_quals),
754d8048 4343 TYPE_DOMAIN (type));
a5b1863e 4344 return build_qualified_type (type, type_quals);
4345}
4346
4347/* Apply the TYPE_QUALS to the new DECL. */
4348
4349void
4350c_apply_type_quals_to_decl (type_quals, decl)
4351 int type_quals;
4352 tree decl;
4353{
73bfa249 4354 if ((type_quals & TYPE_QUAL_CONST)
4355 || (TREE_TYPE (decl)
4356 && TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE))
a5b1863e 4357 TREE_READONLY (decl) = 1;
4358 if (type_quals & TYPE_QUAL_VOLATILE)
4359 {
4360 TREE_SIDE_EFFECTS (decl) = 1;
4361 TREE_THIS_VOLATILE (decl) = 1;
4362 }
d91a20bc 4363 if (type_quals & TYPE_QUAL_RESTRICT)
a5b1863e 4364 {
d91a20bc 4365 if (!TREE_TYPE (decl)
4366 || !POINTER_TYPE_P (TREE_TYPE (decl))
4367 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (TREE_TYPE (decl))))
4368 error ("invalid use of `restrict'");
4369 else if (flag_strict_aliasing)
a5b1863e 4370 {
d91a20bc 4371 /* No two restricted pointers can point at the same thing.
4372 However, a restricted pointer can point at the same thing
4373 as an unrestricted pointer, if that unrestricted pointer
4374 is based on the restricted pointer. So, we make the
4375 alias set for the restricted pointer a subset of the
4376 alias set for the type pointed to by the type of the
4377 decl. */
4378
f7c44134 4379 HOST_WIDE_INT pointed_to_alias_set
d91a20bc 4380 = get_alias_set (TREE_TYPE (TREE_TYPE (decl)));
44e9fa65 4381
f7c44134 4382 if (pointed_to_alias_set == 0)
d91a20bc 4383 /* It's not legal to make a subset of alias set zero. */
4384 ;
4385 else
4386 {
4387 DECL_POINTER_ALIAS_SET (decl) = new_alias_set ();
4388 record_alias_subset (pointed_to_alias_set,
4389 DECL_POINTER_ALIAS_SET (decl));
4390 }
a5b1863e 4391 }
4392 }
4393}
4394
b5ba9f3a 4395
4396/* Return the typed-based alias set for T, which may be an expression
f7c44134 4397 or a type. Return -1 if we don't do anything special. */
b5ba9f3a 4398
f7c44134 4399HOST_WIDE_INT
d43e810f 4400lang_get_alias_set (t)
b5ba9f3a 4401 tree t;
4402{
be4f2de7 4403 tree u;
b5ba9f3a 4404
be4f2de7 4405 /* Permit type-punning when accessing a union, provided the access
4406 is directly through the union. For example, this code does not
4407 permit taking the address of a union member and then storing
4408 through it. Even the type-punning allowed here is a GCC
4409 extension, albeit a common and useful one; the C standard says
4410 that such accesses have implementation-defined behavior. */
4411 for (u = t;
4412 TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
4413 u = TREE_OPERAND (u, 0))
4414 if (TREE_CODE (u) == COMPONENT_REF
4415 && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
4416 return 0;
1e2513d9 4417
f7c44134 4418 /* If this is a char *, the ANSI C standard says it can alias
1607663f 4419 anything. Note that all references need do this. */
4420 if (TREE_CODE_CLASS (TREE_CODE (t)) == 'r'
4421 && TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
4422 && TYPE_PRECISION (TREE_TYPE (t)) == TYPE_PRECISION (char_type_node))
f7c44134 4423 return 0;
a5b1863e 4424
f7c44134 4425 /* That's all the expressions we handle specially. */
4426 if (! TYPE_P (t))
4427 return -1;
b5ba9f3a 4428
1607663f 4429 /* The C standard specifically allows aliasing between signed and
4430 unsigned variants of the same type. We treat the signed
4431 variant as canonical. */
4432 if (TREE_CODE (t) == INTEGER_TYPE && TREE_UNSIGNED (t))
a8868e19 4433 {
4434 tree t1 = signed_type (t);
1607663f 4435
a8868e19 4436 /* t1 == t can happen for boolean nodes which are always unsigned. */
4437 if (t1 != t)
4438 return get_alias_set (t1);
4439 }
f7c44134 4440 else if (POINTER_TYPE_P (t))
87d2d17e 4441 {
f7c44134 4442 tree t1;
87d2d17e 4443
4444 /* Unfortunately, there is no canonical form of a pointer type.
4445 In particular, if we have `typedef int I', then `int *', and
4446 `I *' are different types. So, we have to pick a canonical
4447 representative. We do this below.
44e9fa65 4448
40bdc593 4449 Technically, this approach is actually more conservative that
4450 it needs to be. In particular, `const int *' and `int *'
4451 chould be in different alias sets, according to the C and C++
4452 standard, since their types are not the same, and so,
4453 technically, an `int **' and `const int **' cannot point at
4454 the same thing.
4455
4456 But, the standard is wrong. In particular, this code is
4457 legal C++:
4458
4459 int *ip;
4460 int **ipp = &ip;
4461 const int* const* cipp = &ip;
4462
4463 And, it doesn't make sense for that to be legal unless you
4464 can dereference IPP and CIPP. So, we ignore cv-qualifiers on
4465 the pointed-to types. This issue has been reported to the
4466 C++ committee. */
f7c44134 4467 t1 = TYPE_MAIN_VARIANT (TREE_TYPE (t));
4468 t1 = ((TREE_CODE (t) == POINTER_TYPE)
4469 ? build_pointer_type (t1) : build_reference_type (t1));
4470 if (t1 != t)
4471 return get_alias_set (t1);
87d2d17e 4472 }
6d2516c4 4473 /* It's not yet safe to use alias sets for classes in C++ because
4474 the TYPE_FIELDs list for a class doesn't mention base classes. */
e79b3b6b 4475 else if (c_language == clk_cplusplus && AGGREGATE_TYPE_P (t))
6d2516c4 4476 return 0;
1e2513d9 4477
f7c44134 4478 return -1;
b5ba9f3a 4479}
72040e7e 4480
4481/* Build tree nodes and builtin functions common to both C and C++ language
44e9fa65 4482 frontends.
72040e7e 4483 CPLUS_MODE is nonzero if we are called from the C++ frontend, we generate
44e9fa65 4484 some stricter prototypes in that case.
72040e7e 4485 NO_BUILTINS and NO_NONANSI_BUILTINS contain the respective values of
4486 the language frontend flags flag_no_builtin and
4487 flag_no_nonansi_builtin. */
f7c44134 4488
72040e7e 4489void
4490c_common_nodes_and_builtins (cplus_mode, no_builtins, no_nonansi_builtins)
4491 int cplus_mode, no_builtins, no_nonansi_builtins;
4492{
4493 tree temp;
4494 tree memcpy_ftype, memset_ftype, strlen_ftype;
3311f67b 4495 tree bzero_ftype, bcmp_ftype, puts_ftype, printf_ftype;
72040e7e 4496 tree endlink, int_endlink, double_endlink, unsigned_endlink;
4497 tree sizetype_endlink;
4498 tree ptr_ftype, ptr_ftype_unsigned;
ce1b14f4 4499 tree void_ftype_any, void_ftype_int, int_ftype_any, sizet_ftype_any;
72040e7e 4500 tree double_ftype_double, double_ftype_double_double;
4501 tree float_ftype_float, ldouble_ftype_ldouble;
4502 tree int_ftype_cptr_cptr_sizet;
4503 tree int_ftype_string_string, string_ftype_ptr_ptr;
4504 tree long_ftype_long;
5b8f6e0a 4505 tree longlong_ftype_longlong;
72040e7e 4506 /* Either char* or void*. */
4507 tree traditional_ptr_type_node;
071f1696 4508 /* Either const char* or const void*. */
4509 tree traditional_cptr_type_node;
4510 tree traditional_len_type_node;
4511 tree traditional_len_endlink;
2d47cc32 4512 tree va_list_ref_type_node;
8a15c04a 4513 tree va_list_arg_type_node;
a66c9326 4514
a66c9326 4515 pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"),
4516 va_list_type_node));
8a15c04a 4517
ee702940 4518 pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"),
4519 ptrdiff_type_node));
4520
4521 pushdecl (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"),
4522 sizetype));
4523
8a15c04a 4524 if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
2d47cc32 4525 {
4526 va_list_arg_type_node = va_list_ref_type_node =
4527 build_pointer_type (TREE_TYPE (va_list_type_node));
4528 }
8a15c04a 4529 else
2d47cc32 4530 {
4531 va_list_arg_type_node = va_list_type_node;
4532 va_list_ref_type_node = build_reference_type (va_list_type_node);
4533 }
4534
72040e7e 4535 endlink = void_list_node;
4536 int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink);
4537 double_endlink = tree_cons (NULL_TREE, double_type_node, endlink);
4538 unsigned_endlink = tree_cons (NULL_TREE, unsigned_type_node, endlink);
4539
4540 ptr_ftype = build_function_type (ptr_type_node, NULL_TREE);
4541 ptr_ftype_unsigned = build_function_type (ptr_type_node, unsigned_endlink);
46fd7177 4542 sizetype_endlink = tree_cons (NULL_TREE, TYPE_DOMAIN (sizetype), endlink);
72040e7e 4543 /* We realloc here because sizetype could be int or unsigned. S'ok. */
4544 ptr_ftype_sizetype = build_function_type (ptr_type_node, sizetype_endlink);
4545
ce1b14f4 4546 sizet_ftype_any = build_function_type (sizetype, NULL_TREE);
071f1696 4547 int_ftype_any = build_function_type (integer_type_node, NULL_TREE);
72040e7e 4548 void_ftype_any = build_function_type (void_type_node, NULL_TREE);
4549 void_ftype = build_function_type (void_type_node, endlink);
4550 void_ftype_int = build_function_type (void_type_node, int_endlink);
4551 void_ftype_ptr
4552 = build_function_type (void_type_node,
4553 tree_cons (NULL_TREE, ptr_type_node, endlink));
4554
4555 float_ftype_float
4556 = build_function_type (float_type_node,
4557 tree_cons (NULL_TREE, float_type_node, endlink));
4558
4559 double_ftype_double
4560 = build_function_type (double_type_node, double_endlink);
4561
4562 ldouble_ftype_ldouble
4563 = build_function_type (long_double_type_node,
4564 tree_cons (NULL_TREE, long_double_type_node,
4565 endlink));
4566
4567 double_ftype_double_double
4568 = build_function_type (double_type_node,
4569 tree_cons (NULL_TREE, double_type_node,
4570 double_endlink));
4571
4572 int_ftype_int
4573 = build_function_type (integer_type_node, int_endlink);
4574
4575 long_ftype_long
4576 = build_function_type (long_integer_type_node,
4577 tree_cons (NULL_TREE, long_integer_type_node,
4578 endlink));
4579
5b8f6e0a 4580 longlong_ftype_longlong
4581 = build_function_type (long_long_integer_type_node,
4582 tree_cons (NULL_TREE, long_long_integer_type_node,
4583 endlink));
4584
72040e7e 4585 int_ftype_cptr_cptr_sizet
4586 = build_function_type (integer_type_node,
4587 tree_cons (NULL_TREE, const_ptr_type_node,
4588 tree_cons (NULL_TREE, const_ptr_type_node,
4589 tree_cons (NULL_TREE,
4590 sizetype,
4591 endlink))));
4592
a08e60ae 4593 void_zero_node = build_int_2 (0, 0);
4594 TREE_TYPE (void_zero_node) = void_type_node;
4595
72040e7e 4596 /* Prototype for strcpy. */
4597 string_ftype_ptr_ptr
4598 = build_function_type (string_type_node,
4599 tree_cons (NULL_TREE, string_type_node,
4600 tree_cons (NULL_TREE,
4601 const_string_type_node,
4602 endlink)));
4603
071f1696 4604 traditional_len_type_node = (flag_traditional && ! cplus_mode
4605 ? integer_type_node : sizetype);
4606 traditional_len_endlink = tree_cons (NULL_TREE, traditional_len_type_node,
4607 endlink);
4608
72040e7e 4609 /* Prototype for strcmp. */
4610 int_ftype_string_string
4611 = build_function_type (integer_type_node,
4612 tree_cons (NULL_TREE, const_string_type_node,
4613 tree_cons (NULL_TREE,
4614 const_string_type_node,
4615 endlink)));
4616
4617 /* Prototype for strlen. */
4618 strlen_ftype
071f1696 4619 = build_function_type (traditional_len_type_node,
72040e7e 4620 tree_cons (NULL_TREE, const_string_type_node,
4621 endlink));
4622
4623 traditional_ptr_type_node = (flag_traditional && ! cplus_mode
4624 ? string_type_node : ptr_type_node);
071f1696 4625 traditional_cptr_type_node = (flag_traditional && ! cplus_mode
4626 ? const_string_type_node : const_ptr_type_node);
72040e7e 4627
4628 /* Prototype for memcpy. */
4629 memcpy_ftype
4630 = build_function_type (traditional_ptr_type_node,
4631 tree_cons (NULL_TREE, ptr_type_node,
4632 tree_cons (NULL_TREE, const_ptr_type_node,
4633 sizetype_endlink)));
4634
4635 /* Prototype for memset. */
4636 memset_ftype
4637 = build_function_type (traditional_ptr_type_node,
4638 tree_cons (NULL_TREE, ptr_type_node,
4639 tree_cons (NULL_TREE, integer_type_node,
4640 tree_cons (NULL_TREE,
4641 sizetype,
4642 endlink))));
4643
ffc83088 4644 /* Prototype for bzero. */
4645 bzero_ftype
4646 = build_function_type (void_type_node,
4647 tree_cons (NULL_TREE, traditional_ptr_type_node,
4648 traditional_len_endlink));
4649
071f1696 4650 /* Prototype for bcmp. */
4651 bcmp_ftype
4652 = build_function_type (integer_type_node,
4653 tree_cons (NULL_TREE, traditional_cptr_type_node,
4654 tree_cons (NULL_TREE,
4655 traditional_cptr_type_node,
4656 traditional_len_endlink)));
4657
3311f67b 4658 /* Prototype for puts. */
4659 puts_ftype
4660 = build_function_type (integer_type_node,
4661 tree_cons (NULL_TREE, const_string_type_node,
4662 endlink));
4663
4664 /* Prototype for printf. */
4665 printf_ftype
4666 = build_function_type (integer_type_node,
4667 tree_cons (NULL_TREE, const_string_type_node,
4668 NULL_TREE));
4669
72040e7e 4670 builtin_function ("__builtin_constant_p", default_function_type,
8305149e 4671 BUILT_IN_CONSTANT_P, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4672
4673 builtin_function ("__builtin_return_address", ptr_ftype_unsigned,
8305149e 4674 BUILT_IN_RETURN_ADDRESS, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4675
4676 builtin_function ("__builtin_frame_address", ptr_ftype_unsigned,
8305149e 4677 BUILT_IN_FRAME_ADDRESS, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4678
4679 builtin_function ("__builtin_alloca", ptr_ftype_sizetype,
8305149e 4680 BUILT_IN_ALLOCA, BUILT_IN_NORMAL, "alloca");
4681 builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS,
4682 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4683 /* Define alloca, ffs as builtins.
4684 Declare _exit just to mark it as volatile. */
4685 if (! no_builtins && ! no_nonansi_builtins)
4686 {
397f1574 4687#ifndef SMALL_STACK
72040e7e 4688 temp = builtin_function ("alloca", ptr_ftype_sizetype,
8305149e 4689 BUILT_IN_ALLOCA, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4690 /* Suppress error if redefined as a non-function. */
4691 DECL_BUILT_IN_NONANSI (temp) = 1;
397f1574 4692#endif
8305149e 4693 temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS,
4694 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4695 /* Suppress error if redefined as a non-function. */
4696 DECL_BUILT_IN_NONANSI (temp) = 1;
4697 temp = builtin_function ("_exit", void_ftype_int,
8305149e 4698 0, NOT_BUILT_IN, NULL_PTR);
72040e7e 4699 TREE_THIS_VOLATILE (temp) = 1;
4700 TREE_SIDE_EFFECTS (temp) = 1;
4701 /* Suppress error if redefined as a non-function. */
4702 DECL_BUILT_IN_NONANSI (temp) = 1;
071f1696 4703
bd19206e 4704 /* The system prototypes for these functions have many
4705 variations, so don't specify parameters to avoid conflicts.
4706 The expand_* functions check the argument types anyway. */
4707 temp = builtin_function ("bzero", void_ftype_any,
ffc83088 4708 BUILT_IN_BZERO, BUILT_IN_NORMAL, NULL_PTR);
4709 DECL_BUILT_IN_NONANSI (temp) = 1;
bd19206e 4710 temp = builtin_function ("bcmp", int_ftype_any,
071f1696 4711 BUILT_IN_BCMP, BUILT_IN_NORMAL, NULL_PTR);
4712 DECL_BUILT_IN_NONANSI (temp) = 1;
72040e7e 4713 }
4714
8305149e 4715 builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS,
4716 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4717 builtin_function ("__builtin_fabsf", float_ftype_float, BUILT_IN_FABS,
8305149e 4718 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4719 builtin_function ("__builtin_fabs", double_ftype_double, BUILT_IN_FABS,
8305149e 4720 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4721 builtin_function ("__builtin_fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS,
8305149e 4722 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4723 builtin_function ("__builtin_labs", long_ftype_long, BUILT_IN_LABS,
8305149e 4724 BUILT_IN_NORMAL, NULL_PTR);
5b8f6e0a 4725 builtin_function ("__builtin_llabs", longlong_ftype_longlong, BUILT_IN_LLABS,
4726 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4727 builtin_function ("__builtin_saveregs", ptr_ftype, BUILT_IN_SAVEREGS,
8305149e 4728 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4729 builtin_function ("__builtin_classify_type", default_function_type,
8305149e 4730 BUILT_IN_CLASSIFY_TYPE, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4731 builtin_function ("__builtin_next_arg", ptr_ftype, BUILT_IN_NEXT_ARG,
8305149e 4732 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4733 builtin_function ("__builtin_args_info", int_ftype_int, BUILT_IN_ARGS_INFO,
8305149e 4734 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4735 builtin_function ("__builtin_setjmp",
4736 build_function_type (integer_type_node,
4737 tree_cons (NULL_TREE, ptr_type_node,
4738 endlink)),
8305149e 4739 BUILT_IN_SETJMP, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4740 builtin_function ("__builtin_longjmp",
4741 build_function_type (void_type_node,
4742 tree_cons (NULL_TREE, ptr_type_node,
4743 tree_cons (NULL_TREE,
4744 integer_type_node,
4745 endlink))),
8305149e 4746 BUILT_IN_LONGJMP, BUILT_IN_NORMAL, NULL_PTR);
4747 builtin_function ("__builtin_trap", void_ftype, BUILT_IN_TRAP,
4748 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4749
a4110d9a 4750 /* ISO C99 IEEE Unordered compares. */
4751 builtin_function ("__builtin_isgreater", default_function_type,
4752 BUILT_IN_ISGREATER, BUILT_IN_NORMAL, NULL_PTR);
4753 builtin_function ("__builtin_isgreaterequal", default_function_type,
4754 BUILT_IN_ISGREATEREQUAL, BUILT_IN_NORMAL, NULL_PTR);
4755 builtin_function ("__builtin_isless", default_function_type,
4756 BUILT_IN_ISLESS, BUILT_IN_NORMAL, NULL_PTR);
4757 builtin_function ("__builtin_islessequal", default_function_type,
4758 BUILT_IN_ISLESSEQUAL, BUILT_IN_NORMAL, NULL_PTR);
4759 builtin_function ("__builtin_islessgreater", default_function_type,
4760 BUILT_IN_ISLESSGREATER, BUILT_IN_NORMAL, NULL_PTR);
4761 builtin_function ("__builtin_isunordered", default_function_type,
4762 BUILT_IN_ISUNORDERED, BUILT_IN_NORMAL, NULL_PTR);
4763
72040e7e 4764 /* Untyped call and return. */
4765 builtin_function ("__builtin_apply_args", ptr_ftype,
8305149e 4766 BUILT_IN_APPLY_ARGS, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4767
4768 temp = tree_cons (NULL_TREE,
4769 build_pointer_type (build_function_type (void_type_node,
4770 NULL_TREE)),
4771 tree_cons (NULL_TREE,
4772 ptr_type_node,
4773 tree_cons (NULL_TREE,
4774 sizetype,
4775 endlink)));
4776 builtin_function ("__builtin_apply",
4777 build_function_type (ptr_type_node, temp),
8305149e 4778 BUILT_IN_APPLY, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4779 builtin_function ("__builtin_return", void_ftype_ptr,
8305149e 4780 BUILT_IN_RETURN, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4781
a66c9326 4782 /* Support for varargs.h and stdarg.h. */
4783 builtin_function ("__builtin_varargs_start",
4784 build_function_type (void_type_node,
4785 tree_cons (NULL_TREE,
2d47cc32 4786 va_list_ref_type_node,
a66c9326 4787 endlink)),
8305149e 4788 BUILT_IN_VARARGS_START, BUILT_IN_NORMAL, NULL_PTR);
a66c9326 4789
4790 builtin_function ("__builtin_stdarg_start",
4791 build_function_type (void_type_node,
4792 tree_cons (NULL_TREE,
2d47cc32 4793 va_list_ref_type_node,
a66c9326 4794 NULL_TREE)),
8305149e 4795 BUILT_IN_STDARG_START, BUILT_IN_NORMAL, NULL_PTR);
a66c9326 4796
4797 builtin_function ("__builtin_va_end",
4798 build_function_type (void_type_node,
4799 tree_cons (NULL_TREE,
2d47cc32 4800 va_list_ref_type_node,
a66c9326 4801 endlink)),
8305149e 4802 BUILT_IN_VA_END, BUILT_IN_NORMAL, NULL_PTR);
a66c9326 4803
4804 builtin_function ("__builtin_va_copy",
4805 build_function_type (void_type_node,
4806 tree_cons (NULL_TREE,
2d47cc32 4807 va_list_ref_type_node,
a66c9326 4808 tree_cons (NULL_TREE,
8a15c04a 4809 va_list_arg_type_node,
a66c9326 4810 endlink))),
8305149e 4811 BUILT_IN_VA_COPY, BUILT_IN_NORMAL, NULL_PTR);
a66c9326 4812
89cfe6e5 4813 /* ??? Ought to be `T __builtin_expect(T, T)' for any type T. */
4814 builtin_function ("__builtin_expect",
4815 build_function_type (long_integer_type_node,
4816 tree_cons (NULL_TREE,
4817 long_integer_type_node,
4818 tree_cons (NULL_TREE,
4819 long_integer_type_node,
4820 endlink))),
4821 BUILT_IN_EXPECT, BUILT_IN_NORMAL, NULL_PTR);
4822
72040e7e 4823 /* Currently under experimentation. */
4824 builtin_function ("__builtin_memcpy", memcpy_ftype, BUILT_IN_MEMCPY,
8305149e 4825 BUILT_IN_NORMAL, "memcpy");
72040e7e 4826 builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet,
8305149e 4827 BUILT_IN_MEMCMP, BUILT_IN_NORMAL, "memcmp");
ffc83088 4828 builtin_function ("__builtin_memset", memset_ftype,
4829 BUILT_IN_MEMSET, BUILT_IN_NORMAL, "memset");
4830 builtin_function ("__builtin_bzero", bzero_ftype,
4831 BUILT_IN_BZERO, BUILT_IN_NORMAL, "bzero");
071f1696 4832 builtin_function ("__builtin_bcmp", bcmp_ftype,
4833 BUILT_IN_BCMP, BUILT_IN_NORMAL, "bcmp");
72040e7e 4834 builtin_function ("__builtin_strcmp", int_ftype_string_string,
8305149e 4835 BUILT_IN_STRCMP, BUILT_IN_NORMAL, "strcmp");
72040e7e 4836 builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr,
8305149e 4837 BUILT_IN_STRCPY, BUILT_IN_NORMAL, "strcpy");
72040e7e 4838 builtin_function ("__builtin_strlen", strlen_ftype,
8305149e 4839 BUILT_IN_STRLEN, BUILT_IN_NORMAL, "strlen");
44e9fa65 4840 builtin_function ("__builtin_sqrtf", float_ftype_float,
8305149e 4841 BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrtf");
72040e7e 4842 builtin_function ("__builtin_fsqrt", double_ftype_double,
8305149e 4843 BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrt");
72040e7e 4844 builtin_function ("__builtin_sqrtl", ldouble_ftype_ldouble,
8305149e 4845 BUILT_IN_FSQRT, BUILT_IN_NORMAL, "sqrtl");
44e9fa65 4846 builtin_function ("__builtin_sinf", float_ftype_float,
8305149e 4847 BUILT_IN_SIN, BUILT_IN_NORMAL, "sinf");
44e9fa65 4848 builtin_function ("__builtin_sin", double_ftype_double,
8305149e 4849 BUILT_IN_SIN, BUILT_IN_NORMAL, "sin");
44e9fa65 4850 builtin_function ("__builtin_sinl", ldouble_ftype_ldouble,
8305149e 4851 BUILT_IN_SIN, BUILT_IN_NORMAL, "sinl");
44e9fa65 4852 builtin_function ("__builtin_cosf", float_ftype_float,
8305149e 4853 BUILT_IN_COS, BUILT_IN_NORMAL, "cosf");
44e9fa65 4854 builtin_function ("__builtin_cos", double_ftype_double,
8305149e 4855 BUILT_IN_COS, BUILT_IN_NORMAL, "cos");
44e9fa65 4856 builtin_function ("__builtin_cosl", ldouble_ftype_ldouble,
8305149e 4857 BUILT_IN_COS, BUILT_IN_NORMAL, "cosl");
3311f67b 4858 built_in_decls[BUILT_IN_PUTCHAR] =
4859 builtin_function ("__builtin_putchar", int_ftype_int,
4860 BUILT_IN_PUTCHAR, BUILT_IN_NORMAL, "putchar");
4861 built_in_decls[BUILT_IN_PUTS] =
4862 builtin_function ("__builtin_puts", puts_ftype,
4863 BUILT_IN_PUTS, BUILT_IN_NORMAL, "puts");
4864 builtin_function ("__builtin_printf", printf_ftype,
edbbe5ca 4865 BUILT_IN_PRINTF, BUILT_IN_FRONTEND, "printf");
df94cd3b 4866 /* We declare these without argument so that the initial declaration
4867 for these identifiers is a builtin. That allows us to redeclare
4868 them later with argument without worrying about the explicit
4869 declarations in stdio.h being taken as the initial declaration.
4870 Also, save the _DECL for these so we can use them later. */
ce1b14f4 4871 built_in_decls[BUILT_IN_FWRITE] =
4872 builtin_function ("__builtin_fwrite", sizet_ftype_any,
4873 BUILT_IN_FWRITE, BUILT_IN_NORMAL, "fwrite");
df94cd3b 4874 built_in_decls[BUILT_IN_FPUTC] =
4875 builtin_function ("__builtin_fputc", int_ftype_any,
4876 BUILT_IN_FPUTC, BUILT_IN_NORMAL, "fputc");
4877 built_in_decls[BUILT_IN_FPUTS] =
4878 builtin_function ("__builtin_fputs", int_ftype_any,
4879 BUILT_IN_FPUTS, BUILT_IN_NORMAL, "fputs");
72040e7e 4880
4881 if (! no_builtins)
4882 {
8305149e 4883 builtin_function ("abs", int_ftype_int, BUILT_IN_ABS,
4884 BUILT_IN_NORMAL, NULL_PTR);
4885 builtin_function ("fabsf", float_ftype_float, BUILT_IN_FABS,
4886 BUILT_IN_NORMAL, NULL_PTR);
4887 builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS,
4888 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4889 builtin_function ("fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS,
8305149e 4890 BUILT_IN_NORMAL, NULL_PTR);
4891 builtin_function ("labs", long_ftype_long, BUILT_IN_LABS,
4892 BUILT_IN_NORMAL, NULL_PTR);
5b8f6e0a 4893 if (flag_isoc99 || ! no_nonansi_builtins)
4894 builtin_function ("llabs", longlong_ftype_longlong, BUILT_IN_LLABS,
4895 BUILT_IN_NORMAL, NULL_PTR);
8305149e 4896 builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY,
4897 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4898 builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP,
8305149e 4899 BUILT_IN_NORMAL, NULL_PTR);
4900 builtin_function ("memset", memset_ftype, BUILT_IN_MEMSET,
4901 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4902 builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP,
8305149e 4903 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4904 builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY,
8305149e 4905 BUILT_IN_NORMAL, NULL_PTR);
4906 builtin_function ("strlen", strlen_ftype, BUILT_IN_STRLEN,
4907 BUILT_IN_NORMAL, NULL_PTR);
4908 builtin_function ("sqrtf", float_ftype_float, BUILT_IN_FSQRT,
4909 BUILT_IN_NORMAL, NULL_PTR);
4910 builtin_function ("sqrt", double_ftype_double, BUILT_IN_FSQRT,
4911 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4912 builtin_function ("sqrtl", ldouble_ftype_ldouble, BUILT_IN_FSQRT,
8305149e 4913 BUILT_IN_NORMAL, NULL_PTR);
4914 builtin_function ("sinf", float_ftype_float, BUILT_IN_SIN,
4915 BUILT_IN_NORMAL, NULL_PTR);
4916 builtin_function ("sin", double_ftype_double, BUILT_IN_SIN,
4917 BUILT_IN_NORMAL, NULL_PTR);
4918 builtin_function ("sinl", ldouble_ftype_ldouble, BUILT_IN_SIN,
4919 BUILT_IN_NORMAL, NULL_PTR);
4920 builtin_function ("cosf", float_ftype_float, BUILT_IN_COS,
4921 BUILT_IN_NORMAL, NULL_PTR);
4922 builtin_function ("cos", double_ftype_double, BUILT_IN_COS,
4923 BUILT_IN_NORMAL, NULL_PTR);
4924 builtin_function ("cosl", ldouble_ftype_ldouble, BUILT_IN_COS,
4925 BUILT_IN_NORMAL, NULL_PTR);
3311f67b 4926 builtin_function ("printf", printf_ftype, BUILT_IN_PRINTF,
edbbe5ca 4927 BUILT_IN_FRONTEND, NULL_PTR);
df94cd3b 4928 /* We declare these without argument so that the initial
4929 declaration for these identifiers is a builtin. That allows
4930 us to redeclare them later with argument without worrying
4931 about the explicit declarations in stdio.h being taken as the
4932 initial declaration. */
4933 builtin_function ("fputc", int_ftype_any, BUILT_IN_FPUTC,
4934 BUILT_IN_NORMAL, NULL_PTR);
4935 builtin_function ("fputs", int_ftype_any, BUILT_IN_FPUTS,
4936 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4937
4938 /* Declare these functions volatile
4939 to avoid spurious "control drops through" warnings. */
4940 temp = builtin_function ("abort", cplus_mode ? void_ftype : void_ftype_any,
8305149e 4941 0, NOT_BUILT_IN, NULL_PTR);
72040e7e 4942 TREE_THIS_VOLATILE (temp) = 1;
4943 TREE_SIDE_EFFECTS (temp) = 1;
4944
4945#if 0 /* ??? The C++ frontend used to do this. */
4946 /* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on
4947 them... */
4948 DECL_BUILT_IN_NONANSI (temp) = 1;
4949#endif
4950 temp = builtin_function ("exit",
4951 cplus_mode ? void_ftype_int : void_ftype_any,
8305149e 4952 0, NOT_BUILT_IN, NULL_PTR);
72040e7e 4953 TREE_THIS_VOLATILE (temp) = 1;
4954 TREE_SIDE_EFFECTS (temp) = 1;
4955
4956#if 0 /* ??? The C++ frontend used to do this. */
4957 /* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on
4958 them... */
4959 DECL_BUILT_IN_NONANSI (temp) = 1;
4960#endif
4961 }
4962
4963#if 0
4964 /* Support for these has not been written in either expand_builtin
4965 or build_function_call. */
8305149e 4966 builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV,
4967 BUILT_IN_NORMAL, NULL_PTR);
4968 builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV,
4969 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4970 builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
8305149e 4971 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4972 builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL,
8305149e 4973 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4974 builtin_function ("__builtin_fmod", double_ftype_double_double,
8305149e 4975 BUILT_IN_FMOD, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4976 builtin_function ("__builtin_frem", double_ftype_double_double,
8305149e 4977 BUILT_IN_FREM, BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4978 builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
8305149e 4979 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4980 builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
8305149e 4981 BUILT_IN_NORMAL, NULL_PTR);
72040e7e 4982#endif
e94026da 4983
5c62f199 4984 main_identifier_node = get_identifier ("main");
4985
e94026da 4986 /* ??? Perhaps there's a better place to do this. But it is related
4987 to __builtin_va_arg, so it isn't that off-the-wall. */
4988 lang_type_promotes_to = simple_type_promotes_to;
72040e7e 4989}
a66c9326 4990
4991tree
4992build_va_arg (expr, type)
4993 tree expr, type;
4994{
4995 return build1 (VA_ARG_EXPR, type, expr);
4996}
e94026da 4997\f
4998/* Given a type, apply default promotions wrt unnamed function arguments
4999 and return the new type. Return NULL_TREE if no change. */
44e9fa65 5000/* ??? There is a function of the same name in the C++ front end that
e94026da 5001 does something similar, but is more thorough and does not return NULL
44e9fa65 5002 if no change. We could perhaps share code, but it would make the
e94026da 5003 self_promoting_type property harder to identify. */
5004
5005tree
5006simple_type_promotes_to (type)
5007 tree type;
5008{
5009 if (TYPE_MAIN_VARIANT (type) == float_type_node)
5010 return double_type_node;
5011
5012 if (C_PROMOTING_INTEGER_TYPE_P (type))
5013 {
5014 /* Traditionally, unsignedness is preserved in default promotions.
5015 Also preserve unsignedness if not really getting any wider. */
5016 if (TREE_UNSIGNED (type)
5017 && (flag_traditional
5018 || TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)))
5019 return unsigned_type_node;
5020 return integer_type_node;
5021 }
5022
5023 return NULL_TREE;
5024}
5025
5026/* Return 1 if PARMS specifies a fixed number of parameters
5027 and none of their types is affected by default promotions. */
5028
5029int
5030self_promoting_args_p (parms)
5031 tree parms;
5032{
5033 register tree t;
5034 for (t = parms; t; t = TREE_CHAIN (t))
5035 {
5036 register tree type = TREE_VALUE (t);
43f74bc4 5037
e94026da 5038 if (TREE_CHAIN (t) == 0 && type != void_type_node)
5039 return 0;
5040
5041 if (type == 0)
5042 return 0;
5043
5044 if (TYPE_MAIN_VARIANT (type) == float_type_node)
5045 return 0;
5046
5047 if (C_PROMOTING_INTEGER_TYPE_P (type))
5048 return 0;
5049 }
5050 return 1;
5051}
605fb01e 5052
5053/* Recognize certain built-in functions so we can make tree-codes
5054 other than CALL_EXPR. We do this when it enables fold-const.c
5055 to do something useful. */
5056/* ??? By rights this should go in builtins.c, but only C and C++
5057 implement build_{binary,unary}_op. Not exactly sure what bits
5058 of functionality are actually needed from those functions, or
5059 where the similar functionality exists in the other front ends. */
5060
5061tree
5062expand_tree_builtin (function, params, coerced_params)
5063 tree function, params, coerced_params;
5064{
5065 enum tree_code code;
5066
5067 if (DECL_BUILT_IN_CLASS (function) != BUILT_IN_NORMAL)
5068 return NULL_TREE;
5069
5070 switch (DECL_FUNCTION_CODE (function))
5071 {
5072 case BUILT_IN_ABS:
5073 case BUILT_IN_LABS:
5b8f6e0a 5074 case BUILT_IN_LLABS:
605fb01e 5075 case BUILT_IN_FABS:
5076 if (coerced_params == 0)
5077 return integer_zero_node;
5078 return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
5079
5080 case BUILT_IN_ISGREATER:
5081 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
5082 code = UNLE_EXPR;
5083 else
5084 code = LE_EXPR;
5085 goto unordered_cmp;
5086
5087 case BUILT_IN_ISGREATEREQUAL:
5088 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
5089 code = UNLT_EXPR;
5090 else
5091 code = LT_EXPR;
5092 goto unordered_cmp;
5093
5094 case BUILT_IN_ISLESS:
5095 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
5096 code = UNGE_EXPR;
5097 else
5098 code = GE_EXPR;
5099 goto unordered_cmp;
5100
5101 case BUILT_IN_ISLESSEQUAL:
5102 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
5103 code = UNGT_EXPR;
5104 else
5105 code = GT_EXPR;
5106 goto unordered_cmp;
5107
5108 case BUILT_IN_ISLESSGREATER:
5109 if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT)
5110 code = UNEQ_EXPR;
5111 else
5112 code = EQ_EXPR;
5113 goto unordered_cmp;
5114
5115 case BUILT_IN_ISUNORDERED:
5116 if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT)
5117 return integer_zero_node;
5118 code = UNORDERED_EXPR;
5119 goto unordered_cmp;
5120
5121 unordered_cmp:
5122 {
5123 tree arg0, arg1;
5124
5125 if (params == 0
5126 || TREE_CHAIN (params) == 0)
5127 {
5128 error ("too few arguments to function `%s'",
5129 IDENTIFIER_POINTER (DECL_NAME (function)));
5130 return error_mark_node;
5131 }
5132 else if (TREE_CHAIN (TREE_CHAIN (params)) != 0)
5133 {
5134 error ("too many arguments to function `%s'",
5135 IDENTIFIER_POINTER (DECL_NAME (function)));
5136 return error_mark_node;
5137 }
5138
5139 arg0 = TREE_VALUE (params);
5140 arg1 = TREE_VALUE (TREE_CHAIN (params));
5141 arg0 = build_binary_op (code, arg0, arg1, 0);
5142 if (code != UNORDERED_EXPR)
5143 arg0 = build_unary_op (TRUTH_NOT_EXPR, arg0, 0);
5144 return arg0;
5145 }
5146 break;
5147
5148 default:
5149 break;
5150 }
5151
5152 return NULL_TREE;
5153}
51444f0d 5154
a08e60ae 5155/* Returns non-zero if CODE is the code for a statement. */
5156
5157int
5158statement_code_p (code)
5159 enum tree_code code;
5160{
5161 switch (code)
5162 {
5163 case EXPR_STMT:
5164 case COMPOUND_STMT:
5165 case DECL_STMT:
5166 case IF_STMT:
5167 case FOR_STMT:
5168 case WHILE_STMT:
5169 case DO_STMT:
5170 case RETURN_STMT:
5171 case BREAK_STMT:
5172 case CONTINUE_STMT:
e41f0d80 5173 case SCOPE_STMT:
a08e60ae 5174 case SWITCH_STMT:
5175 case GOTO_STMT:
5176 case LABEL_STMT:
5177 case ASM_STMT:
5178 case CASE_LABEL:
5179 return 1;
5180
5181 default:
5182 if (lang_statement_code_p)
5183 return (*lang_statement_code_p) (code);
5184 return 0;
5185 }
5186}
5187
5188/* Walk the statemen tree, rooted at *tp. Apply FUNC to all the
5189 sub-trees of *TP in a pre-order traversal. FUNC is called with the
5190 DATA and the address of each sub-tree. If FUNC returns a non-NULL
5191 value, the traversal is aborted, and the value returned by FUNC is
5192 returned. If FUNC sets WALK_SUBTREES to zero, then the subtrees of
5193 the node being visited are not walked.
5194
5195 We don't need a without_duplicates variant of this one because the
5196 statement tree is a tree, not a graph. */
5197
5198tree
5199walk_stmt_tree (tp, func, data)
5200 tree *tp;
5201 walk_tree_fn func;
5202 void *data;
5203{
5204 enum tree_code code;
5205 int walk_subtrees;
5206 tree result;
5207 int i, len;
5208
5209#define WALK_SUBTREE(NODE) \
5210 do \
5211 { \
5212 result = walk_stmt_tree (&(NODE), func, data); \
5213 if (result) \
5214 return result; \
5215 } \
5216 while (0)
5217
5218 /* Skip empty subtrees. */
5219 if (!*tp)
5220 return NULL_TREE;
5221
5222 /* Skip subtrees below non-statement nodes. */
5223 if (!statement_code_p (TREE_CODE (*tp)))
5224 return NULL_TREE;
5225
5226 /* Call the function. */
5227 walk_subtrees = 1;
5228 result = (*func) (tp, &walk_subtrees, data);
5229
5230 /* If we found something, return it. */
5231 if (result)
5232 return result;
5233
5234 /* Even if we didn't, FUNC may have decided that there was nothing
5235 interesting below this point in the tree. */
5236 if (!walk_subtrees)
5237 return NULL_TREE;
5238
5239 /* FUNC may have modified the tree, recheck that we're looking at a
5240 statement node. */
5241 code = TREE_CODE (*tp);
5242 if (!statement_code_p (code))
5243 return NULL_TREE;
5244
5245 /* Walk over all the sub-trees of this operand. Statement nodes never
5246 contain RTL, and we needn't worry about TARGET_EXPRs. */
5247 len = TREE_CODE_LENGTH (code);
5248
5249 /* Go through the subtrees. We need to do this in forward order so
5250 that the scope of a FOR_EXPR is handled properly. */
5251 for (i = 0; i < len; ++i)
5252 WALK_SUBTREE (TREE_OPERAND (*tp, i));
5253
5254 /* Finally visit the chain. This can be tail-recursion optimized if
5255 we write it this way. */
5256 return walk_stmt_tree (&TREE_CHAIN (*tp), func, data);
5257
5258#undef WALK_SUBTREE
5259}
5260
e41f0d80 5261/* Used to compare case labels. K1 and K2 are actually tree nodes
5262 representing case labels, or NULL_TREE for a `default' label.
5263 Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
5264 K2, and 0 if K1 and K2 are equal. */
5265
5266int
5267case_compare (k1, k2)
5268 splay_tree_key k1;
5269 splay_tree_key k2;
5270{
5271 /* Consider a NULL key (such as arises with a `default' label) to be
5272 smaller than anything else. */
5273 if (!k1)
5274 return k2 ? -1 : 0;
5275 else if (!k2)
5276 return k1 ? 1 : 0;
5277
5278 return tree_int_cst_compare ((tree) k1, (tree) k2);
5279}
5280
5281/* Process a case label for the range LOW_VALUE ... HIGH_VALUE. If
5282 LOW_VALUE and HIGH_VALUE are both NULL_TREE then this case label is
5283 actually a `default' label. If only HIGH_VALUE is NULL_TREE, then
5284 case label was declared using the usual C/C++ syntax, rather than
5285 the GNU case range extension. CASES is a tree containing all the
5286 case ranges processed so far; COND is the condition for the
5287 switch-statement itself. Returns the CASE_LABEL created, or
5288 ERROR_MARK_NODE if no CASE_LABEL is created. */
5289
5290tree
5291c_add_case_label (cases, cond, low_value, high_value)
5292 splay_tree cases;
5293 tree cond;
5294 tree low_value;
5295 tree high_value;
5296{
5297 tree type;
5298 tree label;
5299 tree case_label;
5300 splay_tree_node node;
5301
5302 /* Create the LABEL_DECL itself. */
5303 label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
5304 DECL_CONTEXT (label) = current_function_decl;
5305
5306 /* If there was an error processing the switch condition, bail now
5307 before we get more confused. */
5308 if (!cond || cond == error_mark_node)
5309 {
5310 /* Add a label anyhow so that the back-end doesn't think that
5311 the beginning of the switch is unreachable. */
5312 if (!cases->root)
5313 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
5314 return error_mark_node;
5315 }
5316
5317 if ((low_value && TREE_TYPE (low_value)
5318 && POINTER_TYPE_P (TREE_TYPE (low_value)))
5319 || (high_value && TREE_TYPE (high_value)
5320 && POINTER_TYPE_P (TREE_TYPE (high_value))))
5321 error ("pointers are not permitted as case values");
5322
5323 /* Case ranges are a GNU extension. */
5324 if (high_value && pedantic)
5325 {
5326 if (c_language == clk_cplusplus)
5327 pedwarn ("ISO C++ forbids range expressions in switch statements");
5328 else
5329 pedwarn ("ISO C forbids range expressions in switch statements");
5330 }
5331
5332 type = TREE_TYPE (cond);
5333 if (low_value)
5334 {
5335 low_value = check_case_value (low_value);
5336 low_value = convert_and_check (type, low_value);
5337 }
5338 if (high_value)
5339 {
5340 high_value = check_case_value (high_value);
5341 high_value = convert_and_check (type, high_value);
5342 }
5343
5344 /* If an error has occurred, bail out now. */
5345 if (low_value == error_mark_node || high_value == error_mark_node)
5346 {
5347 if (!cases->root)
5348 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
5349 return error_mark_node;
5350 }
5351
5352 /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
5353 really a case range, even though it was written that way. Remove
5354 the HIGH_VALUE to simplify later processing. */
5355 if (tree_int_cst_equal (low_value, high_value))
5356 high_value = NULL_TREE;
5357 if (low_value && high_value
5358 && !tree_int_cst_lt (low_value, high_value))
5359 warning ("empty range specified");
5360
5361 /* Look up the LOW_VALUE in the table of case labels we already
5362 have. */
5363 node = splay_tree_lookup (cases, (splay_tree_key) low_value);
5364 /* If there was not an exact match, check for overlapping ranges.
5365 There's no need to do this if there's no LOW_VALUE or HIGH_VALUE;
5366 that's a `default' label and the only overlap is an exact match. */
5367 if (!node && (low_value || high_value))
5368 {
5369 splay_tree_node low_bound;
5370 splay_tree_node high_bound;
5371
5372 /* Even though there wasn't an exact match, there might be an
5373 overlap between this case range and another case range.
5374 Since we've (inductively) not allowed any overlapping case
5375 ranges, we simply need to find the greatest low case label
5376 that is smaller that LOW_VALUE, and the smallest low case
5377 label that is greater than LOW_VALUE. If there is an overlap
5378 it will occur in one of these two ranges. */
5379 low_bound = splay_tree_predecessor (cases,
5380 (splay_tree_key) low_value);
5381 high_bound = splay_tree_successor (cases,
5382 (splay_tree_key) low_value);
5383
5384 /* Check to see if the LOW_BOUND overlaps. It is smaller than
5385 the LOW_VALUE, so there is no need to check unless the
5386 LOW_BOUND is in fact itself a case range. */
5387 if (low_bound
5388 && CASE_HIGH ((tree) low_bound->value)
5389 && tree_int_cst_compare (CASE_HIGH ((tree) low_bound->value),
5390 low_value) >= 0)
5391 node = low_bound;
5392 /* Check to see if the HIGH_BOUND overlaps. The low end of that
5393 range is bigger than the low end of the current range, so we
5394 are only interested if the current range is a real range, and
5395 not an ordinary case label. */
5396 else if (high_bound
5397 && high_value
5398 && (tree_int_cst_compare ((tree) high_bound->key,
5399 high_value)
5400 <= 0))
5401 node = high_bound;
5402 }
5403 /* If there was an overlap, issue an error. */
5404 if (node)
5405 {
5406 tree duplicate = CASE_LABEL_DECL ((tree) node->value);
5407
5408 if (high_value)
5409 {
5410 error ("duplicate (or overlapping) case value");
5411 error_with_decl (duplicate,
5412 "this is the first entry overlapping that value");
5413 }
5414 else if (low_value)
5415 {
5416 error ("duplicate case value") ;
5417 error_with_decl (duplicate, "previously used here");
5418 }
5419 else
5420 {
5421 error ("multiple default labels in one switch");
5422 error_with_decl (duplicate, "this is the first default label");
5423 }
5424 if (!cases->root)
5425 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
5426 }
5427
5428 /* Add a CASE_LABEL to the statement-tree. */
5429 case_label = add_stmt (build_case_label (low_value, high_value, label));
5430 /* Register this case label in the splay tree. */
5431 splay_tree_insert (cases,
5432 (splay_tree_key) low_value,
5433 (splay_tree_value) case_label);
5434
5435 return case_label;
5436}
5437
5438/* Mark P (a stmt_tree) for GC. The use of a `void *' for the
5439 parameter allows this function to be used as a GC-marking
5440 function. */
5441
5442void
5443mark_stmt_tree (p)
5444 void *p;
5445{
5446 stmt_tree st = (stmt_tree) p;
5447
5448 ggc_mark_tree (st->x_last_stmt);
5449 ggc_mark_tree (st->x_last_expr_type);
5450}
5451
5452/* Mark LD for GC. */
5453
5454void
5455c_mark_lang_decl (c)
5456 struct c_lang_decl *c;
5457{
5458 ggc_mark_tree (c->saved_tree);
5459}
5460
5461/* Mark F for GC. */
5462
5463void
5464mark_c_language_function (f)
5465 struct language_function *f;
5466{
5467 if (!f)
5468 return;
5469
5470 mark_stmt_tree (&f->x_stmt_tree);
5471 ggc_mark_tree (f->x_scope_stmt_stack);
5472}
5473
5474/* Hook used by expand_expr to expand language-specific tree codes. */
5475
5476rtx
5477c_expand_expr (exp, target, tmode, modifier)
5478 tree exp;
5479 rtx target;
5480 enum machine_mode tmode;
5481 enum expand_modifier modifier;
5482{
5483 switch (TREE_CODE (exp))
5484 {
5485 case STMT_EXPR:
5486 {
5487 tree rtl_expr;
5488 rtx result;
5489
5490 /* Since expand_expr_stmt calls free_temp_slots after every
5491 expression statement, we must call push_temp_slots here.
5492 Otherwise, any temporaries in use now would be considered
5493 out-of-scope after the first EXPR_STMT from within the
5494 STMT_EXPR. */
5495 push_temp_slots ();
5496 rtl_expr = expand_start_stmt_expr ();
5497 expand_stmt (STMT_EXPR_STMT (exp));
5498 expand_end_stmt_expr (rtl_expr);
5499 result = expand_expr (rtl_expr, target, tmode, modifier);
5500 pop_temp_slots ();
5501 return result;
5502 }
5503 break;
5504
edbbe5ca 5505 case CALL_EXPR:
5506 {
5507 if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
5508 && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
5509 == FUNCTION_DECL)
5510 && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
5511 && (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
5512 == BUILT_IN_FRONTEND))
5513 return c_expand_builtin (exp, target, tmode, modifier);
5514 else
5515 abort();
5516 }
5517 break;
5518
e41f0d80 5519 default:
5520 abort ();
5521 }
5522
5523 abort ();
5524 return NULL;
5525}
5526
5527/* Hook used by safe_from_p to handle language-specific tree codes. */
5528
5529int
5530c_safe_from_p (target, exp)
5531 rtx target;
5532 tree exp;
5533{
5534 /* We can see statements here when processing the body of a
5535 statement-expression. For a declaration statement declaring a
5536 variable, look at the variable's initializer. */
5537 if (TREE_CODE (exp) == DECL_STMT)
5538 {
5539 tree decl = DECL_STMT_DECL (exp);
5540
5541 if (TREE_CODE (decl) == VAR_DECL
5542 && DECL_INITIAL (decl)
5543 && !safe_from_p (target, DECL_INITIAL (decl), /*top_p=*/0))
5544 return 0;
5545 }
5546
5547 /* For any statement, we must follow the statement-chain. */
5548 if (statement_code_p (TREE_CODE (exp)) && TREE_CHAIN (exp))
5549 return safe_from_p (target, TREE_CHAIN (exp), /*top_p=*/0);
5550
5551 /* Assume everything else is safe. */
5552 return 1;
5553}
5554
51444f0d 5555/* Tree code classes. */
5556
5557#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
5558
5559static char c_tree_code_type[] = {
5560 'x',
5561#include "c-common.def"
5562};
5563#undef DEFTREECODE
5564
5565/* Table indexed by tree code giving number of expression
5566 operands beyond the fixed part of the node structure.
5567 Not used for types or decls. */
5568
5569#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
5570
5571static int c_tree_code_length[] = {
5572 0,
5573#include "c-common.def"
5574};
5575#undef DEFTREECODE
5576
5577/* Names of tree components.
5578 Used for printing out the tree and error messages. */
5579#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
5580
5581static const char *c_tree_code_name[] = {
5582 "@@dummy",
5583#include "c-common.def"
5584};
5585#undef DEFTREECODE
5586
5587/* Adds the tree codes specific to the C front end to the list of all
5588 tree codes. */
5589
5590void
0d4607e8 5591add_c_tree_codes ()
51444f0d 5592{
5593 memcpy (tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE,
5594 c_tree_code_type,
5595 (int)LAST_C_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE);
5596 memcpy (tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE,
5597 c_tree_code_length,
5598 (LAST_C_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int));
5599 memcpy (tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE,
5600 c_tree_code_name,
5601 (LAST_C_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
5602}
edbbe5ca 5603
5604#define CALLED_AS_BUILT_IN(NODE) \
5605 (!strncmp (IDENTIFIER_POINTER (DECL_NAME (NODE)), "__builtin_", 10))
5606
5607static rtx
5608c_expand_builtin (exp, target, tmode, modifier)
5609 tree exp;
5610 rtx target;
5611 enum machine_mode tmode;
5612 enum expand_modifier modifier;
5613{
5614 tree type = TREE_TYPE (exp);
5615 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5616 tree arglist = TREE_OPERAND (exp, 1);
5617 enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
5618 enum tree_code code = TREE_CODE (exp);
5619 const int ignore = (target == const0_rtx
5620 || ((code == NON_LVALUE_EXPR || code == NOP_EXPR
5621 || code == CONVERT_EXPR || code == REFERENCE_EXPR
5622 || code == COND_EXPR)
5623 && TREE_CODE (type) == VOID_TYPE));
5624
5625 if (! optimize && ! CALLED_AS_BUILT_IN (fndecl))
5626 return expand_call (exp, target, ignore);
5627
5628 switch (fcode)
5629 {
5630 case BUILT_IN_PRINTF:
5631 target = c_expand_builtin_printf (arglist, target, tmode,
5632 modifier, ignore);
5633 if (target)
5634 return target;
5635 break;
5636
5637 default: /* just do library call, if unknown builtin */
5638 error ("built-in function `%s' not currently supported",
5639 IDENTIFIER_POINTER (DECL_NAME (fndecl)));
5640 }
5641
5642 /* The switch statement above can drop through to cause the function
5643 to be called normally. */
5644 return expand_call (exp, target, ignore);
5645}
5646
5647/* Check an arglist to *printf for problems. The arglist should start
5648 at the format specifier, with the remaining arguments immediately
5649 following it. */
5650static int
5651is_valid_printf_arglist (arglist)
5652 tree arglist;
5653{
5654 /* Save this value so we can restore it later. */
5655 const int SAVE_pedantic = pedantic;
5656 int diagnostic_occurred = 0;
5657
5658 /* Set this to a known value so the user setting won't affect code
5659 generation. */
5660 pedantic = 1;
5661 /* Check to make sure there are no format specifier errors. */
5662 check_function_format (&diagnostic_occurred,
5663 maybe_get_identifier("printf"),
5664 NULL_TREE, arglist);
5665
5666 /* Restore the value of `pedantic'. */
5667 pedantic = SAVE_pedantic;
5668
5669 /* If calling `check_function_format_ptr' produces a warning, we
5670 return false, otherwise we return true. */
5671 return ! diagnostic_occurred;
5672}
5673
5674/* If the arguments passed to printf are suitable for optimizations,
5675 we attempt to transform the call. */
5676static rtx
5677c_expand_builtin_printf (arglist, target, tmode, modifier, ignore)
5678 tree arglist;
5679 rtx target;
5680 enum machine_mode tmode;
5681 enum expand_modifier modifier;
5682 int ignore;
5683{
5684 tree fn_putchar = built_in_decls[BUILT_IN_PUTCHAR],
5685 fn_puts = built_in_decls[BUILT_IN_PUTS];
5686 tree fn, format_arg, stripped_string;
5687
5688 /* If the return value is used, or the replacement _DECL isn't
5689 initialized, don't do the transformation. */
5690 if (!ignore || !fn_putchar || !fn_puts)
5691 return 0;
5692
5693 /* Verify the required arguments in the original call. */
5694 if (arglist == 0
5695 || (TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE))
5696 return 0;
5697
5698 /* Check the specifier vs. the parameters. */
5699 if (!is_valid_printf_arglist (arglist))
5700 return 0;
5701
5702 format_arg = TREE_VALUE (arglist);
5703 stripped_string = format_arg;
5704 STRIP_NOPS (stripped_string);
5705 if (stripped_string && TREE_CODE (stripped_string) == ADDR_EXPR)
5706 stripped_string = TREE_OPERAND (stripped_string, 0);
5707
5708 /* If the format specifier isn't a STRING_CST, punt. */
5709 if (TREE_CODE (stripped_string) != STRING_CST)
5710 return 0;
5711
5712 /* OK! We can attempt optimization. */
5713
5714 /* If the format specifier was "%s\n", call __builtin_puts(arg2). */
5715 if (strcmp (TREE_STRING_POINTER (stripped_string), "%s\n") == 0)
5716 {
5717 arglist = TREE_CHAIN (arglist);
5718 fn = fn_puts;
5719 }
5720 /* If the format specifier was "%c", call __builtin_putchar (arg2). */
5721 else if (strcmp (TREE_STRING_POINTER (stripped_string), "%c") == 0)
5722 {
5723 arglist = TREE_CHAIN (arglist);
5724 fn = fn_putchar;
5725 }
5726 else
5727 {
5728 /* We can't handle anything else with % args or %% ... yet. */
5729 if (strchr (TREE_STRING_POINTER (stripped_string), '%'))
5730 return 0;
5731
5732 /* If the resulting constant string has a length of 1, call
5733 putchar. Note, TREE_STRING_LENGTH includes the terminating
5734 NULL in its count. */
5735 if (TREE_STRING_LENGTH (stripped_string) == 2)
5736 {
5737 /* Given printf("c"), (where c is any one character,)
5738 convert "c"[0] to an int and pass that to the replacement
5739 function. */
5740 arglist = build_int_2 (TREE_STRING_POINTER (stripped_string)[0], 0);
5741 arglist = build_tree_list (NULL_TREE, arglist);
5742
5743 fn = fn_putchar;
5744 }
5745 /* If the resulting constant was "string\n", call
5746 __builtin_puts("string"). Ensure "string" has at least one
5747 character besides the trailing \n. Note, TREE_STRING_LENGTH
5748 includes the terminating NULL in its count. */
5749 else if (TREE_STRING_LENGTH (stripped_string) > 2
5750 && TREE_STRING_POINTER (stripped_string)
5751 [TREE_STRING_LENGTH (stripped_string) - 2] == '\n')
5752 {
5753 /* Create a NULL-terminated string that's one char shorter
5754 than the original, stripping off the trailing '\n'. */
5755 const int newlen = TREE_STRING_LENGTH (stripped_string) - 1;
5756 char *newstr = (char *) alloca (newlen);
5757 memcpy (newstr, TREE_STRING_POINTER (stripped_string), newlen - 1);
5758 newstr[newlen - 1] = 0;
5759
d2e881a7 5760 arglist = combine_strings (build_string (newlen, newstr));
edbbe5ca 5761 arglist = build_tree_list (NULL_TREE, arglist);
5762 fn = fn_puts;
5763 }
5764 else
5765 /* We'd like to arrange to call fputs(string) here, but we
5766 need stdout and don't have a way to get it ... yet. */
5767 return 0;
5768 }
5769
5770 return expand_expr (build_function_call (fn, arglist),
5771 (ignore ? const0_rtx : target),
5772 tmode, modifier);
5773}