target.h (globalize_decl_name): New.
[gcc.git] / gcc / c-pretty-print.c
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>
4
5 This file is part of GCC.
6
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.
11
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.
16
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. */
21
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"
31
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. */
38
39
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)
45
46 /* literal */
47 static void pp_c_char (c_pretty_printer *, int);
48
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);
52
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);
64
65 /* declarations. */
66
67 \f
68 /* Helper functions. */
69
70 void
71 pp_c_whitespace (c_pretty_printer *pp)
72 {
73 pp_space (pp);
74 pp_base (pp)->padding = pp_none;
75 }
76
77 void
78 pp_c_left_paren (c_pretty_printer *pp)
79 {
80 pp_left_paren (pp);
81 pp_base (pp)->padding = pp_none;
82 }
83
84 void
85 pp_c_right_paren (c_pretty_printer *pp)
86 {
87 pp_right_paren (pp);
88 pp_base (pp)->padding = pp_none;
89 }
90
91 void
92 pp_c_left_brace (c_pretty_printer *pp)
93 {
94 pp_left_brace (pp);
95 pp_base (pp)->padding = pp_none;
96 }
97
98 void
99 pp_c_right_brace (c_pretty_printer *pp)
100 {
101 pp_right_brace (pp);
102 pp_base (pp)->padding = pp_none;
103 }
104
105 void
106 pp_c_left_bracket (c_pretty_printer *pp)
107 {
108 pp_left_bracket (pp);
109 pp_base (pp)->padding = pp_none;
110 }
111
112 void
113 pp_c_right_bracket (c_pretty_printer *pp)
114 {
115 pp_right_bracket (pp);
116 pp_base (pp)->padding = pp_none;
117 }
118
119 void
120 pp_c_dot (c_pretty_printer *pp)
121 {
122 pp_dot (pp);
123 pp_base (pp)->padding = pp_none;
124 }
125
126 void
127 pp_c_ampersand (c_pretty_printer *pp)
128 {
129 pp_ampersand (pp);
130 pp_base (pp)->padding = pp_none;
131 }
132
133 void
134 pp_c_star (c_pretty_printer *pp)
135 {
136 pp_star (pp);
137 pp_base (pp)->padding = pp_none;
138 }
139
140 void
141 pp_c_arrow (c_pretty_printer *pp)
142 {
143 pp_arrow (pp);
144 pp_base (pp)->padding = pp_none;
145 }
146
147 void
148 pp_c_semicolon (c_pretty_printer *pp)
149 {
150 pp_semicolon (pp);
151 pp_base (pp)->padding = pp_none;
152 }
153
154 void
155 pp_c_complement (c_pretty_printer *pp)
156 {
157 pp_complement (pp);
158 pp_base (pp)->padding = pp_none;
159 }
160
161 void
162 pp_c_exclamation (c_pretty_printer *pp)
163 {
164 pp_exclamation (pp);
165 pp_base (pp)->padding = pp_none;
166 }
167
168 /* Print out the external representation of CV-QUALIFIER. */
169
170 static void
171 pp_c_cv_qualifier (c_pretty_printer *pp, const char *cv)
172 {
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);
180 }
181
182 /* Pretty-print T using the type-cast notation '( type-name )'. */
183
184 static void
185 pp_c_type_cast (c_pretty_printer *pp, tree t)
186 {
187 pp_c_left_paren (pp);
188 pp_type_id (pp, t);
189 pp_c_right_paren (pp);
190 }
191
192 /* We're about to pretty-print a pointer type as indicated by T.
193 Output a whitespace, if needed, preparing for subsequent output. */
194
195 void
196 pp_c_space_for_pointer_operator (c_pretty_printer *pp, tree t)
197 {
198 if (POINTER_TYPE_P (t))
199 {
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);
204 }
205 }
206
207 \f
208 /* Declarations. */
209
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.
213
214 type-qualifier-list:
215 type-qualifier
216 type-qualifier-list type-qualifier
217
218 type-qualifier:
219 const
220 restrict -- C99
221 __restrict__ -- GNU C
222 volatile */
223
224 void
225 pp_c_type_qualifier_list (c_pretty_printer *pp, tree t)
226 {
227 int qualifiers;
228
229 if (!TYPE_P (t))
230 t = TREE_TYPE (t);
231
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__");
239 }
240
241 /* pointer:
242 * type-qualifier-list(opt)
243 * type-qualifier-list(opt) pointer */
244
245 static void
246 pp_c_pointer (c_pretty_printer *pp, tree t)
247 {
248 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
249 t = TREE_TYPE (t);
250 switch (TREE_CODE (t))
251 {
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;
263
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;
270
271 default:
272 pp_unsupported_tree (pp, t);
273 }
274 }
275
276 /* type-specifier:
277 void
278 char
279 short
280 int
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.
292
293 GNU extensions.
294 simple-type-specifier:
295 __complex__
296 __vector__ */
297
298 void
299 pp_c_type_specifier (c_pretty_printer *pp, tree t)
300 {
301 const enum tree_code code = TREE_CODE (t);
302 switch (code)
303 {
304 case ERROR_MARK:
305 pp_c_identifier (pp, "<type-error>");
306 break;
307
308 case IDENTIFIER_NODE:
309 pp_c_tree_decl_identifier (pp, t);
310 break;
311
312 case VOID_TYPE:
313 case BOOLEAN_TYPE:
314 case INTEGER_TYPE:
315 case REAL_TYPE:
316 if (TYPE_NAME (t))
317 {
318 t = TYPE_NAME (t);
319 pp_c_type_specifier (pp, t);
320 }
321 else
322 {
323 int prec = TYPE_PRECISION (t);
324 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
325 if (TYPE_NAME (t))
326 {
327 pp_c_type_specifier (pp, t);
328 if (TYPE_PRECISION (t) != prec)
329 {
330 pp_string (pp, ":");
331 pp_decimal_int (pp, prec);
332 }
333 }
334 else
335 {
336 switch (code)
337 {
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 ();
348 }
349 pp_decimal_int (pp, prec);
350 pp_string (pp, ">");
351 }
352 }
353 break;
354
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;
361
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>");
373
374 if (TYPE_NAME (t))
375 pp_id_expression (pp, TYPE_NAME (t));
376 else
377 pp_c_identifier (pp, "<anonymous>");
378 break;
379
380 default:
381 pp_unsupported_tree (pp, t);
382 break;
383 }
384 }
385
386 /* specifier-qualifier-list:
387 type-specifier specifier-qualifier-list-opt
388 type-qualifier specifier-qualifier-list-opt
389
390
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. */
396
397 void
398 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
399 {
400 const enum tree_code code = TREE_CODE (t);
401
402 if (TREE_CODE (t) != POINTER_TYPE)
403 pp_c_type_qualifier_list (pp, t);
404 switch (code)
405 {
406 case REFERENCE_TYPE:
407 case POINTER_TYPE:
408 {
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)
414 {
415 pp_c_whitespace (pp);
416 pp_c_left_paren (pp);
417 }
418 else if (!c_dialect_cxx ())
419 pp_c_whitespace (pp);
420 pp_ptr_operator (pp, t);
421 }
422 break;
423
424 case FUNCTION_TYPE:
425 case ARRAY_TYPE:
426 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
427 break;
428
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;
437
438 default:
439 pp_simple_type_specifier (pp, t);
440 break;
441 }
442 }
443
444 /* parameter-type-list:
445 parameter-list
446 parameter-list , ...
447
448 parameter-list:
449 parameter-declaration
450 parameter-list , parameter-declaration
451
452 parameter-declaration:
453 declaration-specifiers declarator
454 declaration-specifiers abstract-declarator(opt) */
455
456 void
457 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
458 {
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
465 {
466 bool first = true;
467 for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
468 {
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));
478 }
479 }
480 pp_c_right_paren (pp);
481 }
482
483 /* abstract-declarator:
484 pointer
485 pointer(opt) direct-abstract-declarator */
486
487 static void
488 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
489 {
490 if (TREE_CODE (t) == POINTER_TYPE)
491 {
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);
496 }
497
498 pp_direct_abstract_declarator (pp, t);
499 }
500
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) ) */
506
507 void
508 pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
509 {
510 switch (TREE_CODE (t))
511 {
512 case POINTER_TYPE:
513 pp_abstract_declarator (pp, t);
514 break;
515
516 case FUNCTION_TYPE:
517 pp_c_parameter_type_list (pp, t);
518 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
519 break;
520
521 case ARRAY_TYPE:
522 pp_c_left_bracket (pp);
523 if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
524 {
525 tree maxval = TYPE_MAX_VALUE (TYPE_DOMAIN (t));
526 tree type = TREE_TYPE (maxval);
527
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))));
533 }
534 pp_c_right_bracket (pp);
535 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
536 break;
537
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;
550
551 default:
552 pp_unsupported_tree (pp, t);
553 break;
554 }
555 }
556
557 /* type-name:
558 specifier-qualifier-list abstract-declarator(opt) */
559
560 void
561 pp_c_type_id (c_pretty_printer *pp, tree t)
562 {
563 pp_c_specifier_qualifier_list (pp, t);
564 pp_abstract_declarator (pp, t);
565 }
566
567 /* storage-class-specifier:
568 typedef
569 extern
570 static
571 auto
572 register */
573
574 void
575 pp_c_storage_class_specifier (c_pretty_printer *pp, tree t)
576 {
577 if (TREE_CODE (t) == TYPE_DECL)
578 pp_c_identifier (pp, "typedef");
579 else if (DECL_P (t))
580 {
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");
585 }
586 }
587
588 /* function-specifier:
589 inline */
590
591 void
592 pp_c_function_specifier (c_pretty_printer *pp, tree t)
593 {
594 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
595 pp_c_identifier (pp, "inline");
596 }
597
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) */
603
604 void
605 pp_c_declaration_specifiers (c_pretty_printer *pp, tree t)
606 {
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);
610 }
611
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) ) */
621
622 void
623 pp_c_direct_declarator (c_pretty_printer *pp, tree t)
624 {
625 switch (TREE_CODE (t))
626 {
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;
635
636 case ARRAY_TYPE:
637 case POINTER_TYPE:
638 pp_abstract_declarator (pp, TREE_TYPE (t));
639 break;
640
641 case FUNCTION_TYPE:
642 pp_parameter_list (pp, t);
643 pp_abstract_declarator (pp, TREE_TYPE (t));
644 break;
645
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
652 {
653 pp_parameter_list (pp, t);
654 pp_abstract_declarator (pp, TREE_TYPE (TREE_TYPE (t)));
655 }
656 break;
657
658 case INTEGER_TYPE:
659 case REAL_TYPE:
660 case ENUMERAL_TYPE:
661 case UNION_TYPE:
662 case RECORD_TYPE:
663 break;
664
665 default:
666 pp_unsupported_tree (pp, t);
667 break;
668 }
669 }
670
671
672 /* declarator:
673 pointer(opt) direct-declarator */
674
675 void
676 pp_c_declarator (c_pretty_printer *pp, tree t)
677 {
678 switch (TREE_CODE (t))
679 {
680 case INTEGER_TYPE:
681 case REAL_TYPE:
682 case ENUMERAL_TYPE:
683 case UNION_TYPE:
684 case RECORD_TYPE:
685 break;
686
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;
696
697
698 default:
699 pp_unsupported_tree (pp, t);
700 break;
701 }
702 }
703
704 /* declaration:
705 declaration-specifiers init-declarator-list(opt) ; */
706
707 void
708 pp_c_declaration (c_pretty_printer *pp, tree t)
709 {
710 pp_declaration_specifiers (pp, t);
711 pp_c_init_declarator (pp, t);
712 }
713
714 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
715
716 void
717 pp_c_attributes (c_pretty_printer *pp, tree attributes)
718 {
719 if (attributes == NULL_TREE)
720 return;
721
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))
726 {
727 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
728 if (TREE_VALUE (attributes))
729 pp_c_call_argument_list (pp, TREE_VALUE (attributes));
730
731 if (TREE_CHAIN (attributes))
732 pp_separate_with (pp, ',');
733 }
734 pp_c_right_paren (pp);
735 pp_c_right_paren (pp);
736 }
737
738 /* function-definition:
739 declaration-specifiers declarator compound-statement */
740
741 void
742 pp_c_function_definition (c_pretty_printer *pp, tree t)
743 {
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);
750 }
751
752 \f
753 /* Expressions. */
754
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).
766
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. */
770
771 static void
772 pp_c_char (c_pretty_printer *pp, int c)
773 {
774 if (ISPRINT (c))
775 {
776 switch (c)
777 {
778 case '\\': pp_string (pp, "\\\\"); break;
779 case '\'': pp_string (pp, "\\\'"); break;
780 case '\"': pp_string (pp, "\\\""); break;
781 default: pp_character (pp, c);
782 }
783 }
784 else
785 pp_scalar (pp, "\\%03o", (unsigned) c);
786 }
787
788 /* Print out a STRING literal. */
789
790 void
791 pp_c_string_literal (c_pretty_printer *pp, tree s)
792 {
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);
800 }
801
802 /* Pretty-print an INTEGER literal. */
803
804 static void
805 pp_c_integer_constant (c_pretty_printer *pp, tree i)
806 {
807 tree type = TREE_TYPE (i);
808
809 if (TREE_INT_CST_HIGH (i) == 0)
810 pp_wide_integer (pp, TREE_INT_CST_LOW (i));
811 else
812 {
813 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (i);
814 HOST_WIDE_INT high = TREE_INT_CST_HIGH (i);
815 if (tree_int_cst_sgn (i) < 0)
816 {
817 pp_character (pp, '-');
818 high = ~high + !low;
819 low = -low;
820 }
821 sprintf (pp_buffer (pp)->digit_buffer,
822 HOST_WIDE_INT_PRINT_DOUBLE_HEX, high, low);
823 pp_string (pp, pp_buffer (pp)->digit_buffer);
824 }
825 if (TYPE_UNSIGNED (type))
826 pp_character (pp, 'u');
827 if (type == long_integer_type_node || type == long_unsigned_type_node)
828 pp_character (pp, 'l');
829 else if (type == long_long_integer_type_node
830 || type == long_long_unsigned_type_node)
831 pp_string (pp, "ll");
832 }
833
834 /* Print out a CHARACTER literal. */
835
836 static void
837 pp_c_character_constant (c_pretty_printer *pp, tree c)
838 {
839 tree type = TREE_TYPE (c);
840 if (type == wchar_type_node)
841 pp_character (pp, 'L');
842 pp_quote (pp);
843 if (host_integerp (c, TYPE_UNSIGNED (type)))
844 pp_c_char (pp, tree_low_cst (c, TYPE_UNSIGNED (type)));
845 else
846 pp_scalar (pp, "\\x%x", (unsigned) TREE_INT_CST_LOW (c));
847 pp_quote (pp);
848 }
849
850 /* Print out a BOOLEAN literal. */
851
852 static void
853 pp_c_bool_constant (c_pretty_printer *pp, tree b)
854 {
855 if (b == boolean_false_node)
856 {
857 if (c_dialect_cxx ())
858 pp_c_identifier (pp, "false");
859 else if (flag_isoc99)
860 pp_c_identifier (pp, "_False");
861 else
862 pp_unsupported_tree (pp, b);
863 }
864 else if (b == boolean_true_node)
865 {
866 if (c_dialect_cxx ())
867 pp_c_identifier (pp, "true");
868 else if (flag_isoc99)
869 pp_c_identifier (pp, "_True");
870 else
871 pp_unsupported_tree (pp, b);
872 }
873 else if (TREE_CODE (b) == INTEGER_CST)
874 pp_c_integer_constant (pp, b);
875 else
876 pp_unsupported_tree (pp, b);
877 }
878
879 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
880 false; that means the value was obtained by a cast, in which case
881 print out the type-id part of the cast-expression -- the casted value
882 is then printed by pp_c_integer_literal. */
883
884 static bool
885 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
886 {
887 bool value_is_named = true;
888 tree type = TREE_TYPE (e);
889 tree value;
890
891 /* Find the name of this constant. */
892 for (value = TYPE_VALUES (type);
893 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
894 value = TREE_CHAIN (value))
895 ;
896
897 if (value != NULL_TREE)
898 pp_id_expression (pp, TREE_PURPOSE (value));
899 else
900 {
901 /* Value must have been cast. */
902 pp_c_type_cast (pp, type);
903 value_is_named = false;
904 }
905
906 return value_is_named;
907 }
908
909 /* Print out a REAL value as a decimal-floating-constant. */
910
911 static void
912 pp_c_floating_constant (c_pretty_printer *pp, tree r)
913 {
914 real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
915 sizeof (pp_buffer (pp)->digit_buffer), 0, 1);
916 pp_string (pp, pp_buffer(pp)->digit_buffer);
917 if (TREE_TYPE (r) == float_type_node)
918 pp_character (pp, 'f');
919 else if (TREE_TYPE (r) == long_double_type_node)
920 pp_character (pp, 'l');
921 else if (TREE_TYPE (r) == dfloat128_type_node)
922 pp_string (pp, "dl");
923 else if (TREE_TYPE (r) == dfloat64_type_node)
924 pp_string (pp, "dd");
925 else if (TREE_TYPE (r) == dfloat32_type_node)
926 pp_string (pp, "df");
927 }
928
929 /* Pretty-print a compound literal expression. GNU extensions include
930 vector constants. */
931
932 static void
933 pp_c_compound_literal (c_pretty_printer *pp, tree e)
934 {
935 tree type = TREE_TYPE (e);
936 pp_c_type_cast (pp, type);
937
938 switch (TREE_CODE (type))
939 {
940 case RECORD_TYPE:
941 case UNION_TYPE:
942 case ARRAY_TYPE:
943 case VECTOR_TYPE:
944 case COMPLEX_TYPE:
945 pp_c_brace_enclosed_initializer_list (pp, e);
946 break;
947
948 default:
949 pp_unsupported_tree (pp, e);
950 break;
951 }
952 }
953
954 /* constant:
955 integer-constant
956 floating-constant
957 enumeration-constant
958 character-constant */
959
960 void
961 pp_c_constant (c_pretty_printer *pp, tree e)
962 {
963 const enum tree_code code = TREE_CODE (e);
964
965 switch (code)
966 {
967 case INTEGER_CST:
968 {
969 tree type = TREE_TYPE (e);
970 if (type == boolean_type_node)
971 pp_c_bool_constant (pp, e);
972 else if (type == char_type_node)
973 pp_c_character_constant (pp, e);
974 else if (TREE_CODE (type) == ENUMERAL_TYPE
975 && pp_c_enumeration_constant (pp, e))
976 ;
977 else
978 pp_c_integer_constant (pp, e);
979 }
980 break;
981
982 case REAL_CST:
983 pp_c_floating_constant (pp, e);
984 break;
985
986 case STRING_CST:
987 pp_c_string_literal (pp, e);
988 break;
989
990 default:
991 pp_unsupported_tree (pp, e);
992 break;
993 }
994 }
995
996 /* Pretty-print an IDENTIFIER_NODE, preceded by whitespace is necessary. */
997
998 void
999 pp_c_identifier (c_pretty_printer *pp, const char *id)
1000 {
1001 pp_c_maybe_whitespace (pp);
1002 pp_identifier (pp, id);
1003 pp_base (pp)->padding = pp_before;
1004 }
1005
1006 /* Pretty-print a C primary-expression.
1007 primary-expression:
1008 identifier
1009 constant
1010 string-literal
1011 ( expression ) */
1012
1013 void
1014 pp_c_primary_expression (c_pretty_printer *pp, tree e)
1015 {
1016 switch (TREE_CODE (e))
1017 {
1018 case VAR_DECL:
1019 case PARM_DECL:
1020 case FIELD_DECL:
1021 case CONST_DECL:
1022 case FUNCTION_DECL:
1023 case LABEL_DECL:
1024 pp_c_tree_decl_identifier (pp, e);
1025 break;
1026
1027 case IDENTIFIER_NODE:
1028 pp_c_tree_identifier (pp, e);
1029 break;
1030
1031 case ERROR_MARK:
1032 pp_c_identifier (pp, "<erroneous-expression>");
1033 break;
1034
1035 case RESULT_DECL:
1036 pp_c_identifier (pp, "<return-value>");
1037 break;
1038
1039 case INTEGER_CST:
1040 case REAL_CST:
1041 case STRING_CST:
1042 pp_c_constant (pp, e);
1043 break;
1044
1045 case TARGET_EXPR:
1046 pp_c_identifier (pp, "__builtin_memcpy");
1047 pp_c_left_paren (pp);
1048 pp_ampersand (pp);
1049 pp_primary_expression (pp, TREE_OPERAND (e, 0));
1050 pp_separate_with (pp, ',');
1051 pp_ampersand (pp);
1052 pp_initializer (pp, TREE_OPERAND (e, 1));
1053 if (TREE_OPERAND (e, 2))
1054 {
1055 pp_separate_with (pp, ',');
1056 pp_c_expression (pp, TREE_OPERAND (e, 2));
1057 }
1058 pp_c_right_paren (pp);
1059 break;
1060
1061 default:
1062 /* FIXME: Make sure we won't get into an infinie loop. */
1063 pp_c_left_paren (pp);
1064 pp_expression (pp, e);
1065 pp_c_right_paren (pp);
1066 break;
1067 }
1068 }
1069
1070 /* Print out a C initializer -- also support C compound-literals.
1071 initializer:
1072 assignment-expression:
1073 { initializer-list }
1074 { initializer-list , } */
1075
1076 static void
1077 pp_c_initializer (c_pretty_printer *pp, tree e)
1078 {
1079 if (TREE_CODE (e) == CONSTRUCTOR)
1080 pp_c_brace_enclosed_initializer_list (pp, e);
1081 else
1082 pp_expression (pp, e);
1083 }
1084
1085 /* init-declarator:
1086 declarator:
1087 declarator = initializer */
1088
1089 void
1090 pp_c_init_declarator (c_pretty_printer *pp, tree t)
1091 {
1092 pp_declarator (pp, t);
1093 /* We don't want to output function definitions here. There are handled
1094 elsewhere (and the syntactic form is bogus anyway). */
1095 if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
1096 {
1097 tree init = DECL_INITIAL (t);
1098 /* This C++ bit is handled here because it is easier to do so.
1099 In templates, the C++ parser builds a TREE_LIST for a
1100 direct-initialization; the TREE_PURPOSE is the variable to
1101 initialize and the TREE_VALUE is the initializer. */
1102 if (TREE_CODE (init) == TREE_LIST)
1103 {
1104 pp_c_left_paren (pp);
1105 pp_expression (pp, TREE_VALUE (init));
1106 pp_right_paren (pp);
1107 }
1108 else
1109 {
1110 pp_space (pp);
1111 pp_equal (pp);
1112 pp_space (pp);
1113 pp_c_initializer (pp, init);
1114 }
1115 }
1116 }
1117
1118 /* initializer-list:
1119 designation(opt) initializer
1120 initializer-list , designation(opt) initializer
1121
1122 designation:
1123 designator-list =
1124
1125 designator-list:
1126 designator
1127 designator-list designator
1128
1129 designator:
1130 [ constant-expression ]
1131 identifier */
1132
1133 static void
1134 pp_c_initializer_list (c_pretty_printer *pp, tree e)
1135 {
1136 tree type = TREE_TYPE (e);
1137 const enum tree_code code = TREE_CODE (type);
1138
1139 switch (code)
1140 {
1141 case RECORD_TYPE:
1142 case UNION_TYPE:
1143 case ARRAY_TYPE:
1144 {
1145 tree init = TREE_OPERAND (e, 0);
1146 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1147 {
1148 if (code == RECORD_TYPE || code == UNION_TYPE)
1149 {
1150 pp_c_dot (pp);
1151 pp_c_primary_expression (pp, TREE_PURPOSE (init));
1152 }
1153 else
1154 {
1155 pp_c_left_bracket (pp);
1156 if (TREE_PURPOSE (init))
1157 pp_c_constant (pp, TREE_PURPOSE (init));
1158 pp_c_right_bracket (pp);
1159 }
1160 pp_c_whitespace (pp);
1161 pp_equal (pp);
1162 pp_c_whitespace (pp);
1163 pp_initializer (pp, TREE_VALUE (init));
1164 if (TREE_CHAIN (init))
1165 pp_separate_with (pp, ',');
1166 }
1167 }
1168 return;
1169
1170 case VECTOR_TYPE:
1171 if (TREE_CODE (e) == VECTOR_CST)
1172 pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
1173 else if (TREE_CODE (e) == CONSTRUCTOR)
1174 pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
1175 else
1176 break;
1177 return;
1178
1179 case COMPLEX_TYPE:
1180 if (TREE_CODE (e) == CONSTRUCTOR)
1181 pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
1182 else if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
1183 {
1184 const bool cst = TREE_CODE (e) == COMPLEX_CST;
1185 pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
1186 pp_separate_with (pp, ',');
1187 pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
1188 }
1189 else
1190 break;
1191 return;
1192
1193 default:
1194 break;
1195 }
1196
1197 pp_unsupported_tree (pp, type);
1198 }
1199
1200 /* Pretty-print a brace-enclosed initializer-list. */
1201
1202 static void
1203 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
1204 {
1205 pp_c_left_brace (pp);
1206 pp_c_initializer_list (pp, l);
1207 pp_c_right_brace (pp);
1208 }
1209
1210
1211 /* This is a convenient function, used to bridge gap between C and C++
1212 grammars.
1213
1214 id-expression:
1215 identifier */
1216
1217 void
1218 pp_c_id_expression (c_pretty_printer *pp, tree t)
1219 {
1220 switch (TREE_CODE (t))
1221 {
1222 case VAR_DECL:
1223 case PARM_DECL:
1224 case CONST_DECL:
1225 case TYPE_DECL:
1226 case FUNCTION_DECL:
1227 case FIELD_DECL:
1228 case LABEL_DECL:
1229 pp_c_tree_decl_identifier (pp, t);
1230 break;
1231
1232 case IDENTIFIER_NODE:
1233 pp_c_tree_identifier (pp, t);
1234 break;
1235
1236 default:
1237 pp_unsupported_tree (pp, t);
1238 break;
1239 }
1240 }
1241
1242 /* postfix-expression:
1243 primary-expression
1244 postfix-expression [ expression ]
1245 postfix-expression ( argument-expression-list(opt) )
1246 postfix-expression . identifier
1247 postfix-expression -> identifier
1248 postfix-expression ++
1249 postfix-expression --
1250 ( type-name ) { initializer-list }
1251 ( type-name ) { initializer-list , } */
1252
1253 void
1254 pp_c_postfix_expression (c_pretty_printer *pp, tree e)
1255 {
1256 enum tree_code code = TREE_CODE (e);
1257 switch (code)
1258 {
1259 case POSTINCREMENT_EXPR:
1260 case POSTDECREMENT_EXPR:
1261 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1262 pp_identifier (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
1263 break;
1264
1265 case ARRAY_REF:
1266 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1267 pp_c_left_bracket (pp);
1268 pp_expression (pp, TREE_OPERAND (e, 1));
1269 pp_c_right_bracket (pp);
1270 break;
1271
1272 case CALL_EXPR:
1273 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1274 pp_c_call_argument_list (pp, TREE_OPERAND (e, 1));
1275 break;
1276
1277 case UNORDERED_EXPR:
1278 pp_c_identifier (pp, flag_isoc99
1279 ? "isunordered"
1280 : "__builtin_isunordered");
1281 goto two_args_fun;
1282
1283 case ORDERED_EXPR:
1284 pp_c_identifier (pp, flag_isoc99
1285 ? "!isunordered"
1286 : "!__builtin_isunordered");
1287 goto two_args_fun;
1288
1289 case UNLT_EXPR:
1290 pp_c_identifier (pp, flag_isoc99
1291 ? "!isgreaterequal"
1292 : "!__builtin_isgreaterequal");
1293 goto two_args_fun;
1294
1295 case UNLE_EXPR:
1296 pp_c_identifier (pp, flag_isoc99
1297 ? "!isgreater"
1298 : "!__builtin_isgreater");
1299 goto two_args_fun;
1300
1301 case UNGT_EXPR:
1302 pp_c_identifier (pp, flag_isoc99
1303 ? "!islessequal"
1304 : "!__builtin_islessequal");
1305 goto two_args_fun;
1306
1307 case UNGE_EXPR:
1308 pp_c_identifier (pp, flag_isoc99
1309 ? "!isless"
1310 : "!__builtin_isless");
1311 goto two_args_fun;
1312
1313 case UNEQ_EXPR:
1314 pp_c_identifier (pp, flag_isoc99
1315 ? "!islessgreater"
1316 : "!__builtin_islessgreater");
1317 goto two_args_fun;
1318
1319 case LTGT_EXPR:
1320 pp_c_identifier (pp, flag_isoc99
1321 ? "islessgreater"
1322 : "__builtin_islessgreater");
1323 goto two_args_fun;
1324
1325 two_args_fun:
1326 pp_c_left_paren (pp);
1327 pp_expression (pp, TREE_OPERAND (e, 0));
1328 pp_separate_with (pp, ',');
1329 pp_expression (pp, TREE_OPERAND (e, 1));
1330 pp_c_right_paren (pp);
1331 break;
1332
1333 case ABS_EXPR:
1334 pp_c_identifier (pp, "__builtin_abs");
1335 pp_c_left_paren (pp);
1336 pp_expression (pp, TREE_OPERAND (e, 0));
1337 pp_c_right_paren (pp);
1338 break;
1339
1340 case COMPONENT_REF:
1341 {
1342 tree object = TREE_OPERAND (e, 0);
1343 if (TREE_CODE (object) == INDIRECT_REF)
1344 {
1345 pp_postfix_expression (pp, TREE_OPERAND (object, 0));
1346 pp_c_arrow (pp);
1347 }
1348 else
1349 {
1350 pp_postfix_expression (pp, object);
1351 pp_c_dot (pp);
1352 }
1353 pp_expression (pp, TREE_OPERAND (e, 1));
1354 }
1355 break;
1356
1357 case COMPLEX_CST:
1358 case VECTOR_CST:
1359 case COMPLEX_EXPR:
1360 pp_c_compound_literal (pp, e);
1361 break;
1362
1363 case COMPOUND_LITERAL_EXPR:
1364 e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
1365 /* Fall through. */
1366 case CONSTRUCTOR:
1367 pp_initializer (pp, e);
1368 break;
1369
1370 case VA_ARG_EXPR:
1371 pp_c_identifier (pp, "__builtin_va_arg");
1372 pp_c_left_paren (pp);
1373 pp_assignment_expression (pp, TREE_OPERAND (e, 0));
1374 pp_separate_with (pp, ',');
1375 pp_type_id (pp, TREE_TYPE (e));
1376 pp_c_right_paren (pp);
1377 break;
1378
1379 case ADDR_EXPR:
1380 if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
1381 {
1382 pp_c_id_expression (pp, TREE_OPERAND (e, 0));
1383 break;
1384 }
1385 /* else fall through. */
1386
1387 default:
1388 pp_primary_expression (pp, e);
1389 break;
1390 }
1391 }
1392
1393 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1394
1395 void
1396 pp_c_expression_list (c_pretty_printer *pp, tree e)
1397 {
1398 for (; e != NULL_TREE; e = TREE_CHAIN (e))
1399 {
1400 pp_expression (pp, TREE_VALUE (e));
1401 if (TREE_CHAIN (e))
1402 pp_separate_with (pp, ',');
1403 }
1404 }
1405
1406 /* Print out V, which contains the elements of a constructor. */
1407
1408 void
1409 pp_c_constructor_elts (c_pretty_printer *pp, VEC(constructor_elt,gc) *v)
1410 {
1411 unsigned HOST_WIDE_INT ix;
1412 tree value;
1413
1414 FOR_EACH_CONSTRUCTOR_VALUE (v, ix, value)
1415 {
1416 pp_expression (pp, value);
1417 if (ix != VEC_length (constructor_elt, v) - 1)
1418 pp_separate_with (pp, ',');
1419 }
1420 }
1421
1422 /* Print out an expression-list in parens, as in a function call. */
1423
1424 void
1425 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
1426 {
1427 pp_c_left_paren (pp);
1428 if (t && TREE_CODE (t) == TREE_LIST)
1429 pp_c_expression_list (pp, t);
1430 pp_c_right_paren (pp);
1431 }
1432
1433 /* unary-expression:
1434 postfix-expression
1435 ++ cast-expression
1436 -- cast-expression
1437 unary-operator cast-expression
1438 sizeof unary-expression
1439 sizeof ( type-id )
1440
1441 unary-operator: one of
1442 * & + - ! ~
1443
1444 GNU extensions.
1445 unary-expression:
1446 __alignof__ unary-expression
1447 __alignof__ ( type-id )
1448 __real__ unary-expression
1449 __imag__ unary-expression */
1450
1451 void
1452 pp_c_unary_expression (c_pretty_printer *pp, tree e)
1453 {
1454 enum tree_code code = TREE_CODE (e);
1455 switch (code)
1456 {
1457 case PREINCREMENT_EXPR:
1458 case PREDECREMENT_EXPR:
1459 pp_identifier (pp, code == PREINCREMENT_EXPR ? "++" : "--");
1460 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1461 break;
1462
1463 case ADDR_EXPR:
1464 case INDIRECT_REF:
1465 case NEGATE_EXPR:
1466 case BIT_NOT_EXPR:
1467 case TRUTH_NOT_EXPR:
1468 case CONJ_EXPR:
1469 /* String literal are used by address. */
1470 if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
1471 pp_ampersand (pp);
1472 else if (code == INDIRECT_REF)
1473 pp_c_star (pp);
1474 else if (code == NEGATE_EXPR)
1475 pp_minus (pp);
1476 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
1477 pp_complement (pp);
1478 else if (code == TRUTH_NOT_EXPR)
1479 pp_exclamation (pp);
1480 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1481 break;
1482
1483 case REALPART_EXPR:
1484 case IMAGPART_EXPR:
1485 pp_c_identifier (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
1486 pp_c_whitespace (pp);
1487 pp_unary_expression (pp, TREE_OPERAND (e, 0));
1488 break;
1489
1490 default:
1491 pp_postfix_expression (pp, e);
1492 break;
1493 }
1494 }
1495
1496 /* cast-expression:
1497 unary-expression
1498 ( type-name ) cast-expression */
1499
1500 void
1501 pp_c_cast_expression (c_pretty_printer *pp, tree e)
1502 {
1503 switch (TREE_CODE (e))
1504 {
1505 case FLOAT_EXPR:
1506 case FIX_TRUNC_EXPR:
1507 case CONVERT_EXPR:
1508 case NOP_EXPR:
1509 pp_c_type_cast (pp, TREE_TYPE (e));
1510 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1511 break;
1512
1513 default:
1514 pp_unary_expression (pp, e);
1515 }
1516 }
1517
1518 /* multiplicative-expression:
1519 cast-expression
1520 multiplicative-expression * cast-expression
1521 multiplicative-expression / cast-expression
1522 multiplicative-expression % cast-expression */
1523
1524 static void
1525 pp_c_multiplicative_expression (c_pretty_printer *pp, tree e)
1526 {
1527 enum tree_code code = TREE_CODE (e);
1528 switch (code)
1529 {
1530 case MULT_EXPR:
1531 case TRUNC_DIV_EXPR:
1532 case TRUNC_MOD_EXPR:
1533 pp_multiplicative_expression (pp, TREE_OPERAND (e, 0));
1534 pp_c_whitespace (pp);
1535 if (code == MULT_EXPR)
1536 pp_c_star (pp);
1537 else if (code == TRUNC_DIV_EXPR)
1538 pp_slash (pp);
1539 else
1540 pp_modulo (pp);
1541 pp_c_whitespace (pp);
1542 pp_c_cast_expression (pp, TREE_OPERAND (e, 1));
1543 break;
1544
1545 default:
1546 pp_c_cast_expression (pp, e);
1547 break;
1548 }
1549 }
1550
1551 /* additive-expression:
1552 multiplicative-expression
1553 additive-expression + multiplicative-expression
1554 additive-expression - multiplicative-expression */
1555
1556 static void
1557 pp_c_additive_expression (c_pretty_printer *pp, tree e)
1558 {
1559 enum tree_code code = TREE_CODE (e);
1560 switch (code)
1561 {
1562 case PLUS_EXPR:
1563 case MINUS_EXPR:
1564 pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
1565 pp_c_whitespace (pp);
1566 if (code == PLUS_EXPR)
1567 pp_plus (pp);
1568 else
1569 pp_minus (pp);
1570 pp_c_whitespace (pp);
1571 pp_multiplicative_expression (pp, TREE_OPERAND (e, 1));
1572 break;
1573
1574 default:
1575 pp_multiplicative_expression (pp, e);
1576 break;
1577 }
1578 }
1579
1580 /* additive-expression:
1581 additive-expression
1582 shift-expression << additive-expression
1583 shift-expression >> additive-expression */
1584
1585 static void
1586 pp_c_shift_expression (c_pretty_printer *pp, tree e)
1587 {
1588 enum tree_code code = TREE_CODE (e);
1589 switch (code)
1590 {
1591 case LSHIFT_EXPR:
1592 case RSHIFT_EXPR:
1593 pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
1594 pp_c_whitespace (pp);
1595 pp_identifier (pp, code == LSHIFT_EXPR ? "<<" : ">>");
1596 pp_c_whitespace (pp);
1597 pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
1598 break;
1599
1600 default:
1601 pp_c_additive_expression (pp, e);
1602 }
1603 }
1604
1605 /* relational-expression:
1606 shift-expression
1607 relational-expression < shift-expression
1608 relational-expression > shift-expression
1609 relational-expression <= shift-expression
1610 relational-expression >= shift-expression */
1611
1612 static void
1613 pp_c_relational_expression (c_pretty_printer *pp, tree e)
1614 {
1615 enum tree_code code = TREE_CODE (e);
1616 switch (code)
1617 {
1618 case LT_EXPR:
1619 case GT_EXPR:
1620 case LE_EXPR:
1621 case GE_EXPR:
1622 pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
1623 pp_c_whitespace (pp);
1624 if (code == LT_EXPR)
1625 pp_less (pp);
1626 else if (code == GT_EXPR)
1627 pp_greater (pp);
1628 else if (code == LE_EXPR)
1629 pp_identifier (pp, "<=");
1630 else if (code == GE_EXPR)
1631 pp_identifier (pp, ">=");
1632 pp_c_whitespace (pp);
1633 pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
1634 break;
1635
1636 default:
1637 pp_c_shift_expression (pp, e);
1638 break;
1639 }
1640 }
1641
1642 /* equality-expression:
1643 relational-expression
1644 equality-expression == relational-expression
1645 equality-equality != relational-expression */
1646
1647 static void
1648 pp_c_equality_expression (c_pretty_printer *pp, tree e)
1649 {
1650 enum tree_code code = TREE_CODE (e);
1651 switch (code)
1652 {
1653 case EQ_EXPR:
1654 case NE_EXPR:
1655 pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
1656 pp_c_whitespace (pp);
1657 pp_identifier (pp, code == EQ_EXPR ? "==" : "!=");
1658 pp_c_whitespace (pp);
1659 pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
1660 break;
1661
1662 default:
1663 pp_c_relational_expression (pp, e);
1664 break;
1665 }
1666 }
1667
1668 /* AND-expression:
1669 equality-expression
1670 AND-expression & equality-equality */
1671
1672 static void
1673 pp_c_and_expression (c_pretty_printer *pp, tree e)
1674 {
1675 if (TREE_CODE (e) == BIT_AND_EXPR)
1676 {
1677 pp_c_and_expression (pp, TREE_OPERAND (e, 0));
1678 pp_c_whitespace (pp);
1679 pp_ampersand (pp);
1680 pp_c_whitespace (pp);
1681 pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
1682 }
1683 else
1684 pp_c_equality_expression (pp, e);
1685 }
1686
1687 /* exclusive-OR-expression:
1688 AND-expression
1689 exclusive-OR-expression ^ AND-expression */
1690
1691 static void
1692 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
1693 {
1694 if (TREE_CODE (e) == BIT_XOR_EXPR)
1695 {
1696 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1697 pp_c_maybe_whitespace (pp);
1698 pp_carret (pp);
1699 pp_c_whitespace (pp);
1700 pp_c_and_expression (pp, TREE_OPERAND (e, 1));
1701 }
1702 else
1703 pp_c_and_expression (pp, e);
1704 }
1705
1706 /* inclusive-OR-expression:
1707 exclusive-OR-expression
1708 inclusive-OR-expression | exclusive-OR-expression */
1709
1710 static void
1711 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
1712 {
1713 if (TREE_CODE (e) == BIT_IOR_EXPR)
1714 {
1715 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1716 pp_c_whitespace (pp);
1717 pp_bar (pp);
1718 pp_c_whitespace (pp);
1719 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
1720 }
1721 else
1722 pp_c_exclusive_or_expression (pp, e);
1723 }
1724
1725 /* logical-AND-expression:
1726 inclusive-OR-expression
1727 logical-AND-expression && inclusive-OR-expression */
1728
1729 static void
1730 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
1731 {
1732 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
1733 {
1734 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
1735 pp_c_whitespace (pp);
1736 pp_identifier (pp, "&&");
1737 pp_c_whitespace (pp);
1738 pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
1739 }
1740 else
1741 pp_c_inclusive_or_expression (pp, e);
1742 }
1743
1744 /* logical-OR-expression:
1745 logical-AND-expression
1746 logical-OR-expression || logical-AND-expression */
1747
1748 void
1749 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
1750 {
1751 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1752 {
1753 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1754 pp_c_whitespace (pp);
1755 pp_identifier (pp, "||");
1756 pp_c_whitespace (pp);
1757 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
1758 }
1759 else
1760 pp_c_logical_and_expression (pp, e);
1761 }
1762
1763 /* conditional-expression:
1764 logical-OR-expression
1765 logical-OR-expression ? expression : conditional-expression */
1766
1767 static void
1768 pp_c_conditional_expression (c_pretty_printer *pp, tree e)
1769 {
1770 if (TREE_CODE (e) == COND_EXPR)
1771 {
1772 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1773 pp_c_whitespace (pp);
1774 pp_question (pp);
1775 pp_c_whitespace (pp);
1776 pp_expression (pp, TREE_OPERAND (e, 1));
1777 pp_c_whitespace (pp);
1778 pp_colon (pp);
1779 pp_c_whitespace (pp);
1780 pp_c_conditional_expression (pp, TREE_OPERAND (e, 2));
1781 }
1782 else
1783 pp_c_logical_or_expression (pp, e);
1784 }
1785
1786
1787 /* assignment-expression:
1788 conditional-expression
1789 unary-expression assignment-operator assignment-expression
1790
1791 assignment-expression: one of
1792 = *= /= %= += -= >>= <<= &= ^= |= */
1793
1794 static void
1795 pp_c_assignment_expression (c_pretty_printer *pp, tree e)
1796 {
1797 if (TREE_CODE (e) == MODIFY_EXPR
1798 || TREE_CODE (e) == GIMPLE_MODIFY_STMT
1799 || TREE_CODE (e) == INIT_EXPR)
1800 {
1801 pp_c_unary_expression (pp, GENERIC_TREE_OPERAND (e, 0));
1802 pp_c_whitespace (pp);
1803 pp_equal (pp);
1804 pp_space (pp);
1805 pp_c_expression (pp, GENERIC_TREE_OPERAND (e, 1));
1806 }
1807 else
1808 pp_c_conditional_expression (pp, e);
1809 }
1810
1811 /* expression:
1812 assignment-expression
1813 expression , assignment-expression
1814
1815 Implementation note: instead of going through the usual recursion
1816 chain, I take the liberty of dispatching nodes to the appropriate
1817 functions. This makes some redundancy, but it worths it. That also
1818 prevents a possible infinite recursion between pp_c_primary_expression ()
1819 and pp_c_expression (). */
1820
1821 void
1822 pp_c_expression (c_pretty_printer *pp, tree e)
1823 {
1824 switch (TREE_CODE (e))
1825 {
1826 case INTEGER_CST:
1827 pp_c_integer_constant (pp, e);
1828 break;
1829
1830 case REAL_CST:
1831 pp_c_floating_constant (pp, e);
1832 break;
1833
1834 case STRING_CST:
1835 pp_c_string_literal (pp, e);
1836 break;
1837
1838 case IDENTIFIER_NODE:
1839 case FUNCTION_DECL:
1840 case VAR_DECL:
1841 case CONST_DECL:
1842 case PARM_DECL:
1843 case RESULT_DECL:
1844 case FIELD_DECL:
1845 case LABEL_DECL:
1846 case ERROR_MARK:
1847 pp_primary_expression (pp, e);
1848 break;
1849
1850 case POSTINCREMENT_EXPR:
1851 case POSTDECREMENT_EXPR:
1852 case ARRAY_REF:
1853 case CALL_EXPR:
1854 case COMPONENT_REF:
1855 case COMPLEX_CST:
1856 case COMPLEX_EXPR:
1857 case VECTOR_CST:
1858 case ORDERED_EXPR:
1859 case UNORDERED_EXPR:
1860 case LTGT_EXPR:
1861 case UNEQ_EXPR:
1862 case UNLE_EXPR:
1863 case UNLT_EXPR:
1864 case UNGE_EXPR:
1865 case UNGT_EXPR:
1866 case ABS_EXPR:
1867 case CONSTRUCTOR:
1868 case COMPOUND_LITERAL_EXPR:
1869 case VA_ARG_EXPR:
1870 pp_postfix_expression (pp, e);
1871 break;
1872
1873 case CONJ_EXPR:
1874 case ADDR_EXPR:
1875 case INDIRECT_REF:
1876 case NEGATE_EXPR:
1877 case BIT_NOT_EXPR:
1878 case TRUTH_NOT_EXPR:
1879 case PREINCREMENT_EXPR:
1880 case PREDECREMENT_EXPR:
1881 case REALPART_EXPR:
1882 case IMAGPART_EXPR:
1883 pp_c_unary_expression (pp, e);
1884 break;
1885
1886 case FLOAT_EXPR:
1887 case FIX_TRUNC_EXPR:
1888 case CONVERT_EXPR:
1889 case NOP_EXPR:
1890 pp_c_cast_expression (pp, e);
1891 break;
1892
1893 case MULT_EXPR:
1894 case TRUNC_MOD_EXPR:
1895 case TRUNC_DIV_EXPR:
1896 pp_multiplicative_expression (pp, e);
1897 break;
1898
1899 case LSHIFT_EXPR:
1900 case RSHIFT_EXPR:
1901 pp_c_shift_expression (pp, e);
1902 break;
1903
1904 case LT_EXPR:
1905 case GT_EXPR:
1906 case LE_EXPR:
1907 case GE_EXPR:
1908 pp_c_relational_expression (pp, e);
1909 break;
1910
1911 case BIT_AND_EXPR:
1912 pp_c_and_expression (pp, e);
1913 break;
1914
1915 case BIT_XOR_EXPR:
1916 pp_c_exclusive_or_expression (pp, e);
1917 break;
1918
1919 case BIT_IOR_EXPR:
1920 pp_c_inclusive_or_expression (pp, e);
1921 break;
1922
1923 case TRUTH_ANDIF_EXPR:
1924 pp_c_logical_and_expression (pp, e);
1925 break;
1926
1927 case TRUTH_ORIF_EXPR:
1928 pp_c_logical_or_expression (pp, e);
1929 break;
1930
1931 case EQ_EXPR:
1932 case NE_EXPR:
1933 pp_c_equality_expression (pp, e);
1934 break;
1935
1936 case COND_EXPR:
1937 pp_conditional_expression (pp, e);
1938 break;
1939
1940 case PLUS_EXPR:
1941 case MINUS_EXPR:
1942 pp_c_additive_expression (pp, e);
1943 break;
1944
1945 case MODIFY_EXPR:
1946 case GIMPLE_MODIFY_STMT:
1947 case INIT_EXPR:
1948 pp_assignment_expression (pp, e);
1949 break;
1950
1951 case COMPOUND_EXPR:
1952 pp_c_left_paren (pp);
1953 pp_expression (pp, TREE_OPERAND (e, 0));
1954 pp_separate_with (pp, ',');
1955 pp_assignment_expression (pp, TREE_OPERAND (e, 1));
1956 pp_c_right_paren (pp);
1957 break;
1958
1959 case NON_LVALUE_EXPR:
1960 case SAVE_EXPR:
1961 pp_expression (pp, TREE_OPERAND (e, 0));
1962 break;
1963
1964 case TARGET_EXPR:
1965 pp_postfix_expression (pp, TREE_OPERAND (e, 1));
1966 break;
1967
1968 default:
1969 pp_unsupported_tree (pp, e);
1970 break;
1971 }
1972 }
1973
1974
1975 \f
1976 /* Statements. */
1977
1978 void
1979 pp_c_statement (c_pretty_printer *pp, tree stmt)
1980 {
1981 if (stmt == NULL)
1982 return;
1983
1984 if (pp_needs_newline (pp))
1985 pp_newline_and_indent (pp, 0);
1986
1987 dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
1988 }
1989
1990 \f
1991 /* Initialize the PRETTY-PRINTER for handling C codes. */
1992
1993 void
1994 pp_c_pretty_printer_init (c_pretty_printer *pp)
1995 {
1996 pp->offset_list = 0;
1997
1998 pp->declaration = pp_c_declaration;
1999 pp->declaration_specifiers = pp_c_declaration_specifiers;
2000 pp->declarator = pp_c_declarator;
2001 pp->direct_declarator = pp_c_direct_declarator;
2002 pp->type_specifier_seq = pp_c_specifier_qualifier_list;
2003 pp->abstract_declarator = pp_c_abstract_declarator;
2004 pp->direct_abstract_declarator = pp_c_direct_abstract_declarator;
2005 pp->ptr_operator = pp_c_pointer;
2006 pp->parameter_list = pp_c_parameter_type_list;
2007 pp->type_id = pp_c_type_id;
2008 pp->simple_type_specifier = pp_c_type_specifier;
2009 pp->function_specifier = pp_c_function_specifier;
2010 pp->storage_class_specifier = pp_c_storage_class_specifier;
2011
2012 pp->statement = pp_c_statement;
2013
2014 pp->constant = pp_c_constant;
2015 pp->id_expression = pp_c_id_expression;
2016 pp->primary_expression = pp_c_primary_expression;
2017 pp->postfix_expression = pp_c_postfix_expression;
2018 pp->unary_expression = pp_c_unary_expression;
2019 pp->initializer = pp_c_initializer;
2020 pp->multiplicative_expression = pp_c_multiplicative_expression;
2021 pp->conditional_expression = pp_c_conditional_expression;
2022 pp->assignment_expression = pp_c_assignment_expression;
2023 pp->expression = pp_c_expression;
2024 }
2025
2026
2027 /* Print the tree T in full, on file FILE. */
2028
2029 void
2030 print_c_tree (FILE *file, tree t)
2031 {
2032 static c_pretty_printer pp_rec;
2033 static bool initialized = 0;
2034 c_pretty_printer *pp = &pp_rec;
2035
2036 if (!initialized)
2037 {
2038 initialized = 1;
2039 pp_construct (pp_base (pp), NULL, 0);
2040 pp_c_pretty_printer_init (pp);
2041 pp_needs_newline (pp) = true;
2042 }
2043 pp_base (pp)->buffer->stream = file;
2044
2045 pp_statement (pp, t);
2046
2047 pp_newline (pp);
2048 pp_flush (pp);
2049 }
2050
2051 /* Print the tree T in full, on stderr. */
2052
2053 void
2054 debug_c_tree (tree t)
2055 {
2056 print_c_tree (stderr, t);
2057 fputc ('\n', stderr);
2058 }
2059
2060 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
2061 up of T's memory address. */
2062
2063 void
2064 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
2065 {
2066 const char *name;
2067
2068 gcc_assert (DECL_P (t));
2069
2070 if (DECL_NAME (t))
2071 name = IDENTIFIER_POINTER (DECL_NAME (t));
2072 else
2073 {
2074 static char xname[8];
2075 sprintf (xname, "<U%4x>", ((unsigned)((unsigned long)(t) & 0xffff)));
2076 name = xname;
2077 }
2078
2079 pp_c_identifier (pp, name);
2080 }