re PR middle-end/42834 (memcpy folding overeager)
[gcc.git] / gcc / c-family / c-pretty-print.c
1 /* Subroutines common to both C and C++ pretty-printers.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "intl.h"
28 #include "c-pretty-print.h"
29 #include "tree-pretty-print.h"
30 #include "tree-iterator.h"
31 #include "diagnostic.h"
32
33 /* Translate if being used for diagnostics, but not for dump files or
34 __PRETTY_FUNCTION. */
35 #define M_(msgid) (pp_translate_identifiers (pp) ? _(msgid) : (msgid))
36
37 /* The pretty-printer code is primarily designed to closely follow
38 (GNU) C and C++ grammars. That is to be contrasted with spaghetti
39 codes we used to have in the past. Following a structured
40 approach (preferably the official grammars) is believed to make it
41 much easier to add extensions and nifty pretty-printing effects that
42 takes expression or declaration contexts into account. */
43
44
45 #define pp_c_maybe_whitespace(PP) \
46 do { \
47 if (pp_base (PP)->padding == pp_before) \
48 pp_c_whitespace (PP); \
49 } while (0)
50
51 /* literal */
52 static void pp_c_char (c_pretty_printer *, int);
53
54 /* postfix-expression */
55 static void pp_c_initializer_list (c_pretty_printer *, tree);
56 static void pp_c_brace_enclosed_initializer_list (c_pretty_printer *, tree);
57
58 static void pp_c_multiplicative_expression (c_pretty_printer *, tree);
59 static void pp_c_additive_expression (c_pretty_printer *, tree);
60 static void pp_c_shift_expression (c_pretty_printer *, tree);
61 static void pp_c_relational_expression (c_pretty_printer *, tree);
62 static void pp_c_equality_expression (c_pretty_printer *, tree);
63 static void pp_c_and_expression (c_pretty_printer *, tree);
64 static void pp_c_exclusive_or_expression (c_pretty_printer *, tree);
65 static void pp_c_inclusive_or_expression (c_pretty_printer *, tree);
66 static void pp_c_logical_and_expression (c_pretty_printer *, tree);
67 static void pp_c_conditional_expression (c_pretty_printer *, tree);
68 static void pp_c_assignment_expression (c_pretty_printer *, tree);
69
70 /* declarations. */
71
72 \f
73 /* Helper functions. */
74
75 void
76 pp_c_whitespace (c_pretty_printer *pp)
77 {
78 pp_space (pp);
79 pp_base (pp)->padding = pp_none;
80 }
81
82 void
83 pp_c_left_paren (c_pretty_printer *pp)
84 {
85 pp_left_paren (pp);
86 pp_base (pp)->padding = pp_none;
87 }
88
89 void
90 pp_c_right_paren (c_pretty_printer *pp)
91 {
92 pp_right_paren (pp);
93 pp_base (pp)->padding = pp_none;
94 }
95
96 void
97 pp_c_left_brace (c_pretty_printer *pp)
98 {
99 pp_left_brace (pp);
100 pp_base (pp)->padding = pp_none;
101 }
102
103 void
104 pp_c_right_brace (c_pretty_printer *pp)
105 {
106 pp_right_brace (pp);
107 pp_base (pp)->padding = pp_none;
108 }
109
110 void
111 pp_c_left_bracket (c_pretty_printer *pp)
112 {
113 pp_left_bracket (pp);
114 pp_base (pp)->padding = pp_none;
115 }
116
117 void
118 pp_c_right_bracket (c_pretty_printer *pp)
119 {
120 pp_right_bracket (pp);
121 pp_base (pp)->padding = pp_none;
122 }
123
124 void
125 pp_c_dot (c_pretty_printer *pp)
126 {
127 pp_dot (pp);
128 pp_base (pp)->padding = pp_none;
129 }
130
131 void
132 pp_c_ampersand (c_pretty_printer *pp)
133 {
134 pp_ampersand (pp);
135 pp_base (pp)->padding = pp_none;
136 }
137
138 void
139 pp_c_star (c_pretty_printer *pp)
140 {
141 pp_star (pp);
142 pp_base (pp)->padding = pp_none;
143 }
144
145 void
146 pp_c_arrow (c_pretty_printer *pp)
147 {
148 pp_arrow (pp);
149 pp_base (pp)->padding = pp_none;
150 }
151
152 void
153 pp_c_semicolon (c_pretty_printer *pp)
154 {
155 pp_semicolon (pp);
156 pp_base (pp)->padding = pp_none;
157 }
158
159 void
160 pp_c_complement (c_pretty_printer *pp)
161 {
162 pp_complement (pp);
163 pp_base (pp)->padding = pp_none;
164 }
165
166 void
167 pp_c_exclamation (c_pretty_printer *pp)
168 {
169 pp_exclamation (pp);
170 pp_base (pp)->padding = pp_none;
171 }
172
173 /* Print out the external representation of QUALIFIERS. */
174
175 void
176 pp_c_cv_qualifiers (c_pretty_printer *pp, int qualifiers, bool func_type)
177 {
178 const char *p = pp_last_position_in_text (pp);
179 bool previous = false;
180
181 if (!qualifiers)
182 return;
183
184 /* The C programming language does not have references, but it is much
185 simpler to handle those here rather than going through the same
186 logic in the C++ pretty-printer. */
187 if (p != NULL && (*p == '*' || *p == '&'))
188 pp_c_whitespace (pp);
189
190 if (qualifiers & TYPE_QUAL_CONST)
191 {
192 pp_c_ws_string (pp, func_type ? "__attribute__((const))" : "const");
193 previous = true;
194 }
195
196 if (qualifiers & TYPE_QUAL_VOLATILE)
197 {
198 if (previous)
199 pp_c_whitespace (pp);
200 pp_c_ws_string (pp, func_type ? "__attribute__((noreturn))" : "volatile");
201 previous = true;
202 }
203
204 if (qualifiers & TYPE_QUAL_RESTRICT)
205 {
206 if (previous)
207 pp_c_whitespace (pp);
208 pp_c_ws_string (pp, flag_isoc99 ? "restrict" : "__restrict__");
209 }
210 }
211
212 /* Pretty-print T using the type-cast notation '( type-name )'. */
213
214 static void
215 pp_c_type_cast (c_pretty_printer *pp, tree t)
216 {
217 pp_c_left_paren (pp);
218 pp_type_id (pp, t);
219 pp_c_right_paren (pp);
220 }
221
222 /* We're about to pretty-print a pointer type as indicated by T.
223 Output a whitespace, if needed, preparing for subsequent output. */
224
225 void
226 pp_c_space_for_pointer_operator (c_pretty_printer *pp, tree t)
227 {
228 if (POINTER_TYPE_P (t))
229 {
230 tree pointee = strip_pointer_operator (TREE_TYPE (t));
231 if (TREE_CODE (pointee) != ARRAY_TYPE
232 && TREE_CODE (pointee) != FUNCTION_TYPE)
233 pp_c_whitespace (pp);
234 }
235 }
236
237 \f
238 /* Declarations. */
239
240 /* C++ cv-qualifiers are called type-qualifiers in C. Print out the
241 cv-qualifiers of T. If T is a declaration then it is the cv-qualifier
242 of its type. Take care of possible extensions.
243
244 type-qualifier-list:
245 type-qualifier
246 type-qualifier-list type-qualifier
247
248 type-qualifier:
249 const
250 restrict -- C99
251 __restrict__ -- GNU C
252 address-space-qualifier -- GNU C
253 volatile
254
255 address-space-qualifier:
256 identifier -- GNU C */
257
258 void
259 pp_c_type_qualifier_list (c_pretty_printer *pp, tree t)
260 {
261 int qualifiers;
262
263 if (!t || t == error_mark_node)
264 return;
265
266 if (!TYPE_P (t))
267 t = TREE_TYPE (t);
268
269 qualifiers = TYPE_QUALS (t);
270 pp_c_cv_qualifiers (pp, qualifiers,
271 TREE_CODE (t) == FUNCTION_TYPE);
272
273 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (t)))
274 {
275 const char *as = c_addr_space_name (TYPE_ADDR_SPACE (t));
276 pp_c_identifier (pp, as);
277 }
278 }
279
280 /* pointer:
281 * type-qualifier-list(opt)
282 * type-qualifier-list(opt) pointer */
283
284 static void
285 pp_c_pointer (c_pretty_printer *pp, tree t)
286 {
287 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
288 t = TREE_TYPE (t);
289 switch (TREE_CODE (t))
290 {
291 case POINTER_TYPE:
292 /* It is easier to handle C++ reference types here. */
293 case REFERENCE_TYPE:
294 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
295 pp_c_pointer (pp, TREE_TYPE (t));
296 if (TREE_CODE (t) == POINTER_TYPE)
297 pp_c_star (pp);
298 else
299 pp_c_ampersand (pp);
300 pp_c_type_qualifier_list (pp, t);
301 break;
302
303 /* ??? This node is now in GENERIC and so shouldn't be here. But
304 we'll fix that later. */
305 case DECL_EXPR:
306 pp_declaration (pp, DECL_EXPR_DECL (t));
307 pp_needs_newline (pp) = true;
308 break;
309
310 default:
311 pp_unsupported_tree (pp, t);
312 }
313 }
314
315 /* type-specifier:
316 void
317 char
318 short
319 int
320 long
321 float
322 double
323 signed
324 unsigned
325 _Bool -- C99
326 _Complex -- C99
327 _Imaginary -- C99
328 struct-or-union-specifier
329 enum-specifier
330 typedef-name.
331
332 GNU extensions.
333 simple-type-specifier:
334 __complex__
335 __vector__ */
336
337 void
338 pp_c_type_specifier (c_pretty_printer *pp, tree t)
339 {
340 const enum tree_code code = TREE_CODE (t);
341 switch (code)
342 {
343 case ERROR_MARK:
344 pp_c_ws_string (pp, M_("<type-error>"));
345 break;
346
347 case IDENTIFIER_NODE:
348 pp_c_tree_decl_identifier (pp, t);
349 break;
350
351 case VOID_TYPE:
352 case BOOLEAN_TYPE:
353 case INTEGER_TYPE:
354 case REAL_TYPE:
355 case FIXED_POINT_TYPE:
356 if (TYPE_NAME (t))
357 {
358 t = TYPE_NAME (t);
359 pp_c_type_specifier (pp, t);
360 }
361 else
362 {
363 int prec = TYPE_PRECISION (t);
364 if (ALL_FIXED_POINT_MODE_P (TYPE_MODE (t)))
365 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_SATURATING (t));
366 else
367 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
368 if (TYPE_NAME (t))
369 {
370 pp_c_type_specifier (pp, t);
371 if (TYPE_PRECISION (t) != prec)
372 {
373 pp_string (pp, ":");
374 pp_decimal_int (pp, prec);
375 }
376 }
377 else
378 {
379 switch (code)
380 {
381 case INTEGER_TYPE:
382 pp_string (pp, (TYPE_UNSIGNED (t)
383 ? M_("<unnamed-unsigned:")
384 : M_("<unnamed-signed:")));
385 break;
386 case REAL_TYPE:
387 pp_string (pp, M_("<unnamed-float:"));
388 break;
389 case FIXED_POINT_TYPE:
390 pp_string (pp, M_("<unnamed-fixed:"));
391 break;
392 default:
393 gcc_unreachable ();
394 }
395 pp_decimal_int (pp, prec);
396 pp_string (pp, ">");
397 }
398 }
399 break;
400
401 case TYPE_DECL:
402 if (DECL_NAME (t))
403 pp_id_expression (pp, t);
404 else
405 pp_c_ws_string (pp, M_("<typedef-error>"));
406 break;
407
408 case UNION_TYPE:
409 case RECORD_TYPE:
410 case ENUMERAL_TYPE:
411 if (code == UNION_TYPE)
412 pp_c_ws_string (pp, "union");
413 else if (code == RECORD_TYPE)
414 pp_c_ws_string (pp, "struct");
415 else if (code == ENUMERAL_TYPE)
416 pp_c_ws_string (pp, "enum");
417 else
418 pp_c_ws_string (pp, M_("<tag-error>"));
419
420 if (TYPE_NAME (t))
421 pp_id_expression (pp, TYPE_NAME (t));
422 else
423 pp_c_ws_string (pp, M_("<anonymous>"));
424 break;
425
426 default:
427 pp_unsupported_tree (pp, t);
428 break;
429 }
430 }
431
432 /* specifier-qualifier-list:
433 type-specifier specifier-qualifier-list-opt
434 type-qualifier specifier-qualifier-list-opt
435
436
437 Implementation note: Because of the non-linearities in array or
438 function declarations, this routine prints not just the
439 specifier-qualifier-list of such entities or types of such entities,
440 but also the 'pointer' production part of their declarators. The
441 remaining part is done by pp_declarator or pp_c_abstract_declarator. */
442
443 void
444 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
445 {
446 const enum tree_code code = TREE_CODE (t);
447
448 if (TREE_CODE (t) != POINTER_TYPE)
449 pp_c_type_qualifier_list (pp, t);
450 switch (code)
451 {
452 case REFERENCE_TYPE:
453 case POINTER_TYPE:
454 {
455 /* Get the types-specifier of this type. */
456 tree pointee = strip_pointer_operator (TREE_TYPE (t));
457 pp_c_specifier_qualifier_list (pp, pointee);
458 if (TREE_CODE (pointee) == ARRAY_TYPE
459 || TREE_CODE (pointee) == FUNCTION_TYPE)
460 {
461 pp_c_whitespace (pp);
462 pp_c_left_paren (pp);
463 }
464 else if (!c_dialect_cxx ())
465 pp_c_whitespace (pp);
466 pp_ptr_operator (pp, t);
467 }
468 break;
469
470 case FUNCTION_TYPE:
471 case ARRAY_TYPE:
472 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
473 break;
474
475 case VECTOR_TYPE:
476 case COMPLEX_TYPE:
477 if (code == COMPLEX_TYPE)
478 pp_c_ws_string (pp, flag_isoc99 ? "_Complex" : "__complex__");
479 else if (code == VECTOR_TYPE)
480 {
481 pp_c_ws_string (pp, "__vector");
482 pp_c_left_paren (pp);
483 pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (t));
484 pp_c_right_paren (pp);
485 pp_c_whitespace (pp);
486 }
487 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
488 break;
489
490 default:
491 pp_simple_type_specifier (pp, t);
492 break;
493 }
494 }
495
496 /* parameter-type-list:
497 parameter-list
498 parameter-list , ...
499
500 parameter-list:
501 parameter-declaration
502 parameter-list , parameter-declaration
503
504 parameter-declaration:
505 declaration-specifiers declarator
506 declaration-specifiers abstract-declarator(opt) */
507
508 void
509 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
510 {
511 bool want_parm_decl = DECL_P (t) && !(pp->flags & pp_c_flag_abstract);
512 tree parms = want_parm_decl ? DECL_ARGUMENTS (t) : TYPE_ARG_TYPES (t);
513 pp_c_left_paren (pp);
514 if (parms == void_list_node)
515 pp_c_ws_string (pp, "void");
516 else
517 {
518 bool first = true;
519 for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
520 {
521 if (!first)
522 pp_separate_with (pp, ',');
523 first = false;
524 pp_declaration_specifiers
525 (pp, want_parm_decl ? parms : TREE_VALUE (parms));
526 if (want_parm_decl)
527 pp_declarator (pp, parms);
528 else
529 pp_abstract_declarator (pp, TREE_VALUE (parms));
530 }
531 }
532 pp_c_right_paren (pp);
533 }
534
535 /* abstract-declarator:
536 pointer
537 pointer(opt) direct-abstract-declarator */
538
539 static void
540 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
541 {
542 if (TREE_CODE (t) == POINTER_TYPE)
543 {
544 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
545 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
546 pp_c_right_paren (pp);
547 t = TREE_TYPE (t);
548 }
549
550 pp_direct_abstract_declarator (pp, t);
551 }
552
553 /* direct-abstract-declarator:
554 ( abstract-declarator )
555 direct-abstract-declarator(opt) [ assignment-expression(opt) ]
556 direct-abstract-declarator(opt) [ * ]
557 direct-abstract-declarator(opt) ( parameter-type-list(opt) ) */
558
559 void
560 pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
561 {
562 switch (TREE_CODE (t))
563 {
564 case POINTER_TYPE:
565 pp_abstract_declarator (pp, t);
566 break;
567
568 case FUNCTION_TYPE:
569 pp_c_parameter_type_list (pp, t);
570 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
571 break;
572
573 case ARRAY_TYPE:
574 pp_c_left_bracket (pp);
575 if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
576 {
577 tree maxval = TYPE_MAX_VALUE (TYPE_DOMAIN (t));
578 tree type = TREE_TYPE (maxval);
579
580 if (host_integerp (maxval, 0))
581 pp_wide_integer (pp, tree_low_cst (maxval, 0) + 1);
582 else
583 pp_expression (pp, fold_build2 (PLUS_EXPR, type, maxval,
584 build_int_cst (type, 1)));
585 }
586 pp_c_right_bracket (pp);
587 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
588 break;
589
590 case IDENTIFIER_NODE:
591 case VOID_TYPE:
592 case BOOLEAN_TYPE:
593 case INTEGER_TYPE:
594 case REAL_TYPE:
595 case FIXED_POINT_TYPE:
596 case ENUMERAL_TYPE:
597 case RECORD_TYPE:
598 case UNION_TYPE:
599 case VECTOR_TYPE:
600 case COMPLEX_TYPE:
601 case TYPE_DECL:
602 break;
603
604 default:
605 pp_unsupported_tree (pp, t);
606 break;
607 }
608 }
609
610 /* type-name:
611 specifier-qualifier-list abstract-declarator(opt) */
612
613 void
614 pp_c_type_id (c_pretty_printer *pp, tree t)
615 {
616 pp_c_specifier_qualifier_list (pp, t);
617 pp_abstract_declarator (pp, t);
618 }
619
620 /* storage-class-specifier:
621 typedef
622 extern
623 static
624 auto
625 register */
626
627 void
628 pp_c_storage_class_specifier (c_pretty_printer *pp, tree t)
629 {
630 if (TREE_CODE (t) == TYPE_DECL)
631 pp_c_ws_string (pp, "typedef");
632 else if (DECL_P (t))
633 {
634 if (DECL_REGISTER (t))
635 pp_c_ws_string (pp, "register");
636 else if (TREE_STATIC (t) && TREE_CODE (t) == VAR_DECL)
637 pp_c_ws_string (pp, "static");
638 }
639 }
640
641 /* function-specifier:
642 inline */
643
644 void
645 pp_c_function_specifier (c_pretty_printer *pp, tree t)
646 {
647 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
648 pp_c_ws_string (pp, "inline");
649 }
650
651 /* declaration-specifiers:
652 storage-class-specifier declaration-specifiers(opt)
653 type-specifier declaration-specifiers(opt)
654 type-qualifier declaration-specifiers(opt)
655 function-specifier declaration-specifiers(opt) */
656
657 void
658 pp_c_declaration_specifiers (c_pretty_printer *pp, tree t)
659 {
660 pp_storage_class_specifier (pp, t);
661 pp_function_specifier (pp, t);
662 pp_c_specifier_qualifier_list (pp, DECL_P (t) ? TREE_TYPE (t) : t);
663 }
664
665 /* direct-declarator
666 identifier
667 ( declarator )
668 direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
669 direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
670 direct-declarator [ type-qualifier-list static assignment-expression ]
671 direct-declarator [ type-qualifier-list * ]
672 direct-declarator ( parameter-type-list )
673 direct-declarator ( identifier-list(opt) ) */
674
675 void
676 pp_c_direct_declarator (c_pretty_printer *pp, tree t)
677 {
678 switch (TREE_CODE (t))
679 {
680 case VAR_DECL:
681 case PARM_DECL:
682 case TYPE_DECL:
683 case FIELD_DECL:
684 case LABEL_DECL:
685 pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
686 pp_c_tree_decl_identifier (pp, t);
687 break;
688
689 case ARRAY_TYPE:
690 case POINTER_TYPE:
691 pp_abstract_declarator (pp, TREE_TYPE (t));
692 break;
693
694 case FUNCTION_TYPE:
695 pp_parameter_list (pp, t);
696 pp_abstract_declarator (pp, TREE_TYPE (t));
697 break;
698
699 case FUNCTION_DECL:
700 pp_c_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
701 pp_c_tree_decl_identifier (pp, t);
702 if (pp_c_base (pp)->flags & pp_c_flag_abstract)
703 pp_abstract_declarator (pp, TREE_TYPE (t));
704 else
705 {
706 pp_parameter_list (pp, t);
707 pp_abstract_declarator (pp, TREE_TYPE (TREE_TYPE (t)));
708 }
709 break;
710
711 case INTEGER_TYPE:
712 case REAL_TYPE:
713 case FIXED_POINT_TYPE:
714 case ENUMERAL_TYPE:
715 case UNION_TYPE:
716 case RECORD_TYPE:
717 break;
718
719 default:
720 pp_unsupported_tree (pp, t);
721 break;
722 }
723 }
724
725
726 /* declarator:
727 pointer(opt) direct-declarator */
728
729 void
730 pp_c_declarator (c_pretty_printer *pp, tree t)
731 {
732 switch (TREE_CODE (t))
733 {
734 case INTEGER_TYPE:
735 case REAL_TYPE:
736 case FIXED_POINT_TYPE:
737 case ENUMERAL_TYPE:
738 case UNION_TYPE:
739 case RECORD_TYPE:
740 break;
741
742 case VAR_DECL:
743 case PARM_DECL:
744 case FIELD_DECL:
745 case ARRAY_TYPE:
746 case FUNCTION_TYPE:
747 case FUNCTION_DECL:
748 case TYPE_DECL:
749 pp_direct_declarator (pp, t);
750 break;
751
752
753 default:
754 pp_unsupported_tree (pp, t);
755 break;
756 }
757 }
758
759 /* declaration:
760 declaration-specifiers init-declarator-list(opt) ; */
761
762 void
763 pp_c_declaration (c_pretty_printer *pp, tree t)
764 {
765 pp_declaration_specifiers (pp, t);
766 pp_c_init_declarator (pp, t);
767 }
768
769 /* Pretty-print ATTRIBUTES using GNU C extension syntax. */
770
771 void
772 pp_c_attributes (c_pretty_printer *pp, tree attributes)
773 {
774 if (attributes == NULL_TREE)
775 return;
776
777 pp_c_ws_string (pp, "__attribute__");
778 pp_c_left_paren (pp);
779 pp_c_left_paren (pp);
780 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
781 {
782 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
783 if (TREE_VALUE (attributes))
784 pp_c_call_argument_list (pp, TREE_VALUE (attributes));
785
786 if (TREE_CHAIN (attributes))
787 pp_separate_with (pp, ',');
788 }
789 pp_c_right_paren (pp);
790 pp_c_right_paren (pp);
791 }
792
793 /* function-definition:
794 declaration-specifiers declarator compound-statement */
795
796 void
797 pp_c_function_definition (c_pretty_printer *pp, tree t)
798 {
799 pp_declaration_specifiers (pp, t);
800 pp_declarator (pp, t);
801 pp_needs_newline (pp) = true;
802 pp_statement (pp, DECL_SAVED_TREE (t));
803 pp_newline (pp);
804 pp_flush (pp);
805 }
806
807 \f
808 /* Expressions. */
809
810 /* Print out a c-char. This is called solely for characters which are
811 in the *target* execution character set. We ought to convert them
812 back to the *host* execution character set before printing, but we
813 have no way to do this at present. A decent compromise is to print
814 all characters as if they were in the host execution character set,
815 and not attempt to recover any named escape characters, but render
816 all unprintables as octal escapes. If the host and target character
817 sets are the same, this produces relatively readable output. If they
818 are not the same, strings may appear as gibberish, but that's okay
819 (in fact, it may well be what the reader wants, e.g. if they are looking
820 to see if conversion to the target character set happened correctly).
821
822 A special case: we need to prefix \, ", and ' with backslashes. It is
823 correct to do so for the *host*'s \, ", and ', because the rest of the
824 file appears in the host character set. */
825
826 static void
827 pp_c_char (c_pretty_printer *pp, int c)
828 {
829 if (ISPRINT (c))
830 {
831 switch (c)
832 {
833 case '\\': pp_string (pp, "\\\\"); break;
834 case '\'': pp_string (pp, "\\\'"); break;
835 case '\"': pp_string (pp, "\\\""); break;
836 default: pp_character (pp, c);
837 }
838 }
839 else
840 pp_scalar (pp, "\\%03o", (unsigned) c);
841 }
842
843 /* Print out a STRING literal. */
844
845 void
846 pp_c_string_literal (c_pretty_printer *pp, tree s)
847 {
848 const char *p = TREE_STRING_POINTER (s);
849 int n = TREE_STRING_LENGTH (s) - 1;
850 int i;
851 pp_doublequote (pp);
852 for (i = 0; i < n; ++i)
853 pp_c_char (pp, p[i]);
854 pp_doublequote (pp);
855 }
856
857 /* Pretty-print an INTEGER literal. */
858
859 static void
860 pp_c_integer_constant (c_pretty_printer *pp, tree i)
861 {
862 tree type = TREE_TYPE (i);
863
864 if (TREE_INT_CST_HIGH (i) == 0)
865 pp_wide_integer (pp, TREE_INT_CST_LOW (i));
866 else
867 {
868 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (i);
869 HOST_WIDE_INT high = TREE_INT_CST_HIGH (i);
870 if (tree_int_cst_sgn (i) < 0)
871 {
872 pp_character (pp, '-');
873 high = ~high + !low;
874 low = -low;
875 }
876 sprintf (pp_buffer (pp)->digit_buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
877 (unsigned HOST_WIDE_INT) high, (unsigned HOST_WIDE_INT) low);
878 pp_string (pp, pp_buffer (pp)->digit_buffer);
879 }
880 if (TYPE_UNSIGNED (type))
881 pp_character (pp, 'u');
882 if (type == long_integer_type_node || type == long_unsigned_type_node)
883 pp_character (pp, 'l');
884 else if (type == long_long_integer_type_node
885 || type == long_long_unsigned_type_node)
886 pp_string (pp, "ll");
887 else if (type == int128_integer_type_node
888 || type == int128_unsigned_type_node)
889 pp_string (pp, "I128");
890 }
891
892 /* Print out a CHARACTER literal. */
893
894 static void
895 pp_c_character_constant (c_pretty_printer *pp, tree c)
896 {
897 tree type = TREE_TYPE (c);
898 if (type == wchar_type_node)
899 pp_character (pp, 'L');
900 pp_quote (pp);
901 if (host_integerp (c, TYPE_UNSIGNED (type)))
902 pp_c_char (pp, tree_low_cst (c, TYPE_UNSIGNED (type)));
903 else
904 pp_scalar (pp, "\\x%x", (unsigned) TREE_INT_CST_LOW (c));
905 pp_quote (pp);
906 }
907
908 /* Print out a BOOLEAN literal. */
909
910 static void
911 pp_c_bool_constant (c_pretty_printer *pp, tree b)
912 {
913 if (b == boolean_false_node)
914 {
915 if (c_dialect_cxx ())
916 pp_c_ws_string (pp, "false");
917 else if (flag_isoc99)
918 pp_c_ws_string (pp, "_False");
919 else
920 pp_unsupported_tree (pp, b);
921 }
922 else if (b == boolean_true_node)
923 {
924 if (c_dialect_cxx ())
925 pp_c_ws_string (pp, "true");
926 else if (flag_isoc99)
927 pp_c_ws_string (pp, "_True");
928 else
929 pp_unsupported_tree (pp, b);
930 }
931 else if (TREE_CODE (b) == INTEGER_CST)
932 pp_c_integer_constant (pp, b);
933 else
934 pp_unsupported_tree (pp, b);
935 }
936
937 /* Attempt to print out an ENUMERATOR. Return true on success. Else return
938 false; that means the value was obtained by a cast, in which case
939 print out the type-id part of the cast-expression -- the casted value
940 is then printed by pp_c_integer_literal. */
941
942 static bool
943 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
944 {
945 bool value_is_named = true;
946 tree type = TREE_TYPE (e);
947 tree value;
948
949 /* Find the name of this constant. */
950 for (value = TYPE_VALUES (type);
951 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
952 value = TREE_CHAIN (value))
953 ;
954
955 if (value != NULL_TREE)
956 pp_id_expression (pp, TREE_PURPOSE (value));
957 else
958 {
959 /* Value must have been cast. */
960 pp_c_type_cast (pp, type);
961 value_is_named = false;
962 }
963
964 return value_is_named;
965 }
966
967 /* Print out a REAL value as a decimal-floating-constant. */
968
969 static void
970 pp_c_floating_constant (c_pretty_printer *pp, tree r)
971 {
972 real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
973 sizeof (pp_buffer (pp)->digit_buffer), 0, 1);
974 pp_string (pp, pp_buffer(pp)->digit_buffer);
975 if (TREE_TYPE (r) == float_type_node)
976 pp_character (pp, 'f');
977 else if (TREE_TYPE (r) == long_double_type_node)
978 pp_character (pp, 'l');
979 else if (TREE_TYPE (r) == dfloat128_type_node)
980 pp_string (pp, "dl");
981 else if (TREE_TYPE (r) == dfloat64_type_node)
982 pp_string (pp, "dd");
983 else if (TREE_TYPE (r) == dfloat32_type_node)
984 pp_string (pp, "df");
985 }
986
987 /* Print out a FIXED value as a decimal-floating-constant. */
988
989 static void
990 pp_c_fixed_constant (c_pretty_printer *pp, tree r)
991 {
992 fixed_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_FIXED_CST (r),
993 sizeof (pp_buffer (pp)->digit_buffer));
994 pp_string (pp, pp_buffer(pp)->digit_buffer);
995 }
996
997 /* Pretty-print a compound literal expression. GNU extensions include
998 vector constants. */
999
1000 static void
1001 pp_c_compound_literal (c_pretty_printer *pp, tree e)
1002 {
1003 tree type = TREE_TYPE (e);
1004 pp_c_type_cast (pp, type);
1005
1006 switch (TREE_CODE (type))
1007 {
1008 case RECORD_TYPE:
1009 case UNION_TYPE:
1010 case ARRAY_TYPE:
1011 case VECTOR_TYPE:
1012 case COMPLEX_TYPE:
1013 pp_c_brace_enclosed_initializer_list (pp, e);
1014 break;
1015
1016 default:
1017 pp_unsupported_tree (pp, e);
1018 break;
1019 }
1020 }
1021
1022 /* Pretty-print a COMPLEX_EXPR expression. */
1023
1024 static void
1025 pp_c_complex_expr (c_pretty_printer *pp, tree e)
1026 {
1027 /* Handle a few common special cases, otherwise fallback
1028 to printing it as compound literal. */
1029 tree type = TREE_TYPE (e);
1030 tree realexpr = TREE_OPERAND (e, 0);
1031 tree imagexpr = TREE_OPERAND (e, 1);
1032
1033 /* Cast of an COMPLEX_TYPE expression to a different COMPLEX_TYPE. */
1034 if (TREE_CODE (realexpr) == NOP_EXPR
1035 && TREE_CODE (imagexpr) == NOP_EXPR
1036 && TREE_TYPE (realexpr) == TREE_TYPE (type)
1037 && TREE_TYPE (imagexpr) == TREE_TYPE (type)
1038 && TREE_CODE (TREE_OPERAND (realexpr, 0)) == REALPART_EXPR
1039 && TREE_CODE (TREE_OPERAND (imagexpr, 0)) == IMAGPART_EXPR
1040 && TREE_OPERAND (TREE_OPERAND (realexpr, 0), 0)
1041 == TREE_OPERAND (TREE_OPERAND (imagexpr, 0), 0))
1042 {
1043 pp_c_type_cast (pp, type);
1044 pp_expression (pp, TREE_OPERAND (TREE_OPERAND (realexpr, 0), 0));
1045 return;
1046 }
1047
1048 /* Cast of an scalar expression to COMPLEX_TYPE. */
1049 if ((integer_zerop (imagexpr) || real_zerop (imagexpr))
1050 && TREE_TYPE (realexpr) == TREE_TYPE (type))
1051 {
1052 pp_c_type_cast (pp, type);
1053 if (TREE_CODE (realexpr) == NOP_EXPR)
1054 realexpr = TREE_OPERAND (realexpr, 0);
1055 pp_expression (pp, realexpr);
1056 return;
1057 }
1058
1059 pp_c_compound_literal (pp, e);
1060 }
1061
1062 /* constant:
1063 integer-constant
1064 floating-constant
1065 fixed-point-constant
1066 enumeration-constant
1067 character-constant */
1068
1069 void
1070 pp_c_constant (c_pretty_printer *pp, tree e)
1071 {
1072 const enum tree_code code = TREE_CODE (e);
1073
1074 switch (code)
1075 {
1076 case INTEGER_CST:
1077 {
1078 tree type = TREE_TYPE (e);
1079 if (type == boolean_type_node)
1080 pp_c_bool_constant (pp, e);
1081 else if (type == char_type_node)
1082 pp_c_character_constant (pp, e);
1083 else if (TREE_CODE (type) == ENUMERAL_TYPE
1084 && pp_c_enumeration_constant (pp, e))
1085 ;
1086 else
1087 pp_c_integer_constant (pp, e);
1088 }
1089 break;
1090
1091 case REAL_CST:
1092 pp_c_floating_constant (pp, e);
1093 break;
1094
1095 case FIXED_CST:
1096 pp_c_fixed_constant (pp, e);
1097 break;
1098
1099 case STRING_CST:
1100 pp_c_string_literal (pp, e);
1101 break;
1102
1103 case COMPLEX_CST:
1104 /* Sometimes, we are confused and we think a complex literal
1105 is a constant. Such thing is a compound literal which
1106 grammatically belongs to postfix-expr production. */
1107 pp_c_compound_literal (pp, e);
1108 break;
1109
1110 default:
1111 pp_unsupported_tree (pp, e);
1112 break;
1113 }
1114 }
1115
1116 /* Pretty-print a string such as an identifier, without changing its
1117 encoding, preceded by whitespace is necessary. */
1118
1119 void
1120 pp_c_ws_string (c_pretty_printer *pp, const char *str)
1121 {
1122 pp_c_maybe_whitespace (pp);
1123 pp_string (pp, str);
1124 pp_base (pp)->padding = pp_before;
1125 }
1126
1127 /* Pretty-print an IDENTIFIER_NODE, which may contain UTF-8 sequences
1128 that need converting to the locale encoding, preceded by whitespace
1129 is necessary. */
1130
1131 void
1132 pp_c_identifier (c_pretty_printer *pp, const char *id)
1133 {
1134 pp_c_maybe_whitespace (pp);
1135 pp_identifier (pp, id);
1136 pp_base (pp)->padding = pp_before;
1137 }
1138
1139 /* Pretty-print a C primary-expression.
1140 primary-expression:
1141 identifier
1142 constant
1143 string-literal
1144 ( expression ) */
1145
1146 void
1147 pp_c_primary_expression (c_pretty_printer *pp, tree e)
1148 {
1149 switch (TREE_CODE (e))
1150 {
1151 case VAR_DECL:
1152 case PARM_DECL:
1153 case FIELD_DECL:
1154 case CONST_DECL:
1155 case FUNCTION_DECL:
1156 case LABEL_DECL:
1157 pp_c_tree_decl_identifier (pp, e);
1158 break;
1159
1160 case IDENTIFIER_NODE:
1161 pp_c_tree_identifier (pp, e);
1162 break;
1163
1164 case ERROR_MARK:
1165 pp_c_ws_string (pp, M_("<erroneous-expression>"));
1166 break;
1167
1168 case RESULT_DECL:
1169 pp_c_ws_string (pp, M_("<return-value>"));
1170 break;
1171
1172 case INTEGER_CST:
1173 case REAL_CST:
1174 case FIXED_CST:
1175 case STRING_CST:
1176 pp_c_constant (pp, e);
1177 break;
1178
1179 case TARGET_EXPR:
1180 pp_c_ws_string (pp, "__builtin_memcpy");
1181 pp_c_left_paren (pp);
1182 pp_ampersand (pp);
1183 pp_primary_expression (pp, TREE_OPERAND (e, 0));
1184 pp_separate_with (pp, ',');
1185 pp_ampersand (pp);
1186 pp_initializer (pp, TREE_OPERAND (e, 1));
1187 if (TREE_OPERAND (e, 2))
1188 {
1189 pp_separate_with (pp, ',');
1190 pp_c_expression (pp, TREE_OPERAND (e, 2));
1191 }
1192 pp_c_right_paren (pp);
1193 break;
1194
1195 default:
1196 /* FIXME: Make sure we won't get into an infinite loop. */
1197 pp_c_left_paren (pp);
1198 pp_expression (pp, e);
1199 pp_c_right_paren (pp);
1200 break;
1201 }
1202 }
1203
1204 /* Print out a C initializer -- also support C compound-literals.
1205 initializer:
1206 assignment-expression:
1207 { initializer-list }
1208 { initializer-list , } */
1209
1210 static void
1211 pp_c_initializer (c_pretty_printer *pp, tree e)
1212 {
1213 if (TREE_CODE (e) == CONSTRUCTOR)
1214 pp_c_brace_enclosed_initializer_list (pp, e);
1215 else
1216 pp_expression (pp, e);
1217 }
1218
1219 /* init-declarator:
1220 declarator:
1221 declarator = initializer */
1222
1223 void
1224 pp_c_init_declarator (c_pretty_printer *pp, tree t)
1225 {
1226 pp_declarator (pp, t);
1227 /* We don't want to output function definitions here. There are handled
1228 elsewhere (and the syntactic form is bogus anyway). */
1229 if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
1230 {
1231 tree init = DECL_INITIAL (t);
1232 /* This C++ bit is handled here because it is easier to do so.
1233 In templates, the C++ parser builds a TREE_LIST for a
1234 direct-initialization; the TREE_PURPOSE is the variable to
1235 initialize and the TREE_VALUE is the initializer. */
1236 if (TREE_CODE (init) == TREE_LIST)
1237 {
1238 pp_c_left_paren (pp);
1239 pp_expression (pp, TREE_VALUE (init));
1240 pp_right_paren (pp);
1241 }
1242 else
1243 {
1244 pp_space (pp);
1245 pp_equal (pp);
1246 pp_space (pp);
1247 pp_c_initializer (pp, init);
1248 }
1249 }
1250 }
1251
1252 /* initializer-list:
1253 designation(opt) initializer
1254 initializer-list , designation(opt) initializer
1255
1256 designation:
1257 designator-list =
1258
1259 designator-list:
1260 designator
1261 designator-list designator
1262
1263 designator:
1264 [ constant-expression ]
1265 identifier */
1266
1267 static void
1268 pp_c_initializer_list (c_pretty_printer *pp, tree e)
1269 {
1270 tree type = TREE_TYPE (e);
1271 const enum tree_code code = TREE_CODE (type);
1272
1273 if (TREE_CODE (e) == CONSTRUCTOR)
1274 {
1275 pp_c_constructor_elts (pp, CONSTRUCTOR_ELTS (e));
1276 return;
1277 }
1278
1279 switch (code)
1280 {
1281 case RECORD_TYPE:
1282 case UNION_TYPE:
1283 case ARRAY_TYPE:
1284 {
1285 tree init = TREE_OPERAND (e, 0);
1286 for (; init != NULL_TREE; init = TREE_CHAIN (init))
1287 {
1288 if (code == RECORD_TYPE || code == UNION_TYPE)
1289 {
1290 pp_c_dot (pp);
1291 pp_c_primary_expression (pp, TREE_PURPOSE (init));
1292 }
1293 else
1294 {
1295 pp_c_left_bracket (pp);
1296 if (TREE_PURPOSE (init))
1297 pp_c_constant (pp, TREE_PURPOSE (init));
1298 pp_c_right_bracket (pp);
1299 }
1300 pp_c_whitespace (pp);
1301 pp_equal (pp);
1302 pp_c_whitespace (pp);
1303 pp_initializer (pp, TREE_VALUE (init));
1304 if (TREE_CHAIN (init))
1305 pp_separate_with (pp, ',');
1306 }
1307 }
1308 return;
1309
1310 case VECTOR_TYPE:
1311 if (TREE_CODE (e) == VECTOR_CST)
1312 pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
1313 else
1314 break;
1315 return;
1316
1317 case COMPLEX_TYPE:
1318 if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
1319 {
1320 const bool cst = TREE_CODE (e) == COMPLEX_CST;
1321 pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
1322 pp_separate_with (pp, ',');
1323 pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
1324 }
1325 else
1326 break;
1327 return;
1328
1329 default:
1330 break;
1331 }
1332
1333 pp_unsupported_tree (pp, type);
1334 }
1335
1336 /* Pretty-print a brace-enclosed initializer-list. */
1337
1338 static void
1339 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
1340 {
1341 pp_c_left_brace (pp);
1342 pp_c_initializer_list (pp, l);
1343 pp_c_right_brace (pp);
1344 }
1345
1346
1347 /* This is a convenient function, used to bridge gap between C and C++
1348 grammars.
1349
1350 id-expression:
1351 identifier */
1352
1353 void
1354 pp_c_id_expression (c_pretty_printer *pp, tree t)
1355 {
1356 switch (TREE_CODE (t))
1357 {
1358 case VAR_DECL:
1359 case PARM_DECL:
1360 case CONST_DECL:
1361 case TYPE_DECL:
1362 case FUNCTION_DECL:
1363 case FIELD_DECL:
1364 case LABEL_DECL:
1365 pp_c_tree_decl_identifier (pp, t);
1366 break;
1367
1368 case IDENTIFIER_NODE:
1369 pp_c_tree_identifier (pp, t);
1370 break;
1371
1372 default:
1373 pp_unsupported_tree (pp, t);
1374 break;
1375 }
1376 }
1377
1378 /* postfix-expression:
1379 primary-expression
1380 postfix-expression [ expression ]
1381 postfix-expression ( argument-expression-list(opt) )
1382 postfix-expression . identifier
1383 postfix-expression -> identifier
1384 postfix-expression ++
1385 postfix-expression --
1386 ( type-name ) { initializer-list }
1387 ( type-name ) { initializer-list , } */
1388
1389 void
1390 pp_c_postfix_expression (c_pretty_printer *pp, tree e)
1391 {
1392 enum tree_code code = TREE_CODE (e);
1393 switch (code)
1394 {
1395 case POSTINCREMENT_EXPR:
1396 case POSTDECREMENT_EXPR:
1397 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1398 pp_string (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
1399 break;
1400
1401 case ARRAY_REF:
1402 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1403 pp_c_left_bracket (pp);
1404 pp_expression (pp, TREE_OPERAND (e, 1));
1405 pp_c_right_bracket (pp);
1406 break;
1407
1408 case CALL_EXPR:
1409 {
1410 call_expr_arg_iterator iter;
1411 tree arg;
1412 pp_postfix_expression (pp, CALL_EXPR_FN (e));
1413 pp_c_left_paren (pp);
1414 FOR_EACH_CALL_EXPR_ARG (arg, iter, e)
1415 {
1416 pp_expression (pp, arg);
1417 if (more_call_expr_args_p (&iter))
1418 pp_separate_with (pp, ',');
1419 }
1420 pp_c_right_paren (pp);
1421 break;
1422 }
1423
1424 case UNORDERED_EXPR:
1425 pp_c_ws_string (pp, flag_isoc99
1426 ? "isunordered"
1427 : "__builtin_isunordered");
1428 goto two_args_fun;
1429
1430 case ORDERED_EXPR:
1431 pp_c_ws_string (pp, flag_isoc99
1432 ? "!isunordered"
1433 : "!__builtin_isunordered");
1434 goto two_args_fun;
1435
1436 case UNLT_EXPR:
1437 pp_c_ws_string (pp, flag_isoc99
1438 ? "!isgreaterequal"
1439 : "!__builtin_isgreaterequal");
1440 goto two_args_fun;
1441
1442 case UNLE_EXPR:
1443 pp_c_ws_string (pp, flag_isoc99
1444 ? "!isgreater"
1445 : "!__builtin_isgreater");
1446 goto two_args_fun;
1447
1448 case UNGT_EXPR:
1449 pp_c_ws_string (pp, flag_isoc99
1450 ? "!islessequal"
1451 : "!__builtin_islessequal");
1452 goto two_args_fun;
1453
1454 case UNGE_EXPR:
1455 pp_c_ws_string (pp, flag_isoc99
1456 ? "!isless"
1457 : "!__builtin_isless");
1458 goto two_args_fun;
1459
1460 case UNEQ_EXPR:
1461 pp_c_ws_string (pp, flag_isoc99
1462 ? "!islessgreater"
1463 : "!__builtin_islessgreater");
1464 goto two_args_fun;
1465
1466 case LTGT_EXPR:
1467 pp_c_ws_string (pp, flag_isoc99
1468 ? "islessgreater"
1469 : "__builtin_islessgreater");
1470 goto two_args_fun;
1471
1472 two_args_fun:
1473 pp_c_left_paren (pp);
1474 pp_expression (pp, TREE_OPERAND (e, 0));
1475 pp_separate_with (pp, ',');
1476 pp_expression (pp, TREE_OPERAND (e, 1));
1477 pp_c_right_paren (pp);
1478 break;
1479
1480 case ABS_EXPR:
1481 pp_c_ws_string (pp, "__builtin_abs");
1482 pp_c_left_paren (pp);
1483 pp_expression (pp, TREE_OPERAND (e, 0));
1484 pp_c_right_paren (pp);
1485 break;
1486
1487 case COMPONENT_REF:
1488 {
1489 tree object = TREE_OPERAND (e, 0);
1490 if (TREE_CODE (object) == INDIRECT_REF)
1491 {
1492 pp_postfix_expression (pp, TREE_OPERAND (object, 0));
1493 pp_c_arrow (pp);
1494 }
1495 else
1496 {
1497 pp_postfix_expression (pp, object);
1498 pp_c_dot (pp);
1499 }
1500 pp_expression (pp, TREE_OPERAND (e, 1));
1501 }
1502 break;
1503
1504 case BIT_FIELD_REF:
1505 {
1506 tree type = TREE_TYPE (e);
1507
1508 type = signed_or_unsigned_type_for (TYPE_UNSIGNED (type), type);
1509 if (type
1510 && tree_int_cst_equal (TYPE_SIZE (type), TREE_OPERAND (e, 1)))
1511 {
1512 HOST_WIDE_INT bitpos = tree_low_cst (TREE_OPERAND (e, 2), 0);
1513 HOST_WIDE_INT size = tree_low_cst (TYPE_SIZE (type), 0);
1514 if ((bitpos % size) == 0)
1515 {
1516 pp_c_left_paren (pp);
1517 pp_c_left_paren (pp);
1518 pp_type_id (pp, type);
1519 pp_c_star (pp);
1520 pp_c_right_paren (pp);
1521 pp_c_ampersand (pp);
1522 pp_expression (pp, TREE_OPERAND (e, 0));
1523 pp_c_right_paren (pp);
1524 pp_c_left_bracket (pp);
1525 pp_wide_integer (pp, bitpos / size);
1526 pp_c_right_bracket (pp);
1527 break;
1528 }
1529 }
1530 pp_unsupported_tree (pp, e);
1531 }
1532 break;
1533
1534 case COMPLEX_CST:
1535 case VECTOR_CST:
1536 pp_c_compound_literal (pp, e);
1537 break;
1538
1539 case COMPLEX_EXPR:
1540 pp_c_complex_expr (pp, e);
1541 break;
1542
1543 case COMPOUND_LITERAL_EXPR:
1544 e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
1545 /* Fall through. */
1546 case CONSTRUCTOR:
1547 pp_initializer (pp, e);
1548 break;
1549
1550 case VA_ARG_EXPR:
1551 pp_c_ws_string (pp, "__builtin_va_arg");
1552 pp_c_left_paren (pp);
1553 pp_assignment_expression (pp, TREE_OPERAND (e, 0));
1554 pp_separate_with (pp, ',');
1555 pp_type_id (pp, TREE_TYPE (e));
1556 pp_c_right_paren (pp);
1557 break;
1558
1559 case ADDR_EXPR:
1560 if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
1561 {
1562 pp_c_id_expression (pp, TREE_OPERAND (e, 0));
1563 break;
1564 }
1565 /* else fall through. */
1566
1567 default:
1568 pp_primary_expression (pp, e);
1569 break;
1570 }
1571 }
1572
1573 /* Print out an expression-list; E is expected to be a TREE_LIST. */
1574
1575 void
1576 pp_c_expression_list (c_pretty_printer *pp, tree e)
1577 {
1578 for (; e != NULL_TREE; e = TREE_CHAIN (e))
1579 {
1580 pp_expression (pp, TREE_VALUE (e));
1581 if (TREE_CHAIN (e))
1582 pp_separate_with (pp, ',');
1583 }
1584 }
1585
1586 /* Print out V, which contains the elements of a constructor. */
1587
1588 void
1589 pp_c_constructor_elts (c_pretty_printer *pp, VEC(constructor_elt,gc) *v)
1590 {
1591 unsigned HOST_WIDE_INT ix;
1592 tree value;
1593
1594 FOR_EACH_CONSTRUCTOR_VALUE (v, ix, value)
1595 {
1596 pp_expression (pp, value);
1597 if (ix != VEC_length (constructor_elt, v) - 1)
1598 pp_separate_with (pp, ',');
1599 }
1600 }
1601
1602 /* Print out an expression-list in parens, as if it were the argument
1603 list to a function. */
1604
1605 void
1606 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
1607 {
1608 pp_c_left_paren (pp);
1609 if (t && TREE_CODE (t) == TREE_LIST)
1610 pp_c_expression_list (pp, t);
1611 pp_c_right_paren (pp);
1612 }
1613
1614 /* unary-expression:
1615 postfix-expression
1616 ++ cast-expression
1617 -- cast-expression
1618 unary-operator cast-expression
1619 sizeof unary-expression
1620 sizeof ( type-id )
1621
1622 unary-operator: one of
1623 * & + - ! ~
1624
1625 GNU extensions.
1626 unary-expression:
1627 __alignof__ unary-expression
1628 __alignof__ ( type-id )
1629 __real__ unary-expression
1630 __imag__ unary-expression */
1631
1632 void
1633 pp_c_unary_expression (c_pretty_printer *pp, tree e)
1634 {
1635 enum tree_code code = TREE_CODE (e);
1636 switch (code)
1637 {
1638 case PREINCREMENT_EXPR:
1639 case PREDECREMENT_EXPR:
1640 pp_string (pp, code == PREINCREMENT_EXPR ? "++" : "--");
1641 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1642 break;
1643
1644 case ADDR_EXPR:
1645 case INDIRECT_REF:
1646 case NEGATE_EXPR:
1647 case BIT_NOT_EXPR:
1648 case TRUTH_NOT_EXPR:
1649 case CONJ_EXPR:
1650 /* String literal are used by address. */
1651 if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
1652 pp_ampersand (pp);
1653 else if (code == INDIRECT_REF)
1654 pp_c_star (pp);
1655 else if (code == NEGATE_EXPR)
1656 pp_minus (pp);
1657 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
1658 pp_complement (pp);
1659 else if (code == TRUTH_NOT_EXPR)
1660 pp_exclamation (pp);
1661 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1662 break;
1663
1664 case REALPART_EXPR:
1665 case IMAGPART_EXPR:
1666 pp_c_ws_string (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
1667 pp_c_whitespace (pp);
1668 pp_unary_expression (pp, TREE_OPERAND (e, 0));
1669 break;
1670
1671 default:
1672 pp_postfix_expression (pp, e);
1673 break;
1674 }
1675 }
1676
1677 /* cast-expression:
1678 unary-expression
1679 ( type-name ) cast-expression */
1680
1681 void
1682 pp_c_cast_expression (c_pretty_printer *pp, tree e)
1683 {
1684 switch (TREE_CODE (e))
1685 {
1686 case FLOAT_EXPR:
1687 case FIX_TRUNC_EXPR:
1688 CASE_CONVERT:
1689 case VIEW_CONVERT_EXPR:
1690 pp_c_type_cast (pp, TREE_TYPE (e));
1691 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1692 break;
1693
1694 default:
1695 pp_unary_expression (pp, e);
1696 }
1697 }
1698
1699 /* multiplicative-expression:
1700 cast-expression
1701 multiplicative-expression * cast-expression
1702 multiplicative-expression / cast-expression
1703 multiplicative-expression % cast-expression */
1704
1705 static void
1706 pp_c_multiplicative_expression (c_pretty_printer *pp, tree e)
1707 {
1708 enum tree_code code = TREE_CODE (e);
1709 switch (code)
1710 {
1711 case MULT_EXPR:
1712 case TRUNC_DIV_EXPR:
1713 case TRUNC_MOD_EXPR:
1714 pp_multiplicative_expression (pp, TREE_OPERAND (e, 0));
1715 pp_c_whitespace (pp);
1716 if (code == MULT_EXPR)
1717 pp_c_star (pp);
1718 else if (code == TRUNC_DIV_EXPR)
1719 pp_slash (pp);
1720 else
1721 pp_modulo (pp);
1722 pp_c_whitespace (pp);
1723 pp_c_cast_expression (pp, TREE_OPERAND (e, 1));
1724 break;
1725
1726 default:
1727 pp_c_cast_expression (pp, e);
1728 break;
1729 }
1730 }
1731
1732 /* additive-expression:
1733 multiplicative-expression
1734 additive-expression + multiplicative-expression
1735 additive-expression - multiplicative-expression */
1736
1737 static void
1738 pp_c_additive_expression (c_pretty_printer *pp, tree e)
1739 {
1740 enum tree_code code = TREE_CODE (e);
1741 switch (code)
1742 {
1743 case POINTER_PLUS_EXPR:
1744 case PLUS_EXPR:
1745 case MINUS_EXPR:
1746 pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
1747 pp_c_whitespace (pp);
1748 if (code == PLUS_EXPR || code == POINTER_PLUS_EXPR)
1749 pp_plus (pp);
1750 else
1751 pp_minus (pp);
1752 pp_c_whitespace (pp);
1753 pp_multiplicative_expression (pp, TREE_OPERAND (e, 1));
1754 break;
1755
1756 default:
1757 pp_multiplicative_expression (pp, e);
1758 break;
1759 }
1760 }
1761
1762 /* additive-expression:
1763 additive-expression
1764 shift-expression << additive-expression
1765 shift-expression >> additive-expression */
1766
1767 static void
1768 pp_c_shift_expression (c_pretty_printer *pp, tree e)
1769 {
1770 enum tree_code code = TREE_CODE (e);
1771 switch (code)
1772 {
1773 case LSHIFT_EXPR:
1774 case RSHIFT_EXPR:
1775 pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
1776 pp_c_whitespace (pp);
1777 pp_string (pp, code == LSHIFT_EXPR ? "<<" : ">>");
1778 pp_c_whitespace (pp);
1779 pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
1780 break;
1781
1782 default:
1783 pp_c_additive_expression (pp, e);
1784 }
1785 }
1786
1787 /* relational-expression:
1788 shift-expression
1789 relational-expression < shift-expression
1790 relational-expression > shift-expression
1791 relational-expression <= shift-expression
1792 relational-expression >= shift-expression */
1793
1794 static void
1795 pp_c_relational_expression (c_pretty_printer *pp, tree e)
1796 {
1797 enum tree_code code = TREE_CODE (e);
1798 switch (code)
1799 {
1800 case LT_EXPR:
1801 case GT_EXPR:
1802 case LE_EXPR:
1803 case GE_EXPR:
1804 pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
1805 pp_c_whitespace (pp);
1806 if (code == LT_EXPR)
1807 pp_less (pp);
1808 else if (code == GT_EXPR)
1809 pp_greater (pp);
1810 else if (code == LE_EXPR)
1811 pp_string (pp, "<=");
1812 else if (code == GE_EXPR)
1813 pp_string (pp, ">=");
1814 pp_c_whitespace (pp);
1815 pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
1816 break;
1817
1818 default:
1819 pp_c_shift_expression (pp, e);
1820 break;
1821 }
1822 }
1823
1824 /* equality-expression:
1825 relational-expression
1826 equality-expression == relational-expression
1827 equality-equality != relational-expression */
1828
1829 static void
1830 pp_c_equality_expression (c_pretty_printer *pp, tree e)
1831 {
1832 enum tree_code code = TREE_CODE (e);
1833 switch (code)
1834 {
1835 case EQ_EXPR:
1836 case NE_EXPR:
1837 pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
1838 pp_c_whitespace (pp);
1839 pp_string (pp, code == EQ_EXPR ? "==" : "!=");
1840 pp_c_whitespace (pp);
1841 pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
1842 break;
1843
1844 default:
1845 pp_c_relational_expression (pp, e);
1846 break;
1847 }
1848 }
1849
1850 /* AND-expression:
1851 equality-expression
1852 AND-expression & equality-equality */
1853
1854 static void
1855 pp_c_and_expression (c_pretty_printer *pp, tree e)
1856 {
1857 if (TREE_CODE (e) == BIT_AND_EXPR)
1858 {
1859 pp_c_and_expression (pp, TREE_OPERAND (e, 0));
1860 pp_c_whitespace (pp);
1861 pp_ampersand (pp);
1862 pp_c_whitespace (pp);
1863 pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
1864 }
1865 else
1866 pp_c_equality_expression (pp, e);
1867 }
1868
1869 /* exclusive-OR-expression:
1870 AND-expression
1871 exclusive-OR-expression ^ AND-expression */
1872
1873 static void
1874 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
1875 {
1876 if (TREE_CODE (e) == BIT_XOR_EXPR
1877 || TREE_CODE (e) == TRUTH_XOR_EXPR)
1878 {
1879 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1880 if (TREE_CODE (e) == BIT_XOR_EXPR)
1881 pp_c_maybe_whitespace (pp);
1882 else
1883 pp_c_whitespace (pp);
1884 pp_carret (pp);
1885 pp_c_whitespace (pp);
1886 pp_c_and_expression (pp, TREE_OPERAND (e, 1));
1887 }
1888 else
1889 pp_c_and_expression (pp, e);
1890 }
1891
1892 /* inclusive-OR-expression:
1893 exclusive-OR-expression
1894 inclusive-OR-expression | exclusive-OR-expression */
1895
1896 static void
1897 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
1898 {
1899 if (TREE_CODE (e) == BIT_IOR_EXPR)
1900 {
1901 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1902 pp_c_whitespace (pp);
1903 pp_bar (pp);
1904 pp_c_whitespace (pp);
1905 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
1906 }
1907 else
1908 pp_c_exclusive_or_expression (pp, e);
1909 }
1910
1911 /* logical-AND-expression:
1912 inclusive-OR-expression
1913 logical-AND-expression && inclusive-OR-expression */
1914
1915 static void
1916 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
1917 {
1918 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR
1919 || TREE_CODE (e) == TRUTH_AND_EXPR)
1920 {
1921 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
1922 pp_c_whitespace (pp);
1923 pp_string (pp, "&&");
1924 pp_c_whitespace (pp);
1925 pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
1926 }
1927 else
1928 pp_c_inclusive_or_expression (pp, e);
1929 }
1930
1931 /* logical-OR-expression:
1932 logical-AND-expression
1933 logical-OR-expression || logical-AND-expression */
1934
1935 void
1936 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
1937 {
1938 if (TREE_CODE (e) == TRUTH_ORIF_EXPR
1939 || TREE_CODE (e) == TRUTH_OR_EXPR)
1940 {
1941 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1942 pp_c_whitespace (pp);
1943 pp_string (pp, "||");
1944 pp_c_whitespace (pp);
1945 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
1946 }
1947 else
1948 pp_c_logical_and_expression (pp, e);
1949 }
1950
1951 /* conditional-expression:
1952 logical-OR-expression
1953 logical-OR-expression ? expression : conditional-expression */
1954
1955 static void
1956 pp_c_conditional_expression (c_pretty_printer *pp, tree e)
1957 {
1958 if (TREE_CODE (e) == COND_EXPR)
1959 {
1960 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1961 pp_c_whitespace (pp);
1962 pp_question (pp);
1963 pp_c_whitespace (pp);
1964 pp_expression (pp, TREE_OPERAND (e, 1));
1965 pp_c_whitespace (pp);
1966 pp_colon (pp);
1967 pp_c_whitespace (pp);
1968 pp_c_conditional_expression (pp, TREE_OPERAND (e, 2));
1969 }
1970 else
1971 pp_c_logical_or_expression (pp, e);
1972 }
1973
1974
1975 /* assignment-expression:
1976 conditional-expression
1977 unary-expression assignment-operator assignment-expression
1978
1979 assignment-expression: one of
1980 = *= /= %= += -= >>= <<= &= ^= |= */
1981
1982 static void
1983 pp_c_assignment_expression (c_pretty_printer *pp, tree e)
1984 {
1985 if (TREE_CODE (e) == MODIFY_EXPR
1986 || TREE_CODE (e) == INIT_EXPR)
1987 {
1988 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1989 pp_c_whitespace (pp);
1990 pp_equal (pp);
1991 pp_space (pp);
1992 pp_c_expression (pp, TREE_OPERAND (e, 1));
1993 }
1994 else
1995 pp_c_conditional_expression (pp, e);
1996 }
1997
1998 /* expression:
1999 assignment-expression
2000 expression , assignment-expression
2001
2002 Implementation note: instead of going through the usual recursion
2003 chain, I take the liberty of dispatching nodes to the appropriate
2004 functions. This makes some redundancy, but it worths it. That also
2005 prevents a possible infinite recursion between pp_c_primary_expression ()
2006 and pp_c_expression (). */
2007
2008 void
2009 pp_c_expression (c_pretty_printer *pp, tree e)
2010 {
2011 switch (TREE_CODE (e))
2012 {
2013 case INTEGER_CST:
2014 pp_c_integer_constant (pp, e);
2015 break;
2016
2017 case REAL_CST:
2018 pp_c_floating_constant (pp, e);
2019 break;
2020
2021 case FIXED_CST:
2022 pp_c_fixed_constant (pp, e);
2023 break;
2024
2025 case STRING_CST:
2026 pp_c_string_literal (pp, e);
2027 break;
2028
2029 case IDENTIFIER_NODE:
2030 case FUNCTION_DECL:
2031 case VAR_DECL:
2032 case CONST_DECL:
2033 case PARM_DECL:
2034 case RESULT_DECL:
2035 case FIELD_DECL:
2036 case LABEL_DECL:
2037 case ERROR_MARK:
2038 pp_primary_expression (pp, e);
2039 break;
2040
2041 case POSTINCREMENT_EXPR:
2042 case POSTDECREMENT_EXPR:
2043 case ARRAY_REF:
2044 case CALL_EXPR:
2045 case COMPONENT_REF:
2046 case BIT_FIELD_REF:
2047 case COMPLEX_CST:
2048 case COMPLEX_EXPR:
2049 case VECTOR_CST:
2050 case ORDERED_EXPR:
2051 case UNORDERED_EXPR:
2052 case LTGT_EXPR:
2053 case UNEQ_EXPR:
2054 case UNLE_EXPR:
2055 case UNLT_EXPR:
2056 case UNGE_EXPR:
2057 case UNGT_EXPR:
2058 case ABS_EXPR:
2059 case CONSTRUCTOR:
2060 case COMPOUND_LITERAL_EXPR:
2061 case VA_ARG_EXPR:
2062 pp_postfix_expression (pp, e);
2063 break;
2064
2065 case CONJ_EXPR:
2066 case ADDR_EXPR:
2067 case INDIRECT_REF:
2068 case NEGATE_EXPR:
2069 case BIT_NOT_EXPR:
2070 case TRUTH_NOT_EXPR:
2071 case PREINCREMENT_EXPR:
2072 case PREDECREMENT_EXPR:
2073 case REALPART_EXPR:
2074 case IMAGPART_EXPR:
2075 pp_c_unary_expression (pp, e);
2076 break;
2077
2078 case FLOAT_EXPR:
2079 case FIX_TRUNC_EXPR:
2080 CASE_CONVERT:
2081 case VIEW_CONVERT_EXPR:
2082 pp_c_cast_expression (pp, e);
2083 break;
2084
2085 case MULT_EXPR:
2086 case TRUNC_MOD_EXPR:
2087 case TRUNC_DIV_EXPR:
2088 pp_multiplicative_expression (pp, e);
2089 break;
2090
2091 case LSHIFT_EXPR:
2092 case RSHIFT_EXPR:
2093 pp_c_shift_expression (pp, e);
2094 break;
2095
2096 case LT_EXPR:
2097 case GT_EXPR:
2098 case LE_EXPR:
2099 case GE_EXPR:
2100 pp_c_relational_expression (pp, e);
2101 break;
2102
2103 case BIT_AND_EXPR:
2104 pp_c_and_expression (pp, e);
2105 break;
2106
2107 case BIT_XOR_EXPR:
2108 case TRUTH_XOR_EXPR:
2109 pp_c_exclusive_or_expression (pp, e);
2110 break;
2111
2112 case BIT_IOR_EXPR:
2113 pp_c_inclusive_or_expression (pp, e);
2114 break;
2115
2116 case TRUTH_ANDIF_EXPR:
2117 case TRUTH_AND_EXPR:
2118 pp_c_logical_and_expression (pp, e);
2119 break;
2120
2121 case TRUTH_ORIF_EXPR:
2122 case TRUTH_OR_EXPR:
2123 pp_c_logical_or_expression (pp, e);
2124 break;
2125
2126 case EQ_EXPR:
2127 case NE_EXPR:
2128 pp_c_equality_expression (pp, e);
2129 break;
2130
2131 case COND_EXPR:
2132 pp_conditional_expression (pp, e);
2133 break;
2134
2135 case POINTER_PLUS_EXPR:
2136 case PLUS_EXPR:
2137 case MINUS_EXPR:
2138 pp_c_additive_expression (pp, e);
2139 break;
2140
2141 case MODIFY_EXPR:
2142 case INIT_EXPR:
2143 pp_assignment_expression (pp, e);
2144 break;
2145
2146 case COMPOUND_EXPR:
2147 pp_c_left_paren (pp);
2148 pp_expression (pp, TREE_OPERAND (e, 0));
2149 pp_separate_with (pp, ',');
2150 pp_assignment_expression (pp, TREE_OPERAND (e, 1));
2151 pp_c_right_paren (pp);
2152 break;
2153
2154 case NON_LVALUE_EXPR:
2155 case SAVE_EXPR:
2156 pp_expression (pp, TREE_OPERAND (e, 0));
2157 break;
2158
2159 case TARGET_EXPR:
2160 pp_postfix_expression (pp, TREE_OPERAND (e, 1));
2161 break;
2162
2163 case BIND_EXPR:
2164 case GOTO_EXPR:
2165 /* We don't yet have a way of dumping statements in a
2166 human-readable format. */
2167 pp_string (pp, "({...})");
2168 break;
2169
2170 default:
2171 pp_unsupported_tree (pp, e);
2172 break;
2173 }
2174 }
2175
2176
2177 \f
2178 /* Statements. */
2179
2180 void
2181 pp_c_statement (c_pretty_printer *pp, tree stmt)
2182 {
2183 if (stmt == NULL)
2184 return;
2185
2186 if (pp_needs_newline (pp))
2187 pp_newline_and_indent (pp, 0);
2188
2189 dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
2190 }
2191
2192 \f
2193 /* Initialize the PRETTY-PRINTER for handling C codes. */
2194
2195 void
2196 pp_c_pretty_printer_init (c_pretty_printer *pp)
2197 {
2198 pp->offset_list = 0;
2199
2200 pp->declaration = pp_c_declaration;
2201 pp->declaration_specifiers = pp_c_declaration_specifiers;
2202 pp->declarator = pp_c_declarator;
2203 pp->direct_declarator = pp_c_direct_declarator;
2204 pp->type_specifier_seq = pp_c_specifier_qualifier_list;
2205 pp->abstract_declarator = pp_c_abstract_declarator;
2206 pp->direct_abstract_declarator = pp_c_direct_abstract_declarator;
2207 pp->ptr_operator = pp_c_pointer;
2208 pp->parameter_list = pp_c_parameter_type_list;
2209 pp->type_id = pp_c_type_id;
2210 pp->simple_type_specifier = pp_c_type_specifier;
2211 pp->function_specifier = pp_c_function_specifier;
2212 pp->storage_class_specifier = pp_c_storage_class_specifier;
2213
2214 pp->statement = pp_c_statement;
2215
2216 pp->constant = pp_c_constant;
2217 pp->id_expression = pp_c_id_expression;
2218 pp->primary_expression = pp_c_primary_expression;
2219 pp->postfix_expression = pp_c_postfix_expression;
2220 pp->unary_expression = pp_c_unary_expression;
2221 pp->initializer = pp_c_initializer;
2222 pp->multiplicative_expression = pp_c_multiplicative_expression;
2223 pp->conditional_expression = pp_c_conditional_expression;
2224 pp->assignment_expression = pp_c_assignment_expression;
2225 pp->expression = pp_c_expression;
2226 }
2227
2228
2229 /* Print the tree T in full, on file FILE. */
2230
2231 void
2232 print_c_tree (FILE *file, tree t)
2233 {
2234 static c_pretty_printer pp_rec;
2235 static bool initialized = 0;
2236 c_pretty_printer *pp = &pp_rec;
2237
2238 if (!initialized)
2239 {
2240 initialized = 1;
2241 pp_construct (pp_base (pp), NULL, 0);
2242 pp_c_pretty_printer_init (pp);
2243 pp_needs_newline (pp) = true;
2244 }
2245 pp_base (pp)->buffer->stream = file;
2246
2247 pp_statement (pp, t);
2248
2249 pp_newline (pp);
2250 pp_flush (pp);
2251 }
2252
2253 /* Print the tree T in full, on stderr. */
2254
2255 DEBUG_FUNCTION void
2256 debug_c_tree (tree t)
2257 {
2258 print_c_tree (stderr, t);
2259 fputc ('\n', stderr);
2260 }
2261
2262 /* Output the DECL_NAME of T. If T has no DECL_NAME, output a string made
2263 up of T's memory address. */
2264
2265 void
2266 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
2267 {
2268 const char *name;
2269
2270 gcc_assert (DECL_P (t));
2271
2272 if (DECL_NAME (t))
2273 name = IDENTIFIER_POINTER (DECL_NAME (t));
2274 else
2275 {
2276 static char xname[8];
2277 sprintf (xname, "<U%4x>", ((unsigned)((uintptr_t)(t) & 0xffff)));
2278 name = xname;
2279 }
2280
2281 pp_c_identifier (pp, name);
2282 }