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, 59 Temple Place - Suite 330, 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 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
321 pp_c_type_specifier (pp, t);
326 pp_id_expression (pp, t);
328 pp_c_identifier (pp, "<typedef-error>");
334 if (code == UNION_TYPE)
335 pp_c_identifier (pp, "union");
336 else if (code == RECORD_TYPE)
337 pp_c_identifier (pp, "struct");
338 else if (code == ENUMERAL_TYPE)
339 pp_c_identifier (pp, "enum");
341 pp_c_identifier (pp, "<tag-error>");
344 pp_id_expression (pp, TYPE_NAME (t));
346 pp_c_identifier (pp, "<anonymous>");
350 pp_unsupported_tree (pp, t);
355 /* specifier-qualifier-list:
356 type-specifier specifier-qualifier-list-opt
357 type-qualifier specifier-qualifier-list-opt
360 Implementation note: Because of the non-linearities in array or
361 function declarations, this routine prints not just the
362 specifier-qualifier-list of such entities or types of such entities,
363 but also the 'pointer' production part of their declarators. The
364 remaining part is done by pp_declarator or pp_c_abstract_declarator. */
367 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
369 const enum tree_code code = TREE_CODE (t);
371 if (TREE_CODE (t) != POINTER_TYPE)
372 pp_c_type_qualifier_list (pp, t);
378 /* Get the types-specifier of this type. */
379 tree pointee = strip_pointer_operator (TREE_TYPE (t));
380 pp_c_specifier_qualifier_list (pp, pointee);
381 if (TREE_CODE (pointee) == ARRAY_TYPE
382 || TREE_CODE (pointee) == FUNCTION_TYPE)
384 pp_c_whitespace (pp);
385 pp_c_left_paren (pp);
387 else if (!c_dialect_cxx ())
388 pp_c_whitespace (pp);
389 pp_ptr_operator (pp, t);
395 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
400 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
401 if (code == COMPLEX_TYPE)
402 pp_c_identifier (pp, flag_isoc99 ? "_Complex" : "__complex__");
403 else if (code == VECTOR_TYPE)
404 pp_c_identifier (pp, "__vector__");
408 pp_simple_type_specifier (pp, t);
413 /* parameter-type-list:
418 parameter-declaration
419 parameter-list , parameter-declaration
421 parameter-declaration:
422 declaration-specifiers declarator
423 declaration-specifiers abstract-declarator(opt) */
426 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
428 bool want_parm_decl = DECL_P (t) && !(pp->flags & pp_c_flag_abstract);
429 tree parms = want_parm_decl ? DECL_ARGUMENTS (t) : TYPE_ARG_TYPES (t);
430 pp_c_left_paren (pp);
431 if (parms == void_list_node)
432 pp_c_identifier (pp, "void");
436 for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
439 pp_separate_with (pp, ',');
441 pp_declaration_specifiers
442 (pp, want_parm_decl ? parms : TREE_VALUE (parms));
444 pp_declarator (pp, parms);
446 pp_abstract_declarator (pp, TREE_VALUE (parms));
449 pp_c_right_paren (pp);
452 /* abstract-declarator:
454 pointer(opt) direct-abstract-declarator */
457 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
459 if (TREE_CODE (t) == POINTER_TYPE)
461 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
462 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
463 pp_c_right_paren (pp);
467 pp_direct_abstract_declarator (pp, t);
470 /* direct-abstract-declarator:
471 ( abstract-declarator )
472 direct-abstract-declarator(opt) [ assignment-expression(opt) ]
473 direct-abstract-declarator(opt) [ * ]
474 direct-abstract-declarator(opt) ( parameter-type-list(opt) ) */
477 pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
479 switch (TREE_CODE (t))
482 pp_abstract_declarator (pp, t);
486 pp_c_parameter_type_list (pp, t);
487 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
491 pp_c_left_bracket (pp);
492 if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
493 pp_expression (pp, TYPE_MAX_VALUE (TYPE_DOMAIN (t)));
494 pp_c_right_bracket (pp);
495 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
498 case IDENTIFIER_NODE:
512 pp_unsupported_tree (pp, t);
518 specifier-qualifier-list abstract-declarator(opt) */
521 pp_c_type_id (c_pretty_printer *pp, tree t)
523 pp_c_specifier_qualifier_list (pp, t);
524 pp_abstract_declarator (pp, t);
527 /* storage-class-specifier:
535 pp_c_storage_class_specifier (c_pretty_printer *pp, tree t)
537 if (TREE_CODE (t) == TYPE_DECL)
538 pp_c_identifier (pp, "typedef");
541 if (DECL_REGISTER (t))
542 pp_c_identifier (pp, "register");
543 else if (TREE_STATIC (t) && TREE_CODE (t) == VAR_DECL)
544 pp_c_identifier (pp, "static");
548 /* function-specifier:
552 pp_c_function_specifier (c_pretty_printer *pp, tree t)
554 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
555 pp_c_identifier (pp, "inline");
558 /* declaration-specifiers:
559 storage-class-specifier declaration-specifiers(opt)
560 type-specifier declaration-specifiers(opt)
561 type-qualifier declaration-specifiers(opt)
562 function-specifier declaration-specifiers(opt) */
565 pp_c_declaration_specifiers (c_pretty_printer *pp, tree t)
567 pp_storage_class_specifier (pp, t);
568 pp_function_specifier (pp, t);
569 pp_c_specifier_qualifier_list (pp, DECL_P (t) ? TREE_TYPE (t) : t);
575 direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
576 direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
577 direct-declarator [ type-qualifier-list static assignment-expression ]
578 direct-declarator [ type-qualifier-list * ]
579 direct-declarator ( parameter-type-list )
580 direct-declarator ( identifier-list(opt) ) */
583 pp_c_direct_declarator (c_pretty_printer *pp, tree t)
585 switch (TREE_CODE (t))
592 pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
593 pp_c_tree_decl_identifier (pp, t);
598 pp_abstract_declarator (pp, TREE_TYPE (t));
602 pp_parameter_list (pp, t);
603 pp_abstract_declarator (pp, TREE_TYPE (t));
607 pp_c_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
608 pp_c_tree_decl_identifier (pp, t);
609 if (pp_c_base (pp)->flags & pp_c_flag_abstract)
610 pp_abstract_declarator (pp, TREE_TYPE (t));
613 pp_parameter_list (pp, t);
614 pp_abstract_declarator (pp, TREE_TYPE (TREE_TYPE (t)));
626 pp_unsupported_tree (pp, t);
633 pointer(opt) direct-declarator */
636 pp_c_declarator (c_pretty_printer *pp, tree t)
638 switch (TREE_CODE (t))
654 pp_direct_declarator (pp, t);
659 pp_unsupported_tree (pp, t);
665 declaration-specifiers init-declarator-list(opt) ; */
668 pp_c_declaration (c_pretty_printer *pp, tree t)
670 pp_declaration_specifiers (pp, t);
671 pp_c_init_declarator (pp, t);
674 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
677 pp_c_attributes (c_pretty_printer *pp, tree attributes)
679 if (attributes == NULL_TREE)
682 pp_c_identifier (pp, "__attribute__");
683 pp_c_left_paren (pp);
684 pp_c_left_paren (pp);
685 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
687 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
688 if (TREE_VALUE (attributes))
689 pp_c_call_argument_list (pp, TREE_VALUE (attributes));
691 if (TREE_CHAIN (attributes))
692 pp_separate_with (pp, ',');
694 pp_c_right_paren (pp);
695 pp_c_right_paren (pp);
698 /* function-definition:
699 declaration-specifiers declarator compound-statement */
702 pp_c_function_definition (c_pretty_printer *pp, tree t)
704 pp_declaration_specifiers (pp, t);
705 pp_declarator (pp, t);
706 pp_needs_newline (pp) = true;
707 pp_statement (pp, DECL_SAVED_TREE (t));
715 /* Print out a c-char. This is called solely for characters which are
716 in the *target* execution character set. We ought to convert them
717 back to the *host* execution character set before printing, but we
718 have no way to do this at present. A decent compromise is to print
719 all characters as if they were in the host execution character set,
720 and not attempt to recover any named escape characters, but render
721 all unprintables as octal escapes. If the host and target character
722 sets are the same, this produces relatively readable output. If they
723 are not the same, strings may appear as gibberish, but that's okay
724 (in fact, it may well be what the reader wants, e.g. if they are looking
725 to see if conversion to the target character set happened correctly).
727 A special case: we need to prefix \, ", and ' with backslashes. It is
728 correct to do so for the *host*'s \, ", and ', because the rest of the
729 file appears in the host character set. */
732 pp_c_char (c_pretty_printer *pp, int c)
738 case '\\': pp_string (pp, "\\\\"); break;
739 case '\'': pp_string (pp, "\\\'"); break;
740 case '\"': pp_string (pp, "\\\""); break;
741 default: pp_character (pp, c);
745 pp_scalar (pp, "\\%03o", (unsigned) c);
748 /* Print out a STRING literal. */
751 pp_c_string_literal (c_pretty_printer *pp, tree s)
753 const char *p = TREE_STRING_POINTER (s);
754 int n = TREE_STRING_LENGTH (s) - 1;
757 for (i = 0; i < n; ++i)
758 pp_c_char (pp, p[i]);
762 /* Pretty-print an INTEGER literal. */
765 pp_c_integer_constant (c_pretty_printer *pp, tree i)
767 tree type = TREE_TYPE (i);
769 if (TREE_INT_CST_HIGH (i) == 0)
770 pp_wide_integer (pp, TREE_INT_CST_LOW (i));
773 if (tree_int_cst_sgn (i) < 0)
775 pp_character (pp, '-');
776 i = build_int_cst_wide (NULL_TREE,
777 -TREE_INT_CST_LOW (i),
778 ~TREE_INT_CST_HIGH (i)
779 + !TREE_INT_CST_LOW (i));
781 sprintf (pp_buffer (pp)->digit_buffer,
782 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
783 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
784 pp_string (pp, pp_buffer (pp)->digit_buffer);
786 if (TYPE_UNSIGNED (type))
787 pp_character (pp, 'u');
788 if (type == long_integer_type_node || type == long_unsigned_type_node)
789 pp_character (pp, 'l');
790 else if (type == long_long_integer_type_node
791 || type == long_long_unsigned_type_node)
792 pp_string (pp, "ll");
795 /* Print out a CHARACTER literal. */
798 pp_c_character_constant (c_pretty_printer *pp, tree c)
800 tree type = TREE_TYPE (c);
801 if (type == wchar_type_node)
802 pp_character (pp, 'L');
804 if (host_integerp (c, TYPE_UNSIGNED (type)))
805 pp_c_char (pp, tree_low_cst (c, TYPE_UNSIGNED (type)));
807 pp_scalar (pp, "\\x%x", (unsigned) TREE_INT_CST_LOW (c));
811 /* Print out a BOOLEAN literal. */
814 pp_c_bool_constant (c_pretty_printer *pp, tree b)
816 if (b == boolean_false_node)
818 if (c_dialect_cxx ())
819 pp_c_identifier (pp, "false");
820 else if (flag_isoc99)
821 pp_c_identifier (pp, "_False");
823 pp_unsupported_tree (pp, b);
825 else if (b == boolean_true_node)
827 if (c_dialect_cxx ())
828 pp_c_identifier (pp, "true");
829 else if (flag_isoc99)
830 pp_c_identifier (pp, "_True");
832 pp_unsupported_tree (pp, b);
834 else if (TREE_CODE (b) == INTEGER_CST)
835 pp_c_integer_constant (pp, b);
837 pp_unsupported_tree (pp, b);
840 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
841 false; that means the value was obtained by a cast, in which case
842 print out the type-id part of the cast-expression -- the casted value
843 is then printed by pp_c_integer_literal. */
846 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
848 bool value_is_named = true;
849 tree type = TREE_TYPE (e);
852 /* Find the name of this constant. */
853 for (value = TYPE_VALUES (type);
854 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
855 value = TREE_CHAIN (value))
858 if (value != NULL_TREE)
859 pp_id_expression (pp, TREE_PURPOSE (value));
862 /* Value must have been cast. */
863 pp_c_type_cast (pp, type);
864 value_is_named = false;
867 return value_is_named;
870 /* Print out a REAL value as a decimal-floating-constant. */
873 pp_c_floating_constant (c_pretty_printer *pp, tree r)
875 real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
876 sizeof (pp_buffer (pp)->digit_buffer), 0, 1);
877 pp_string (pp, pp_buffer(pp)->digit_buffer);
878 if (TREE_TYPE (r) == float_type_node)
879 pp_character (pp, 'f');
880 else if (TREE_TYPE (r) == long_double_type_node)
881 pp_character (pp, 'l');
884 /* Pretty-print a compound literal expression. GNU extensions include
888 pp_c_compound_literal (c_pretty_printer *pp, tree e)
890 tree type = TREE_TYPE (e);
891 pp_c_type_cast (pp, type);
893 switch (TREE_CODE (type))
900 pp_c_brace_enclosed_initializer_list (pp, e);
904 pp_unsupported_tree (pp, e);
913 character-constant */
916 pp_c_constant (c_pretty_printer *pp, tree e)
918 const enum tree_code code = TREE_CODE (e);
924 tree type = TREE_TYPE (e);
925 if (type == boolean_type_node)
926 pp_c_bool_constant (pp, e);
927 else if (type == char_type_node)
928 pp_c_character_constant (pp, e);
929 else if (TREE_CODE (type) == ENUMERAL_TYPE
930 && pp_c_enumeration_constant (pp, e))
933 pp_c_integer_constant (pp, e);
938 pp_c_floating_constant (pp, e);
942 pp_c_string_literal (pp, e);
946 pp_unsupported_tree (pp, e);
951 /* Pretty-print an IDENTIFIER_NODE, preceded by whitespace is necessary. */
954 pp_c_identifier (c_pretty_printer *pp, const char *id)
956 pp_c_maybe_whitespace (pp);
957 pp_identifier (pp, id);
958 pp_base (pp)->padding = pp_before;
961 /* Pretty-print a C primary-expression.
969 pp_c_primary_expression (c_pretty_printer *pp, tree e)
971 switch (TREE_CODE (e))
979 pp_c_tree_decl_identifier (pp, e);
982 case IDENTIFIER_NODE:
983 pp_c_tree_identifier (pp, e);
987 pp_c_identifier (pp, "<erroneous-expression>");
991 pp_c_identifier (pp, "<return-value>");
997 pp_c_constant (pp, e);
1001 pp_c_identifier (pp, "__builtin_memcpy");
1002 pp_c_left_paren (pp);
1004 pp_primary_expression (pp, TREE_OPERAND (e, 0));
1005 pp_separate_with (pp, ',');
1007 pp_initializer (pp, TREE_OPERAND (e, 1));
1008 if (TREE_OPERAND (e, 2))
1010 pp_separate_with (pp, ',');
1011 pp_c_expression (pp, TREE_OPERAND (e, 2));
1013 pp_c_right_paren (pp);
1017 pp_c_left_paren (pp);
1018 pp_statement (pp, STMT_EXPR_STMT (e));
1019 pp_c_right_paren (pp);
1023 /* FIXME: Make sure we won't get into an infinie loop. */
1024 pp_c_left_paren (pp);
1025 pp_expression (pp, e);
1026 pp_c_right_paren (pp);
1031 /* Print out a C initializer -- also support C compound-literals.
1033 assignment-expression:
1034 { initializer-list }
1035 { initializer-list , } */
1038 pp_c_initializer (c_pretty_printer *pp, tree e)
1040 if (TREE_CODE (e) == CONSTRUCTOR)
1041 pp_c_brace_enclosed_initializer_list (pp, e);
1043 pp_expression (pp, e);
1048 declarator = initializer */
1051 pp_c_init_declarator (c_pretty_printer *pp, tree t)
1053 pp_declarator (pp, t);
1054 /* We don't want to output function definitions here. There are handled
1055 elsewhere (and the syntactic form is bogus anyway). */
1056 if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
1058 tree init = DECL_INITIAL (t);
1059 /* This C++ bit is handled here because it is easier to do so.
1060 In templates, the C++ parser builds a TREE_LIST for a
1061 direct-initialization; the TREE_PURPOSE is the variable to
1062 initialize and the TREE_VALUE is the initializer. */
1063 if (TREE_CODE (init) == TREE_LIST)
1065 pp_c_left_paren (pp);
1066 pp_expression (pp, TREE_VALUE (init));
1067 pp_right_paren (pp);
1074 pp_c_initializer (pp, init);
1079 /* initializer-list:
1080 designation(opt) initializer
1081 initializer-list , designation(opt) initializer
1088 designator-list designator
1091 [ constant-expression ]
1095 pp_c_initializer_list (c_pretty_printer *pp, tree e)
1097 tree type = TREE_TYPE (e);
1098 const enum tree_code code = TREE_CODE (type);
1106 tree init = TREE_OPERAND (e, 0);
1107 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1109 if (code == RECORD_TYPE || code == UNION_TYPE)
1112 pp_c_primary_expression (pp, TREE_PURPOSE (init));
1116 pp_c_left_bracket (pp);
1117 if (TREE_PURPOSE (init))
1118 pp_c_constant (pp, TREE_PURPOSE (init));
1119 pp_c_right_bracket (pp);
1121 pp_c_whitespace (pp);
1123 pp_c_whitespace (pp);
1124 pp_initializer (pp, TREE_VALUE (init));
1125 if (TREE_CHAIN (init))
1126 pp_separate_with (pp, ',');
1132 if (TREE_CODE (e) == VECTOR_CST)
1133 pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
1134 else if (TREE_CODE (e) == CONSTRUCTOR)
1135 pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
1141 if (TREE_CODE (e) == CONSTRUCTOR)
1142 pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
1143 else if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
1145 const bool cst = TREE_CODE (e) == COMPLEX_CST;
1146 pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
1147 pp_separate_with (pp, ',');
1148 pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
1158 pp_unsupported_tree (pp, type);
1161 /* Pretty-print a brace-enclosed initializer-list. */
1164 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
1166 pp_c_left_brace (pp);
1167 pp_c_initializer_list (pp, l);
1168 pp_c_right_brace (pp);
1172 /* This is a convenient function, used to bridge gap between C and C++
1179 pp_c_id_expression (c_pretty_printer *pp, tree t)
1181 switch (TREE_CODE (t))
1190 pp_c_tree_decl_identifier (pp, t);
1193 case IDENTIFIER_NODE:
1194 pp_c_tree_identifier (pp, t);
1198 pp_unsupported_tree (pp, t);
1203 /* postfix-expression:
1205 postfix-expression [ expression ]
1206 postfix-expression ( argument-expression-list(opt) )
1207 postfix-expression . identifier
1208 postfix-expression -> identifier
1209 postfix-expression ++
1210 postfix-expression --
1211 ( type-name ) { initializer-list }
1212 ( type-name ) { initializer-list , } */
1215 pp_c_postfix_expression (c_pretty_printer *pp, tree e)
1217 enum tree_code code = TREE_CODE (e);
1220 case POSTINCREMENT_EXPR:
1221 case POSTDECREMENT_EXPR:
1222 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1223 pp_identifier (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
1227 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1228 pp_c_left_bracket (pp);
1229 pp_expression (pp, TREE_OPERAND (e, 1));
1230 pp_c_right_bracket (pp);
1234 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1235 pp_c_call_argument_list (pp, TREE_OPERAND (e, 1));
1238 case UNORDERED_EXPR:
1239 pp_c_identifier (pp, flag_isoc99
1241 : "__builtin_isunordered");
1245 pp_c_identifier (pp, flag_isoc99
1247 : "!__builtin_isunordered");
1251 pp_c_identifier (pp, flag_isoc99
1253 : "!__builtin_isgreaterequal");
1257 pp_c_identifier (pp, flag_isoc99
1259 : "!__builtin_isgreater");
1263 pp_c_identifier (pp, flag_isoc99
1265 : "!__builtin_islessequal");
1269 pp_c_identifier (pp, flag_isoc99
1271 : "!__builtin_isless");
1275 pp_c_identifier (pp, flag_isoc99
1277 : "!__builtin_islessgreater");
1281 pp_c_identifier (pp, flag_isoc99
1283 : "__builtin_islessgreater");
1287 pp_c_left_paren (pp);
1288 pp_expression (pp, TREE_OPERAND (e, 0));
1289 pp_separate_with (pp, ',');
1290 pp_expression (pp, TREE_OPERAND (e, 1));
1291 pp_c_right_paren (pp);
1295 pp_c_identifier (pp, "__builtin_abs");
1296 pp_c_left_paren (pp);
1297 pp_expression (pp, TREE_OPERAND (e, 0));
1298 pp_c_right_paren (pp);
1303 tree object = TREE_OPERAND (e, 0);
1304 if (TREE_CODE (object) == INDIRECT_REF)
1306 pp_postfix_expression (pp, TREE_OPERAND (object, 0));
1311 pp_postfix_expression (pp, object);
1314 pp_expression (pp, TREE_OPERAND (e, 1));
1321 pp_c_compound_literal (pp, e);
1324 case COMPOUND_LITERAL_EXPR:
1325 e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
1328 pp_initializer (pp, e);
1332 pp_c_identifier (pp, "__builtin_va_arg");
1333 pp_c_left_paren (pp);
1334 pp_assignment_expression (pp, TREE_OPERAND (e, 0));
1335 pp_separate_with (pp, ',');
1336 pp_type_id (pp, TREE_TYPE (e));
1337 pp_c_right_paren (pp);
1341 if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
1343 pp_c_id_expression (pp, TREE_OPERAND (e, 0));
1346 /* else fall through. */
1349 pp_primary_expression (pp, e);
1354 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1357 pp_c_expression_list (c_pretty_printer *pp, tree e)
1359 for (; e != NULL_TREE; e = TREE_CHAIN (e))
1361 pp_expression (pp, TREE_VALUE (e));
1363 pp_separate_with (pp, ',');
1367 /* Print out an expression-list in parens, as in a function call. */
1370 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
1372 pp_c_left_paren (pp);
1373 if (t && TREE_CODE (t) == TREE_LIST)
1374 pp_c_expression_list (pp, t);
1375 pp_c_right_paren (pp);
1378 /* unary-expression:
1382 unary-operator cast-expression
1383 sizeof unary-expression
1386 unary-operator: one of
1391 __alignof__ unary-expression
1392 __alignof__ ( type-id )
1393 __real__ unary-expression
1394 __imag__ unary-expression */
1397 pp_c_unary_expression (c_pretty_printer *pp, tree e)
1399 enum tree_code code = TREE_CODE (e);
1402 case PREINCREMENT_EXPR:
1403 case PREDECREMENT_EXPR:
1404 pp_identifier (pp, code == PREINCREMENT_EXPR ? "++" : "--");
1405 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1412 case TRUTH_NOT_EXPR:
1414 /* String literal are used by address. */
1415 if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
1417 else if (code == INDIRECT_REF)
1419 else if (code == NEGATE_EXPR)
1421 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
1423 else if (code == TRUTH_NOT_EXPR)
1424 pp_exclamation (pp);
1425 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1430 pp_c_identifier (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
1431 pp_c_whitespace (pp);
1432 pp_unary_expression (pp, TREE_OPERAND (e, 0));
1436 pp_postfix_expression (pp, e);
1443 ( type-name ) cast-expression */
1446 pp_c_cast_expression (c_pretty_printer *pp, tree e)
1448 switch (TREE_CODE (e))
1451 case FIX_TRUNC_EXPR:
1453 pp_c_type_cast (pp, TREE_TYPE (e));
1454 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1458 pp_unary_expression (pp, e);
1462 /* multiplicative-expression:
1464 multiplicative-expression * cast-expression
1465 multiplicative-expression / cast-expression
1466 multiplicative-expression % cast-expression */
1469 pp_c_multiplicative_expression (c_pretty_printer *pp, tree e)
1471 enum tree_code code = TREE_CODE (e);
1475 case TRUNC_DIV_EXPR:
1476 case TRUNC_MOD_EXPR:
1477 pp_multiplicative_expression (pp, TREE_OPERAND (e, 0));
1478 pp_c_whitespace (pp);
1479 if (code == MULT_EXPR)
1481 else if (code == TRUNC_DIV_EXPR)
1485 pp_c_whitespace (pp);
1486 pp_c_cast_expression (pp, TREE_OPERAND (e, 1));
1490 pp_c_cast_expression (pp, e);
1495 /* additive-expression:
1496 multiplicative-expression
1497 additive-expression + multiplicative-expression
1498 additive-expression - multiplicative-expression */
1501 pp_c_additive_expression (c_pretty_printer *pp, tree e)
1503 enum tree_code code = TREE_CODE (e);
1508 pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
1509 pp_c_whitespace (pp);
1510 if (code == PLUS_EXPR)
1514 pp_c_whitespace (pp);
1515 pp_multiplicative_expression (pp, TREE_OPERAND (e, 1));
1519 pp_multiplicative_expression (pp, e);
1524 /* additive-expression:
1526 shift-expression << additive-expression
1527 shift-expression >> additive-expression */
1530 pp_c_shift_expression (c_pretty_printer *pp, tree e)
1532 enum tree_code code = TREE_CODE (e);
1537 pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
1538 pp_c_whitespace (pp);
1539 pp_identifier (pp, code == LSHIFT_EXPR ? "<<" : ">>");
1540 pp_c_whitespace (pp);
1541 pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
1545 pp_c_additive_expression (pp, e);
1549 /* relational-expression:
1551 relational-expression < shift-expression
1552 relational-expression > shift-expression
1553 relational-expression <= shift-expression
1554 relational-expression >= shift-expression */
1557 pp_c_relational_expression (c_pretty_printer *pp, tree e)
1559 enum tree_code code = TREE_CODE (e);
1566 pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
1567 pp_c_whitespace (pp);
1568 if (code == LT_EXPR)
1570 else if (code == GT_EXPR)
1572 else if (code == LE_EXPR)
1573 pp_identifier (pp, "<=");
1574 else if (code == GE_EXPR)
1575 pp_identifier (pp, ">=");
1576 pp_c_whitespace (pp);
1577 pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
1581 pp_c_shift_expression (pp, e);
1586 /* equality-expression:
1587 relational-expression
1588 equality-expression == relational-expression
1589 equality-equality != relational-expression */
1592 pp_c_equality_expression (c_pretty_printer *pp, tree e)
1594 enum tree_code code = TREE_CODE (e);
1599 pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
1600 pp_c_whitespace (pp);
1601 pp_identifier (pp, code == EQ_EXPR ? "==" : "!=");
1602 pp_c_whitespace (pp);
1603 pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
1607 pp_c_relational_expression (pp, e);
1614 AND-expression & equality-equality */
1617 pp_c_and_expression (c_pretty_printer *pp, tree e)
1619 if (TREE_CODE (e) == BIT_AND_EXPR)
1621 pp_c_and_expression (pp, TREE_OPERAND (e, 0));
1622 pp_c_whitespace (pp);
1624 pp_c_whitespace (pp);
1625 pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
1628 pp_c_equality_expression (pp, e);
1631 /* exclusive-OR-expression:
1633 exclusive-OR-expression ^ AND-expression */
1636 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
1638 if (TREE_CODE (e) == BIT_XOR_EXPR)
1640 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1641 pp_c_maybe_whitespace (pp);
1643 pp_c_whitespace (pp);
1644 pp_c_and_expression (pp, TREE_OPERAND (e, 1));
1647 pp_c_and_expression (pp, e);
1650 /* inclusive-OR-expression:
1651 exclusive-OR-expression
1652 inclusive-OR-expression | exclusive-OR-expression */
1655 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
1657 if (TREE_CODE (e) == BIT_IOR_EXPR)
1659 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1660 pp_c_whitespace (pp);
1662 pp_c_whitespace (pp);
1663 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
1666 pp_c_exclusive_or_expression (pp, e);
1669 /* logical-AND-expression:
1670 inclusive-OR-expression
1671 logical-AND-expression && inclusive-OR-expression */
1674 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
1676 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
1678 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
1679 pp_c_whitespace (pp);
1680 pp_identifier (pp, "&&");
1681 pp_c_whitespace (pp);
1682 pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
1685 pp_c_inclusive_or_expression (pp, e);
1688 /* logical-OR-expression:
1689 logical-AND-expression
1690 logical-OR-expression || logical-AND-expression */
1693 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
1695 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1697 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1698 pp_c_whitespace (pp);
1699 pp_identifier (pp, "||");
1700 pp_c_whitespace (pp);
1701 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
1704 pp_c_logical_and_expression (pp, e);
1707 /* conditional-expression:
1708 logical-OR-expression
1709 logical-OR-expression ? expression : conditional-expression */
1712 pp_c_conditional_expression (c_pretty_printer *pp, tree e)
1714 if (TREE_CODE (e) == COND_EXPR)
1716 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1717 pp_c_whitespace (pp);
1719 pp_c_whitespace (pp);
1720 pp_expression (pp, TREE_OPERAND (e, 1));
1721 pp_c_whitespace (pp);
1723 pp_c_whitespace (pp);
1724 pp_c_conditional_expression (pp, TREE_OPERAND (e, 2));
1727 pp_c_logical_or_expression (pp, e);
1731 /* assignment-expression:
1732 conditional-expression
1733 unary-expression assignment-operator assignment-expression
1735 assignment-expression: one of
1736 = *= /= %= += -= >>= <<= &= ^= |= */
1739 pp_c_assignment_expression (c_pretty_printer *pp, tree e)
1741 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
1743 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1744 pp_c_whitespace (pp);
1747 pp_c_expression (pp, TREE_OPERAND (e, 1));
1750 pp_c_conditional_expression (pp, e);
1754 assignment-expression
1755 expression , assignment-expression
1757 Implementation note: instead of going through the usual recursion
1758 chain, I take the liberty of dispatching nodes to the appropriate
1759 functions. This makes some redundancy, but it worths it. That also
1760 prevents a possible infinite recursion between pp_c_primary_expression ()
1761 and pp_c_expression (). */
1764 pp_c_expression (c_pretty_printer *pp, tree e)
1766 switch (TREE_CODE (e))
1769 pp_c_integer_constant (pp, e);
1773 pp_c_floating_constant (pp, e);
1777 pp_c_string_literal (pp, e);
1780 case IDENTIFIER_NODE:
1790 pp_primary_expression (pp, e);
1793 case POSTINCREMENT_EXPR:
1794 case POSTDECREMENT_EXPR:
1802 case UNORDERED_EXPR:
1811 case COMPOUND_LITERAL_EXPR:
1813 pp_postfix_expression (pp, e);
1821 case TRUTH_NOT_EXPR:
1822 case PREINCREMENT_EXPR:
1823 case PREDECREMENT_EXPR:
1826 pp_c_unary_expression (pp, e);
1830 case FIX_TRUNC_EXPR:
1832 pp_c_cast_expression (pp, e);
1836 case TRUNC_MOD_EXPR:
1837 case TRUNC_DIV_EXPR:
1838 pp_multiplicative_expression (pp, e);
1843 pp_c_shift_expression (pp, e);
1850 pp_c_relational_expression (pp, e);
1854 pp_c_and_expression (pp, e);
1858 pp_c_exclusive_or_expression (pp, e);
1862 pp_c_inclusive_or_expression (pp, e);
1865 case TRUTH_ANDIF_EXPR:
1866 pp_c_logical_and_expression (pp, e);
1869 case TRUTH_ORIF_EXPR:
1870 pp_c_logical_or_expression (pp, e);
1875 pp_c_equality_expression (pp, e);
1879 pp_conditional_expression (pp, e);
1884 pp_c_additive_expression (pp, e);
1889 pp_assignment_expression (pp, e);
1893 pp_c_left_paren (pp);
1894 pp_expression (pp, TREE_OPERAND (e, 0));
1895 pp_separate_with (pp, ',');
1896 pp_assignment_expression (pp, TREE_OPERAND (e, 1));
1897 pp_c_right_paren (pp);
1901 case NON_LVALUE_EXPR:
1903 pp_expression (pp, TREE_OPERAND (e, 0));
1907 pp_postfix_expression (pp, TREE_OPERAND (e, 1));
1911 pp_unsupported_tree (pp, e);
1923 expression-statement
1929 pp_c_statement (c_pretty_printer *pp, tree stmt)
1931 enum tree_code code;
1936 if (pp_needs_newline (pp))
1937 pp_newline_and_indent (pp, 0);
1939 code = TREE_CODE (stmt);
1942 /* expression-statement:
1943 expression(opt) ; */
1945 pp_expression (pp, EXPR_STMT_EXPR (stmt));
1946 pp_c_semicolon (pp);
1947 pp_needs_newline (pp) = true;
1951 dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
1957 /* Initialize the PRETTY-PRINTER for handling C codes. */
1960 pp_c_pretty_printer_init (c_pretty_printer *pp)
1962 pp->offset_list = 0;
1964 pp->declaration = pp_c_declaration;
1965 pp->declaration_specifiers = pp_c_declaration_specifiers;
1966 pp->declarator = pp_c_declarator;
1967 pp->direct_declarator = pp_c_direct_declarator;
1968 pp->type_specifier_seq = pp_c_specifier_qualifier_list;
1969 pp->abstract_declarator = pp_c_abstract_declarator;
1970 pp->direct_abstract_declarator = pp_c_direct_abstract_declarator;
1971 pp->ptr_operator = pp_c_pointer;
1972 pp->parameter_list = pp_c_parameter_type_list;
1973 pp->type_id = pp_c_type_id;
1974 pp->simple_type_specifier = pp_c_type_specifier;
1975 pp->function_specifier = pp_c_function_specifier;
1976 pp->storage_class_specifier = pp_c_storage_class_specifier;
1978 pp->statement = pp_c_statement;
1980 pp->id_expression = pp_c_id_expression;
1981 pp->primary_expression = pp_c_primary_expression;
1982 pp->postfix_expression = pp_c_postfix_expression;
1983 pp->unary_expression = pp_c_unary_expression;
1984 pp->initializer = pp_c_initializer;
1985 pp->multiplicative_expression = pp_c_multiplicative_expression;
1986 pp->conditional_expression = pp_c_conditional_expression;
1987 pp->assignment_expression = pp_c_assignment_expression;
1988 pp->expression = pp_c_expression;
1992 /* Print the tree T in full, on file FILE. */
1995 print_c_tree (FILE *file, tree t)
1997 static c_pretty_printer pp_rec;
1998 static bool initialized = 0;
1999 c_pretty_printer *pp = &pp_rec;
2004 pp_construct (pp_base (pp), NULL, 0);
2005 pp_c_pretty_printer_init (pp);
2006 pp_needs_newline (pp) = true;
2008 pp_base (pp)->buffer->stream = file;
2010 pp_statement (pp, t);
2016 /* Print the tree T in full, on stderr. */
2019 debug_c_tree (tree t)
2021 print_c_tree (stderr, t);
2022 fputc ('\n', stderr);
2025 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
2026 up of T's memory address. */
2029 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
2033 gcc_assert (DECL_P (t));
2036 name = IDENTIFIER_POINTER (DECL_NAME (t));
2039 static char xname[8];
2040 sprintf (xname, "<U%4x>", ((unsigned)((unsigned long)(t) & 0xffff)));
2044 pp_c_identifier (pp, name);