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
), "%.16g",
473 pp_buffer (ppi
)->digit_buffer
);
474 pp_identifier (ppi
, pp_buffer(ppi
)->digit_buffer
);
479 pp_c_literal (ppi
, e
)
480 c_pretty_printer ppi
;
483 switch (TREE_CODE (e
))
486 pp_c_integer_literal (ppi
, e
);
490 pp_c_real_literal (ppi
, e
);
494 pp_c_string_literal (ppi
, e
);
498 pp_unsupported_tree (ppi
, e
);
503 /* Pretty-print a C primary-expression. */
505 pp_c_primary_expression (ppi
, e
)
506 c_pretty_printer ppi
;
509 switch (TREE_CODE (e
))
519 case IDENTIFIER_NODE
:
520 pp_c_tree_identifier (ppi
, e
);
524 pp_c_identifier (ppi
, "<erroneous-expression>");
528 pp_c_identifier (ppi
, "<return-value>");
534 pp_c_literal (ppi
, e
);
538 pp_c_left_paren (ppi
);
539 pp_c_identifier (ppi
, "__builtin_memcpy");
540 pp_c_left_paren (ppi
);
542 pp_c_primary_expression (ppi
, TREE_OPERAND (e
, 0));
543 pp_separate_with (ppi
, ',');
545 pp_initializer (ppi
, TREE_OPERAND (e
, 1));
546 if (TREE_OPERAND (e
, 2))
548 pp_separate_with (ppi
, ',');
549 pp_c_expression (ppi
, TREE_OPERAND (e
, 2));
551 pp_c_right_paren (ppi
);
554 pp_c_left_paren (ppi
);
555 pp_statement (ppi
, STMT_EXPR_STMT (e
));
556 pp_c_right_paren (ppi
);
560 /* Make sure this call won't cause any infinite loop. */
561 pp_c_left_paren (ppi
);
562 pp_c_expression (ppi
, e
);
563 pp_c_right_paren (ppi
);
568 /* Print out a C initializer -- also support C compound-literals. */
570 pp_c_initializer (ppi
, e
)
571 c_pretty_printer ppi
;
574 if (TREE_CODE (e
) == CONSTRUCTOR
)
576 enum tree_code code
= TREE_CODE (TREE_TYPE (e
));
577 if (code
== RECORD_TYPE
|| code
== UNION_TYPE
|| code
== ARRAY_TYPE
)
580 pp_c_initializer_list (ppi
, e
);
581 pp_right_brace (ppi
);
584 pp_unsupported_tree (ppi
, TREE_OPERAND (e
, 1));
587 pp_assignment_expression (ppi
, e
);
591 pp_c_initializer_list (ppi
, e
)
592 c_pretty_printer ppi
;
595 tree type
= TREE_TYPE (e
);
596 const enum tree_code code
= TREE_CODE (type
);
598 if (code
== RECORD_TYPE
|| code
== UNION_TYPE
|| code
== ARRAY_TYPE
)
600 tree init
= TREE_OPERAND (e
, 1);
601 for (; init
!= NULL_TREE
; init
= TREE_CHAIN (init
))
603 if (code
== RECORD_TYPE
|| code
== UNION_TYPE
)
606 pp_c_primary_expression (ppi
, TREE_PURPOSE (init
));
610 pp_c_left_bracket (ppi
);
611 if (TREE_PURPOSE (init
))
612 pp_c_literal (ppi
, TREE_PURPOSE (init
));
613 pp_c_right_bracket (ppi
);
615 pp_c_whitespace (ppi
);
617 pp_c_whitespace (ppi
);
618 pp_initializer (ppi
, TREE_VALUE (init
));
619 if (TREE_CHAIN (init
))
620 pp_separate_with (ppi
, ',');
624 pp_unsupported_tree (ppi
, type
);
628 pp_c_postfix_expression (ppi
, e
)
629 c_pretty_printer ppi
;
632 enum tree_code code
= TREE_CODE (e
);
635 case POSTINCREMENT_EXPR
:
636 case POSTDECREMENT_EXPR
:
637 pp_postfix_expression (ppi
, TREE_OPERAND (e
, 0));
638 pp_identifier (ppi
, code
== POSTINCREMENT_EXPR
? "++" : "--");
642 pp_postfix_expression (ppi
, TREE_OPERAND (e
, 0));
647 pp_postfix_expression (ppi
, TREE_OPERAND (e
, 0));
648 pp_c_left_bracket (ppi
);
649 pp_c_expression (ppi
, TREE_OPERAND (e
, 1));
650 pp_c_right_bracket (ppi
);
654 pp_postfix_expression (ppi
, TREE_OPERAND (e
, 0));
655 pp_c_left_paren (ppi
);
656 pp_c_expression_list (ppi
, TREE_OPERAND (e
, 1));
657 pp_c_right_paren (ppi
);
662 pp_c_identifier (ppi
,
663 code
== ABS_EXPR
? "__builtin_abs" : "__builtin_ffs");
664 pp_c_left_paren (ppi
);
665 pp_c_expression (ppi
, TREE_OPERAND (e
, 0));
666 pp_c_right_paren (ppi
);
671 tree object
= TREE_OPERAND (e
, 0);
672 if (TREE_CODE (object
) == INDIRECT_REF
)
674 pp_postfix_expression (ppi
, TREE_OPERAND (object
, 0));
679 pp_postfix_expression (ppi
, object
);
682 pp_c_expression (ppi
, TREE_OPERAND (e
, 1));
689 pp_c_left_paren (ppi
);
690 pp_type_id (ppi
, TREE_TYPE (e
));
691 pp_c_right_paren (ppi
);
694 if (code
== COMPLEX_CST
)
696 pp_c_expression (ppi
, TREE_REALPART (e
));
697 pp_separate_with (ppi
, ',');
698 pp_c_expression (ppi
, TREE_IMAGPART (e
));
700 else if (code
== VECTOR_CST
)
701 pp_c_expression_list (ppi
, TREE_VECTOR_CST_ELTS (e
));
702 else if (code
== COMPLEX_EXPR
)
704 pp_c_expression (ppi
, TREE_OPERAND (e
, 0));
705 pp_separate_with (ppi
, ',');
706 pp_c_expression (ppi
, TREE_OPERAND (e
, 1));
709 pp_right_brace (ppi
);
712 case COMPOUND_LITERAL_EXPR
:
713 e
= DECL_INITIAL (e
);
716 pp_initializer (ppi
, e
);
722 pp_identifier (ppi
, "__location__");
723 pp_right_paren (ppi
);
727 pp_identifier (ppi
, "file");
730 pp_c_whitespace (ppi
);
731 pp_c_expression (ppi
, SRCLOC_FILE (e
));
732 pp_separate_with (ppi
, ',');
734 pp_identifier (ppi
, "line");
737 pp_c_whitespace (ppi
);
738 pp_c_expression (ppi
, SRCLOC_LINE (e
));
739 pp_right_brace (ppi
);
744 pp_c_identifier (ppi
, "__builtin_va_arg");
745 pp_c_left_paren (ppi
);
746 pp_assignment_expression (ppi
, TREE_OPERAND (e
, 0));
747 pp_separate_with (ppi
, ',');
748 pp_type_id (ppi
, TREE_TYPE (e
));
749 pp_c_right_paren (ppi
);
753 pp_primary_expression (ppi
, e
);
758 /* Print out an expression-list; E is expected to be a TREE_LIST */
760 pp_c_expression_list (ppi
, e
)
761 c_pretty_printer ppi
;
764 for (; e
!= NULL_TREE
; e
= TREE_CHAIN (e
))
766 pp_c_assignment_expression (ppi
, TREE_VALUE (e
));
768 pp_separate_with (ppi
, ',');
773 pp_c_unary_expression (ppi
, e
)
774 c_pretty_printer ppi
;
777 enum tree_code code
= TREE_CODE (e
);
780 case PREINCREMENT_EXPR
:
781 case PREDECREMENT_EXPR
:
782 pp_identifier (ppi
, code
== PREINCREMENT_EXPR
? "++" : "--");
783 pp_c_unary_expression (ppi
, TREE_OPERAND (e
, 0));
793 if (code
== ADDR_EXPR
)
795 else if (code
== INDIRECT_REF
)
797 else if (code
== NEGATE_EXPR
)
799 else if (code
== BIT_NOT_EXPR
|| code
== CONJ_EXPR
)
801 else if (code
== TRUTH_NOT_EXPR
)
802 pp_exclamation (ppi
);
803 pp_c_cast_expression (ppi
, TREE_OPERAND (e
, 0));
808 pp_c_identifier (ppi
, code
== SIZEOF_EXPR
? "sizeof" : "__alignof__");
809 pp_c_whitespace (ppi
);
810 if (TYPE_P (TREE_OPERAND (e
, 0)))
812 pp_c_left_paren (ppi
);
813 pp_type_id (ppi
, TREE_OPERAND (e
, 0));
814 pp_c_right_paren (ppi
);
817 pp_c_unary_expression (ppi
, TREE_OPERAND (e
, 0));
822 pp_c_identifier (ppi
, code
== REALPART_EXPR
? "__real__" : "__imag__");
823 pp_c_whitespace (ppi
);
824 pp_unary_expression (ppi
, TREE_OPERAND (e
, 0));
828 pp_postfix_expression (ppi
, e
);
834 pp_c_cast_expression (ppi
, e
)
835 c_pretty_printer ppi
;
838 if (TREE_CODE (e
) == CONVERT_EXPR
|| TREE_CODE (e
) == FLOAT_EXPR
)
840 pp_c_left_paren (ppi
);
841 pp_type_id (ppi
, TREE_TYPE (e
));
842 pp_c_right_paren (ppi
);
843 pp_c_cast_expression (ppi
, TREE_OPERAND (e
, 0));
846 pp_unary_expression (ppi
, e
);
850 pp_c_multiplicative_expression (ppi
, e
)
851 c_pretty_printer ppi
;
854 enum tree_code code
= TREE_CODE (e
);
860 pp_c_multiplicative_expression (ppi
, TREE_OPERAND (e
, 0));
861 pp_c_whitespace (ppi
);
862 if (code
== MULT_EXPR
)
864 else if (code
== TRUNC_DIV_EXPR
)
868 pp_c_whitespace (ppi
);
869 pp_c_cast_expression (ppi
, TREE_OPERAND (e
, 1));
873 pp_c_cast_expression (ppi
, e
);
879 pp_c_additive_expression (ppi
, e
)
880 c_pretty_printer ppi
;
883 enum tree_code code
= TREE_CODE (e
);
888 pp_c_additive_expression (ppi
, TREE_OPERAND (e
, 0));
889 pp_c_whitespace (ppi
);
890 if (code
== PLUS_EXPR
)
894 pp_c_whitespace (ppi
);
895 pp_multiplicative_expression (ppi
, TREE_OPERAND (e
, 1));
899 pp_multiplicative_expression (ppi
, e
);
905 pp_c_shift_expression (ppi
, e
)
906 c_pretty_printer ppi
;
909 enum tree_code code
= TREE_CODE (e
);
914 pp_c_shift_expression (ppi
, TREE_OPERAND (e
, 0));
915 pp_c_whitespace (ppi
);
916 pp_identifier (ppi
, code
== LSHIFT_EXPR
? "<<" : ">>");
917 pp_c_whitespace (ppi
);
918 pp_c_additive_expression (ppi
, TREE_OPERAND (e
, 1));
922 pp_c_additive_expression (ppi
, e
);
927 pp_c_relational_expression (ppi
, e
)
928 c_pretty_printer ppi
;
931 enum tree_code code
= TREE_CODE (e
);
938 pp_c_relational_expression (ppi
, TREE_OPERAND (e
, 0));
939 pp_c_whitespace (ppi
);
942 else if (code
== GT_EXPR
)
944 else if (code
== LE_EXPR
)
945 pp_identifier (ppi
, "<=");
946 else if (code
== GE_EXPR
)
947 pp_identifier (ppi
, ">=");
948 pp_c_whitespace (ppi
);
949 pp_c_shift_expression (ppi
, TREE_OPERAND (e
, 1));
953 pp_c_shift_expression (ppi
, e
);
959 pp_c_equality_expression (ppi
, e
)
960 c_pretty_printer ppi
;
963 enum tree_code code
= TREE_CODE (e
);
968 pp_c_equality_expression (ppi
, TREE_OPERAND (e
, 0));
969 pp_c_maybe_whitespace (ppi
);
970 pp_identifier (ppi
, code
== EQ_EXPR
? "==" : "!=");
971 pp_c_whitespace (ppi
);
972 pp_c_relational_expression (ppi
, TREE_OPERAND (e
, 1));
976 pp_c_relational_expression (ppi
, e
);
982 pp_c_and_expression (ppi
, e
)
983 c_pretty_printer ppi
;
986 if (TREE_CODE (e
) == BIT_AND_EXPR
)
988 pp_c_and_expression (ppi
, TREE_OPERAND (e
, 0));
989 pp_c_maybe_whitespace (ppi
);
991 pp_c_whitespace (ppi
);
992 pp_c_equality_expression (ppi
, TREE_OPERAND (e
, 1));
995 pp_c_equality_expression (ppi
, e
);
999 pp_c_exclusive_or_expression (ppi
, e
)
1000 c_pretty_printer ppi
;
1003 if (TREE_CODE (e
) == BIT_XOR_EXPR
)
1005 pp_c_exclusive_or_expression (ppi
, TREE_OPERAND (e
, 0));
1006 pp_c_maybe_whitespace (ppi
);
1008 pp_c_whitespace (ppi
);
1009 pp_c_and_expression (ppi
, TREE_OPERAND (e
, 1));
1012 pp_c_and_expression (ppi
, e
);
1016 pp_c_inclusive_or_expression (ppi
, e
)
1017 c_pretty_printer ppi
;
1020 if (TREE_CODE (e
) == BIT_IOR_EXPR
)
1022 pp_c_exclusive_or_expression (ppi
, TREE_OPERAND (e
, 0));
1023 pp_c_maybe_whitespace (ppi
);
1025 pp_c_whitespace (ppi
);
1026 pp_c_exclusive_or_expression (ppi
, TREE_OPERAND (e
, 1));
1029 pp_c_exclusive_or_expression (ppi
, e
);
1033 pp_c_logical_and_expression (ppi
, e
)
1034 c_pretty_printer ppi
;
1037 if (TREE_CODE (e
) == TRUTH_ANDIF_EXPR
)
1039 pp_c_logical_and_expression (ppi
, TREE_OPERAND (e
, 0));
1040 pp_c_maybe_whitespace (ppi
);
1041 pp_identifier (ppi
, "&&");
1042 pp_c_whitespace (ppi
);
1043 pp_c_inclusive_or_expression (ppi
, TREE_OPERAND (e
, 1));
1046 pp_c_inclusive_or_expression (ppi
, e
);
1050 pp_c_logical_or_expression (ppi
, e
)
1051 c_pretty_printer ppi
;
1054 if (TREE_CODE (e
) == TRUTH_ORIF_EXPR
)
1056 pp_c_logical_or_expression (ppi
, TREE_OPERAND (e
, 0));
1057 pp_c_maybe_whitespace (ppi
);
1058 pp_identifier (ppi
, "||");
1059 pp_c_whitespace (ppi
);
1060 pp_c_logical_and_expression (ppi
, TREE_OPERAND (e
, 1));
1063 pp_c_logical_and_expression (ppi
, e
);
1067 pp_c_conditional_expression (ppi
, e
)
1068 c_pretty_printer ppi
;
1071 if (TREE_CODE (e
) == COND_EXPR
)
1073 pp_c_logical_or_expression (ppi
, TREE_OPERAND (e
, 0));
1074 pp_c_maybe_whitespace (ppi
);
1076 pp_c_whitespace (ppi
);
1077 pp_c_expression (ppi
, TREE_OPERAND (e
, 1));
1078 pp_c_maybe_whitespace (ppi
);
1080 pp_c_whitespace (ppi
);
1081 pp_c_conditional_expression (ppi
, TREE_OPERAND (e
, 2));
1084 pp_c_logical_or_expression (ppi
, e
);
1088 /* Pretty-print a C assignment-expression. */
1090 pp_c_assignment_expression (ppi
, e
)
1091 c_pretty_printer ppi
;
1094 if (TREE_CODE (e
) == MODIFY_EXPR
|| TREE_CODE (e
) == INIT_EXPR
)
1096 pp_c_unary_expression (ppi
, TREE_OPERAND (e
, 0));
1097 pp_c_maybe_whitespace (ppi
);
1099 pp_whitespace (ppi
);
1100 pp_c_assignment_expression (ppi
, TREE_OPERAND (e
, 1));
1103 pp_c_conditional_expression (ppi
, e
);
1106 /* Pretty-print an expression. */
1108 pp_c_expression (ppi
, e
)
1109 c_pretty_printer ppi
;
1112 switch (TREE_CODE (e
))
1115 pp_c_integer_literal (ppi
, e
);
1119 pp_c_real_literal (ppi
, e
);
1123 pp_c_string_literal (ppi
, e
);
1136 pp_c_primary_expression (ppi
, e
);
1139 case POSTINCREMENT_EXPR
:
1140 case POSTDECREMENT_EXPR
:
1150 case COMPOUND_LITERAL_EXPR
:
1153 pp_c_postfix_expression (ppi
, e
);
1161 case TRUTH_NOT_EXPR
:
1162 case PREINCREMENT_EXPR
:
1163 case PREDECREMENT_EXPR
:
1168 pp_c_unary_expression (ppi
, e
);
1173 pp_c_cast_expression (ppi
, e
);
1177 case TRUNC_MOD_EXPR
:
1178 case TRUNC_DIV_EXPR
:
1179 pp_c_multiplicative_expression (ppi
, e
);
1184 pp_c_shift_expression (ppi
, e
);
1191 pp_c_relational_expression (ppi
, e
);
1195 pp_c_and_expression (ppi
, e
);
1199 pp_c_exclusive_or_expression (ppi
, e
);
1203 pp_c_inclusive_or_expression (ppi
, e
);
1206 case TRUTH_ANDIF_EXPR
:
1207 pp_c_logical_and_expression (ppi
, e
);
1210 case TRUTH_ORIF_EXPR
:
1211 pp_c_logical_or_expression (ppi
, e
);
1215 pp_c_conditional_expression (ppi
, e
);
1220 pp_c_assignment_expression (ppi
, e
);
1224 pp_c_expression (ppi
, TREE_OPERAND (e
, 0));
1228 pp_c_left_paren (ppi
);
1229 pp_c_expression (ppi
, TREE_OPERAND (e
, 0));
1230 pp_separate_with (ppi
, ',');
1231 pp_assignment_expression (ppi
, TREE_OPERAND (e
, 1));
1232 pp_c_right_paren (ppi
);
1237 pp_unsupported_tree (ppi
, e
);
1245 pp_c_statement (ppi
, stmt
)
1246 c_pretty_printer ppi
;
1249 const enum tree_code code
= TREE_CODE (stmt
);
1255 if (code
== LABEL_STMT
)
1256 pp_tree_identifier (ppi
, DECL_NAME (LABEL_STMT_LABEL (stmt
)));
1257 else if (code
== LABEL_STMT
)
1259 if (CASE_LOW (stmt
) == NULL_TREE
)
1260 pp_identifier (ppi
, "default");
1263 pp_c_identifier (ppi
, "case");
1264 pp_c_whitespace (ppi
);
1265 pp_conditional_expression (ppi
, CASE_LOW (stmt
));
1266 if (CASE_HIGH (stmt
))
1268 pp_identifier (ppi
, "...");
1269 pp_conditional_expression (ppi
, CASE_HIGH (stmt
));
1274 pp_newline_and_indent (ppi
, 3);
1278 pp_left_brace (ppi
);
1279 pp_newline_and_indent (ppi
, 3);
1280 for (stmt
= COMPOUND_BODY (stmt
); stmt
; stmt
= TREE_CHAIN (stmt
))
1281 pp_c_statement (ppi
, stmt
);
1282 pp_newline_and_indent (ppi
, -3);
1283 pp_right_brace (ppi
);
1290 pp_c_expression (ppi
, code
== EXPR_STMT
1291 ? EXPR_STMT_EXPR (stmt
)
1292 : CLEANUP_EXPR (stmt
));
1298 pp_c_identifier (ppi
, "if");
1299 pp_whitespace (ppi
);
1300 pp_c_left_paren (ppi
);
1301 pp_c_expression (ppi
, IF_COND (stmt
));
1302 pp_right_paren (ppi
);
1303 pp_newline_and_indent (ppi
, 3);
1304 pp_statement (ppi
, THEN_CLAUSE (stmt
));
1305 pp_newline_and_indent (ppi
, -3);
1306 if (ELSE_CLAUSE (stmt
))
1308 tree else_clause
= ELSE_CLAUSE (stmt
);
1309 pp_c_identifier (ppi
, "else");
1310 if (TREE_CODE (else_clause
) == IF_STMT
)
1311 pp_c_whitespace (ppi
);
1313 pp_newline_and_indent (ppi
, 3);
1314 pp_statement (ppi
, else_clause
);
1315 if (TREE_CODE (else_clause
) != IF_STMT
)
1316 pp_newline_and_indent (ppi
, -3);
1322 pp_c_identifier (ppi
, "switch");
1323 pp_whitespace (ppi
);
1324 pp_c_left_paren (ppi
);
1325 pp_c_expression (ppi
, SWITCH_COND (stmt
));
1326 pp_right_paren (ppi
);
1327 pp_newline_and_indent (ppi
, 3);
1328 pp_statement (ppi
, SWITCH_BODY (stmt
));
1329 pp_newline_and_indent (ppi
, -3);
1333 pp_c_identifier (ppi
, "while");
1334 pp_whitespace (ppi
);
1335 pp_c_left_paren (ppi
);
1336 pp_c_expression (ppi
, WHILE_COND (stmt
));
1337 pp_right_paren (ppi
);
1338 pp_newline_and_indent (ppi
, 3);
1339 pp_statement (ppi
, WHILE_BODY (stmt
));
1340 pp_newline_and_indent (ppi
, -3);
1344 pp_c_identifier (ppi
, "do");
1345 pp_newline_and_indent (ppi
, 3);
1346 pp_statement (ppi
, DO_BODY (stmt
));
1347 pp_newline_and_indent (ppi
, -3);
1348 pp_c_identifier (ppi
, "while");
1349 pp_whitespace (ppi
);
1350 pp_c_left_paren (ppi
);
1351 pp_c_expression (ppi
, DO_COND (stmt
));
1352 pp_c_right_paren (ppi
);
1358 pp_c_identifier (ppi
, "for");
1359 pp_whitespace (ppi
);
1360 pp_c_left_paren (ppi
);
1361 pp_statement (ppi
, FOR_INIT_STMT (stmt
));
1362 pp_c_whitespace (ppi
);
1363 if (FOR_COND (stmt
))
1364 pp_c_expression (ppi
, FOR_COND (stmt
));
1366 pp_c_whitespace (ppi
);
1367 if (FOR_EXPR (stmt
))
1368 pp_c_expression (ppi
, FOR_EXPR (stmt
));
1369 pp_right_paren (ppi
);
1370 pp_newline_and_indent (ppi
, 3);
1371 pp_statement (ppi
, FOR_BODY (stmt
));
1372 pp_newline_and_indent (ppi
, -3);
1378 pp_identifier (ppi
, code
== BREAK_STMT
? "break" : "continue");
1386 tree e
= code
== RETURN_STMT
1387 ? RETURN_EXPR (stmt
)
1388 : GOTO_DESTINATION (stmt
);
1391 pp_c_identifier (ppi
, code
== RETURN_STMT
? "return" : "goto");
1393 pp_c_expression (ppi
, e
);
1400 if (!SCOPE_NULLIFIED_P (stmt
) && SCOPE_NO_CLEANUPS_P (stmt
))
1402 if (SCOPE_BEGIN_P (stmt
))
1404 pp_left_brace (ppi
);
1405 pp_newline_and_indent (ppi
, 3);
1407 else if (SCOPE_END_P (stmt
))
1409 pp_right_brace (ppi
);
1410 pp_newline_and_indent (ppi
, -3);
1416 pp_declaration (ppi
, DECL_STMT_DECL (stmt
));
1423 bool has_volatile_p
= ASM_VOLATILE_P (stmt
);
1424 bool is_extended
= has_volatile_p
|| ASM_INPUTS (stmt
)
1425 || ASM_OUTPUTS (stmt
) || ASM_CLOBBERS (stmt
);
1426 pp_c_identifier (ppi
, is_extended
? "__asm__" : "asm");
1428 pp_c_identifier (ppi
, "__volatile__");
1429 pp_whitespace (ppi
);
1430 pp_c_left_paren (ppi
);
1431 pp_c_string_literal (ppi
, ASM_STRING (stmt
));
1434 pp_whitespace (ppi
);
1435 pp_separate_with (ppi
, ':');
1436 if (ASM_OUTPUTS (stmt
))
1437 pp_c_expression (ppi
, ASM_OUTPUTS (stmt
));
1438 pp_whitespace (ppi
);
1439 pp_separate_with (ppi
, ':');
1440 if (ASM_INPUTS (stmt
))
1441 pp_c_expression (ppi
, ASM_INPUTS (stmt
));
1442 pp_whitespace (ppi
);
1443 pp_separate_with (ppi
, ':');
1444 if (ASM_CLOBBERS (stmt
))
1445 pp_c_expression (ppi
, ASM_CLOBBERS (stmt
));
1447 pp_right_paren (ppi
);
1453 pp_c_identifier (ppi
, "__FILE__");
1454 pp_whitespace (ppi
);
1456 pp_c_whitespace (ppi
);
1457 pp_c_identifier (ppi
, FILE_STMT_FILENAME (stmt
));
1463 pp_unsupported_tree (ppi
, stmt
);
1469 /* Initialize the PRETTY-PRINTER for handling C codes. */
1471 pp_c_pretty_printer_init (pp
)
1472 c_pretty_printer pp
;
1474 pp
->offset_list
= 0;
1476 pp
->declaration
= pp_c_declaration
;
1477 pp
->declaration_specifiers
= pp_c_declaration_specifiers
;
1478 pp
->type_specifier
= pp_c_simple_type_specifier
;
1479 pp
->declarator
= pp_c_declarator
;
1480 pp
->direct_declarator
= pp_c_direct_declarator
;
1481 pp
->parameter_declaration
= pp_c_parameter_declaration
;
1482 pp
->type_id
= pp_c_type_id
;
1484 pp
->statement
= pp_c_statement
;
1486 pp
->primary_expression
= pp_c_primary_expression
;
1487 pp
->postfix_expression
= pp_c_postfix_expression
;
1488 pp
->unary_expression
= pp_c_unary_expression
;
1489 pp
->initializer
= pp_c_initializer
;
1490 pp
->multiplicative_expression
= pp_c_multiplicative_expression
;
1491 pp
->conditional_expression
= pp_c_conditional_expression
;
1492 pp
->assignment_expression
= pp_c_assignment_expression
;