* MAINTAINERS: (Write After Approval): Add myself.
[official-gcc.git] / gcc / c-pretty-print.c
blob1ab0569b6a4fd7a8c5e00398644797c573226f82
1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002 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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #include "config.h"
23 #include "system.h"
24 #include "real.h"
25 #include "c-pretty-print.h"
26 #include "c-tree.h"
28 /* literal */
29 static void pp_c_char PARAMS ((c_pretty_printer, int));
30 static void pp_c_character_literal PARAMS ((c_pretty_printer, tree));
31 static void pp_c_bool_literal PARAMS ((c_pretty_printer, tree));
32 static bool pp_c_enumerator PARAMS ((c_pretty_printer, tree));
33 static void pp_c_integer_literal PARAMS ((c_pretty_printer, tree));
34 static void pp_c_real_literal PARAMS ((c_pretty_printer, tree));
35 static void pp_c_string_literal PARAMS ((c_pretty_printer, tree));
37 static void pp_c_primary_expression PARAMS ((c_pretty_printer, tree));
39 /* postfix-expression */
40 static void pp_c_initializer_list PARAMS ((c_pretty_printer, tree));
42 static void pp_c_unary_expression PARAMS ((c_pretty_printer, tree));
43 static void pp_c_multiplicative_expression PARAMS ((c_pretty_printer, tree));
44 static void pp_c_additive_expression PARAMS ((c_pretty_printer, tree));
45 static void pp_c_shift_expression PARAMS ((c_pretty_printer, tree));
46 static void pp_c_relational_expression PARAMS ((c_pretty_printer, tree));
47 static void pp_c_equality_expression PARAMS ((c_pretty_printer, tree));
48 static void pp_c_and_expression PARAMS ((c_pretty_printer, tree));
49 static void pp_c_exclusive_or_expression PARAMS ((c_pretty_printer,
50 tree));
51 static void pp_c_inclusive_or_expression PARAMS ((c_pretty_printer,
52 tree));
53 static void pp_c_logical_and_expression PARAMS ((c_pretty_printer, tree));
54 static void pp_c_conditional_expression PARAMS ((c_pretty_printer, tree));
55 static void pp_c_assignment_expression PARAMS ((c_pretty_printer, tree));
57 /* declarations. */
58 static void pp_c_declaration_specifiers PARAMS ((c_pretty_printer, tree));
59 static void pp_c_init_declarator PARAMS ((c_pretty_printer, tree));
60 static void pp_c_declarator PARAMS ((c_pretty_printer, tree));
61 static void pp_c_direct_declarator PARAMS ((c_pretty_printer, tree));
62 static void pp_c_abstract_declarator PARAMS ((c_pretty_printer, tree));
63 static void pp_c_specifier_qualifier_list PARAMS ((c_pretty_printer, tree));
64 static void pp_c_simple_type_specifier PARAMS ((c_pretty_printer, tree));
65 static void pp_c_parameter_declaration PARAMS ((c_pretty_printer, tree));
66 static void pp_c_type_id PARAMS ((c_pretty_printer, tree));
67 static void pp_c_storage_class_specifier PARAMS ((c_pretty_printer, tree));
68 static void pp_c_function_specifier PARAMS ((c_pretty_printer, tree));
71 /* Declarations. */
73 /* Print out CV-qualifiers. Take care of possible extensions. */
74 void
75 pp_c_cv_qualifier (ppi, cv)
76 c_pretty_printer ppi;
77 int cv;
79 if (cv & TYPE_QUAL_CONST)
80 pp_c_identifier (ppi, "const");
81 if (cv & TYPE_QUAL_VOLATILE)
82 pp_c_identifier (ppi, "volatile");
83 if (cv & TYPE_QUAL_RESTRICT)
84 pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
87 static void
88 pp_c_simple_type_specifier (ppi, t)
89 c_pretty_printer ppi;
90 tree t;
92 const enum tree_code code = TREE_CODE (t);
93 switch (code)
95 case ERROR_MARK:
96 pp_c_identifier (ppi, "<type-error>");
97 break;
99 #if 0
100 case UNKNOWN_TYPE:
101 pp_c_identifier (ppi, "<unkown-type>");
102 break;
103 #endif
105 case IDENTIFIER_NODE:
106 pp_c_tree_identifier (ppi, t);
107 break;
109 case VOID_TYPE:
110 case BOOLEAN_TYPE:
111 case CHAR_TYPE:
112 case INTEGER_TYPE:
113 case REAL_TYPE:
114 pp_c_tree_identifier (ppi, DECL_NAME (t));
115 break;
117 case COMPLEX_TYPE:
118 case VECTOR_TYPE:
119 pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
120 if (code == COMPLEX_TYPE)
121 pp_c_identifier (ppi, flag_isoc99 ? "_Complex" : "__complex__");
122 else if (code == VECTOR_TYPE)
123 pp_c_identifier (ppi, "__vector__");
124 break;
126 case TYPE_DECL:
127 if (DECL_NAME (t))
128 pp_c_tree_identifier (ppi, DECL_NAME (t));
129 else
130 pp_c_identifier (ppi, "<typedef-error>");
131 break;
133 case UNION_TYPE:
134 case RECORD_TYPE:
135 case ENUMERAL_TYPE:
136 if (code == UNION_TYPE)
137 pp_c_identifier (ppi, "union");
138 else if (code == RECORD_TYPE)
139 pp_c_identifier (ppi, "struct");
140 else if (code == ENUMERAL_TYPE)
141 pp_c_identifier (ppi, "enum");
142 else
143 pp_c_identifier (ppi, "<tag-error>");
145 if (TYPE_NAME (t))
146 pp_c_tree_identifier (ppi, TYPE_NAME (t));
147 else
148 pp_c_identifier (ppi, "<anonymous>");
149 break;
151 default:
152 pp_unsupported_tree (ppi, t);
156 static inline void
157 pp_c_specifier_qualifier_list (ppi, t)
158 c_pretty_printer ppi;
159 tree t;
161 pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
162 pp_c_cv_qualifier (ppi, TYPE_QUALS (t));
165 static void
166 pp_c_abstract_declarator (ppi, t)
167 c_pretty_printer ppi;
168 tree t;
170 pp_unsupported_tree (ppi, t);
174 static inline void
175 pp_c_type_id (ppi, t)
176 c_pretty_printer ppi;
177 tree t;
179 pp_c_specifier_qualifier_list (ppi, t);
180 pp_c_abstract_declarator (ppi, t);
183 static inline void
184 pp_c_storage_class_specifier (pp, t)
185 c_pretty_printer pp;
186 tree t;
188 if (TREE_CODE (t) == TYPE_DECL)
189 pp_c_identifier (pp, "typedef");
190 else if (DECL_REGISTER (t))
191 pp_c_identifier (pp, "register");
194 static inline void
195 pp_c_function_specifier (pp, t)
196 c_pretty_printer pp;
197 tree t;
199 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
200 pp_c_identifier (pp, "inline");
203 static inline void
204 pp_c_declaration_specifiers (pp, t)
205 c_pretty_printer pp;
206 tree t;
208 pp_c_storage_class_specifier (pp, t);
209 pp_c_function_specifier (pp, t);
210 pp_type_specifier (pp, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
211 pp_c_cv_qualifier (pp, TYPE_QUALS (TREE_TYPE (t)));
214 static inline void
215 pp_c_direct_declarator (pp, t)
216 c_pretty_printer pp;
217 tree t;
219 pp_unsupported_tree (pp, t);
222 static inline void
223 pp_c_declarator (pp, t)
224 c_pretty_printer pp;
225 tree t;
227 pp_unsupported_tree (pp, t);
230 static inline void
231 pp_c_init_declarator (pp, t)
232 c_pretty_printer pp;
233 tree t;
235 pp_declarator (pp, t);
236 if (DECL_INITIAL (t))
238 pp_whitespace (pp);
239 pp_equal (pp);
240 pp_whitespace (pp);
241 pp_c_initializer (pp, DECL_INITIAL (t));
245 void
246 pp_c_declaration (pp, t)
247 c_pretty_printer pp;
248 tree t;
250 pp_declaration_specifiers (pp, t);
251 pp_c_init_declarator (pp, t);
254 static void
255 pp_c_parameter_declaration (pp, t)
256 c_pretty_printer pp;
257 tree t;
259 pp_unsupported_tree (pp, t);
262 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
263 void
264 pp_c_attributes (pp, attributes)
265 c_pretty_printer pp;
266 tree attributes;
268 if (attributes == NULL_TREE)
269 return;
271 pp_c_identifier (pp, "__attribute__");
272 pp_c_left_paren (pp);
273 pp_c_left_paren (pp);
274 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
276 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
277 if (TREE_VALUE (attributes))
279 pp_c_left_paren (pp);
280 pp_c_expression_list (pp, TREE_VALUE (attributes));
281 pp_c_right_paren (pp);
284 if (TREE_CHAIN (attributes))
285 pp_separate_with (pp, ',');
287 pp_c_right_paren (pp);
288 pp_c_right_paren (pp);
292 /* Expressions. */
294 /* Print out a c-char. */
295 static void
296 pp_c_char (ppi, c)
297 c_pretty_printer ppi;
298 int c;
300 switch (c)
302 case TARGET_NEWLINE:
303 pp_identifier (ppi, "\\n");
304 break;
305 case TARGET_TAB:
306 pp_identifier (ppi, "\\t");
307 break;
308 case TARGET_VT:
309 pp_identifier (ppi, "\\v");
310 break;
311 case TARGET_BS:
312 pp_identifier (ppi, "\\b");
313 break;
314 case TARGET_CR:
315 pp_identifier (ppi, "\\r");
316 break;
317 case TARGET_FF:
318 pp_identifier (ppi, "\\f");
319 break;
320 case TARGET_BELL:
321 pp_identifier (ppi, "\\a");
322 break;
323 case '\\':
324 pp_identifier (ppi, "\\\\");
325 break;
326 case '\'':
327 pp_identifier (ppi, "\\'");
328 break;
329 case '\"':
330 pp_identifier (ppi, "\\\"");
331 break;
332 default:
333 if (ISPRINT (c))
334 pp_character (ppi, c);
335 else
336 pp_format_scalar (ppi, "\\%03o", (unsigned) c);
337 break;
341 /* Print out a STRING literal. */
342 static inline void
343 pp_c_string_literal (ppi, s)
344 c_pretty_printer ppi;
345 tree s;
347 const char *p = TREE_STRING_POINTER (s);
348 int n = TREE_STRING_LENGTH (s) - 1;
349 int i;
350 pp_doublequote (ppi);
351 for (i = 0; i < n; ++i)
352 pp_c_char (ppi, p[i]);
353 pp_doublequote (ppi);
356 /* Print out a CHARACTER literal. */
357 static inline void
358 pp_c_character_literal (ppi, c)
359 c_pretty_printer ppi;
360 tree c;
362 pp_quote (ppi);
363 pp_c_char (ppi, tree_low_cst (c, 0));
364 pp_quote (ppi);
367 /* Print out a BOOLEAN literal. */
368 static inline void
369 pp_c_bool_literal (ppi, b)
370 c_pretty_printer ppi;
371 tree b;
373 if (b == boolean_false_node || integer_zerop (b))
375 if (c_language == clk_cplusplus)
376 pp_c_identifier (ppi, "false");
377 else if (c_language == clk_c && flag_isoc99)
378 pp_c_identifier (ppi, "_False");
379 else
380 pp_unsupported_tree (ppi, b);
382 else if (b == boolean_true_node)
384 if (c_language == clk_cplusplus)
385 pp_c_identifier (ppi, "true");
386 else if (c_language == clk_c && flag_isoc99)
387 pp_c_identifier (ppi, "_True");
388 else
389 pp_unsupported_tree (ppi, b);
391 else
392 pp_unsupported_tree (ppi, b);
395 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
396 false; that means the value was obtained by a cast, in which case
397 print out the type-id part of the cast-expression -- the casted value
398 is then printed by pp_c_integer_literal. */
399 static bool
400 pp_c_enumerator (ppi, e)
401 c_pretty_printer ppi;
402 tree e;
404 tree type = TREE_TYPE (e);
405 tree value;
407 /* Find the name of this constant. */
408 for (value = TYPE_VALUES (type);
409 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
410 value = TREE_CHAIN (value))
413 if (value != NULL_TREE)
414 pp_c_tree_identifier (ppi, TREE_PURPOSE (value));
415 else
417 /* Value must have been cast. */
418 pp_c_left_paren (ppi);
419 pp_type_id (ppi, type);
420 pp_c_right_paren (ppi);
421 return false;
424 return true;
427 /* Print out an INTEGER constant value. */
428 static void
429 pp_c_integer_literal (ppi, i)
430 c_pretty_printer ppi;
431 tree i;
433 tree type = TREE_TYPE (i);
435 if (type == boolean_type_node)
436 pp_c_bool_literal (ppi, i);
437 else if (type == char_type_node)
438 pp_c_character_literal (ppi, i);
439 else if (TREE_CODE (type) == ENUMERAL_TYPE
440 && pp_c_enumerator (ppi, i))
442 else
444 if (host_integerp (i, 0))
445 pp_wide_integer (ppi, TREE_INT_CST_LOW (i));
446 else
448 if (tree_int_cst_sgn (i) < 0)
450 static char format[10]; /* "%x%09999x\0" */
451 if (!format[0])
452 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
454 pp_c_char (ppi, '-');
455 i = build_int_2 (-TREE_INT_CST_LOW (i),
456 ~TREE_INT_CST_HIGH (i) + !TREE_INT_CST_LOW (i));
457 sprintf (pp_buffer (ppi)->digit_buffer, format,
458 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
459 pp_identifier (ppi, pp_buffer (ppi)->digit_buffer);
466 /* Print out a REAL value. */
467 static inline void
468 pp_c_real_literal (ppi, r)
469 c_pretty_printer ppi;
470 tree r;
472 REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (r), "%.16g",
473 pp_buffer (ppi)->digit_buffer);
474 pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
478 void
479 pp_c_literal (ppi, e)
480 c_pretty_printer ppi;
481 tree e;
483 switch (TREE_CODE (e))
485 case INTEGER_CST:
486 pp_c_integer_literal (ppi, e);
487 break;
489 case REAL_CST:
490 pp_c_real_literal (ppi, e);
491 break;
493 case STRING_CST:
494 pp_c_string_literal (ppi, e);
495 break;
497 default:
498 pp_unsupported_tree (ppi, e);
499 break;
503 /* Pretty-print a C primary-expression. */
504 static void
505 pp_c_primary_expression (ppi, e)
506 c_pretty_printer ppi;
507 tree e;
509 switch (TREE_CODE (e))
511 case VAR_DECL:
512 case PARM_DECL:
513 case FIELD_DECL:
514 case CONST_DECL:
515 case FUNCTION_DECL:
516 case LABEL_DECL:
517 e = DECL_NAME (e);
518 /* Fall through. */
519 case IDENTIFIER_NODE:
520 pp_c_tree_identifier (ppi, e);
521 break;
523 case ERROR_MARK:
524 pp_c_identifier (ppi, "<erroneous-expression>");
525 break;
527 case RESULT_DECL:
528 pp_c_identifier (ppi, "<return-value>");
529 break;
531 case INTEGER_CST:
532 case REAL_CST:
533 case STRING_CST:
534 pp_c_literal (ppi, e);
535 break;
537 case TARGET_EXPR:
538 pp_c_left_paren (ppi);
539 pp_c_identifier (ppi, "__builtin_memcpy");
540 pp_c_left_paren (ppi);
541 pp_ampersand (ppi);
542 pp_c_primary_expression (ppi, TREE_OPERAND (e, 0));
543 pp_separate_with (ppi, ',');
544 pp_ampersand (ppi);
545 pp_initializer (ppi, TREE_OPERAND (e, 1));
546 if (TREE_OPERAND (e, 2))
548 pp_separate_with (ppi, ',');
549 pp_c_expression (ppi, TREE_OPERAND (e, 2));
551 pp_c_right_paren (ppi);
553 case STMT_EXPR:
554 pp_c_left_paren (ppi);
555 pp_statement (ppi, STMT_EXPR_STMT (e));
556 pp_c_right_paren (ppi);
557 break;
559 default:
560 /* Make sure this call won't cause any infinite loop. */
561 pp_c_left_paren (ppi);
562 pp_c_expression (ppi, e);
563 pp_c_right_paren (ppi);
564 break;
568 /* Print out a C initializer -- also support C compound-literals. */
569 void
570 pp_c_initializer (ppi, e)
571 c_pretty_printer ppi;
572 tree e;
574 if (TREE_CODE (e) == CONSTRUCTOR)
576 enum tree_code code = TREE_CODE (TREE_TYPE (e));
577 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
579 pp_left_brace (ppi);
580 pp_c_initializer_list (ppi, e);
581 pp_right_brace (ppi);
583 else
584 pp_unsupported_tree (ppi, TREE_OPERAND (e, 1));
586 else
587 pp_assignment_expression (ppi, e);
590 static void
591 pp_c_initializer_list (ppi, e)
592 c_pretty_printer ppi;
593 tree e;
595 tree type = TREE_TYPE (e);
596 const enum tree_code code = TREE_CODE (type);
598 if (code == RECORD_TYPE || code == UNION_TYPE || code == ARRAY_TYPE)
600 tree init = TREE_OPERAND (e, 1);
601 for (; init != NULL_TREE; init = TREE_CHAIN (init))
603 if (code == RECORD_TYPE || code == UNION_TYPE)
605 pp_dot (ppi);
606 pp_c_primary_expression (ppi, TREE_PURPOSE (init));
608 else
610 pp_c_left_bracket (ppi);
611 if (TREE_PURPOSE (init))
612 pp_c_literal (ppi, TREE_PURPOSE (init));
613 pp_c_right_bracket (ppi);
615 pp_c_whitespace (ppi);
616 pp_equal (ppi);
617 pp_c_whitespace (ppi);
618 pp_initializer (ppi, TREE_VALUE (init));
619 if (TREE_CHAIN (init))
620 pp_separate_with (ppi, ',');
623 else
624 pp_unsupported_tree (ppi, type);
627 void
628 pp_c_postfix_expression (ppi, e)
629 c_pretty_printer ppi;
630 tree e;
632 enum tree_code code = TREE_CODE (e);
633 switch (code)
635 case POSTINCREMENT_EXPR:
636 case POSTDECREMENT_EXPR:
637 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
638 pp_identifier (ppi, code == POSTINCREMENT_EXPR ? "++" : "--");
639 break;
641 case ARROW_EXPR:
642 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
643 pp_arrow (ppi);
644 break;
646 case ARRAY_REF:
647 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
648 pp_c_left_bracket (ppi);
649 pp_c_expression (ppi, TREE_OPERAND (e, 1));
650 pp_c_right_bracket (ppi);
651 break;
653 case CALL_EXPR:
654 pp_postfix_expression (ppi, TREE_OPERAND (e, 0));
655 pp_c_left_paren (ppi);
656 pp_c_expression_list (ppi, TREE_OPERAND (e, 1));
657 pp_c_right_paren (ppi);
658 break;
660 case ABS_EXPR:
661 case FFS_EXPR:
662 pp_c_identifier (ppi,
663 code == ABS_EXPR ? "__builtin_abs" : "__builtin_ffs");
664 pp_c_left_paren (ppi);
665 pp_c_expression (ppi, TREE_OPERAND (e, 0));
666 pp_c_right_paren (ppi);
667 break;
669 case COMPONENT_REF:
671 tree object = TREE_OPERAND (e, 0);
672 if (TREE_CODE (object) == INDIRECT_REF)
674 pp_postfix_expression (ppi, TREE_OPERAND (object, 0));
675 pp_arrow (ppi);
677 else
679 pp_postfix_expression (ppi, object);
680 pp_dot (ppi);
682 pp_c_expression (ppi, TREE_OPERAND (e, 1));
684 break;
686 case COMPLEX_CST:
687 case VECTOR_CST:
688 case COMPLEX_EXPR:
689 pp_c_left_paren (ppi);
690 pp_type_id (ppi, TREE_TYPE (e));
691 pp_c_right_paren (ppi);
692 pp_left_brace (ppi);
694 if (code == COMPLEX_CST)
696 pp_c_expression (ppi, TREE_REALPART (e));
697 pp_separate_with (ppi, ',');
698 pp_c_expression (ppi, TREE_IMAGPART (e));
700 else if (code == VECTOR_CST)
701 pp_c_expression_list (ppi, TREE_VECTOR_CST_ELTS (e));
702 else if (code == COMPLEX_EXPR)
704 pp_c_expression (ppi, TREE_OPERAND (e, 0));
705 pp_separate_with (ppi, ',');
706 pp_c_expression (ppi, TREE_OPERAND (e, 1));
709 pp_right_brace (ppi);
710 break;
712 case COMPOUND_LITERAL_EXPR:
713 e = DECL_INITIAL (e);
714 /* Fall through. */
715 case CONSTRUCTOR:
716 pp_initializer (ppi, e);
717 break;
719 #if 0
720 case SRCLOC:
721 pp_left_paren (ppi);
722 pp_identifier (ppi, "__location__");
723 pp_right_paren (ppi);
724 pp_whitespace (ppi);
725 pp_left_brace (ppi);
726 pp_dot (ppi);
727 pp_identifier (ppi, "file");
728 pp_whitespace (ppi);
729 pp_equal (ppi);
730 pp_c_whitespace (ppi);
731 pp_c_expression (ppi, SRCLOC_FILE (e));
732 pp_separate_with (ppi, ',');
733 pp_dot (ppi);
734 pp_identifier (ppi, "line");
735 pp_whitespace (ppi);
736 pp_equal (ppi);
737 pp_c_whitespace (ppi);
738 pp_c_expression (ppi, SRCLOC_LINE (e));
739 pp_right_brace (ppi);
740 break;
741 #endif
743 case VA_ARG_EXPR:
744 pp_c_identifier (ppi, "__builtin_va_arg");
745 pp_c_left_paren (ppi);
746 pp_assignment_expression (ppi, TREE_OPERAND (e, 0));
747 pp_separate_with (ppi, ',');
748 pp_type_id (ppi, TREE_TYPE (e));
749 pp_c_right_paren (ppi);
750 break;
752 default:
753 pp_primary_expression (ppi, e);
754 break;
758 /* Print out an expression-list; E is expected to be a TREE_LIST */
759 void
760 pp_c_expression_list (ppi, e)
761 c_pretty_printer ppi;
762 tree e;
764 for (; e != NULL_TREE; e = TREE_CHAIN (e))
766 pp_c_assignment_expression (ppi, TREE_VALUE (e));
767 if (TREE_CHAIN (e))
768 pp_separate_with (ppi, ',');
772 static void
773 pp_c_unary_expression (ppi, e)
774 c_pretty_printer ppi;
775 tree e;
777 enum tree_code code = TREE_CODE (e);
778 switch (code)
780 case PREINCREMENT_EXPR:
781 case PREDECREMENT_EXPR:
782 pp_identifier (ppi, code == PREINCREMENT_EXPR ? "++" : "--");
783 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
784 break;
786 case ADDR_EXPR:
787 case INDIRECT_REF:
788 case CONVERT_EXPR:
789 case NEGATE_EXPR:
790 case BIT_NOT_EXPR:
791 case TRUTH_NOT_EXPR:
792 case CONJ_EXPR:
793 if (code == ADDR_EXPR)
794 pp_ampersand (ppi);
795 else if (code == INDIRECT_REF)
796 pp_star (ppi);
797 else if (code == NEGATE_EXPR)
798 pp_minus (ppi);
799 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
800 pp_complement (ppi);
801 else if (code == TRUTH_NOT_EXPR)
802 pp_exclamation (ppi);
803 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
804 break;
806 case SIZEOF_EXPR:
807 case ALIGNOF_EXPR:
808 pp_c_identifier (ppi, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
809 pp_c_whitespace (ppi);
810 if (TYPE_P (TREE_OPERAND (e, 0)))
812 pp_c_left_paren (ppi);
813 pp_type_id (ppi, TREE_OPERAND (e, 0));
814 pp_c_right_paren (ppi);
816 else
817 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
818 break;
820 case REALPART_EXPR:
821 case IMAGPART_EXPR:
822 pp_c_identifier (ppi, code == REALPART_EXPR ? "__real__" : "__imag__");
823 pp_c_whitespace (ppi);
824 pp_unary_expression (ppi, TREE_OPERAND (e, 0));
825 break;
827 default:
828 pp_postfix_expression (ppi, e);
829 break;
833 void
834 pp_c_cast_expression (ppi, e)
835 c_pretty_printer ppi;
836 tree e;
838 if (TREE_CODE (e) == CONVERT_EXPR || TREE_CODE (e) == FLOAT_EXPR)
840 pp_c_left_paren (ppi);
841 pp_type_id (ppi, TREE_TYPE (e));
842 pp_c_right_paren (ppi);
843 pp_c_cast_expression (ppi, TREE_OPERAND (e, 0));
845 else
846 pp_unary_expression (ppi, e);
849 static void
850 pp_c_multiplicative_expression (ppi, e)
851 c_pretty_printer ppi;
852 tree e;
854 enum tree_code code = TREE_CODE (e);
855 switch (code)
857 case MULT_EXPR:
858 case TRUNC_DIV_EXPR:
859 case TRUNC_MOD_EXPR:
860 pp_c_multiplicative_expression (ppi, TREE_OPERAND (e, 0));
861 pp_c_whitespace (ppi);
862 if (code == MULT_EXPR)
863 pp_star (ppi);
864 else if (code == TRUNC_DIV_EXPR)
865 pp_slash (ppi);
866 else
867 pp_modulo (ppi);
868 pp_c_whitespace (ppi);
869 pp_c_cast_expression (ppi, TREE_OPERAND (e, 1));
870 break;
872 default:
873 pp_c_cast_expression (ppi, e);
874 break;
878 static inline void
879 pp_c_additive_expression (ppi, e)
880 c_pretty_printer ppi;
881 tree e;
883 enum tree_code code = TREE_CODE (e);
884 switch (code)
886 case PLUS_EXPR:
887 case MINUS_EXPR:
888 pp_c_additive_expression (ppi, TREE_OPERAND (e, 0));
889 pp_c_whitespace (ppi);
890 if (code == PLUS_EXPR)
891 pp_plus (ppi);
892 else
893 pp_minus (ppi);
894 pp_c_whitespace (ppi);
895 pp_multiplicative_expression (ppi, TREE_OPERAND (e, 1));
896 break;
898 default:
899 pp_multiplicative_expression (ppi, e);
900 break;
904 static inline void
905 pp_c_shift_expression (ppi, e)
906 c_pretty_printer ppi;
907 tree e;
909 enum tree_code code = TREE_CODE (e);
910 switch (code)
912 case LSHIFT_EXPR:
913 case RSHIFT_EXPR:
914 pp_c_shift_expression (ppi, TREE_OPERAND (e, 0));
915 pp_c_whitespace (ppi);
916 pp_identifier (ppi, code == LSHIFT_EXPR ? "<<" : ">>");
917 pp_c_whitespace (ppi);
918 pp_c_additive_expression (ppi, TREE_OPERAND (e, 1));
919 break;
921 default:
922 pp_c_additive_expression (ppi, e);
926 static void
927 pp_c_relational_expression (ppi, e)
928 c_pretty_printer ppi;
929 tree e;
931 enum tree_code code = TREE_CODE (e);
932 switch (code)
934 case LT_EXPR:
935 case GT_EXPR:
936 case LE_EXPR:
937 case GE_EXPR:
938 pp_c_relational_expression (ppi, TREE_OPERAND (e, 0));
939 pp_c_whitespace (ppi);
940 if (code == LT_EXPR)
941 pp_less (ppi);
942 else if (code == GT_EXPR)
943 pp_greater (ppi);
944 else if (code == LE_EXPR)
945 pp_identifier (ppi, "<=");
946 else if (code == GE_EXPR)
947 pp_identifier (ppi, ">=");
948 pp_c_whitespace (ppi);
949 pp_c_shift_expression (ppi, TREE_OPERAND (e, 1));
950 break;
952 default:
953 pp_c_shift_expression (ppi, e);
954 break;
958 static inline void
959 pp_c_equality_expression (ppi, e)
960 c_pretty_printer ppi;
961 tree e;
963 enum tree_code code = TREE_CODE (e);
964 switch (code)
966 case EQ_EXPR:
967 case NE_EXPR:
968 pp_c_equality_expression (ppi, TREE_OPERAND (e, 0));
969 pp_c_maybe_whitespace (ppi);
970 pp_identifier (ppi, code == EQ_EXPR ? "==" : "!=");
971 pp_c_whitespace (ppi);
972 pp_c_relational_expression (ppi, TREE_OPERAND (e, 1));
973 break;
975 default:
976 pp_c_relational_expression (ppi, e);
977 break;
981 static inline void
982 pp_c_and_expression (ppi, e)
983 c_pretty_printer ppi;
984 tree e;
986 if (TREE_CODE (e) == BIT_AND_EXPR)
988 pp_c_and_expression (ppi, TREE_OPERAND (e, 0));
989 pp_c_maybe_whitespace (ppi);
990 pp_ampersand (ppi);
991 pp_c_whitespace (ppi);
992 pp_c_equality_expression (ppi, TREE_OPERAND (e, 1));
994 else
995 pp_c_equality_expression (ppi, e);
998 static inline void
999 pp_c_exclusive_or_expression (ppi, e)
1000 c_pretty_printer ppi;
1001 tree e;
1003 if (TREE_CODE (e) == BIT_XOR_EXPR)
1005 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
1006 pp_c_maybe_whitespace (ppi);
1007 pp_carret (ppi);
1008 pp_c_whitespace (ppi);
1009 pp_c_and_expression (ppi, TREE_OPERAND (e, 1));
1011 else
1012 pp_c_and_expression (ppi, e);
1015 static inline void
1016 pp_c_inclusive_or_expression (ppi, e)
1017 c_pretty_printer ppi;
1018 tree e;
1020 if (TREE_CODE (e) == BIT_IOR_EXPR)
1022 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 0));
1023 pp_c_maybe_whitespace (ppi);
1024 pp_bar (ppi);
1025 pp_c_whitespace (ppi);
1026 pp_c_exclusive_or_expression (ppi, TREE_OPERAND (e, 1));
1028 else
1029 pp_c_exclusive_or_expression (ppi, e);
1032 static inline void
1033 pp_c_logical_and_expression (ppi, e)
1034 c_pretty_printer ppi;
1035 tree e;
1037 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
1039 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 0));
1040 pp_c_maybe_whitespace (ppi);
1041 pp_identifier (ppi, "&&");
1042 pp_c_whitespace (ppi);
1043 pp_c_inclusive_or_expression (ppi, TREE_OPERAND (e, 1));
1045 else
1046 pp_c_inclusive_or_expression (ppi, e);
1049 void
1050 pp_c_logical_or_expression (ppi, e)
1051 c_pretty_printer ppi;
1052 tree e;
1054 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1056 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
1057 pp_c_maybe_whitespace (ppi);
1058 pp_identifier (ppi, "||");
1059 pp_c_whitespace (ppi);
1060 pp_c_logical_and_expression (ppi, TREE_OPERAND (e, 1));
1062 else
1063 pp_c_logical_and_expression (ppi, e);
1066 static void
1067 pp_c_conditional_expression (ppi, e)
1068 c_pretty_printer ppi;
1069 tree e;
1071 if (TREE_CODE (e) == COND_EXPR)
1073 pp_c_logical_or_expression (ppi, TREE_OPERAND (e, 0));
1074 pp_c_maybe_whitespace (ppi);
1075 pp_question (ppi);
1076 pp_c_whitespace (ppi);
1077 pp_c_expression (ppi, TREE_OPERAND (e, 1));
1078 pp_c_maybe_whitespace (ppi);
1079 pp_colon (ppi);
1080 pp_c_whitespace (ppi);
1081 pp_c_conditional_expression (ppi, TREE_OPERAND (e, 2));
1083 else
1084 pp_c_logical_or_expression (ppi, e);
1088 /* Pretty-print a C assignment-expression. */
1089 static void
1090 pp_c_assignment_expression (ppi, e)
1091 c_pretty_printer ppi;
1092 tree e;
1094 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
1096 pp_c_unary_expression (ppi, TREE_OPERAND (e, 0));
1097 pp_c_maybe_whitespace (ppi);
1098 pp_equal (ppi);
1099 pp_whitespace (ppi);
1100 pp_c_assignment_expression (ppi, TREE_OPERAND (e, 1));
1102 else
1103 pp_c_conditional_expression (ppi, e);
1106 /* Pretty-print an expression. */
1107 void
1108 pp_c_expression (ppi, e)
1109 c_pretty_printer ppi;
1110 tree e;
1112 switch (TREE_CODE (e))
1114 case INTEGER_CST:
1115 pp_c_integer_literal (ppi, e);
1116 break;
1118 case REAL_CST:
1119 pp_c_real_literal (ppi, e);
1120 break;
1122 case STRING_CST:
1123 pp_c_string_literal (ppi, e);
1124 break;
1126 case FUNCTION_DECL:
1127 case VAR_DECL:
1128 case CONST_DECL:
1129 case PARM_DECL:
1130 case RESULT_DECL:
1131 case FIELD_DECL:
1132 case LABEL_DECL:
1133 case ERROR_MARK:
1134 case TARGET_EXPR:
1135 case STMT_EXPR:
1136 pp_c_primary_expression (ppi, e);
1137 break;
1139 case POSTINCREMENT_EXPR:
1140 case POSTDECREMENT_EXPR:
1141 case ARROW_EXPR:
1142 case ARRAY_REF:
1143 case CALL_EXPR:
1144 case COMPONENT_REF:
1145 case COMPLEX_CST:
1146 case VECTOR_CST:
1147 case ABS_EXPR:
1148 case FFS_EXPR:
1149 case CONSTRUCTOR:
1150 case COMPOUND_LITERAL_EXPR:
1151 case COMPLEX_EXPR:
1152 case VA_ARG_EXPR:
1153 pp_c_postfix_expression (ppi, e);
1154 break;
1156 case CONJ_EXPR:
1157 case ADDR_EXPR:
1158 case INDIRECT_REF:
1159 case NEGATE_EXPR:
1160 case BIT_NOT_EXPR:
1161 case TRUTH_NOT_EXPR:
1162 case PREINCREMENT_EXPR:
1163 case PREDECREMENT_EXPR:
1164 case SIZEOF_EXPR:
1165 case ALIGNOF_EXPR:
1166 case REALPART_EXPR:
1167 case IMAGPART_EXPR:
1168 pp_c_unary_expression (ppi, e);
1169 break;
1171 case CONVERT_EXPR:
1172 case FLOAT_EXPR:
1173 pp_c_cast_expression (ppi, e);
1174 break;
1176 case MULT_EXPR:
1177 case TRUNC_MOD_EXPR:
1178 case TRUNC_DIV_EXPR:
1179 pp_c_multiplicative_expression (ppi, e);
1180 break;
1182 case LSHIFT_EXPR:
1183 case RSHIFT_EXPR:
1184 pp_c_shift_expression (ppi, e);
1185 break;
1187 case LT_EXPR:
1188 case GT_EXPR:
1189 case LE_EXPR:
1190 case GE_EXPR:
1191 pp_c_relational_expression (ppi, e);
1192 break;
1194 case BIT_AND_EXPR:
1195 pp_c_and_expression (ppi, e);
1196 break;
1198 case BIT_XOR_EXPR:
1199 pp_c_exclusive_or_expression (ppi, e);
1200 break;
1202 case BIT_IOR_EXPR:
1203 pp_c_inclusive_or_expression (ppi, e);
1204 break;
1206 case TRUTH_ANDIF_EXPR:
1207 pp_c_logical_and_expression (ppi, e);
1208 break;
1210 case TRUTH_ORIF_EXPR:
1211 pp_c_logical_or_expression (ppi, e);
1212 break;
1214 case COND_EXPR:
1215 pp_c_conditional_expression (ppi, e);
1216 break;
1218 case MODIFY_EXPR:
1219 case INIT_EXPR:
1220 pp_c_assignment_expression (ppi, e);
1221 break;
1223 case NOP_EXPR:
1224 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1225 break;
1227 case COMPOUND_EXPR:
1228 pp_c_left_paren (ppi);
1229 pp_c_expression (ppi, TREE_OPERAND (e, 0));
1230 pp_separate_with (ppi, ',');
1231 pp_assignment_expression (ppi, TREE_OPERAND (e, 1));
1232 pp_c_right_paren (ppi);
1233 break;
1236 default:
1237 pp_unsupported_tree (ppi, e);
1238 break;
1243 /* Statements. */
1244 void
1245 pp_c_statement (ppi, stmt)
1246 c_pretty_printer ppi;
1247 tree stmt;
1249 const enum tree_code code = TREE_CODE (stmt);
1250 switch (code)
1252 case LABEL_STMT:
1253 case CASE_LABEL:
1254 pp_newline (ppi);
1255 if (code == LABEL_STMT)
1256 pp_tree_identifier (ppi, DECL_NAME (LABEL_STMT_LABEL (stmt)));
1257 else if (code == LABEL_STMT)
1259 if (CASE_LOW (stmt) == NULL_TREE)
1260 pp_identifier (ppi, "default");
1261 else
1263 pp_c_identifier (ppi, "case");
1264 pp_c_whitespace (ppi);
1265 pp_conditional_expression (ppi, CASE_LOW (stmt));
1266 if (CASE_HIGH (stmt))
1268 pp_identifier (ppi, "...");
1269 pp_conditional_expression (ppi, CASE_HIGH (stmt));
1273 pp_colon (ppi);
1274 pp_newline_and_indent (ppi, 3);
1275 break;
1277 case COMPOUND_STMT:
1278 pp_left_brace (ppi);
1279 pp_newline_and_indent (ppi, 3);
1280 for (stmt = COMPOUND_BODY (stmt); stmt; stmt = TREE_CHAIN (stmt))
1281 pp_c_statement (ppi, stmt);
1282 pp_newline_and_indent (ppi, -3);
1283 pp_right_brace (ppi);
1284 pp_newline (ppi);
1285 break;
1287 case EXPR_STMT:
1288 case CLEANUP_STMT:
1289 pp_newline (ppi);
1290 pp_c_expression (ppi, code == EXPR_STMT
1291 ? EXPR_STMT_EXPR (stmt)
1292 : CLEANUP_EXPR (stmt));
1293 pp_semicolon (ppi);
1294 pp_newline (ppi);
1295 break;
1297 case IF_STMT:
1298 pp_c_identifier (ppi, "if");
1299 pp_whitespace (ppi);
1300 pp_c_left_paren (ppi);
1301 pp_c_expression (ppi, IF_COND (stmt));
1302 pp_right_paren (ppi);
1303 pp_newline_and_indent (ppi, 3);
1304 pp_statement (ppi, THEN_CLAUSE (stmt));
1305 pp_newline_and_indent (ppi, -3);
1306 if (ELSE_CLAUSE (stmt))
1308 tree else_clause = ELSE_CLAUSE (stmt);
1309 pp_c_identifier (ppi, "else");
1310 if (TREE_CODE (else_clause) == IF_STMT)
1311 pp_c_whitespace (ppi);
1312 else
1313 pp_newline_and_indent (ppi, 3);
1314 pp_statement (ppi, else_clause);
1315 if (TREE_CODE (else_clause) != IF_STMT)
1316 pp_newline_and_indent (ppi, -3);
1318 break;
1320 case SWITCH_STMT:
1321 pp_newline (ppi);
1322 pp_c_identifier (ppi, "switch");
1323 pp_whitespace (ppi);
1324 pp_c_left_paren (ppi);
1325 pp_c_expression (ppi, SWITCH_COND (stmt));
1326 pp_right_paren (ppi);
1327 pp_newline_and_indent (ppi, 3);
1328 pp_statement (ppi, SWITCH_BODY (stmt));
1329 pp_newline_and_indent (ppi, -3);
1330 break;
1332 case WHILE_STMT:
1333 pp_c_identifier (ppi, "while");
1334 pp_whitespace (ppi);
1335 pp_c_left_paren (ppi);
1336 pp_c_expression (ppi, WHILE_COND (stmt));
1337 pp_right_paren (ppi);
1338 pp_newline_and_indent (ppi, 3);
1339 pp_statement (ppi, WHILE_BODY (stmt));
1340 pp_newline_and_indent (ppi, -3);
1341 break;
1343 case DO_STMT:
1344 pp_c_identifier (ppi, "do");
1345 pp_newline_and_indent (ppi, 3);
1346 pp_statement (ppi, DO_BODY (stmt));
1347 pp_newline_and_indent (ppi, -3);
1348 pp_c_identifier (ppi, "while");
1349 pp_whitespace (ppi);
1350 pp_c_left_paren (ppi);
1351 pp_c_expression (ppi, DO_COND (stmt));
1352 pp_c_right_paren (ppi);
1353 pp_semicolon (ppi);
1354 pp_newline (ppi);
1355 break;
1357 case FOR_STMT:
1358 pp_c_identifier (ppi, "for");
1359 pp_whitespace (ppi);
1360 pp_c_left_paren (ppi);
1361 pp_statement (ppi, FOR_INIT_STMT (stmt));
1362 pp_c_whitespace (ppi);
1363 if (FOR_COND (stmt))
1364 pp_c_expression (ppi, FOR_COND (stmt));
1365 pp_semicolon (ppi);
1366 pp_c_whitespace (ppi);
1367 if (FOR_EXPR (stmt))
1368 pp_c_expression (ppi, FOR_EXPR (stmt));
1369 pp_right_paren (ppi);
1370 pp_newline_and_indent (ppi, 3);
1371 pp_statement (ppi, FOR_BODY (stmt));
1372 pp_newline_and_indent (ppi, -3);
1373 break;
1375 case BREAK_STMT:
1376 case CONTINUE_STMT:
1377 pp_newline (ppi);
1378 pp_identifier (ppi, code == BREAK_STMT ? "break" : "continue");
1379 pp_semicolon (ppi);
1380 pp_newline (ppi);
1381 break;
1383 case RETURN_STMT:
1384 case GOTO_STMT:
1386 tree e = code == RETURN_STMT
1387 ? RETURN_STMT_EXPR (stmt)
1388 : GOTO_DESTINATION (stmt);
1390 pp_newline (ppi);
1391 pp_c_identifier (ppi, code == RETURN_STMT ? "return" : "goto");
1392 if (e)
1393 pp_c_expression (ppi, e);
1394 pp_semicolon (ppi);
1395 pp_newline (ppi);
1397 break;
1399 case SCOPE_STMT:
1400 if (!SCOPE_NULLIFIED_P (stmt) && SCOPE_NO_CLEANUPS_P (stmt))
1402 if (SCOPE_BEGIN_P (stmt))
1404 pp_left_brace (ppi);
1405 pp_newline_and_indent (ppi, 3);
1407 else if (SCOPE_END_P (stmt))
1409 pp_right_brace (ppi);
1410 pp_newline_and_indent (ppi, -3);
1413 break;
1415 case DECL_STMT:
1416 pp_declaration (ppi, DECL_STMT_DECL (stmt));
1417 pp_semicolon (ppi);
1418 pp_newline (ppi);
1419 break;
1421 case ASM_STMT:
1423 bool has_volatile_p = ASM_VOLATILE_P (stmt);
1424 bool is_extended = has_volatile_p || ASM_INPUTS (stmt)
1425 || ASM_OUTPUTS (stmt) || ASM_CLOBBERS (stmt);
1426 pp_c_identifier (ppi, is_extended ? "__asm__" : "asm");
1427 if (has_volatile_p)
1428 pp_c_identifier (ppi, "__volatile__");
1429 pp_whitespace (ppi);
1430 pp_c_left_paren (ppi);
1431 pp_c_string_literal (ppi, ASM_STRING (stmt));
1432 if (is_extended)
1434 pp_whitespace (ppi);
1435 pp_separate_with (ppi, ':');
1436 if (ASM_OUTPUTS (stmt))
1437 pp_c_expression (ppi, ASM_OUTPUTS (stmt));
1438 pp_whitespace (ppi);
1439 pp_separate_with (ppi, ':');
1440 if (ASM_INPUTS (stmt))
1441 pp_c_expression (ppi, ASM_INPUTS (stmt));
1442 pp_whitespace (ppi);
1443 pp_separate_with (ppi, ':');
1444 if (ASM_CLOBBERS (stmt))
1445 pp_c_expression (ppi, ASM_CLOBBERS (stmt));
1447 pp_right_paren (ppi);
1448 pp_newline (ppi);
1450 break;
1452 case FILE_STMT:
1453 pp_c_identifier (ppi, "__FILE__");
1454 pp_whitespace (ppi);
1455 pp_equal (ppi);
1456 pp_c_whitespace (ppi);
1457 pp_c_identifier (ppi, FILE_STMT_FILENAME (stmt));
1458 pp_semicolon (ppi);
1459 pp_newline (ppi);
1460 break;
1462 default:
1463 pp_unsupported_tree (ppi, stmt);
1469 /* Initialize the PRETTY-PRINTER for handling C codes. */
1470 void
1471 pp_c_pretty_printer_init (pp)
1472 c_pretty_printer pp;
1474 pp->offset_list = 0;
1476 pp->declaration = pp_c_declaration;
1477 pp->declaration_specifiers = pp_c_declaration_specifiers;
1478 pp->type_specifier = pp_c_simple_type_specifier;
1479 pp->declarator = pp_c_declarator;
1480 pp->direct_declarator = pp_c_direct_declarator;
1481 pp->parameter_declaration = pp_c_parameter_declaration;
1482 pp->type_id = pp_c_type_id;
1484 pp->statement = pp_c_statement;
1486 pp->primary_expression = pp_c_primary_expression;
1487 pp->postfix_expression = pp_c_postfix_expression;
1488 pp->unary_expression = pp_c_unary_expression;
1489 pp->initializer = pp_c_initializer;
1490 pp->multiplicative_expression = pp_c_multiplicative_expression;
1491 pp->conditional_expression = pp_c_conditional_expression;
1492 pp->assignment_expression = pp_c_assignment_expression;