1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002, 2003 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
24 #include "coretypes.h"
27 #include "c-pretty-print.h"
30 /* The pretty-printer code is primarily designed to closely follow
31 (GNU) C and C++ grammars. That is to be contrasted with spaghetti
32 codes we used to have in the past. Following a structured
33 approach (preferaably the official grammars) is believed to make it
34 much easier o add extensions and nifty pretty-printing effects that
35 takes expresssion or declaration contexts into account. */
38 static void pp_c_char (c_pretty_printer, int);
39 static void pp_c_character_literal (c_pretty_printer, tree);
40 static void pp_c_bool_literal (c_pretty_printer, tree);
41 static bool pp_c_enumerator (c_pretty_printer, tree);
42 static void pp_c_integer_literal (c_pretty_printer, tree);
43 static void pp_c_real_literal (c_pretty_printer, tree);
44 static void pp_c_string_literal (c_pretty_printer, tree);
46 static void pp_c_primary_expression (c_pretty_printer, tree);
48 /* postfix-expression */
49 static void pp_c_initializer_list (c_pretty_printer, tree);
51 static void pp_c_unary_expression (c_pretty_printer, tree);
52 static void pp_c_multiplicative_expression (c_pretty_printer, tree);
53 static void pp_c_additive_expression (c_pretty_printer, tree);
54 static void pp_c_shift_expression (c_pretty_printer, tree);
55 static void pp_c_relational_expression (c_pretty_printer, tree);
56 static void pp_c_equality_expression (c_pretty_printer, tree);
57 static void pp_c_and_expression (c_pretty_printer, tree);
58 static void pp_c_exclusive_or_expression (c_pretty_printer, tree);
59 static void pp_c_inclusive_or_expression (c_pretty_printer, tree);
60 static void pp_c_logical_and_expression (c_pretty_printer, tree);
61 static void pp_c_conditional_expression (c_pretty_printer, tree);
62 static void pp_c_assignment_expression (c_pretty_printer, tree);
65 static void pp_c_declaration_specifiers (c_pretty_printer, tree);
66 static void pp_c_init_declarator (c_pretty_printer, tree);
67 static void pp_c_declarator (c_pretty_printer, tree);
68 static void pp_c_direct_declarator (c_pretty_printer, tree);
69 static void pp_c_abstract_declarator (c_pretty_printer, tree);
70 static void pp_c_specifier_qualifier_list (c_pretty_printer, tree);
71 static void pp_c_simple_type_specifier (c_pretty_printer, tree);
72 static void pp_c_parameter_declaration (c_pretty_printer, tree);
73 static void pp_c_type_id (c_pretty_printer, tree);
74 static void pp_c_storage_class_specifier (c_pretty_printer, tree);
75 static void pp_c_function_specifier (c_pretty_printer, tree);
80 /* Print out CV-qualifiers. Take care of possible extensions.
87 pp_c_cv_qualifier (c_pretty_printer ppi, int cv)
89 if (cv & TYPE_QUAL_CONST)
90 pp_c_identifier (ppi, "const");
91 if (cv & TYPE_QUAL_VOLATILE)
92 pp_c_identifier (ppi, "volatile");
93 if (cv & TYPE_QUAL_RESTRICT)
94 pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
98 simple-type-specifier:
114 simple-type-specifier:
118 pp_c_simple_type_specifier (c_pretty_printer ppi, tree t)
120 const enum tree_code code = TREE_CODE (t);
124 pp_c_identifier (ppi, "<type-error>");
129 pp_c_identifier (ppi, "<unkown-type>");
133 case IDENTIFIER_NODE:
134 pp_c_tree_identifier (ppi, t);
142 pp_c_tree_identifier (ppi, DECL_NAME (t));
147 pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
148 if (code == COMPLEX_TYPE)
149 pp_c_identifier (ppi, flag_isoc99 ? "_Complex" : "__complex__");
150 else if (code == VECTOR_TYPE)
151 pp_c_identifier (ppi, "__vector__");
156 pp_c_tree_identifier (ppi, DECL_NAME (t));
158 pp_c_identifier (ppi, "<typedef-error>");
164 if (code == UNION_TYPE)
165 pp_c_identifier (ppi, "union");
166 else if (code == RECORD_TYPE)
167 pp_c_identifier (ppi, "struct");
168 else if (code == ENUMERAL_TYPE)
169 pp_c_identifier (ppi, "enum");
171 pp_c_identifier (ppi, "<tag-error>");
174 pp_c_tree_identifier (ppi, TYPE_NAME (t));
176 pp_c_identifier (ppi, "<anonymous>");
180 pp_unsupported_tree (ppi, t);
184 /* specifier-qualifier-list:
185 type-specifier specifier-qualifier-list-opt
186 cv-qualifier specifier-qualifier-list-opt */
188 pp_c_specifier_qualifier_list (c_pretty_printer ppi, tree t)
190 pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
191 pp_c_cv_qualifier (ppi, TYPE_QUALS (t));
195 pp_c_abstract_declarator (c_pretty_printer ppi, tree t)
197 pp_unsupported_tree (ppi, t);
202 pp_c_type_id (c_pretty_printer ppi, tree t)
204 pp_c_specifier_qualifier_list (ppi, t);
205 pp_c_abstract_declarator (ppi, t);
209 pp_c_storage_class_specifier (c_pretty_printer pp, tree t)
211 if (TREE_CODE (t) == TYPE_DECL)
212 pp_c_identifier (pp, "typedef");
213 else if (DECL_REGISTER (t))
214 pp_c_identifier (pp, "register");
218 pp_c_function_specifier (c_pretty_printer pp, tree t)
220 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
221 pp_c_identifier (pp, "inline");
225 pp_c_declaration_specifiers (c_pretty_printer pp, tree t)
227 pp_c_storage_class_specifier (pp, t);
228 pp_c_function_specifier (pp, t);
229 pp_type_specifier (pp, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
230 pp_c_cv_qualifier (pp, TYPE_QUALS (TREE_TYPE (t)));
234 pp_c_direct_declarator (c_pretty_printer pp, tree t)
236 pp_unsupported_tree (pp, t);
240 pp_c_declarator (c_pretty_printer pp, tree t)
242 pp_unsupported_tree (pp, t);
246 pp_c_init_declarator (c_pretty_printer pp, tree t)
248 pp_declarator (pp, t);
249 if (DECL_INITIAL (t))
254 pp_c_initializer (pp, DECL_INITIAL (t));
259 pp_c_declaration (c_pretty_printer pp, tree t)
261 pp_declaration_specifiers (pp, t);
262 pp_c_init_declarator (pp, t);
266 pp_c_parameter_declaration (c_pretty_printer pp, tree t)
268 pp_unsupported_tree (pp, t);
271 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
273 pp_c_attributes (c_pretty_printer pp, tree attributes)
275 if (attributes == NULL_TREE)
278 pp_c_identifier (pp, "__attribute__");
279 pp_c_left_paren (pp);
280 pp_c_left_paren (pp);
281 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
283 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
284 if (TREE_VALUE (attributes))
286 pp_c_left_paren (pp);
287 pp_c_expression_list (pp, TREE_VALUE (attributes));
288 pp_c_right_paren (pp);
291 if (TREE_CHAIN (attributes))
292 pp_separate_with (pp, ',');
294 pp_c_right_paren (pp);
295 pp_c_right_paren (pp);
301 /* Print out a c-char. */
303 pp_c_char (c_pretty_printer ppi, int c)
308 pp_identifier (ppi, "\\n");
311 pp_identifier (ppi, "\\t");
314 pp_identifier (ppi, "\\v");
317 pp_identifier (ppi, "\\b");
320 pp_identifier (ppi, "\\r");
323 pp_identifier (ppi, "\\f");
326 pp_identifier (ppi, "\\a");
329 pp_identifier (ppi, "\\\\");
332 pp_identifier (ppi, "\\'");
335 pp_identifier (ppi, "\\\"");
339 pp_character (ppi, c);
341 pp_format_scalar (ppi, "\\%03o", (unsigned) c);
346 /* Print out a STRING literal. */
348 pp_c_string_literal (c_pretty_printer ppi, tree s)
350 const char *p = TREE_STRING_POINTER (s);
351 int n = TREE_STRING_LENGTH (s) - 1;
353 pp_doublequote (ppi);
354 for (i = 0; i < n; ++i)
355 pp_c_char (ppi, p[i]);
356 pp_doublequote (ppi);
359 /* Print out a CHARACTER literal. */
361 pp_c_character_literal (c_pretty_printer ppi, tree c)
364 pp_c_char (ppi, tree_low_cst (c, 0));
368 /* Print out a BOOLEAN literal. */
370 pp_c_bool_literal (c_pretty_printer ppi, tree b)
372 if (b == boolean_false_node || integer_zerop (b))
374 if (c_dialect_cxx ())
375 pp_c_identifier (ppi, "false");
376 else if (flag_isoc99)
377 pp_c_identifier (ppi, "_False");
379 pp_unsupported_tree (ppi, b);
381 else if (b == boolean_true_node)
383 if (c_dialect_cxx ())
384 pp_c_identifier (ppi, "true");
385 else if (flag_isoc99)
386 pp_c_identifier (ppi, "_True");
388 pp_unsupported_tree (ppi, b);
391 pp_unsupported_tree (ppi, b);
394 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
395 false; that means the value was obtained by a cast, in which case
396 print out the type-id part of the cast-expression -- the casted value
397 is then printed by pp_c_integer_literal. */
399 pp_c_enumerator (c_pretty_printer ppi, tree e)
401 tree type = TREE_TYPE (e);
404 /* Find the name of this constant. */
405 for (value = TYPE_VALUES (type);
406 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
407 value = TREE_CHAIN (value))
410 if (value != NULL_TREE)
411 pp_c_tree_identifier (ppi, TREE_PURPOSE (value));
414 /* Value must have been cast. */
415 pp_c_left_paren (ppi);
416 pp_type_id (ppi, type);
417 pp_c_right_paren (ppi);
424 /* Print out an INTEGER constant value. */
426 pp_c_integer_literal (c_pretty_printer ppi, tree i)
428 tree type = TREE_TYPE (i);
430 if (type == boolean_type_node)
431 pp_c_bool_literal (ppi, i);
432 else if (type == char_type_node)
433 pp_c_character_literal (ppi, i);
434 else if (TREE_CODE (type) == ENUMERAL_TYPE
435 && pp_c_enumerator (ppi, i))
439 if (host_integerp (i, 0))
440 pp_wide_integer (ppi, TREE_INT_CST_LOW (i));
443 if (tree_int_cst_sgn (i) < 0)
445 pp_c_char (ppi, '-');
446 i = build_int_2 (-TREE_INT_CST_LOW (i),
447 ~TREE_INT_CST_HIGH (i) + !TREE_INT_CST_LOW (i));
448 sprintf (pp_buffer (ppi)->digit_buffer,
449 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
450 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
451 pp_identifier (ppi, pp_buffer (ppi)->digit_buffer);
458 /* Print out a REAL value. */
460 pp_c_real_literal (c_pretty_printer ppi, tree r)
462 real_to_decimal (pp_buffer (ppi)->digit_buffer, &TREE_REAL_CST (r),
463 sizeof (pp_buffer (ppi)->digit_buffer), 0, 1);
464 pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
469 pp_c_literal (c_pretty_printer ppi, tree e)
471 switch (TREE_CODE (e))
474 pp_c_integer_literal (ppi, e);
478 pp_c_real_literal (ppi, e);
482 pp_c_string_literal (ppi, e);
486 pp_unsupported_tree (ppi, e);
491 /* Pretty-print a C primary-expression. */
493 pp_c_primary_expression (c_pretty_printer ppi, tree e)
495 switch (TREE_CODE (e))
505 case IDENTIFIER_NODE:
506 pp_c_tree_identifier (ppi, e);
510 pp_c_identifier (ppi, "<erroneous-expression>");
514 pp_c_identifier (ppi, "<return-value>");
520 pp_c_literal (ppi, e);
524 pp_c_left_paren (ppi);
525 pp_c_identifier (ppi, "__builtin_memcpy");
526 pp_c_left_paren (ppi);
528 pp_c_primary_expression (ppi, TREE_OPERAND (e, 0));
529 pp_separate_with (ppi, ',');
531 pp_initializer (ppi, TREE_OPERAND (e, 1));
532 if (TREE_OPERAND (e, 2))
534 pp_separate_with (ppi, ',');
535 pp_c_expression (ppi, TREE_OPERAND (e, 2));
537 pp_c_right_paren (ppi);
540 pp_c_left_paren (ppi);
541 pp_statement (ppi, STMT_EXPR_STMT (e));
542 pp_c_right_paren (ppi);
546 /* Make sure this call won't cause any infinite loop. */
547 pp_c_left_paren (ppi);
548 pp_c_expression (ppi, e);
549 pp_c_right_paren (ppi);
554 /* Print out a C initializer -- also support C compound-literals. */
556 pp_c_initializer (c_pretty_printer ppi, tree e)
558 if (TREE_CODE (e) == CONSTRUCTOR)
560 enum tree_code code = TREE_CODE (TREE_TYPE (e));
561 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
564 pp_c_initializer_list (ppi, e);
565 pp_right_brace (ppi);
568 pp_unsupported_tree (ppi, TREE_OPERAND (e, 1));
571 pp_assignment_expression (ppi, e);
575 pp_c_initializer_list (c_pretty_printer ppi, tree e)
577 tree type = TREE_TYPE (e);
578 const enum tree_code code = TREE_CODE (type);
580 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
582 tree init = TREE_OPERAND (e, 1);
583 for (; init != NULL_TREE; init = TREE_CHAIN (init))
585 if (code == RECORD_TYPE || code == UNION_TYPE)
588 pp_c_primary_expression (ppi, TREE_PURPOSE (init));
592 pp_c_left_bracket (ppi);
593 if (TREE_PURPOSE (init))
594 pp_c_literal (ppi, TREE_PURPOSE (init));
595 pp_c_right_bracket (ppi);
597 pp_c_whitespace (ppi);
599 pp_c_whitespace (ppi);
600 pp_initializer (ppi, TREE_VALUE (init));
601 if (TREE_CHAIN (init))
602 pp_separate_with (ppi, ',');
606 pp_unsupported_tree (ppi, type);
610 pp_c_postfix_expression (c_pretty_printer ppi, tree e)
612 enum tree_code code = TREE_CODE (e);
615 case POSTINCREMENT_EXPR:
616 case POSTDECREMENT_EXPR:
617 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
618 pp_identifier (ppi, code == POSTINCREMENT_EXPR ? "++" : "--");
622 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
627 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
628 pp_c_left_bracket (ppi);
629 pp_c_expression (ppi, TREE_OPERAND (e, 1));
630 pp_c_right_bracket (ppi);
634 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
635 pp_c_left_paren (ppi);
636 pp_c_expression_list (ppi, TREE_OPERAND (e, 1));
637 pp_c_right_paren (ppi);
642 pp_c_identifier (ppi,
643 code == ABS_EXPR ? "__builtin_abs" : "__builtin_ffs");
644 pp_c_left_paren (ppi);
645 pp_c_expression (ppi, TREE_OPERAND (e, 0));
646 pp_c_right_paren (ppi);
651 tree object = TREE_OPERAND (e, 0);
652 if (TREE_CODE (object) == INDIRECT_REF)
654 pp_postfix_expression (ppi, TREE_OPERAND (object, 0));
659 pp_postfix_expression (ppi, object);
662 pp_c_expression (ppi, TREE_OPERAND (e, 1));
669 pp_c_left_paren (ppi);
670 pp_type_id (ppi, TREE_TYPE (e));
671 pp_c_right_paren (ppi);
674 if (code == COMPLEX_CST)
676 pp_c_expression (ppi, TREE_REALPART (e));
677 pp_separate_with (ppi, ',');
678 pp_c_expression (ppi, TREE_IMAGPART (e));
680 else if (code == VECTOR_CST)
681 pp_c_expression_list (ppi, TREE_VECTOR_CST_ELTS (e));
682 else if (code == COMPLEX_EXPR)
684 pp_c_expression (ppi, TREE_OPERAND (e, 0));
685 pp_separate_with (ppi, ',');
686 pp_c_expression (ppi, TREE_OPERAND (e, 1));
689 pp_right_brace (ppi);
692 case COMPOUND_LITERAL_EXPR:
693 e = DECL_INITIAL (e);
696 pp_initializer (ppi, e);
700 pp_c_identifier (ppi, "__builtin_va_arg");
701 pp_c_left_paren (ppi);
702 pp_assignment_expression (ppi, TREE_OPERAND (e, 0));
703 pp_separate_with (ppi, ',');
704 pp_type_id (ppi, TREE_TYPE (e));
705 pp_c_right_paren (ppi);
709 pp_primary_expression (ppi, e);
714 /* Print out an expression-list; E is expected to be a TREE_LIST */
716 pp_c_expression_list (c_pretty_printer ppi, tree e)
718 for (; e != NULL_TREE; e = TREE_CHAIN (e))
720 pp_c_assignment_expression (ppi, TREE_VALUE (e));
722 pp_separate_with (ppi, ',');
730 unary-operator cast-expression
731 sizeof unary-expression
734 unary-operator: one of
739 __alignof__ unary-expression
740 __alignof__ ( type-id )
741 __real__ unary-expression
742 __imag__ unary-expression */
744 pp_c_unary_expression (c_pretty_printer ppi, tree e)
746 enum tree_code code = TREE_CODE (e);
749 case PREINCREMENT_EXPR:
750 case PREDECREMENT_EXPR:
751 pp_identifier (ppi, code == PREINCREMENT_EXPR ? "++" : "--");
752 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
761 if (code == ADDR_EXPR)
763 else if (code == INDIRECT_REF)
765 else if (code == NEGATE_EXPR)
767 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
769 else if (code == TRUTH_NOT_EXPR)
770 pp_exclamation (ppi);
771 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
776 pp_c_identifier (ppi, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
777 pp_c_whitespace (ppi);
778 if (TYPE_P (TREE_OPERAND (e, 0)))
780 pp_c_left_paren (ppi);
781 pp_type_id (ppi, TREE_OPERAND (e, 0));
782 pp_c_right_paren (ppi);
785 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
790 pp_c_identifier (ppi, code == REALPART_EXPR ? "__real__" : "__imag__");
791 pp_c_whitespace (ppi);
792 pp_unary_expression (ppi, TREE_OPERAND (e, 0));
796 pp_postfix_expression (ppi, e);
802 pp_c_cast_expression (c_pretty_printer ppi, tree e)
804 if (TREE_CODE (e) == CONVERT_EXPR || TREE_CODE (e) == FLOAT_EXPR)
806 pp_c_left_paren (ppi);
807 pp_type_id (ppi, TREE_TYPE (e));
808 pp_c_right_paren (ppi);
809 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
812 pp_unary_expression (ppi, e);
816 pp_c_multiplicative_expression (c_pretty_printer ppi, tree e)
818 enum tree_code code = TREE_CODE (e);
824 pp_c_multiplicative_expression (ppi, TREE_OPERAND (e, 0));
825 pp_c_whitespace (ppi);
826 if (code == MULT_EXPR)
828 else if (code == TRUNC_DIV_EXPR)
832 pp_c_whitespace (ppi);
833 pp_c_cast_expression (ppi, TREE_OPERAND (e, 1));
837 pp_c_cast_expression (ppi, e);
843 pp_c_additive_expression (c_pretty_printer ppi, tree e)
845 enum tree_code code = TREE_CODE (e);
850 pp_c_additive_expression (ppi, TREE_OPERAND (e, 0));
851 pp_c_whitespace (ppi);
852 if (code == PLUS_EXPR)
856 pp_c_whitespace (ppi);
857 pp_multiplicative_expression (ppi, TREE_OPERAND (e, 1));
861 pp_multiplicative_expression (ppi, e);
867 pp_c_shift_expression (c_pretty_printer ppi, tree e)
869 enum tree_code code = TREE_CODE (e);
874 pp_c_shift_expression (ppi, TREE_OPERAND (e, 0));
875 pp_c_whitespace (ppi);
876 pp_identifier (ppi, code == LSHIFT_EXPR ? "<<" : ">>");
877 pp_c_whitespace (ppi);
878 pp_c_additive_expression (ppi, TREE_OPERAND (e, 1));
882 pp_c_additive_expression (ppi, e);
887 pp_c_relational_expression (c_pretty_printer ppi, tree e)
889 enum tree_code code = TREE_CODE (e);
896 pp_c_relational_expression (ppi, TREE_OPERAND (e, 0));
897 pp_c_whitespace (ppi);
900 else if (code == GT_EXPR)
902 else if (code == LE_EXPR)
903 pp_identifier (ppi, "<=");
904 else if (code == GE_EXPR)
905 pp_identifier (ppi, ">=");
906 pp_c_whitespace (ppi);
907 pp_c_shift_expression (ppi, TREE_OPERAND (e, 1));
911 pp_c_shift_expression (ppi, e);
917 pp_c_equality_expression (c_pretty_printer ppi, tree e)
919 enum tree_code code = TREE_CODE (e);
924 pp_c_equality_expression (ppi, TREE_OPERAND (e, 0));
925 pp_c_maybe_whitespace (ppi);
926 pp_identifier (ppi, code == EQ_EXPR ? "==" : "!=");
927 pp_c_whitespace (ppi);
928 pp_c_relational_expression (ppi, TREE_OPERAND (e, 1));
932 pp_c_relational_expression (ppi, e);
938 pp_c_and_expression (c_pretty_printer ppi, tree e)
940 if (TREE_CODE (e) == BIT_AND_EXPR)
942 pp_c_and_expression (ppi, TREE_OPERAND (e, 0));
943 pp_c_maybe_whitespace (ppi);
945 pp_c_whitespace (ppi);
946 pp_c_equality_expression (ppi, TREE_OPERAND (e, 1));
949 pp_c_equality_expression (ppi, e);
953 pp_c_exclusive_or_expression (c_pretty_printer ppi, tree e)
955 if (TREE_CODE (e) == BIT_XOR_EXPR)
957 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
958 pp_c_maybe_whitespace (ppi);
960 pp_c_whitespace (ppi);
961 pp_c_and_expression (ppi, TREE_OPERAND (e, 1));
964 pp_c_and_expression (ppi, e);
968 pp_c_inclusive_or_expression (c_pretty_printer ppi, tree e)
970 if (TREE_CODE (e) == BIT_IOR_EXPR)
972 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
973 pp_c_maybe_whitespace (ppi);
975 pp_c_whitespace (ppi);
976 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 1));
979 pp_c_exclusive_or_expression (ppi, e);
983 pp_c_logical_and_expression (c_pretty_printer ppi, tree e)
985 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
987 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 0));
988 pp_c_maybe_whitespace (ppi);
989 pp_identifier (ppi, "&&");
990 pp_c_whitespace (ppi);
991 pp_c_inclusive_or_expression (ppi, TREE_OPERAND (e, 1));
994 pp_c_inclusive_or_expression (ppi, e);
998 pp_c_logical_or_expression (c_pretty_printer ppi, tree e)
1000 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1002 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
1003 pp_c_maybe_whitespace (ppi);
1004 pp_identifier (ppi, "||");
1005 pp_c_whitespace (ppi);
1006 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 1));
1009 pp_c_logical_and_expression (ppi, e);
1013 pp_c_conditional_expression (c_pretty_printer ppi, tree e)
1015 if (TREE_CODE (e) == COND_EXPR)
1017 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
1018 pp_c_maybe_whitespace (ppi);
1020 pp_c_whitespace (ppi);
1021 pp_c_expression (ppi, TREE_OPERAND (e, 1));
1022 pp_c_maybe_whitespace (ppi);
1024 pp_c_whitespace (ppi);
1025 pp_c_conditional_expression (ppi, TREE_OPERAND (e, 2));
1028 pp_c_logical_or_expression (ppi, e);
1032 /* Pretty-print a C assignment-expression. */
1034 pp_c_assignment_expression (c_pretty_printer ppi, tree e)
1036 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
1038 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
1039 pp_c_maybe_whitespace (ppi);
1041 pp_whitespace (ppi);
1042 pp_c_assignment_expression (ppi, TREE_OPERAND (e, 1));
1045 pp_c_conditional_expression (ppi, e);
1048 /* Pretty-print an expression. */
1050 pp_c_expression (c_pretty_printer ppi, tree e)
1052 switch (TREE_CODE (e))
1055 pp_c_integer_literal (ppi, e);
1059 pp_c_real_literal (ppi, e);
1063 pp_c_string_literal (ppi, e);
1076 pp_c_primary_expression (ppi, e);
1079 case POSTINCREMENT_EXPR:
1080 case POSTDECREMENT_EXPR:
1090 case COMPOUND_LITERAL_EXPR:
1093 pp_c_postfix_expression (ppi, e);
1101 case TRUTH_NOT_EXPR:
1102 case PREINCREMENT_EXPR:
1103 case PREDECREMENT_EXPR:
1108 pp_c_unary_expression (ppi, e);
1113 pp_c_cast_expression (ppi, e);
1117 case TRUNC_MOD_EXPR:
1118 case TRUNC_DIV_EXPR:
1119 pp_c_multiplicative_expression (ppi, e);
1124 pp_c_shift_expression (ppi, e);
1131 pp_c_relational_expression (ppi, e);
1135 pp_c_and_expression (ppi, e);
1139 pp_c_exclusive_or_expression (ppi, e);
1143 pp_c_inclusive_or_expression (ppi, e);
1146 case TRUTH_ANDIF_EXPR:
1147 pp_c_logical_and_expression (ppi, e);
1150 case TRUTH_ORIF_EXPR:
1151 pp_c_logical_or_expression (ppi, e);
1155 pp_c_conditional_expression (ppi, e);
1160 pp_c_assignment_expression (ppi, e);
1164 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1168 pp_c_left_paren (ppi);
1169 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1170 pp_separate_with (ppi, ',');
1171 pp_assignment_expression (ppi, TREE_OPERAND (e, 1));
1172 pp_c_right_paren (ppi);
1177 pp_unsupported_tree (ppi, e);
1185 pp_c_statement (c_pretty_printer ppi, tree stmt)
1187 const enum tree_code code = TREE_CODE (stmt);
1193 if (code == LABEL_STMT)
1194 pp_tree_identifier (ppi, DECL_NAME (LABEL_STMT_LABEL (stmt)));
1195 else if (code == LABEL_STMT)
1197 if (CASE_LOW (stmt) == NULL_TREE)
1198 pp_identifier (ppi, "default");
1201 pp_c_identifier (ppi, "case");
1202 pp_c_whitespace (ppi);
1203 pp_conditional_expression (ppi, CASE_LOW (stmt));
1204 if (CASE_HIGH (stmt))
1206 pp_identifier (ppi, "...");
1207 pp_conditional_expression (ppi, CASE_HIGH (stmt));
1212 pp_newline_and_indent (ppi, 3);
1216 pp_left_brace (ppi);
1217 pp_newline_and_indent (ppi, 3);
1218 for (stmt = COMPOUND_BODY (stmt); stmt; stmt = TREE_CHAIN (stmt))
1219 pp_c_statement (ppi, stmt);
1220 pp_newline_and_indent (ppi, -3);
1221 pp_right_brace (ppi);
1228 pp_c_expression (ppi, code == EXPR_STMT
1229 ? EXPR_STMT_EXPR (stmt)
1230 : CLEANUP_EXPR (stmt));
1236 pp_c_identifier (ppi, "if");
1237 pp_whitespace (ppi);
1238 pp_c_left_paren (ppi);
1239 pp_c_expression (ppi, IF_COND (stmt));
1240 pp_right_paren (ppi);
1241 pp_newline_and_indent (ppi, 3);
1242 pp_statement (ppi, THEN_CLAUSE (stmt));
1243 pp_newline_and_indent (ppi, -3);
1244 if (ELSE_CLAUSE (stmt))
1246 tree else_clause = ELSE_CLAUSE (stmt);
1247 pp_c_identifier (ppi, "else");
1248 if (TREE_CODE (else_clause) == IF_STMT)
1249 pp_c_whitespace (ppi);
1251 pp_newline_and_indent (ppi, 3);
1252 pp_statement (ppi, else_clause);
1253 if (TREE_CODE (else_clause) != IF_STMT)
1254 pp_newline_and_indent (ppi, -3);
1260 pp_c_identifier (ppi, "switch");
1261 pp_whitespace (ppi);
1262 pp_c_left_paren (ppi);
1263 pp_c_expression (ppi, SWITCH_COND (stmt));
1264 pp_right_paren (ppi);
1265 pp_newline_and_indent (ppi, 3);
1266 pp_statement (ppi, SWITCH_BODY (stmt));
1267 pp_newline_and_indent (ppi, -3);
1271 pp_c_identifier (ppi, "while");
1272 pp_whitespace (ppi);
1273 pp_c_left_paren (ppi);
1274 pp_c_expression (ppi, WHILE_COND (stmt));
1275 pp_right_paren (ppi);
1276 pp_newline_and_indent (ppi, 3);
1277 pp_statement (ppi, WHILE_BODY (stmt));
1278 pp_newline_and_indent (ppi, -3);
1282 pp_c_identifier (ppi, "do");
1283 pp_newline_and_indent (ppi, 3);
1284 pp_statement (ppi, DO_BODY (stmt));
1285 pp_newline_and_indent (ppi, -3);
1286 pp_c_identifier (ppi, "while");
1287 pp_whitespace (ppi);
1288 pp_c_left_paren (ppi);
1289 pp_c_expression (ppi, DO_COND (stmt));
1290 pp_c_right_paren (ppi);
1296 pp_c_identifier (ppi, "for");
1297 pp_whitespace (ppi);
1298 pp_c_left_paren (ppi);
1299 pp_statement (ppi, FOR_INIT_STMT (stmt));
1300 pp_c_whitespace (ppi);
1301 if (FOR_COND (stmt))
1302 pp_c_expression (ppi, FOR_COND (stmt));
1304 pp_c_whitespace (ppi);
1305 if (FOR_EXPR (stmt))
1306 pp_c_expression (ppi, FOR_EXPR (stmt));
1307 pp_right_paren (ppi);
1308 pp_newline_and_indent (ppi, 3);
1309 pp_statement (ppi, FOR_BODY (stmt));
1310 pp_newline_and_indent (ppi, -3);
1316 pp_identifier (ppi, code == BREAK_STMT ? "break" : "continue");
1324 tree e = code == RETURN_STMT
1325 ? RETURN_STMT_EXPR (stmt)
1326 : GOTO_DESTINATION (stmt);
1329 pp_c_identifier (ppi, code == RETURN_STMT ? "return" : "goto");
1331 pp_c_expression (ppi, e);
1338 if (!SCOPE_NULLIFIED_P (stmt) && SCOPE_NO_CLEANUPS_P (stmt))
1340 if (SCOPE_BEGIN_P (stmt))
1342 pp_left_brace (ppi);
1343 pp_newline_and_indent (ppi, 3);
1345 else if (SCOPE_END_P (stmt))
1347 pp_right_brace (ppi);
1348 pp_newline_and_indent (ppi, -3);
1354 pp_declaration (ppi, DECL_STMT_DECL (stmt));
1361 bool has_volatile_p = ASM_VOLATILE_P (stmt);
1362 bool is_extended = has_volatile_p || ASM_INPUTS (stmt)
1363 || ASM_OUTPUTS (stmt) || ASM_CLOBBERS (stmt);
1364 pp_c_identifier (ppi, is_extended ? "__asm__" : "asm");
1366 pp_c_identifier (ppi, "__volatile__");
1367 pp_whitespace (ppi);
1368 pp_c_left_paren (ppi);
1369 pp_c_string_literal (ppi, ASM_STRING (stmt));
1372 pp_whitespace (ppi);
1373 pp_separate_with (ppi, ':');
1374 if (ASM_OUTPUTS (stmt))
1375 pp_c_expression (ppi, ASM_OUTPUTS (stmt));
1376 pp_whitespace (ppi);
1377 pp_separate_with (ppi, ':');
1378 if (ASM_INPUTS (stmt))
1379 pp_c_expression (ppi, ASM_INPUTS (stmt));
1380 pp_whitespace (ppi);
1381 pp_separate_with (ppi, ':');
1382 if (ASM_CLOBBERS (stmt))
1383 pp_c_expression (ppi, ASM_CLOBBERS (stmt));
1385 pp_right_paren (ppi);
1391 pp_c_identifier (ppi, "__FILE__");
1392 pp_whitespace (ppi);
1394 pp_c_whitespace (ppi);
1395 pp_c_identifier (ppi, FILE_STMT_FILENAME (stmt));
1401 pp_unsupported_tree (ppi, stmt);
1407 /* Initialize the PRETTY-PRINTER for handling C codes. */
1409 pp_c_pretty_printer_init (c_pretty_printer pp)
1411 pp->offset_list = 0;
1413 pp->declaration = pp_c_declaration;
1414 pp->declaration_specifiers = pp_c_declaration_specifiers;
1415 pp->type_specifier = pp_c_simple_type_specifier;
1416 pp->declarator = pp_c_declarator;
1417 pp->direct_declarator = pp_c_direct_declarator;
1418 pp->parameter_declaration = pp_c_parameter_declaration;
1419 pp->type_id = pp_c_type_id;
1421 pp->statement = pp_c_statement;
1423 pp->primary_expression = pp_c_primary_expression;
1424 pp->postfix_expression = pp_c_postfix_expression;
1425 pp->unary_expression = pp_c_unary_expression;
1426 pp->initializer = pp_c_initializer;
1427 pp->multiplicative_expression = pp_c_multiplicative_expression;
1428 pp->conditional_expression = pp_c_conditional_expression;
1429 pp->assignment_expression = pp_c_assignment_expression;