1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002-2017 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 3, 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 COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
24 #include "c-pretty-print.h"
25 #include "diagnostic.h"
26 #include "stor-layout.h"
29 #include "tree-pretty-print.h"
31 /* The pretty-printer code is primarily designed to closely follow
32 (GNU) C and C++ grammars. That is to be contrasted with spaghetti
33 codes we used to have in the past. Following a structured
34 approach (preferably the official grammars) is believed to make it
35 much easier to add extensions and nifty pretty-printing effects that
36 takes expression or declaration contexts into account. */
39 #define pp_c_maybe_whitespace(PP) \
41 if ((PP)->padding == pp_before) \
42 pp_c_whitespace (PP); \
46 static void pp_c_char (c_pretty_printer
*, int);
48 /* postfix-expression */
49 static void pp_c_initializer_list (c_pretty_printer
*, tree
);
50 static void pp_c_brace_enclosed_initializer_list (c_pretty_printer
*, tree
);
52 static void pp_c_additive_expression (c_pretty_printer
*, tree
);
53 static void pp_c_shift_expression (c_pretty_printer
*, tree
);
54 static void pp_c_relational_expression (c_pretty_printer
*, tree
);
55 static void pp_c_equality_expression (c_pretty_printer
*, tree
);
56 static void pp_c_and_expression (c_pretty_printer
*, tree
);
57 static void pp_c_exclusive_or_expression (c_pretty_printer
*, tree
);
58 static void pp_c_inclusive_or_expression (c_pretty_printer
*, tree
);
59 static void pp_c_logical_and_expression (c_pretty_printer
*, tree
);
64 /* Helper functions. */
67 pp_c_whitespace (c_pretty_printer
*pp
)
70 pp
->padding
= pp_none
;
74 pp_c_left_paren (c_pretty_printer
*pp
)
77 pp
->padding
= pp_none
;
81 pp_c_right_paren (c_pretty_printer
*pp
)
84 pp
->padding
= pp_none
;
88 pp_c_left_brace (c_pretty_printer
*pp
)
91 pp
->padding
= pp_none
;
95 pp_c_right_brace (c_pretty_printer
*pp
)
98 pp
->padding
= pp_none
;
102 pp_c_left_bracket (c_pretty_printer
*pp
)
104 pp_left_bracket (pp
);
105 pp
->padding
= pp_none
;
109 pp_c_right_bracket (c_pretty_printer
*pp
)
111 pp_right_bracket (pp
);
112 pp
->padding
= pp_none
;
116 pp_c_dot (c_pretty_printer
*pp
)
119 pp
->padding
= pp_none
;
123 pp_c_ampersand (c_pretty_printer
*pp
)
126 pp
->padding
= pp_none
;
130 pp_c_star (c_pretty_printer
*pp
)
133 pp
->padding
= pp_none
;
137 pp_c_arrow (c_pretty_printer
*pp
)
140 pp
->padding
= pp_none
;
144 pp_c_semicolon (c_pretty_printer
*pp
)
147 pp
->padding
= pp_none
;
151 pp_c_complement (c_pretty_printer
*pp
)
154 pp
->padding
= pp_none
;
158 pp_c_exclamation (c_pretty_printer
*pp
)
161 pp
->padding
= pp_none
;
164 /* Print out the external representation of QUALIFIERS. */
167 pp_c_cv_qualifiers (c_pretty_printer
*pp
, int qualifiers
, bool func_type
)
169 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
);
180 if (qualifiers
& TYPE_QUAL_ATOMIC
)
181 pp_c_ws_string (pp
, "_Atomic");
182 if (qualifiers
& TYPE_QUAL_CONST
)
183 pp_c_ws_string (pp
, func_type
? "__attribute__((const))" : "const");
184 if (qualifiers
& TYPE_QUAL_VOLATILE
)
185 pp_c_ws_string (pp
, func_type
? "__attribute__((noreturn))" : "volatile");
186 if (qualifiers
& TYPE_QUAL_RESTRICT
)
187 pp_c_ws_string (pp
, (flag_isoc99
&& !c_dialect_cxx ()
188 ? "restrict" : "__restrict__"));
191 /* Pretty-print T using the type-cast notation '( type-name )'. */
194 pp_c_type_cast (c_pretty_printer
*pp
, tree t
)
196 pp_c_left_paren (pp
);
198 pp_c_right_paren (pp
);
201 /* We're about to pretty-print a pointer type as indicated by T.
202 Output a whitespace, if needed, preparing for subsequent output. */
205 pp_c_space_for_pointer_operator (c_pretty_printer
*pp
, tree t
)
207 if (POINTER_TYPE_P (t
))
209 tree pointee
= strip_pointer_operator (TREE_TYPE (t
));
210 if (TREE_CODE (pointee
) != ARRAY_TYPE
211 && TREE_CODE (pointee
) != FUNCTION_TYPE
)
212 pp_c_whitespace (pp
);
219 /* C++ cv-qualifiers are called type-qualifiers in C. Print out the
220 cv-qualifiers of T. If T is a declaration then it is the cv-qualifier
221 of its type. Take care of possible extensions.
225 type-qualifier-list type-qualifier
230 __restrict__ -- GNU C
231 address-space-qualifier -- GNU C
235 address-space-qualifier:
236 identifier -- GNU C */
239 pp_c_type_qualifier_list (c_pretty_printer
*pp
, tree t
)
243 if (!t
|| t
== error_mark_node
)
249 qualifiers
= TYPE_QUALS (t
);
250 pp_c_cv_qualifiers (pp
, qualifiers
,
251 TREE_CODE (t
) == FUNCTION_TYPE
);
253 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (t
)))
255 const char *as
= c_addr_space_name (TYPE_ADDR_SPACE (t
));
256 pp_c_identifier (pp
, as
);
261 * type-qualifier-list(opt)
262 * type-qualifier-list(opt) pointer */
265 pp_c_pointer (c_pretty_printer
*pp
, tree t
)
267 if (!TYPE_P (t
) && TREE_CODE (t
) != TYPE_DECL
)
269 switch (TREE_CODE (t
))
272 /* It is easier to handle C++ reference types here. */
274 if (TREE_CODE (TREE_TYPE (t
)) == POINTER_TYPE
)
275 pp_c_pointer (pp
, TREE_TYPE (t
));
276 if (TREE_CODE (t
) == POINTER_TYPE
)
280 pp_c_type_qualifier_list (pp
, t
);
283 /* ??? This node is now in GENERIC and so shouldn't be here. But
284 we'll fix that later. */
286 pp
->declaration (DECL_EXPR_DECL (t
));
287 pp_needs_newline (pp
) = true;
291 pp_unsupported_tree (pp
, t
);
295 /* simple-type-specifier:
311 struct-or-union-specifier
316 simple-type-specifier:
321 c_pretty_printer::simple_type_specifier (tree t
)
323 const enum tree_code code
= TREE_CODE (t
);
327 translate_string ("<type-error>");
330 case IDENTIFIER_NODE
:
331 pp_c_identifier (this, IDENTIFIER_POINTER (t
));
338 case FIXED_POINT_TYPE
:
342 simple_type_specifier (t
);
346 int prec
= TYPE_PRECISION (t
);
348 if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (t
)))
349 common_t
= c_common_type_for_mode (TYPE_MODE (t
),
350 TYPE_SATURATING (t
));
352 common_t
= c_common_type_for_mode (TYPE_MODE (t
),
354 if (common_t
&& TYPE_NAME (common_t
))
356 simple_type_specifier (common_t
);
357 if (TYPE_PRECISION (common_t
) != prec
)
360 pp_decimal_int (this, prec
);
368 translate_string (TYPE_UNSIGNED (t
)
369 ? "<unnamed-unsigned:"
370 : "<unnamed-signed:");
373 translate_string ("<unnamed-float:");
375 case FIXED_POINT_TYPE
:
376 translate_string ("<unnamed-fixed:");
381 pp_decimal_int (this, prec
);
391 translate_string ("<typedef-error>");
397 if (TYPE_NAME (t
) && TREE_CODE (TYPE_NAME (t
)) == TYPE_DECL
)
398 /* Don't decorate the type if this is a typedef name. */;
399 else if (code
== UNION_TYPE
)
400 pp_c_ws_string (this, "union");
401 else if (code
== RECORD_TYPE
)
402 pp_c_ws_string (this, "struct");
403 else if (code
== ENUMERAL_TYPE
)
404 pp_c_ws_string (this, "enum");
406 translate_string ("<tag-error>");
409 id_expression (TYPE_NAME (t
));
411 translate_string ("<anonymous>");
415 pp_unsupported_tree (this, t
);
420 /* specifier-qualifier-list:
421 type-specifier specifier-qualifier-list-opt
422 type-qualifier specifier-qualifier-list-opt
425 Implementation note: Because of the non-linearities in array or
426 function declarations, this routine prints not just the
427 specifier-qualifier-list of such entities or types of such entities,
428 but also the 'pointer' production part of their declarators. The
429 remaining part is done by declarator() or abstract_declarator(). */
432 pp_c_specifier_qualifier_list (c_pretty_printer
*pp
, tree t
)
434 const enum tree_code code
= TREE_CODE (t
);
436 if (!(pp
->flags
& pp_c_flag_gnu_v3
) && code
!= POINTER_TYPE
)
437 pp_c_type_qualifier_list (pp
, t
);
443 /* Get the types-specifier of this type. */
444 tree pointee
= strip_pointer_operator (TREE_TYPE (t
));
445 pp_c_specifier_qualifier_list (pp
, pointee
);
446 if (TREE_CODE (pointee
) == ARRAY_TYPE
447 || TREE_CODE (pointee
) == FUNCTION_TYPE
)
449 pp_c_whitespace (pp
);
450 pp_c_left_paren (pp
);
451 pp_c_attributes_display (pp
, TYPE_ATTRIBUTES (pointee
));
453 else if (!c_dialect_cxx ())
454 pp_c_whitespace (pp
);
455 pp_ptr_operator (pp
, t
);
461 pp_c_specifier_qualifier_list (pp
, TREE_TYPE (t
));
466 if (code
== COMPLEX_TYPE
)
467 pp_c_ws_string (pp
, (flag_isoc99
&& !c_dialect_cxx ()
468 ? "_Complex" : "__complex__"));
469 else if (code
== VECTOR_TYPE
)
471 pp_c_ws_string (pp
, "__vector");
472 pp_c_left_paren (pp
);
473 pp_wide_integer (pp
, TYPE_VECTOR_SUBPARTS (t
));
474 pp_c_right_paren (pp
);
475 pp_c_whitespace (pp
);
477 pp_c_specifier_qualifier_list (pp
, TREE_TYPE (t
));
481 pp
->simple_type_specifier (t
);
484 if ((pp
->flags
& pp_c_flag_gnu_v3
) && code
!= POINTER_TYPE
)
485 pp_c_type_qualifier_list (pp
, t
);
488 /* parameter-type-list:
493 parameter-declaration
494 parameter-list , parameter-declaration
496 parameter-declaration:
497 declaration-specifiers declarator
498 declaration-specifiers abstract-declarator(opt) */
501 pp_c_parameter_type_list (c_pretty_printer
*pp
, tree t
)
503 bool want_parm_decl
= DECL_P (t
) && !(pp
->flags
& pp_c_flag_abstract
);
504 tree parms
= want_parm_decl
? DECL_ARGUMENTS (t
) : TYPE_ARG_TYPES (t
);
505 pp_c_left_paren (pp
);
506 if (parms
== void_list_node
)
507 pp_c_ws_string (pp
, "void");
511 for ( ; parms
&& parms
!= void_list_node
; parms
= TREE_CHAIN (parms
))
514 pp_separate_with (pp
, ',');
516 pp
->declaration_specifiers
517 (want_parm_decl
? parms
: TREE_VALUE (parms
));
519 pp
->declarator (parms
);
521 pp
->abstract_declarator (TREE_VALUE (parms
));
524 pp_c_right_paren (pp
);
527 /* abstract-declarator:
529 pointer(opt) direct-abstract-declarator */
532 c_pretty_printer::abstract_declarator (tree t
)
534 if (TREE_CODE (t
) == POINTER_TYPE
)
536 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
537 || TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
)
538 pp_c_right_paren (this);
542 direct_abstract_declarator (t
);
545 /* direct-abstract-declarator:
546 ( abstract-declarator )
547 direct-abstract-declarator(opt) [ assignment-expression(opt) ]
548 direct-abstract-declarator(opt) [ * ]
549 direct-abstract-declarator(opt) ( parameter-type-list(opt) ) */
552 c_pretty_printer::direct_abstract_declarator (tree t
)
554 switch (TREE_CODE (t
))
557 abstract_declarator (t
);
561 pp_c_parameter_type_list (this, t
);
562 direct_abstract_declarator (TREE_TYPE (t
));
566 pp_c_left_bracket (this);
567 if (TYPE_DOMAIN (t
) && TYPE_MAX_VALUE (TYPE_DOMAIN (t
)))
569 tree maxval
= TYPE_MAX_VALUE (TYPE_DOMAIN (t
));
570 tree type
= TREE_TYPE (maxval
);
572 if (tree_fits_shwi_p (maxval
))
573 pp_wide_integer (this, tree_to_shwi (maxval
) + 1);
575 expression (fold_build2 (PLUS_EXPR
, type
, maxval
,
576 build_int_cst (type
, 1)));
578 pp_c_right_bracket (this);
579 direct_abstract_declarator (TREE_TYPE (t
));
582 case IDENTIFIER_NODE
:
587 case FIXED_POINT_TYPE
:
597 pp_unsupported_tree (this, t
);
603 specifier-qualifier-list abstract-declarator(opt) */
606 c_pretty_printer::type_id (tree t
)
608 pp_c_specifier_qualifier_list (this, t
);
609 abstract_declarator (t
);
612 /* storage-class-specifier:
620 c_pretty_printer::storage_class_specifier (tree t
)
622 if (TREE_CODE (t
) == TYPE_DECL
)
623 pp_c_ws_string (this, "typedef");
626 if (DECL_REGISTER (t
))
627 pp_c_ws_string (this, "register");
628 else if (TREE_STATIC (t
) && VAR_P (t
))
629 pp_c_ws_string (this, "static");
633 /* function-specifier:
637 c_pretty_printer::function_specifier (tree t
)
639 if (TREE_CODE (t
) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (t
))
640 pp_c_ws_string (this, "inline");
643 /* declaration-specifiers:
644 storage-class-specifier declaration-specifiers(opt)
645 type-specifier declaration-specifiers(opt)
646 type-qualifier declaration-specifiers(opt)
647 function-specifier declaration-specifiers(opt) */
650 c_pretty_printer::declaration_specifiers (tree t
)
652 storage_class_specifier (t
);
653 function_specifier (t
);
654 pp_c_specifier_qualifier_list (this, DECL_P (t
) ? TREE_TYPE (t
) : t
);
660 direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
661 direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
662 direct-declarator [ type-qualifier-list static assignment-expression ]
663 direct-declarator [ type-qualifier-list * ]
664 direct-declarator ( parameter-type-list )
665 direct-declarator ( identifier-list(opt) ) */
668 c_pretty_printer::direct_declarator (tree t
)
670 switch (TREE_CODE (t
))
677 pp_c_space_for_pointer_operator (this, TREE_TYPE (t
));
678 pp_c_tree_decl_identifier (this, t
);
683 abstract_declarator (TREE_TYPE (t
));
687 pp_parameter_list (this, t
);
688 abstract_declarator (TREE_TYPE (t
));
692 pp_c_space_for_pointer_operator (this, TREE_TYPE (TREE_TYPE (t
)));
693 pp_c_tree_decl_identifier (this, t
);
694 if (flags
& pp_c_flag_abstract
)
695 abstract_declarator (TREE_TYPE (t
));
698 pp_parameter_list (this, t
);
699 abstract_declarator (TREE_TYPE (TREE_TYPE (t
)));
705 case FIXED_POINT_TYPE
:
712 pp_unsupported_tree (this, t
);
719 pointer(opt) direct-declarator */
722 c_pretty_printer::declarator (tree t
)
724 switch (TREE_CODE (t
))
728 case FIXED_POINT_TYPE
:
741 direct_declarator (t
);
746 pp_unsupported_tree (this, t
);
752 declaration-specifiers init-declarator-list(opt) ; */
755 c_pretty_printer::declaration (tree t
)
757 declaration_specifiers (t
);
758 pp_c_init_declarator (this, t
);
761 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
764 pp_c_attributes (c_pretty_printer
*pp
, tree attributes
)
766 if (attributes
== NULL_TREE
)
769 pp_c_ws_string (pp
, "__attribute__");
770 pp_c_left_paren (pp
);
771 pp_c_left_paren (pp
);
772 for (; attributes
!= NULL_TREE
; attributes
= TREE_CHAIN (attributes
))
774 pp_tree_identifier (pp
, TREE_PURPOSE (attributes
));
775 if (TREE_VALUE (attributes
))
776 pp_c_call_argument_list (pp
, TREE_VALUE (attributes
));
778 if (TREE_CHAIN (attributes
))
779 pp_separate_with (pp
, ',');
781 pp_c_right_paren (pp
);
782 pp_c_right_paren (pp
);
785 /* Pretty-print ATTRIBUTES using GNU C extension syntax for attributes
786 marked to be displayed on disgnostic. */
789 pp_c_attributes_display (c_pretty_printer
*pp
, tree a
)
791 bool is_first
= true;
796 for (; a
!= NULL_TREE
; a
= TREE_CHAIN (a
))
798 const struct attribute_spec
*as
;
799 as
= lookup_attribute_spec (TREE_PURPOSE (a
));
800 if (!as
|| as
->affects_type_identity
== false)
803 && !strcmp ("transaction_safe", as
->name
))
804 /* In C++ transaction_safe is printed at the end of the declarator. */
808 pp_c_ws_string (pp
, "__attribute__");
809 pp_c_left_paren (pp
);
810 pp_c_left_paren (pp
);
815 pp_separate_with (pp
, ',');
817 pp_tree_identifier (pp
, TREE_PURPOSE (a
));
819 pp_c_call_argument_list (pp
, TREE_VALUE (a
));
824 pp_c_right_paren (pp
);
825 pp_c_right_paren (pp
);
826 pp_c_whitespace (pp
);
830 /* function-definition:
831 declaration-specifiers declarator compound-statement */
834 pp_c_function_definition (c_pretty_printer
*pp
, tree t
)
836 pp
->declaration_specifiers (t
);
838 pp_needs_newline (pp
) = true;
839 pp
->statement (DECL_SAVED_TREE (t
));
840 pp_newline_and_flush (pp
);
846 /* Print out a c-char. This is called solely for characters which are
847 in the *target* execution character set. We ought to convert them
848 back to the *host* execution character set before printing, but we
849 have no way to do this at present. A decent compromise is to print
850 all characters as if they were in the host execution character set,
851 and not attempt to recover any named escape characters, but render
852 all unprintables as octal escapes. If the host and target character
853 sets are the same, this produces relatively readable output. If they
854 are not the same, strings may appear as gibberish, but that's okay
855 (in fact, it may well be what the reader wants, e.g. if they are looking
856 to see if conversion to the target character set happened correctly).
858 A special case: we need to prefix \, ", and ' with backslashes. It is
859 correct to do so for the *host*'s \, ", and ', because the rest of the
860 file appears in the host character set. */
863 pp_c_char (c_pretty_printer
*pp
, int c
)
869 case '\\': pp_string (pp
, "\\\\"); break;
870 case '\'': pp_string (pp
, "\\\'"); break;
871 case '\"': pp_string (pp
, "\\\""); break;
872 default: pp_character (pp
, c
);
876 pp_scalar (pp
, "\\%03o", (unsigned) c
);
879 /* Print out a STRING literal. */
882 pp_c_string_literal (c_pretty_printer
*pp
, tree s
)
884 const char *p
= TREE_STRING_POINTER (s
);
885 int n
= TREE_STRING_LENGTH (s
) - 1;
888 for (i
= 0; i
< n
; ++i
)
889 pp_c_char (pp
, p
[i
]);
893 /* Pretty-print a VOID_CST (void_node). */
896 pp_c_void_constant (c_pretty_printer
*pp
)
898 pp_c_type_cast (pp
, void_type_node
);
902 /* Pretty-print an INTEGER literal. */
905 pp_c_integer_constant (c_pretty_printer
*pp
, tree i
)
907 if (tree_fits_shwi_p (i
))
908 pp_wide_integer (pp
, tree_to_shwi (i
));
909 else if (tree_fits_uhwi_p (i
))
910 pp_unsigned_wide_integer (pp
, tree_to_uhwi (i
));
915 if (wi::lt_p (i
, 0, TYPE_SIGN (TREE_TYPE (i
))))
920 print_hex (wi
, pp_buffer (pp
)->digit_buffer
);
921 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);
925 /* Print out a CHARACTER literal. */
928 pp_c_character_constant (c_pretty_printer
*pp
, tree c
)
931 pp_c_char (pp
, (unsigned) TREE_INT_CST_LOW (c
));
935 /* Print out a BOOLEAN literal. */
938 pp_c_bool_constant (c_pretty_printer
*pp
, tree b
)
940 if (b
== boolean_false_node
)
942 if (c_dialect_cxx ())
943 pp_c_ws_string (pp
, "false");
944 else if (flag_isoc99
)
945 pp_c_ws_string (pp
, "_False");
947 pp_unsupported_tree (pp
, b
);
949 else if (b
== boolean_true_node
)
951 if (c_dialect_cxx ())
952 pp_c_ws_string (pp
, "true");
953 else if (flag_isoc99
)
954 pp_c_ws_string (pp
, "_True");
956 pp_unsupported_tree (pp
, b
);
958 else if (TREE_CODE (b
) == INTEGER_CST
)
959 pp_c_integer_constant (pp
, b
);
961 pp_unsupported_tree (pp
, b
);
964 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
965 false; that means the value was obtained by a cast, in which case
966 print out the type-id part of the cast-expression -- the casted value
967 is then printed by pp_c_integer_literal. */
970 pp_c_enumeration_constant (c_pretty_printer
*pp
, tree e
)
972 bool value_is_named
= true;
973 tree type
= TREE_TYPE (e
);
976 /* Find the name of this constant. */
977 for (value
= TYPE_VALUES (type
);
978 value
!= NULL_TREE
&& !tree_int_cst_equal (TREE_VALUE (value
), e
);
979 value
= TREE_CHAIN (value
))
982 if (value
!= NULL_TREE
)
983 pp
->id_expression (TREE_PURPOSE (value
));
986 /* Value must have been cast. */
987 pp_c_type_cast (pp
, type
);
988 value_is_named
= false;
991 return value_is_named
;
994 /* Print out a REAL value as a decimal-floating-constant. */
997 pp_c_floating_constant (c_pretty_printer
*pp
, tree r
)
999 const struct real_format
*fmt
1000 = REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (r
)));
1002 REAL_VALUE_TYPE floating_cst
= TREE_REAL_CST (r
);
1003 bool is_decimal
= floating_cst
.decimal
;
1005 /* See ISO C++ WG N1822. Note: The fraction 643/2136 approximates
1006 log10(2) to 7 significant digits. */
1007 int max_digits10
= 2 + (is_decimal
? fmt
->p
: fmt
->p
* 643L / 2136);
1009 real_to_decimal (pp_buffer (pp
)->digit_buffer
, &TREE_REAL_CST (r
),
1010 sizeof (pp_buffer (pp
)->digit_buffer
),
1013 pp_string (pp
, pp_buffer(pp
)->digit_buffer
);
1014 if (TREE_TYPE (r
) == float_type_node
)
1015 pp_character (pp
, 'f');
1016 else if (TREE_TYPE (r
) == long_double_type_node
)
1017 pp_character (pp
, 'l');
1018 else if (TREE_TYPE (r
) == dfloat128_type_node
)
1019 pp_string (pp
, "dl");
1020 else if (TREE_TYPE (r
) == dfloat64_type_node
)
1021 pp_string (pp
, "dd");
1022 else if (TREE_TYPE (r
) == dfloat32_type_node
)
1023 pp_string (pp
, "df");
1024 else if (TREE_TYPE (r
) != double_type_node
)
1025 for (int i
= 0; i
< NUM_FLOATN_NX_TYPES
; i
++)
1026 if (TREE_TYPE (r
) == FLOATN_NX_TYPE_NODE (i
))
1028 pp_character (pp
, 'f');
1029 pp_decimal_int (pp
, floatn_nx_types
[i
].n
);
1030 if (floatn_nx_types
[i
].extended
)
1031 pp_character (pp
, 'x');
1036 /* Print out a FIXED value as a decimal-floating-constant. */
1039 pp_c_fixed_constant (c_pretty_printer
*pp
, tree r
)
1041 fixed_to_decimal (pp_buffer (pp
)->digit_buffer
, &TREE_FIXED_CST (r
),
1042 sizeof (pp_buffer (pp
)->digit_buffer
));
1043 pp_string (pp
, pp_buffer(pp
)->digit_buffer
);
1046 /* Pretty-print a compound literal expression. GNU extensions include
1047 vector constants. */
1050 pp_c_compound_literal (c_pretty_printer
*pp
, tree e
)
1052 tree type
= TREE_TYPE (e
);
1053 pp_c_type_cast (pp
, type
);
1055 switch (TREE_CODE (type
))
1062 pp_c_brace_enclosed_initializer_list (pp
, e
);
1066 pp_unsupported_tree (pp
, e
);
1071 /* Pretty-print a COMPLEX_EXPR expression. */
1074 pp_c_complex_expr (c_pretty_printer
*pp
, tree e
)
1076 /* Handle a few common special cases, otherwise fallback
1077 to printing it as compound literal. */
1078 tree type
= TREE_TYPE (e
);
1079 tree realexpr
= TREE_OPERAND (e
, 0);
1080 tree imagexpr
= TREE_OPERAND (e
, 1);
1082 /* Cast of an COMPLEX_TYPE expression to a different COMPLEX_TYPE. */
1083 if (TREE_CODE (realexpr
) == NOP_EXPR
1084 && TREE_CODE (imagexpr
) == NOP_EXPR
1085 && TREE_TYPE (realexpr
) == TREE_TYPE (type
)
1086 && TREE_TYPE (imagexpr
) == TREE_TYPE (type
)
1087 && TREE_CODE (TREE_OPERAND (realexpr
, 0)) == REALPART_EXPR
1088 && TREE_CODE (TREE_OPERAND (imagexpr
, 0)) == IMAGPART_EXPR
1089 && TREE_OPERAND (TREE_OPERAND (realexpr
, 0), 0)
1090 == TREE_OPERAND (TREE_OPERAND (imagexpr
, 0), 0))
1092 pp_c_type_cast (pp
, type
);
1093 pp
->expression (TREE_OPERAND (TREE_OPERAND (realexpr
, 0), 0));
1097 /* Cast of an scalar expression to COMPLEX_TYPE. */
1098 if ((integer_zerop (imagexpr
) || real_zerop (imagexpr
))
1099 && TREE_TYPE (realexpr
) == TREE_TYPE (type
))
1101 pp_c_type_cast (pp
, type
);
1102 if (TREE_CODE (realexpr
) == NOP_EXPR
)
1103 realexpr
= TREE_OPERAND (realexpr
, 0);
1104 pp
->expression (realexpr
);
1108 pp_c_compound_literal (pp
, e
);
1114 fixed-point-constant
1115 enumeration-constant
1116 character-constant */
1119 c_pretty_printer::constant (tree e
)
1121 const enum tree_code code
= TREE_CODE (e
);
1126 pp_c_void_constant (this);
1131 tree type
= TREE_TYPE (e
);
1132 if (type
== boolean_type_node
)
1133 pp_c_bool_constant (this, e
);
1134 else if (type
== char_type_node
)
1135 pp_c_character_constant (this, e
);
1136 else if (TREE_CODE (type
) == ENUMERAL_TYPE
1137 && pp_c_enumeration_constant (this, e
))
1140 pp_c_integer_constant (this, e
);
1145 pp_c_floating_constant (this, e
);
1149 pp_c_fixed_constant (this, e
);
1153 pp_c_string_literal (this, e
);
1157 /* Sometimes, we are confused and we think a complex literal
1158 is a constant. Such thing is a compound literal which
1159 grammatically belongs to postfix-expr production. */
1160 pp_c_compound_literal (this, e
);
1164 pp_unsupported_tree (this, e
);
1169 /* Pretty-print a string such as an identifier, without changing its
1170 encoding, preceded by whitespace is necessary. */
1173 pp_c_ws_string (c_pretty_printer
*pp
, const char *str
)
1175 pp_c_maybe_whitespace (pp
);
1176 pp_string (pp
, str
);
1177 pp
->padding
= pp_before
;
1181 c_pretty_printer::translate_string (const char *gmsgid
)
1183 if (pp_translate_identifiers (this))
1184 pp_c_ws_string (this, _(gmsgid
));
1186 pp_c_ws_string (this, gmsgid
);
1189 /* Pretty-print an IDENTIFIER_NODE, which may contain UTF-8 sequences
1190 that need converting to the locale encoding, preceded by whitespace
1194 pp_c_identifier (c_pretty_printer
*pp
, const char *id
)
1196 pp_c_maybe_whitespace (pp
);
1197 pp_identifier (pp
, id
);
1198 pp
->padding
= pp_before
;
1201 /* Pretty-print a C primary-expression.
1209 c_pretty_printer::primary_expression (tree e
)
1211 switch (TREE_CODE (e
))
1219 pp_c_tree_decl_identifier (this, e
);
1222 case IDENTIFIER_NODE
:
1223 pp_c_tree_identifier (this, e
);
1227 translate_string ("<erroneous-expression>");
1231 translate_string ("<return-value>");
1243 pp_c_ws_string (this, "__builtin_memcpy");
1244 pp_c_left_paren (this);
1245 pp_ampersand (this);
1246 primary_expression (TREE_OPERAND (e
, 0));
1247 pp_separate_with (this, ',');
1248 pp_ampersand (this);
1249 initializer (TREE_OPERAND (e
, 1));
1250 if (TREE_OPERAND (e
, 2))
1252 pp_separate_with (this, ',');
1253 expression (TREE_OPERAND (e
, 2));
1255 pp_c_right_paren (this);
1259 /* FIXME: Make sure we won't get into an infinite loop. */
1260 pp_c_left_paren (this);
1262 pp_c_right_paren (this);
1267 /* Print out a C initializer -- also support C compound-literals.
1269 assignment-expression:
1270 { initializer-list }
1271 { initializer-list , } */
1274 c_pretty_printer::initializer (tree e
)
1276 if (TREE_CODE (e
) == CONSTRUCTOR
)
1277 pp_c_brace_enclosed_initializer_list (this, e
);
1284 declarator = initializer */
1287 pp_c_init_declarator (c_pretty_printer
*pp
, tree t
)
1290 /* We don't want to output function definitions here. There are handled
1291 elsewhere (and the syntactic form is bogus anyway). */
1292 if (TREE_CODE (t
) != FUNCTION_DECL
&& DECL_INITIAL (t
))
1294 tree init
= DECL_INITIAL (t
);
1295 /* This C++ bit is handled here because it is easier to do so.
1296 In templates, the C++ parser builds a TREE_LIST for a
1297 direct-initialization; the TREE_PURPOSE is the variable to
1298 initialize and the TREE_VALUE is the initializer. */
1299 if (TREE_CODE (init
) == TREE_LIST
)
1301 pp_c_left_paren (pp
);
1302 pp
->expression (TREE_VALUE (init
));
1303 pp_right_paren (pp
);
1310 pp
->initializer (init
);
1315 /* initializer-list:
1316 designation(opt) initializer
1317 initializer-list , designation(opt) initializer
1324 designator-list designator
1327 [ constant-expression ]
1331 pp_c_initializer_list (c_pretty_printer
*pp
, tree e
)
1333 tree type
= TREE_TYPE (e
);
1334 const enum tree_code code
= TREE_CODE (type
);
1336 if (TREE_CODE (e
) == CONSTRUCTOR
)
1338 pp_c_constructor_elts (pp
, CONSTRUCTOR_ELTS (e
));
1348 tree init
= TREE_OPERAND (e
, 0);
1349 for (; init
!= NULL_TREE
; init
= TREE_CHAIN (init
))
1351 if (code
== RECORD_TYPE
|| code
== UNION_TYPE
)
1354 pp
->primary_expression (TREE_PURPOSE (init
));
1358 pp_c_left_bracket (pp
);
1359 if (TREE_PURPOSE (init
))
1360 pp
->constant (TREE_PURPOSE (init
));
1361 pp_c_right_bracket (pp
);
1363 pp_c_whitespace (pp
);
1365 pp_c_whitespace (pp
);
1366 pp
->initializer (TREE_VALUE (init
));
1367 if (TREE_CHAIN (init
))
1368 pp_separate_with (pp
, ',');
1374 if (TREE_CODE (e
) == VECTOR_CST
)
1377 for (i
= 0; i
< VECTOR_CST_NELTS (e
); ++i
)
1380 pp_separate_with (pp
, ',');
1381 pp
->expression (VECTOR_CST_ELT (e
, i
));
1389 if (TREE_CODE (e
) == COMPLEX_CST
|| TREE_CODE (e
) == COMPLEX_EXPR
)
1391 const bool cst
= TREE_CODE (e
) == COMPLEX_CST
;
1392 pp
->expression (cst
? TREE_REALPART (e
) : TREE_OPERAND (e
, 0));
1393 pp_separate_with (pp
, ',');
1394 pp
->expression (cst
? TREE_IMAGPART (e
) : TREE_OPERAND (e
, 1));
1404 pp_unsupported_tree (pp
, type
);
1407 /* Pretty-print a brace-enclosed initializer-list. */
1410 pp_c_brace_enclosed_initializer_list (c_pretty_printer
*pp
, tree l
)
1412 pp_c_left_brace (pp
);
1413 pp_c_initializer_list (pp
, l
);
1414 pp_c_right_brace (pp
);
1418 /* This is a convenient function, used to bridge gap between C and C++
1425 c_pretty_printer::id_expression (tree t
)
1427 switch (TREE_CODE (t
))
1436 pp_c_tree_decl_identifier (this, t
);
1439 case IDENTIFIER_NODE
:
1440 pp_c_tree_identifier (this, t
);
1444 pp_unsupported_tree (this, t
);
1449 /* postfix-expression:
1451 postfix-expression [ expression ]
1452 postfix-expression ( argument-expression-list(opt) )
1453 postfix-expression . identifier
1454 postfix-expression -> identifier
1455 postfix-expression ++
1456 postfix-expression --
1457 ( type-name ) { initializer-list }
1458 ( type-name ) { initializer-list , } */
1461 c_pretty_printer::postfix_expression (tree e
)
1463 enum tree_code code
= TREE_CODE (e
);
1466 case POSTINCREMENT_EXPR
:
1467 case POSTDECREMENT_EXPR
:
1468 postfix_expression (TREE_OPERAND (e
, 0));
1469 pp_string (this, code
== POSTINCREMENT_EXPR
? "++" : "--");
1473 postfix_expression (TREE_OPERAND (e
, 0));
1474 pp_c_left_bracket (this);
1475 expression (TREE_OPERAND (e
, 1));
1476 pp_c_right_bracket (this);
1479 case ARRAY_NOTATION_REF
:
1480 postfix_expression (ARRAY_NOTATION_ARRAY (e
));
1481 pp_c_left_bracket (this);
1482 expression (ARRAY_NOTATION_START (e
));
1484 expression (ARRAY_NOTATION_LENGTH (e
));
1486 expression (ARRAY_NOTATION_STRIDE (e
));
1487 pp_c_right_bracket (this);
1492 call_expr_arg_iterator iter
;
1494 postfix_expression (CALL_EXPR_FN (e
));
1495 pp_c_left_paren (this);
1496 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, e
)
1499 if (more_call_expr_args_p (&iter
))
1500 pp_separate_with (this, ',');
1502 pp_c_right_paren (this);
1506 case UNORDERED_EXPR
:
1507 pp_c_ws_string (this, flag_isoc99
1509 : "__builtin_isunordered");
1513 pp_c_ws_string (this, flag_isoc99
1515 : "!__builtin_isunordered");
1519 pp_c_ws_string (this, flag_isoc99
1521 : "!__builtin_isgreaterequal");
1525 pp_c_ws_string (this, flag_isoc99
1527 : "!__builtin_isgreater");
1531 pp_c_ws_string (this, flag_isoc99
1533 : "!__builtin_islessequal");
1537 pp_c_ws_string (this, flag_isoc99
1539 : "!__builtin_isless");
1543 pp_c_ws_string (this, flag_isoc99
1545 : "!__builtin_islessgreater");
1549 pp_c_ws_string (this, flag_isoc99
1551 : "__builtin_islessgreater");
1555 pp_c_left_paren (this);
1556 expression (TREE_OPERAND (e
, 0));
1557 pp_separate_with (this, ',');
1558 expression (TREE_OPERAND (e
, 1));
1559 pp_c_right_paren (this);
1563 pp_c_ws_string (this, "__builtin_abs");
1564 pp_c_left_paren (this);
1565 expression (TREE_OPERAND (e
, 0));
1566 pp_c_right_paren (this);
1571 tree object
= TREE_OPERAND (e
, 0);
1572 if (INDIRECT_REF_P (object
))
1574 postfix_expression (TREE_OPERAND (object
, 0));
1579 postfix_expression (object
);
1582 expression (TREE_OPERAND (e
, 1));
1588 tree type
= TREE_TYPE (e
);
1590 type
= signed_or_unsigned_type_for (TYPE_UNSIGNED (type
), type
);
1592 && tree_int_cst_equal (TYPE_SIZE (type
), TREE_OPERAND (e
, 1)))
1594 HOST_WIDE_INT bitpos
= tree_to_shwi (TREE_OPERAND (e
, 2));
1595 HOST_WIDE_INT size
= tree_to_shwi (TYPE_SIZE (type
));
1596 if ((bitpos
% size
) == 0)
1598 pp_c_left_paren (this);
1599 pp_c_left_paren (this);
1602 pp_c_right_paren (this);
1603 pp_c_ampersand (this);
1604 expression (TREE_OPERAND (e
, 0));
1605 pp_c_right_paren (this);
1606 pp_c_left_bracket (this);
1607 pp_wide_integer (this, bitpos
/ size
);
1608 pp_c_right_bracket (this);
1612 pp_unsupported_tree (this, e
);
1622 pp_c_compound_literal (this, e
);
1626 pp_c_complex_expr (this, e
);
1629 case COMPOUND_LITERAL_EXPR
:
1630 e
= DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e
));
1637 pp_c_ws_string (this, "__builtin_va_arg");
1638 pp_c_left_paren (this);
1639 assignment_expression (TREE_OPERAND (e
, 0));
1640 pp_separate_with (this, ',');
1641 type_id (TREE_TYPE (e
));
1642 pp_c_right_paren (this);
1646 if (TREE_CODE (TREE_OPERAND (e
, 0)) == FUNCTION_DECL
)
1648 id_expression (TREE_OPERAND (e
, 0));
1654 primary_expression (e
);
1659 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1662 pp_c_expression_list (c_pretty_printer
*pp
, tree e
)
1664 for (; e
!= NULL_TREE
; e
= TREE_CHAIN (e
))
1666 pp
->expression (TREE_VALUE (e
));
1668 pp_separate_with (pp
, ',');
1672 /* Print out V, which contains the elements of a constructor. */
1675 pp_c_constructor_elts (c_pretty_printer
*pp
, vec
<constructor_elt
, va_gc
> *v
)
1677 unsigned HOST_WIDE_INT ix
;
1680 FOR_EACH_CONSTRUCTOR_VALUE (v
, ix
, value
)
1682 pp
->expression (value
);
1683 if (ix
!= vec_safe_length (v
) - 1)
1684 pp_separate_with (pp
, ',');
1688 /* Print out an expression-list in parens, as if it were the argument
1689 list to a function. */
1692 pp_c_call_argument_list (c_pretty_printer
*pp
, tree t
)
1694 pp_c_left_paren (pp
);
1695 if (t
&& TREE_CODE (t
) == TREE_LIST
)
1696 pp_c_expression_list (pp
, t
);
1697 pp_c_right_paren (pp
);
1700 /* unary-expression:
1704 unary-operator cast-expression
1705 sizeof unary-expression
1708 unary-operator: one of
1713 __alignof__ unary-expression
1714 __alignof__ ( type-id )
1715 __real__ unary-expression
1716 __imag__ unary-expression */
1719 c_pretty_printer::unary_expression (tree e
)
1721 enum tree_code code
= TREE_CODE (e
);
1724 case PREINCREMENT_EXPR
:
1725 case PREDECREMENT_EXPR
:
1726 pp_string (this, code
== PREINCREMENT_EXPR
? "++" : "--");
1727 unary_expression (TREE_OPERAND (e
, 0));
1734 case TRUTH_NOT_EXPR
:
1736 /* String literal are used by address. */
1737 if (code
== ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (e
, 0)) != STRING_CST
)
1738 pp_ampersand (this);
1739 else if (code
== INDIRECT_REF
)
1741 tree type
= TREE_TYPE (TREE_OPERAND (e
, 0));
1742 if (type
&& TREE_CODE (type
) == REFERENCE_TYPE
)
1743 /* Reference decay is implicit, don't print anything. */;
1747 else if (code
== NEGATE_EXPR
)
1749 else if (code
== BIT_NOT_EXPR
|| code
== CONJ_EXPR
)
1750 pp_complement (this);
1751 else if (code
== TRUTH_NOT_EXPR
)
1752 pp_exclamation (this);
1753 pp_c_cast_expression (this, TREE_OPERAND (e
, 0));
1757 if (TREE_CODE (TREE_OPERAND (e
, 0)) == ADDR_EXPR
1758 && integer_zerop (TREE_OPERAND (e
, 1)))
1759 expression (TREE_OPERAND (TREE_OPERAND (e
, 0), 0));
1763 if (!integer_zerop (TREE_OPERAND (e
, 1)))
1765 pp_c_left_paren (this);
1766 if (!integer_onep (TYPE_SIZE_UNIT
1767 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (e
, 0))))))
1768 pp_c_type_cast (this, ptr_type_node
);
1770 pp_c_cast_expression (this, TREE_OPERAND (e
, 0));
1771 if (!integer_zerop (TREE_OPERAND (e
, 1)))
1774 pp_c_integer_constant (this,
1775 fold_convert (ssizetype
,
1776 TREE_OPERAND (e
, 1)));
1777 pp_c_right_paren (this);
1784 pp_c_ws_string (this, code
== REALPART_EXPR
? "__real__" : "__imag__");
1785 pp_c_whitespace (this);
1786 unary_expression (TREE_OPERAND (e
, 0));
1790 postfix_expression (e
);
1797 ( type-name ) cast-expression */
1800 pp_c_cast_expression (c_pretty_printer
*pp
, tree e
)
1802 switch (TREE_CODE (e
))
1805 case FIX_TRUNC_EXPR
:
1807 case VIEW_CONVERT_EXPR
:
1808 pp_c_type_cast (pp
, TREE_TYPE (e
));
1809 pp_c_cast_expression (pp
, TREE_OPERAND (e
, 0));
1813 pp
->unary_expression (e
);
1817 /* multiplicative-expression:
1819 multiplicative-expression * cast-expression
1820 multiplicative-expression / cast-expression
1821 multiplicative-expression % cast-expression */
1824 c_pretty_printer::multiplicative_expression (tree e
)
1826 enum tree_code code
= TREE_CODE (e
);
1830 case TRUNC_DIV_EXPR
:
1831 case TRUNC_MOD_EXPR
:
1832 multiplicative_expression (TREE_OPERAND (e
, 0));
1833 pp_c_whitespace (this);
1834 if (code
== MULT_EXPR
)
1836 else if (code
== TRUNC_DIV_EXPR
)
1840 pp_c_whitespace (this);
1841 pp_c_cast_expression (this, TREE_OPERAND (e
, 1));
1845 pp_c_cast_expression (this, e
);
1850 /* additive-expression:
1851 multiplicative-expression
1852 additive-expression + multiplicative-expression
1853 additive-expression - multiplicative-expression */
1856 pp_c_additive_expression (c_pretty_printer
*pp
, tree e
)
1858 enum tree_code code
= TREE_CODE (e
);
1861 case POINTER_PLUS_EXPR
:
1864 pp_c_additive_expression (pp
, TREE_OPERAND (e
, 0));
1865 pp_c_whitespace (pp
);
1866 if (code
== PLUS_EXPR
|| code
== POINTER_PLUS_EXPR
)
1870 pp_c_whitespace (pp
);
1871 pp
->multiplicative_expression (TREE_OPERAND (e
, 1));
1875 pp
->multiplicative_expression (e
);
1880 /* additive-expression:
1882 shift-expression << additive-expression
1883 shift-expression >> additive-expression */
1886 pp_c_shift_expression (c_pretty_printer
*pp
, tree e
)
1888 enum tree_code code
= TREE_CODE (e
);
1893 pp_c_shift_expression (pp
, TREE_OPERAND (e
, 0));
1894 pp_c_whitespace (pp
);
1895 pp_string (pp
, code
== LSHIFT_EXPR
? "<<" : ">>");
1896 pp_c_whitespace (pp
);
1897 pp_c_additive_expression (pp
, TREE_OPERAND (e
, 1));
1901 pp_c_additive_expression (pp
, e
);
1905 /* relational-expression:
1907 relational-expression < shift-expression
1908 relational-expression > shift-expression
1909 relational-expression <= shift-expression
1910 relational-expression >= shift-expression */
1913 pp_c_relational_expression (c_pretty_printer
*pp
, tree e
)
1915 enum tree_code code
= TREE_CODE (e
);
1922 pp_c_relational_expression (pp
, TREE_OPERAND (e
, 0));
1923 pp_c_whitespace (pp
);
1924 if (code
== LT_EXPR
)
1926 else if (code
== GT_EXPR
)
1928 else if (code
== LE_EXPR
)
1930 else if (code
== GE_EXPR
)
1931 pp_greater_equal (pp
);
1932 pp_c_whitespace (pp
);
1933 pp_c_shift_expression (pp
, TREE_OPERAND (e
, 1));
1937 pp_c_shift_expression (pp
, e
);
1942 /* equality-expression:
1943 relational-expression
1944 equality-expression == relational-expression
1945 equality-equality != relational-expression */
1948 pp_c_equality_expression (c_pretty_printer
*pp
, tree e
)
1950 enum tree_code code
= TREE_CODE (e
);
1955 pp_c_equality_expression (pp
, TREE_OPERAND (e
, 0));
1956 pp_c_whitespace (pp
);
1957 pp_string (pp
, code
== EQ_EXPR
? "==" : "!=");
1958 pp_c_whitespace (pp
);
1959 pp_c_relational_expression (pp
, TREE_OPERAND (e
, 1));
1963 pp_c_relational_expression (pp
, e
);
1970 AND-expression & equality-equality */
1973 pp_c_and_expression (c_pretty_printer
*pp
, tree e
)
1975 if (TREE_CODE (e
) == BIT_AND_EXPR
)
1977 pp_c_and_expression (pp
, TREE_OPERAND (e
, 0));
1978 pp_c_whitespace (pp
);
1980 pp_c_whitespace (pp
);
1981 pp_c_equality_expression (pp
, TREE_OPERAND (e
, 1));
1984 pp_c_equality_expression (pp
, e
);
1987 /* exclusive-OR-expression:
1989 exclusive-OR-expression ^ AND-expression */
1992 pp_c_exclusive_or_expression (c_pretty_printer
*pp
, tree e
)
1994 if (TREE_CODE (e
) == BIT_XOR_EXPR
1995 || TREE_CODE (e
) == TRUTH_XOR_EXPR
)
1997 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 0));
1998 if (TREE_CODE (e
) == BIT_XOR_EXPR
)
1999 pp_c_maybe_whitespace (pp
);
2001 pp_c_whitespace (pp
);
2003 pp_c_whitespace (pp
);
2004 pp_c_and_expression (pp
, TREE_OPERAND (e
, 1));
2007 pp_c_and_expression (pp
, e
);
2010 /* inclusive-OR-expression:
2011 exclusive-OR-expression
2012 inclusive-OR-expression | exclusive-OR-expression */
2015 pp_c_inclusive_or_expression (c_pretty_printer
*pp
, tree e
)
2017 if (TREE_CODE (e
) == BIT_IOR_EXPR
)
2019 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 0));
2020 pp_c_whitespace (pp
);
2022 pp_c_whitespace (pp
);
2023 pp_c_exclusive_or_expression (pp
, TREE_OPERAND (e
, 1));
2026 pp_c_exclusive_or_expression (pp
, e
);
2029 /* logical-AND-expression:
2030 inclusive-OR-expression
2031 logical-AND-expression && inclusive-OR-expression */
2034 pp_c_logical_and_expression (c_pretty_printer
*pp
, tree e
)
2036 if (TREE_CODE (e
) == TRUTH_ANDIF_EXPR
2037 || TREE_CODE (e
) == TRUTH_AND_EXPR
)
2039 pp_c_logical_and_expression (pp
, TREE_OPERAND (e
, 0));
2040 pp_c_whitespace (pp
);
2041 pp_ampersand_ampersand (pp
);
2042 pp_c_whitespace (pp
);
2043 pp_c_inclusive_or_expression (pp
, TREE_OPERAND (e
, 1));
2046 pp_c_inclusive_or_expression (pp
, e
);
2049 /* logical-OR-expression:
2050 logical-AND-expression
2051 logical-OR-expression || logical-AND-expression */
2054 pp_c_logical_or_expression (c_pretty_printer
*pp
, tree e
)
2056 if (TREE_CODE (e
) == TRUTH_ORIF_EXPR
2057 || TREE_CODE (e
) == TRUTH_OR_EXPR
)
2059 pp_c_logical_or_expression (pp
, TREE_OPERAND (e
, 0));
2060 pp_c_whitespace (pp
);
2062 pp_c_whitespace (pp
);
2063 pp_c_logical_and_expression (pp
, TREE_OPERAND (e
, 1));
2066 pp_c_logical_and_expression (pp
, e
);
2069 /* conditional-expression:
2070 logical-OR-expression
2071 logical-OR-expression ? expression : conditional-expression */
2074 c_pretty_printer::conditional_expression (tree e
)
2076 if (TREE_CODE (e
) == COND_EXPR
)
2078 pp_c_logical_or_expression (this, TREE_OPERAND (e
, 0));
2079 pp_c_whitespace (this);
2081 pp_c_whitespace (this);
2082 expression (TREE_OPERAND (e
, 1));
2083 pp_c_whitespace (this);
2085 pp_c_whitespace (this);
2086 conditional_expression (TREE_OPERAND (e
, 2));
2089 pp_c_logical_or_expression (this, e
);
2093 /* assignment-expression:
2094 conditional-expression
2095 unary-expression assignment-operator assignment-expression
2097 assignment-expression: one of
2098 = *= /= %= += -= >>= <<= &= ^= |= */
2101 c_pretty_printer::assignment_expression (tree e
)
2103 if (TREE_CODE (e
) == MODIFY_EXPR
2104 || TREE_CODE (e
) == INIT_EXPR
)
2106 unary_expression (TREE_OPERAND (e
, 0));
2107 pp_c_whitespace (this);
2110 expression (TREE_OPERAND (e
, 1));
2113 conditional_expression (e
);
2117 assignment-expression
2118 expression , assignment-expression
2120 Implementation note: instead of going through the usual recursion
2121 chain, I take the liberty of dispatching nodes to the appropriate
2122 functions. This makes some redundancy, but it worths it. That also
2123 prevents a possible infinite recursion between primary_expression ()
2124 and expression (). */
2127 c_pretty_printer::expression (tree e
)
2129 switch (TREE_CODE (e
))
2132 pp_c_void_constant (this);
2136 pp_c_integer_constant (this, e
);
2140 pp_c_floating_constant (this, e
);
2144 pp_c_fixed_constant (this, e
);
2148 pp_c_string_literal (this, e
);
2151 case IDENTIFIER_NODE
:
2160 primary_expression (e
);
2164 if (SSA_NAME_VAR (e
)
2165 && !DECL_ARTIFICIAL (SSA_NAME_VAR (e
)))
2166 expression (SSA_NAME_VAR (e
));
2168 translate_string ("<unknown>");
2171 case POSTINCREMENT_EXPR
:
2172 case POSTDECREMENT_EXPR
:
2174 case ARRAY_NOTATION_REF
:
2182 case UNORDERED_EXPR
:
2191 case COMPOUND_LITERAL_EXPR
:
2193 postfix_expression (e
);
2202 case TRUTH_NOT_EXPR
:
2203 case PREINCREMENT_EXPR
:
2204 case PREDECREMENT_EXPR
:
2207 unary_expression (e
);
2211 case FIX_TRUNC_EXPR
:
2213 case VIEW_CONVERT_EXPR
:
2214 pp_c_cast_expression (this, e
);
2218 case TRUNC_MOD_EXPR
:
2219 case TRUNC_DIV_EXPR
:
2220 multiplicative_expression (e
);
2225 pp_c_shift_expression (this, e
);
2232 pp_c_relational_expression (this, e
);
2236 pp_c_and_expression (this, e
);
2240 case TRUTH_XOR_EXPR
:
2241 pp_c_exclusive_or_expression (this, e
);
2245 pp_c_inclusive_or_expression (this, e
);
2248 case TRUTH_ANDIF_EXPR
:
2249 case TRUTH_AND_EXPR
:
2250 pp_c_logical_and_expression (this, e
);
2253 case TRUTH_ORIF_EXPR
:
2255 pp_c_logical_or_expression (this, e
);
2260 pp_c_equality_expression (this, e
);
2264 conditional_expression (e
);
2267 case POINTER_PLUS_EXPR
:
2270 pp_c_additive_expression (this, e
);
2275 assignment_expression (e
);
2279 pp_c_left_paren (this);
2280 expression (TREE_OPERAND (e
, 0));
2281 pp_separate_with (this, ',');
2282 assignment_expression (TREE_OPERAND (e
, 1));
2283 pp_c_right_paren (this);
2286 case NON_LVALUE_EXPR
:
2288 expression (TREE_OPERAND (e
, 0));
2292 postfix_expression (TREE_OPERAND (e
, 1));
2297 /* We don't yet have a way of dumping statements in a
2298 human-readable format. */
2299 pp_string (this, "({...})");
2302 case C_MAYBE_CONST_EXPR
:
2303 expression (C_MAYBE_CONST_EXPR_EXPR (e
));
2307 pp_unsupported_tree (this, e
);
2317 c_pretty_printer::statement (tree stmt
)
2322 if (pp_needs_newline (this))
2323 pp_newline_and_indent (this, 0);
2325 dump_generic_node (this, stmt
, pp_indentation (this), 0, true);
2329 /* Initialize the PRETTY-PRINTER for handling C codes. */
2331 c_pretty_printer::c_pretty_printer ()
2332 : pretty_printer (),
2336 type_specifier_seq
= pp_c_specifier_qualifier_list
;
2337 ptr_operator
= pp_c_pointer
;
2338 parameter_list
= pp_c_parameter_type_list
;
2342 /* Print the tree T in full, on file FILE. */
2345 print_c_tree (FILE *file
, tree t
)
2347 c_pretty_printer pp
;
2349 pp_needs_newline (&pp
) = true;
2350 pp
.buffer
->stream
= file
;
2352 pp_newline_and_flush (&pp
);
2355 /* Print the tree T in full, on stderr. */
2358 debug_c_tree (tree t
)
2360 print_c_tree (stderr
, t
);
2361 fputc ('\n', stderr
);
2364 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
2365 up of T's memory address. */
2368 pp_c_tree_decl_identifier (c_pretty_printer
*pp
, tree t
)
2372 gcc_assert (DECL_P (t
));
2375 name
= IDENTIFIER_POINTER (DECL_NAME (t
));
2378 static char xname
[8];
2379 sprintf (xname
, "<U%4hx>", ((unsigned short) ((uintptr_t) (t
)
2384 pp_c_identifier (pp
, name
);