1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002 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
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
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
25 #include "c-pretty-print.h"
29 static void pp_c_char PARAMS ((c_pretty_printer, int));
30 static void pp_c_character_literal PARAMS ((c_pretty_printer, tree));
31 static void pp_c_bool_literal PARAMS ((c_pretty_printer, tree));
32 static bool pp_c_enumerator PARAMS ((c_pretty_printer, tree));
33 static void pp_c_integer_literal PARAMS ((c_pretty_printer, tree));
34 static void pp_c_real_literal PARAMS ((c_pretty_printer, tree));
35 static void pp_c_string_literal PARAMS ((c_pretty_printer, tree));
37 static void pp_c_primary_expression PARAMS ((c_pretty_printer, tree));
39 /* postfix-expression */
40 static void pp_c_initializer_list PARAMS ((c_pretty_printer, tree));
42 static void pp_c_unary_expression PARAMS ((c_pretty_printer, tree));
43 static void pp_c_multiplicative_expression PARAMS ((c_pretty_printer, tree));
44 static void pp_c_additive_expression PARAMS ((c_pretty_printer, tree));
45 static void pp_c_shift_expression PARAMS ((c_pretty_printer, tree));
46 static void pp_c_relational_expression PARAMS ((c_pretty_printer, tree));
47 static void pp_c_equality_expression PARAMS ((c_pretty_printer, tree));
48 static void pp_c_and_expression PARAMS ((c_pretty_printer, tree));
49 static void pp_c_exclusive_or_expression PARAMS ((c_pretty_printer,
51 static void pp_c_inclusive_or_expression PARAMS ((c_pretty_printer,
53 static void pp_c_logical_and_expression PARAMS ((c_pretty_printer, tree));
54 static void pp_c_conditional_expression PARAMS ((c_pretty_printer, tree));
55 static void pp_c_assignment_expression PARAMS ((c_pretty_printer, tree));
58 static void pp_c_declaration_specifiers PARAMS ((c_pretty_printer, tree));
59 static void pp_c_init_declarator PARAMS ((c_pretty_printer, tree));
60 static void pp_c_declarator PARAMS ((c_pretty_printer, tree));
61 static void pp_c_direct_declarator PARAMS ((c_pretty_printer, tree));
62 static void pp_c_abstract_declarator PARAMS ((c_pretty_printer, tree));
63 static void pp_c_specifier_qualifier_list PARAMS ((c_pretty_printer, tree));
64 static void pp_c_simple_type_specifier PARAMS ((c_pretty_printer, tree));
65 static void pp_c_parameter_declaration PARAMS ((c_pretty_printer, tree));
66 static void pp_c_type_id PARAMS ((c_pretty_printer, tree));
67 static void pp_c_storage_class_specifier PARAMS ((c_pretty_printer, tree));
68 static void pp_c_function_specifier PARAMS ((c_pretty_printer, tree));
73 /* Print out CV-qualifiers. Take care of possible extensions. */
75 pp_c_cv_qualifier (ppi, cv)
79 if (cv & TYPE_QUAL_CONST)
80 pp_c_identifier (ppi, "const");
81 if (cv & TYPE_QUAL_VOLATILE)
82 pp_c_identifier (ppi, "volatile");
83 if (cv & TYPE_QUAL_RESTRICT)
84 pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
88 pp_c_simple_type_specifier (ppi, t)
92 const enum tree_code code = TREE_CODE (t);
96 pp_c_identifier (ppi, "<type-error>");
101 pp_c_identifier (ppi, "<unkown-type>");
105 case IDENTIFIER_NODE:
106 pp_c_tree_identifier (ppi, t);
114 pp_c_tree_identifier (ppi, DECL_NAME (t));
119 pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
120 if (code == COMPLEX_TYPE)
121 pp_c_identifier (ppi, flag_isoc99 ? "_Complex" : "__complex__");
122 else if (code == VECTOR_TYPE)
123 pp_c_identifier (ppi, "__vector__");
128 pp_c_tree_identifier (ppi, DECL_NAME (t));
130 pp_c_identifier (ppi, "<typedef-error>");
136 if (code == UNION_TYPE)
137 pp_c_identifier (ppi, "union");
138 else if (code == RECORD_TYPE)
139 pp_c_identifier (ppi, "struct");
140 else if (code == ENUMERAL_TYPE)
141 pp_c_identifier (ppi, "enum");
143 pp_c_identifier (ppi, "<tag-error>");
146 pp_c_tree_identifier (ppi, TYPE_NAME (t));
148 pp_c_identifier (ppi, "<anonymous>");
152 pp_unsupported_tree (ppi, t);
157 pp_c_specifier_qualifier_list (ppi, t)
158 c_pretty_printer ppi;
161 pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
162 pp_c_cv_qualifier (ppi, TYPE_QUALS (t));
166 pp_c_abstract_declarator (ppi, t)
167 c_pretty_printer ppi;
170 pp_unsupported_tree (ppi, t);
175 pp_c_type_id (ppi, t)
176 c_pretty_printer ppi;
179 pp_c_specifier_qualifier_list (ppi, t);
180 pp_c_abstract_declarator (ppi, t);
184 pp_c_storage_class_specifier (pp, t)
188 if (TREE_CODE (t) == TYPE_DECL)
189 pp_c_identifier (pp, "typedef");
190 else if (DECL_REGISTER (t))
191 pp_c_identifier (pp, "register");
195 pp_c_function_specifier (pp, t)
199 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
200 pp_c_identifier (pp, "inline");
204 pp_c_declaration_specifiers (pp, t)
208 pp_c_storage_class_specifier (pp, t);
209 pp_c_function_specifier (pp, t);
210 pp_type_specifier (pp, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
211 pp_c_cv_qualifier (pp, TYPE_QUALS (TREE_TYPE (t)));
215 pp_c_direct_declarator (pp, t)
219 pp_unsupported_tree (pp, t);
223 pp_c_declarator (pp, t)
227 pp_unsupported_tree (pp, t);
231 pp_c_init_declarator (pp, t)
235 pp_declarator (pp, t);
236 if (DECL_INITIAL (t))
241 pp_c_initializer (pp, DECL_INITIAL (t));
246 pp_c_declaration (pp, t)
250 pp_declaration_specifiers (pp, t);
251 pp_c_init_declarator (pp, t);
255 pp_c_parameter_declaration (pp, t)
259 pp_unsupported_tree (pp, t);
262 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
264 pp_c_attributes (pp, attributes)
268 if (attributes == NULL_TREE)
271 pp_c_identifier (pp, "__attribute__");
272 pp_c_left_paren (pp);
273 pp_c_left_paren (pp);
274 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
276 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
277 if (TREE_VALUE (attributes))
279 pp_c_left_paren (pp);
280 pp_c_expression_list (pp, TREE_VALUE (attributes));
281 pp_c_right_paren (pp);
284 if (TREE_CHAIN (attributes))
285 pp_separate_with (pp, ',');
287 pp_c_right_paren (pp);
288 pp_c_right_paren (pp);
294 /* Print out a c-char. */
297 c_pretty_printer ppi;
303 pp_identifier (ppi, "\\n");
306 pp_identifier (ppi, "\\t");
309 pp_identifier (ppi, "\\v");
312 pp_identifier (ppi, "\\b");
315 pp_identifier (ppi, "\\r");
318 pp_identifier (ppi, "\\f");
321 pp_identifier (ppi, "\\a");
324 pp_identifier (ppi, "\\\\");
327 pp_identifier (ppi, "\\'");
330 pp_identifier (ppi, "\\\"");
334 pp_character (ppi, c);
336 pp_format_scalar (ppi, "\\%03o", (unsigned) c);
341 /* Print out a STRING literal. */
343 pp_c_string_literal (ppi, s)
344 c_pretty_printer ppi;
347 const char *p = TREE_STRING_POINTER (s);
348 int n = TREE_STRING_LENGTH (s) - 1;
350 pp_doublequote (ppi);
351 for (i = 0; i < n; ++i)
352 pp_c_char (ppi, p[i]);
353 pp_doublequote (ppi);
356 /* Print out a CHARACTER literal. */
358 pp_c_character_literal (ppi, c)
359 c_pretty_printer ppi;
363 pp_c_char (ppi, tree_low_cst (c, 0));
367 /* Print out a BOOLEAN literal. */
369 pp_c_bool_literal (ppi, b)
370 c_pretty_printer ppi;
373 if (b == boolean_false_node || integer_zerop (b))
375 if (c_language == clk_cplusplus)
376 pp_c_identifier (ppi, "false");
377 else if (c_language == clk_c && flag_isoc99)
378 pp_c_identifier (ppi, "_False");
380 pp_unsupported_tree (ppi, b);
382 else if (b == boolean_true_node)
384 if (c_language == clk_cplusplus)
385 pp_c_identifier (ppi, "true");
386 else if (c_language == clk_c && flag_isoc99)
387 pp_c_identifier (ppi, "_True");
389 pp_unsupported_tree (ppi, b);
392 pp_unsupported_tree (ppi, b);
395 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
396 false; that means the value was obtained by a cast, in which case
397 print out the type-id part of the cast-expression -- the casted value
398 is then printed by pp_c_integer_literal. */
400 pp_c_enumerator (ppi, e)
401 c_pretty_printer ppi;
404 tree type = TREE_TYPE (e);
407 /* Find the name of this constant. */
408 for (value = TYPE_VALUES (type);
409 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
410 value = TREE_CHAIN (value))
413 if (value != NULL_TREE)
414 pp_c_tree_identifier (ppi, TREE_PURPOSE (value));
417 /* Value must have been cast. */
418 pp_c_left_paren (ppi);
419 pp_type_id (ppi, type);
420 pp_c_right_paren (ppi);
427 /* Print out an INTEGER constant value. */
429 pp_c_integer_literal (ppi, i)
430 c_pretty_printer ppi;
433 tree type = TREE_TYPE (i);
435 if (type == boolean_type_node)
436 pp_c_bool_literal (ppi, i);
437 else if (type == char_type_node)
438 pp_c_character_literal (ppi, i);
439 else if (TREE_CODE (type) == ENUMERAL_TYPE
440 && pp_c_enumerator (ppi, i))
444 if (host_integerp (i, 0))
445 pp_wide_integer (ppi, TREE_INT_CST_LOW (i));
448 if (tree_int_cst_sgn (i) < 0)
450 static char format[10]; /* "%x%09999x\0" */
452 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
454 pp_c_char (ppi, '-');
455 i = build_int_2 (-TREE_INT_CST_LOW (i),
456 ~TREE_INT_CST_HIGH (i) + !TREE_INT_CST_LOW (i));
457 sprintf (pp_buffer (ppi)->digit_buffer, format,
458 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
459 pp_identifier (ppi, pp_buffer (ppi)->digit_buffer);
466 /* Print out a REAL value. */
468 pp_c_real_literal (ppi, r)
469 c_pretty_printer ppi;
472 REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (r), pp_buffer (ppi)->digit_buffer, -1);
473 pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
478 pp_c_literal (ppi, e)
479 c_pretty_printer ppi;
482 switch (TREE_CODE (e))
485 pp_c_integer_literal (ppi, e);
489 pp_c_real_literal (ppi, e);
493 pp_c_string_literal (ppi, e);
497 pp_unsupported_tree (ppi, e);
502 /* Pretty-print a C primary-expression. */
504 pp_c_primary_expression (ppi, e)
505 c_pretty_printer ppi;
508 switch (TREE_CODE (e))
518 case IDENTIFIER_NODE:
519 pp_c_tree_identifier (ppi, e);
523 pp_c_identifier (ppi, "<erroneous-expression>");
527 pp_c_identifier (ppi, "<return-value>");
533 pp_c_literal (ppi, e);
537 pp_c_left_paren (ppi);
538 pp_c_identifier (ppi, "__builtin_memcpy");
539 pp_c_left_paren (ppi);
541 pp_c_primary_expression (ppi, TREE_OPERAND (e, 0));
542 pp_separate_with (ppi, ',');
544 pp_initializer (ppi, TREE_OPERAND (e, 1));
545 if (TREE_OPERAND (e, 2))
547 pp_separate_with (ppi, ',');
548 pp_c_expression (ppi, TREE_OPERAND (e, 2));
550 pp_c_right_paren (ppi);
553 pp_c_left_paren (ppi);
554 pp_statement (ppi, STMT_EXPR_STMT (e));
555 pp_c_right_paren (ppi);
559 /* Make sure this call won't cause any infinite loop. */
560 pp_c_left_paren (ppi);
561 pp_c_expression (ppi, e);
562 pp_c_right_paren (ppi);
567 /* Print out a C initializer -- also support C compound-literals. */
569 pp_c_initializer (ppi, e)
570 c_pretty_printer ppi;
573 if (TREE_CODE (e) == CONSTRUCTOR)
575 enum tree_code code = TREE_CODE (TREE_TYPE (e));
576 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
579 pp_c_initializer_list (ppi, e);
580 pp_right_brace (ppi);
583 pp_unsupported_tree (ppi, TREE_OPERAND (e, 1));
586 pp_assignment_expression (ppi, e);
590 pp_c_initializer_list (ppi, e)
591 c_pretty_printer ppi;
594 tree type = TREE_TYPE (e);
595 const enum tree_code code = TREE_CODE (type);
597 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
599 tree init = TREE_OPERAND (e, 1);
600 for (; init != NULL_TREE; init = TREE_CHAIN (init))
602 if (code == RECORD_TYPE || code == UNION_TYPE)
605 pp_c_primary_expression (ppi, TREE_PURPOSE (init));
609 pp_c_left_bracket (ppi);
610 if (TREE_PURPOSE (init))
611 pp_c_literal (ppi, TREE_PURPOSE (init));
612 pp_c_right_bracket (ppi);
614 pp_c_whitespace (ppi);
616 pp_c_whitespace (ppi);
617 pp_initializer (ppi, TREE_VALUE (init));
618 if (TREE_CHAIN (init))
619 pp_separate_with (ppi, ',');
623 pp_unsupported_tree (ppi, type);
627 pp_c_postfix_expression (ppi, e)
628 c_pretty_printer ppi;
631 enum tree_code code = TREE_CODE (e);
634 case POSTINCREMENT_EXPR:
635 case POSTDECREMENT_EXPR:
636 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
637 pp_identifier (ppi, code == POSTINCREMENT_EXPR ? "++" : "--");
641 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
646 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
647 pp_c_left_bracket (ppi);
648 pp_c_expression (ppi, TREE_OPERAND (e, 1));
649 pp_c_right_bracket (ppi);
653 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
654 pp_c_left_paren (ppi);
655 pp_c_expression_list (ppi, TREE_OPERAND (e, 1));
656 pp_c_right_paren (ppi);
661 pp_c_identifier (ppi,
662 code == ABS_EXPR ? "__builtin_abs" : "__builtin_ffs");
663 pp_c_left_paren (ppi);
664 pp_c_expression (ppi, TREE_OPERAND (e, 0));
665 pp_c_right_paren (ppi);
670 tree object = TREE_OPERAND (e, 0);
671 if (TREE_CODE (object) == INDIRECT_REF)
673 pp_postfix_expression (ppi, TREE_OPERAND (object, 0));
678 pp_postfix_expression (ppi, object);
681 pp_c_expression (ppi, TREE_OPERAND (e, 1));
688 pp_c_left_paren (ppi);
689 pp_type_id (ppi, TREE_TYPE (e));
690 pp_c_right_paren (ppi);
693 if (code == COMPLEX_CST)
695 pp_c_expression (ppi, TREE_REALPART (e));
696 pp_separate_with (ppi, ',');
697 pp_c_expression (ppi, TREE_IMAGPART (e));
699 else if (code == VECTOR_CST)
700 pp_c_expression_list (ppi, TREE_VECTOR_CST_ELTS (e));
701 else if (code == COMPLEX_EXPR)
703 pp_c_expression (ppi, TREE_OPERAND (e, 0));
704 pp_separate_with (ppi, ',');
705 pp_c_expression (ppi, TREE_OPERAND (e, 1));
708 pp_right_brace (ppi);
711 case COMPOUND_LITERAL_EXPR:
712 e = DECL_INITIAL (e);
715 pp_initializer (ppi, e);
721 pp_identifier (ppi, "__location__");
722 pp_right_paren (ppi);
726 pp_identifier (ppi, "file");
729 pp_c_whitespace (ppi);
730 pp_c_expression (ppi, SRCLOC_FILE (e));
731 pp_separate_with (ppi, ',');
733 pp_identifier (ppi, "line");
736 pp_c_whitespace (ppi);
737 pp_c_expression (ppi, SRCLOC_LINE (e));
738 pp_right_brace (ppi);
743 pp_c_identifier (ppi, "__builtin_va_arg");
744 pp_c_left_paren (ppi);
745 pp_assignment_expression (ppi, TREE_OPERAND (e, 0));
746 pp_separate_with (ppi, ',');
747 pp_type_id (ppi, TREE_TYPE (e));
748 pp_c_right_paren (ppi);
752 pp_primary_expression (ppi, e);
757 /* Print out an expression-list; E is expected to be a TREE_LIST */
759 pp_c_expression_list (ppi, e)
760 c_pretty_printer ppi;
763 for (; e != NULL_TREE; e = TREE_CHAIN (e))
765 pp_c_assignment_expression (ppi, TREE_VALUE (e));
767 pp_separate_with (ppi, ',');
772 pp_c_unary_expression (ppi, e)
773 c_pretty_printer ppi;
776 enum tree_code code = TREE_CODE (e);
779 case PREINCREMENT_EXPR:
780 case PREDECREMENT_EXPR:
781 pp_identifier (ppi, code == PREINCREMENT_EXPR ? "++" : "--");
782 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
792 if (code == ADDR_EXPR)
794 else if (code == INDIRECT_REF)
796 else if (code == NEGATE_EXPR)
798 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
800 else if (code == TRUTH_NOT_EXPR)
801 pp_exclamation (ppi);
802 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
807 pp_c_identifier (ppi, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
808 pp_c_whitespace (ppi);
809 if (TYPE_P (TREE_OPERAND (e, 0)))
811 pp_c_left_paren (ppi);
812 pp_type_id (ppi, TREE_OPERAND (e, 0));
813 pp_c_right_paren (ppi);
816 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
821 pp_c_identifier (ppi, code == REALPART_EXPR ? "__real__" : "__imag__");
822 pp_c_whitespace (ppi);
823 pp_unary_expression (ppi, TREE_OPERAND (e, 0));
827 pp_postfix_expression (ppi, e);
833 pp_c_cast_expression (ppi, e)
834 c_pretty_printer ppi;
837 if (TREE_CODE (e) == CONVERT_EXPR || TREE_CODE (e) == FLOAT_EXPR)
839 pp_c_left_paren (ppi);
840 pp_type_id (ppi, TREE_TYPE (e));
841 pp_c_right_paren (ppi);
842 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
845 pp_unary_expression (ppi, e);
849 pp_c_multiplicative_expression (ppi, e)
850 c_pretty_printer ppi;
853 enum tree_code code = TREE_CODE (e);
859 pp_c_multiplicative_expression (ppi, TREE_OPERAND (e, 0));
860 pp_c_whitespace (ppi);
861 if (code == MULT_EXPR)
863 else if (code == TRUNC_DIV_EXPR)
867 pp_c_whitespace (ppi);
868 pp_c_cast_expression (ppi, TREE_OPERAND (e, 1));
872 pp_c_cast_expression (ppi, e);
878 pp_c_additive_expression (ppi, e)
879 c_pretty_printer ppi;
882 enum tree_code code = TREE_CODE (e);
887 pp_c_additive_expression (ppi, TREE_OPERAND (e, 0));
888 pp_c_whitespace (ppi);
889 if (code == PLUS_EXPR)
893 pp_c_whitespace (ppi);
894 pp_multiplicative_expression (ppi, TREE_OPERAND (e, 1));
898 pp_multiplicative_expression (ppi, e);
904 pp_c_shift_expression (ppi, e)
905 c_pretty_printer ppi;
908 enum tree_code code = TREE_CODE (e);
913 pp_c_shift_expression (ppi, TREE_OPERAND (e, 0));
914 pp_c_whitespace (ppi);
915 pp_identifier (ppi, code == LSHIFT_EXPR ? "<<" : ">>");
916 pp_c_whitespace (ppi);
917 pp_c_additive_expression (ppi, TREE_OPERAND (e, 1));
921 pp_c_additive_expression (ppi, e);
926 pp_c_relational_expression (ppi, e)
927 c_pretty_printer ppi;
930 enum tree_code code = TREE_CODE (e);
937 pp_c_relational_expression (ppi, TREE_OPERAND (e, 0));
938 pp_c_whitespace (ppi);
941 else if (code == GT_EXPR)
943 else if (code == LE_EXPR)
944 pp_identifier (ppi, "<=");
945 else if (code == GE_EXPR)
946 pp_identifier (ppi, ">=");
947 pp_c_whitespace (ppi);
948 pp_c_shift_expression (ppi, TREE_OPERAND (e, 1));
952 pp_c_shift_expression (ppi, e);
958 pp_c_equality_expression (ppi, e)
959 c_pretty_printer ppi;
962 enum tree_code code = TREE_CODE (e);
967 pp_c_equality_expression (ppi, TREE_OPERAND (e, 0));
968 pp_c_maybe_whitespace (ppi);
969 pp_identifier (ppi, code == EQ_EXPR ? "==" : "!=");
970 pp_c_whitespace (ppi);
971 pp_c_relational_expression (ppi, TREE_OPERAND (e, 1));
975 pp_c_relational_expression (ppi, e);
981 pp_c_and_expression (ppi, e)
982 c_pretty_printer ppi;
985 if (TREE_CODE (e) == BIT_AND_EXPR)
987 pp_c_and_expression (ppi, TREE_OPERAND (e, 0));
988 pp_c_maybe_whitespace (ppi);
990 pp_c_whitespace (ppi);
991 pp_c_equality_expression (ppi, TREE_OPERAND (e, 1));
994 pp_c_equality_expression (ppi, e);
998 pp_c_exclusive_or_expression (ppi, e)
999 c_pretty_printer ppi;
1002 if (TREE_CODE (e) == BIT_XOR_EXPR)
1004 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
1005 pp_c_maybe_whitespace (ppi);
1007 pp_c_whitespace (ppi);
1008 pp_c_and_expression (ppi, TREE_OPERAND (e, 1));
1011 pp_c_and_expression (ppi, e);
1015 pp_c_inclusive_or_expression (ppi, e)
1016 c_pretty_printer ppi;
1019 if (TREE_CODE (e) == BIT_IOR_EXPR)
1021 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
1022 pp_c_maybe_whitespace (ppi);
1024 pp_c_whitespace (ppi);
1025 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 1));
1028 pp_c_exclusive_or_expression (ppi, e);
1032 pp_c_logical_and_expression (ppi, e)
1033 c_pretty_printer ppi;
1036 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
1038 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 0));
1039 pp_c_maybe_whitespace (ppi);
1040 pp_identifier (ppi, "&&");
1041 pp_c_whitespace (ppi);
1042 pp_c_inclusive_or_expression (ppi, TREE_OPERAND (e, 1));
1045 pp_c_inclusive_or_expression (ppi, e);
1049 pp_c_logical_or_expression (ppi, e)
1050 c_pretty_printer ppi;
1053 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1055 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
1056 pp_c_maybe_whitespace (ppi);
1057 pp_identifier (ppi, "||");
1058 pp_c_whitespace (ppi);
1059 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 1));
1062 pp_c_logical_and_expression (ppi, e);
1066 pp_c_conditional_expression (ppi, e)
1067 c_pretty_printer ppi;
1070 if (TREE_CODE (e) == COND_EXPR)
1072 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
1073 pp_c_maybe_whitespace (ppi);
1075 pp_c_whitespace (ppi);
1076 pp_c_expression (ppi, TREE_OPERAND (e, 1));
1077 pp_c_maybe_whitespace (ppi);
1079 pp_c_whitespace (ppi);
1080 pp_c_conditional_expression (ppi, TREE_OPERAND (e, 2));
1083 pp_c_logical_or_expression (ppi, e);
1087 /* Pretty-print a C assignment-expression. */
1089 pp_c_assignment_expression (ppi, e)
1090 c_pretty_printer ppi;
1093 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
1095 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
1096 pp_c_maybe_whitespace (ppi);
1098 pp_whitespace (ppi);
1099 pp_c_assignment_expression (ppi, TREE_OPERAND (e, 1));
1102 pp_c_conditional_expression (ppi, e);
1105 /* Pretty-print an expression. */
1107 pp_c_expression (ppi, e)
1108 c_pretty_printer ppi;
1111 switch (TREE_CODE (e))
1114 pp_c_integer_literal (ppi, e);
1118 pp_c_real_literal (ppi, e);
1122 pp_c_string_literal (ppi, e);
1135 pp_c_primary_expression (ppi, e);
1138 case POSTINCREMENT_EXPR:
1139 case POSTDECREMENT_EXPR:
1149 case COMPOUND_LITERAL_EXPR:
1152 pp_c_postfix_expression (ppi, e);
1160 case TRUTH_NOT_EXPR:
1161 case PREINCREMENT_EXPR:
1162 case PREDECREMENT_EXPR:
1167 pp_c_unary_expression (ppi, e);
1172 pp_c_cast_expression (ppi, e);
1176 case TRUNC_MOD_EXPR:
1177 case TRUNC_DIV_EXPR:
1178 pp_c_multiplicative_expression (ppi, e);
1183 pp_c_shift_expression (ppi, e);
1190 pp_c_relational_expression (ppi, e);
1194 pp_c_and_expression (ppi, e);
1198 pp_c_exclusive_or_expression (ppi, e);
1202 pp_c_inclusive_or_expression (ppi, e);
1205 case TRUTH_ANDIF_EXPR:
1206 pp_c_logical_and_expression (ppi, e);
1209 case TRUTH_ORIF_EXPR:
1210 pp_c_logical_or_expression (ppi, e);
1214 pp_c_conditional_expression (ppi, e);
1219 pp_c_assignment_expression (ppi, e);
1223 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1227 pp_c_left_paren (ppi);
1228 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1229 pp_separate_with (ppi, ',');
1230 pp_assignment_expression (ppi, TREE_OPERAND (e, 1));
1231 pp_c_right_paren (ppi);
1236 pp_unsupported_tree (ppi, e);
1244 pp_c_statement (ppi, stmt)
1245 c_pretty_printer ppi;
1248 const enum tree_code code = TREE_CODE (stmt);
1254 if (code == LABEL_STMT)
1255 pp_tree_identifier (ppi, DECL_NAME (LABEL_STMT_LABEL (stmt)));
1256 else if (code == LABEL_STMT)
1258 if (CASE_LOW (stmt) == NULL_TREE)
1259 pp_identifier (ppi, "default");
1262 pp_c_identifier (ppi, "case");
1263 pp_c_whitespace (ppi);
1264 pp_conditional_expression (ppi, CASE_LOW (stmt));
1265 if (CASE_HIGH (stmt))
1267 pp_identifier (ppi, "...");
1268 pp_conditional_expression (ppi, CASE_HIGH (stmt));
1273 pp_newline_and_indent (ppi, 3);
1277 pp_left_brace (ppi);
1278 pp_newline_and_indent (ppi, 3);
1279 for (stmt = COMPOUND_BODY (stmt); stmt; stmt = TREE_CHAIN (stmt))
1280 pp_c_statement (ppi, stmt);
1281 pp_newline_and_indent (ppi, -3);
1282 pp_right_brace (ppi);
1289 pp_c_expression (ppi, code == EXPR_STMT
1290 ? EXPR_STMT_EXPR (stmt)
1291 : CLEANUP_EXPR (stmt));
1297 pp_c_identifier (ppi, "if");
1298 pp_whitespace (ppi);
1299 pp_c_left_paren (ppi);
1300 pp_c_expression (ppi, IF_COND (stmt));
1301 pp_right_paren (ppi);
1302 pp_newline_and_indent (ppi, 3);
1303 pp_statement (ppi, THEN_CLAUSE (stmt));
1304 pp_newline_and_indent (ppi, -3);
1305 if (ELSE_CLAUSE (stmt))
1307 tree else_clause = ELSE_CLAUSE (stmt);
1308 pp_c_identifier (ppi, "else");
1309 if (TREE_CODE (else_clause) == IF_STMT)
1310 pp_c_whitespace (ppi);
1312 pp_newline_and_indent (ppi, 3);
1313 pp_statement (ppi, else_clause);
1314 if (TREE_CODE (else_clause) != IF_STMT)
1315 pp_newline_and_indent (ppi, -3);
1321 pp_c_identifier (ppi, "switch");
1322 pp_whitespace (ppi);
1323 pp_c_left_paren (ppi);
1324 pp_c_expression (ppi, SWITCH_COND (stmt));
1325 pp_right_paren (ppi);
1326 pp_newline_and_indent (ppi, 3);
1327 pp_statement (ppi, SWITCH_BODY (stmt));
1328 pp_newline_and_indent (ppi, -3);
1332 pp_c_identifier (ppi, "while");
1333 pp_whitespace (ppi);
1334 pp_c_left_paren (ppi);
1335 pp_c_expression (ppi, WHILE_COND (stmt));
1336 pp_right_paren (ppi);
1337 pp_newline_and_indent (ppi, 3);
1338 pp_statement (ppi, WHILE_BODY (stmt));
1339 pp_newline_and_indent (ppi, -3);
1343 pp_c_identifier (ppi, "do");
1344 pp_newline_and_indent (ppi, 3);
1345 pp_statement (ppi, DO_BODY (stmt));
1346 pp_newline_and_indent (ppi, -3);
1347 pp_c_identifier (ppi, "while");
1348 pp_whitespace (ppi);
1349 pp_c_left_paren (ppi);
1350 pp_c_expression (ppi, DO_COND (stmt));
1351 pp_c_right_paren (ppi);
1357 pp_c_identifier (ppi, "for");
1358 pp_whitespace (ppi);
1359 pp_c_left_paren (ppi);
1360 pp_statement (ppi, FOR_INIT_STMT (stmt));
1361 pp_c_whitespace (ppi);
1362 if (FOR_COND (stmt))
1363 pp_c_expression (ppi, FOR_COND (stmt));
1365 pp_c_whitespace (ppi);
1366 if (FOR_EXPR (stmt))
1367 pp_c_expression (ppi, FOR_EXPR (stmt));
1368 pp_right_paren (ppi);
1369 pp_newline_and_indent (ppi, 3);
1370 pp_statement (ppi, FOR_BODY (stmt));
1371 pp_newline_and_indent (ppi, -3);
1377 pp_identifier (ppi, code == BREAK_STMT ? "break" : "continue");
1385 tree e = code == RETURN_STMT
1386 ? RETURN_STMT_EXPR (stmt)
1387 : GOTO_DESTINATION (stmt);
1390 pp_c_identifier (ppi, code == RETURN_STMT ? "return" : "goto");
1392 pp_c_expression (ppi, e);
1399 if (!SCOPE_NULLIFIED_P (stmt) && SCOPE_NO_CLEANUPS_P (stmt))
1401 if (SCOPE_BEGIN_P (stmt))
1403 pp_left_brace (ppi);
1404 pp_newline_and_indent (ppi, 3);
1406 else if (SCOPE_END_P (stmt))
1408 pp_right_brace (ppi);
1409 pp_newline_and_indent (ppi, -3);
1415 pp_declaration (ppi, DECL_STMT_DECL (stmt));
1422 bool has_volatile_p = ASM_VOLATILE_P (stmt);
1423 bool is_extended = has_volatile_p || ASM_INPUTS (stmt)
1424 || ASM_OUTPUTS (stmt) || ASM_CLOBBERS (stmt);
1425 pp_c_identifier (ppi, is_extended ? "__asm__" : "asm");
1427 pp_c_identifier (ppi, "__volatile__");
1428 pp_whitespace (ppi);
1429 pp_c_left_paren (ppi);
1430 pp_c_string_literal (ppi, ASM_STRING (stmt));
1433 pp_whitespace (ppi);
1434 pp_separate_with (ppi, ':');
1435 if (ASM_OUTPUTS (stmt))
1436 pp_c_expression (ppi, ASM_OUTPUTS (stmt));
1437 pp_whitespace (ppi);
1438 pp_separate_with (ppi, ':');
1439 if (ASM_INPUTS (stmt))
1440 pp_c_expression (ppi, ASM_INPUTS (stmt));
1441 pp_whitespace (ppi);
1442 pp_separate_with (ppi, ':');
1443 if (ASM_CLOBBERS (stmt))
1444 pp_c_expression (ppi, ASM_CLOBBERS (stmt));
1446 pp_right_paren (ppi);
1452 pp_c_identifier (ppi, "__FILE__");
1453 pp_whitespace (ppi);
1455 pp_c_whitespace (ppi);
1456 pp_c_identifier (ppi, FILE_STMT_FILENAME (stmt));
1462 pp_unsupported_tree (ppi, stmt);
1468 /* Initialize the PRETTY-PRINTER for handling C codes. */
1470 pp_c_pretty_printer_init (pp)
1471 c_pretty_printer pp;
1473 pp->offset_list = 0;
1475 pp->declaration = pp_c_declaration;
1476 pp->declaration_specifiers = pp_c_declaration_specifiers;
1477 pp->type_specifier = pp_c_simple_type_specifier;
1478 pp->declarator = pp_c_declarator;
1479 pp->direct_declarator = pp_c_direct_declarator;
1480 pp->parameter_declaration = pp_c_parameter_declaration;
1481 pp->type_id = pp_c_type_id;
1483 pp->statement = pp_c_statement;
1485 pp->primary_expression = pp_c_primary_expression;
1486 pp->postfix_expression = pp_c_postfix_expression;
1487 pp->unary_expression = pp_c_unary_expression;
1488 pp->initializer = pp_c_initializer;
1489 pp->multiplicative_expression = pp_c_multiplicative_expression;
1490 pp->conditional_expression = pp_c_conditional_expression;
1491 pp->assignment_expression = pp_c_assignment_expression;