./
[official-gcc.git] / gcc / c-pretty-print.c
blob699977a08c3a546d16d4b4eec3c2c7467ec758e3
1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "real.h"
27 #include "c-pretty-print.h"
28 #include "c-tree.h"
29 #include "tree-iterator.h"
30 #include "diagnostic.h"
32 /* The pretty-printer code is primarily designed to closely follow
33 (GNU) C and C++ grammars. That is to be contrasted with spaghetti
34 codes we used to have in the past. Following a structured
35 approach (preferably the official grammars) is believed to make it
36 much easier to add extensions and nifty pretty-printing effects that
37 takes expression or declaration contexts into account. */
40 #define pp_c_maybe_whitespace(PP) \
41 do { \
42 if (pp_base (PP)->padding == pp_before) \
43 pp_c_whitespace (PP); \
44 } while (0)
46 /* literal */
47 static void pp_c_char (c_pretty_printer *, int);
49 /* postfix-expression */
50 static void pp_c_initializer_list (c_pretty_printer *, tree);
51 static void pp_c_brace_enclosed_initializer_list (c_pretty_printer *, tree);
53 static void pp_c_multiplicative_expression (c_pretty_printer *, tree);
54 static void pp_c_additive_expression (c_pretty_printer *, tree);
55 static void pp_c_shift_expression (c_pretty_printer *, tree);
56 static void pp_c_relational_expression (c_pretty_printer *, tree);
57 static void pp_c_equality_expression (c_pretty_printer *, tree);
58 static void pp_c_and_expression (c_pretty_printer *, tree);
59 static void pp_c_exclusive_or_expression (c_pretty_printer *, tree);
60 static void pp_c_inclusive_or_expression (c_pretty_printer *, tree);
61 static void pp_c_logical_and_expression (c_pretty_printer *, tree);
62 static void pp_c_conditional_expression (c_pretty_printer *, tree);
63 static void pp_c_assignment_expression (c_pretty_printer *, tree);
65 /* declarations. */
68 /* Helper functions. */
70 void
71 pp_c_whitespace (c_pretty_printer *pp)
73 pp_space (pp);
74 pp_base (pp)->padding = pp_none;
77 void
78 pp_c_left_paren (c_pretty_printer *pp)
80 pp_left_paren (pp);
81 pp_base (pp)->padding = pp_none;
84 void
85 pp_c_right_paren (c_pretty_printer *pp)
87 pp_right_paren (pp);
88 pp_base (pp)->padding = pp_none;
91 void
92 pp_c_left_brace (c_pretty_printer *pp)
94 pp_left_brace (pp);
95 pp_base (pp)->padding = pp_none;
98 void
99 pp_c_right_brace (c_pretty_printer *pp)
101 pp_right_brace (pp);
102 pp_base (pp)->padding = pp_none;
105 void
106 pp_c_left_bracket (c_pretty_printer *pp)
108 pp_left_bracket (pp);
109 pp_base (pp)->padding = pp_none;
112 void
113 pp_c_right_bracket (c_pretty_printer *pp)
115 pp_right_bracket (pp);
116 pp_base (pp)->padding = pp_none;
119 void
120 pp_c_dot (c_pretty_printer *pp)
122 pp_dot (pp);
123 pp_base (pp)->padding = pp_none;
126 void
127 pp_c_ampersand (c_pretty_printer *pp)
129 pp_ampersand (pp);
130 pp_base (pp)->padding = pp_none;
133 void
134 pp_c_star (c_pretty_printer *pp)
136 pp_star (pp);
137 pp_base (pp)->padding = pp_none;
140 void
141 pp_c_arrow (c_pretty_printer *pp)
143 pp_arrow (pp);
144 pp_base (pp)->padding = pp_none;
147 void
148 pp_c_semicolon (c_pretty_printer *pp)
150 pp_semicolon (pp);
151 pp_base (pp)->padding = pp_none;
154 void
155 pp_c_complement (c_pretty_printer *pp)
157 pp_complement (pp);
158 pp_base (pp)->padding = pp_none;
161 void
162 pp_c_exclamation (c_pretty_printer *pp)
164 pp_exclamation (pp);
165 pp_base (pp)->padding = pp_none;
168 /* Print out the external representation of CV-QUALIFIER. */
170 static void
171 pp_c_cv_qualifier (c_pretty_printer *pp, const char *cv)
173 const char *p = pp_last_position_in_text (pp);
174 /* The C programming language does not have references, but it is much
175 simpler to handle those here rather than going through the same
176 logic in the C++ pretty-printer. */
177 if (p != NULL && (*p == '*' || *p == '&'))
178 pp_c_whitespace (pp);
179 pp_c_identifier (pp, cv);
182 /* Pretty-print T using the type-cast notation '( type-name )'. */
184 static void
185 pp_c_type_cast (c_pretty_printer *pp, tree t)
187 pp_c_left_paren (pp);
188 pp_type_id (pp, t);
189 pp_c_right_paren (pp);
192 /* We're about to pretty-print a pointer type as indicated by T.
193 Output a whitespace, if needed, preparing for subsequent output. */
195 void
196 pp_c_space_for_pointer_operator (c_pretty_printer *pp, tree t)
198 if (POINTER_TYPE_P (t))
200 tree pointee = strip_pointer_operator (TREE_TYPE (t));
201 if (TREE_CODE (pointee) != ARRAY_TYPE
202 && TREE_CODE (pointee) != FUNCTION_TYPE)
203 pp_c_whitespace (pp);
208 /* Declarations. */
210 /* C++ cv-qualifiers are called type-qualifiers in C. Print out the
211 cv-qualifiers of T. If T is a declaration then it is the cv-qualifier
212 of its type. Take care of possible extensions.
214 type-qualifier-list:
215 type-qualifier
216 type-qualifier-list type-qualifier
218 type-qualifier:
219 const
220 restrict -- C99
221 __restrict__ -- GNU C
222 volatile */
224 void
225 pp_c_type_qualifier_list (c_pretty_printer *pp, tree t)
227 int qualifiers;
229 if (!TYPE_P (t))
230 t = TREE_TYPE (t);
232 qualifiers = TYPE_QUALS (t);
233 if (qualifiers & TYPE_QUAL_CONST)
234 pp_c_cv_qualifier (pp, "const");
235 if (qualifiers & TYPE_QUAL_VOLATILE)
236 pp_c_cv_qualifier (pp, "volatile");
237 if (qualifiers & TYPE_QUAL_RESTRICT)
238 pp_c_cv_qualifier (pp, flag_isoc99 ? "restrict" : "__restrict__");
241 /* pointer:
242 * type-qualifier-list(opt)
243 * type-qualifier-list(opt) pointer */
245 static void
246 pp_c_pointer (c_pretty_printer *pp, tree t)
248 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
249 t = TREE_TYPE (t);
250 switch (TREE_CODE (t))
252 case POINTER_TYPE:
253 /* It is easier to handle C++ reference types here. */
254 case REFERENCE_TYPE:
255 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
256 pp_c_pointer (pp, TREE_TYPE (t));
257 if (TREE_CODE (t) == POINTER_TYPE)
258 pp_c_star (pp);
259 else
260 pp_c_ampersand (pp);
261 pp_c_type_qualifier_list (pp, t);
262 break;
264 /* ??? This node is now in GENERIC and so shouldn't be here. But
265 we'll fix that later. */
266 case DECL_EXPR:
267 pp_declaration (pp, DECL_EXPR_DECL (t));
268 pp_needs_newline (pp) = true;
269 break;
271 default:
272 pp_unsupported_tree (pp, t);
276 /* type-specifier:
277 void
278 char
279 short
281 long
282 float
283 double
284 signed
285 unsigned
286 _Bool -- C99
287 _Complex -- C99
288 _Imaginary -- C99
289 struct-or-union-specifier
290 enum-specifier
291 typedef-name.
293 GNU extensions.
294 simple-type-specifier:
295 __complex__
296 __vector__ */
298 void
299 pp_c_type_specifier (c_pretty_printer *pp, tree t)
301 const enum tree_code code = TREE_CODE (t);
302 switch (code)
304 case ERROR_MARK:
305 pp_c_identifier (pp, "<type-error>");
306 break;
308 case IDENTIFIER_NODE:
309 pp_c_tree_decl_identifier (pp, t);
310 break;
312 case VOID_TYPE:
313 case BOOLEAN_TYPE:
314 case CHAR_TYPE:
315 case INTEGER_TYPE:
316 case REAL_TYPE:
317 if (TYPE_NAME (t))
318 t = TYPE_NAME (t);
319 else
320 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
321 pp_c_type_specifier (pp, t);
322 break;
324 case TYPE_DECL:
325 if (DECL_NAME (t))
326 pp_id_expression (pp, t);
327 else
328 pp_c_identifier (pp, "<typedef-error>");
329 break;
331 case UNION_TYPE:
332 case RECORD_TYPE:
333 case ENUMERAL_TYPE:
334 if (code == UNION_TYPE)
335 pp_c_identifier (pp, "union");
336 else if (code == RECORD_TYPE)
337 pp_c_identifier (pp, "struct");
338 else if (code == ENUMERAL_TYPE)
339 pp_c_identifier (pp, "enum");
340 else
341 pp_c_identifier (pp, "<tag-error>");
343 if (TYPE_NAME (t))
344 pp_id_expression (pp, TYPE_NAME (t));
345 else
346 pp_c_identifier (pp, "<anonymous>");
347 break;
349 default:
350 pp_unsupported_tree (pp, t);
351 break;
355 /* specifier-qualifier-list:
356 type-specifier specifier-qualifier-list-opt
357 type-qualifier specifier-qualifier-list-opt
360 Implementation note: Because of the non-linearities in array or
361 function declarations, this routine prints not just the
362 specifier-qualifier-list of such entities or types of such entities,
363 but also the 'pointer' production part of their declarators. The
364 remaining part is done by pp_declarator or pp_c_abstract_declarator. */
366 void
367 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
369 const enum tree_code code = TREE_CODE (t);
371 if (TREE_CODE (t) != POINTER_TYPE)
372 pp_c_type_qualifier_list (pp, t);
373 switch (code)
375 case REFERENCE_TYPE:
376 case POINTER_TYPE:
378 /* Get the types-specifier of this type. */
379 tree pointee = strip_pointer_operator (TREE_TYPE (t));
380 pp_c_specifier_qualifier_list (pp, pointee);
381 if (TREE_CODE (pointee) == ARRAY_TYPE
382 || TREE_CODE (pointee) == FUNCTION_TYPE)
384 pp_c_whitespace (pp);
385 pp_c_left_paren (pp);
387 else if (!c_dialect_cxx ())
388 pp_c_whitespace (pp);
389 pp_ptr_operator (pp, t);
391 break;
393 case FUNCTION_TYPE:
394 case ARRAY_TYPE:
395 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
396 break;
398 case VECTOR_TYPE:
399 case COMPLEX_TYPE:
400 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
401 if (code == COMPLEX_TYPE)
402 pp_c_identifier (pp, flag_isoc99 ? "_Complex" : "__complex__");
403 else if (code == VECTOR_TYPE)
404 pp_c_identifier (pp, "__vector__");
405 break;
407 default:
408 pp_simple_type_specifier (pp, t);
409 break;
413 /* parameter-type-list:
414 parameter-list
415 parameter-list , ...
417 parameter-list:
418 parameter-declaration
419 parameter-list , parameter-declaration
421 parameter-declaration:
422 declaration-specifiers declarator
423 declaration-specifiers abstract-declarator(opt) */
425 void
426 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
428 bool want_parm_decl = DECL_P (t) && !(pp->flags & pp_c_flag_abstract);
429 tree parms = want_parm_decl ? DECL_ARGUMENTS (t) : TYPE_ARG_TYPES (t);
430 pp_c_left_paren (pp);
431 if (parms == void_list_node)
432 pp_c_identifier (pp, "void");
433 else
435 bool first = true;
436 for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
438 if (!first)
439 pp_separate_with (pp, ',');
440 first = false;
441 pp_declaration_specifiers
442 (pp, want_parm_decl ? parms : TREE_VALUE (parms));
443 if (want_parm_decl)
444 pp_declarator (pp, parms);
445 else
446 pp_abstract_declarator (pp, TREE_VALUE (parms));
449 pp_c_right_paren (pp);
452 /* abstract-declarator:
453 pointer
454 pointer(opt) direct-abstract-declarator */
456 static void
457 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
459 if (TREE_CODE (t) == POINTER_TYPE)
461 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
462 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
463 pp_c_right_paren (pp);
464 t = TREE_TYPE (t);
467 pp_direct_abstract_declarator (pp, t);
470 /* direct-abstract-declarator:
471 ( abstract-declarator )
472 direct-abstract-declarator(opt) [ assignment-expression(opt) ]
473 direct-abstract-declarator(opt) [ * ]
474 direct-abstract-declarator(opt) ( parameter-type-list(opt) ) */
476 void
477 pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
479 switch (TREE_CODE (t))
481 case POINTER_TYPE:
482 pp_abstract_declarator (pp, t);
483 break;
485 case FUNCTION_TYPE:
486 pp_c_parameter_type_list (pp, t);
487 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
488 break;
490 case ARRAY_TYPE:
491 pp_c_left_bracket (pp);
492 if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
493 pp_expression (pp, TYPE_MAX_VALUE (TYPE_DOMAIN (t)));
494 pp_c_right_bracket (pp);
495 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
496 break;
498 case IDENTIFIER_NODE:
499 case VOID_TYPE:
500 case BOOLEAN_TYPE:
501 case INTEGER_TYPE:
502 case REAL_TYPE:
503 case ENUMERAL_TYPE:
504 case RECORD_TYPE:
505 case UNION_TYPE:
506 case VECTOR_TYPE:
507 case COMPLEX_TYPE:
508 case TYPE_DECL:
509 break;
511 default:
512 pp_unsupported_tree (pp, t);
513 break;
517 /* type-name:
518 specifier-qualifier-list abstract-declarator(opt) */
520 void
521 pp_c_type_id (c_pretty_printer *pp, tree t)
523 pp_c_specifier_qualifier_list (pp, t);
524 pp_abstract_declarator (pp, t);
527 /* storage-class-specifier:
528 typedef
529 extern
530 static
531 auto
532 register */
534 void
535 pp_c_storage_class_specifier (c_pretty_printer *pp, tree t)
537 if (TREE_CODE (t) == TYPE_DECL)
538 pp_c_identifier (pp, "typedef");
539 else if (DECL_P (t))
541 if (DECL_REGISTER (t))
542 pp_c_identifier (pp, "register");
543 else if (TREE_STATIC (t) && TREE_CODE (t) == VAR_DECL)
544 pp_c_identifier (pp, "static");
548 /* function-specifier:
549 inline */
551 void
552 pp_c_function_specifier (c_pretty_printer *pp, tree t)
554 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
555 pp_c_identifier (pp, "inline");
558 /* declaration-specifiers:
559 storage-class-specifier declaration-specifiers(opt)
560 type-specifier declaration-specifiers(opt)
561 type-qualifier declaration-specifiers(opt)
562 function-specifier declaration-specifiers(opt) */
564 void
565 pp_c_declaration_specifiers (c_pretty_printer *pp, tree t)
567 pp_storage_class_specifier (pp, t);
568 pp_function_specifier (pp, t);
569 pp_c_specifier_qualifier_list (pp, DECL_P (t) ? TREE_TYPE (t) : t);
572 /* direct-declarator
573 identifier
574 ( declarator )
575 direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
576 direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
577 direct-declarator [ type-qualifier-list static assignment-expression ]
578 direct-declarator [ type-qualifier-list * ]
579 direct-declarator ( parameter-type-list )
580 direct-declarator ( identifier-list(opt) ) */
582 void
583 pp_c_direct_declarator (c_pretty_printer *pp, tree t)
585 switch (TREE_CODE (t))
587 case VAR_DECL:
588 case PARM_DECL:
589 case TYPE_DECL:
590 case FIELD_DECL:
591 case LABEL_DECL:
592 pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
593 pp_c_tree_decl_identifier (pp, t);
594 break;
596 case ARRAY_TYPE:
597 case POINTER_TYPE:
598 pp_abstract_declarator (pp, TREE_TYPE (t));
599 break;
601 case FUNCTION_TYPE:
602 pp_parameter_list (pp, t);
603 pp_abstract_declarator (pp, TREE_TYPE (t));
604 break;
606 case FUNCTION_DECL:
607 pp_c_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
608 pp_c_tree_decl_identifier (pp, t);
609 if (pp_c_base (pp)->flags & pp_c_flag_abstract)
610 pp_abstract_declarator (pp, TREE_TYPE (t));
611 else
613 pp_parameter_list (pp, t);
614 pp_abstract_declarator (pp, TREE_TYPE (TREE_TYPE (t)));
616 break;
618 case INTEGER_TYPE:
619 case REAL_TYPE:
620 case ENUMERAL_TYPE:
621 case UNION_TYPE:
622 case RECORD_TYPE:
623 break;
625 default:
626 pp_unsupported_tree (pp, t);
627 break;
632 /* declarator:
633 pointer(opt) direct-declarator */
635 void
636 pp_c_declarator (c_pretty_printer *pp, tree t)
638 switch (TREE_CODE (t))
640 case INTEGER_TYPE:
641 case REAL_TYPE:
642 case ENUMERAL_TYPE:
643 case UNION_TYPE:
644 case RECORD_TYPE:
645 break;
647 case VAR_DECL:
648 case PARM_DECL:
649 case FIELD_DECL:
650 case ARRAY_TYPE:
651 case FUNCTION_TYPE:
652 case FUNCTION_DECL:
653 case TYPE_DECL:
654 pp_direct_declarator (pp, t);
655 break;
658 default:
659 pp_unsupported_tree (pp, t);
660 break;
664 /* declaration:
665 declaration-specifiers init-declarator-list(opt) ; */
667 void
668 pp_c_declaration (c_pretty_printer *pp, tree t)
670 pp_declaration_specifiers (pp, t);
671 pp_c_init_declarator (pp, t);
674 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
676 void
677 pp_c_attributes (c_pretty_printer *pp, tree attributes)
679 if (attributes == NULL_TREE)
680 return;
682 pp_c_identifier (pp, "__attribute__");
683 pp_c_left_paren (pp);
684 pp_c_left_paren (pp);
685 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
687 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
688 if (TREE_VALUE (attributes))
689 pp_c_call_argument_list (pp, TREE_VALUE (attributes));
691 if (TREE_CHAIN (attributes))
692 pp_separate_with (pp, ',');
694 pp_c_right_paren (pp);
695 pp_c_right_paren (pp);
698 /* function-definition:
699 declaration-specifiers declarator compound-statement */
701 void
702 pp_c_function_definition (c_pretty_printer *pp, tree t)
704 pp_declaration_specifiers (pp, t);
705 pp_declarator (pp, t);
706 pp_needs_newline (pp) = true;
707 pp_statement (pp, DECL_SAVED_TREE (t));
708 pp_newline (pp);
709 pp_flush (pp);
713 /* Expressions. */
715 /* Print out a c-char. This is called solely for characters which are
716 in the *target* execution character set. We ought to convert them
717 back to the *host* execution character set before printing, but we
718 have no way to do this at present. A decent compromise is to print
719 all characters as if they were in the host execution character set,
720 and not attempt to recover any named escape characters, but render
721 all unprintables as octal escapes. If the host and target character
722 sets are the same, this produces relatively readable output. If they
723 are not the same, strings may appear as gibberish, but that's okay
724 (in fact, it may well be what the reader wants, e.g. if they are looking
725 to see if conversion to the target character set happened correctly).
727 A special case: we need to prefix \, ", and ' with backslashes. It is
728 correct to do so for the *host*'s \, ", and ', because the rest of the
729 file appears in the host character set. */
731 static void
732 pp_c_char (c_pretty_printer *pp, int c)
734 if (ISPRINT (c))
736 switch (c)
738 case '\\': pp_string (pp, "\\\\"); break;
739 case '\'': pp_string (pp, "\\\'"); break;
740 case '\"': pp_string (pp, "\\\""); break;
741 default: pp_character (pp, c);
744 else
745 pp_scalar (pp, "\\%03o", (unsigned) c);
748 /* Print out a STRING literal. */
750 void
751 pp_c_string_literal (c_pretty_printer *pp, tree s)
753 const char *p = TREE_STRING_POINTER (s);
754 int n = TREE_STRING_LENGTH (s) - 1;
755 int i;
756 pp_doublequote (pp);
757 for (i = 0; i < n; ++i)
758 pp_c_char (pp, p[i]);
759 pp_doublequote (pp);
762 /* Pretty-print an INTEGER literal. */
764 static void
765 pp_c_integer_constant (c_pretty_printer *pp, tree i)
767 tree type = TREE_TYPE (i);
769 if (TREE_INT_CST_HIGH (i) == 0)
770 pp_wide_integer (pp, TREE_INT_CST_LOW (i));
771 else
773 if (tree_int_cst_sgn (i) < 0)
775 pp_character (pp, '-');
776 i = build_int_cst_wide (NULL_TREE,
777 -TREE_INT_CST_LOW (i),
778 ~TREE_INT_CST_HIGH (i)
779 + !TREE_INT_CST_LOW (i));
781 sprintf (pp_buffer (pp)->digit_buffer,
782 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
783 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
784 pp_string (pp, pp_buffer (pp)->digit_buffer);
786 if (TYPE_UNSIGNED (type))
787 pp_character (pp, 'u');
788 if (type == long_integer_type_node || type == long_unsigned_type_node)
789 pp_character (pp, 'l');
790 else if (type == long_long_integer_type_node
791 || type == long_long_unsigned_type_node)
792 pp_string (pp, "ll");
795 /* Print out a CHARACTER literal. */
797 static void
798 pp_c_character_constant (c_pretty_printer *pp, tree c)
800 tree type = TREE_TYPE (c);
801 if (type == wchar_type_node)
802 pp_character (pp, 'L');
803 pp_quote (pp);
804 if (host_integerp (c, TYPE_UNSIGNED (type)))
805 pp_c_char (pp, tree_low_cst (c, TYPE_UNSIGNED (type)));
806 else
807 pp_scalar (pp, "\\x%x", (unsigned) TREE_INT_CST_LOW (c));
808 pp_quote (pp);
811 /* Print out a BOOLEAN literal. */
813 static void
814 pp_c_bool_constant (c_pretty_printer *pp, tree b)
816 if (b == boolean_false_node)
818 if (c_dialect_cxx ())
819 pp_c_identifier (pp, "false");
820 else if (flag_isoc99)
821 pp_c_identifier (pp, "_False");
822 else
823 pp_unsupported_tree (pp, b);
825 else if (b == boolean_true_node)
827 if (c_dialect_cxx ())
828 pp_c_identifier (pp, "true");
829 else if (flag_isoc99)
830 pp_c_identifier (pp, "_True");
831 else
832 pp_unsupported_tree (pp, b);
834 else if (TREE_CODE (b) == INTEGER_CST)
835 pp_c_integer_constant (pp, b);
836 else
837 pp_unsupported_tree (pp, b);
840 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
841 false; that means the value was obtained by a cast, in which case
842 print out the type-id part of the cast-expression -- the casted value
843 is then printed by pp_c_integer_literal. */
845 static bool
846 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
848 bool value_is_named = true;
849 tree type = TREE_TYPE (e);
850 tree value;
852 /* Find the name of this constant. */
853 for (value = TYPE_VALUES (type);
854 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
855 value = TREE_CHAIN (value))
858 if (value != NULL_TREE)
859 pp_id_expression (pp, TREE_PURPOSE (value));
860 else
862 /* Value must have been cast. */
863 pp_c_type_cast (pp, type);
864 value_is_named = false;
867 return value_is_named;
870 /* Print out a REAL value as a decimal-floating-constant. */
872 static void
873 pp_c_floating_constant (c_pretty_printer *pp, tree r)
875 real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
876 sizeof (pp_buffer (pp)->digit_buffer), 0, 1);
877 pp_string (pp, pp_buffer(pp)->digit_buffer);
878 if (TREE_TYPE (r) == float_type_node)
879 pp_character (pp, 'f');
880 else if (TREE_TYPE (r) == long_double_type_node)
881 pp_character (pp, 'l');
884 /* Pretty-print a compound literal expression. GNU extensions include
885 vector constants. */
887 static void
888 pp_c_compound_literal (c_pretty_printer *pp, tree e)
890 tree type = TREE_TYPE (e);
891 pp_c_type_cast (pp, type);
893 switch (TREE_CODE (type))
895 case RECORD_TYPE:
896 case UNION_TYPE:
897 case ARRAY_TYPE:
898 case VECTOR_TYPE:
899 case COMPLEX_TYPE:
900 pp_c_brace_enclosed_initializer_list (pp, e);
901 break;
903 default:
904 pp_unsupported_tree (pp, e);
905 break;
909 /* constant:
910 integer-constant
911 floating-constant
912 enumeration-constant
913 character-constant */
915 void
916 pp_c_constant (c_pretty_printer *pp, tree e)
918 const enum tree_code code = TREE_CODE (e);
920 switch (code)
922 case INTEGER_CST:
924 tree type = TREE_TYPE (e);
925 if (type == boolean_type_node)
926 pp_c_bool_constant (pp, e);
927 else if (type == char_type_node)
928 pp_c_character_constant (pp, e);
929 else if (TREE_CODE (type) == ENUMERAL_TYPE
930 && pp_c_enumeration_constant (pp, e))
932 else
933 pp_c_integer_constant (pp, e);
935 break;
937 case REAL_CST:
938 pp_c_floating_constant (pp, e);
939 break;
941 case STRING_CST:
942 pp_c_string_literal (pp, e);
943 break;
945 default:
946 pp_unsupported_tree (pp, e);
947 break;
951 /* Pretty-print an IDENTIFIER_NODE, preceded by whitespace is necessary. */
953 void
954 pp_c_identifier (c_pretty_printer *pp, const char *id)
956 pp_c_maybe_whitespace (pp);
957 pp_identifier (pp, id);
958 pp_base (pp)->padding = pp_before;
961 /* Pretty-print a C primary-expression.
962 primary-expression:
963 identifier
964 constant
965 string-literal
966 ( expression ) */
968 void
969 pp_c_primary_expression (c_pretty_printer *pp, tree e)
971 switch (TREE_CODE (e))
973 case VAR_DECL:
974 case PARM_DECL:
975 case FIELD_DECL:
976 case CONST_DECL:
977 case FUNCTION_DECL:
978 case LABEL_DECL:
979 pp_c_tree_decl_identifier (pp, e);
980 break;
982 case IDENTIFIER_NODE:
983 pp_c_tree_identifier (pp, e);
984 break;
986 case ERROR_MARK:
987 pp_c_identifier (pp, "<erroneous-expression>");
988 break;
990 case RESULT_DECL:
991 pp_c_identifier (pp, "<return-value>");
992 break;
994 case INTEGER_CST:
995 case REAL_CST:
996 case STRING_CST:
997 pp_c_constant (pp, e);
998 break;
1000 case TARGET_EXPR:
1001 pp_c_identifier (pp, "__builtin_memcpy");
1002 pp_c_left_paren (pp);
1003 pp_ampersand (pp);
1004 pp_primary_expression (pp, TREE_OPERAND (e, 0));
1005 pp_separate_with (pp, ',');
1006 pp_ampersand (pp);
1007 pp_initializer (pp, TREE_OPERAND (e, 1));
1008 if (TREE_OPERAND (e, 2))
1010 pp_separate_with (pp, ',');
1011 pp_c_expression (pp, TREE_OPERAND (e, 2));
1013 pp_c_right_paren (pp);
1014 break;
1016 default:
1017 /* FIXME: Make sure we won't get into an infinie loop. */
1018 pp_c_left_paren (pp);
1019 pp_expression (pp, e);
1020 pp_c_right_paren (pp);
1021 break;
1025 /* Print out a C initializer -- also support C compound-literals.
1026 initializer:
1027 assignment-expression:
1028 { initializer-list }
1029 { initializer-list , } */
1031 static void
1032 pp_c_initializer (c_pretty_printer *pp, tree e)
1034 if (TREE_CODE (e) == CONSTRUCTOR)
1035 pp_c_brace_enclosed_initializer_list (pp, e);
1036 else
1037 pp_expression (pp, e);
1040 /* init-declarator:
1041 declarator:
1042 declarator = initializer */
1044 void
1045 pp_c_init_declarator (c_pretty_printer *pp, tree t)
1047 pp_declarator (pp, t);
1048 /* We don't want to output function definitions here. There are handled
1049 elsewhere (and the syntactic form is bogus anyway). */
1050 if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
1052 tree init = DECL_INITIAL (t);
1053 /* This C++ bit is handled here because it is easier to do so.
1054 In templates, the C++ parser builds a TREE_LIST for a
1055 direct-initialization; the TREE_PURPOSE is the variable to
1056 initialize and the TREE_VALUE is the initializer. */
1057 if (TREE_CODE (init) == TREE_LIST)
1059 pp_c_left_paren (pp);
1060 pp_expression (pp, TREE_VALUE (init));
1061 pp_right_paren (pp);
1063 else
1065 pp_space (pp);
1066 pp_equal (pp);
1067 pp_space (pp);
1068 pp_c_initializer (pp, init);
1073 /* initializer-list:
1074 designation(opt) initializer
1075 initializer-list , designation(opt) initializer
1077 designation:
1078 designator-list =
1080 designator-list:
1081 designator
1082 designator-list designator
1084 designator:
1085 [ constant-expression ]
1086 identifier */
1088 static void
1089 pp_c_initializer_list (c_pretty_printer *pp, tree e)
1091 tree type = TREE_TYPE (e);
1092 const enum tree_code code = TREE_CODE (type);
1094 switch (code)
1096 case RECORD_TYPE:
1097 case UNION_TYPE:
1098 case ARRAY_TYPE:
1100 tree init = TREE_OPERAND (e, 0);
1101 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1103 if (code == RECORD_TYPE || code == UNION_TYPE)
1105 pp_c_dot (pp);
1106 pp_c_primary_expression (pp, TREE_PURPOSE (init));
1108 else
1110 pp_c_left_bracket (pp);
1111 if (TREE_PURPOSE (init))
1112 pp_c_constant (pp, TREE_PURPOSE (init));
1113 pp_c_right_bracket (pp);
1115 pp_c_whitespace (pp);
1116 pp_equal (pp);
1117 pp_c_whitespace (pp);
1118 pp_initializer (pp, TREE_VALUE (init));
1119 if (TREE_CHAIN (init))
1120 pp_separate_with (pp, ',');
1123 return;
1125 case VECTOR_TYPE:
1126 if (TREE_CODE (e) == VECTOR_CST)
1127 pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
1128 else if (TREE_CODE (e) == CONSTRUCTOR)
1129 pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
1130 else
1131 break;
1132 return;
1134 case COMPLEX_TYPE:
1135 if (TREE_CODE (e) == CONSTRUCTOR)
1136 pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
1137 else if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
1139 const bool cst = TREE_CODE (e) == COMPLEX_CST;
1140 pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
1141 pp_separate_with (pp, ',');
1142 pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
1144 else
1145 break;
1146 return;
1148 default:
1149 break;
1152 pp_unsupported_tree (pp, type);
1155 /* Pretty-print a brace-enclosed initializer-list. */
1157 static void
1158 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
1160 pp_c_left_brace (pp);
1161 pp_c_initializer_list (pp, l);
1162 pp_c_right_brace (pp);
1166 /* This is a convenient function, used to bridge gap between C and C++
1167 grammars.
1169 id-expression:
1170 identifier */
1172 void
1173 pp_c_id_expression (c_pretty_printer *pp, tree t)
1175 switch (TREE_CODE (t))
1177 case VAR_DECL:
1178 case PARM_DECL:
1179 case CONST_DECL:
1180 case TYPE_DECL:
1181 case FUNCTION_DECL:
1182 case FIELD_DECL:
1183 case LABEL_DECL:
1184 pp_c_tree_decl_identifier (pp, t);
1185 break;
1187 case IDENTIFIER_NODE:
1188 pp_c_tree_identifier (pp, t);
1189 break;
1191 default:
1192 pp_unsupported_tree (pp, t);
1193 break;
1197 /* postfix-expression:
1198 primary-expression
1199 postfix-expression [ expression ]
1200 postfix-expression ( argument-expression-list(opt) )
1201 postfix-expression . identifier
1202 postfix-expression -> identifier
1203 postfix-expression ++
1204 postfix-expression --
1205 ( type-name ) { initializer-list }
1206 ( type-name ) { initializer-list , } */
1208 void
1209 pp_c_postfix_expression (c_pretty_printer *pp, tree e)
1211 enum tree_code code = TREE_CODE (e);
1212 switch (code)
1214 case POSTINCREMENT_EXPR:
1215 case POSTDECREMENT_EXPR:
1216 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1217 pp_identifier (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
1218 break;
1220 case ARRAY_REF:
1221 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1222 pp_c_left_bracket (pp);
1223 pp_expression (pp, TREE_OPERAND (e, 1));
1224 pp_c_right_bracket (pp);
1225 break;
1227 case CALL_EXPR:
1228 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1229 pp_c_call_argument_list (pp, TREE_OPERAND (e, 1));
1230 break;
1232 case UNORDERED_EXPR:
1233 pp_c_identifier (pp, flag_isoc99
1234 ? "isunordered"
1235 : "__builtin_isunordered");
1236 goto two_args_fun;
1238 case ORDERED_EXPR:
1239 pp_c_identifier (pp, flag_isoc99
1240 ? "!isunordered"
1241 : "!__builtin_isunordered");
1242 goto two_args_fun;
1244 case UNLT_EXPR:
1245 pp_c_identifier (pp, flag_isoc99
1246 ? "!isgreaterequal"
1247 : "!__builtin_isgreaterequal");
1248 goto two_args_fun;
1250 case UNLE_EXPR:
1251 pp_c_identifier (pp, flag_isoc99
1252 ? "!isgreater"
1253 : "!__builtin_isgreater");
1254 goto two_args_fun;
1256 case UNGT_EXPR:
1257 pp_c_identifier (pp, flag_isoc99
1258 ? "!islessequal"
1259 : "!__builtin_islessequal");
1260 goto two_args_fun;
1262 case UNGE_EXPR:
1263 pp_c_identifier (pp, flag_isoc99
1264 ? "!isless"
1265 : "!__builtin_isless");
1266 goto two_args_fun;
1268 case UNEQ_EXPR:
1269 pp_c_identifier (pp, flag_isoc99
1270 ? "!islessgreater"
1271 : "!__builtin_islessgreater");
1272 goto two_args_fun;
1274 case LTGT_EXPR:
1275 pp_c_identifier (pp, flag_isoc99
1276 ? "islessgreater"
1277 : "__builtin_islessgreater");
1278 goto two_args_fun;
1280 two_args_fun:
1281 pp_c_left_paren (pp);
1282 pp_expression (pp, TREE_OPERAND (e, 0));
1283 pp_separate_with (pp, ',');
1284 pp_expression (pp, TREE_OPERAND (e, 1));
1285 pp_c_right_paren (pp);
1286 break;
1288 case ABS_EXPR:
1289 pp_c_identifier (pp, "__builtin_abs");
1290 pp_c_left_paren (pp);
1291 pp_expression (pp, TREE_OPERAND (e, 0));
1292 pp_c_right_paren (pp);
1293 break;
1295 case COMPONENT_REF:
1297 tree object = TREE_OPERAND (e, 0);
1298 if (TREE_CODE (object) == INDIRECT_REF)
1300 pp_postfix_expression (pp, TREE_OPERAND (object, 0));
1301 pp_c_arrow (pp);
1303 else
1305 pp_postfix_expression (pp, object);
1306 pp_c_dot (pp);
1308 pp_expression (pp, TREE_OPERAND (e, 1));
1310 break;
1312 case COMPLEX_CST:
1313 case VECTOR_CST:
1314 case COMPLEX_EXPR:
1315 pp_c_compound_literal (pp, e);
1316 break;
1318 case COMPOUND_LITERAL_EXPR:
1319 e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
1320 /* Fall through. */
1321 case CONSTRUCTOR:
1322 pp_initializer (pp, e);
1323 break;
1325 case VA_ARG_EXPR:
1326 pp_c_identifier (pp, "__builtin_va_arg");
1327 pp_c_left_paren (pp);
1328 pp_assignment_expression (pp, TREE_OPERAND (e, 0));
1329 pp_separate_with (pp, ',');
1330 pp_type_id (pp, TREE_TYPE (e));
1331 pp_c_right_paren (pp);
1332 break;
1334 case ADDR_EXPR:
1335 if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
1337 pp_c_id_expression (pp, TREE_OPERAND (e, 0));
1338 break;
1340 /* else fall through. */
1342 default:
1343 pp_primary_expression (pp, e);
1344 break;
1348 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1350 void
1351 pp_c_expression_list (c_pretty_printer *pp, tree e)
1353 for (; e != NULL_TREE; e = TREE_CHAIN (e))
1355 pp_expression (pp, TREE_VALUE (e));
1356 if (TREE_CHAIN (e))
1357 pp_separate_with (pp, ',');
1361 /* Print out an expression-list in parens, as in a function call. */
1363 void
1364 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
1366 pp_c_left_paren (pp);
1367 if (t && TREE_CODE (t) == TREE_LIST)
1368 pp_c_expression_list (pp, t);
1369 pp_c_right_paren (pp);
1372 /* unary-expression:
1373 postfix-expression
1374 ++ cast-expression
1375 -- cast-expression
1376 unary-operator cast-expression
1377 sizeof unary-expression
1378 sizeof ( type-id )
1380 unary-operator: one of
1381 * & + - ! ~
1383 GNU extensions.
1384 unary-expression:
1385 __alignof__ unary-expression
1386 __alignof__ ( type-id )
1387 __real__ unary-expression
1388 __imag__ unary-expression */
1390 void
1391 pp_c_unary_expression (c_pretty_printer *pp, tree e)
1393 enum tree_code code = TREE_CODE (e);
1394 switch (code)
1396 case PREINCREMENT_EXPR:
1397 case PREDECREMENT_EXPR:
1398 pp_identifier (pp, code == PREINCREMENT_EXPR ? "++" : "--");
1399 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1400 break;
1402 case ADDR_EXPR:
1403 case INDIRECT_REF:
1404 case NEGATE_EXPR:
1405 case BIT_NOT_EXPR:
1406 case TRUTH_NOT_EXPR:
1407 case CONJ_EXPR:
1408 /* String literal are used by address. */
1409 if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
1410 pp_ampersand (pp);
1411 else if (code == INDIRECT_REF)
1412 pp_c_star (pp);
1413 else if (code == NEGATE_EXPR)
1414 pp_minus (pp);
1415 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
1416 pp_complement (pp);
1417 else if (code == TRUTH_NOT_EXPR)
1418 pp_exclamation (pp);
1419 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1420 break;
1422 case REALPART_EXPR:
1423 case IMAGPART_EXPR:
1424 pp_c_identifier (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
1425 pp_c_whitespace (pp);
1426 pp_unary_expression (pp, TREE_OPERAND (e, 0));
1427 break;
1429 default:
1430 pp_postfix_expression (pp, e);
1431 break;
1435 /* cast-expression:
1436 unary-expression
1437 ( type-name ) cast-expression */
1439 void
1440 pp_c_cast_expression (c_pretty_printer *pp, tree e)
1442 switch (TREE_CODE (e))
1444 case FLOAT_EXPR:
1445 case FIX_TRUNC_EXPR:
1446 case CONVERT_EXPR:
1447 pp_c_type_cast (pp, TREE_TYPE (e));
1448 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1449 break;
1451 default:
1452 pp_unary_expression (pp, e);
1456 /* multiplicative-expression:
1457 cast-expression
1458 multiplicative-expression * cast-expression
1459 multiplicative-expression / cast-expression
1460 multiplicative-expression % cast-expression */
1462 static void
1463 pp_c_multiplicative_expression (c_pretty_printer *pp, tree e)
1465 enum tree_code code = TREE_CODE (e);
1466 switch (code)
1468 case MULT_EXPR:
1469 case TRUNC_DIV_EXPR:
1470 case TRUNC_MOD_EXPR:
1471 pp_multiplicative_expression (pp, TREE_OPERAND (e, 0));
1472 pp_c_whitespace (pp);
1473 if (code == MULT_EXPR)
1474 pp_c_star (pp);
1475 else if (code == TRUNC_DIV_EXPR)
1476 pp_slash (pp);
1477 else
1478 pp_modulo (pp);
1479 pp_c_whitespace (pp);
1480 pp_c_cast_expression (pp, TREE_OPERAND (e, 1));
1481 break;
1483 default:
1484 pp_c_cast_expression (pp, e);
1485 break;
1489 /* additive-expression:
1490 multiplicative-expression
1491 additive-expression + multiplicative-expression
1492 additive-expression - multiplicative-expression */
1494 static void
1495 pp_c_additive_expression (c_pretty_printer *pp, tree e)
1497 enum tree_code code = TREE_CODE (e);
1498 switch (code)
1500 case PLUS_EXPR:
1501 case MINUS_EXPR:
1502 pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
1503 pp_c_whitespace (pp);
1504 if (code == PLUS_EXPR)
1505 pp_plus (pp);
1506 else
1507 pp_minus (pp);
1508 pp_c_whitespace (pp);
1509 pp_multiplicative_expression (pp, TREE_OPERAND (e, 1));
1510 break;
1512 default:
1513 pp_multiplicative_expression (pp, e);
1514 break;
1518 /* additive-expression:
1519 additive-expression
1520 shift-expression << additive-expression
1521 shift-expression >> additive-expression */
1523 static void
1524 pp_c_shift_expression (c_pretty_printer *pp, tree e)
1526 enum tree_code code = TREE_CODE (e);
1527 switch (code)
1529 case LSHIFT_EXPR:
1530 case RSHIFT_EXPR:
1531 pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
1532 pp_c_whitespace (pp);
1533 pp_identifier (pp, code == LSHIFT_EXPR ? "<<" : ">>");
1534 pp_c_whitespace (pp);
1535 pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
1536 break;
1538 default:
1539 pp_c_additive_expression (pp, e);
1543 /* relational-expression:
1544 shift-expression
1545 relational-expression < shift-expression
1546 relational-expression > shift-expression
1547 relational-expression <= shift-expression
1548 relational-expression >= shift-expression */
1550 static void
1551 pp_c_relational_expression (c_pretty_printer *pp, tree e)
1553 enum tree_code code = TREE_CODE (e);
1554 switch (code)
1556 case LT_EXPR:
1557 case GT_EXPR:
1558 case LE_EXPR:
1559 case GE_EXPR:
1560 pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
1561 pp_c_whitespace (pp);
1562 if (code == LT_EXPR)
1563 pp_less (pp);
1564 else if (code == GT_EXPR)
1565 pp_greater (pp);
1566 else if (code == LE_EXPR)
1567 pp_identifier (pp, "<=");
1568 else if (code == GE_EXPR)
1569 pp_identifier (pp, ">=");
1570 pp_c_whitespace (pp);
1571 pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
1572 break;
1574 default:
1575 pp_c_shift_expression (pp, e);
1576 break;
1580 /* equality-expression:
1581 relational-expression
1582 equality-expression == relational-expression
1583 equality-equality != relational-expression */
1585 static void
1586 pp_c_equality_expression (c_pretty_printer *pp, tree e)
1588 enum tree_code code = TREE_CODE (e);
1589 switch (code)
1591 case EQ_EXPR:
1592 case NE_EXPR:
1593 pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
1594 pp_c_whitespace (pp);
1595 pp_identifier (pp, code == EQ_EXPR ? "==" : "!=");
1596 pp_c_whitespace (pp);
1597 pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
1598 break;
1600 default:
1601 pp_c_relational_expression (pp, e);
1602 break;
1606 /* AND-expression:
1607 equality-expression
1608 AND-expression & equality-equality */
1610 static void
1611 pp_c_and_expression (c_pretty_printer *pp, tree e)
1613 if (TREE_CODE (e) == BIT_AND_EXPR)
1615 pp_c_and_expression (pp, TREE_OPERAND (e, 0));
1616 pp_c_whitespace (pp);
1617 pp_ampersand (pp);
1618 pp_c_whitespace (pp);
1619 pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
1621 else
1622 pp_c_equality_expression (pp, e);
1625 /* exclusive-OR-expression:
1626 AND-expression
1627 exclusive-OR-expression ^ AND-expression */
1629 static void
1630 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
1632 if (TREE_CODE (e) == BIT_XOR_EXPR)
1634 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1635 pp_c_maybe_whitespace (pp);
1636 pp_carret (pp);
1637 pp_c_whitespace (pp);
1638 pp_c_and_expression (pp, TREE_OPERAND (e, 1));
1640 else
1641 pp_c_and_expression (pp, e);
1644 /* inclusive-OR-expression:
1645 exclusive-OR-expression
1646 inclusive-OR-expression | exclusive-OR-expression */
1648 static void
1649 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
1651 if (TREE_CODE (e) == BIT_IOR_EXPR)
1653 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1654 pp_c_whitespace (pp);
1655 pp_bar (pp);
1656 pp_c_whitespace (pp);
1657 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
1659 else
1660 pp_c_exclusive_or_expression (pp, e);
1663 /* logical-AND-expression:
1664 inclusive-OR-expression
1665 logical-AND-expression && inclusive-OR-expression */
1667 static void
1668 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
1670 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
1672 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
1673 pp_c_whitespace (pp);
1674 pp_identifier (pp, "&&");
1675 pp_c_whitespace (pp);
1676 pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
1678 else
1679 pp_c_inclusive_or_expression (pp, e);
1682 /* logical-OR-expression:
1683 logical-AND-expression
1684 logical-OR-expression || logical-AND-expression */
1686 void
1687 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
1689 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1691 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1692 pp_c_whitespace (pp);
1693 pp_identifier (pp, "||");
1694 pp_c_whitespace (pp);
1695 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
1697 else
1698 pp_c_logical_and_expression (pp, e);
1701 /* conditional-expression:
1702 logical-OR-expression
1703 logical-OR-expression ? expression : conditional-expression */
1705 static void
1706 pp_c_conditional_expression (c_pretty_printer *pp, tree e)
1708 if (TREE_CODE (e) == COND_EXPR)
1710 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1711 pp_c_whitespace (pp);
1712 pp_question (pp);
1713 pp_c_whitespace (pp);
1714 pp_expression (pp, TREE_OPERAND (e, 1));
1715 pp_c_whitespace (pp);
1716 pp_colon (pp);
1717 pp_c_whitespace (pp);
1718 pp_c_conditional_expression (pp, TREE_OPERAND (e, 2));
1720 else
1721 pp_c_logical_or_expression (pp, e);
1725 /* assignment-expression:
1726 conditional-expression
1727 unary-expression assignment-operator assignment-expression
1729 assignment-expression: one of
1730 = *= /= %= += -= >>= <<= &= ^= |= */
1732 static void
1733 pp_c_assignment_expression (c_pretty_printer *pp, tree e)
1735 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
1737 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1738 pp_c_whitespace (pp);
1739 pp_equal (pp);
1740 pp_space (pp);
1741 pp_c_expression (pp, TREE_OPERAND (e, 1));
1743 else
1744 pp_c_conditional_expression (pp, e);
1747 /* expression:
1748 assignment-expression
1749 expression , assignment-expression
1751 Implementation note: instead of going through the usual recursion
1752 chain, I take the liberty of dispatching nodes to the appropriate
1753 functions. This makes some redundancy, but it worths it. That also
1754 prevents a possible infinite recursion between pp_c_primary_expression ()
1755 and pp_c_expression (). */
1757 void
1758 pp_c_expression (c_pretty_printer *pp, tree e)
1760 switch (TREE_CODE (e))
1762 case INTEGER_CST:
1763 pp_c_integer_constant (pp, e);
1764 break;
1766 case REAL_CST:
1767 pp_c_floating_constant (pp, e);
1768 break;
1770 case STRING_CST:
1771 pp_c_string_literal (pp, e);
1772 break;
1774 case IDENTIFIER_NODE:
1775 case FUNCTION_DECL:
1776 case VAR_DECL:
1777 case CONST_DECL:
1778 case PARM_DECL:
1779 case RESULT_DECL:
1780 case FIELD_DECL:
1781 case LABEL_DECL:
1782 case ERROR_MARK:
1783 pp_primary_expression (pp, e);
1784 break;
1786 case POSTINCREMENT_EXPR:
1787 case POSTDECREMENT_EXPR:
1788 case ARRAY_REF:
1789 case CALL_EXPR:
1790 case COMPONENT_REF:
1791 case COMPLEX_CST:
1792 case COMPLEX_EXPR:
1793 case VECTOR_CST:
1794 case ORDERED_EXPR:
1795 case UNORDERED_EXPR:
1796 case LTGT_EXPR:
1797 case UNEQ_EXPR:
1798 case UNLE_EXPR:
1799 case UNLT_EXPR:
1800 case UNGE_EXPR:
1801 case UNGT_EXPR:
1802 case ABS_EXPR:
1803 case CONSTRUCTOR:
1804 case COMPOUND_LITERAL_EXPR:
1805 case VA_ARG_EXPR:
1806 pp_postfix_expression (pp, e);
1807 break;
1809 case CONJ_EXPR:
1810 case ADDR_EXPR:
1811 case INDIRECT_REF:
1812 case NEGATE_EXPR:
1813 case BIT_NOT_EXPR:
1814 case TRUTH_NOT_EXPR:
1815 case PREINCREMENT_EXPR:
1816 case PREDECREMENT_EXPR:
1817 case REALPART_EXPR:
1818 case IMAGPART_EXPR:
1819 pp_c_unary_expression (pp, e);
1820 break;
1822 case FLOAT_EXPR:
1823 case FIX_TRUNC_EXPR:
1824 case CONVERT_EXPR:
1825 pp_c_cast_expression (pp, e);
1826 break;
1828 case MULT_EXPR:
1829 case TRUNC_MOD_EXPR:
1830 case TRUNC_DIV_EXPR:
1831 pp_multiplicative_expression (pp, e);
1832 break;
1834 case LSHIFT_EXPR:
1835 case RSHIFT_EXPR:
1836 pp_c_shift_expression (pp, e);
1837 break;
1839 case LT_EXPR:
1840 case GT_EXPR:
1841 case LE_EXPR:
1842 case GE_EXPR:
1843 pp_c_relational_expression (pp, e);
1844 break;
1846 case BIT_AND_EXPR:
1847 pp_c_and_expression (pp, e);
1848 break;
1850 case BIT_XOR_EXPR:
1851 pp_c_exclusive_or_expression (pp, e);
1852 break;
1854 case BIT_IOR_EXPR:
1855 pp_c_inclusive_or_expression (pp, e);
1856 break;
1858 case TRUTH_ANDIF_EXPR:
1859 pp_c_logical_and_expression (pp, e);
1860 break;
1862 case TRUTH_ORIF_EXPR:
1863 pp_c_logical_or_expression (pp, e);
1864 break;
1866 case EQ_EXPR:
1867 case NE_EXPR:
1868 pp_c_equality_expression (pp, e);
1869 break;
1871 case COND_EXPR:
1872 pp_conditional_expression (pp, e);
1873 break;
1875 case PLUS_EXPR:
1876 case MINUS_EXPR:
1877 pp_c_additive_expression (pp, e);
1878 break;
1880 case MODIFY_EXPR:
1881 case INIT_EXPR:
1882 pp_assignment_expression (pp, e);
1883 break;
1885 case COMPOUND_EXPR:
1886 pp_c_left_paren (pp);
1887 pp_expression (pp, TREE_OPERAND (e, 0));
1888 pp_separate_with (pp, ',');
1889 pp_assignment_expression (pp, TREE_OPERAND (e, 1));
1890 pp_c_right_paren (pp);
1891 break;
1893 case NOP_EXPR:
1894 case NON_LVALUE_EXPR:
1895 case SAVE_EXPR:
1896 pp_expression (pp, TREE_OPERAND (e, 0));
1897 break;
1899 case TARGET_EXPR:
1900 pp_postfix_expression (pp, TREE_OPERAND (e, 1));
1901 break;
1903 default:
1904 pp_unsupported_tree (pp, e);
1905 break;
1911 /* Statements. */
1913 void
1914 pp_c_statement (c_pretty_printer *pp, tree stmt)
1916 if (stmt == NULL)
1917 return;
1919 if (pp_needs_newline (pp))
1920 pp_newline_and_indent (pp, 0);
1922 dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
1926 /* Initialize the PRETTY-PRINTER for handling C codes. */
1928 void
1929 pp_c_pretty_printer_init (c_pretty_printer *pp)
1931 pp->offset_list = 0;
1933 pp->declaration = pp_c_declaration;
1934 pp->declaration_specifiers = pp_c_declaration_specifiers;
1935 pp->declarator = pp_c_declarator;
1936 pp->direct_declarator = pp_c_direct_declarator;
1937 pp->type_specifier_seq = pp_c_specifier_qualifier_list;
1938 pp->abstract_declarator = pp_c_abstract_declarator;
1939 pp->direct_abstract_declarator = pp_c_direct_abstract_declarator;
1940 pp->ptr_operator = pp_c_pointer;
1941 pp->parameter_list = pp_c_parameter_type_list;
1942 pp->type_id = pp_c_type_id;
1943 pp->simple_type_specifier = pp_c_type_specifier;
1944 pp->function_specifier = pp_c_function_specifier;
1945 pp->storage_class_specifier = pp_c_storage_class_specifier;
1947 pp->statement = pp_c_statement;
1949 pp->id_expression = pp_c_id_expression;
1950 pp->primary_expression = pp_c_primary_expression;
1951 pp->postfix_expression = pp_c_postfix_expression;
1952 pp->unary_expression = pp_c_unary_expression;
1953 pp->initializer = pp_c_initializer;
1954 pp->multiplicative_expression = pp_c_multiplicative_expression;
1955 pp->conditional_expression = pp_c_conditional_expression;
1956 pp->assignment_expression = pp_c_assignment_expression;
1957 pp->expression = pp_c_expression;
1961 /* Print the tree T in full, on file FILE. */
1963 void
1964 print_c_tree (FILE *file, tree t)
1966 static c_pretty_printer pp_rec;
1967 static bool initialized = 0;
1968 c_pretty_printer *pp = &pp_rec;
1970 if (!initialized)
1972 initialized = 1;
1973 pp_construct (pp_base (pp), NULL, 0);
1974 pp_c_pretty_printer_init (pp);
1975 pp_needs_newline (pp) = true;
1977 pp_base (pp)->buffer->stream = file;
1979 pp_statement (pp, t);
1981 pp_newline (pp);
1982 pp_flush (pp);
1985 /* Print the tree T in full, on stderr. */
1987 void
1988 debug_c_tree (tree t)
1990 print_c_tree (stderr, t);
1991 fputc ('\n', stderr);
1994 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
1995 up of T's memory address. */
1997 void
1998 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
2000 const char *name;
2002 gcc_assert (DECL_P (t));
2004 if (DECL_NAME (t))
2005 name = IDENTIFIER_POINTER (DECL_NAME (t));
2006 else
2008 static char xname[8];
2009 sprintf (xname, "<U%4x>", ((unsigned)((unsigned long)(t) & 0xffff)));
2010 name = xname;
2013 pp_c_identifier (pp, name);