2006-10-28 Andrew Pinski <andrew_pinski@playstation.sony.com>
[official-gcc.git] / gcc / c-pretty-print.c
blob5225ea3dd96b287324573ec8d8cbc82dc381c0f7
1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
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 COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "real.h"
27 #include "c-pretty-print.h"
28 #include "c-tree.h"
29 #include "tree-iterator.h"
30 #include "diagnostic.h"
32 /* The pretty-printer code is primarily designed to closely follow
33 (GNU) C and C++ grammars. That is to be contrasted with spaghetti
34 codes we used to have in the past. Following a structured
35 approach (preferably the official grammars) is believed to make it
36 much easier to add extensions and nifty pretty-printing effects that
37 takes expression or declaration contexts into account. */
40 #define pp_c_maybe_whitespace(PP) \
41 do { \
42 if (pp_base (PP)->padding == pp_before) \
43 pp_c_whitespace (PP); \
44 } while (0)
46 /* literal */
47 static void pp_c_char (c_pretty_printer *, int);
49 /* postfix-expression */
50 static void pp_c_initializer_list (c_pretty_printer *, tree);
51 static void pp_c_brace_enclosed_initializer_list (c_pretty_printer *, tree);
53 static void pp_c_multiplicative_expression (c_pretty_printer *, tree);
54 static void pp_c_additive_expression (c_pretty_printer *, tree);
55 static void pp_c_shift_expression (c_pretty_printer *, tree);
56 static void pp_c_relational_expression (c_pretty_printer *, tree);
57 static void pp_c_equality_expression (c_pretty_printer *, tree);
58 static void pp_c_and_expression (c_pretty_printer *, tree);
59 static void pp_c_exclusive_or_expression (c_pretty_printer *, tree);
60 static void pp_c_inclusive_or_expression (c_pretty_printer *, tree);
61 static void pp_c_logical_and_expression (c_pretty_printer *, tree);
62 static void pp_c_conditional_expression (c_pretty_printer *, tree);
63 static void pp_c_assignment_expression (c_pretty_printer *, tree);
65 /* declarations. */
68 /* Helper functions. */
70 void
71 pp_c_whitespace (c_pretty_printer *pp)
73 pp_space (pp);
74 pp_base (pp)->padding = pp_none;
77 void
78 pp_c_left_paren (c_pretty_printer *pp)
80 pp_left_paren (pp);
81 pp_base (pp)->padding = pp_none;
84 void
85 pp_c_right_paren (c_pretty_printer *pp)
87 pp_right_paren (pp);
88 pp_base (pp)->padding = pp_none;
91 void
92 pp_c_left_brace (c_pretty_printer *pp)
94 pp_left_brace (pp);
95 pp_base (pp)->padding = pp_none;
98 void
99 pp_c_right_brace (c_pretty_printer *pp)
101 pp_right_brace (pp);
102 pp_base (pp)->padding = pp_none;
105 void
106 pp_c_left_bracket (c_pretty_printer *pp)
108 pp_left_bracket (pp);
109 pp_base (pp)->padding = pp_none;
112 void
113 pp_c_right_bracket (c_pretty_printer *pp)
115 pp_right_bracket (pp);
116 pp_base (pp)->padding = pp_none;
119 void
120 pp_c_dot (c_pretty_printer *pp)
122 pp_dot (pp);
123 pp_base (pp)->padding = pp_none;
126 void
127 pp_c_ampersand (c_pretty_printer *pp)
129 pp_ampersand (pp);
130 pp_base (pp)->padding = pp_none;
133 void
134 pp_c_star (c_pretty_printer *pp)
136 pp_star (pp);
137 pp_base (pp)->padding = pp_none;
140 void
141 pp_c_arrow (c_pretty_printer *pp)
143 pp_arrow (pp);
144 pp_base (pp)->padding = pp_none;
147 void
148 pp_c_semicolon (c_pretty_printer *pp)
150 pp_semicolon (pp);
151 pp_base (pp)->padding = pp_none;
154 void
155 pp_c_complement (c_pretty_printer *pp)
157 pp_complement (pp);
158 pp_base (pp)->padding = pp_none;
161 void
162 pp_c_exclamation (c_pretty_printer *pp)
164 pp_exclamation (pp);
165 pp_base (pp)->padding = pp_none;
168 /* Print out the external representation of CV-QUALIFIER. */
170 static void
171 pp_c_cv_qualifier (c_pretty_printer *pp, const char *cv)
173 const char *p = pp_last_position_in_text (pp);
174 /* The C programming language does not have references, but it is much
175 simpler to handle those here rather than going through the same
176 logic in the C++ pretty-printer. */
177 if (p != NULL && (*p == '*' || *p == '&'))
178 pp_c_whitespace (pp);
179 pp_c_identifier (pp, cv);
182 /* Pretty-print T using the type-cast notation '( type-name )'. */
184 static void
185 pp_c_type_cast (c_pretty_printer *pp, tree t)
187 pp_c_left_paren (pp);
188 pp_type_id (pp, t);
189 pp_c_right_paren (pp);
192 /* We're about to pretty-print a pointer type as indicated by T.
193 Output a whitespace, if needed, preparing for subsequent output. */
195 void
196 pp_c_space_for_pointer_operator (c_pretty_printer *pp, tree t)
198 if (POINTER_TYPE_P (t))
200 tree pointee = strip_pointer_operator (TREE_TYPE (t));
201 if (TREE_CODE (pointee) != ARRAY_TYPE
202 && TREE_CODE (pointee) != FUNCTION_TYPE)
203 pp_c_whitespace (pp);
208 /* Declarations. */
210 /* C++ cv-qualifiers are called type-qualifiers in C. Print out the
211 cv-qualifiers of T. If T is a declaration then it is the cv-qualifier
212 of its type. Take care of possible extensions.
214 type-qualifier-list:
215 type-qualifier
216 type-qualifier-list type-qualifier
218 type-qualifier:
219 const
220 restrict -- C99
221 __restrict__ -- GNU C
222 volatile */
224 void
225 pp_c_type_qualifier_list (c_pretty_printer *pp, tree t)
227 int qualifiers;
229 if (!TYPE_P (t))
230 t = TREE_TYPE (t);
232 qualifiers = TYPE_QUALS (t);
233 if (qualifiers & TYPE_QUAL_CONST)
234 pp_c_cv_qualifier (pp, "const");
235 if (qualifiers & TYPE_QUAL_VOLATILE)
236 pp_c_cv_qualifier (pp, "volatile");
237 if (qualifiers & TYPE_QUAL_RESTRICT)
238 pp_c_cv_qualifier (pp, flag_isoc99 ? "restrict" : "__restrict__");
241 /* pointer:
242 * type-qualifier-list(opt)
243 * type-qualifier-list(opt) pointer */
245 static void
246 pp_c_pointer (c_pretty_printer *pp, tree t)
248 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
249 t = TREE_TYPE (t);
250 switch (TREE_CODE (t))
252 case POINTER_TYPE:
253 /* It is easier to handle C++ reference types here. */
254 case REFERENCE_TYPE:
255 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
256 pp_c_pointer (pp, TREE_TYPE (t));
257 if (TREE_CODE (t) == POINTER_TYPE)
258 pp_c_star (pp);
259 else
260 pp_c_ampersand (pp);
261 pp_c_type_qualifier_list (pp, t);
262 break;
264 /* ??? This node is now in GENERIC and so shouldn't be here. But
265 we'll fix that later. */
266 case DECL_EXPR:
267 pp_declaration (pp, DECL_EXPR_DECL (t));
268 pp_needs_newline (pp) = true;
269 break;
271 default:
272 pp_unsupported_tree (pp, t);
276 /* type-specifier:
277 void
278 char
279 short
281 long
282 float
283 double
284 signed
285 unsigned
286 _Bool -- C99
287 _Complex -- C99
288 _Imaginary -- C99
289 struct-or-union-specifier
290 enum-specifier
291 typedef-name.
293 GNU extensions.
294 simple-type-specifier:
295 __complex__
296 __vector__ */
298 void
299 pp_c_type_specifier (c_pretty_printer *pp, tree t)
301 const enum tree_code code = TREE_CODE (t);
302 switch (code)
304 case ERROR_MARK:
305 pp_c_identifier (pp, "<type-error>");
306 break;
308 case IDENTIFIER_NODE:
309 pp_c_tree_decl_identifier (pp, t);
310 break;
312 case VOID_TYPE:
313 case BOOLEAN_TYPE:
314 case INTEGER_TYPE:
315 case REAL_TYPE:
316 if (TYPE_NAME (t))
318 t = TYPE_NAME (t);
319 pp_c_type_specifier (pp, t);
321 else
323 int prec = TYPE_PRECISION (t);
324 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
325 if (TYPE_NAME (t))
327 pp_c_type_specifier (pp, t);
328 if (TYPE_PRECISION (t) != prec)
330 pp_string (pp, ":");
331 pp_decimal_int (pp, prec);
334 else
336 switch (code)
338 case INTEGER_TYPE:
339 pp_string (pp, (TYPE_UNSIGNED (t)
340 ? "<unnamed-unsigned:"
341 : "<unnamed-signed:"));
342 break;
343 case REAL_TYPE:
344 pp_string (pp, "<unnamed-float:");
345 break;
346 default:
347 gcc_unreachable ();
349 pp_decimal_int (pp, prec);
350 pp_string (pp, ">");
353 break;
355 case TYPE_DECL:
356 if (DECL_NAME (t))
357 pp_id_expression (pp, t);
358 else
359 pp_c_identifier (pp, "<typedef-error>");
360 break;
362 case UNION_TYPE:
363 case RECORD_TYPE:
364 case ENUMERAL_TYPE:
365 if (code == UNION_TYPE)
366 pp_c_identifier (pp, "union");
367 else if (code == RECORD_TYPE)
368 pp_c_identifier (pp, "struct");
369 else if (code == ENUMERAL_TYPE)
370 pp_c_identifier (pp, "enum");
371 else
372 pp_c_identifier (pp, "<tag-error>");
374 if (TYPE_NAME (t))
375 pp_id_expression (pp, TYPE_NAME (t));
376 else
377 pp_c_identifier (pp, "<anonymous>");
378 break;
380 default:
381 pp_unsupported_tree (pp, t);
382 break;
386 /* specifier-qualifier-list:
387 type-specifier specifier-qualifier-list-opt
388 type-qualifier specifier-qualifier-list-opt
391 Implementation note: Because of the non-linearities in array or
392 function declarations, this routine prints not just the
393 specifier-qualifier-list of such entities or types of such entities,
394 but also the 'pointer' production part of their declarators. The
395 remaining part is done by pp_declarator or pp_c_abstract_declarator. */
397 void
398 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
400 const enum tree_code code = TREE_CODE (t);
402 if (TREE_CODE (t) != POINTER_TYPE)
403 pp_c_type_qualifier_list (pp, t);
404 switch (code)
406 case REFERENCE_TYPE:
407 case POINTER_TYPE:
409 /* Get the types-specifier of this type. */
410 tree pointee = strip_pointer_operator (TREE_TYPE (t));
411 pp_c_specifier_qualifier_list (pp, pointee);
412 if (TREE_CODE (pointee) == ARRAY_TYPE
413 || TREE_CODE (pointee) == FUNCTION_TYPE)
415 pp_c_whitespace (pp);
416 pp_c_left_paren (pp);
418 else if (!c_dialect_cxx ())
419 pp_c_whitespace (pp);
420 pp_ptr_operator (pp, t);
422 break;
424 case FUNCTION_TYPE:
425 case ARRAY_TYPE:
426 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
427 break;
429 case VECTOR_TYPE:
430 case COMPLEX_TYPE:
431 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
432 if (code == COMPLEX_TYPE)
433 pp_c_identifier (pp, flag_isoc99 ? "_Complex" : "__complex__");
434 else if (code == VECTOR_TYPE)
435 pp_c_identifier (pp, "__vector__");
436 break;
438 default:
439 pp_simple_type_specifier (pp, t);
440 break;
444 /* parameter-type-list:
445 parameter-list
446 parameter-list , ...
448 parameter-list:
449 parameter-declaration
450 parameter-list , parameter-declaration
452 parameter-declaration:
453 declaration-specifiers declarator
454 declaration-specifiers abstract-declarator(opt) */
456 void
457 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
459 bool want_parm_decl = DECL_P (t) && !(pp->flags & pp_c_flag_abstract);
460 tree parms = want_parm_decl ? DECL_ARGUMENTS (t) : TYPE_ARG_TYPES (t);
461 pp_c_left_paren (pp);
462 if (parms == void_list_node)
463 pp_c_identifier (pp, "void");
464 else
466 bool first = true;
467 for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
469 if (!first)
470 pp_separate_with (pp, ',');
471 first = false;
472 pp_declaration_specifiers
473 (pp, want_parm_decl ? parms : TREE_VALUE (parms));
474 if (want_parm_decl)
475 pp_declarator (pp, parms);
476 else
477 pp_abstract_declarator (pp, TREE_VALUE (parms));
480 pp_c_right_paren (pp);
483 /* abstract-declarator:
484 pointer
485 pointer(opt) direct-abstract-declarator */
487 static void
488 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
490 if (TREE_CODE (t) == POINTER_TYPE)
492 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
493 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
494 pp_c_right_paren (pp);
495 t = TREE_TYPE (t);
498 pp_direct_abstract_declarator (pp, t);
501 /* direct-abstract-declarator:
502 ( abstract-declarator )
503 direct-abstract-declarator(opt) [ assignment-expression(opt) ]
504 direct-abstract-declarator(opt) [ * ]
505 direct-abstract-declarator(opt) ( parameter-type-list(opt) ) */
507 void
508 pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
510 switch (TREE_CODE (t))
512 case POINTER_TYPE:
513 pp_abstract_declarator (pp, t);
514 break;
516 case FUNCTION_TYPE:
517 pp_c_parameter_type_list (pp, t);
518 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
519 break;
521 case ARRAY_TYPE:
522 pp_c_left_bracket (pp);
523 if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
525 tree maxval = TYPE_MAX_VALUE (TYPE_DOMAIN (t));
526 tree type = TREE_TYPE (maxval);
528 if (host_integerp (maxval, 0))
529 pp_wide_integer (pp, tree_low_cst (maxval, 0) + 1);
530 else
531 pp_expression (pp, fold (build2 (PLUS_EXPR, type, maxval,
532 build_int_cst (type, 1))));
534 pp_c_right_bracket (pp);
535 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
536 break;
538 case IDENTIFIER_NODE:
539 case VOID_TYPE:
540 case BOOLEAN_TYPE:
541 case INTEGER_TYPE:
542 case REAL_TYPE:
543 case ENUMERAL_TYPE:
544 case RECORD_TYPE:
545 case UNION_TYPE:
546 case VECTOR_TYPE:
547 case COMPLEX_TYPE:
548 case TYPE_DECL:
549 break;
551 default:
552 pp_unsupported_tree (pp, t);
553 break;
557 /* type-name:
558 specifier-qualifier-list abstract-declarator(opt) */
560 void
561 pp_c_type_id (c_pretty_printer *pp, tree t)
563 pp_c_specifier_qualifier_list (pp, t);
564 pp_abstract_declarator (pp, t);
567 /* storage-class-specifier:
568 typedef
569 extern
570 static
571 auto
572 register */
574 void
575 pp_c_storage_class_specifier (c_pretty_printer *pp, tree t)
577 if (TREE_CODE (t) == TYPE_DECL)
578 pp_c_identifier (pp, "typedef");
579 else if (DECL_P (t))
581 if (DECL_REGISTER (t))
582 pp_c_identifier (pp, "register");
583 else if (TREE_STATIC (t) && TREE_CODE (t) == VAR_DECL)
584 pp_c_identifier (pp, "static");
588 /* function-specifier:
589 inline */
591 void
592 pp_c_function_specifier (c_pretty_printer *pp, tree t)
594 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
595 pp_c_identifier (pp, "inline");
598 /* declaration-specifiers:
599 storage-class-specifier declaration-specifiers(opt)
600 type-specifier declaration-specifiers(opt)
601 type-qualifier declaration-specifiers(opt)
602 function-specifier declaration-specifiers(opt) */
604 void
605 pp_c_declaration_specifiers (c_pretty_printer *pp, tree t)
607 pp_storage_class_specifier (pp, t);
608 pp_function_specifier (pp, t);
609 pp_c_specifier_qualifier_list (pp, DECL_P (t) ? TREE_TYPE (t) : t);
612 /* direct-declarator
613 identifier
614 ( declarator )
615 direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
616 direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
617 direct-declarator [ type-qualifier-list static assignment-expression ]
618 direct-declarator [ type-qualifier-list * ]
619 direct-declarator ( parameter-type-list )
620 direct-declarator ( identifier-list(opt) ) */
622 void
623 pp_c_direct_declarator (c_pretty_printer *pp, tree t)
625 switch (TREE_CODE (t))
627 case VAR_DECL:
628 case PARM_DECL:
629 case TYPE_DECL:
630 case FIELD_DECL:
631 case LABEL_DECL:
632 pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
633 pp_c_tree_decl_identifier (pp, t);
634 break;
636 case ARRAY_TYPE:
637 case POINTER_TYPE:
638 pp_abstract_declarator (pp, TREE_TYPE (t));
639 break;
641 case FUNCTION_TYPE:
642 pp_parameter_list (pp, t);
643 pp_abstract_declarator (pp, TREE_TYPE (t));
644 break;
646 case FUNCTION_DECL:
647 pp_c_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
648 pp_c_tree_decl_identifier (pp, t);
649 if (pp_c_base (pp)->flags & pp_c_flag_abstract)
650 pp_abstract_declarator (pp, TREE_TYPE (t));
651 else
653 pp_parameter_list (pp, t);
654 pp_abstract_declarator (pp, TREE_TYPE (TREE_TYPE (t)));
656 break;
658 case INTEGER_TYPE:
659 case REAL_TYPE:
660 case ENUMERAL_TYPE:
661 case UNION_TYPE:
662 case RECORD_TYPE:
663 break;
665 default:
666 pp_unsupported_tree (pp, t);
667 break;
672 /* declarator:
673 pointer(opt) direct-declarator */
675 void
676 pp_c_declarator (c_pretty_printer *pp, tree t)
678 switch (TREE_CODE (t))
680 case INTEGER_TYPE:
681 case REAL_TYPE:
682 case ENUMERAL_TYPE:
683 case UNION_TYPE:
684 case RECORD_TYPE:
685 break;
687 case VAR_DECL:
688 case PARM_DECL:
689 case FIELD_DECL:
690 case ARRAY_TYPE:
691 case FUNCTION_TYPE:
692 case FUNCTION_DECL:
693 case TYPE_DECL:
694 pp_direct_declarator (pp, t);
695 break;
698 default:
699 pp_unsupported_tree (pp, t);
700 break;
704 /* declaration:
705 declaration-specifiers init-declarator-list(opt) ; */
707 void
708 pp_c_declaration (c_pretty_printer *pp, tree t)
710 pp_declaration_specifiers (pp, t);
711 pp_c_init_declarator (pp, t);
714 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
716 void
717 pp_c_attributes (c_pretty_printer *pp, tree attributes)
719 if (attributes == NULL_TREE)
720 return;
722 pp_c_identifier (pp, "__attribute__");
723 pp_c_left_paren (pp);
724 pp_c_left_paren (pp);
725 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
727 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
728 if (TREE_VALUE (attributes))
729 pp_c_call_argument_list (pp, TREE_VALUE (attributes));
731 if (TREE_CHAIN (attributes))
732 pp_separate_with (pp, ',');
734 pp_c_right_paren (pp);
735 pp_c_right_paren (pp);
738 /* function-definition:
739 declaration-specifiers declarator compound-statement */
741 void
742 pp_c_function_definition (c_pretty_printer *pp, tree t)
744 pp_declaration_specifiers (pp, t);
745 pp_declarator (pp, t);
746 pp_needs_newline (pp) = true;
747 pp_statement (pp, DECL_SAVED_TREE (t));
748 pp_newline (pp);
749 pp_flush (pp);
753 /* Expressions. */
755 /* Print out a c-char. This is called solely for characters which are
756 in the *target* execution character set. We ought to convert them
757 back to the *host* execution character set before printing, but we
758 have no way to do this at present. A decent compromise is to print
759 all characters as if they were in the host execution character set,
760 and not attempt to recover any named escape characters, but render
761 all unprintables as octal escapes. If the host and target character
762 sets are the same, this produces relatively readable output. If they
763 are not the same, strings may appear as gibberish, but that's okay
764 (in fact, it may well be what the reader wants, e.g. if they are looking
765 to see if conversion to the target character set happened correctly).
767 A special case: we need to prefix \, ", and ' with backslashes. It is
768 correct to do so for the *host*'s \, ", and ', because the rest of the
769 file appears in the host character set. */
771 static void
772 pp_c_char (c_pretty_printer *pp, int c)
774 if (ISPRINT (c))
776 switch (c)
778 case '\\': pp_string (pp, "\\\\"); break;
779 case '\'': pp_string (pp, "\\\'"); break;
780 case '\"': pp_string (pp, "\\\""); break;
781 default: pp_character (pp, c);
784 else
785 pp_scalar (pp, "\\%03o", (unsigned) c);
788 /* Print out a STRING literal. */
790 void
791 pp_c_string_literal (c_pretty_printer *pp, tree s)
793 const char *p = TREE_STRING_POINTER (s);
794 int n = TREE_STRING_LENGTH (s) - 1;
795 int i;
796 pp_doublequote (pp);
797 for (i = 0; i < n; ++i)
798 pp_c_char (pp, p[i]);
799 pp_doublequote (pp);
802 /* Pretty-print an INTEGER literal. */
804 static void
805 pp_c_integer_constant (c_pretty_printer *pp, tree i)
807 tree type = TREE_TYPE (i);
809 if (TREE_INT_CST_HIGH (i) == 0)
810 pp_wide_integer (pp, TREE_INT_CST_LOW (i));
811 else
813 if (tree_int_cst_sgn (i) < 0)
815 pp_character (pp, '-');
816 i = build_int_cst_wide (NULL_TREE,
817 -TREE_INT_CST_LOW (i),
818 ~TREE_INT_CST_HIGH (i)
819 + !TREE_INT_CST_LOW (i));
821 sprintf (pp_buffer (pp)->digit_buffer,
822 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
823 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
824 pp_string (pp, pp_buffer (pp)->digit_buffer);
826 if (TYPE_UNSIGNED (type))
827 pp_character (pp, 'u');
828 if (type == long_integer_type_node || type == long_unsigned_type_node)
829 pp_character (pp, 'l');
830 else if (type == long_long_integer_type_node
831 || type == long_long_unsigned_type_node)
832 pp_string (pp, "ll");
835 /* Print out a CHARACTER literal. */
837 static void
838 pp_c_character_constant (c_pretty_printer *pp, tree c)
840 tree type = TREE_TYPE (c);
841 if (type == wchar_type_node)
842 pp_character (pp, 'L');
843 pp_quote (pp);
844 if (host_integerp (c, TYPE_UNSIGNED (type)))
845 pp_c_char (pp, tree_low_cst (c, TYPE_UNSIGNED (type)));
846 else
847 pp_scalar (pp, "\\x%x", (unsigned) TREE_INT_CST_LOW (c));
848 pp_quote (pp);
851 /* Print out a BOOLEAN literal. */
853 static void
854 pp_c_bool_constant (c_pretty_printer *pp, tree b)
856 if (b == boolean_false_node)
858 if (c_dialect_cxx ())
859 pp_c_identifier (pp, "false");
860 else if (flag_isoc99)
861 pp_c_identifier (pp, "_False");
862 else
863 pp_unsupported_tree (pp, b);
865 else if (b == boolean_true_node)
867 if (c_dialect_cxx ())
868 pp_c_identifier (pp, "true");
869 else if (flag_isoc99)
870 pp_c_identifier (pp, "_True");
871 else
872 pp_unsupported_tree (pp, b);
874 else if (TREE_CODE (b) == INTEGER_CST)
875 pp_c_integer_constant (pp, b);
876 else
877 pp_unsupported_tree (pp, b);
880 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
881 false; that means the value was obtained by a cast, in which case
882 print out the type-id part of the cast-expression -- the casted value
883 is then printed by pp_c_integer_literal. */
885 static bool
886 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
888 bool value_is_named = true;
889 tree type = TREE_TYPE (e);
890 tree value;
892 /* Find the name of this constant. */
893 for (value = TYPE_VALUES (type);
894 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
895 value = TREE_CHAIN (value))
898 if (value != NULL_TREE)
899 pp_id_expression (pp, TREE_PURPOSE (value));
900 else
902 /* Value must have been cast. */
903 pp_c_type_cast (pp, type);
904 value_is_named = false;
907 return value_is_named;
910 /* Print out a REAL value as a decimal-floating-constant. */
912 static void
913 pp_c_floating_constant (c_pretty_printer *pp, tree r)
915 real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
916 sizeof (pp_buffer (pp)->digit_buffer), 0, 1);
917 pp_string (pp, pp_buffer(pp)->digit_buffer);
918 if (TREE_TYPE (r) == float_type_node)
919 pp_character (pp, 'f');
920 else if (TREE_TYPE (r) == long_double_type_node)
921 pp_character (pp, 'l');
922 else if (TREE_TYPE (r) == dfloat128_type_node)
923 pp_string (pp, "dl");
924 else if (TREE_TYPE (r) == dfloat64_type_node)
925 pp_string (pp, "dd");
926 else if (TREE_TYPE (r) == dfloat32_type_node)
927 pp_string (pp, "df");
930 /* Pretty-print a compound literal expression. GNU extensions include
931 vector constants. */
933 static void
934 pp_c_compound_literal (c_pretty_printer *pp, tree e)
936 tree type = TREE_TYPE (e);
937 pp_c_type_cast (pp, type);
939 switch (TREE_CODE (type))
941 case RECORD_TYPE:
942 case UNION_TYPE:
943 case ARRAY_TYPE:
944 case VECTOR_TYPE:
945 case COMPLEX_TYPE:
946 pp_c_brace_enclosed_initializer_list (pp, e);
947 break;
949 default:
950 pp_unsupported_tree (pp, e);
951 break;
955 /* constant:
956 integer-constant
957 floating-constant
958 enumeration-constant
959 character-constant */
961 void
962 pp_c_constant (c_pretty_printer *pp, tree e)
964 const enum tree_code code = TREE_CODE (e);
966 switch (code)
968 case INTEGER_CST:
970 tree type = TREE_TYPE (e);
971 if (type == boolean_type_node)
972 pp_c_bool_constant (pp, e);
973 else if (type == char_type_node)
974 pp_c_character_constant (pp, e);
975 else if (TREE_CODE (type) == ENUMERAL_TYPE
976 && pp_c_enumeration_constant (pp, e))
978 else
979 pp_c_integer_constant (pp, e);
981 break;
983 case REAL_CST:
984 pp_c_floating_constant (pp, e);
985 break;
987 case STRING_CST:
988 pp_c_string_literal (pp, e);
989 break;
991 default:
992 pp_unsupported_tree (pp, e);
993 break;
997 /* Pretty-print an IDENTIFIER_NODE, preceded by whitespace is necessary. */
999 void
1000 pp_c_identifier (c_pretty_printer *pp, const char *id)
1002 pp_c_maybe_whitespace (pp);
1003 pp_identifier (pp, id);
1004 pp_base (pp)->padding = pp_before;
1007 /* Pretty-print a C primary-expression.
1008 primary-expression:
1009 identifier
1010 constant
1011 string-literal
1012 ( expression ) */
1014 void
1015 pp_c_primary_expression (c_pretty_printer *pp, tree e)
1017 switch (TREE_CODE (e))
1019 case VAR_DECL:
1020 case PARM_DECL:
1021 case FIELD_DECL:
1022 case CONST_DECL:
1023 case FUNCTION_DECL:
1024 case LABEL_DECL:
1025 pp_c_tree_decl_identifier (pp, e);
1026 break;
1028 case IDENTIFIER_NODE:
1029 pp_c_tree_identifier (pp, e);
1030 break;
1032 case ERROR_MARK:
1033 pp_c_identifier (pp, "<erroneous-expression>");
1034 break;
1036 case RESULT_DECL:
1037 pp_c_identifier (pp, "<return-value>");
1038 break;
1040 case INTEGER_CST:
1041 case REAL_CST:
1042 case STRING_CST:
1043 pp_c_constant (pp, e);
1044 break;
1046 case TARGET_EXPR:
1047 pp_c_identifier (pp, "__builtin_memcpy");
1048 pp_c_left_paren (pp);
1049 pp_ampersand (pp);
1050 pp_primary_expression (pp, TREE_OPERAND (e, 0));
1051 pp_separate_with (pp, ',');
1052 pp_ampersand (pp);
1053 pp_initializer (pp, TREE_OPERAND (e, 1));
1054 if (TREE_OPERAND (e, 2))
1056 pp_separate_with (pp, ',');
1057 pp_c_expression (pp, TREE_OPERAND (e, 2));
1059 pp_c_right_paren (pp);
1060 break;
1062 default:
1063 /* FIXME: Make sure we won't get into an infinie loop. */
1064 pp_c_left_paren (pp);
1065 pp_expression (pp, e);
1066 pp_c_right_paren (pp);
1067 break;
1071 /* Print out a C initializer -- also support C compound-literals.
1072 initializer:
1073 assignment-expression:
1074 { initializer-list }
1075 { initializer-list , } */
1077 static void
1078 pp_c_initializer (c_pretty_printer *pp, tree e)
1080 if (TREE_CODE (e) == CONSTRUCTOR)
1081 pp_c_brace_enclosed_initializer_list (pp, e);
1082 else
1083 pp_expression (pp, e);
1086 /* init-declarator:
1087 declarator:
1088 declarator = initializer */
1090 void
1091 pp_c_init_declarator (c_pretty_printer *pp, tree t)
1093 pp_declarator (pp, t);
1094 /* We don't want to output function definitions here. There are handled
1095 elsewhere (and the syntactic form is bogus anyway). */
1096 if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
1098 tree init = DECL_INITIAL (t);
1099 /* This C++ bit is handled here because it is easier to do so.
1100 In templates, the C++ parser builds a TREE_LIST for a
1101 direct-initialization; the TREE_PURPOSE is the variable to
1102 initialize and the TREE_VALUE is the initializer. */
1103 if (TREE_CODE (init) == TREE_LIST)
1105 pp_c_left_paren (pp);
1106 pp_expression (pp, TREE_VALUE (init));
1107 pp_right_paren (pp);
1109 else
1111 pp_space (pp);
1112 pp_equal (pp);
1113 pp_space (pp);
1114 pp_c_initializer (pp, init);
1119 /* initializer-list:
1120 designation(opt) initializer
1121 initializer-list , designation(opt) initializer
1123 designation:
1124 designator-list =
1126 designator-list:
1127 designator
1128 designator-list designator
1130 designator:
1131 [ constant-expression ]
1132 identifier */
1134 static void
1135 pp_c_initializer_list (c_pretty_printer *pp, tree e)
1137 tree type = TREE_TYPE (e);
1138 const enum tree_code code = TREE_CODE (type);
1140 switch (code)
1142 case RECORD_TYPE:
1143 case UNION_TYPE:
1144 case ARRAY_TYPE:
1146 tree init = TREE_OPERAND (e, 0);
1147 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1149 if (code == RECORD_TYPE || code == UNION_TYPE)
1151 pp_c_dot (pp);
1152 pp_c_primary_expression (pp, TREE_PURPOSE (init));
1154 else
1156 pp_c_left_bracket (pp);
1157 if (TREE_PURPOSE (init))
1158 pp_c_constant (pp, TREE_PURPOSE (init));
1159 pp_c_right_bracket (pp);
1161 pp_c_whitespace (pp);
1162 pp_equal (pp);
1163 pp_c_whitespace (pp);
1164 pp_initializer (pp, TREE_VALUE (init));
1165 if (TREE_CHAIN (init))
1166 pp_separate_with (pp, ',');
1169 return;
1171 case VECTOR_TYPE:
1172 if (TREE_CODE (e) == VECTOR_CST)
1173 pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
1174 else if (TREE_CODE (e) == CONSTRUCTOR)
1175 pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
1176 else
1177 break;
1178 return;
1180 case COMPLEX_TYPE:
1181 if (TREE_CODE (e) == CONSTRUCTOR)
1182 pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
1183 else if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
1185 const bool cst = TREE_CODE (e) == COMPLEX_CST;
1186 pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
1187 pp_separate_with (pp, ',');
1188 pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
1190 else
1191 break;
1192 return;
1194 default:
1195 break;
1198 pp_unsupported_tree (pp, type);
1201 /* Pretty-print a brace-enclosed initializer-list. */
1203 static void
1204 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
1206 pp_c_left_brace (pp);
1207 pp_c_initializer_list (pp, l);
1208 pp_c_right_brace (pp);
1212 /* This is a convenient function, used to bridge gap between C and C++
1213 grammars.
1215 id-expression:
1216 identifier */
1218 void
1219 pp_c_id_expression (c_pretty_printer *pp, tree t)
1221 switch (TREE_CODE (t))
1223 case VAR_DECL:
1224 case PARM_DECL:
1225 case CONST_DECL:
1226 case TYPE_DECL:
1227 case FUNCTION_DECL:
1228 case FIELD_DECL:
1229 case LABEL_DECL:
1230 pp_c_tree_decl_identifier (pp, t);
1231 break;
1233 case IDENTIFIER_NODE:
1234 pp_c_tree_identifier (pp, t);
1235 break;
1237 default:
1238 pp_unsupported_tree (pp, t);
1239 break;
1243 /* postfix-expression:
1244 primary-expression
1245 postfix-expression [ expression ]
1246 postfix-expression ( argument-expression-list(opt) )
1247 postfix-expression . identifier
1248 postfix-expression -> identifier
1249 postfix-expression ++
1250 postfix-expression --
1251 ( type-name ) { initializer-list }
1252 ( type-name ) { initializer-list , } */
1254 void
1255 pp_c_postfix_expression (c_pretty_printer *pp, tree e)
1257 enum tree_code code = TREE_CODE (e);
1258 switch (code)
1260 case POSTINCREMENT_EXPR:
1261 case POSTDECREMENT_EXPR:
1262 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1263 pp_identifier (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
1264 break;
1266 case ARRAY_REF:
1267 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1268 pp_c_left_bracket (pp);
1269 pp_expression (pp, TREE_OPERAND (e, 1));
1270 pp_c_right_bracket (pp);
1271 break;
1273 case CALL_EXPR:
1274 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1275 pp_c_call_argument_list (pp, TREE_OPERAND (e, 1));
1276 break;
1278 case UNORDERED_EXPR:
1279 pp_c_identifier (pp, flag_isoc99
1280 ? "isunordered"
1281 : "__builtin_isunordered");
1282 goto two_args_fun;
1284 case ORDERED_EXPR:
1285 pp_c_identifier (pp, flag_isoc99
1286 ? "!isunordered"
1287 : "!__builtin_isunordered");
1288 goto two_args_fun;
1290 case UNLT_EXPR:
1291 pp_c_identifier (pp, flag_isoc99
1292 ? "!isgreaterequal"
1293 : "!__builtin_isgreaterequal");
1294 goto two_args_fun;
1296 case UNLE_EXPR:
1297 pp_c_identifier (pp, flag_isoc99
1298 ? "!isgreater"
1299 : "!__builtin_isgreater");
1300 goto two_args_fun;
1302 case UNGT_EXPR:
1303 pp_c_identifier (pp, flag_isoc99
1304 ? "!islessequal"
1305 : "!__builtin_islessequal");
1306 goto two_args_fun;
1308 case UNGE_EXPR:
1309 pp_c_identifier (pp, flag_isoc99
1310 ? "!isless"
1311 : "!__builtin_isless");
1312 goto two_args_fun;
1314 case UNEQ_EXPR:
1315 pp_c_identifier (pp, flag_isoc99
1316 ? "!islessgreater"
1317 : "!__builtin_islessgreater");
1318 goto two_args_fun;
1320 case LTGT_EXPR:
1321 pp_c_identifier (pp, flag_isoc99
1322 ? "islessgreater"
1323 : "__builtin_islessgreater");
1324 goto two_args_fun;
1326 two_args_fun:
1327 pp_c_left_paren (pp);
1328 pp_expression (pp, TREE_OPERAND (e, 0));
1329 pp_separate_with (pp, ',');
1330 pp_expression (pp, TREE_OPERAND (e, 1));
1331 pp_c_right_paren (pp);
1332 break;
1334 case ABS_EXPR:
1335 pp_c_identifier (pp, "__builtin_abs");
1336 pp_c_left_paren (pp);
1337 pp_expression (pp, TREE_OPERAND (e, 0));
1338 pp_c_right_paren (pp);
1339 break;
1341 case COMPONENT_REF:
1343 tree object = TREE_OPERAND (e, 0);
1344 if (TREE_CODE (object) == INDIRECT_REF)
1346 pp_postfix_expression (pp, TREE_OPERAND (object, 0));
1347 pp_c_arrow (pp);
1349 else
1351 pp_postfix_expression (pp, object);
1352 pp_c_dot (pp);
1354 pp_expression (pp, TREE_OPERAND (e, 1));
1356 break;
1358 case COMPLEX_CST:
1359 case VECTOR_CST:
1360 case COMPLEX_EXPR:
1361 pp_c_compound_literal (pp, e);
1362 break;
1364 case COMPOUND_LITERAL_EXPR:
1365 e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
1366 /* Fall through. */
1367 case CONSTRUCTOR:
1368 pp_initializer (pp, e);
1369 break;
1371 case VA_ARG_EXPR:
1372 pp_c_identifier (pp, "__builtin_va_arg");
1373 pp_c_left_paren (pp);
1374 pp_assignment_expression (pp, TREE_OPERAND (e, 0));
1375 pp_separate_with (pp, ',');
1376 pp_type_id (pp, TREE_TYPE (e));
1377 pp_c_right_paren (pp);
1378 break;
1380 case ADDR_EXPR:
1381 if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
1383 pp_c_id_expression (pp, TREE_OPERAND (e, 0));
1384 break;
1386 /* else fall through. */
1388 default:
1389 pp_primary_expression (pp, e);
1390 break;
1394 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1396 void
1397 pp_c_expression_list (c_pretty_printer *pp, tree e)
1399 for (; e != NULL_TREE; e = TREE_CHAIN (e))
1401 pp_expression (pp, TREE_VALUE (e));
1402 if (TREE_CHAIN (e))
1403 pp_separate_with (pp, ',');
1407 /* Print out V, which contains the elements of a constructor. */
1409 void
1410 pp_c_constructor_elts (c_pretty_printer *pp, VEC(constructor_elt,gc) *v)
1412 unsigned HOST_WIDE_INT ix;
1413 tree value;
1415 FOR_EACH_CONSTRUCTOR_VALUE (v, ix, value)
1417 pp_expression (pp, value);
1418 if (ix != VEC_length (constructor_elt, v) - 1)
1419 pp_separate_with (pp, ',');
1423 /* Print out an expression-list in parens, as in a function call. */
1425 void
1426 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
1428 pp_c_left_paren (pp);
1429 if (t && TREE_CODE (t) == TREE_LIST)
1430 pp_c_expression_list (pp, t);
1431 pp_c_right_paren (pp);
1434 /* unary-expression:
1435 postfix-expression
1436 ++ cast-expression
1437 -- cast-expression
1438 unary-operator cast-expression
1439 sizeof unary-expression
1440 sizeof ( type-id )
1442 unary-operator: one of
1443 * & + - ! ~
1445 GNU extensions.
1446 unary-expression:
1447 __alignof__ unary-expression
1448 __alignof__ ( type-id )
1449 __real__ unary-expression
1450 __imag__ unary-expression */
1452 void
1453 pp_c_unary_expression (c_pretty_printer *pp, tree e)
1455 enum tree_code code = TREE_CODE (e);
1456 switch (code)
1458 case PREINCREMENT_EXPR:
1459 case PREDECREMENT_EXPR:
1460 pp_identifier (pp, code == PREINCREMENT_EXPR ? "++" : "--");
1461 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1462 break;
1464 case ADDR_EXPR:
1465 case INDIRECT_REF:
1466 case NEGATE_EXPR:
1467 case BIT_NOT_EXPR:
1468 case TRUTH_NOT_EXPR:
1469 case CONJ_EXPR:
1470 /* String literal are used by address. */
1471 if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
1472 pp_ampersand (pp);
1473 else if (code == INDIRECT_REF)
1474 pp_c_star (pp);
1475 else if (code == NEGATE_EXPR)
1476 pp_minus (pp);
1477 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
1478 pp_complement (pp);
1479 else if (code == TRUTH_NOT_EXPR)
1480 pp_exclamation (pp);
1481 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1482 break;
1484 case REALPART_EXPR:
1485 case IMAGPART_EXPR:
1486 pp_c_identifier (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
1487 pp_c_whitespace (pp);
1488 pp_unary_expression (pp, TREE_OPERAND (e, 0));
1489 break;
1491 default:
1492 pp_postfix_expression (pp, e);
1493 break;
1497 /* cast-expression:
1498 unary-expression
1499 ( type-name ) cast-expression */
1501 void
1502 pp_c_cast_expression (c_pretty_printer *pp, tree e)
1504 switch (TREE_CODE (e))
1506 case FLOAT_EXPR:
1507 case FIX_TRUNC_EXPR:
1508 case CONVERT_EXPR:
1509 case NOP_EXPR:
1510 pp_c_type_cast (pp, TREE_TYPE (e));
1511 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1512 break;
1514 default:
1515 pp_unary_expression (pp, e);
1519 /* multiplicative-expression:
1520 cast-expression
1521 multiplicative-expression * cast-expression
1522 multiplicative-expression / cast-expression
1523 multiplicative-expression % cast-expression */
1525 static void
1526 pp_c_multiplicative_expression (c_pretty_printer *pp, tree e)
1528 enum tree_code code = TREE_CODE (e);
1529 switch (code)
1531 case MULT_EXPR:
1532 case TRUNC_DIV_EXPR:
1533 case TRUNC_MOD_EXPR:
1534 pp_multiplicative_expression (pp, TREE_OPERAND (e, 0));
1535 pp_c_whitespace (pp);
1536 if (code == MULT_EXPR)
1537 pp_c_star (pp);
1538 else if (code == TRUNC_DIV_EXPR)
1539 pp_slash (pp);
1540 else
1541 pp_modulo (pp);
1542 pp_c_whitespace (pp);
1543 pp_c_cast_expression (pp, TREE_OPERAND (e, 1));
1544 break;
1546 default:
1547 pp_c_cast_expression (pp, e);
1548 break;
1552 /* additive-expression:
1553 multiplicative-expression
1554 additive-expression + multiplicative-expression
1555 additive-expression - multiplicative-expression */
1557 static void
1558 pp_c_additive_expression (c_pretty_printer *pp, tree e)
1560 enum tree_code code = TREE_CODE (e);
1561 switch (code)
1563 case PLUS_EXPR:
1564 case MINUS_EXPR:
1565 pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
1566 pp_c_whitespace (pp);
1567 if (code == PLUS_EXPR)
1568 pp_plus (pp);
1569 else
1570 pp_minus (pp);
1571 pp_c_whitespace (pp);
1572 pp_multiplicative_expression (pp, TREE_OPERAND (e, 1));
1573 break;
1575 default:
1576 pp_multiplicative_expression (pp, e);
1577 break;
1581 /* additive-expression:
1582 additive-expression
1583 shift-expression << additive-expression
1584 shift-expression >> additive-expression */
1586 static void
1587 pp_c_shift_expression (c_pretty_printer *pp, tree e)
1589 enum tree_code code = TREE_CODE (e);
1590 switch (code)
1592 case LSHIFT_EXPR:
1593 case RSHIFT_EXPR:
1594 pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
1595 pp_c_whitespace (pp);
1596 pp_identifier (pp, code == LSHIFT_EXPR ? "<<" : ">>");
1597 pp_c_whitespace (pp);
1598 pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
1599 break;
1601 default:
1602 pp_c_additive_expression (pp, e);
1606 /* relational-expression:
1607 shift-expression
1608 relational-expression < shift-expression
1609 relational-expression > shift-expression
1610 relational-expression <= shift-expression
1611 relational-expression >= shift-expression */
1613 static void
1614 pp_c_relational_expression (c_pretty_printer *pp, tree e)
1616 enum tree_code code = TREE_CODE (e);
1617 switch (code)
1619 case LT_EXPR:
1620 case GT_EXPR:
1621 case LE_EXPR:
1622 case GE_EXPR:
1623 pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
1624 pp_c_whitespace (pp);
1625 if (code == LT_EXPR)
1626 pp_less (pp);
1627 else if (code == GT_EXPR)
1628 pp_greater (pp);
1629 else if (code == LE_EXPR)
1630 pp_identifier (pp, "<=");
1631 else if (code == GE_EXPR)
1632 pp_identifier (pp, ">=");
1633 pp_c_whitespace (pp);
1634 pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
1635 break;
1637 default:
1638 pp_c_shift_expression (pp, e);
1639 break;
1643 /* equality-expression:
1644 relational-expression
1645 equality-expression == relational-expression
1646 equality-equality != relational-expression */
1648 static void
1649 pp_c_equality_expression (c_pretty_printer *pp, tree e)
1651 enum tree_code code = TREE_CODE (e);
1652 switch (code)
1654 case EQ_EXPR:
1655 case NE_EXPR:
1656 pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
1657 pp_c_whitespace (pp);
1658 pp_identifier (pp, code == EQ_EXPR ? "==" : "!=");
1659 pp_c_whitespace (pp);
1660 pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
1661 break;
1663 default:
1664 pp_c_relational_expression (pp, e);
1665 break;
1669 /* AND-expression:
1670 equality-expression
1671 AND-expression & equality-equality */
1673 static void
1674 pp_c_and_expression (c_pretty_printer *pp, tree e)
1676 if (TREE_CODE (e) == BIT_AND_EXPR)
1678 pp_c_and_expression (pp, TREE_OPERAND (e, 0));
1679 pp_c_whitespace (pp);
1680 pp_ampersand (pp);
1681 pp_c_whitespace (pp);
1682 pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
1684 else
1685 pp_c_equality_expression (pp, e);
1688 /* exclusive-OR-expression:
1689 AND-expression
1690 exclusive-OR-expression ^ AND-expression */
1692 static void
1693 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
1695 if (TREE_CODE (e) == BIT_XOR_EXPR)
1697 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1698 pp_c_maybe_whitespace (pp);
1699 pp_carret (pp);
1700 pp_c_whitespace (pp);
1701 pp_c_and_expression (pp, TREE_OPERAND (e, 1));
1703 else
1704 pp_c_and_expression (pp, e);
1707 /* inclusive-OR-expression:
1708 exclusive-OR-expression
1709 inclusive-OR-expression | exclusive-OR-expression */
1711 static void
1712 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
1714 if (TREE_CODE (e) == BIT_IOR_EXPR)
1716 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1717 pp_c_whitespace (pp);
1718 pp_bar (pp);
1719 pp_c_whitespace (pp);
1720 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
1722 else
1723 pp_c_exclusive_or_expression (pp, e);
1726 /* logical-AND-expression:
1727 inclusive-OR-expression
1728 logical-AND-expression && inclusive-OR-expression */
1730 static void
1731 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
1733 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
1735 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
1736 pp_c_whitespace (pp);
1737 pp_identifier (pp, "&&");
1738 pp_c_whitespace (pp);
1739 pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
1741 else
1742 pp_c_inclusive_or_expression (pp, e);
1745 /* logical-OR-expression:
1746 logical-AND-expression
1747 logical-OR-expression || logical-AND-expression */
1749 void
1750 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
1752 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1754 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1755 pp_c_whitespace (pp);
1756 pp_identifier (pp, "||");
1757 pp_c_whitespace (pp);
1758 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
1760 else
1761 pp_c_logical_and_expression (pp, e);
1764 /* conditional-expression:
1765 logical-OR-expression
1766 logical-OR-expression ? expression : conditional-expression */
1768 static void
1769 pp_c_conditional_expression (c_pretty_printer *pp, tree e)
1771 if (TREE_CODE (e) == COND_EXPR)
1773 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1774 pp_c_whitespace (pp);
1775 pp_question (pp);
1776 pp_c_whitespace (pp);
1777 pp_expression (pp, TREE_OPERAND (e, 1));
1778 pp_c_whitespace (pp);
1779 pp_colon (pp);
1780 pp_c_whitespace (pp);
1781 pp_c_conditional_expression (pp, TREE_OPERAND (e, 2));
1783 else
1784 pp_c_logical_or_expression (pp, e);
1788 /* assignment-expression:
1789 conditional-expression
1790 unary-expression assignment-operator assignment-expression
1792 assignment-expression: one of
1793 = *= /= %= += -= >>= <<= &= ^= |= */
1795 static void
1796 pp_c_assignment_expression (c_pretty_printer *pp, tree e)
1798 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
1800 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1801 pp_c_whitespace (pp);
1802 pp_equal (pp);
1803 pp_space (pp);
1804 pp_c_expression (pp, TREE_OPERAND (e, 1));
1806 else
1807 pp_c_conditional_expression (pp, e);
1810 /* expression:
1811 assignment-expression
1812 expression , assignment-expression
1814 Implementation note: instead of going through the usual recursion
1815 chain, I take the liberty of dispatching nodes to the appropriate
1816 functions. This makes some redundancy, but it worths it. That also
1817 prevents a possible infinite recursion between pp_c_primary_expression ()
1818 and pp_c_expression (). */
1820 void
1821 pp_c_expression (c_pretty_printer *pp, tree e)
1823 switch (TREE_CODE (e))
1825 case INTEGER_CST:
1826 pp_c_integer_constant (pp, e);
1827 break;
1829 case REAL_CST:
1830 pp_c_floating_constant (pp, e);
1831 break;
1833 case STRING_CST:
1834 pp_c_string_literal (pp, e);
1835 break;
1837 case IDENTIFIER_NODE:
1838 case FUNCTION_DECL:
1839 case VAR_DECL:
1840 case CONST_DECL:
1841 case PARM_DECL:
1842 case RESULT_DECL:
1843 case FIELD_DECL:
1844 case LABEL_DECL:
1845 case ERROR_MARK:
1846 pp_primary_expression (pp, e);
1847 break;
1849 case POSTINCREMENT_EXPR:
1850 case POSTDECREMENT_EXPR:
1851 case ARRAY_REF:
1852 case CALL_EXPR:
1853 case COMPONENT_REF:
1854 case COMPLEX_CST:
1855 case COMPLEX_EXPR:
1856 case VECTOR_CST:
1857 case ORDERED_EXPR:
1858 case UNORDERED_EXPR:
1859 case LTGT_EXPR:
1860 case UNEQ_EXPR:
1861 case UNLE_EXPR:
1862 case UNLT_EXPR:
1863 case UNGE_EXPR:
1864 case UNGT_EXPR:
1865 case ABS_EXPR:
1866 case CONSTRUCTOR:
1867 case COMPOUND_LITERAL_EXPR:
1868 case VA_ARG_EXPR:
1869 pp_postfix_expression (pp, e);
1870 break;
1872 case CONJ_EXPR:
1873 case ADDR_EXPR:
1874 case INDIRECT_REF:
1875 case NEGATE_EXPR:
1876 case BIT_NOT_EXPR:
1877 case TRUTH_NOT_EXPR:
1878 case PREINCREMENT_EXPR:
1879 case PREDECREMENT_EXPR:
1880 case REALPART_EXPR:
1881 case IMAGPART_EXPR:
1882 pp_c_unary_expression (pp, e);
1883 break;
1885 case FLOAT_EXPR:
1886 case FIX_TRUNC_EXPR:
1887 case CONVERT_EXPR:
1888 case NOP_EXPR:
1889 pp_c_cast_expression (pp, e);
1890 break;
1892 case MULT_EXPR:
1893 case TRUNC_MOD_EXPR:
1894 case TRUNC_DIV_EXPR:
1895 pp_multiplicative_expression (pp, e);
1896 break;
1898 case LSHIFT_EXPR:
1899 case RSHIFT_EXPR:
1900 pp_c_shift_expression (pp, e);
1901 break;
1903 case LT_EXPR:
1904 case GT_EXPR:
1905 case LE_EXPR:
1906 case GE_EXPR:
1907 pp_c_relational_expression (pp, e);
1908 break;
1910 case BIT_AND_EXPR:
1911 pp_c_and_expression (pp, e);
1912 break;
1914 case BIT_XOR_EXPR:
1915 pp_c_exclusive_or_expression (pp, e);
1916 break;
1918 case BIT_IOR_EXPR:
1919 pp_c_inclusive_or_expression (pp, e);
1920 break;
1922 case TRUTH_ANDIF_EXPR:
1923 pp_c_logical_and_expression (pp, e);
1924 break;
1926 case TRUTH_ORIF_EXPR:
1927 pp_c_logical_or_expression (pp, e);
1928 break;
1930 case EQ_EXPR:
1931 case NE_EXPR:
1932 pp_c_equality_expression (pp, e);
1933 break;
1935 case COND_EXPR:
1936 pp_conditional_expression (pp, e);
1937 break;
1939 case PLUS_EXPR:
1940 case MINUS_EXPR:
1941 pp_c_additive_expression (pp, e);
1942 break;
1944 case MODIFY_EXPR:
1945 case INIT_EXPR:
1946 pp_assignment_expression (pp, e);
1947 break;
1949 case COMPOUND_EXPR:
1950 pp_c_left_paren (pp);
1951 pp_expression (pp, TREE_OPERAND (e, 0));
1952 pp_separate_with (pp, ',');
1953 pp_assignment_expression (pp, TREE_OPERAND (e, 1));
1954 pp_c_right_paren (pp);
1955 break;
1957 case NON_LVALUE_EXPR:
1958 case SAVE_EXPR:
1959 pp_expression (pp, TREE_OPERAND (e, 0));
1960 break;
1962 case TARGET_EXPR:
1963 pp_postfix_expression (pp, TREE_OPERAND (e, 1));
1964 break;
1966 default:
1967 pp_unsupported_tree (pp, e);
1968 break;
1974 /* Statements. */
1976 void
1977 pp_c_statement (c_pretty_printer *pp, tree stmt)
1979 if (stmt == NULL)
1980 return;
1982 if (pp_needs_newline (pp))
1983 pp_newline_and_indent (pp, 0);
1985 dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
1989 /* Initialize the PRETTY-PRINTER for handling C codes. */
1991 void
1992 pp_c_pretty_printer_init (c_pretty_printer *pp)
1994 pp->offset_list = 0;
1996 pp->declaration = pp_c_declaration;
1997 pp->declaration_specifiers = pp_c_declaration_specifiers;
1998 pp->declarator = pp_c_declarator;
1999 pp->direct_declarator = pp_c_direct_declarator;
2000 pp->type_specifier_seq = pp_c_specifier_qualifier_list;
2001 pp->abstract_declarator = pp_c_abstract_declarator;
2002 pp->direct_abstract_declarator = pp_c_direct_abstract_declarator;
2003 pp->ptr_operator = pp_c_pointer;
2004 pp->parameter_list = pp_c_parameter_type_list;
2005 pp->type_id = pp_c_type_id;
2006 pp->simple_type_specifier = pp_c_type_specifier;
2007 pp->function_specifier = pp_c_function_specifier;
2008 pp->storage_class_specifier = pp_c_storage_class_specifier;
2010 pp->statement = pp_c_statement;
2012 pp->constant = pp_c_constant;
2013 pp->id_expression = pp_c_id_expression;
2014 pp->primary_expression = pp_c_primary_expression;
2015 pp->postfix_expression = pp_c_postfix_expression;
2016 pp->unary_expression = pp_c_unary_expression;
2017 pp->initializer = pp_c_initializer;
2018 pp->multiplicative_expression = pp_c_multiplicative_expression;
2019 pp->conditional_expression = pp_c_conditional_expression;
2020 pp->assignment_expression = pp_c_assignment_expression;
2021 pp->expression = pp_c_expression;
2025 /* Print the tree T in full, on file FILE. */
2027 void
2028 print_c_tree (FILE *file, tree t)
2030 static c_pretty_printer pp_rec;
2031 static bool initialized = 0;
2032 c_pretty_printer *pp = &pp_rec;
2034 if (!initialized)
2036 initialized = 1;
2037 pp_construct (pp_base (pp), NULL, 0);
2038 pp_c_pretty_printer_init (pp);
2039 pp_needs_newline (pp) = true;
2041 pp_base (pp)->buffer->stream = file;
2043 pp_statement (pp, t);
2045 pp_newline (pp);
2046 pp_flush (pp);
2049 /* Print the tree T in full, on stderr. */
2051 void
2052 debug_c_tree (tree t)
2054 print_c_tree (stderr, t);
2055 fputc ('\n', stderr);
2058 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
2059 up of T's memory address. */
2061 void
2062 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
2064 const char *name;
2066 gcc_assert (DECL_P (t));
2068 if (DECL_NAME (t))
2069 name = IDENTIFIER_POINTER (DECL_NAME (t));
2070 else
2072 static char xname[8];
2073 sprintf (xname, "<U%4x>", ((unsigned)((unsigned long)(t) & 0xffff)));
2074 name = xname;
2077 pp_c_identifier (pp, name);