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"
28 static void pp_c_char PARAMS ((c_pretty_print_info *, int));
29 static void pp_c_character_literal PARAMS ((c_pretty_print_info *, tree));
30 static void pp_c_bool_literal PARAMS ((c_pretty_print_info *, tree));
31 static bool pp_c_enumerator PARAMS ((c_pretty_print_info *, tree));
32 static void pp_c_integer_literal PARAMS ((c_pretty_print_info *, tree));
33 static void pp_c_real_literal PARAMS ((c_pretty_print_info *, tree));
34 static void pp_c_string_literal PARAMS ((c_pretty_print_info *, tree));
36 static void pp_c_primary_expression PARAMS ((c_pretty_print_info *, tree));
38 /* postfix-expression */
39 static void pp_c_initializer_list PARAMS ((c_pretty_print_info *, tree));
41 static void pp_c_unary_expression PARAMS ((c_pretty_print_info *, tree));
42 static void pp_c_multiplicative_expression PARAMS ((c_pretty_print_info *,
44 static void pp_c_additive_expression PARAMS ((c_pretty_print_info *, tree));
45 static void pp_c_shift_expression PARAMS ((c_pretty_print_info *, tree));
46 static void pp_c_relational_expression PARAMS ((c_pretty_print_info *, tree));
47 static void pp_c_equality_expression PARAMS ((c_pretty_print_info *, tree));
48 static void pp_c_and_expression PARAMS ((c_pretty_print_info *, tree));
49 static void pp_c_exclusive_or_expression PARAMS ((c_pretty_print_info *,
51 static void pp_c_inclusive_or_expression PARAMS ((c_pretty_print_info *,
53 static void pp_c_logical_and_expression PARAMS ((c_pretty_print_info *, tree));
54 static void pp_c_conditional_expression PARAMS ((c_pretty_print_info *, tree));
55 static void pp_c_assignment_expression PARAMS ((c_pretty_print_info *, tree));
58 static void pp_c_specifier_qualifier_list PARAMS ((c_pretty_print_info *, tree));
59 static void pp_c_type_specifier PARAMS ((c_pretty_print_info *, tree));
60 static void pp_c_abstract_declarator PARAMS ((c_pretty_print_info *, tree));
61 static void pp_c_type_id PARAMS ((c_pretty_print_info *, tree));
66 /* Print out CV-qualifiers. Take care of possible extension. */
68 pp_c_cv_qualifier (ppi, cv)
69 c_pretty_print_info *ppi;
72 if (cv & TYPE_QUAL_CONST)
73 pp_c_identifier (ppi, "const");
74 if (cv & TYPE_QUAL_VOLATILE)
75 pp_c_identifier (ppi, "volatile");
76 if (cv & TYPE_QUAL_RESTRICT)
77 pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
81 pp_c_type_specifier (ppi, t)
82 c_pretty_print_info *ppi;
85 const enum tree_code code = TREE_CODE (t);
89 pp_c_identifier (ppi, "<erroneous-type>");
94 pp_c_identifier (ppi, "<unkown-type>");
99 pp_c_tree_identifier (ppi, t);
104 if (TREE_UNSIGNED (t))
105 pp_c_identifier (ppi, "unsigned");
110 if (TYPE_NAME (t) && TYPE_IDENTIFIER (t))
111 pp_c_tree_identifier (t, TYPE_IDENTIFIER (t));
113 pp_c_identifier (ppi, "<anonymous-type>");
119 pp_c_type_specifier (ppi, 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__");
127 pp_c_tree_identifier (ppi, DECL_NAME (t));
133 if (code == UNION_TYPE)
134 pp_c_identifier (ppi, "union");
135 else if (code == RECORD_TYPE)
136 pp_c_identifier (ppi, "struct");
137 else if (code == ENUMERAL_TYPE)
138 pp_c_identifier (ppi, "enum");
141 pp_c_tree_identifier (ppi, TYPE_NAME (t));
143 pp_c_identifier (ppi, "<anonymous>");
153 pp_unsupported_tree (ppi, t);
158 pp_c_specifier_qualifier_list (ppi, t)
159 c_pretty_print_info *ppi;
162 pp_c_type_specifier (ppi, t);
163 pp_c_cv_qualifier (ppi, TYPE_QUALS (t));
167 pp_c_abstract_declarator (ppi, t)
168 c_pretty_print_info *ppi;
171 pp_unsupported_tree (ppi, t);
176 pp_c_type_id (ppi, t)
177 c_pretty_print_info *ppi;
180 pp_c_specifier_qualifier_list (ppi, t);
181 pp_c_abstract_declarator (ppi, t);
187 /* Print out a c-char. */
190 c_pretty_print_info *ppi;
196 pp_identifier (ppi, "\\n");
199 pp_identifier (ppi, "\\t");
202 pp_identifier (ppi, "\\v");
205 pp_identifier (ppi, "\\b");
208 pp_identifier (ppi, "\\r");
211 pp_identifier (ppi, "\\f");
214 pp_identifier (ppi, "\\a");
217 pp_identifier (ppi, "\\\\");
220 pp_identifier (ppi, "\\'");
223 pp_identifier (ppi, "\\\"");
227 pp_character (ppi, c);
229 pp_format_scalar (ppi, "\\%03o", (unsigned) c);
234 /* Print out a STRING literal. */
236 pp_c_string_literal (ppi, s)
237 c_pretty_print_info *ppi;
240 const char *p = TREE_STRING_POINTER (s);
241 int n = TREE_STRING_LENGTH (s) - 1;
243 pp_doublequote (ppi);
244 for (i = 0; i < n; ++i)
245 pp_c_char (ppi, p[i]);
246 pp_doublequote (ppi);
249 /* Print out a CHARACTER literal. */
251 pp_c_character_literal (ppi, c)
252 c_pretty_print_info *ppi;
256 pp_c_char (ppi, tree_low_cst (c, 0));
260 /* Print out a BOOLEAN literal. */
262 pp_c_bool_literal (ppi, b)
263 c_pretty_print_info *ppi;
266 if (b == boolean_false_node || integer_zerop (b))
268 if (c_language == clk_cplusplus)
269 pp_c_identifier (ppi, "false");
270 else if (c_language == clk_c && flag_isoc99)
271 pp_c_identifier (ppi, "_False");
273 pp_unsupported_tree (ppi, b);
275 else if (b == boolean_true_node)
277 if (c_language == clk_cplusplus)
278 pp_c_identifier (ppi, "true");
279 else if (c_language == clk_c && flag_isoc99)
280 pp_c_identifier (ppi, "_True");
282 pp_unsupported_tree (ppi, b);
285 pp_unsupported_tree (ppi, b);
288 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
289 false; that means the value was obtained by a cast, in which case
290 print out the type-id part of the cast-expression -- the casted value
291 is then printed by pp_c_integer_literal. */
293 pp_c_enumerator (ppi, e)
294 c_pretty_print_info *ppi;
297 tree type = TREE_TYPE (e);
300 /* Find the name of this constant. */
301 for (value = TYPE_VALUES (type);
302 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
303 value = TREE_CHAIN (value))
306 if (value != NULL_TREE)
307 pp_c_tree_identifier (ppi, TREE_PURPOSE (value));
310 /* Value must have been cast. */
311 pp_c_left_paren (ppi);
312 pp_type_id (ppi, type);
313 pp_c_right_paren (ppi);
320 /* Print out an INTEGER constant value. */
322 pp_c_integer_literal (ppi, i)
323 c_pretty_print_info *ppi;
326 tree type = TREE_TYPE (i);
328 if (type == boolean_type_node)
329 pp_c_bool_literal (ppi, i);
330 else if (type == char_type_node)
331 pp_c_character_literal (ppi, i);
332 else if (TREE_CODE (type) == ENUMERAL_TYPE
333 && pp_c_enumerator (ppi, i))
337 if (host_integerp (i, 0))
338 pp_wide_integer (ppi, TREE_INT_CST_LOW (i));
341 if (tree_int_cst_sgn (i) < 0)
343 static char format[10]; /* "%x%09999x\0" */
345 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
347 pp_c_char (ppi, '-');
348 i = build_int_2 (-TREE_INT_CST_LOW (i),
349 ~TREE_INT_CST_HIGH (i) + !TREE_INT_CST_LOW (i));
350 sprintf (pp_buffer (ppi)->digit_buffer, format,
351 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
352 pp_identifier (ppi, pp_buffer (ppi)->digit_buffer);
359 /* Print out a REAL value. */
361 pp_c_real_literal (ppi, r)
362 c_pretty_print_info *ppi;
365 REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (r), "%.16g",
366 pp_buffer (ppi)->digit_buffer);
367 pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
372 pp_c_literal (ppi, e)
373 c_pretty_print_info *ppi;
376 switch (TREE_CODE (e))
379 pp_c_integer_literal (ppi, e);
383 pp_c_real_literal (ppi, e);
387 pp_c_string_literal (ppi, e);
391 pp_unsupported_tree (ppi, e);
396 /* Pretty-print a C primary-expression. */
398 pp_c_primary_expression (ppi, e)
399 c_pretty_print_info *ppi;
402 switch (TREE_CODE (e))
412 case IDENTIFIER_NODE:
413 pp_c_tree_identifier (ppi, e);
417 pp_c_identifier (ppi, "<erroneous-expression>");
421 pp_c_identifier (ppi, "<return-value>");
427 pp_c_literal (ppi, e);
431 pp_c_left_paren (ppi);
432 pp_c_identifier (ppi, "__builtin_memcpy");
433 pp_c_left_paren (ppi);
435 pp_c_primary_expression (ppi, TREE_OPERAND (e, 0));
436 pp_separate_with (ppi, ',');
438 pp_initializer (ppi, TREE_OPERAND (e, 1));
439 if (TREE_OPERAND (e, 2))
441 pp_separate_with (ppi, ',');
442 pp_c_expression (ppi, TREE_OPERAND (e, 2));
444 pp_c_right_paren (ppi);
447 pp_c_left_paren (ppi);
448 pp_statement (ppi, STMT_EXPR_STMT (e));
449 pp_c_right_paren (ppi);
453 /* Make sure this call won't cause any infinite loop. */
454 pp_c_left_paren (ppi);
455 pp_c_expression (ppi, e);
456 pp_c_right_paren (ppi);
461 /* Print out a C initializer -- also support C compound-literals. */
463 pp_c_initializer (ppi, e)
464 c_pretty_print_info *ppi;
467 if (TREE_CODE (e) == CONSTRUCTOR)
469 enum tree_code code = TREE_CODE (TREE_TYPE (e));
470 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
473 pp_c_initializer_list (ppi, e);
474 pp_right_brace (ppi);
477 pp_unsupported_tree (ppi, TREE_OPERAND (e, 1));
480 pp_assignment_expression (ppi, e);
484 pp_c_initializer_list (ppi, e)
485 c_pretty_print_info *ppi;
488 tree type = TREE_TYPE (e);
489 const enum tree_code code = TREE_CODE (type);
491 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
493 tree init = TREE_OPERAND (e, 1);
494 for (; init != NULL_TREE; init = TREE_CHAIN (init))
496 if (code == RECORD_TYPE || code == UNION_TYPE)
499 pp_c_primary_expression (ppi, TREE_PURPOSE (init));
503 pp_c_left_bracket (ppi);
504 if (TREE_PURPOSE (init))
505 pp_c_literal (ppi, TREE_PURPOSE (init));
506 pp_c_right_bracket (ppi);
508 pp_c_whitespace (ppi);
510 pp_c_whitespace (ppi);
511 pp_initializer (ppi, TREE_VALUE (init));
512 if (TREE_CHAIN (init))
513 pp_separate_with (ppi, ',');
517 pp_unsupported_tree (ppi, type);
521 pp_c_postfix_expression (ppi, e)
522 c_pretty_print_info *ppi;
525 enum tree_code code = TREE_CODE (e);
528 case POSTINCREMENT_EXPR:
529 case POSTDECREMENT_EXPR:
530 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
531 pp_identifier (ppi, code == POSTINCREMENT_EXPR ? "++" : "--");
535 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
540 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
541 pp_c_left_bracket (ppi);
542 pp_c_expression (ppi, TREE_OPERAND (e, 1));
543 pp_c_right_bracket (ppi);
547 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
548 pp_c_left_paren (ppi);
549 pp_c_expression_list (ppi, TREE_OPERAND (e, 1));
550 pp_c_right_paren (ppi);
555 pp_c_identifier (ppi,
556 code == ABS_EXPR ? "__builtin_abs" : "__builtin_ffs");
557 pp_c_left_paren (ppi);
558 pp_c_expression (ppi, TREE_OPERAND (e, 0));
559 pp_c_right_paren (ppi);
564 tree object = TREE_OPERAND (e, 0);
565 if (TREE_CODE (object) == INDIRECT_REF)
567 pp_postfix_expression (ppi, TREE_OPERAND (object, 0));
572 pp_postfix_expression (ppi, object);
575 pp_c_expression (ppi, TREE_OPERAND (e, 1));
582 pp_c_left_paren (ppi);
583 pp_type_id (ppi, TREE_TYPE (e));
584 pp_c_right_paren (ppi);
587 if (code == COMPLEX_CST)
589 pp_c_expression (ppi, TREE_REALPART (e));
590 pp_separate_with (ppi, ',');
591 pp_c_expression (ppi, TREE_IMAGPART (e));
593 else if (code == VECTOR_CST)
594 pp_c_expression_list (ppi, TREE_VECTOR_CST_ELTS (e));
595 else if (code == COMPLEX_EXPR)
597 pp_c_expression (ppi, TREE_OPERAND (e, 0));
598 pp_separate_with (ppi, ',');
599 pp_c_expression (ppi, TREE_OPERAND (e, 1));
602 pp_right_brace (ppi);
605 case COMPOUND_LITERAL_EXPR:
606 e = DECL_INITIAL (e);
609 pp_initializer (ppi, e);
615 pp_identifier (ppi, "__location__");
616 pp_right_paren (ppi);
620 pp_identifier (ppi, "file");
623 pp_c_whitespace (ppi);
624 pp_c_expression (ppi, SRCLOC_FILE (e));
625 pp_separate_with (ppi, ',');
627 pp_identifier (ppi, "line");
630 pp_c_whitespace (ppi);
631 pp_c_expression (ppi, SRCLOC_LINE (e));
632 pp_right_brace (ppi);
637 pp_c_identifier (ppi, "__builtin_va_arg");
638 pp_c_left_paren (ppi);
639 pp_assignment_expression (ppi, TREE_OPERAND (e, 0));
640 pp_separate_with (ppi, ',');
641 pp_type_id (ppi, TREE_TYPE (e));
642 pp_c_right_paren (ppi);
646 pp_primary_expression (ppi, e);
651 /* Print out an expression-list; E is expected to be a TREE_LIST */
653 pp_c_expression_list (ppi, e)
654 c_pretty_print_info *ppi;
657 for (; e != NULL_TREE; e = TREE_CHAIN (e))
659 pp_c_assignment_expression (ppi, TREE_VALUE (e));
661 pp_separate_with (ppi, ',');
666 pp_c_unary_expression (ppi, e)
667 c_pretty_print_info *ppi;
670 enum tree_code code = TREE_CODE (e);
673 case PREINCREMENT_EXPR:
674 case PREDECREMENT_EXPR:
675 pp_identifier (ppi, code == PREINCREMENT_EXPR ? "++" : "--");
676 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
686 if (code == ADDR_EXPR)
688 else if (code == INDIRECT_REF)
690 else if (code == NEGATE_EXPR)
692 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
694 else if (code == TRUTH_NOT_EXPR)
695 pp_exclamation (ppi);
696 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
701 pp_c_identifier (ppi, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
702 pp_c_whitespace (ppi);
703 if (TYPE_P (TREE_OPERAND (e, 0)))
705 pp_c_left_paren (ppi);
706 pp_type_id (ppi, TREE_OPERAND (e, 0));
707 pp_c_right_paren (ppi);
710 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
715 pp_c_identifier (ppi, code == REALPART_EXPR ? "__real__" : "__imag__");
716 pp_c_whitespace (ppi);
717 pp_unary_expression (ppi, TREE_OPERAND (e, 0));
721 pp_postfix_expression (ppi, e);
727 pp_c_cast_expression (ppi, e)
728 c_pretty_print_info *ppi;
731 if (TREE_CODE (e) == CONVERT_EXPR || TREE_CODE (e) == FLOAT_EXPR)
733 pp_c_left_paren (ppi);
734 pp_type_id (ppi, TREE_TYPE (e));
735 pp_c_right_paren (ppi);
736 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
739 pp_unary_expression (ppi, e);
743 pp_c_multiplicative_expression (ppi, e)
744 c_pretty_print_info *ppi;
747 enum tree_code code = TREE_CODE (e);
753 pp_c_multiplicative_expression (ppi, TREE_OPERAND (e, 0));
754 pp_c_whitespace (ppi);
755 if (code == MULT_EXPR)
757 else if (code == TRUNC_DIV_EXPR)
761 pp_c_whitespace (ppi);
762 pp_c_cast_expression (ppi, TREE_OPERAND (e, 1));
766 pp_c_cast_expression (ppi, e);
772 pp_c_additive_expression (ppi, e)
773 c_pretty_print_info *ppi;
776 enum tree_code code = TREE_CODE (e);
781 pp_c_additive_expression (ppi, TREE_OPERAND (e, 0));
782 pp_c_whitespace (ppi);
783 if (code == PLUS_EXPR)
787 pp_c_whitespace (ppi);
788 pp_multiplicative_expression (ppi, TREE_OPERAND (e, 1));
792 pp_multiplicative_expression (ppi, e);
798 pp_c_shift_expression (ppi, e)
799 c_pretty_print_info *ppi;
802 enum tree_code code = TREE_CODE (e);
807 pp_c_shift_expression (ppi, TREE_OPERAND (e, 0));
808 pp_c_whitespace (ppi);
809 pp_identifier (ppi, code == LSHIFT_EXPR ? "<<" : ">>");
810 pp_c_whitespace (ppi);
811 pp_c_additive_expression (ppi, TREE_OPERAND (e, 1));
815 pp_c_additive_expression (ppi, e);
820 pp_c_relational_expression (ppi, e)
821 c_pretty_print_info *ppi;
824 enum tree_code code = TREE_CODE (e);
831 pp_c_relational_expression (ppi, TREE_OPERAND (e, 0));
832 pp_c_whitespace (ppi);
835 else if (code == GT_EXPR)
837 else if (code == LE_EXPR)
838 pp_identifier (ppi, "<=");
839 else if (code == GE_EXPR)
840 pp_identifier (ppi, ">=");
841 pp_c_whitespace (ppi);
842 pp_c_shift_expression (ppi, TREE_OPERAND (e, 1));
846 pp_c_shift_expression (ppi, e);
852 pp_c_equality_expression (ppi, e)
853 c_pretty_print_info *ppi;
856 enum tree_code code = TREE_CODE (e);
861 pp_c_equality_expression (ppi, TREE_OPERAND (e, 0));
862 pp_c_maybe_whitespace (ppi);
863 pp_identifier (ppi, code == EQ_EXPR ? "==" : "!=");
864 pp_c_whitespace (ppi);
865 pp_c_relational_expression (ppi, TREE_OPERAND (e, 1));
869 pp_c_relational_expression (ppi, e);
875 pp_c_and_expression (ppi, e)
876 c_pretty_print_info *ppi;
879 if (TREE_CODE (e) == BIT_AND_EXPR)
881 pp_c_and_expression (ppi, TREE_OPERAND (e, 0));
882 pp_c_maybe_whitespace (ppi);
884 pp_c_whitespace (ppi);
885 pp_c_equality_expression (ppi, TREE_OPERAND (e, 1));
888 pp_c_equality_expression (ppi, e);
892 pp_c_exclusive_or_expression (ppi, e)
893 c_pretty_print_info *ppi;
896 if (TREE_CODE (e) == BIT_XOR_EXPR)
898 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
899 pp_c_maybe_whitespace (ppi);
901 pp_c_whitespace (ppi);
902 pp_c_and_expression (ppi, TREE_OPERAND (e, 1));
905 pp_c_and_expression (ppi, e);
909 pp_c_inclusive_or_expression (ppi, e)
910 c_pretty_print_info *ppi;
913 if (TREE_CODE (e) == BIT_IOR_EXPR)
915 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
916 pp_c_maybe_whitespace (ppi);
918 pp_c_whitespace (ppi);
919 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 1));
922 pp_c_exclusive_or_expression (ppi, e);
926 pp_c_logical_and_expression (ppi, e)
927 c_pretty_print_info *ppi;
930 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
932 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 0));
933 pp_c_maybe_whitespace (ppi);
934 pp_identifier (ppi, "&&");
935 pp_c_whitespace (ppi);
936 pp_c_inclusive_or_expression (ppi, TREE_OPERAND (e, 1));
939 pp_c_inclusive_or_expression (ppi, e);
943 pp_c_logical_or_expression (ppi, e)
944 c_pretty_print_info *ppi;
947 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
949 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
950 pp_c_maybe_whitespace (ppi);
951 pp_identifier (ppi, "||");
952 pp_c_whitespace (ppi);
953 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 1));
956 pp_c_logical_and_expression (ppi, e);
960 pp_c_conditional_expression (ppi, e)
961 c_pretty_print_info *ppi;
964 if (TREE_CODE (e) == COND_EXPR)
966 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
967 pp_c_maybe_whitespace (ppi);
969 pp_c_whitespace (ppi);
970 pp_c_expression (ppi, TREE_OPERAND (e, 1));
971 pp_c_maybe_whitespace (ppi);
973 pp_c_whitespace (ppi);
974 pp_c_conditional_expression (ppi, TREE_OPERAND (e, 2));
977 pp_c_logical_or_expression (ppi, e);
981 /* Pretty-print a C assignment-expression. */
983 pp_c_assignment_expression (ppi, e)
984 c_pretty_print_info *ppi;
987 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
989 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
990 pp_c_maybe_whitespace (ppi);
993 pp_c_assignment_expression (ppi, TREE_OPERAND (e, 1));
996 pp_c_conditional_expression (ppi, e);
999 /* Pretty-print an expression. */
1001 pp_c_expression (ppi, e)
1002 c_pretty_print_info *ppi;
1005 switch (TREE_CODE (e))
1008 pp_c_integer_literal (ppi, e);
1012 pp_c_real_literal (ppi, e);
1016 pp_c_string_literal (ppi, e);
1029 pp_c_primary_expression (ppi, e);
1032 case POSTINCREMENT_EXPR:
1033 case POSTDECREMENT_EXPR:
1043 case COMPOUND_LITERAL_EXPR:
1046 pp_c_postfix_expression (ppi, e);
1054 case TRUTH_NOT_EXPR:
1055 case PREINCREMENT_EXPR:
1056 case PREDECREMENT_EXPR:
1061 pp_c_unary_expression (ppi, e);
1066 pp_c_cast_expression (ppi, e);
1070 case TRUNC_MOD_EXPR:
1071 case TRUNC_DIV_EXPR:
1072 pp_c_multiplicative_expression (ppi, e);
1077 pp_c_shift_expression (ppi, e);
1084 pp_c_relational_expression (ppi, e);
1088 pp_c_and_expression (ppi, e);
1092 pp_c_exclusive_or_expression (ppi, e);
1096 pp_c_inclusive_or_expression (ppi, e);
1099 case TRUTH_ANDIF_EXPR:
1100 pp_c_logical_and_expression (ppi, e);
1103 case TRUTH_ORIF_EXPR:
1104 pp_c_logical_or_expression (ppi, e);
1108 pp_c_conditional_expression (ppi, e);
1113 pp_c_assignment_expression (ppi, e);
1117 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1121 pp_c_left_paren (ppi);
1122 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1123 pp_separate_with (ppi, ',');
1124 pp_assignment_expression (ppi, TREE_OPERAND (e, 1));
1125 pp_c_right_paren (ppi);
1130 pp_unsupported_tree (ppi, e);
1138 pp_c_statement (ppi, stmt)
1139 c_pretty_print_info *ppi;
1142 const enum tree_code code = TREE_CODE (stmt);
1148 if (code == LABEL_STMT)
1149 pp_tree_identifier (ppi, DECL_NAME (LABEL_STMT_LABEL (stmt)));
1150 else if (code == LABEL_STMT)
1152 if (CASE_LOW (stmt) == NULL_TREE)
1153 pp_identifier (ppi, "default");
1156 pp_c_identifier (ppi, "case");
1157 pp_c_whitespace (ppi);
1158 pp_conditional_expression (ppi, CASE_LOW (stmt));
1159 if (CASE_HIGH (stmt))
1161 pp_identifier (ppi, "...");
1162 pp_conditional_expression (ppi, CASE_HIGH (stmt));
1167 pp_newline_and_indent (ppi, 3);
1171 pp_left_brace (ppi);
1172 pp_newline_and_indent (ppi, 3);
1173 for (stmt = COMPOUND_BODY (stmt); stmt; stmt = TREE_CHAIN (stmt))
1174 pp_c_statement (ppi, stmt);
1175 pp_newline_and_indent (ppi, -3);
1176 pp_right_brace (ppi);
1183 pp_c_expression (ppi, code == EXPR_STMT
1184 ? EXPR_STMT_EXPR (stmt)
1185 : CLEANUP_EXPR (stmt));
1191 pp_c_identifier (ppi, "if");
1192 pp_whitespace (ppi);
1193 pp_c_left_paren (ppi);
1194 pp_c_expression (ppi, IF_COND (stmt));
1195 pp_right_paren (ppi);
1196 pp_newline_and_indent (ppi, 3);
1197 pp_statement (ppi, THEN_CLAUSE (stmt));
1198 pp_newline_and_indent (ppi, -3);
1199 if (ELSE_CLAUSE (stmt))
1201 tree else_clause = ELSE_CLAUSE (stmt);
1202 pp_c_identifier (ppi, "else");
1203 if (TREE_CODE (else_clause) == IF_STMT)
1204 pp_c_whitespace (ppi);
1206 pp_newline_and_indent (ppi, 3);
1207 pp_statement (ppi, else_clause);
1208 if (TREE_CODE (else_clause) != IF_STMT)
1209 pp_newline_and_indent (ppi, -3);
1215 pp_c_identifier (ppi, "switch");
1216 pp_whitespace (ppi);
1217 pp_c_left_paren (ppi);
1218 pp_c_expression (ppi, SWITCH_COND (stmt));
1219 pp_right_paren (ppi);
1220 pp_newline_and_indent (ppi, 3);
1221 pp_statement (ppi, SWITCH_BODY (stmt));
1222 pp_newline_and_indent (ppi, -3);
1226 pp_c_identifier (ppi, "while");
1227 pp_whitespace (ppi);
1228 pp_c_left_paren (ppi);
1229 pp_c_expression (ppi, WHILE_COND (stmt));
1230 pp_right_paren (ppi);
1231 pp_newline_and_indent (ppi, 3);
1232 pp_statement (ppi, WHILE_BODY (stmt));
1233 pp_newline_and_indent (ppi, -3);
1237 pp_c_identifier (ppi, "do");
1238 pp_newline_and_indent (ppi, 3);
1239 pp_statement (ppi, DO_BODY (stmt));
1240 pp_newline_and_indent (ppi, -3);
1241 pp_c_identifier (ppi, "while");
1242 pp_whitespace (ppi);
1243 pp_c_left_paren (ppi);
1244 pp_c_expression (ppi, DO_COND (stmt));
1245 pp_c_right_paren (ppi);
1251 pp_c_identifier (ppi, "for");
1252 pp_whitespace (ppi);
1253 pp_c_left_paren (ppi);
1254 pp_statement (ppi, FOR_INIT_STMT (stmt));
1255 pp_c_whitespace (ppi);
1256 if (FOR_COND (stmt))
1257 pp_c_expression (ppi, FOR_COND (stmt));
1259 pp_c_whitespace (ppi);
1260 if (FOR_EXPR (stmt))
1261 pp_c_expression (ppi, FOR_EXPR (stmt));
1262 pp_right_paren (ppi);
1263 pp_newline_and_indent (ppi, 3);
1264 pp_statement (ppi, FOR_BODY (stmt));
1265 pp_newline_and_indent (ppi, -3);
1271 pp_identifier (ppi, code == BREAK_STMT ? "break" : "continue");
1279 tree e = code == RETURN_STMT
1280 ? RETURN_EXPR (stmt)
1281 : GOTO_DESTINATION (stmt);
1284 pp_c_identifier (ppi, code == RETURN_STMT ? "return" : "goto");
1286 pp_c_expression (ppi, e);
1293 if (!SCOPE_NULLIFIED_P (stmt) && SCOPE_NO_CLEANUPS_P (stmt))
1295 if (SCOPE_BEGIN_P (stmt))
1297 pp_left_brace (ppi);
1298 pp_newline_and_indent (ppi, 3);
1300 else if (SCOPE_END_P (stmt))
1302 pp_right_brace (ppi);
1303 pp_newline_and_indent (ppi, -3);
1309 pp_declaration (ppi, DECL_STMT_DECL (stmt));
1316 bool has_volatile_p = ASM_VOLATILE_P (stmt);
1317 bool is_extended = has_volatile_p || ASM_INPUTS (stmt)
1318 || ASM_OUTPUTS (stmt) || ASM_CLOBBERS (stmt);
1319 pp_c_identifier (ppi, is_extended ? "__asm__" : "asm");
1321 pp_c_identifier (ppi, "__volatile__");
1322 pp_whitespace (ppi);
1323 pp_c_left_paren (ppi);
1324 pp_c_string_literal (ppi, ASM_STRING (stmt));
1327 pp_whitespace (ppi);
1328 pp_separate_with (ppi, ':');
1329 if (ASM_OUTPUTS (stmt))
1330 pp_c_expression (ppi, ASM_OUTPUTS (stmt));
1331 pp_whitespace (ppi);
1332 pp_separate_with (ppi, ':');
1333 if (ASM_INPUTS (stmt))
1334 pp_c_expression (ppi, ASM_INPUTS (stmt));
1335 pp_whitespace (ppi);
1336 pp_separate_with (ppi, ':');
1337 if (ASM_CLOBBERS (stmt))
1338 pp_c_expression (ppi, ASM_CLOBBERS (stmt));
1340 pp_right_paren (ppi);
1346 pp_c_identifier (ppi, "__FILE__");
1347 pp_whitespace (ppi);
1349 pp_c_whitespace (ppi);
1350 pp_c_identifier (ppi, FILE_STMT_FILENAME (stmt));
1356 pp_unsupported_tree (ppi, stmt);