Merge trunk version 195164 into gupc branch.
[official-gcc.git] / gcc / c-family / c-pretty-print.c
blob28aef84d5bbec4e8ed84f42adee664299ab0d3db
1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002-2013 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
10 version.
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
15 for more details.
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/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "intl.h"
27 #include "c-pretty-print.h"
28 #include "tree-pretty-print.h"
29 #include "tree-iterator.h"
30 #include "diagnostic.h"
32 /* Translate if being used for diagnostics, but not for dump files or
33 __PRETTY_FUNCTION. */
34 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
36 /* The pretty-printer code is primarily designed to closely follow
37 (GNU) C and C++ grammars. That is to be contrasted with spaghetti
38 codes we used to have in the past. Following a structured
39 approach (preferably the official grammars) is believed to make it
40 much easier to add extensions and nifty pretty-printing effects that
41 takes expression or declaration contexts into account. */
44 #define pp_c_maybe_whitespace(PP) \
45 do { \
46 if (pp_base (PP)->padding == pp_before) \
47 pp_c_whitespace (PP); \
48 } while (0)
50 /* literal */
51 static void pp_c_char (c_pretty_printer *, int);
53 /* postfix-expression */
54 static void pp_c_initializer_list (c_pretty_printer *, tree);
55 static void pp_c_brace_enclosed_initializer_list (c_pretty_printer *, tree);
57 static void pp_c_multiplicative_expression (c_pretty_printer *, tree);
58 static void pp_c_additive_expression (c_pretty_printer *, tree);
59 static void pp_c_shift_expression (c_pretty_printer *, tree);
60 static void pp_c_relational_expression (c_pretty_printer *, tree);
61 static void pp_c_equality_expression (c_pretty_printer *, tree);
62 static void pp_c_and_expression (c_pretty_printer *, tree);
63 static void pp_c_exclusive_or_expression (c_pretty_printer *, tree);
64 static void pp_c_inclusive_or_expression (c_pretty_printer *, tree);
65 static void pp_c_logical_and_expression (c_pretty_printer *, tree);
66 static void pp_c_conditional_expression (c_pretty_printer *, tree);
67 static void pp_c_assignment_expression (c_pretty_printer *, tree);
69 /* declarations. */
72 /* Helper functions. */
74 void
75 pp_c_whitespace (c_pretty_printer *pp)
77 pp_space (pp);
78 pp_base (pp)->padding = pp_none;
81 void
82 pp_c_left_paren (c_pretty_printer *pp)
84 pp_left_paren (pp);
85 pp_base (pp)->padding = pp_none;
88 void
89 pp_c_right_paren (c_pretty_printer *pp)
91 pp_right_paren (pp);
92 pp_base (pp)->padding = pp_none;
95 void
96 pp_c_left_brace (c_pretty_printer *pp)
98 pp_left_brace (pp);
99 pp_base (pp)->padding = pp_none;
102 void
103 pp_c_right_brace (c_pretty_printer *pp)
105 pp_right_brace (pp);
106 pp_base (pp)->padding = pp_none;
109 void
110 pp_c_left_bracket (c_pretty_printer *pp)
112 pp_left_bracket (pp);
113 pp_base (pp)->padding = pp_none;
116 void
117 pp_c_right_bracket (c_pretty_printer *pp)
119 pp_right_bracket (pp);
120 pp_base (pp)->padding = pp_none;
123 void
124 pp_c_dot (c_pretty_printer *pp)
126 pp_dot (pp);
127 pp_base (pp)->padding = pp_none;
130 void
131 pp_c_ampersand (c_pretty_printer *pp)
133 pp_ampersand (pp);
134 pp_base (pp)->padding = pp_none;
137 void
138 pp_c_star (c_pretty_printer *pp)
140 pp_star (pp);
141 pp_base (pp)->padding = pp_none;
144 void
145 pp_c_arrow (c_pretty_printer *pp)
147 pp_arrow (pp);
148 pp_base (pp)->padding = pp_none;
151 void
152 pp_c_semicolon (c_pretty_printer *pp)
154 pp_semicolon (pp);
155 pp_base (pp)->padding = pp_none;
158 void
159 pp_c_complement (c_pretty_printer *pp)
161 pp_complement (pp);
162 pp_base (pp)->padding = pp_none;
165 void
166 pp_c_exclamation (c_pretty_printer *pp)
168 pp_exclamation (pp);
169 pp_base (pp)->padding = pp_none;
172 /* Print out the external representation of QUALIFIERS. */
174 void
175 pp_c_cv_qualifiers (c_pretty_printer *pp, int qualifiers, bool func_type)
177 const char *p = pp_last_position_in_text (pp);
178 bool previous = false;
180 if (!qualifiers)
181 return;
183 /* The C programming language does not have references, but it is much
184 simpler to handle those here rather than going through the same
185 logic in the C++ pretty-printer. */
186 if (p != NULL && (*p == '*' || *p == '&'))
187 pp_c_whitespace (pp);
189 if (qualifiers & TYPE_QUAL_CONST)
191 pp_c_ws_string (pp, func_type ? "__attribute__((const))" : "const");
192 previous = true;
195 if (qualifiers & TYPE_QUAL_VOLATILE)
197 if (previous)
198 pp_c_whitespace (pp);
199 pp_c_ws_string (pp, func_type ? "__attribute__((noreturn))" : "volatile");
200 previous = true;
203 if (qualifiers & TYPE_QUAL_RESTRICT)
205 if (previous)
206 pp_c_whitespace (pp);
207 pp_c_ws_string (pp, (flag_isoc99 && !c_dialect_cxx ()
208 ? "restrict" : "__restrict__"));
209 previous = true;
212 if (qualifiers & TYPE_QUAL_RELAXED)
214 if (previous)
215 pp_c_whitespace (pp);
216 pp_c_ws_string (pp, "relaxed");
217 previous = true;
220 if (qualifiers & TYPE_QUAL_STRICT)
222 if (previous)
223 pp_c_whitespace (pp);
224 pp_c_ws_string (pp, "strict");
225 previous = true;
228 if (qualifiers & TYPE_QUAL_SHARED)
230 if (previous)
231 pp_c_whitespace (pp);
232 pp_c_ws_string (pp, "shared");
233 previous = true;
238 /* Pretty-print T using the type-cast notation '( type-name )'. */
240 static void
241 pp_c_type_cast (c_pretty_printer *pp, tree t)
243 pp_c_left_paren (pp);
244 pp_type_id (pp, t);
245 pp_c_right_paren (pp);
248 /* We're about to pretty-print a pointer type as indicated by T.
249 Output a whitespace, if needed, preparing for subsequent output. */
251 void
252 pp_c_space_for_pointer_operator (c_pretty_printer *pp, tree t)
254 if (POINTER_TYPE_P (t))
256 tree pointee = strip_pointer_operator (TREE_TYPE (t));
257 if (TREE_CODE (pointee) != ARRAY_TYPE
258 && TREE_CODE (pointee) != FUNCTION_TYPE)
259 pp_c_whitespace (pp);
264 /* Declarations. */
266 /* C++ cv-qualifiers are called type-qualifiers in C. Print out the
267 cv-qualifiers of T. If T is a declaration then it is the cv-qualifier
268 of its type. Take care of possible extensions.
270 type-qualifier-list:
271 type-qualifier
272 type-qualifier-list type-qualifier
274 type-qualifier:
275 const
276 restrict -- C99
277 __restrict__ -- GNU C
278 address-space-qualifier -- GNU C
279 volatile
281 address-space-qualifier:
282 identifier -- GNU C */
284 void
285 pp_c_type_qualifier_list (c_pretty_printer *pp, tree t)
287 int qualifiers;
289 if (!t || t == error_mark_node)
290 return;
292 if (!TYPE_P (t))
293 t = TREE_TYPE (t);
295 qualifiers = TYPE_QUALS (t);
296 pp_c_cv_qualifiers (pp, qualifiers,
297 TREE_CODE (t) == FUNCTION_TYPE);
299 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (t)))
301 const char *as = c_addr_space_name (TYPE_ADDR_SPACE (t));
302 pp_c_identifier (pp, as);
306 /* pointer:
307 * type-qualifier-list(opt)
308 * type-qualifier-list(opt) pointer */
310 static void
311 pp_c_pointer (c_pretty_printer *pp, tree t)
313 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
314 t = TREE_TYPE (t);
315 switch (TREE_CODE (t))
317 case POINTER_TYPE:
318 /* It is easier to handle C++ reference types here. */
319 case REFERENCE_TYPE:
320 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
321 pp_c_pointer (pp, TREE_TYPE (t));
322 if (TREE_CODE (t) == POINTER_TYPE)
323 pp_c_star (pp);
324 else
325 pp_c_ampersand (pp);
326 pp_c_type_qualifier_list (pp, t);
327 break;
329 /* ??? This node is now in GENERIC and so shouldn't be here. But
330 we'll fix that later. */
331 case DECL_EXPR:
332 pp_declaration (pp, DECL_EXPR_DECL (t));
333 pp_needs_newline (pp) = true;
334 break;
336 default:
337 pp_unsupported_tree (pp, t);
341 /* type-specifier:
342 void
343 char
344 short
346 long
347 float
348 double
349 signed
350 unsigned
351 _Bool -- C99
352 _Complex -- C99
353 _Imaginary -- C99
354 struct-or-union-specifier
355 enum-specifier
356 typedef-name.
358 GNU extensions.
359 simple-type-specifier:
360 __complex__
361 __vector__ */
363 void
364 pp_c_type_specifier (c_pretty_printer *pp, tree t)
366 const enum tree_code code = TREE_CODE (t);
367 switch (code)
369 case ERROR_MARK:
370 pp_c_ws_string (pp, M_("<type-error>"));
371 break;
373 case IDENTIFIER_NODE:
374 pp_c_identifier (pp, IDENTIFIER_POINTER (t));
375 break;
377 case VOID_TYPE:
378 case BOOLEAN_TYPE:
379 case INTEGER_TYPE:
380 case REAL_TYPE:
381 case FIXED_POINT_TYPE:
382 if (TYPE_NAME (t))
384 t = TYPE_NAME (t);
385 pp_c_type_specifier (pp, t);
387 else
389 int prec = TYPE_PRECISION (t);
390 if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (t)))
391 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_SATURATING (t));
392 else
393 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
394 if (TYPE_NAME (t))
396 pp_c_type_specifier (pp, t);
397 if (TYPE_PRECISION (t) != prec)
399 pp_string (pp, ":");
400 pp_decimal_int (pp, prec);
403 else
405 switch (code)
407 case INTEGER_TYPE:
408 pp_string (pp, (TYPE_UNSIGNED (t)
409 ? M_("<unnamed-unsigned:")
410 : M_("<unnamed-signed:")));
411 break;
412 case REAL_TYPE:
413 pp_string (pp, M_("<unnamed-float:"));
414 break;
415 case FIXED_POINT_TYPE:
416 pp_string (pp, M_("<unnamed-fixed:"));
417 break;
418 default:
419 gcc_unreachable ();
421 pp_decimal_int (pp, prec);
422 pp_string (pp, ">");
425 break;
427 case TYPE_DECL:
428 if (DECL_NAME (t))
429 pp_id_expression (pp, t);
430 else
431 pp_c_ws_string (pp, M_("<typedef-error>"));
432 break;
434 case UNION_TYPE:
435 case RECORD_TYPE:
436 case ENUMERAL_TYPE:
437 if (code == UNION_TYPE)
438 pp_c_ws_string (pp, "union");
439 else if (code == RECORD_TYPE)
440 pp_c_ws_string (pp, "struct");
441 else if (code == ENUMERAL_TYPE)
442 pp_c_ws_string (pp, "enum");
443 else
444 pp_c_ws_string (pp, M_("<tag-error>"));
446 if (TYPE_NAME (t))
447 pp_id_expression (pp, TYPE_NAME (t));
448 else
449 pp_c_ws_string (pp, M_("<anonymous>"));
450 break;
452 default:
453 pp_unsupported_tree (pp, t);
454 break;
458 /* specifier-qualifier-list:
459 type-specifier specifier-qualifier-list-opt
460 type-qualifier specifier-qualifier-list-opt
463 Implementation note: Because of the non-linearities in array or
464 function declarations, this routine prints not just the
465 specifier-qualifier-list of such entities or types of such entities,
466 but also the 'pointer' production part of their declarators. The
467 remaining part is done by pp_declarator or pp_c_abstract_declarator. */
469 void
470 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
472 const enum tree_code code = TREE_CODE (t);
474 if (!(pp->flags & pp_c_flag_gnu_v3) && code != POINTER_TYPE)
475 pp_c_type_qualifier_list (pp, t);
476 switch (code)
478 case REFERENCE_TYPE:
479 case POINTER_TYPE:
481 /* Get the types-specifier of this type. */
482 tree pointee = strip_pointer_operator (TREE_TYPE (t));
483 pp_c_specifier_qualifier_list (pp, pointee);
484 if (TREE_CODE (pointee) == ARRAY_TYPE
485 || TREE_CODE (pointee) == FUNCTION_TYPE)
487 pp_c_whitespace (pp);
488 pp_c_left_paren (pp);
489 pp_c_attributes_display (pp, TYPE_ATTRIBUTES (pointee));
491 else if (!c_dialect_cxx ())
492 pp_c_whitespace (pp);
493 pp_ptr_operator (pp, t);
495 break;
497 case FUNCTION_TYPE:
498 case ARRAY_TYPE:
499 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
500 break;
502 case VECTOR_TYPE:
503 case COMPLEX_TYPE:
504 if (code == COMPLEX_TYPE)
505 pp_c_ws_string (pp, (flag_isoc99 && !c_dialect_cxx ()
506 ? "_Complex" : "__complex__"));
507 else if (code == VECTOR_TYPE)
509 pp_c_ws_string (pp, "__vector");
510 pp_c_left_paren (pp);
511 pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (t));
512 pp_c_right_paren (pp);
513 pp_c_whitespace (pp);
515 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
516 break;
518 default:
519 pp_simple_type_specifier (pp, t);
520 break;
522 if ((pp->flags & pp_c_flag_gnu_v3) && code != POINTER_TYPE)
523 pp_c_type_qualifier_list (pp, t);
526 /* parameter-type-list:
527 parameter-list
528 parameter-list , ...
530 parameter-list:
531 parameter-declaration
532 parameter-list , parameter-declaration
534 parameter-declaration:
535 declaration-specifiers declarator
536 declaration-specifiers abstract-declarator(opt) */
538 void
539 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
541 bool want_parm_decl = DECL_P (t) && !(pp->flags & pp_c_flag_abstract);
542 tree parms = want_parm_decl ? DECL_ARGUMENTS (t) : TYPE_ARG_TYPES (t);
543 pp_c_left_paren (pp);
544 if (parms == void_list_node)
545 pp_c_ws_string (pp, "void");
546 else
548 bool first = true;
549 for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
551 if (!first)
552 pp_separate_with (pp, ',');
553 first = false;
554 pp_declaration_specifiers
555 (pp, want_parm_decl ? parms : TREE_VALUE (parms));
556 if (want_parm_decl)
557 pp_declarator (pp, parms);
558 else
559 pp_abstract_declarator (pp, TREE_VALUE (parms));
562 pp_c_right_paren (pp);
565 /* abstract-declarator:
566 pointer
567 pointer(opt) direct-abstract-declarator */
569 static void
570 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
572 if (TREE_CODE (t) == POINTER_TYPE)
574 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
575 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
576 pp_c_right_paren (pp);
577 t = TREE_TYPE (t);
580 pp_direct_abstract_declarator (pp, t);
583 /* direct-abstract-declarator:
584 ( abstract-declarator )
585 direct-abstract-declarator(opt) [ assignment-expression(opt) ]
586 direct-abstract-declarator(opt) [ * ]
587 direct-abstract-declarator(opt) ( parameter-type-list(opt) ) */
589 void
590 pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
592 switch (TREE_CODE (t))
594 case POINTER_TYPE:
595 pp_abstract_declarator (pp, t);
596 break;
598 case FUNCTION_TYPE:
599 pp_c_parameter_type_list (pp, t);
600 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
601 break;
603 case ARRAY_TYPE:
604 pp_c_left_bracket (pp);
605 if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
607 tree maxval = TYPE_MAX_VALUE (TYPE_DOMAIN (t));
608 tree type = TREE_TYPE (maxval);
610 if (host_integerp (maxval, 0))
611 pp_wide_integer (pp, tree_low_cst (maxval, 0) + 1);
612 else
613 pp_expression (pp, fold_build2 (PLUS_EXPR, type, maxval,
614 build_int_cst (type, 1)));
616 pp_c_right_bracket (pp);
617 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
618 break;
620 case IDENTIFIER_NODE:
621 case VOID_TYPE:
622 case BOOLEAN_TYPE:
623 case INTEGER_TYPE:
624 case REAL_TYPE:
625 case FIXED_POINT_TYPE:
626 case ENUMERAL_TYPE:
627 case RECORD_TYPE:
628 case UNION_TYPE:
629 case VECTOR_TYPE:
630 case COMPLEX_TYPE:
631 case TYPE_DECL:
632 break;
634 default:
635 pp_unsupported_tree (pp, t);
636 break;
640 /* type-name:
641 specifier-qualifier-list abstract-declarator(opt) */
643 void
644 pp_c_type_id (c_pretty_printer *pp, tree t)
646 pp_c_specifier_qualifier_list (pp, t);
647 pp_abstract_declarator (pp, t);
650 /* storage-class-specifier:
651 typedef
652 extern
653 static
654 auto
655 register */
657 void
658 pp_c_storage_class_specifier (c_pretty_printer *pp, tree t)
660 if (TREE_CODE (t) == TYPE_DECL)
661 pp_c_ws_string (pp, "typedef");
662 else if (DECL_P (t))
664 if (DECL_REGISTER (t))
665 pp_c_ws_string (pp, "register");
666 else if (TREE_STATIC (t) && TREE_CODE (t) == VAR_DECL)
667 pp_c_ws_string (pp, "static");
671 /* function-specifier:
672 inline */
674 void
675 pp_c_function_specifier (c_pretty_printer *pp, tree t)
677 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
678 pp_c_ws_string (pp, "inline");
681 /* declaration-specifiers:
682 storage-class-specifier declaration-specifiers(opt)
683 type-specifier declaration-specifiers(opt)
684 type-qualifier declaration-specifiers(opt)
685 function-specifier declaration-specifiers(opt) */
687 void
688 pp_c_declaration_specifiers (c_pretty_printer *pp, tree t)
690 pp_storage_class_specifier (pp, t);
691 pp_function_specifier (pp, t);
692 pp_c_specifier_qualifier_list (pp, DECL_P (t) ? TREE_TYPE (t) : t);
695 /* direct-declarator
696 identifier
697 ( declarator )
698 direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
699 direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
700 direct-declarator [ type-qualifier-list static assignment-expression ]
701 direct-declarator [ type-qualifier-list * ]
702 direct-declarator ( parameter-type-list )
703 direct-declarator ( identifier-list(opt) ) */
705 void
706 pp_c_direct_declarator (c_pretty_printer *pp, tree t)
708 switch (TREE_CODE (t))
710 case VAR_DECL:
711 case PARM_DECL:
712 case TYPE_DECL:
713 case FIELD_DECL:
714 case LABEL_DECL:
715 pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
716 pp_c_tree_decl_identifier (pp, t);
717 break;
719 case ARRAY_TYPE:
720 case POINTER_TYPE:
721 pp_abstract_declarator (pp, TREE_TYPE (t));
722 break;
724 case FUNCTION_TYPE:
725 pp_parameter_list (pp, t);
726 pp_abstract_declarator (pp, TREE_TYPE (t));
727 break;
729 case FUNCTION_DECL:
730 pp_c_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
731 pp_c_tree_decl_identifier (pp, t);
732 if (pp_c_base (pp)->flags & pp_c_flag_abstract)
733 pp_abstract_declarator (pp, TREE_TYPE (t));
734 else
736 pp_parameter_list (pp, t);
737 pp_abstract_declarator (pp, TREE_TYPE (TREE_TYPE (t)));
739 break;
741 case INTEGER_TYPE:
742 case REAL_TYPE:
743 case FIXED_POINT_TYPE:
744 case ENUMERAL_TYPE:
745 case UNION_TYPE:
746 case RECORD_TYPE:
747 break;
749 default:
750 pp_unsupported_tree (pp, t);
751 break;
756 /* declarator:
757 pointer(opt) direct-declarator */
759 void
760 pp_c_declarator (c_pretty_printer *pp, tree t)
762 switch (TREE_CODE (t))
764 case INTEGER_TYPE:
765 case REAL_TYPE:
766 case FIXED_POINT_TYPE:
767 case ENUMERAL_TYPE:
768 case UNION_TYPE:
769 case RECORD_TYPE:
770 break;
772 case VAR_DECL:
773 case PARM_DECL:
774 case FIELD_DECL:
775 case ARRAY_TYPE:
776 case FUNCTION_TYPE:
777 case FUNCTION_DECL:
778 case TYPE_DECL:
779 pp_direct_declarator (pp, t);
780 break;
783 default:
784 pp_unsupported_tree (pp, t);
785 break;
789 /* declaration:
790 declaration-specifiers init-declarator-list(opt) ; */
792 void
793 pp_c_declaration (c_pretty_printer *pp, tree t)
795 pp_declaration_specifiers (pp, t);
796 pp_c_init_declarator (pp, t);
799 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
801 void
802 pp_c_attributes (c_pretty_printer *pp, tree attributes)
804 if (attributes == NULL_TREE)
805 return;
807 pp_c_ws_string (pp, "__attribute__");
808 pp_c_left_paren (pp);
809 pp_c_left_paren (pp);
810 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
812 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
813 if (TREE_VALUE (attributes))
814 pp_c_call_argument_list (pp, TREE_VALUE (attributes));
816 if (TREE_CHAIN (attributes))
817 pp_separate_with (pp, ',');
819 pp_c_right_paren (pp);
820 pp_c_right_paren (pp);
823 /* Pretty-print ATTRIBUTES using GNU C extension syntax for attributes
824 marked to be displayed on disgnostic. */
826 void
827 pp_c_attributes_display (c_pretty_printer *pp, tree a)
829 bool is_first = true;
831 if (a == NULL_TREE)
832 return;
834 for (; a != NULL_TREE; a = TREE_CHAIN (a))
836 const struct attribute_spec *as;
837 as = lookup_attribute_spec (TREE_PURPOSE (a));
838 if (!as || as->affects_type_identity == false)
839 continue;
840 if (is_first)
842 pp_c_ws_string (pp, "__attribute__");
843 pp_c_left_paren (pp);
844 pp_c_left_paren (pp);
845 is_first = false;
847 else
849 pp_separate_with (pp, ',');
851 pp_tree_identifier (pp, TREE_PURPOSE (a));
852 if (TREE_VALUE (a))
853 pp_c_call_argument_list (pp, TREE_VALUE (a));
856 if (!is_first)
858 pp_c_right_paren (pp);
859 pp_c_right_paren (pp);
860 pp_c_whitespace (pp);
864 /* function-definition:
865 declaration-specifiers declarator compound-statement */
867 void
868 pp_c_function_definition (c_pretty_printer *pp, tree t)
870 pp_declaration_specifiers (pp, t);
871 pp_declarator (pp, t);
872 pp_needs_newline (pp) = true;
873 pp_statement (pp, DECL_SAVED_TREE (t));
874 pp_newline_and_flush (pp);
878 /* Expressions. */
880 /* Print out a c-char. This is called solely for characters which are
881 in the *target* execution character set. We ought to convert them
882 back to the *host* execution character set before printing, but we
883 have no way to do this at present. A decent compromise is to print
884 all characters as if they were in the host execution character set,
885 and not attempt to recover any named escape characters, but render
886 all unprintables as octal escapes. If the host and target character
887 sets are the same, this produces relatively readable output. If they
888 are not the same, strings may appear as gibberish, but that's okay
889 (in fact, it may well be what the reader wants, e.g. if they are looking
890 to see if conversion to the target character set happened correctly).
892 A special case: we need to prefix \, ", and ' with backslashes. It is
893 correct to do so for the *host*'s \, ", and ', because the rest of the
894 file appears in the host character set. */
896 static void
897 pp_c_char (c_pretty_printer *pp, int c)
899 if (ISPRINT (c))
901 switch (c)
903 case '\\': pp_string (pp, "\\\\"); break;
904 case '\'': pp_string (pp, "\\\'"); break;
905 case '\"': pp_string (pp, "\\\""); break;
906 default: pp_character (pp, c);
909 else
910 pp_scalar (pp, "\\%03o", (unsigned) c);
913 /* Print out a STRING literal. */
915 void
916 pp_c_string_literal (c_pretty_printer *pp, tree s)
918 const char *p = TREE_STRING_POINTER (s);
919 int n = TREE_STRING_LENGTH (s) - 1;
920 int i;
921 pp_doublequote (pp);
922 for (i = 0; i < n; ++i)
923 pp_c_char (pp, p[i]);
924 pp_doublequote (pp);
927 /* Pretty-print an INTEGER literal. */
929 static void
930 pp_c_integer_constant (c_pretty_printer *pp, tree i)
932 /* We are going to compare the type of I to other types using
933 pointer comparison so we need to use its canonical type. */
934 tree type =
935 TYPE_CANONICAL (TREE_TYPE (i))
936 ? TYPE_CANONICAL (TREE_TYPE (i))
937 : TREE_TYPE (i);
939 if (host_integerp (i, 0))
940 pp_wide_integer (pp, TREE_INT_CST_LOW (i));
941 else if (host_integerp (i, 1))
942 pp_unsigned_wide_integer (pp, TREE_INT_CST_LOW (i));
943 else
945 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (i);
946 HOST_WIDE_INT high = TREE_INT_CST_HIGH (i);
947 if (tree_int_cst_sgn (i) < 0)
949 pp_character (pp, '-');
950 high = ~high + !low;
951 low = -low;
953 sprintf (pp_buffer (pp)->digit_buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
954 (unsigned HOST_WIDE_INT) high, (unsigned HOST_WIDE_INT) low);
955 pp_string (pp, pp_buffer (pp)->digit_buffer);
957 if (TYPE_UNSIGNED (type))
958 pp_character (pp, 'u');
959 if (type == long_integer_type_node || type == long_unsigned_type_node)
960 pp_character (pp, 'l');
961 else if (type == long_long_integer_type_node
962 || type == long_long_unsigned_type_node)
963 pp_string (pp, "ll");
964 else if (type == int128_integer_type_node
965 || type == int128_unsigned_type_node)
966 pp_string (pp, "I128");
969 /* Print out a CHARACTER literal. */
971 static void
972 pp_c_character_constant (c_pretty_printer *pp, tree c)
974 tree type = TREE_TYPE (c);
975 if (type == wchar_type_node)
976 pp_character (pp, 'L');
977 pp_quote (pp);
978 if (host_integerp (c, TYPE_UNSIGNED (type)))
979 pp_c_char (pp, tree_low_cst (c, TYPE_UNSIGNED (type)));
980 else
981 pp_scalar (pp, "\\x%x", (unsigned) TREE_INT_CST_LOW (c));
982 pp_quote (pp);
985 /* Print out a BOOLEAN literal. */
987 static void
988 pp_c_bool_constant (c_pretty_printer *pp, tree b)
990 if (b == boolean_false_node)
992 if (c_dialect_cxx ())
993 pp_c_ws_string (pp, "false");
994 else if (flag_isoc99)
995 pp_c_ws_string (pp, "_False");
996 else
997 pp_unsupported_tree (pp, b);
999 else if (b == boolean_true_node)
1001 if (c_dialect_cxx ())
1002 pp_c_ws_string (pp, "true");
1003 else if (flag_isoc99)
1004 pp_c_ws_string (pp, "_True");
1005 else
1006 pp_unsupported_tree (pp, b);
1008 else if (TREE_CODE (b) == INTEGER_CST)
1009 pp_c_integer_constant (pp, b);
1010 else
1011 pp_unsupported_tree (pp, b);
1014 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
1015 false; that means the value was obtained by a cast, in which case
1016 print out the type-id part of the cast-expression -- the casted value
1017 is then printed by pp_c_integer_literal. */
1019 static bool
1020 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
1022 bool value_is_named = true;
1023 tree type = TREE_TYPE (e);
1024 tree value;
1026 /* Find the name of this constant. */
1027 for (value = TYPE_VALUES (type);
1028 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
1029 value = TREE_CHAIN (value))
1032 if (value != NULL_TREE)
1033 pp_id_expression (pp, TREE_PURPOSE (value));
1034 else
1036 /* Value must have been cast. */
1037 pp_c_type_cast (pp, type);
1038 value_is_named = false;
1041 return value_is_named;
1044 /* Print out a REAL value as a decimal-floating-constant. */
1046 static void
1047 pp_c_floating_constant (c_pretty_printer *pp, tree r)
1049 const struct real_format *fmt
1050 = REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (r)));
1052 REAL_VALUE_TYPE floating_cst = TREE_REAL_CST (r);
1053 bool is_decimal = floating_cst.decimal;
1055 /* See ISO C++ WG N1822. Note: The fraction 643/2136 approximates
1056 log10(2) to 7 significant digits. */
1057 int max_digits10 = 2 + (is_decimal ? fmt->p : fmt->p * 643L / 2136);
1059 real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
1060 sizeof (pp_buffer (pp)->digit_buffer),
1061 max_digits10, 1);
1063 pp_string (pp, pp_buffer(pp)->digit_buffer);
1064 if (TREE_TYPE (r) == float_type_node)
1065 pp_character (pp, 'f');
1066 else if (TREE_TYPE (r) == long_double_type_node)
1067 pp_character (pp, 'l');
1068 else if (TREE_TYPE (r) == dfloat128_type_node)
1069 pp_string (pp, "dl");
1070 else if (TREE_TYPE (r) == dfloat64_type_node)
1071 pp_string (pp, "dd");
1072 else if (TREE_TYPE (r) == dfloat32_type_node)
1073 pp_string (pp, "df");
1076 /* Print out a FIXED value as a decimal-floating-constant. */
1078 static void
1079 pp_c_fixed_constant (c_pretty_printer *pp, tree r)
1081 fixed_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_FIXED_CST (r),
1082 sizeof (pp_buffer (pp)->digit_buffer));
1083 pp_string (pp, pp_buffer(pp)->digit_buffer);
1086 /* Pretty-print a compound literal expression. GNU extensions include
1087 vector constants. */
1089 static void
1090 pp_c_compound_literal (c_pretty_printer *pp, tree e)
1092 tree type = TREE_TYPE (e);
1093 pp_c_type_cast (pp, type);
1095 switch (TREE_CODE (type))
1097 case RECORD_TYPE:
1098 case UNION_TYPE:
1099 case ARRAY_TYPE:
1100 case VECTOR_TYPE:
1101 case COMPLEX_TYPE:
1102 pp_c_brace_enclosed_initializer_list (pp, e);
1103 break;
1105 default:
1106 pp_unsupported_tree (pp, e);
1107 break;
1111 /* Pretty-print a COMPLEX_EXPR expression. */
1113 static void
1114 pp_c_complex_expr (c_pretty_printer *pp, tree e)
1116 /* Handle a few common special cases, otherwise fallback
1117 to printing it as compound literal. */
1118 tree type = TREE_TYPE (e);
1119 tree realexpr = TREE_OPERAND (e, 0);
1120 tree imagexpr = TREE_OPERAND (e, 1);
1122 /* Cast of an COMPLEX_TYPE expression to a different COMPLEX_TYPE. */
1123 if (TREE_CODE (realexpr) == NOP_EXPR
1124 && TREE_CODE (imagexpr) == NOP_EXPR
1125 && TREE_TYPE (realexpr) == TREE_TYPE (type)
1126 && TREE_TYPE (imagexpr) == TREE_TYPE (type)
1127 && TREE_CODE (TREE_OPERAND (realexpr, 0)) == REALPART_EXPR
1128 && TREE_CODE (TREE_OPERAND (imagexpr, 0)) == IMAGPART_EXPR
1129 && TREE_OPERAND (TREE_OPERAND (realexpr, 0), 0)
1130 == TREE_OPERAND (TREE_OPERAND (imagexpr, 0), 0))
1132 pp_c_type_cast (pp, type);
1133 pp_expression (pp, TREE_OPERAND (TREE_OPERAND (realexpr, 0), 0));
1134 return;
1137 /* Cast of an scalar expression to COMPLEX_TYPE. */
1138 if ((integer_zerop (imagexpr) || real_zerop (imagexpr))
1139 && TREE_TYPE (realexpr) == TREE_TYPE (type))
1141 pp_c_type_cast (pp, type);
1142 if (TREE_CODE (realexpr) == NOP_EXPR)
1143 realexpr = TREE_OPERAND (realexpr, 0);
1144 pp_expression (pp, realexpr);
1145 return;
1148 pp_c_compound_literal (pp, e);
1151 /* constant:
1152 integer-constant
1153 floating-constant
1154 fixed-point-constant
1155 enumeration-constant
1156 character-constant */
1158 void
1159 pp_c_constant (c_pretty_printer *pp, tree e)
1161 const enum tree_code code = TREE_CODE (e);
1163 switch (code)
1165 case INTEGER_CST:
1167 tree type = TREE_TYPE (e);
1168 if (type == boolean_type_node)
1169 pp_c_bool_constant (pp, e);
1170 else if (type == char_type_node)
1171 pp_c_character_constant (pp, e);
1172 else if (TREE_CODE (type) == ENUMERAL_TYPE
1173 && pp_c_enumeration_constant (pp, e))
1175 else
1176 pp_c_integer_constant (pp, e);
1178 break;
1180 case REAL_CST:
1181 pp_c_floating_constant (pp, e);
1182 break;
1184 case FIXED_CST:
1185 pp_c_fixed_constant (pp, e);
1186 break;
1188 case STRING_CST:
1189 pp_c_string_literal (pp, e);
1190 break;
1192 case COMPLEX_CST:
1193 /* Sometimes, we are confused and we think a complex literal
1194 is a constant. Such thing is a compound literal which
1195 grammatically belongs to postfix-expr production. */
1196 pp_c_compound_literal (pp, e);
1197 break;
1199 default:
1200 pp_unsupported_tree (pp, e);
1201 break;
1205 /* Pretty-print a string such as an identifier, without changing its
1206 encoding, preceded by whitespace is necessary. */
1208 void
1209 pp_c_ws_string (c_pretty_printer *pp, const char *str)
1211 pp_c_maybe_whitespace (pp);
1212 pp_string (pp, str);
1213 pp_base (pp)->padding = pp_before;
1216 /* Pretty-print an IDENTIFIER_NODE, which may contain UTF-8 sequences
1217 that need converting to the locale encoding, preceded by whitespace
1218 is necessary. */
1220 void
1221 pp_c_identifier (c_pretty_printer *pp, const char *id)
1223 pp_c_maybe_whitespace (pp);
1224 pp_identifier (pp, id);
1225 pp_base (pp)->padding = pp_before;
1228 /* Pretty-print a C primary-expression.
1229 primary-expression:
1230 identifier
1231 constant
1232 string-literal
1233 ( expression ) */
1235 void
1236 pp_c_primary_expression (c_pretty_printer *pp, tree e)
1238 switch (TREE_CODE (e))
1240 case VAR_DECL:
1241 case PARM_DECL:
1242 case FIELD_DECL:
1243 case CONST_DECL:
1244 case FUNCTION_DECL:
1245 case LABEL_DECL:
1246 pp_c_tree_decl_identifier (pp, e);
1247 break;
1249 case IDENTIFIER_NODE:
1250 pp_c_tree_identifier (pp, e);
1251 break;
1253 case ERROR_MARK:
1254 pp_c_ws_string (pp, M_("<erroneous-expression>"));
1255 break;
1257 case RESULT_DECL:
1258 pp_c_ws_string (pp, M_("<return-value>"));
1259 break;
1261 case INTEGER_CST:
1262 case REAL_CST:
1263 case FIXED_CST:
1264 case STRING_CST:
1265 pp_c_constant (pp, e);
1266 break;
1268 case TARGET_EXPR:
1269 pp_c_ws_string (pp, "__builtin_memcpy");
1270 pp_c_left_paren (pp);
1271 pp_ampersand (pp);
1272 pp_primary_expression (pp, TREE_OPERAND (e, 0));
1273 pp_separate_with (pp, ',');
1274 pp_ampersand (pp);
1275 pp_initializer (pp, TREE_OPERAND (e, 1));
1276 if (TREE_OPERAND (e, 2))
1278 pp_separate_with (pp, ',');
1279 pp_c_expression (pp, TREE_OPERAND (e, 2));
1281 pp_c_right_paren (pp);
1282 break;
1284 default:
1285 /* FIXME: Make sure we won't get into an infinite loop. */
1286 pp_c_left_paren (pp);
1287 pp_expression (pp, e);
1288 pp_c_right_paren (pp);
1289 break;
1293 /* Print out a C initializer -- also support C compound-literals.
1294 initializer:
1295 assignment-expression:
1296 { initializer-list }
1297 { initializer-list , } */
1299 static void
1300 pp_c_initializer (c_pretty_printer *pp, tree e)
1302 if (TREE_CODE (e) == CONSTRUCTOR)
1303 pp_c_brace_enclosed_initializer_list (pp, e);
1304 else
1305 pp_expression (pp, e);
1308 /* init-declarator:
1309 declarator:
1310 declarator = initializer */
1312 void
1313 pp_c_init_declarator (c_pretty_printer *pp, tree t)
1315 pp_declarator (pp, t);
1316 /* We don't want to output function definitions here. There are handled
1317 elsewhere (and the syntactic form is bogus anyway). */
1318 if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
1320 tree init = DECL_INITIAL (t);
1321 /* This C++ bit is handled here because it is easier to do so.
1322 In templates, the C++ parser builds a TREE_LIST for a
1323 direct-initialization; the TREE_PURPOSE is the variable to
1324 initialize and the TREE_VALUE is the initializer. */
1325 if (TREE_CODE (init) == TREE_LIST)
1327 pp_c_left_paren (pp);
1328 pp_expression (pp, TREE_VALUE (init));
1329 pp_right_paren (pp);
1331 else
1333 pp_space (pp);
1334 pp_equal (pp);
1335 pp_space (pp);
1336 pp_c_initializer (pp, init);
1341 /* initializer-list:
1342 designation(opt) initializer
1343 initializer-list , designation(opt) initializer
1345 designation:
1346 designator-list =
1348 designator-list:
1349 designator
1350 designator-list designator
1352 designator:
1353 [ constant-expression ]
1354 identifier */
1356 static void
1357 pp_c_initializer_list (c_pretty_printer *pp, tree e)
1359 tree type = TREE_TYPE (e);
1360 const enum tree_code code = TREE_CODE (type);
1362 if (TREE_CODE (e) == CONSTRUCTOR)
1364 pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
1365 return;
1368 switch (code)
1370 case RECORD_TYPE:
1371 case UNION_TYPE:
1372 case ARRAY_TYPE:
1374 tree init = TREE_OPERAND (e, 0);
1375 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1377 if (code == RECORD_TYPE || code == UNION_TYPE)
1379 pp_c_dot (pp);
1380 pp_c_primary_expression (pp, TREE_PURPOSE (init));
1382 else
1384 pp_c_left_bracket (pp);
1385 if (TREE_PURPOSE (init))
1386 pp_c_constant (pp, TREE_PURPOSE (init));
1387 pp_c_right_bracket (pp);
1389 pp_c_whitespace (pp);
1390 pp_equal (pp);
1391 pp_c_whitespace (pp);
1392 pp_initializer (pp, TREE_VALUE (init));
1393 if (TREE_CHAIN (init))
1394 pp_separate_with (pp, ',');
1397 return;
1399 case VECTOR_TYPE:
1400 if (TREE_CODE (e) == VECTOR_CST)
1402 unsigned i;
1403 for (i = 0; i < VECTOR_CST_NELTS (e); ++i)
1405 if (i > 0)
1406 pp_separate_with (pp, ',');
1407 pp_expression (pp, VECTOR_CST_ELT (e, i));
1410 else
1411 break;
1412 return;
1414 case COMPLEX_TYPE:
1415 if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
1417 const bool cst = TREE_CODE (e) == COMPLEX_CST;
1418 pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
1419 pp_separate_with (pp, ',');
1420 pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
1422 else
1423 break;
1424 return;
1426 default:
1427 break;
1430 pp_unsupported_tree (pp, type);
1433 /* Pretty-print a brace-enclosed initializer-list. */
1435 static void
1436 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
1438 pp_c_left_brace (pp);
1439 pp_c_initializer_list (pp, l);
1440 pp_c_right_brace (pp);
1444 /* This is a convenient function, used to bridge gap between C and C++
1445 grammars.
1447 id-expression:
1448 identifier */
1450 void
1451 pp_c_id_expression (c_pretty_printer *pp, tree t)
1453 switch (TREE_CODE (t))
1455 case VAR_DECL:
1456 case PARM_DECL:
1457 case CONST_DECL:
1458 case TYPE_DECL:
1459 case FUNCTION_DECL:
1460 case FIELD_DECL:
1461 case LABEL_DECL:
1462 pp_c_tree_decl_identifier (pp, t);
1463 break;
1465 case IDENTIFIER_NODE:
1466 pp_c_tree_identifier (pp, t);
1467 break;
1469 default:
1470 pp_unsupported_tree (pp, t);
1471 break;
1475 /* postfix-expression:
1476 primary-expression
1477 postfix-expression [ expression ]
1478 postfix-expression ( argument-expression-list(opt) )
1479 postfix-expression . identifier
1480 postfix-expression -> identifier
1481 postfix-expression ++
1482 postfix-expression --
1483 ( type-name ) { initializer-list }
1484 ( type-name ) { initializer-list , } */
1486 void
1487 pp_c_postfix_expression (c_pretty_printer *pp, tree e)
1489 enum tree_code code = TREE_CODE (e);
1490 switch (code)
1492 case POSTINCREMENT_EXPR:
1493 case POSTDECREMENT_EXPR:
1494 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1495 pp_string (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
1496 break;
1498 case ARRAY_REF:
1499 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1500 pp_c_left_bracket (pp);
1501 pp_expression (pp, TREE_OPERAND (e, 1));
1502 pp_c_right_bracket (pp);
1503 break;
1505 case CALL_EXPR:
1507 call_expr_arg_iterator iter;
1508 tree arg;
1509 pp_postfix_expression (pp, CALL_EXPR_FN (e));
1510 pp_c_left_paren (pp);
1511 FOR_EACH_CALL_EXPR_ARG (arg, iter, e)
1513 pp_expression (pp, arg);
1514 if (more_call_expr_args_p (&iter))
1515 pp_separate_with (pp, ',');
1517 pp_c_right_paren (pp);
1518 break;
1521 case UNORDERED_EXPR:
1522 pp_c_ws_string (pp, flag_isoc99
1523 ? "isunordered"
1524 : "__builtin_isunordered");
1525 goto two_args_fun;
1527 case ORDERED_EXPR:
1528 pp_c_ws_string (pp, flag_isoc99
1529 ? "!isunordered"
1530 : "!__builtin_isunordered");
1531 goto two_args_fun;
1533 case UNLT_EXPR:
1534 pp_c_ws_string (pp, flag_isoc99
1535 ? "!isgreaterequal"
1536 : "!__builtin_isgreaterequal");
1537 goto two_args_fun;
1539 case UNLE_EXPR:
1540 pp_c_ws_string (pp, flag_isoc99
1541 ? "!isgreater"
1542 : "!__builtin_isgreater");
1543 goto two_args_fun;
1545 case UNGT_EXPR:
1546 pp_c_ws_string (pp, flag_isoc99
1547 ? "!islessequal"
1548 : "!__builtin_islessequal");
1549 goto two_args_fun;
1551 case UNGE_EXPR:
1552 pp_c_ws_string (pp, flag_isoc99
1553 ? "!isless"
1554 : "!__builtin_isless");
1555 goto two_args_fun;
1557 case UNEQ_EXPR:
1558 pp_c_ws_string (pp, flag_isoc99
1559 ? "!islessgreater"
1560 : "!__builtin_islessgreater");
1561 goto two_args_fun;
1563 case LTGT_EXPR:
1564 pp_c_ws_string (pp, flag_isoc99
1565 ? "islessgreater"
1566 : "__builtin_islessgreater");
1567 goto two_args_fun;
1569 two_args_fun:
1570 pp_c_left_paren (pp);
1571 pp_expression (pp, TREE_OPERAND (e, 0));
1572 pp_separate_with (pp, ',');
1573 pp_expression (pp, TREE_OPERAND (e, 1));
1574 pp_c_right_paren (pp);
1575 break;
1577 case ABS_EXPR:
1578 pp_c_ws_string (pp, "__builtin_abs");
1579 pp_c_left_paren (pp);
1580 pp_expression (pp, TREE_OPERAND (e, 0));
1581 pp_c_right_paren (pp);
1582 break;
1584 case COMPONENT_REF:
1586 tree object = TREE_OPERAND (e, 0);
1587 if (TREE_CODE (object) == INDIRECT_REF)
1589 pp_postfix_expression (pp, TREE_OPERAND (object, 0));
1590 pp_c_arrow (pp);
1592 else
1594 pp_postfix_expression (pp, object);
1595 pp_c_dot (pp);
1597 pp_expression (pp, TREE_OPERAND (e, 1));
1599 break;
1601 case BIT_FIELD_REF:
1603 tree type = TREE_TYPE (e);
1605 type = signed_or_unsigned_type_for (TYPE_UNSIGNED (type), type);
1606 if (type
1607 && tree_int_cst_equal (TYPE_SIZE (type), TREE_OPERAND (e, 1)))
1609 HOST_WIDE_INT bitpos = tree_low_cst (TREE_OPERAND (e, 2), 0);
1610 HOST_WIDE_INT size = tree_low_cst (TYPE_SIZE (type), 0);
1611 if ((bitpos % size) == 0)
1613 pp_c_left_paren (pp);
1614 pp_c_left_paren (pp);
1615 pp_type_id (pp, type);
1616 pp_c_star (pp);
1617 pp_c_right_paren (pp);
1618 pp_c_ampersand (pp);
1619 pp_expression (pp, TREE_OPERAND (e, 0));
1620 pp_c_right_paren (pp);
1621 pp_c_left_bracket (pp);
1622 pp_wide_integer (pp, bitpos / size);
1623 pp_c_right_bracket (pp);
1624 break;
1627 pp_unsupported_tree (pp, e);
1629 break;
1631 case MEM_REF:
1632 pp_c_expression (pp, e);
1633 break;
1635 case COMPLEX_CST:
1636 case VECTOR_CST:
1637 pp_c_compound_literal (pp, e);
1638 break;
1640 case COMPLEX_EXPR:
1641 pp_c_complex_expr (pp, e);
1642 break;
1644 case COMPOUND_LITERAL_EXPR:
1645 e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
1646 /* Fall through. */
1647 case CONSTRUCTOR:
1648 pp_initializer (pp, e);
1649 break;
1651 case VA_ARG_EXPR:
1652 pp_c_ws_string (pp, "__builtin_va_arg");
1653 pp_c_left_paren (pp);
1654 pp_assignment_expression (pp, TREE_OPERAND (e, 0));
1655 pp_separate_with (pp, ',');
1656 pp_type_id (pp, TREE_TYPE (e));
1657 pp_c_right_paren (pp);
1658 break;
1660 case ADDR_EXPR:
1661 if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
1663 pp_c_id_expression (pp, TREE_OPERAND (e, 0));
1664 break;
1666 /* else fall through. */
1668 default:
1669 pp_primary_expression (pp, e);
1670 break;
1674 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1676 void
1677 pp_c_expression_list (c_pretty_printer *pp, tree e)
1679 for (; e != NULL_TREE; e = TREE_CHAIN (e))
1681 pp_expression (pp, TREE_VALUE (e));
1682 if (TREE_CHAIN (e))
1683 pp_separate_with (pp, ',');
1687 /* Print out V, which contains the elements of a constructor. */
1689 void
1690 pp_c_constructor_elts (c_pretty_printer *pp, vec<constructor_elt, va_gc> *v)
1692 unsigned HOST_WIDE_INT ix;
1693 tree value;
1695 FOR_EACH_CONSTRUCTOR_VALUE (v, ix, value)
1697 pp_expression (pp, value);
1698 if (ix != vec_safe_length (v) - 1)
1699 pp_separate_with (pp, ',');
1703 /* Print out an expression-list in parens, as if it were the argument
1704 list to a function. */
1706 void
1707 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
1709 pp_c_left_paren (pp);
1710 if (t && TREE_CODE (t) == TREE_LIST)
1711 pp_c_expression_list (pp, t);
1712 pp_c_right_paren (pp);
1715 /* unary-expression:
1716 postfix-expression
1717 ++ cast-expression
1718 -- cast-expression
1719 unary-operator cast-expression
1720 sizeof unary-expression
1721 sizeof ( type-id )
1723 unary-operator: one of
1724 * & + - ! ~
1726 GNU extensions.
1727 unary-expression:
1728 __alignof__ unary-expression
1729 __alignof__ ( type-id )
1730 __real__ unary-expression
1731 __imag__ unary-expression */
1733 void
1734 pp_c_unary_expression (c_pretty_printer *pp, tree e)
1736 enum tree_code code = TREE_CODE (e);
1737 switch (code)
1739 case PREINCREMENT_EXPR:
1740 case PREDECREMENT_EXPR:
1741 pp_string (pp, code == PREINCREMENT_EXPR ? "++" : "--");
1742 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1743 break;
1745 case ADDR_EXPR:
1746 case INDIRECT_REF:
1747 case NEGATE_EXPR:
1748 case BIT_NOT_EXPR:
1749 case TRUTH_NOT_EXPR:
1750 case CONJ_EXPR:
1751 /* String literal are used by address. */
1752 if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
1753 pp_ampersand (pp);
1754 else if (code == INDIRECT_REF)
1755 pp_c_star (pp);
1756 else if (code == NEGATE_EXPR)
1757 pp_minus (pp);
1758 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
1759 pp_complement (pp);
1760 else if (code == TRUTH_NOT_EXPR)
1761 pp_exclamation (pp);
1762 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1763 break;
1765 case MEM_REF:
1766 if (TREE_CODE (TREE_OPERAND (e, 0)) == ADDR_EXPR
1767 && integer_zerop (TREE_OPERAND (e, 1)))
1768 pp_c_expression (pp, TREE_OPERAND (TREE_OPERAND (e, 0), 0));
1769 else
1771 pp_c_star (pp);
1772 if (!integer_zerop (TREE_OPERAND (e, 1)))
1774 pp_c_left_paren (pp);
1775 if (!integer_onep (TYPE_SIZE_UNIT
1776 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (e, 0))))))
1777 pp_c_type_cast (pp, ptr_type_node);
1779 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1780 if (!integer_zerop (TREE_OPERAND (e, 1)))
1782 pp_plus (pp);
1783 pp_c_integer_constant (pp,
1784 fold_convert (ssizetype,
1785 TREE_OPERAND (e, 1)));
1786 pp_c_right_paren (pp);
1789 break;
1791 case REALPART_EXPR:
1792 case IMAGPART_EXPR:
1793 pp_c_ws_string (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
1794 pp_c_whitespace (pp);
1795 pp_unary_expression (pp, TREE_OPERAND (e, 0));
1796 break;
1798 default:
1799 pp_postfix_expression (pp, e);
1800 break;
1804 /* cast-expression:
1805 unary-expression
1806 ( type-name ) cast-expression */
1808 void
1809 pp_c_cast_expression (c_pretty_printer *pp, tree e)
1811 switch (TREE_CODE (e))
1813 case FLOAT_EXPR:
1814 case FIX_TRUNC_EXPR:
1815 CASE_CONVERT:
1816 case VIEW_CONVERT_EXPR:
1817 pp_c_type_cast (pp, TREE_TYPE (e));
1818 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1819 break;
1821 default:
1822 pp_unary_expression (pp, e);
1826 /* multiplicative-expression:
1827 cast-expression
1828 multiplicative-expression * cast-expression
1829 multiplicative-expression / cast-expression
1830 multiplicative-expression % cast-expression */
1832 static void
1833 pp_c_multiplicative_expression (c_pretty_printer *pp, tree e)
1835 enum tree_code code = TREE_CODE (e);
1836 switch (code)
1838 case MULT_EXPR:
1839 case TRUNC_DIV_EXPR:
1840 case TRUNC_MOD_EXPR:
1841 pp_multiplicative_expression (pp, TREE_OPERAND (e, 0));
1842 pp_c_whitespace (pp);
1843 if (code == MULT_EXPR)
1844 pp_c_star (pp);
1845 else if (code == TRUNC_DIV_EXPR)
1846 pp_slash (pp);
1847 else
1848 pp_modulo (pp);
1849 pp_c_whitespace (pp);
1850 pp_c_cast_expression (pp, TREE_OPERAND (e, 1));
1851 break;
1853 default:
1854 pp_c_cast_expression (pp, e);
1855 break;
1859 /* additive-expression:
1860 multiplicative-expression
1861 additive-expression + multiplicative-expression
1862 additive-expression - multiplicative-expression */
1864 static void
1865 pp_c_additive_expression (c_pretty_printer *pp, tree e)
1867 enum tree_code code = TREE_CODE (e);
1868 switch (code)
1870 case POINTER_PLUS_EXPR:
1871 case PLUS_EXPR:
1872 case MINUS_EXPR:
1873 pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
1874 pp_c_whitespace (pp);
1875 if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
1876 pp_plus (pp);
1877 else
1878 pp_minus (pp);
1879 pp_c_whitespace (pp);
1880 pp_multiplicative_expression (pp, TREE_OPERAND (e, 1));
1881 break;
1883 default:
1884 pp_multiplicative_expression (pp, e);
1885 break;
1889 /* additive-expression:
1890 additive-expression
1891 shift-expression << additive-expression
1892 shift-expression >> additive-expression */
1894 static void
1895 pp_c_shift_expression (c_pretty_printer *pp, tree e)
1897 enum tree_code code = TREE_CODE (e);
1898 switch (code)
1900 case LSHIFT_EXPR:
1901 case RSHIFT_EXPR:
1902 pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
1903 pp_c_whitespace (pp);
1904 pp_string (pp, code == LSHIFT_EXPR ? "<<" : ">>");
1905 pp_c_whitespace (pp);
1906 pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
1907 break;
1909 default:
1910 pp_c_additive_expression (pp, e);
1914 /* relational-expression:
1915 shift-expression
1916 relational-expression < shift-expression
1917 relational-expression > shift-expression
1918 relational-expression <= shift-expression
1919 relational-expression >= shift-expression */
1921 static void
1922 pp_c_relational_expression (c_pretty_printer *pp, tree e)
1924 enum tree_code code = TREE_CODE (e);
1925 switch (code)
1927 case LT_EXPR:
1928 case GT_EXPR:
1929 case LE_EXPR:
1930 case GE_EXPR:
1931 pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
1932 pp_c_whitespace (pp);
1933 if (code == LT_EXPR)
1934 pp_less (pp);
1935 else if (code == GT_EXPR)
1936 pp_greater (pp);
1937 else if (code == LE_EXPR)
1938 pp_string (pp, "<=");
1939 else if (code == GE_EXPR)
1940 pp_string (pp, ">=");
1941 pp_c_whitespace (pp);
1942 pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
1943 break;
1945 default:
1946 pp_c_shift_expression (pp, e);
1947 break;
1951 /* equality-expression:
1952 relational-expression
1953 equality-expression == relational-expression
1954 equality-equality != relational-expression */
1956 static void
1957 pp_c_equality_expression (c_pretty_printer *pp, tree e)
1959 enum tree_code code = TREE_CODE (e);
1960 switch (code)
1962 case EQ_EXPR:
1963 case NE_EXPR:
1964 pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
1965 pp_c_whitespace (pp);
1966 pp_string (pp, code == EQ_EXPR ? "==" : "!=");
1967 pp_c_whitespace (pp);
1968 pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
1969 break;
1971 default:
1972 pp_c_relational_expression (pp, e);
1973 break;
1977 /* AND-expression:
1978 equality-expression
1979 AND-expression & equality-equality */
1981 static void
1982 pp_c_and_expression (c_pretty_printer *pp, tree e)
1984 if (TREE_CODE (e) == BIT_AND_EXPR)
1986 pp_c_and_expression (pp, TREE_OPERAND (e, 0));
1987 pp_c_whitespace (pp);
1988 pp_ampersand (pp);
1989 pp_c_whitespace (pp);
1990 pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
1992 else
1993 pp_c_equality_expression (pp, e);
1996 /* exclusive-OR-expression:
1997 AND-expression
1998 exclusive-OR-expression ^ AND-expression */
2000 static void
2001 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
2003 if (TREE_CODE (e) == BIT_XOR_EXPR
2004 || TREE_CODE (e) == TRUTH_XOR_EXPR)
2006 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
2007 if (TREE_CODE (e) == BIT_XOR_EXPR)
2008 pp_c_maybe_whitespace (pp);
2009 else
2010 pp_c_whitespace (pp);
2011 pp_carret (pp);
2012 pp_c_whitespace (pp);
2013 pp_c_and_expression (pp, TREE_OPERAND (e, 1));
2015 else
2016 pp_c_and_expression (pp, e);
2019 /* inclusive-OR-expression:
2020 exclusive-OR-expression
2021 inclusive-OR-expression | exclusive-OR-expression */
2023 static void
2024 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
2026 if (TREE_CODE (e) == BIT_IOR_EXPR)
2028 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
2029 pp_c_whitespace (pp);
2030 pp_bar (pp);
2031 pp_c_whitespace (pp);
2032 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
2034 else
2035 pp_c_exclusive_or_expression (pp, e);
2038 /* logical-AND-expression:
2039 inclusive-OR-expression
2040 logical-AND-expression && inclusive-OR-expression */
2042 static void
2043 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
2045 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR
2046 || TREE_CODE (e) == TRUTH_AND_EXPR)
2048 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
2049 pp_c_whitespace (pp);
2050 pp_string (pp, "&&");
2051 pp_c_whitespace (pp);
2052 pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
2054 else
2055 pp_c_inclusive_or_expression (pp, e);
2058 /* logical-OR-expression:
2059 logical-AND-expression
2060 logical-OR-expression || logical-AND-expression */
2062 void
2063 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
2065 if (TREE_CODE (e) == TRUTH_ORIF_EXPR
2066 || TREE_CODE (e) == TRUTH_OR_EXPR)
2068 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
2069 pp_c_whitespace (pp);
2070 pp_string (pp, "||");
2071 pp_c_whitespace (pp);
2072 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
2074 else
2075 pp_c_logical_and_expression (pp, e);
2078 /* conditional-expression:
2079 logical-OR-expression
2080 logical-OR-expression ? expression : conditional-expression */
2082 static void
2083 pp_c_conditional_expression (c_pretty_printer *pp, tree e)
2085 if (TREE_CODE (e) == COND_EXPR)
2087 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
2088 pp_c_whitespace (pp);
2089 pp_question (pp);
2090 pp_c_whitespace (pp);
2091 pp_expression (pp, TREE_OPERAND (e, 1));
2092 pp_c_whitespace (pp);
2093 pp_colon (pp);
2094 pp_c_whitespace (pp);
2095 pp_c_conditional_expression (pp, TREE_OPERAND (e, 2));
2097 else
2098 pp_c_logical_or_expression (pp, e);
2102 /* assignment-expression:
2103 conditional-expression
2104 unary-expression assignment-operator assignment-expression
2106 assignment-expression: one of
2107 = *= /= %= += -= >>= <<= &= ^= |= */
2109 static void
2110 pp_c_assignment_expression (c_pretty_printer *pp, tree e)
2112 if (TREE_CODE (e) == MODIFY_EXPR
2113 || TREE_CODE (e) == INIT_EXPR)
2115 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
2116 pp_c_whitespace (pp);
2117 pp_equal (pp);
2118 pp_space (pp);
2119 pp_c_expression (pp, TREE_OPERAND (e, 1));
2121 else
2122 pp_c_conditional_expression (pp, e);
2125 /* expression:
2126 assignment-expression
2127 expression , assignment-expression
2129 Implementation note: instead of going through the usual recursion
2130 chain, I take the liberty of dispatching nodes to the appropriate
2131 functions. This makes some redundancy, but it worths it. That also
2132 prevents a possible infinite recursion between pp_c_primary_expression ()
2133 and pp_c_expression (). */
2135 void
2136 pp_c_expression (c_pretty_printer *pp, tree e)
2138 switch (TREE_CODE (e))
2140 case INTEGER_CST:
2141 pp_c_integer_constant (pp, e);
2142 break;
2144 case REAL_CST:
2145 pp_c_floating_constant (pp, e);
2146 break;
2148 case FIXED_CST:
2149 pp_c_fixed_constant (pp, e);
2150 break;
2152 case STRING_CST:
2153 pp_c_string_literal (pp, e);
2154 break;
2156 case IDENTIFIER_NODE:
2157 case FUNCTION_DECL:
2158 case VAR_DECL:
2159 case CONST_DECL:
2160 case PARM_DECL:
2161 case RESULT_DECL:
2162 case FIELD_DECL:
2163 case LABEL_DECL:
2164 case ERROR_MARK:
2165 pp_primary_expression (pp, e);
2166 break;
2168 case SSA_NAME:
2169 if (SSA_NAME_VAR (e)
2170 && !DECL_ARTIFICIAL (SSA_NAME_VAR (e)))
2171 pp_c_expression (pp, SSA_NAME_VAR (e));
2172 else
2173 pp_c_ws_string (pp, M_("<unknown>"));
2174 break;
2176 case POSTINCREMENT_EXPR:
2177 case POSTDECREMENT_EXPR:
2178 case ARRAY_REF:
2179 case CALL_EXPR:
2180 case COMPONENT_REF:
2181 case BIT_FIELD_REF:
2182 case COMPLEX_CST:
2183 case COMPLEX_EXPR:
2184 case VECTOR_CST:
2185 case ORDERED_EXPR:
2186 case UNORDERED_EXPR:
2187 case LTGT_EXPR:
2188 case UNEQ_EXPR:
2189 case UNLE_EXPR:
2190 case UNLT_EXPR:
2191 case UNGE_EXPR:
2192 case UNGT_EXPR:
2193 case ABS_EXPR:
2194 case CONSTRUCTOR:
2195 case COMPOUND_LITERAL_EXPR:
2196 case VA_ARG_EXPR:
2197 pp_postfix_expression (pp, e);
2198 break;
2200 case CONJ_EXPR:
2201 case ADDR_EXPR:
2202 case INDIRECT_REF:
2203 case MEM_REF:
2204 case NEGATE_EXPR:
2205 case BIT_NOT_EXPR:
2206 case TRUTH_NOT_EXPR:
2207 case PREINCREMENT_EXPR:
2208 case PREDECREMENT_EXPR:
2209 case REALPART_EXPR:
2210 case IMAGPART_EXPR:
2211 pp_c_unary_expression (pp, e);
2212 break;
2214 case FLOAT_EXPR:
2215 case FIX_TRUNC_EXPR:
2216 CASE_CONVERT:
2217 case VIEW_CONVERT_EXPR:
2218 pp_c_cast_expression (pp, e);
2219 break;
2221 case MULT_EXPR:
2222 case TRUNC_MOD_EXPR:
2223 case TRUNC_DIV_EXPR:
2224 pp_multiplicative_expression (pp, e);
2225 break;
2227 case LSHIFT_EXPR:
2228 case RSHIFT_EXPR:
2229 pp_c_shift_expression (pp, e);
2230 break;
2232 case LT_EXPR:
2233 case GT_EXPR:
2234 case LE_EXPR:
2235 case GE_EXPR:
2236 pp_c_relational_expression (pp, e);
2237 break;
2239 case BIT_AND_EXPR:
2240 pp_c_and_expression (pp, e);
2241 break;
2243 case BIT_XOR_EXPR:
2244 case TRUTH_XOR_EXPR:
2245 pp_c_exclusive_or_expression (pp, e);
2246 break;
2248 case BIT_IOR_EXPR:
2249 pp_c_inclusive_or_expression (pp, e);
2250 break;
2252 case TRUTH_ANDIF_EXPR:
2253 case TRUTH_AND_EXPR:
2254 pp_c_logical_and_expression (pp, e);
2255 break;
2257 case TRUTH_ORIF_EXPR:
2258 case TRUTH_OR_EXPR:
2259 pp_c_logical_or_expression (pp, e);
2260 break;
2262 case EQ_EXPR:
2263 case NE_EXPR:
2264 pp_c_equality_expression (pp, e);
2265 break;
2267 case COND_EXPR:
2268 pp_conditional_expression (pp, e);
2269 break;
2271 case POINTER_PLUS_EXPR:
2272 case PLUS_EXPR:
2273 case MINUS_EXPR:
2274 pp_c_additive_expression (pp, e);
2275 break;
2277 case MODIFY_EXPR:
2278 case INIT_EXPR:
2279 pp_assignment_expression (pp, e);
2280 break;
2282 case COMPOUND_EXPR:
2283 pp_c_left_paren (pp);
2284 pp_expression (pp, TREE_OPERAND (e, 0));
2285 pp_separate_with (pp, ',');
2286 pp_assignment_expression (pp, TREE_OPERAND (e, 1));
2287 pp_c_right_paren (pp);
2288 break;
2290 case NON_LVALUE_EXPR:
2291 case SAVE_EXPR:
2292 pp_expression (pp, TREE_OPERAND (e, 0));
2293 break;
2295 case TARGET_EXPR:
2296 pp_postfix_expression (pp, TREE_OPERAND (e, 1));
2297 break;
2299 case BIND_EXPR:
2300 case GOTO_EXPR:
2301 /* We don't yet have a way of dumping statements in a
2302 human-readable format. */
2303 pp_string (pp, "({...})");
2304 break;
2306 case C_MAYBE_CONST_EXPR:
2307 pp_c_expression (pp, C_MAYBE_CONST_EXPR_EXPR (e));
2308 break;
2310 default:
2311 pp_unsupported_tree (pp, e);
2312 break;
2318 /* Statements. */
2320 void
2321 pp_c_statement (c_pretty_printer *pp, tree stmt)
2323 if (stmt == NULL)
2324 return;
2326 if (pp_needs_newline (pp))
2327 pp_newline_and_indent (pp, 0);
2329 dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
2333 /* Initialize the PRETTY-PRINTER for handling C codes. */
2335 void
2336 pp_c_pretty_printer_init (c_pretty_printer *pp)
2338 pp->offset_list = 0;
2340 pp->declaration = pp_c_declaration;
2341 pp->declaration_specifiers = pp_c_declaration_specifiers;
2342 pp->declarator = pp_c_declarator;
2343 pp->direct_declarator = pp_c_direct_declarator;
2344 pp->type_specifier_seq = pp_c_specifier_qualifier_list;
2345 pp->abstract_declarator = pp_c_abstract_declarator;
2346 pp->direct_abstract_declarator = pp_c_direct_abstract_declarator;
2347 pp->ptr_operator = pp_c_pointer;
2348 pp->parameter_list = pp_c_parameter_type_list;
2349 pp->type_id = pp_c_type_id;
2350 pp->simple_type_specifier = pp_c_type_specifier;
2351 pp->function_specifier = pp_c_function_specifier;
2352 pp->storage_class_specifier = pp_c_storage_class_specifier;
2354 pp->statement = pp_c_statement;
2356 pp->constant = pp_c_constant;
2357 pp->id_expression = pp_c_id_expression;
2358 pp->primary_expression = pp_c_primary_expression;
2359 pp->postfix_expression = pp_c_postfix_expression;
2360 pp->unary_expression = pp_c_unary_expression;
2361 pp->initializer = pp_c_initializer;
2362 pp->multiplicative_expression = pp_c_multiplicative_expression;
2363 pp->conditional_expression = pp_c_conditional_expression;
2364 pp->assignment_expression = pp_c_assignment_expression;
2365 pp->expression = pp_c_expression;
2369 /* Print the tree T in full, on file FILE. */
2371 void
2372 print_c_tree (FILE *file, tree t)
2374 static c_pretty_printer pp_rec;
2375 static bool initialized = 0;
2376 c_pretty_printer *pp = &pp_rec;
2378 if (!initialized)
2380 initialized = 1;
2381 pp_construct (pp_base (pp), NULL, 0);
2382 pp_c_pretty_printer_init (pp);
2383 pp_needs_newline (pp) = true;
2385 pp_base (pp)->buffer->stream = file;
2387 pp_statement (pp, t);
2389 pp_newline_and_flush (pp);
2392 /* Print the tree T in full, on stderr. */
2394 DEBUG_FUNCTION void
2395 debug_c_tree (tree t)
2397 print_c_tree (stderr, t);
2398 fputc ('\n', stderr);
2401 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
2402 up of T's memory address. */
2404 void
2405 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
2407 const char *name;
2409 gcc_assert (DECL_P (t));
2411 if (DECL_NAME (t))
2412 name = IDENTIFIER_POINTER (DECL_NAME (t));
2413 else
2415 static char xname[8];
2416 sprintf (xname, "<U%4x>", ((unsigned)((uintptr_t)(t) & 0xffff)));
2417 name = xname;
2420 pp_c_identifier (pp, name);