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
)))
526 tree maxval
= TYPE_MAX_VALUE (TYPE_DOMAIN (t
));
527 tree type
= TREE_TYPE (maxval
);
529 if (host_integerp (maxval
, 0))
530 pp_wide_integer (pp
, tree_low_cst (maxval
, 0) + 1);
532 pp_expression (pp
, fold_build2 (PLUS_EXPR
, type
, maxval
,
533 build_int_cst (type
, 1)));
535 pp_c_right_bracket (pp
);
536 pp_direct_abstract_declarator (pp
, TREE_TYPE (t
));
539 case IDENTIFIER_NODE
:
553 pp_unsupported_tree (pp
, t
);
559 specifier-qualifier-list abstract-declarator(opt) */
562 pp_c_type_id (c_pretty_printer
*pp
, tree t
)
564 pp_c_specifier_qualifier_list (pp
, t
);
565 pp_abstract_declarator (pp
, t
);
568 /* storage-class-specifier:
576 pp_c_storage_class_specifier (c_pretty_printer
*pp
, tree t
)
578 if (TREE_CODE (t
) == TYPE_DECL
)
579 pp_c_identifier (pp
, "typedef");
582 if (DECL_REGISTER (t
))
583 pp_c_identifier (pp
, "register");
584 else if (TREE_STATIC (t
) && TREE_CODE (t
) == VAR_DECL
)
585 pp_c_identifier (pp
, "static");
589 /* function-specifier:
593 pp_c_function_specifier (c_pretty_printer
*pp
, tree t
)
595 if (TREE_CODE (t
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (t
))
596 pp_c_identifier (pp
, "inline");
599 /* declaration-specifiers:
600 storage-class-specifier declaration-specifiers(opt)
601 type-specifier declaration-specifiers(opt)
602 type-qualifier declaration-specifiers(opt)
603 function-specifier declaration-specifiers(opt) */
606 pp_c_declaration_specifiers (c_pretty_printer
*pp
, tree t
)
608 pp_storage_class_specifier (pp
, t
);
609 pp_function_specifier (pp
, t
);
610 pp_c_specifier_qualifier_list (pp
, DECL_P (t
) ? TREE_TYPE (t
) : t
);
616 direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
617 direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
618 direct-declarator [ type-qualifier-list static assignment-expression ]
619 direct-declarator [ type-qualifier-list * ]
620 direct-declarator ( parameter-type-list )
621 direct-declarator ( identifier-list(opt) ) */
624 pp_c_direct_declarator (c_pretty_printer
*pp
, tree t
)
626 switch (TREE_CODE (t
))
633 pp_c_space_for_pointer_operator (pp
, TREE_TYPE (t
));
634 pp_c_tree_decl_identifier (pp
, t
);
639 pp_abstract_declarator (pp
, TREE_TYPE (t
));
643 pp_parameter_list (pp
, t
);
644 pp_abstract_declarator (pp
, TREE_TYPE (t
));
648 pp_c_space_for_pointer_operator (pp
, TREE_TYPE (TREE_TYPE (t
)));
649 pp_c_tree_decl_identifier (pp
, t
);
650 if (pp_c_base (pp
)->flags
& pp_c_flag_abstract
)
651 pp_abstract_declarator (pp
, TREE_TYPE (t
));
654 pp_parameter_list (pp
, t
);
655 pp_abstract_declarator (pp
, TREE_TYPE (TREE_TYPE (t
)));
667 pp_unsupported_tree (pp
, t
);
674 pointer(opt) direct-declarator */
677 pp_c_declarator (c_pretty_printer
*pp
, tree t
)
679 switch (TREE_CODE (t
))
695 pp_direct_declarator (pp
, t
);
700 pp_unsupported_tree (pp
, t
);
706 declaration-specifiers init-declarator-list(opt) ; */
709 pp_c_declaration (c_pretty_printer
*pp
, tree t
)
711 pp_declaration_specifiers (pp
, t
);
712 pp_c_init_declarator (pp
, t
);
715 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
718 pp_c_attributes (c_pretty_printer
*pp
, tree attributes
)
720 if (attributes
== NULL_TREE
)
723 pp_c_identifier (pp
, "__attribute__");
724 pp_c_left_paren (pp
);
725 pp_c_left_paren (pp
);
726 for (; attributes
!= NULL_TREE
; attributes
= TREE_CHAIN (attributes
))
728 pp_tree_identifier (pp
, TREE_PURPOSE (attributes
));
729 if (TREE_VALUE (attributes
))
730 pp_c_call_argument_list (pp
, TREE_VALUE (attributes
));
732 if (TREE_CHAIN (attributes
))
733 pp_separate_with (pp
, ',');
735 pp_c_right_paren (pp
);
736 pp_c_right_paren (pp
);
739 /* function-definition:
740 declaration-specifiers declarator compound-statement */
743 pp_c_function_definition (c_pretty_printer
*pp
, tree t
)
745 pp_declaration_specifiers (pp
, t
);
746 pp_declarator (pp
, t
);
747 pp_needs_newline (pp
) = true;
748 pp_statement (pp
, DECL_SAVED_TREE (t
));
756 /* Print out a c-char. This is called solely for characters which are
757 in the *target* execution character set. We ought to convert them
758 back to the *host* execution character set before printing, but we
759 have no way to do this at present. A decent compromise is to print
760 all characters as if they were in the host execution character set,
761 and not attempt to recover any named escape characters, but render
762 all unprintables as octal escapes. If the host and target character
763 sets are the same, this produces relatively readable output. If they
764 are not the same, strings may appear as gibberish, but that's okay
765 (in fact, it may well be what the reader wants, e.g. if they are looking
766 to see if conversion to the target character set happened correctly).
768 A special case: we need to prefix \, ", and ' with backslashes. It is
769 correct to do so for the *host*'s \, ", and ', because the rest of the
770 file appears in the host character set. */
773 pp_c_char (c_pretty_printer
*pp
, int c
)
779 case '\\': pp_string (pp
, "\\\\"); break;
780 case '\'': pp_string (pp
, "\\\'"); break;
781 case '\"': pp_string (pp
, "\\\""); break;
782 default: pp_character (pp
, c
);
786 pp_scalar (pp
, "\\%03o", (unsigned) c
);
789 /* Print out a STRING literal. */
792 pp_c_string_literal (c_pretty_printer
*pp
, tree s
)
794 const char *p
= TREE_STRING_POINTER (s
);
795 int n
= TREE_STRING_LENGTH (s
) - 1;
798 for (i
= 0; i
< n
; ++i
)
799 pp_c_char (pp
, p
[i
]);
803 /* Pretty-print an INTEGER literal. */
806 pp_c_integer_constant (c_pretty_printer
*pp
, tree i
)
808 tree type
= TREE_TYPE (i
);
810 if (TREE_INT_CST_HIGH (i
) == 0)
811 pp_wide_integer (pp
, TREE_INT_CST_LOW (i
));
814 if (tree_int_cst_sgn (i
) < 0)
816 pp_character (pp
, '-');
817 i
= build_int_cst_wide (NULL_TREE
,
818 -TREE_INT_CST_LOW (i
),
819 ~TREE_INT_CST_HIGH (i
)
820 + !TREE_INT_CST_LOW (i
));
822 sprintf (pp_buffer (pp
)->digit_buffer
,
823 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
824 TREE_INT_CST_HIGH (i
), TREE_INT_CST_LOW (i
));
825 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);
827 if (TYPE_UNSIGNED (type
))
828 pp_character (pp
, 'u');
829 if (type
== long_integer_type_node
|| type
== long_unsigned_type_node
)
830 pp_character (pp
, 'l');
831 else if (type
== long_long_integer_type_node
832 || type
== long_long_unsigned_type_node
)
833 pp_string (pp
, "ll");
836 /* Print out a CHARACTER literal. */
839 pp_c_character_constant (c_pretty_printer
*pp
, tree c
)
841 tree type
= TREE_TYPE (c
);
842 if (type
== wchar_type_node
)
843 pp_character (pp
, 'L');
845 if (host_integerp (c
, TYPE_UNSIGNED (type
)))
846 pp_c_char (pp
, tree_low_cst (c
, TYPE_UNSIGNED (type
)));
848 pp_scalar (pp
, "\\x%x", (unsigned) TREE_INT_CST_LOW (c
));
852 /* Print out a BOOLEAN literal. */
855 pp_c_bool_constant (c_pretty_printer
*pp
, tree b
)
857 if (b
== boolean_false_node
)
859 if (c_dialect_cxx ())
860 pp_c_identifier (pp
, "false");
861 else if (flag_isoc99
)
862 pp_c_identifier (pp
, "_False");
864 pp_unsupported_tree (pp
, b
);
866 else if (b
== boolean_true_node
)
868 if (c_dialect_cxx ())
869 pp_c_identifier (pp
, "true");
870 else if (flag_isoc99
)
871 pp_c_identifier (pp
, "_True");
873 pp_unsupported_tree (pp
, b
);
875 else if (TREE_CODE (b
) == INTEGER_CST
)
876 pp_c_integer_constant (pp
, b
);
878 pp_unsupported_tree (pp
, b
);
881 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
882 false; that means the value was obtained by a cast, in which case
883 print out the type-id part of the cast-expression -- the casted value
884 is then printed by pp_c_integer_literal. */
887 pp_c_enumeration_constant (c_pretty_printer
*pp
, tree e
)
889 bool value_is_named
= true;
890 tree type
= TREE_TYPE (e
);
893 /* Find the name of this constant. */
894 for (value
= TYPE_VALUES (type
);
895 value
!= NULL_TREE
&& !tree_int_cst_equal (TREE_VALUE (value
), e
);
896 value
= TREE_CHAIN (value
))
899 if (value
!= NULL_TREE
)
900 pp_id_expression (pp
, TREE_PURPOSE (value
));
903 /* Value must have been cast. */
904 pp_c_type_cast (pp
, type
);
905 value_is_named
= false;
908 return value_is_named
;
911 /* Print out a REAL value as a decimal-floating-constant. */
914 pp_c_floating_constant (c_pretty_printer
*pp
, tree r
)
916 real_to_decimal (pp_buffer (pp
)->digit_buffer
, &TREE_REAL_CST (r
),
917 sizeof (pp_buffer (pp
)->digit_buffer
), 0, 1);
918 pp_string (pp
, pp_buffer(pp
)->digit_buffer
);
919 if (TREE_TYPE (r
) == float_type_node
)
920 pp_character (pp
, 'f');
921 else if (TREE_TYPE (r
) == long_double_type_node
)
922 pp_character (pp
, 'l');
925 /* Pretty-print a compound literal expression. GNU extensions include
929 pp_c_compound_literal (c_pretty_printer
*pp
, tree e
)
931 tree type
= TREE_TYPE (e
);
932 pp_c_type_cast (pp
, type
);
934 switch (TREE_CODE (type
))
941 pp_c_brace_enclosed_initializer_list (pp
, e
);
945 pp_unsupported_tree (pp
, e
);
954 character-constant */
957 pp_c_constant (c_pretty_printer
*pp
, tree e
)
959 const enum tree_code code
= TREE_CODE (e
);
965 tree type
= TREE_TYPE (e
);
966 if (type
== boolean_type_node
)
967 pp_c_bool_constant (pp
, e
);
968 else if (type
== char_type_node
)
969 pp_c_character_constant (pp
, e
);
970 else if (TREE_CODE (type
) == ENUMERAL_TYPE
971 && pp_c_enumeration_constant (pp
, e
))
974 pp_c_integer_constant (pp
, e
);
979 pp_c_floating_constant (pp
, e
);
983 pp_c_string_literal (pp
, e
);
987 pp_unsupported_tree (pp
, e
);
992 /* Pretty-print an IDENTIFIER_NODE, preceded by whitespace is necessary. */
995 pp_c_identifier (c_pretty_printer
*pp
, const char *id
)
997 pp_c_maybe_whitespace (pp
);
998 pp_identifier (pp
, id
);
999 pp_base (pp
)->padding
= pp_before
;
1002 /* Pretty-print a C primary-expression.
1010 pp_c_primary_expression (c_pretty_printer
*pp
, tree e
)
1012 switch (TREE_CODE (e
))
1020 pp_c_tree_decl_identifier (pp
, e
);
1023 case IDENTIFIER_NODE
:
1024 pp_c_tree_identifier (pp
, e
);
1028 pp_c_identifier (pp
, "<erroneous-expression>");
1032 pp_c_identifier (pp
, "<return-value>");
1038 pp_c_constant (pp
, e
);
1042 pp_c_identifier (pp
, "__builtin_memcpy");
1043 pp_c_left_paren (pp
);
1045 pp_primary_expression (pp
, TREE_OPERAND (e
, 0));
1046 pp_separate_with (pp
, ',');
1048 pp_initializer (pp
, TREE_OPERAND (e
, 1));
1049 if (TREE_OPERAND (e
, 2))
1051 pp_separate_with (pp
, ',');
1052 pp_c_expression (pp
, TREE_OPERAND (e
, 2));
1054 pp_c_right_paren (pp
);
1058 /* FIXME: Make sure we won't get into an infinie loop. */
1059 pp_c_left_paren (pp
);
1060 pp_expression (pp
, e
);
1061 pp_c_right_paren (pp
);
1066 /* Print out a C initializer -- also support C compound-literals.
1068 assignment-expression:
1069 { initializer-list }
1070 { initializer-list , } */
1073 pp_c_initializer (c_pretty_printer
*pp
, tree e
)
1075 if (TREE_CODE (e
) == CONSTRUCTOR
)
1076 pp_c_brace_enclosed_initializer_list (pp
, e
);
1078 pp_expression (pp
, e
);
1083 declarator = initializer */
1086 pp_c_init_declarator (c_pretty_printer
*pp
, tree t
)
1088 pp_declarator (pp
, t
);
1089 /* We don't want to output function definitions here. There are handled
1090 elsewhere (and the syntactic form is bogus anyway). */
1091 if (TREE_CODE (t
) != FUNCTION_DECL
&& DECL_INITIAL (t
))
1093 tree init
= DECL_INITIAL (t
);
1094 /* This C++ bit is handled here because it is easier to do so.
1095 In templates, the C++ parser builds a TREE_LIST for a
1096 direct-initialization; the TREE_PURPOSE is the variable to
1097 initialize and the TREE_VALUE is the initializer. */
1098 if (TREE_CODE (init
) == TREE_LIST
)
1100 pp_c_left_paren (pp
);
1101 pp_expression (pp
, TREE_VALUE (init
));
1102 pp_right_paren (pp
);
1109 pp_c_initializer (pp
, init
);
1114 /* initializer-list:
1115 designation(opt) initializer
1116 initializer-list , designation(opt) initializer
1123 designator-list designator
1126 [ constant-expression ]
1130 pp_c_initializer_list (c_pretty_printer
*pp
, tree e
)
1132 tree type
= TREE_TYPE (e
);
1133 const enum tree_code code
= TREE_CODE (type
);
1141 tree init
= TREE_OPERAND (e
, 0);
1142 for (; init
!= NULL_TREE
; init
= TREE_CHAIN (init
))
1144 if (code
== RECORD_TYPE
|| code
== UNION_TYPE
)
1147 pp_c_primary_expression (pp
, TREE_PURPOSE (init
));
1151 pp_c_left_bracket (pp
);
1152 if (TREE_PURPOSE (init
))
1153 pp_c_constant (pp
, TREE_PURPOSE (init
));
1154 pp_c_right_bracket (pp
);
1156 pp_c_whitespace (pp
);
1158 pp_c_whitespace (pp
);
1159 pp_initializer (pp
, TREE_VALUE (init
));
1160 if (TREE_CHAIN (init
))
1161 pp_separate_with (pp
, ',');
1167 if (TREE_CODE (e
) == VECTOR_CST
)
1168 pp_c_expression_list (pp
, TREE_VECTOR_CST_ELTS (e
));
1169 else if (TREE_CODE (e
) == CONSTRUCTOR
)
1170 pp_c_constructor_elts (pp
, CONSTRUCTOR_ELTS (e
));
1176 if (TREE_CODE (e
) == CONSTRUCTOR
)
1177 pp_c_constructor_elts (pp
, CONSTRUCTOR_ELTS (e
));
1178 else if (TREE_CODE (e
) == COMPLEX_CST
|| TREE_CODE (e
) == COMPLEX_EXPR
)
1180 const bool cst
= TREE_CODE (e
) == COMPLEX_CST
;
1181 pp_expression (pp
, cst
? TREE_REALPART (e
) : TREE_OPERAND (e
, 0));
1182 pp_separate_with (pp
, ',');
1183 pp_expression (pp
, cst
? TREE_IMAGPART (e
) : TREE_OPERAND (e
, 1));
1193 pp_unsupported_tree (pp
, type
);
1196 /* Pretty-print a brace-enclosed initializer-list. */
1199 pp_c_brace_enclosed_initializer_list (c_pretty_printer
*pp
, tree l
)
1201 pp_c_left_brace (pp
);
1202 pp_c_initializer_list (pp
, l
);
1203 pp_c_right_brace (pp
);
1207 /* This is a convenient function, used to bridge gap between C and C++
1214 pp_c_id_expression (c_pretty_printer
*pp
, tree t
)
1216 switch (TREE_CODE (t
))
1225 pp_c_tree_decl_identifier (pp
, t
);
1228 case IDENTIFIER_NODE
:
1229 pp_c_tree_identifier (pp
, t
);
1233 pp_unsupported_tree (pp
, t
);
1238 /* postfix-expression:
1240 postfix-expression [ expression ]
1241 postfix-expression ( argument-expression-list(opt) )
1242 postfix-expression . identifier
1243 postfix-expression -> identifier
1244 postfix-expression ++
1245 postfix-expression --
1246 ( type-name ) { initializer-list }
1247 ( type-name ) { initializer-list , } */
1250 pp_c_postfix_expression (c_pretty_printer
*pp
, tree e
)
1252 enum tree_code code
= TREE_CODE (e
);
1255 case POSTINCREMENT_EXPR
:
1256 case POSTDECREMENT_EXPR
:
1257 pp_postfix_expression (pp
, TREE_OPERAND (e
, 0));
1258 pp_identifier (pp
, code
== POSTINCREMENT_EXPR
? "++" : "--");
1262 pp_postfix_expression (pp
, TREE_OPERAND (e
, 0));
1263 pp_c_left_bracket (pp
);
1264 pp_expression (pp
, TREE_OPERAND (e
, 1));
1265 pp_c_right_bracket (pp
);
1269 pp_postfix_expression (pp
, TREE_OPERAND (e
, 0));
1270 pp_c_call_argument_list (pp
, TREE_OPERAND (e
, 1));
1273 case UNORDERED_EXPR
:
1274 pp_c_identifier (pp
, flag_isoc99
1276 : "__builtin_isunordered");
1280 pp_c_identifier (pp
, flag_isoc99
1282 : "!__builtin_isunordered");
1286 pp_c_identifier (pp
, flag_isoc99
1288 : "!__builtin_isgreaterequal");
1292 pp_c_identifier (pp
, flag_isoc99
1294 : "!__builtin_isgreater");
1298 pp_c_identifier (pp
, flag_isoc99
1300 : "!__builtin_islessequal");
1304 pp_c_identifier (pp
, flag_isoc99
1306 : "!__builtin_isless");
1310 pp_c_identifier (pp
, flag_isoc99
1312 : "!__builtin_islessgreater");
1316 pp_c_identifier (pp
, flag_isoc99
1318 : "__builtin_islessgreater");
1322 pp_c_left_paren (pp
);
1323 pp_expression (pp
, TREE_OPERAND (e
, 0));
1324 pp_separate_with (pp
, ',');
1325 pp_expression (pp
, TREE_OPERAND (e
, 1));
1326 pp_c_right_paren (pp
);
1330 pp_c_identifier (pp
, "__builtin_abs");
1331 pp_c_left_paren (pp
);
1332 pp_expression (pp
, TREE_OPERAND (e
, 0));
1333 pp_c_right_paren (pp
);
1338 tree object
= TREE_OPERAND (e
, 0);
1339 if (TREE_CODE (object
) == INDIRECT_REF
)
1341 pp_postfix_expression (pp
, TREE_OPERAND (object
, 0));
1346 pp_postfix_expression (pp
, object
);
1349 pp_expression (pp
, TREE_OPERAND (e
, 1));
1356 pp_c_compound_literal (pp
, e
);
1359 case COMPOUND_LITERAL_EXPR
:
1360 e
= DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e
));
1363 pp_initializer (pp
, e
);
1367 pp_c_identifier (pp
, "__builtin_va_arg");
1368 pp_c_left_paren (pp
);
1369 pp_assignment_expression (pp
, TREE_OPERAND (e
, 0));
1370 pp_separate_with (pp
, ',');
1371 pp_type_id (pp
, TREE_TYPE (e
));
1372 pp_c_right_paren (pp
);
1376 if (TREE_CODE (TREE_OPERAND (e
, 0)) == FUNCTION_DECL
)
1378 pp_c_id_expression (pp
, TREE_OPERAND (e
, 0));
1381 /* else fall through. */
1384 pp_primary_expression (pp
, e
);
1389 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1392 pp_c_expression_list (c_pretty_printer
*pp
, tree e
)
1394 for (; e
!= NULL_TREE
; e
= TREE_CHAIN (e
))
1396 pp_expression (pp
, TREE_VALUE (e
));
1398 pp_separate_with (pp
, ',');
1402 /* Print out V, which contains the elements of a constructor. */
1405 pp_c_constructor_elts (c_pretty_printer
*pp
, VEC(constructor_elt
,gc
) *v
)
1407 unsigned HOST_WIDE_INT ix
;
1410 FOR_EACH_CONSTRUCTOR_VALUE (v
, ix
, value
)
1412 pp_expression (pp
, value
);
1413 if (ix
!= VEC_length (constructor_elt
, v
) - 1)
1414 pp_separate_with (pp
, ',');
1418 /* Print out an expression-list in parens, as in a function call. */
1421 pp_c_call_argument_list (c_pretty_printer
*pp
, tree t
)
1423 pp_c_left_paren (pp
);
1424 if (t
&& TREE_CODE (t
) == TREE_LIST
)
1425 pp_c_expression_list (pp
, t
);
1426 pp_c_right_paren (pp
);
1429 /* unary-expression:
1433 unary-operator cast-expression
1434 sizeof unary-expression
1437 unary-operator: one of
1442 __alignof__ unary-expression
1443 __alignof__ ( type-id )
1444 __real__ unary-expression
1445 __imag__ unary-expression */
1448 pp_c_unary_expression (c_pretty_printer
*pp
, tree e
)
1450 enum tree_code code
= TREE_CODE (e
);
1453 case PREINCREMENT_EXPR
:
1454 case PREDECREMENT_EXPR
:
1455 pp_identifier (pp
, code
== PREINCREMENT_EXPR
? "++" : "--");
1456 pp_c_unary_expression (pp
, TREE_OPERAND (e
, 0));
1463 case TRUTH_NOT_EXPR
:
1465 /* String literal are used by address. */
1466 if (code
== ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (e
, 0)) != STRING_CST
)
1468 else if (code
== INDIRECT_REF
)
1470 else if (code
== NEGATE_EXPR
)
1472 else if (code
== BIT_NOT_EXPR
|| code
== CONJ_EXPR
)
1474 else if (code
== TRUTH_NOT_EXPR
)
1475 pp_exclamation (pp
);
1476 pp_c_cast_expression (pp
, TREE_OPERAND (e
, 0));
1481 pp_c_identifier (pp
, code
== REALPART_EXPR
? "__real__" : "__imag__");
1482 pp_c_whitespace (pp
);
1483 pp_unary_expression (pp
, TREE_OPERAND (e
, 0));
1487 pp_postfix_expression (pp
, e
);
1494 ( type-name ) cast-expression */
1497 pp_c_cast_expression (c_pretty_printer
*pp
, tree e
)
1499 switch (TREE_CODE (e
))
1502 case FIX_TRUNC_EXPR
:
1504 pp_c_type_cast (pp
, TREE_TYPE (e
));
1505 pp_c_cast_expression (pp
, TREE_OPERAND (e
, 0));
1509 pp_unary_expression (pp
, e
);
1513 /* multiplicative-expression:
1515 multiplicative-expression * cast-expression
1516 multiplicative-expression / cast-expression
1517 multiplicative-expression % cast-expression */
1520 pp_c_multiplicative_expression (c_pretty_printer
*pp
, tree e
)
1522 enum tree_code code
= TREE_CODE (e
);
1526 case TRUNC_DIV_EXPR
:
1527 case TRUNC_MOD_EXPR
:
1528 pp_multiplicative_expression (pp
, TREE_OPERAND (e
, 0));
1529 pp_c_whitespace (pp
);
1530 if (code
== MULT_EXPR
)
1532 else if (code
== TRUNC_DIV_EXPR
)
1536 pp_c_whitespace (pp
);
1537 pp_c_cast_expression (pp
, TREE_OPERAND (e
, 1));
1541 pp_c_cast_expression (pp
, e
);
1546 /* additive-expression:
1547 multiplicative-expression
1548 additive-expression + multiplicative-expression
1549 additive-expression - multiplicative-expression */
1552 pp_c_additive_expression (c_pretty_printer
*pp
, tree e
)
1554 enum tree_code code
= TREE_CODE (e
);
1559 pp_c_additive_expression (pp
, TREE_OPERAND (e
, 0));
1560 pp_c_whitespace (pp
);
1561 if (code
== PLUS_EXPR
)
1565 pp_c_whitespace (pp
);
1566 pp_multiplicative_expression (pp
, TREE_OPERAND (e
, 1));
1570 pp_multiplicative_expression (pp
, e
);
1575 /* additive-expression:
1577 shift-expression << additive-expression
1578 shift-expression >> additive-expression */
1581 pp_c_shift_expression (c_pretty_printer
*pp
, tree e
)
1583 enum tree_code code
= TREE_CODE (e
);
1588 pp_c_shift_expression (pp
, TREE_OPERAND (e
, 0));
1589 pp_c_whitespace (pp
);
1590 pp_identifier (pp
, code
== LSHIFT_EXPR
? "<<" : ">>");
1591 pp_c_whitespace (pp
);
1592 pp_c_additive_expression (pp
, TREE_OPERAND (e
, 1));
1596 pp_c_additive_expression (pp
, e
);
1600 /* relational-expression:
1602 relational-expression < shift-expression
1603 relational-expression > shift-expression
1604 relational-expression <= shift-expression
1605 relational-expression >= shift-expression */
1608 pp_c_relational_expression (c_pretty_printer
*pp
, tree e
)
1610 enum tree_code code
= TREE_CODE (e
);
1617 pp_c_relational_expression (pp
, TREE_OPERAND (e
, 0));
1618 pp_c_whitespace (pp
);
1619 if (code
== LT_EXPR
)
1621 else if (code
== GT_EXPR
)
1623 else if (code
== LE_EXPR
)
1624 pp_identifier (pp
, "<=");
1625 else if (code
== GE_EXPR
)
1626 pp_identifier (pp
, ">=");
1627 pp_c_whitespace (pp
);
1628 pp_c_shift_expression (pp
, TREE_OPERAND (e
, 1));
1632 pp_c_shift_expression (pp
, e
);
1637 /* equality-expression:
1638 relational-expression
1639 equality-expression == relational-expression
1640 equality-equality != relational-expression */
1643 pp_c_equality_expression (c_pretty_printer
*pp
, tree e
)
1645 enum tree_code code
= TREE_CODE (e
);
1650 pp_c_equality_expression (pp
, TREE_OPERAND (e
, 0));
1651 pp_c_whitespace (pp
);
1652 pp_identifier (pp
, code
== EQ_EXPR
? "==" : "!=");
1653 pp_c_whitespace (pp
);
1654 pp_c_relational_expression (pp
, TREE_OPERAND (e
, 1));
1658 pp_c_relational_expression (pp
, e
);
1665 AND-expression & equality-equality */
1668 pp_c_and_expression (c_pretty_printer
*pp
, tree e
)
1670 if (TREE_CODE (e
) == BIT_AND_EXPR
)
1672 pp_c_and_expression (pp
, TREE_OPERAND (e
, 0));
1673 pp_c_whitespace (pp
);
1675 pp_c_whitespace (pp
);
1676 pp_c_equality_expression (pp
, TREE_OPERAND (e
, 1));
1679 pp_c_equality_expression (pp
, e
);
1682 /* exclusive-OR-expression:
1684 exclusive-OR-expression ^ AND-expression */
1687 pp_c_exclusive_or_expression (c_pretty_printer
*pp
, tree e
)
1689 if (TREE_CODE (e
) == BIT_XOR_EXPR
)
1691 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 0));
1692 pp_c_maybe_whitespace (pp
);
1694 pp_c_whitespace (pp
);
1695 pp_c_and_expression (pp
, TREE_OPERAND (e
, 1));
1698 pp_c_and_expression (pp
, e
);
1701 /* inclusive-OR-expression:
1702 exclusive-OR-expression
1703 inclusive-OR-expression | exclusive-OR-expression */
1706 pp_c_inclusive_or_expression (c_pretty_printer
*pp
, tree e
)
1708 if (TREE_CODE (e
) == BIT_IOR_EXPR
)
1710 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 0));
1711 pp_c_whitespace (pp
);
1713 pp_c_whitespace (pp
);
1714 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 1));
1717 pp_c_exclusive_or_expression (pp
, e
);
1720 /* logical-AND-expression:
1721 inclusive-OR-expression
1722 logical-AND-expression && inclusive-OR-expression */
1725 pp_c_logical_and_expression (c_pretty_printer
*pp
, tree e
)
1727 if (TREE_CODE (e
) == TRUTH_ANDIF_EXPR
)
1729 pp_c_logical_and_expression (pp
, TREE_OPERAND (e
, 0));
1730 pp_c_whitespace (pp
);
1731 pp_identifier (pp
, "&&");
1732 pp_c_whitespace (pp
);
1733 pp_c_inclusive_or_expression (pp
, TREE_OPERAND (e
, 1));
1736 pp_c_inclusive_or_expression (pp
, e
);
1739 /* logical-OR-expression:
1740 logical-AND-expression
1741 logical-OR-expression || logical-AND-expression */
1744 pp_c_logical_or_expression (c_pretty_printer
*pp
, tree e
)
1746 if (TREE_CODE (e
) == TRUTH_ORIF_EXPR
)
1748 pp_c_logical_or_expression (pp
, TREE_OPERAND (e
, 0));
1749 pp_c_whitespace (pp
);
1750 pp_identifier (pp
, "||");
1751 pp_c_whitespace (pp
);
1752 pp_c_logical_and_expression (pp
, TREE_OPERAND (e
, 1));
1755 pp_c_logical_and_expression (pp
, e
);
1758 /* conditional-expression:
1759 logical-OR-expression
1760 logical-OR-expression ? expression : conditional-expression */
1763 pp_c_conditional_expression (c_pretty_printer
*pp
, tree e
)
1765 if (TREE_CODE (e
) == COND_EXPR
)
1767 pp_c_logical_or_expression (pp
, TREE_OPERAND (e
, 0));
1768 pp_c_whitespace (pp
);
1770 pp_c_whitespace (pp
);
1771 pp_expression (pp
, TREE_OPERAND (e
, 1));
1772 pp_c_whitespace (pp
);
1774 pp_c_whitespace (pp
);
1775 pp_c_conditional_expression (pp
, TREE_OPERAND (e
, 2));
1778 pp_c_logical_or_expression (pp
, e
);
1782 /* assignment-expression:
1783 conditional-expression
1784 unary-expression assignment-operator assignment-expression
1786 assignment-expression: one of
1787 = *= /= %= += -= >>= <<= &= ^= |= */
1790 pp_c_assignment_expression (c_pretty_printer
*pp
, tree e
)
1792 if (TREE_CODE (e
) == MODIFY_EXPR
|| TREE_CODE (e
) == INIT_EXPR
)
1794 pp_c_unary_expression (pp
, TREE_OPERAND (e
, 0));
1795 pp_c_whitespace (pp
);
1798 pp_c_expression (pp
, TREE_OPERAND (e
, 1));
1801 pp_c_conditional_expression (pp
, e
);
1805 assignment-expression
1806 expression , assignment-expression
1808 Implementation note: instead of going through the usual recursion
1809 chain, I take the liberty of dispatching nodes to the appropriate
1810 functions. This makes some redundancy, but it worths it. That also
1811 prevents a possible infinite recursion between pp_c_primary_expression ()
1812 and pp_c_expression (). */
1815 pp_c_expression (c_pretty_printer
*pp
, tree e
)
1817 switch (TREE_CODE (e
))
1820 pp_c_integer_constant (pp
, e
);
1824 pp_c_floating_constant (pp
, e
);
1828 pp_c_string_literal (pp
, e
);
1831 case IDENTIFIER_NODE
:
1840 pp_primary_expression (pp
, e
);
1843 case POSTINCREMENT_EXPR
:
1844 case POSTDECREMENT_EXPR
:
1852 case UNORDERED_EXPR
:
1861 case COMPOUND_LITERAL_EXPR
:
1863 pp_postfix_expression (pp
, e
);
1871 case TRUTH_NOT_EXPR
:
1872 case PREINCREMENT_EXPR
:
1873 case PREDECREMENT_EXPR
:
1876 pp_c_unary_expression (pp
, e
);
1880 case FIX_TRUNC_EXPR
:
1882 pp_c_cast_expression (pp
, e
);
1886 case TRUNC_MOD_EXPR
:
1887 case TRUNC_DIV_EXPR
:
1888 pp_multiplicative_expression (pp
, e
);
1893 pp_c_shift_expression (pp
, e
);
1900 pp_c_relational_expression (pp
, e
);
1904 pp_c_and_expression (pp
, e
);
1908 pp_c_exclusive_or_expression (pp
, e
);
1912 pp_c_inclusive_or_expression (pp
, e
);
1915 case TRUTH_ANDIF_EXPR
:
1916 pp_c_logical_and_expression (pp
, e
);
1919 case TRUTH_ORIF_EXPR
:
1920 pp_c_logical_or_expression (pp
, e
);
1925 pp_c_equality_expression (pp
, e
);
1929 pp_conditional_expression (pp
, e
);
1934 pp_c_additive_expression (pp
, e
);
1939 pp_assignment_expression (pp
, e
);
1943 pp_c_left_paren (pp
);
1944 pp_expression (pp
, TREE_OPERAND (e
, 0));
1945 pp_separate_with (pp
, ',');
1946 pp_assignment_expression (pp
, TREE_OPERAND (e
, 1));
1947 pp_c_right_paren (pp
);
1951 case NON_LVALUE_EXPR
:
1953 pp_expression (pp
, TREE_OPERAND (e
, 0));
1957 pp_postfix_expression (pp
, TREE_OPERAND (e
, 1));
1961 pp_unsupported_tree (pp
, e
);
1971 pp_c_statement (c_pretty_printer
*pp
, tree stmt
)
1976 if (pp_needs_newline (pp
))
1977 pp_newline_and_indent (pp
, 0);
1979 dump_generic_node (pp_base (pp
), stmt
, pp_indentation (pp
), 0, true);
1983 /* Initialize the PRETTY-PRINTER for handling C codes. */
1986 pp_c_pretty_printer_init (c_pretty_printer
*pp
)
1988 pp
->offset_list
= 0;
1990 pp
->declaration
= pp_c_declaration
;
1991 pp
->declaration_specifiers
= pp_c_declaration_specifiers
;
1992 pp
->declarator
= pp_c_declarator
;
1993 pp
->direct_declarator
= pp_c_direct_declarator
;
1994 pp
->type_specifier_seq
= pp_c_specifier_qualifier_list
;
1995 pp
->abstract_declarator
= pp_c_abstract_declarator
;
1996 pp
->direct_abstract_declarator
= pp_c_direct_abstract_declarator
;
1997 pp
->ptr_operator
= pp_c_pointer
;
1998 pp
->parameter_list
= pp_c_parameter_type_list
;
1999 pp
->type_id
= pp_c_type_id
;
2000 pp
->simple_type_specifier
= pp_c_type_specifier
;
2001 pp
->function_specifier
= pp_c_function_specifier
;
2002 pp
->storage_class_specifier
= pp_c_storage_class_specifier
;
2004 pp
->statement
= pp_c_statement
;
2006 pp
->id_expression
= pp_c_id_expression
;
2007 pp
->primary_expression
= pp_c_primary_expression
;
2008 pp
->postfix_expression
= pp_c_postfix_expression
;
2009 pp
->unary_expression
= pp_c_unary_expression
;
2010 pp
->initializer
= pp_c_initializer
;
2011 pp
->multiplicative_expression
= pp_c_multiplicative_expression
;
2012 pp
->conditional_expression
= pp_c_conditional_expression
;
2013 pp
->assignment_expression
= pp_c_assignment_expression
;
2014 pp
->expression
= pp_c_expression
;
2018 /* Print the tree T in full, on file FILE. */
2021 print_c_tree (FILE *file
, tree t
)
2023 static c_pretty_printer pp_rec
;
2024 static bool initialized
= 0;
2025 c_pretty_printer
*pp
= &pp_rec
;
2030 pp_construct (pp_base (pp
), NULL
, 0);
2031 pp_c_pretty_printer_init (pp
);
2032 pp_needs_newline (pp
) = true;
2034 pp_base (pp
)->buffer
->stream
= file
;
2036 pp_statement (pp
, t
);
2042 /* Print the tree T in full, on stderr. */
2045 debug_c_tree (tree t
)
2047 print_c_tree (stderr
, t
);
2048 fputc ('\n', stderr
);
2051 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
2052 up of T's memory address. */
2055 pp_c_tree_decl_identifier (c_pretty_printer
*pp
, tree t
)
2059 gcc_assert (DECL_P (t
));
2062 name
= IDENTIFIER_POINTER (DECL_NAME (t
));
2065 static char xname
[8];
2066 sprintf (xname
, "<U%4x>", ((unsigned)((unsigned long)(t
) & 0xffff)));
2070 pp_c_identifier (pp
, name
);