1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
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, 51 Franklin Street, Fifth Floor, Boston, MA
24 #include "coretypes.h"
27 #include "c-pretty-print.h"
29 #include "tree-iterator.h"
30 #include "diagnostic.h"
32 /* The pretty-printer code is primarily designed to closely follow
33 (GNU) C and C++ grammars. That is to be contrasted with spaghetti
34 codes we used to have in the past. Following a structured
35 approach (preferably the official grammars) is believed to make it
36 much easier to add extensions and nifty pretty-printing effects that
37 takes expression or declaration contexts into account. */
40 #define pp_c_maybe_whitespace(PP) \
42 if (pp_base (PP)->padding == pp_before) \
43 pp_c_whitespace (PP); \
47 static void pp_c_char (c_pretty_printer
*, int);
49 /* postfix-expression */
50 static void pp_c_initializer_list (c_pretty_printer
*, tree
);
51 static void pp_c_brace_enclosed_initializer_list (c_pretty_printer
*, tree
);
53 static void pp_c_multiplicative_expression (c_pretty_printer
*, tree
);
54 static void pp_c_additive_expression (c_pretty_printer
*, tree
);
55 static void pp_c_shift_expression (c_pretty_printer
*, tree
);
56 static void pp_c_relational_expression (c_pretty_printer
*, tree
);
57 static void pp_c_equality_expression (c_pretty_printer
*, tree
);
58 static void pp_c_and_expression (c_pretty_printer
*, tree
);
59 static void pp_c_exclusive_or_expression (c_pretty_printer
*, tree
);
60 static void pp_c_inclusive_or_expression (c_pretty_printer
*, tree
);
61 static void pp_c_logical_and_expression (c_pretty_printer
*, tree
);
62 static void pp_c_conditional_expression (c_pretty_printer
*, tree
);
63 static void pp_c_assignment_expression (c_pretty_printer
*, tree
);
68 /* Helper functions. */
71 pp_c_whitespace (c_pretty_printer
*pp
)
74 pp_base (pp
)->padding
= pp_none
;
78 pp_c_left_paren (c_pretty_printer
*pp
)
81 pp_base (pp
)->padding
= pp_none
;
85 pp_c_right_paren (c_pretty_printer
*pp
)
88 pp_base (pp
)->padding
= pp_none
;
92 pp_c_left_brace (c_pretty_printer
*pp
)
95 pp_base (pp
)->padding
= pp_none
;
99 pp_c_right_brace (c_pretty_printer
*pp
)
102 pp_base (pp
)->padding
= pp_none
;
106 pp_c_left_bracket (c_pretty_printer
*pp
)
108 pp_left_bracket (pp
);
109 pp_base (pp
)->padding
= pp_none
;
113 pp_c_right_bracket (c_pretty_printer
*pp
)
115 pp_right_bracket (pp
);
116 pp_base (pp
)->padding
= pp_none
;
120 pp_c_dot (c_pretty_printer
*pp
)
123 pp_base (pp
)->padding
= pp_none
;
127 pp_c_ampersand (c_pretty_printer
*pp
)
130 pp_base (pp
)->padding
= pp_none
;
134 pp_c_star (c_pretty_printer
*pp
)
137 pp_base (pp
)->padding
= pp_none
;
141 pp_c_arrow (c_pretty_printer
*pp
)
144 pp_base (pp
)->padding
= pp_none
;
148 pp_c_semicolon (c_pretty_printer
*pp
)
151 pp_base (pp
)->padding
= pp_none
;
155 pp_c_complement (c_pretty_printer
*pp
)
158 pp_base (pp
)->padding
= pp_none
;
162 pp_c_exclamation (c_pretty_printer
*pp
)
165 pp_base (pp
)->padding
= pp_none
;
168 /* Print out the external representation of CV-QUALIFIER. */
171 pp_c_cv_qualifier (c_pretty_printer
*pp
, const char *cv
)
173 const char *p
= pp_last_position_in_text (pp
);
174 /* The C programming language does not have references, but it is much
175 simpler to handle those here rather than going through the same
176 logic in the C++ pretty-printer. */
177 if (p
!= NULL
&& (*p
== '*' || *p
== '&'))
178 pp_c_whitespace (pp
);
179 pp_c_identifier (pp
, cv
);
182 /* Pretty-print T using the type-cast notation '( type-name )'. */
185 pp_c_type_cast (c_pretty_printer
*pp
, tree t
)
187 pp_c_left_paren (pp
);
189 pp_c_right_paren (pp
);
192 /* We're about to pretty-print a pointer type as indicated by T.
193 Output a whitespace, if needed, preparing for subsequent output. */
196 pp_c_space_for_pointer_operator (c_pretty_printer
*pp
, tree t
)
198 if (POINTER_TYPE_P (t
))
200 tree pointee
= strip_pointer_operator (TREE_TYPE (t
));
201 if (TREE_CODE (pointee
) != ARRAY_TYPE
202 && TREE_CODE (pointee
) != FUNCTION_TYPE
)
203 pp_c_whitespace (pp
);
210 /* C++ cv-qualifiers are called type-qualifiers in C. Print out the
211 cv-qualifiers of T. If T is a declaration then it is the cv-qualifier
212 of its type. Take care of possible extensions.
216 type-qualifier-list type-qualifier
221 __restrict__ -- GNU C
225 pp_c_type_qualifier_list (c_pretty_printer
*pp
, tree t
)
232 qualifiers
= TYPE_QUALS (t
);
233 if (qualifiers
& TYPE_QUAL_CONST
)
234 pp_c_cv_qualifier (pp
, "const");
235 if (qualifiers
& TYPE_QUAL_VOLATILE
)
236 pp_c_cv_qualifier (pp
, "volatile");
237 if (qualifiers
& TYPE_QUAL_RESTRICT
)
238 pp_c_cv_qualifier (pp
, flag_isoc99
? "restrict" : "__restrict__");
242 * type-qualifier-list(opt)
243 * type-qualifier-list(opt) pointer */
246 pp_c_pointer (c_pretty_printer
*pp
, tree t
)
248 if (!TYPE_P (t
) && TREE_CODE (t
) != TYPE_DECL
)
250 switch (TREE_CODE (t
))
253 /* It is easier to handle C++ reference types here. */
255 if (TREE_CODE (TREE_TYPE (t
)) == POINTER_TYPE
)
256 pp_c_pointer (pp
, TREE_TYPE (t
));
257 if (TREE_CODE (t
) == POINTER_TYPE
)
261 pp_c_type_qualifier_list (pp
, t
);
264 /* ??? This node is now in GENERIC and so shouldn't be here. But
265 we'll fix that later. */
267 pp_declaration (pp
, DECL_EXPR_DECL (t
));
268 pp_needs_newline (pp
) = true;
272 pp_unsupported_tree (pp
, t
);
289 struct-or-union-specifier
294 simple-type-specifier:
299 pp_c_type_specifier (c_pretty_printer
*pp
, tree t
)
301 const enum tree_code code
= TREE_CODE (t
);
305 pp_c_identifier (pp
, "<type-error>");
308 case IDENTIFIER_NODE
:
309 pp_c_tree_decl_identifier (pp
, t
);
320 pp_c_type_specifier (pp
, t
);
324 int prec
= TYPE_PRECISION (t
);
325 t
= c_common_type_for_mode (TYPE_MODE (t
), TYPE_UNSIGNED (t
));
328 pp_c_type_specifier (pp
, t
);
329 if (TYPE_PRECISION (t
) != prec
)
332 pp_decimal_int (pp
, prec
);
340 pp_string (pp
, (TYPE_UNSIGNED (t
)
341 ? "<unnamed-unsigned:"
342 : "<unnamed-signed:"));
345 pp_string (pp
, "<unnamed-float:");
350 pp_decimal_int (pp
, prec
);
358 pp_id_expression (pp
, t
);
360 pp_c_identifier (pp
, "<typedef-error>");
366 if (code
== UNION_TYPE
)
367 pp_c_identifier (pp
, "union");
368 else if (code
== RECORD_TYPE
)
369 pp_c_identifier (pp
, "struct");
370 else if (code
== ENUMERAL_TYPE
)
371 pp_c_identifier (pp
, "enum");
373 pp_c_identifier (pp
, "<tag-error>");
376 pp_id_expression (pp
, TYPE_NAME (t
));
378 pp_c_identifier (pp
, "<anonymous>");
382 pp_unsupported_tree (pp
, t
);
387 /* specifier-qualifier-list:
388 type-specifier specifier-qualifier-list-opt
389 type-qualifier specifier-qualifier-list-opt
392 Implementation note: Because of the non-linearities in array or
393 function declarations, this routine prints not just the
394 specifier-qualifier-list of such entities or types of such entities,
395 but also the 'pointer' production part of their declarators. The
396 remaining part is done by pp_declarator or pp_c_abstract_declarator. */
399 pp_c_specifier_qualifier_list (c_pretty_printer
*pp
, tree t
)
401 const enum tree_code code
= TREE_CODE (t
);
403 if (TREE_CODE (t
) != POINTER_TYPE
)
404 pp_c_type_qualifier_list (pp
, t
);
410 /* Get the types-specifier of this type. */
411 tree pointee
= strip_pointer_operator (TREE_TYPE (t
));
412 pp_c_specifier_qualifier_list (pp
, pointee
);
413 if (TREE_CODE (pointee
) == ARRAY_TYPE
414 || TREE_CODE (pointee
) == FUNCTION_TYPE
)
416 pp_c_whitespace (pp
);
417 pp_c_left_paren (pp
);
419 else if (!c_dialect_cxx ())
420 pp_c_whitespace (pp
);
421 pp_ptr_operator (pp
, t
);
427 pp_c_specifier_qualifier_list (pp
, TREE_TYPE (t
));
432 pp_c_specifier_qualifier_list (pp
, TREE_TYPE (t
));
433 if (code
== COMPLEX_TYPE
)
434 pp_c_identifier (pp
, flag_isoc99
? "_Complex" : "__complex__");
435 else if (code
== VECTOR_TYPE
)
436 pp_c_identifier (pp
, "__vector__");
440 pp_simple_type_specifier (pp
, t
);
445 /* parameter-type-list:
450 parameter-declaration
451 parameter-list , parameter-declaration
453 parameter-declaration:
454 declaration-specifiers declarator
455 declaration-specifiers abstract-declarator(opt) */
458 pp_c_parameter_type_list (c_pretty_printer
*pp
, tree t
)
460 bool want_parm_decl
= DECL_P (t
) && !(pp
->flags
& pp_c_flag_abstract
);
461 tree parms
= want_parm_decl
? DECL_ARGUMENTS (t
) : TYPE_ARG_TYPES (t
);
462 pp_c_left_paren (pp
);
463 if (parms
== void_list_node
)
464 pp_c_identifier (pp
, "void");
468 for ( ; parms
&& parms
!= void_list_node
; parms
= TREE_CHAIN (parms
))
471 pp_separate_with (pp
, ',');
473 pp_declaration_specifiers
474 (pp
, want_parm_decl
? parms
: TREE_VALUE (parms
));
476 pp_declarator (pp
, parms
);
478 pp_abstract_declarator (pp
, TREE_VALUE (parms
));
481 pp_c_right_paren (pp
);
484 /* abstract-declarator:
486 pointer(opt) direct-abstract-declarator */
489 pp_c_abstract_declarator (c_pretty_printer
*pp
, tree t
)
491 if (TREE_CODE (t
) == POINTER_TYPE
)
493 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
494 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
495 pp_c_right_paren (pp
);
499 pp_direct_abstract_declarator (pp
, t
);
502 /* direct-abstract-declarator:
503 ( abstract-declarator )
504 direct-abstract-declarator(opt) [ assignment-expression(opt) ]
505 direct-abstract-declarator(opt) [ * ]
506 direct-abstract-declarator(opt) ( parameter-type-list(opt) ) */
509 pp_c_direct_abstract_declarator (c_pretty_printer
*pp
, tree t
)
511 switch (TREE_CODE (t
))
514 pp_abstract_declarator (pp
, t
);
518 pp_c_parameter_type_list (pp
, t
);
519 pp_direct_abstract_declarator (pp
, TREE_TYPE (t
));
523 pp_c_left_bracket (pp
);
524 if (TYPE_DOMAIN (t
) && TYPE_MAX_VALUE (TYPE_DOMAIN (t
)))
525 pp_expression (pp
, TYPE_MAX_VALUE (TYPE_DOMAIN (t
)));
526 pp_c_right_bracket (pp
);
527 pp_direct_abstract_declarator (pp
, TREE_TYPE (t
));
530 case IDENTIFIER_NODE
:
544 pp_unsupported_tree (pp
, t
);
550 specifier-qualifier-list abstract-declarator(opt) */
553 pp_c_type_id (c_pretty_printer
*pp
, tree t
)
555 pp_c_specifier_qualifier_list (pp
, t
);
556 pp_abstract_declarator (pp
, t
);
559 /* storage-class-specifier:
567 pp_c_storage_class_specifier (c_pretty_printer
*pp
, tree t
)
569 if (TREE_CODE (t
) == TYPE_DECL
)
570 pp_c_identifier (pp
, "typedef");
573 if (DECL_REGISTER (t
))
574 pp_c_identifier (pp
, "register");
575 else if (TREE_STATIC (t
) && TREE_CODE (t
) == VAR_DECL
)
576 pp_c_identifier (pp
, "static");
580 /* function-specifier:
584 pp_c_function_specifier (c_pretty_printer
*pp
, tree t
)
586 if (TREE_CODE (t
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (t
))
587 pp_c_identifier (pp
, "inline");
590 /* declaration-specifiers:
591 storage-class-specifier declaration-specifiers(opt)
592 type-specifier declaration-specifiers(opt)
593 type-qualifier declaration-specifiers(opt)
594 function-specifier declaration-specifiers(opt) */
597 pp_c_declaration_specifiers (c_pretty_printer
*pp
, tree t
)
599 pp_storage_class_specifier (pp
, t
);
600 pp_function_specifier (pp
, t
);
601 pp_c_specifier_qualifier_list (pp
, DECL_P (t
) ? TREE_TYPE (t
) : t
);
607 direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
608 direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
609 direct-declarator [ type-qualifier-list static assignment-expression ]
610 direct-declarator [ type-qualifier-list * ]
611 direct-declarator ( parameter-type-list )
612 direct-declarator ( identifier-list(opt) ) */
615 pp_c_direct_declarator (c_pretty_printer
*pp
, tree t
)
617 switch (TREE_CODE (t
))
624 pp_c_space_for_pointer_operator (pp
, TREE_TYPE (t
));
625 pp_c_tree_decl_identifier (pp
, t
);
630 pp_abstract_declarator (pp
, TREE_TYPE (t
));
634 pp_parameter_list (pp
, t
);
635 pp_abstract_declarator (pp
, TREE_TYPE (t
));
639 pp_c_space_for_pointer_operator (pp
, TREE_TYPE (TREE_TYPE (t
)));
640 pp_c_tree_decl_identifier (pp
, t
);
641 if (pp_c_base (pp
)->flags
& pp_c_flag_abstract
)
642 pp_abstract_declarator (pp
, TREE_TYPE (t
));
645 pp_parameter_list (pp
, t
);
646 pp_abstract_declarator (pp
, TREE_TYPE (TREE_TYPE (t
)));
658 pp_unsupported_tree (pp
, t
);
665 pointer(opt) direct-declarator */
668 pp_c_declarator (c_pretty_printer
*pp
, tree t
)
670 switch (TREE_CODE (t
))
686 pp_direct_declarator (pp
, t
);
691 pp_unsupported_tree (pp
, t
);
697 declaration-specifiers init-declarator-list(opt) ; */
700 pp_c_declaration (c_pretty_printer
*pp
, tree t
)
702 pp_declaration_specifiers (pp
, t
);
703 pp_c_init_declarator (pp
, t
);
706 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
709 pp_c_attributes (c_pretty_printer
*pp
, tree attributes
)
711 if (attributes
== NULL_TREE
)
714 pp_c_identifier (pp
, "__attribute__");
715 pp_c_left_paren (pp
);
716 pp_c_left_paren (pp
);
717 for (; attributes
!= NULL_TREE
; attributes
= TREE_CHAIN (attributes
))
719 pp_tree_identifier (pp
, TREE_PURPOSE (attributes
));
720 if (TREE_VALUE (attributes
))
721 pp_c_call_argument_list (pp
, TREE_VALUE (attributes
));
723 if (TREE_CHAIN (attributes
))
724 pp_separate_with (pp
, ',');
726 pp_c_right_paren (pp
);
727 pp_c_right_paren (pp
);
730 /* function-definition:
731 declaration-specifiers declarator compound-statement */
734 pp_c_function_definition (c_pretty_printer
*pp
, tree t
)
736 pp_declaration_specifiers (pp
, t
);
737 pp_declarator (pp
, t
);
738 pp_needs_newline (pp
) = true;
739 pp_statement (pp
, DECL_SAVED_TREE (t
));
747 /* Print out a c-char. This is called solely for characters which are
748 in the *target* execution character set. We ought to convert them
749 back to the *host* execution character set before printing, but we
750 have no way to do this at present. A decent compromise is to print
751 all characters as if they were in the host execution character set,
752 and not attempt to recover any named escape characters, but render
753 all unprintables as octal escapes. If the host and target character
754 sets are the same, this produces relatively readable output. If they
755 are not the same, strings may appear as gibberish, but that's okay
756 (in fact, it may well be what the reader wants, e.g. if they are looking
757 to see if conversion to the target character set happened correctly).
759 A special case: we need to prefix \, ", and ' with backslashes. It is
760 correct to do so for the *host*'s \, ", and ', because the rest of the
761 file appears in the host character set. */
764 pp_c_char (c_pretty_printer
*pp
, int c
)
770 case '\\': pp_string (pp
, "\\\\"); break;
771 case '\'': pp_string (pp
, "\\\'"); break;
772 case '\"': pp_string (pp
, "\\\""); break;
773 default: pp_character (pp
, c
);
777 pp_scalar (pp
, "\\%03o", (unsigned) c
);
780 /* Print out a STRING literal. */
783 pp_c_string_literal (c_pretty_printer
*pp
, tree s
)
785 const char *p
= TREE_STRING_POINTER (s
);
786 int n
= TREE_STRING_LENGTH (s
) - 1;
789 for (i
= 0; i
< n
; ++i
)
790 pp_c_char (pp
, p
[i
]);
794 /* Pretty-print an INTEGER literal. */
797 pp_c_integer_constant (c_pretty_printer
*pp
, tree i
)
799 tree type
= TREE_TYPE (i
);
801 if (TREE_INT_CST_HIGH (i
) == 0)
802 pp_wide_integer (pp
, TREE_INT_CST_LOW (i
));
805 if (tree_int_cst_sgn (i
) < 0)
807 pp_character (pp
, '-');
808 i
= build_int_cst_wide (NULL_TREE
,
809 -TREE_INT_CST_LOW (i
),
810 ~TREE_INT_CST_HIGH (i
)
811 + !TREE_INT_CST_LOW (i
));
813 sprintf (pp_buffer (pp
)->digit_buffer
,
814 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
815 TREE_INT_CST_HIGH (i
), TREE_INT_CST_LOW (i
));
816 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);
818 if (TYPE_UNSIGNED (type
))
819 pp_character (pp
, 'u');
820 if (type
== long_integer_type_node
|| type
== long_unsigned_type_node
)
821 pp_character (pp
, 'l');
822 else if (type
== long_long_integer_type_node
823 || type
== long_long_unsigned_type_node
)
824 pp_string (pp
, "ll");
827 /* Print out a CHARACTER literal. */
830 pp_c_character_constant (c_pretty_printer
*pp
, tree c
)
832 tree type
= TREE_TYPE (c
);
833 if (type
== wchar_type_node
)
834 pp_character (pp
, 'L');
836 if (host_integerp (c
, TYPE_UNSIGNED (type
)))
837 pp_c_char (pp
, tree_low_cst (c
, TYPE_UNSIGNED (type
)));
839 pp_scalar (pp
, "\\x%x", (unsigned) TREE_INT_CST_LOW (c
));
843 /* Print out a BOOLEAN literal. */
846 pp_c_bool_constant (c_pretty_printer
*pp
, tree b
)
848 if (b
== boolean_false_node
)
850 if (c_dialect_cxx ())
851 pp_c_identifier (pp
, "false");
852 else if (flag_isoc99
)
853 pp_c_identifier (pp
, "_False");
855 pp_unsupported_tree (pp
, b
);
857 else if (b
== boolean_true_node
)
859 if (c_dialect_cxx ())
860 pp_c_identifier (pp
, "true");
861 else if (flag_isoc99
)
862 pp_c_identifier (pp
, "_True");
864 pp_unsupported_tree (pp
, b
);
866 else if (TREE_CODE (b
) == INTEGER_CST
)
867 pp_c_integer_constant (pp
, b
);
869 pp_unsupported_tree (pp
, b
);
872 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
873 false; that means the value was obtained by a cast, in which case
874 print out the type-id part of the cast-expression -- the casted value
875 is then printed by pp_c_integer_literal. */
878 pp_c_enumeration_constant (c_pretty_printer
*pp
, tree e
)
880 bool value_is_named
= true;
881 tree type
= TREE_TYPE (e
);
884 /* Find the name of this constant. */
885 for (value
= TYPE_VALUES (type
);
886 value
!= NULL_TREE
&& !tree_int_cst_equal (TREE_VALUE (value
), e
);
887 value
= TREE_CHAIN (value
))
890 if (value
!= NULL_TREE
)
891 pp_id_expression (pp
, TREE_PURPOSE (value
));
894 /* Value must have been cast. */
895 pp_c_type_cast (pp
, type
);
896 value_is_named
= false;
899 return value_is_named
;
902 /* Print out a REAL value as a decimal-floating-constant. */
905 pp_c_floating_constant (c_pretty_printer
*pp
, tree r
)
907 real_to_decimal (pp_buffer (pp
)->digit_buffer
, &TREE_REAL_CST (r
),
908 sizeof (pp_buffer (pp
)->digit_buffer
), 0, 1);
909 pp_string (pp
, pp_buffer(pp
)->digit_buffer
);
910 if (TREE_TYPE (r
) == float_type_node
)
911 pp_character (pp
, 'f');
912 else if (TREE_TYPE (r
) == long_double_type_node
)
913 pp_character (pp
, 'l');
914 else if (TREE_TYPE (r
) == dfloat128_type_node
)
915 pp_string (pp
, "dl");
916 else if (TREE_TYPE (r
) == dfloat64_type_node
)
917 pp_string (pp
, "dd");
918 else if (TREE_TYPE (r
) == dfloat32_type_node
)
919 pp_string (pp
, "df");
922 /* Pretty-print a compound literal expression. GNU extensions include
926 pp_c_compound_literal (c_pretty_printer
*pp
, tree e
)
928 tree type
= TREE_TYPE (e
);
929 pp_c_type_cast (pp
, type
);
931 switch (TREE_CODE (type
))
938 pp_c_brace_enclosed_initializer_list (pp
, e
);
942 pp_unsupported_tree (pp
, e
);
951 character-constant */
954 pp_c_constant (c_pretty_printer
*pp
, tree e
)
956 const enum tree_code code
= TREE_CODE (e
);
962 tree type
= TREE_TYPE (e
);
963 if (type
== boolean_type_node
)
964 pp_c_bool_constant (pp
, e
);
965 else if (type
== char_type_node
)
966 pp_c_character_constant (pp
, e
);
967 else if (TREE_CODE (type
) == ENUMERAL_TYPE
968 && pp_c_enumeration_constant (pp
, e
))
971 pp_c_integer_constant (pp
, e
);
976 pp_c_floating_constant (pp
, e
);
980 pp_c_string_literal (pp
, e
);
984 pp_unsupported_tree (pp
, e
);
989 /* Pretty-print an IDENTIFIER_NODE, preceded by whitespace is necessary. */
992 pp_c_identifier (c_pretty_printer
*pp
, const char *id
)
994 pp_c_maybe_whitespace (pp
);
995 pp_identifier (pp
, id
);
996 pp_base (pp
)->padding
= pp_before
;
999 /* Pretty-print a C primary-expression.
1007 pp_c_primary_expression (c_pretty_printer
*pp
, tree e
)
1009 switch (TREE_CODE (e
))
1017 pp_c_tree_decl_identifier (pp
, e
);
1020 case IDENTIFIER_NODE
:
1021 pp_c_tree_identifier (pp
, e
);
1025 pp_c_identifier (pp
, "<erroneous-expression>");
1029 pp_c_identifier (pp
, "<return-value>");
1035 pp_c_constant (pp
, e
);
1039 pp_c_identifier (pp
, "__builtin_memcpy");
1040 pp_c_left_paren (pp
);
1042 pp_primary_expression (pp
, TREE_OPERAND (e
, 0));
1043 pp_separate_with (pp
, ',');
1045 pp_initializer (pp
, TREE_OPERAND (e
, 1));
1046 if (TREE_OPERAND (e
, 2))
1048 pp_separate_with (pp
, ',');
1049 pp_c_expression (pp
, TREE_OPERAND (e
, 2));
1051 pp_c_right_paren (pp
);
1055 /* FIXME: Make sure we won't get into an infinie loop. */
1056 pp_c_left_paren (pp
);
1057 pp_expression (pp
, e
);
1058 pp_c_right_paren (pp
);
1063 /* Print out a C initializer -- also support C compound-literals.
1065 assignment-expression:
1066 { initializer-list }
1067 { initializer-list , } */
1070 pp_c_initializer (c_pretty_printer
*pp
, tree e
)
1072 if (TREE_CODE (e
) == CONSTRUCTOR
)
1073 pp_c_brace_enclosed_initializer_list (pp
, e
);
1075 pp_expression (pp
, e
);
1080 declarator = initializer */
1083 pp_c_init_declarator (c_pretty_printer
*pp
, tree t
)
1085 pp_declarator (pp
, t
);
1086 /* We don't want to output function definitions here. There are handled
1087 elsewhere (and the syntactic form is bogus anyway). */
1088 if (TREE_CODE (t
) != FUNCTION_DECL
&& DECL_INITIAL (t
))
1090 tree init
= DECL_INITIAL (t
);
1091 /* This C++ bit is handled here because it is easier to do so.
1092 In templates, the C++ parser builds a TREE_LIST for a
1093 direct-initialization; the TREE_PURPOSE is the variable to
1094 initialize and the TREE_VALUE is the initializer. */
1095 if (TREE_CODE (init
) == TREE_LIST
)
1097 pp_c_left_paren (pp
);
1098 pp_expression (pp
, TREE_VALUE (init
));
1099 pp_right_paren (pp
);
1106 pp_c_initializer (pp
, init
);
1111 /* initializer-list:
1112 designation(opt) initializer
1113 initializer-list , designation(opt) initializer
1120 designator-list designator
1123 [ constant-expression ]
1127 pp_c_initializer_list (c_pretty_printer
*pp
, tree e
)
1129 tree type
= TREE_TYPE (e
);
1130 const enum tree_code code
= TREE_CODE (type
);
1138 tree init
= TREE_OPERAND (e
, 0);
1139 for (; init
!= NULL_TREE
; init
= TREE_CHAIN (init
))
1141 if (code
== RECORD_TYPE
|| code
== UNION_TYPE
)
1144 pp_c_primary_expression (pp
, TREE_PURPOSE (init
));
1148 pp_c_left_bracket (pp
);
1149 if (TREE_PURPOSE (init
))
1150 pp_c_constant (pp
, TREE_PURPOSE (init
));
1151 pp_c_right_bracket (pp
);
1153 pp_c_whitespace (pp
);
1155 pp_c_whitespace (pp
);
1156 pp_initializer (pp
, TREE_VALUE (init
));
1157 if (TREE_CHAIN (init
))
1158 pp_separate_with (pp
, ',');
1164 if (TREE_CODE (e
) == VECTOR_CST
)
1165 pp_c_expression_list (pp
, TREE_VECTOR_CST_ELTS (e
));
1166 else if (TREE_CODE (e
) == CONSTRUCTOR
)
1167 pp_c_constructor_elts (pp
, CONSTRUCTOR_ELTS (e
));
1173 if (TREE_CODE (e
) == CONSTRUCTOR
)
1174 pp_c_constructor_elts (pp
, CONSTRUCTOR_ELTS (e
));
1175 else if (TREE_CODE (e
) == COMPLEX_CST
|| TREE_CODE (e
) == COMPLEX_EXPR
)
1177 const bool cst
= TREE_CODE (e
) == COMPLEX_CST
;
1178 pp_expression (pp
, cst
? TREE_REALPART (e
) : TREE_OPERAND (e
, 0));
1179 pp_separate_with (pp
, ',');
1180 pp_expression (pp
, cst
? TREE_IMAGPART (e
) : TREE_OPERAND (e
, 1));
1190 pp_unsupported_tree (pp
, type
);
1193 /* Pretty-print a brace-enclosed initializer-list. */
1196 pp_c_brace_enclosed_initializer_list (c_pretty_printer
*pp
, tree l
)
1198 pp_c_left_brace (pp
);
1199 pp_c_initializer_list (pp
, l
);
1200 pp_c_right_brace (pp
);
1204 /* This is a convenient function, used to bridge gap between C and C++
1211 pp_c_id_expression (c_pretty_printer
*pp
, tree t
)
1213 switch (TREE_CODE (t
))
1222 pp_c_tree_decl_identifier (pp
, t
);
1225 case IDENTIFIER_NODE
:
1226 pp_c_tree_identifier (pp
, t
);
1230 pp_unsupported_tree (pp
, t
);
1235 /* postfix-expression:
1237 postfix-expression [ expression ]
1238 postfix-expression ( argument-expression-list(opt) )
1239 postfix-expression . identifier
1240 postfix-expression -> identifier
1241 postfix-expression ++
1242 postfix-expression --
1243 ( type-name ) { initializer-list }
1244 ( type-name ) { initializer-list , } */
1247 pp_c_postfix_expression (c_pretty_printer
*pp
, tree e
)
1249 enum tree_code code
= TREE_CODE (e
);
1252 case POSTINCREMENT_EXPR
:
1253 case POSTDECREMENT_EXPR
:
1254 pp_postfix_expression (pp
, TREE_OPERAND (e
, 0));
1255 pp_identifier (pp
, code
== POSTINCREMENT_EXPR
? "++" : "--");
1259 pp_postfix_expression (pp
, TREE_OPERAND (e
, 0));
1260 pp_c_left_bracket (pp
);
1261 pp_expression (pp
, TREE_OPERAND (e
, 1));
1262 pp_c_right_bracket (pp
);
1266 pp_postfix_expression (pp
, TREE_OPERAND (e
, 0));
1267 pp_c_call_argument_list (pp
, TREE_OPERAND (e
, 1));
1270 case UNORDERED_EXPR
:
1271 pp_c_identifier (pp
, flag_isoc99
1273 : "__builtin_isunordered");
1277 pp_c_identifier (pp
, flag_isoc99
1279 : "!__builtin_isunordered");
1283 pp_c_identifier (pp
, flag_isoc99
1285 : "!__builtin_isgreaterequal");
1289 pp_c_identifier (pp
, flag_isoc99
1291 : "!__builtin_isgreater");
1295 pp_c_identifier (pp
, flag_isoc99
1297 : "!__builtin_islessequal");
1301 pp_c_identifier (pp
, flag_isoc99
1303 : "!__builtin_isless");
1307 pp_c_identifier (pp
, flag_isoc99
1309 : "!__builtin_islessgreater");
1313 pp_c_identifier (pp
, flag_isoc99
1315 : "__builtin_islessgreater");
1319 pp_c_left_paren (pp
);
1320 pp_expression (pp
, TREE_OPERAND (e
, 0));
1321 pp_separate_with (pp
, ',');
1322 pp_expression (pp
, TREE_OPERAND (e
, 1));
1323 pp_c_right_paren (pp
);
1327 pp_c_identifier (pp
, "__builtin_abs");
1328 pp_c_left_paren (pp
);
1329 pp_expression (pp
, TREE_OPERAND (e
, 0));
1330 pp_c_right_paren (pp
);
1335 tree object
= TREE_OPERAND (e
, 0);
1336 if (TREE_CODE (object
) == INDIRECT_REF
)
1338 pp_postfix_expression (pp
, TREE_OPERAND (object
, 0));
1343 pp_postfix_expression (pp
, object
);
1346 pp_expression (pp
, TREE_OPERAND (e
, 1));
1353 pp_c_compound_literal (pp
, e
);
1356 case COMPOUND_LITERAL_EXPR
:
1357 e
= DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e
));
1360 pp_initializer (pp
, e
);
1364 pp_c_identifier (pp
, "__builtin_va_arg");
1365 pp_c_left_paren (pp
);
1366 pp_assignment_expression (pp
, TREE_OPERAND (e
, 0));
1367 pp_separate_with (pp
, ',');
1368 pp_type_id (pp
, TREE_TYPE (e
));
1369 pp_c_right_paren (pp
);
1373 if (TREE_CODE (TREE_OPERAND (e
, 0)) == FUNCTION_DECL
)
1375 pp_c_id_expression (pp
, TREE_OPERAND (e
, 0));
1378 /* else fall through. */
1381 pp_primary_expression (pp
, e
);
1386 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1389 pp_c_expression_list (c_pretty_printer
*pp
, tree e
)
1391 for (; e
!= NULL_TREE
; e
= TREE_CHAIN (e
))
1393 pp_expression (pp
, TREE_VALUE (e
));
1395 pp_separate_with (pp
, ',');
1399 /* Print out V, which contains the elements of a constructor. */
1402 pp_c_constructor_elts (c_pretty_printer
*pp
, VEC(constructor_elt
,gc
) *v
)
1404 unsigned HOST_WIDE_INT ix
;
1407 FOR_EACH_CONSTRUCTOR_VALUE (v
, ix
, value
)
1409 pp_expression (pp
, value
);
1410 if (ix
!= VEC_length (constructor_elt
, v
) - 1)
1411 pp_separate_with (pp
, ',');
1415 /* Print out an expression-list in parens, as in a function call. */
1418 pp_c_call_argument_list (c_pretty_printer
*pp
, tree t
)
1420 pp_c_left_paren (pp
);
1421 if (t
&& TREE_CODE (t
) == TREE_LIST
)
1422 pp_c_expression_list (pp
, t
);
1423 pp_c_right_paren (pp
);
1426 /* unary-expression:
1430 unary-operator cast-expression
1431 sizeof unary-expression
1434 unary-operator: one of
1439 __alignof__ unary-expression
1440 __alignof__ ( type-id )
1441 __real__ unary-expression
1442 __imag__ unary-expression */
1445 pp_c_unary_expression (c_pretty_printer
*pp
, tree e
)
1447 enum tree_code code
= TREE_CODE (e
);
1450 case PREINCREMENT_EXPR
:
1451 case PREDECREMENT_EXPR
:
1452 pp_identifier (pp
, code
== PREINCREMENT_EXPR
? "++" : "--");
1453 pp_c_unary_expression (pp
, TREE_OPERAND (e
, 0));
1460 case TRUTH_NOT_EXPR
:
1462 /* String literal are used by address. */
1463 if (code
== ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (e
, 0)) != STRING_CST
)
1465 else if (code
== INDIRECT_REF
)
1467 else if (code
== NEGATE_EXPR
)
1469 else if (code
== BIT_NOT_EXPR
|| code
== CONJ_EXPR
)
1471 else if (code
== TRUTH_NOT_EXPR
)
1472 pp_exclamation (pp
);
1473 pp_c_cast_expression (pp
, TREE_OPERAND (e
, 0));
1478 pp_c_identifier (pp
, code
== REALPART_EXPR
? "__real__" : "__imag__");
1479 pp_c_whitespace (pp
);
1480 pp_unary_expression (pp
, TREE_OPERAND (e
, 0));
1484 pp_postfix_expression (pp
, e
);
1491 ( type-name ) cast-expression */
1494 pp_c_cast_expression (c_pretty_printer
*pp
, tree e
)
1496 switch (TREE_CODE (e
))
1499 case FIX_TRUNC_EXPR
:
1502 pp_c_type_cast (pp
, TREE_TYPE (e
));
1503 pp_c_cast_expression (pp
, TREE_OPERAND (e
, 0));
1507 pp_unary_expression (pp
, e
);
1511 /* multiplicative-expression:
1513 multiplicative-expression * cast-expression
1514 multiplicative-expression / cast-expression
1515 multiplicative-expression % cast-expression */
1518 pp_c_multiplicative_expression (c_pretty_printer
*pp
, tree e
)
1520 enum tree_code code
= TREE_CODE (e
);
1524 case TRUNC_DIV_EXPR
:
1525 case TRUNC_MOD_EXPR
:
1526 pp_multiplicative_expression (pp
, TREE_OPERAND (e
, 0));
1527 pp_c_whitespace (pp
);
1528 if (code
== MULT_EXPR
)
1530 else if (code
== TRUNC_DIV_EXPR
)
1534 pp_c_whitespace (pp
);
1535 pp_c_cast_expression (pp
, TREE_OPERAND (e
, 1));
1539 pp_c_cast_expression (pp
, e
);
1544 /* additive-expression:
1545 multiplicative-expression
1546 additive-expression + multiplicative-expression
1547 additive-expression - multiplicative-expression */
1550 pp_c_additive_expression (c_pretty_printer
*pp
, tree e
)
1552 enum tree_code code
= TREE_CODE (e
);
1557 pp_c_additive_expression (pp
, TREE_OPERAND (e
, 0));
1558 pp_c_whitespace (pp
);
1559 if (code
== PLUS_EXPR
)
1563 pp_c_whitespace (pp
);
1564 pp_multiplicative_expression (pp
, TREE_OPERAND (e
, 1));
1568 pp_multiplicative_expression (pp
, e
);
1573 /* additive-expression:
1575 shift-expression << additive-expression
1576 shift-expression >> additive-expression */
1579 pp_c_shift_expression (c_pretty_printer
*pp
, tree e
)
1581 enum tree_code code
= TREE_CODE (e
);
1586 pp_c_shift_expression (pp
, TREE_OPERAND (e
, 0));
1587 pp_c_whitespace (pp
);
1588 pp_identifier (pp
, code
== LSHIFT_EXPR
? "<<" : ">>");
1589 pp_c_whitespace (pp
);
1590 pp_c_additive_expression (pp
, TREE_OPERAND (e
, 1));
1594 pp_c_additive_expression (pp
, e
);
1598 /* relational-expression:
1600 relational-expression < shift-expression
1601 relational-expression > shift-expression
1602 relational-expression <= shift-expression
1603 relational-expression >= shift-expression */
1606 pp_c_relational_expression (c_pretty_printer
*pp
, tree e
)
1608 enum tree_code code
= TREE_CODE (e
);
1615 pp_c_relational_expression (pp
, TREE_OPERAND (e
, 0));
1616 pp_c_whitespace (pp
);
1617 if (code
== LT_EXPR
)
1619 else if (code
== GT_EXPR
)
1621 else if (code
== LE_EXPR
)
1622 pp_identifier (pp
, "<=");
1623 else if (code
== GE_EXPR
)
1624 pp_identifier (pp
, ">=");
1625 pp_c_whitespace (pp
);
1626 pp_c_shift_expression (pp
, TREE_OPERAND (e
, 1));
1630 pp_c_shift_expression (pp
, e
);
1635 /* equality-expression:
1636 relational-expression
1637 equality-expression == relational-expression
1638 equality-equality != relational-expression */
1641 pp_c_equality_expression (c_pretty_printer
*pp
, tree e
)
1643 enum tree_code code
= TREE_CODE (e
);
1648 pp_c_equality_expression (pp
, TREE_OPERAND (e
, 0));
1649 pp_c_whitespace (pp
);
1650 pp_identifier (pp
, code
== EQ_EXPR
? "==" : "!=");
1651 pp_c_whitespace (pp
);
1652 pp_c_relational_expression (pp
, TREE_OPERAND (e
, 1));
1656 pp_c_relational_expression (pp
, e
);
1663 AND-expression & equality-equality */
1666 pp_c_and_expression (c_pretty_printer
*pp
, tree e
)
1668 if (TREE_CODE (e
) == BIT_AND_EXPR
)
1670 pp_c_and_expression (pp
, TREE_OPERAND (e
, 0));
1671 pp_c_whitespace (pp
);
1673 pp_c_whitespace (pp
);
1674 pp_c_equality_expression (pp
, TREE_OPERAND (e
, 1));
1677 pp_c_equality_expression (pp
, e
);
1680 /* exclusive-OR-expression:
1682 exclusive-OR-expression ^ AND-expression */
1685 pp_c_exclusive_or_expression (c_pretty_printer
*pp
, tree e
)
1687 if (TREE_CODE (e
) == BIT_XOR_EXPR
)
1689 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 0));
1690 pp_c_maybe_whitespace (pp
);
1692 pp_c_whitespace (pp
);
1693 pp_c_and_expression (pp
, TREE_OPERAND (e
, 1));
1696 pp_c_and_expression (pp
, e
);
1699 /* inclusive-OR-expression:
1700 exclusive-OR-expression
1701 inclusive-OR-expression | exclusive-OR-expression */
1704 pp_c_inclusive_or_expression (c_pretty_printer
*pp
, tree e
)
1706 if (TREE_CODE (e
) == BIT_IOR_EXPR
)
1708 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 0));
1709 pp_c_whitespace (pp
);
1711 pp_c_whitespace (pp
);
1712 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 1));
1715 pp_c_exclusive_or_expression (pp
, e
);
1718 /* logical-AND-expression:
1719 inclusive-OR-expression
1720 logical-AND-expression && inclusive-OR-expression */
1723 pp_c_logical_and_expression (c_pretty_printer
*pp
, tree e
)
1725 if (TREE_CODE (e
) == TRUTH_ANDIF_EXPR
)
1727 pp_c_logical_and_expression (pp
, TREE_OPERAND (e
, 0));
1728 pp_c_whitespace (pp
);
1729 pp_identifier (pp
, "&&");
1730 pp_c_whitespace (pp
);
1731 pp_c_inclusive_or_expression (pp
, TREE_OPERAND (e
, 1));
1734 pp_c_inclusive_or_expression (pp
, e
);
1737 /* logical-OR-expression:
1738 logical-AND-expression
1739 logical-OR-expression || logical-AND-expression */
1742 pp_c_logical_or_expression (c_pretty_printer
*pp
, tree e
)
1744 if (TREE_CODE (e
) == TRUTH_ORIF_EXPR
)
1746 pp_c_logical_or_expression (pp
, TREE_OPERAND (e
, 0));
1747 pp_c_whitespace (pp
);
1748 pp_identifier (pp
, "||");
1749 pp_c_whitespace (pp
);
1750 pp_c_logical_and_expression (pp
, TREE_OPERAND (e
, 1));
1753 pp_c_logical_and_expression (pp
, e
);
1756 /* conditional-expression:
1757 logical-OR-expression
1758 logical-OR-expression ? expression : conditional-expression */
1761 pp_c_conditional_expression (c_pretty_printer
*pp
, tree e
)
1763 if (TREE_CODE (e
) == COND_EXPR
)
1765 pp_c_logical_or_expression (pp
, TREE_OPERAND (e
, 0));
1766 pp_c_whitespace (pp
);
1768 pp_c_whitespace (pp
);
1769 pp_expression (pp
, TREE_OPERAND (e
, 1));
1770 pp_c_whitespace (pp
);
1772 pp_c_whitespace (pp
);
1773 pp_c_conditional_expression (pp
, TREE_OPERAND (e
, 2));
1776 pp_c_logical_or_expression (pp
, e
);
1780 /* assignment-expression:
1781 conditional-expression
1782 unary-expression assignment-operator assignment-expression
1784 assignment-expression: one of
1785 = *= /= %= += -= >>= <<= &= ^= |= */
1788 pp_c_assignment_expression (c_pretty_printer
*pp
, tree e
)
1790 if (TREE_CODE (e
) == MODIFY_EXPR
|| TREE_CODE (e
) == INIT_EXPR
)
1792 pp_c_unary_expression (pp
, TREE_OPERAND (e
, 0));
1793 pp_c_whitespace (pp
);
1796 pp_c_expression (pp
, TREE_OPERAND (e
, 1));
1799 pp_c_conditional_expression (pp
, e
);
1803 assignment-expression
1804 expression , assignment-expression
1806 Implementation note: instead of going through the usual recursion
1807 chain, I take the liberty of dispatching nodes to the appropriate
1808 functions. This makes some redundancy, but it worths it. That also
1809 prevents a possible infinite recursion between pp_c_primary_expression ()
1810 and pp_c_expression (). */
1813 pp_c_expression (c_pretty_printer
*pp
, tree e
)
1815 switch (TREE_CODE (e
))
1818 pp_c_integer_constant (pp
, e
);
1822 pp_c_floating_constant (pp
, e
);
1826 pp_c_string_literal (pp
, e
);
1829 case IDENTIFIER_NODE
:
1838 pp_primary_expression (pp
, e
);
1841 case POSTINCREMENT_EXPR
:
1842 case POSTDECREMENT_EXPR
:
1850 case UNORDERED_EXPR
:
1859 case COMPOUND_LITERAL_EXPR
:
1861 pp_postfix_expression (pp
, e
);
1869 case TRUTH_NOT_EXPR
:
1870 case PREINCREMENT_EXPR
:
1871 case PREDECREMENT_EXPR
:
1874 pp_c_unary_expression (pp
, e
);
1878 case FIX_TRUNC_EXPR
:
1881 pp_c_cast_expression (pp
, e
);
1885 case TRUNC_MOD_EXPR
:
1886 case TRUNC_DIV_EXPR
:
1887 pp_multiplicative_expression (pp
, e
);
1892 pp_c_shift_expression (pp
, e
);
1899 pp_c_relational_expression (pp
, e
);
1903 pp_c_and_expression (pp
, e
);
1907 pp_c_exclusive_or_expression (pp
, e
);
1911 pp_c_inclusive_or_expression (pp
, e
);
1914 case TRUTH_ANDIF_EXPR
:
1915 pp_c_logical_and_expression (pp
, e
);
1918 case TRUTH_ORIF_EXPR
:
1919 pp_c_logical_or_expression (pp
, e
);
1924 pp_c_equality_expression (pp
, e
);
1928 pp_conditional_expression (pp
, e
);
1933 pp_c_additive_expression (pp
, e
);
1938 pp_assignment_expression (pp
, e
);
1942 pp_c_left_paren (pp
);
1943 pp_expression (pp
, TREE_OPERAND (e
, 0));
1944 pp_separate_with (pp
, ',');
1945 pp_assignment_expression (pp
, TREE_OPERAND (e
, 1));
1946 pp_c_right_paren (pp
);
1949 case NON_LVALUE_EXPR
:
1951 pp_expression (pp
, TREE_OPERAND (e
, 0));
1955 pp_postfix_expression (pp
, TREE_OPERAND (e
, 1));
1959 pp_unsupported_tree (pp
, e
);
1969 pp_c_statement (c_pretty_printer
*pp
, tree stmt
)
1974 if (pp_needs_newline (pp
))
1975 pp_newline_and_indent (pp
, 0);
1977 dump_generic_node (pp_base (pp
), stmt
, pp_indentation (pp
), 0, true);
1981 /* Initialize the PRETTY-PRINTER for handling C codes. */
1984 pp_c_pretty_printer_init (c_pretty_printer
*pp
)
1986 pp
->offset_list
= 0;
1988 pp
->declaration
= pp_c_declaration
;
1989 pp
->declaration_specifiers
= pp_c_declaration_specifiers
;
1990 pp
->declarator
= pp_c_declarator
;
1991 pp
->direct_declarator
= pp_c_direct_declarator
;
1992 pp
->type_specifier_seq
= pp_c_specifier_qualifier_list
;
1993 pp
->abstract_declarator
= pp_c_abstract_declarator
;
1994 pp
->direct_abstract_declarator
= pp_c_direct_abstract_declarator
;
1995 pp
->ptr_operator
= pp_c_pointer
;
1996 pp
->parameter_list
= pp_c_parameter_type_list
;
1997 pp
->type_id
= pp_c_type_id
;
1998 pp
->simple_type_specifier
= pp_c_type_specifier
;
1999 pp
->function_specifier
= pp_c_function_specifier
;
2000 pp
->storage_class_specifier
= pp_c_storage_class_specifier
;
2002 pp
->statement
= pp_c_statement
;
2004 pp
->constant
= pp_c_constant
;
2005 pp
->id_expression
= pp_c_id_expression
;
2006 pp
->primary_expression
= pp_c_primary_expression
;
2007 pp
->postfix_expression
= pp_c_postfix_expression
;
2008 pp
->unary_expression
= pp_c_unary_expression
;
2009 pp
->initializer
= pp_c_initializer
;
2010 pp
->multiplicative_expression
= pp_c_multiplicative_expression
;
2011 pp
->conditional_expression
= pp_c_conditional_expression
;
2012 pp
->assignment_expression
= pp_c_assignment_expression
;
2013 pp
->expression
= pp_c_expression
;
2017 /* Print the tree T in full, on file FILE. */
2020 print_c_tree (FILE *file
, tree t
)
2022 static c_pretty_printer pp_rec
;
2023 static bool initialized
= 0;
2024 c_pretty_printer
*pp
= &pp_rec
;
2029 pp_construct (pp_base (pp
), NULL
, 0);
2030 pp_c_pretty_printer_init (pp
);
2031 pp_needs_newline (pp
) = true;
2033 pp_base (pp
)->buffer
->stream
= file
;
2035 pp_statement (pp
, t
);
2041 /* Print the tree T in full, on stderr. */
2044 debug_c_tree (tree t
)
2046 print_c_tree (stderr
, t
);
2047 fputc ('\n', stderr
);
2050 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
2051 up of T's memory address. */
2054 pp_c_tree_decl_identifier (c_pretty_printer
*pp
, tree t
)
2058 gcc_assert (DECL_P (t
));
2061 name
= IDENTIFIER_POINTER (DECL_NAME (t
));
2064 static char xname
[8];
2065 sprintf (xname
, "<U%4x>", ((unsigned)((unsigned long)(t
) & 0xffff)));
2069 pp_c_identifier (pp
, name
);