OSDN Git Service

* gcc/config/elfos.h (MAKE_DECL_ONE_ONLY): Redefined to stop DECL_WEAK
[pf3gnuchains/gcc-fork.git] / gcc / c-pretty-print.c
1 /* Subroutines common to both C and C++ pretty-printers.
2    Copyright (C) 2002, 2003, 2004, 2005 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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, 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 CHAR_TYPE:
315     case INTEGER_TYPE:
316     case REAL_TYPE:
317       if (TYPE_NAME (t))
318         t = TYPE_NAME (t);
319       else
320         t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
321       pp_c_type_specifier (pp, t);
322       break;
323
324     case TYPE_DECL:
325       if (DECL_NAME (t))
326         pp_id_expression (pp, t);
327       else
328         pp_c_identifier (pp, "<typedef-error>");
329       break;
330
331     case UNION_TYPE:
332     case RECORD_TYPE:
333     case ENUMERAL_TYPE:
334       if (code == UNION_TYPE)
335         pp_c_identifier (pp, "union");
336       else if (code == RECORD_TYPE)
337         pp_c_identifier (pp, "struct");
338       else if (code == ENUMERAL_TYPE)
339         pp_c_identifier (pp, "enum");
340       else
341         pp_c_identifier (pp, "<tag-error>");
342
343       if (TYPE_NAME (t))
344         pp_id_expression (pp, TYPE_NAME (t));
345       else
346         pp_c_identifier (pp, "<anonymous>");
347       break;
348
349     default:
350       pp_unsupported_tree (pp, t);
351       break;
352     }
353 }
354
355 /* specifier-qualifier-list:
356       type-specifier specifier-qualifier-list-opt
357       type-qualifier specifier-qualifier-list-opt
358
359
360   Implementation note:  Because of the non-linearities in array or
361   function declarations, this routine prints not just the
362   specifier-qualifier-list of such entities or types of such entities,
363   but also the 'pointer' production part of their declarators.  The
364   remaining part is done by pp_declarator or pp_c_abstract_declarator.  */
365
366 void
367 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
368 {
369   const enum tree_code code = TREE_CODE (t);
370
371   if (TREE_CODE (t) != POINTER_TYPE)
372     pp_c_type_qualifier_list (pp, t);
373   switch (code)
374     {
375     case REFERENCE_TYPE:
376     case POINTER_TYPE:
377       {
378         /* Get the types-specifier of this type.  */
379         tree pointee = strip_pointer_operator (TREE_TYPE (t));
380         pp_c_specifier_qualifier_list (pp, pointee);
381         if (TREE_CODE (pointee) == ARRAY_TYPE
382             || TREE_CODE (pointee) == FUNCTION_TYPE)
383           {
384             pp_c_whitespace (pp);
385             pp_c_left_paren (pp);
386           }
387         else if (!c_dialect_cxx ())
388           pp_c_whitespace (pp);
389         pp_ptr_operator (pp, t);
390       }
391       break;
392
393     case FUNCTION_TYPE:
394     case ARRAY_TYPE:
395       pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
396       break;
397
398     case VECTOR_TYPE:
399     case COMPLEX_TYPE:
400       pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
401       if (code == COMPLEX_TYPE)
402         pp_c_identifier (pp, flag_isoc99 ? "_Complex" : "__complex__");
403       else if (code == VECTOR_TYPE)
404         pp_c_identifier (pp, "__vector__");
405       break;
406
407     default:
408       pp_simple_type_specifier (pp, t);
409       break;
410     }
411 }
412
413 /* parameter-type-list:
414       parameter-list
415       parameter-list , ...
416
417    parameter-list:
418       parameter-declaration
419       parameter-list , parameter-declaration
420
421    parameter-declaration:
422       declaration-specifiers declarator
423       declaration-specifiers abstract-declarator(opt)   */
424
425 void
426 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
427 {
428   bool want_parm_decl = DECL_P (t) && !(pp->flags & pp_c_flag_abstract);
429   tree parms = want_parm_decl ? DECL_ARGUMENTS (t) :  TYPE_ARG_TYPES (t);
430   pp_c_left_paren (pp);
431   if (parms == void_list_node)
432     pp_c_identifier (pp, "void");
433   else
434     {
435       bool first = true;
436       for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
437         {
438           if (!first)
439             pp_separate_with (pp, ',');
440           first = false;
441           pp_declaration_specifiers
442             (pp, want_parm_decl ? parms : TREE_VALUE (parms));
443           if (want_parm_decl)
444             pp_declarator (pp, parms);
445           else
446             pp_abstract_declarator (pp, TREE_VALUE (parms));
447         }
448     }
449   pp_c_right_paren (pp);
450 }
451
452 /* abstract-declarator:
453       pointer
454       pointer(opt) direct-abstract-declarator  */
455
456 static void
457 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
458 {
459   if (TREE_CODE (t) == POINTER_TYPE)
460     {
461       if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
462           || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
463         pp_c_right_paren (pp);
464       t = TREE_TYPE (t);
465     }
466
467   pp_direct_abstract_declarator (pp, t);
468 }
469
470 /* direct-abstract-declarator:
471       ( abstract-declarator )
472       direct-abstract-declarator(opt) [ assignment-expression(opt) ]
473       direct-abstract-declarator(opt) [ * ]
474       direct-abstract-declarator(opt) ( parameter-type-list(opt) )  */
475
476 void
477 pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
478 {
479   switch (TREE_CODE (t))
480     {
481     case POINTER_TYPE:
482       pp_abstract_declarator (pp, t);
483       break;
484
485     case FUNCTION_TYPE:
486       pp_c_parameter_type_list (pp, t);
487       pp_direct_abstract_declarator (pp, TREE_TYPE (t));
488       break;
489
490     case ARRAY_TYPE:
491       pp_c_left_bracket (pp);
492       if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
493         pp_expression (pp, TYPE_MAX_VALUE (TYPE_DOMAIN (t)));
494       pp_c_right_bracket (pp);
495       pp_direct_abstract_declarator (pp, TREE_TYPE (t));
496       break;
497
498     case IDENTIFIER_NODE:
499     case VOID_TYPE:
500     case BOOLEAN_TYPE:
501     case INTEGER_TYPE:
502     case REAL_TYPE:
503     case ENUMERAL_TYPE:
504     case RECORD_TYPE:
505     case UNION_TYPE:
506     case VECTOR_TYPE:
507     case COMPLEX_TYPE:
508     case TYPE_DECL:
509       break;
510
511     default:
512       pp_unsupported_tree (pp, t);
513       break;
514     }
515 }
516
517 /* type-name:
518       specifier-qualifier-list  abstract-declarator(opt)  */
519
520 void
521 pp_c_type_id (c_pretty_printer *pp, tree t)
522 {
523   pp_c_specifier_qualifier_list (pp, t);
524   pp_abstract_declarator (pp, t);
525 }
526
527 /* storage-class-specifier:
528       typedef
529       extern
530       static
531       auto
532       register  */
533
534 void
535 pp_c_storage_class_specifier (c_pretty_printer *pp, tree t)
536 {
537   if (TREE_CODE (t) == TYPE_DECL)
538     pp_c_identifier (pp, "typedef");
539   else if (DECL_P (t))
540     {
541       if (DECL_REGISTER (t))
542         pp_c_identifier (pp, "register");
543       else if (TREE_STATIC (t) && TREE_CODE (t) == VAR_DECL)
544         pp_c_identifier (pp, "static");
545     }
546 }
547
548 /* function-specifier:
549       inline   */
550
551 void
552 pp_c_function_specifier (c_pretty_printer *pp, tree t)
553 {
554   if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
555     pp_c_identifier (pp, "inline");
556 }
557
558 /* declaration-specifiers:
559       storage-class-specifier declaration-specifiers(opt)
560       type-specifier declaration-specifiers(opt)
561       type-qualifier declaration-specifiers(opt)
562       function-specifier declaration-specifiers(opt)  */
563
564 void
565 pp_c_declaration_specifiers (c_pretty_printer *pp, tree t)
566 {
567   pp_storage_class_specifier (pp, t);
568   pp_function_specifier (pp, t);
569   pp_c_specifier_qualifier_list (pp, DECL_P (t) ?  TREE_TYPE (t) : t);
570 }
571
572 /* direct-declarator
573       identifier
574       ( declarator )
575       direct-declarator [ type-qualifier-list(opt) assignment-expression(opt) ]
576       direct-declarator [ static type-qualifier-list(opt) assignment-expression(opt)]
577       direct-declarator [ type-qualifier-list static assignment-expression ]
578       direct-declarator [ type-qualifier-list * ]
579       direct-declarator ( parameter-type-list )
580       direct-declarator ( identifier-list(opt) )  */
581
582 void
583 pp_c_direct_declarator (c_pretty_printer *pp, tree t)
584 {
585   switch (TREE_CODE (t))
586     {
587     case VAR_DECL:
588     case PARM_DECL:
589     case TYPE_DECL:
590     case FIELD_DECL:
591     case LABEL_DECL:
592       pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
593       pp_c_tree_decl_identifier (pp, t);
594       break;
595
596     case ARRAY_TYPE:
597     case POINTER_TYPE:
598       pp_abstract_declarator (pp, TREE_TYPE (t));
599       break;
600
601     case FUNCTION_TYPE:
602       pp_parameter_list (pp, t);
603       pp_abstract_declarator (pp, TREE_TYPE (t));
604       break;
605
606     case FUNCTION_DECL:
607       pp_c_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
608       pp_c_tree_decl_identifier (pp, t);
609       if (pp_c_base (pp)->flags & pp_c_flag_abstract)
610         pp_abstract_declarator (pp, TREE_TYPE (t));
611       else
612         {
613           pp_parameter_list (pp, t);
614           pp_abstract_declarator (pp, TREE_TYPE (TREE_TYPE (t)));
615         }
616       break;
617
618     case INTEGER_TYPE:
619     case REAL_TYPE:
620     case ENUMERAL_TYPE:
621     case UNION_TYPE:
622     case RECORD_TYPE:
623       break;
624
625     default:
626       pp_unsupported_tree (pp, t);
627       break;
628     }
629 }
630
631
632 /* declarator:
633       pointer(opt)  direct-declarator   */
634
635 void
636 pp_c_declarator (c_pretty_printer *pp, tree t)
637 {
638   switch (TREE_CODE (t))
639     {
640     case INTEGER_TYPE:
641     case REAL_TYPE:
642     case ENUMERAL_TYPE:
643     case UNION_TYPE:
644     case RECORD_TYPE:
645       break;
646
647     case VAR_DECL:
648     case PARM_DECL:
649     case FIELD_DECL:
650     case ARRAY_TYPE:
651     case FUNCTION_TYPE:
652     case FUNCTION_DECL:
653     case TYPE_DECL:
654       pp_direct_declarator (pp, t);
655     break;
656
657
658     default:
659       pp_unsupported_tree (pp, t);
660       break;
661     }
662 }
663
664 /* declaration:
665       declaration-specifiers init-declarator-list(opt) ;  */
666
667 void
668 pp_c_declaration (c_pretty_printer *pp, tree t)
669 {
670   pp_declaration_specifiers (pp, t);
671   pp_c_init_declarator (pp, t);
672 }
673
674 /* Pretty-print ATTRIBUTES using GNU C extension syntax.  */
675
676 void
677 pp_c_attributes (c_pretty_printer *pp, tree attributes)
678 {
679   if (attributes == NULL_TREE)
680     return;
681
682   pp_c_identifier (pp, "__attribute__");
683   pp_c_left_paren (pp);
684   pp_c_left_paren (pp);
685   for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
686     {
687       pp_tree_identifier (pp, TREE_PURPOSE (attributes));
688       if (TREE_VALUE (attributes))
689         pp_c_call_argument_list (pp, TREE_VALUE (attributes));
690
691       if (TREE_CHAIN (attributes))
692         pp_separate_with (pp, ',');
693     }
694   pp_c_right_paren (pp);
695   pp_c_right_paren (pp);
696 }
697
698 /* function-definition:
699       declaration-specifiers declarator compound-statement  */
700
701 void
702 pp_c_function_definition (c_pretty_printer *pp, tree t)
703 {
704   pp_declaration_specifiers (pp, t);
705   pp_declarator (pp, t);
706   pp_needs_newline (pp) = true;
707   pp_statement (pp, DECL_SAVED_TREE (t));
708   pp_newline (pp);
709   pp_flush (pp);
710 }
711
712 \f
713 /* Expressions.  */
714
715 /* Print out a c-char.  This is called solely for characters which are
716    in the *target* execution character set.  We ought to convert them
717    back to the *host* execution character set before printing, but we
718    have no way to do this at present.  A decent compromise is to print
719    all characters as if they were in the host execution character set,
720    and not attempt to recover any named escape characters, but render
721    all unprintables as octal escapes.  If the host and target character
722    sets are the same, this produces relatively readable output.  If they
723    are not the same, strings may appear as gibberish, but that's okay
724    (in fact, it may well be what the reader wants, e.g. if they are looking
725    to see if conversion to the target character set happened correctly).
726
727    A special case: we need to prefix \, ", and ' with backslashes.  It is
728    correct to do so for the *host*'s \, ", and ', because the rest of the
729    file appears in the host character set.  */
730
731 static void
732 pp_c_char (c_pretty_printer *pp, int c)
733 {
734   if (ISPRINT (c))
735     {
736       switch (c)
737         {
738         case '\\': pp_string (pp, "\\\\"); break;
739         case '\'': pp_string (pp, "\\\'"); break;
740         case '\"': pp_string (pp, "\\\""); break;
741         default:   pp_character (pp, c);
742         }
743     }
744   else
745     pp_scalar (pp, "\\%03o", (unsigned) c);
746 }
747
748 /* Print out a STRING literal.  */
749
750 void
751 pp_c_string_literal (c_pretty_printer *pp, tree s)
752 {
753   const char *p = TREE_STRING_POINTER (s);
754   int n = TREE_STRING_LENGTH (s) - 1;
755   int i;
756   pp_doublequote (pp);
757   for (i = 0; i < n; ++i)
758     pp_c_char (pp, p[i]);
759   pp_doublequote (pp);
760 }
761
762 /* Pretty-print an INTEGER literal.  */
763
764 static void
765 pp_c_integer_constant (c_pretty_printer *pp, tree i)
766 {
767   tree type = TREE_TYPE (i);
768
769   if (TREE_INT_CST_HIGH (i) == 0)
770     pp_wide_integer (pp, TREE_INT_CST_LOW (i));
771   else
772     {
773       if (tree_int_cst_sgn (i) < 0)
774         {
775           pp_character (pp, '-');
776           i = build_int_cst_wide (NULL_TREE,
777                                   -TREE_INT_CST_LOW (i),
778                                   ~TREE_INT_CST_HIGH (i)
779                                   + !TREE_INT_CST_LOW (i));
780         }
781       sprintf (pp_buffer (pp)->digit_buffer,
782                HOST_WIDE_INT_PRINT_DOUBLE_HEX,
783                TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
784       pp_string (pp, pp_buffer (pp)->digit_buffer);
785     }
786   if (TYPE_UNSIGNED (type))
787     pp_character (pp, 'u');
788   if (type == long_integer_type_node || type == long_unsigned_type_node)
789     pp_character (pp, 'l');
790   else if (type == long_long_integer_type_node
791            || type == long_long_unsigned_type_node)
792     pp_string (pp, "ll");
793 }
794
795 /* Print out a CHARACTER literal.  */
796
797 static void
798 pp_c_character_constant (c_pretty_printer *pp, tree c)
799 {
800   tree type = TREE_TYPE (c);
801   if (type == wchar_type_node)
802     pp_character (pp, 'L');
803   pp_quote (pp);
804   if (host_integerp (c, TYPE_UNSIGNED (type)))
805     pp_c_char (pp, tree_low_cst (c, TYPE_UNSIGNED (type)));
806   else
807     pp_scalar (pp, "\\x%x", (unsigned) TREE_INT_CST_LOW (c));
808   pp_quote (pp);
809 }
810
811 /* Print out a BOOLEAN literal.  */
812
813 static void
814 pp_c_bool_constant (c_pretty_printer *pp, tree b)
815 {
816   if (b == boolean_false_node)
817     {
818       if (c_dialect_cxx ())
819         pp_c_identifier (pp, "false");
820       else if (flag_isoc99)
821         pp_c_identifier (pp, "_False");
822       else
823         pp_unsupported_tree (pp, b);
824     }
825   else if (b == boolean_true_node)
826     {
827       if (c_dialect_cxx ())
828         pp_c_identifier (pp, "true");
829       else if (flag_isoc99)
830         pp_c_identifier (pp, "_True");
831       else
832         pp_unsupported_tree (pp, b);
833     }
834   else if (TREE_CODE (b) == INTEGER_CST)
835     pp_c_integer_constant (pp, b);
836   else
837     pp_unsupported_tree (pp, b);
838 }
839
840 /* Attempt to print out an ENUMERATOR.  Return true on success.  Else return
841    false; that means the value was obtained by a cast, in which case
842    print out the type-id part of the cast-expression -- the casted value
843    is then printed by pp_c_integer_literal.  */
844
845 static bool
846 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
847 {
848   bool value_is_named = true;
849   tree type = TREE_TYPE (e);
850   tree value;
851
852   /* Find the name of this constant.  */
853   for (value = TYPE_VALUES (type);
854        value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
855        value = TREE_CHAIN (value))
856     ;
857
858   if (value != NULL_TREE)
859     pp_id_expression (pp, TREE_PURPOSE (value));
860   else
861     {
862       /* Value must have been cast.  */
863       pp_c_type_cast (pp, type);
864       value_is_named = false;
865     }
866
867   return value_is_named;
868 }
869
870 /* Print out a REAL value as a decimal-floating-constant.  */
871
872 static void
873 pp_c_floating_constant (c_pretty_printer *pp, tree r)
874 {
875   real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
876                    sizeof (pp_buffer (pp)->digit_buffer), 0, 1);
877   pp_string (pp, pp_buffer(pp)->digit_buffer);
878   if (TREE_TYPE (r) == float_type_node)
879     pp_character (pp, 'f');
880   else if (TREE_TYPE (r) == long_double_type_node)
881     pp_character (pp, 'l');
882 }
883
884 /* Pretty-print a compound literal expression.  GNU extensions include
885    vector constants.  */
886
887 static void
888 pp_c_compound_literal (c_pretty_printer *pp, tree e)
889 {
890   tree type = TREE_TYPE (e);
891   pp_c_type_cast (pp, type);
892
893   switch (TREE_CODE (type))
894     {
895     case RECORD_TYPE:
896     case UNION_TYPE:
897     case ARRAY_TYPE:
898     case VECTOR_TYPE:
899     case COMPLEX_TYPE:
900       pp_c_brace_enclosed_initializer_list (pp, e);
901       break;
902
903     default:
904       pp_unsupported_tree (pp, e);
905       break;
906     }
907 }
908
909 /* constant:
910       integer-constant
911       floating-constant
912       enumeration-constant
913       character-constant   */
914
915 void
916 pp_c_constant (c_pretty_printer *pp, tree e)
917 {
918   const enum tree_code code = TREE_CODE (e);
919
920   switch (code)
921     {
922     case INTEGER_CST:
923       {
924         tree type = TREE_TYPE (e);
925         if (type == boolean_type_node)
926           pp_c_bool_constant (pp, e);
927         else if (type == char_type_node)
928           pp_c_character_constant (pp, e);
929         else if (TREE_CODE (type) == ENUMERAL_TYPE
930                  && pp_c_enumeration_constant (pp, e))
931           ;
932         else
933           pp_c_integer_constant (pp, e);
934       }
935       break;
936
937     case REAL_CST:
938       pp_c_floating_constant (pp, e);
939       break;
940
941     case STRING_CST:
942       pp_c_string_literal (pp, e);
943       break;
944
945     default:
946       pp_unsupported_tree (pp, e);
947       break;
948     }
949 }
950
951 /* Pretty-print an IDENTIFIER_NODE, preceded by whitespace is necessary.  */
952
953 void
954 pp_c_identifier (c_pretty_printer *pp, const char *id)
955 {
956   pp_c_maybe_whitespace (pp);
957   pp_identifier (pp, id);
958   pp_base (pp)->padding = pp_before;
959 }
960
961 /* Pretty-print a C primary-expression.
962    primary-expression:
963       identifier
964       constant
965       string-literal
966       ( expression )   */
967
968 void
969 pp_c_primary_expression (c_pretty_printer *pp, tree e)
970 {
971   switch (TREE_CODE (e))
972     {
973     case VAR_DECL:
974     case PARM_DECL:
975     case FIELD_DECL:
976     case CONST_DECL:
977     case FUNCTION_DECL:
978     case LABEL_DECL:
979       pp_c_tree_decl_identifier (pp, e);
980       break;
981
982     case IDENTIFIER_NODE:
983       pp_c_tree_identifier (pp, e);
984       break;
985
986     case ERROR_MARK:
987       pp_c_identifier (pp, "<erroneous-expression>");
988       break;
989
990     case RESULT_DECL:
991       pp_c_identifier (pp, "<return-value>");
992       break;
993
994     case INTEGER_CST:
995     case REAL_CST:
996     case STRING_CST:
997       pp_c_constant (pp, e);
998       break;
999
1000     case TARGET_EXPR:
1001       pp_c_identifier (pp, "__builtin_memcpy");
1002       pp_c_left_paren (pp);
1003       pp_ampersand (pp);
1004       pp_primary_expression (pp, TREE_OPERAND (e, 0));
1005       pp_separate_with (pp, ',');
1006       pp_ampersand (pp);
1007       pp_initializer (pp, TREE_OPERAND (e, 1));
1008       if (TREE_OPERAND (e, 2))
1009         {
1010           pp_separate_with (pp, ',');
1011           pp_c_expression (pp, TREE_OPERAND (e, 2));
1012         }
1013       pp_c_right_paren (pp);
1014       break;
1015
1016     case STMT_EXPR:
1017       pp_c_left_paren (pp);
1018       pp_statement (pp, STMT_EXPR_STMT (e));
1019       pp_c_right_paren (pp);
1020       break;
1021
1022     default:
1023       /* FIXME:  Make sure we won't get into an infinie loop.  */
1024       pp_c_left_paren (pp);
1025       pp_expression (pp, e);
1026       pp_c_right_paren (pp);
1027       break;
1028     }
1029 }
1030
1031 /* Print out a C initializer -- also support C compound-literals.
1032    initializer:
1033       assignment-expression:
1034       { initializer-list }
1035       { initializer-list , }   */
1036
1037 static void
1038 pp_c_initializer (c_pretty_printer *pp, tree e)
1039 {
1040   if (TREE_CODE (e) == CONSTRUCTOR)
1041     pp_c_brace_enclosed_initializer_list (pp, e);
1042   else
1043     pp_expression (pp, e);
1044 }
1045
1046 /* init-declarator:
1047       declarator:
1048       declarator = initializer   */
1049
1050 void
1051 pp_c_init_declarator (c_pretty_printer *pp, tree t)
1052 {
1053   pp_declarator (pp, t);
1054   /* We don't want to output function definitions here.  There are handled
1055      elsewhere (and the syntactic form is bogus anyway).  */
1056   if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
1057     {
1058       tree init = DECL_INITIAL (t);
1059       /* This C++ bit is handled here because it is easier to do so.
1060          In templates, the C++ parser builds a TREE_LIST for a
1061          direct-initialization; the TREE_PURPOSE is the variable to
1062          initialize and the TREE_VALUE is the initializer.  */
1063       if (TREE_CODE (init) == TREE_LIST)
1064         {
1065           pp_c_left_paren (pp);
1066           pp_expression (pp, TREE_VALUE (init));
1067           pp_right_paren (pp);
1068         }
1069       else
1070         {
1071           pp_space (pp);
1072           pp_equal (pp);
1073           pp_space (pp);
1074           pp_c_initializer (pp, init);
1075         }
1076     }
1077 }
1078
1079 /* initializer-list:
1080       designation(opt) initializer
1081       initializer-list , designation(opt) initializer
1082
1083    designation:
1084       designator-list =
1085
1086    designator-list:
1087       designator
1088       designator-list designator
1089
1090    designator:
1091       [ constant-expression ]
1092       identifier   */
1093
1094 static void
1095 pp_c_initializer_list (c_pretty_printer *pp, tree e)
1096 {
1097   tree type = TREE_TYPE (e);
1098   const enum tree_code code = TREE_CODE (type);
1099
1100   switch (code)
1101     {
1102     case RECORD_TYPE:
1103     case UNION_TYPE:
1104     case ARRAY_TYPE:
1105       {
1106         tree init = TREE_OPERAND (e, 0);
1107         for (; init != NULL_TREE; init = TREE_CHAIN (init))
1108           {
1109             if (code == RECORD_TYPE || code == UNION_TYPE)
1110               {
1111                 pp_c_dot (pp);
1112                 pp_c_primary_expression (pp, TREE_PURPOSE (init));
1113               }
1114             else
1115               {
1116                 pp_c_left_bracket (pp);
1117                 if (TREE_PURPOSE (init))
1118                   pp_c_constant (pp, TREE_PURPOSE (init));
1119                 pp_c_right_bracket (pp);
1120               }
1121             pp_c_whitespace (pp);
1122             pp_equal (pp);
1123             pp_c_whitespace (pp);
1124             pp_initializer (pp, TREE_VALUE (init));
1125             if (TREE_CHAIN (init))
1126               pp_separate_with (pp, ',');
1127           }
1128       }
1129       return;
1130
1131     case VECTOR_TYPE:
1132       if (TREE_CODE (e) == VECTOR_CST)
1133         pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
1134       else if (TREE_CODE (e) == CONSTRUCTOR)
1135         pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
1136       else
1137         break;
1138       return;
1139
1140     case COMPLEX_TYPE:
1141       if (TREE_CODE (e) == CONSTRUCTOR)
1142         pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
1143       else if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
1144         {
1145           const bool cst = TREE_CODE (e) == COMPLEX_CST;
1146           pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
1147           pp_separate_with (pp, ',');
1148           pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
1149         }
1150       else
1151         break;
1152       return;
1153
1154     default:
1155       break;
1156     }
1157
1158   pp_unsupported_tree (pp, type);
1159 }
1160
1161 /* Pretty-print a brace-enclosed initializer-list.  */
1162
1163 static void
1164 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
1165 {
1166   pp_c_left_brace (pp);
1167   pp_c_initializer_list (pp, l);
1168   pp_c_right_brace (pp);
1169 }
1170
1171
1172 /*  This is a convenient function, used to bridge gap between C and C++
1173     grammars.
1174
1175     id-expression:
1176        identifier  */
1177
1178 void
1179 pp_c_id_expression (c_pretty_printer *pp, tree t)
1180 {
1181   switch (TREE_CODE (t))
1182     {
1183     case VAR_DECL:
1184     case PARM_DECL:
1185     case CONST_DECL:
1186     case TYPE_DECL:
1187     case FUNCTION_DECL:
1188     case FIELD_DECL:
1189     case LABEL_DECL:
1190       pp_c_tree_decl_identifier (pp, t);
1191       break;
1192
1193     case IDENTIFIER_NODE:
1194       pp_c_tree_identifier (pp, t);
1195       break;
1196
1197     default:
1198       pp_unsupported_tree (pp, t);
1199       break;
1200     }
1201 }
1202
1203 /* postfix-expression:
1204       primary-expression
1205       postfix-expression [ expression ]
1206       postfix-expression ( argument-expression-list(opt) )
1207       postfix-expression . identifier
1208       postfix-expression -> identifier
1209       postfix-expression ++
1210       postfix-expression --
1211       ( type-name ) { initializer-list }
1212       ( type-name ) { initializer-list , }  */
1213
1214 void
1215 pp_c_postfix_expression (c_pretty_printer *pp, tree e)
1216 {
1217   enum tree_code code = TREE_CODE (e);
1218   switch (code)
1219     {
1220     case POSTINCREMENT_EXPR:
1221     case POSTDECREMENT_EXPR:
1222       pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1223       pp_identifier (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
1224       break;
1225
1226     case ARROW_EXPR:
1227       pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1228       pp_c_arrow (pp);
1229       break;
1230
1231     case ARRAY_REF:
1232       pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1233       pp_c_left_bracket (pp);
1234       pp_expression (pp, TREE_OPERAND (e, 1));
1235       pp_c_right_bracket (pp);
1236       break;
1237
1238     case CALL_EXPR:
1239       pp_postfix_expression (pp, TREE_OPERAND (e, 0));
1240       pp_c_call_argument_list (pp, TREE_OPERAND (e, 1));
1241       break;
1242
1243     case UNORDERED_EXPR:
1244       pp_c_identifier (pp, flag_isoc99
1245                            ? "isunordered"
1246                            : "__builtin_isunordered");
1247       goto two_args_fun;
1248
1249     case ORDERED_EXPR:
1250       pp_c_identifier (pp, flag_isoc99
1251                            ? "!isunordered"
1252                            : "!__builtin_isunordered");
1253       goto two_args_fun;
1254
1255     case UNLT_EXPR:
1256       pp_c_identifier (pp, flag_isoc99
1257                            ? "!isgreaterequal"
1258                            : "!__builtin_isgreaterequal");
1259       goto two_args_fun;
1260
1261     case UNLE_EXPR:
1262       pp_c_identifier (pp, flag_isoc99
1263                            ? "!isgreater"
1264                            : "!__builtin_isgreater");
1265       goto two_args_fun;
1266
1267     case UNGT_EXPR:
1268       pp_c_identifier (pp, flag_isoc99
1269                            ? "!islessequal"
1270                            : "!__builtin_islessequal");
1271       goto two_args_fun;
1272
1273     case UNGE_EXPR:
1274       pp_c_identifier (pp, flag_isoc99
1275                            ? "!isless"
1276                            : "!__builtin_isless");
1277       goto two_args_fun;
1278
1279     case UNEQ_EXPR:
1280       pp_c_identifier (pp, flag_isoc99
1281                            ? "!islessgreater"
1282                            : "!__builtin_islessgreater");
1283       goto two_args_fun;
1284
1285     case LTGT_EXPR:
1286       pp_c_identifier (pp, flag_isoc99
1287                            ? "islessgreater"
1288                            : "__builtin_islessgreater");
1289       goto two_args_fun;
1290
1291     two_args_fun:
1292       pp_c_left_paren (pp);
1293       pp_expression (pp, TREE_OPERAND (e, 0));
1294       pp_separate_with (pp, ',');
1295       pp_expression (pp, TREE_OPERAND (e, 1));
1296       pp_c_right_paren (pp);
1297       break;
1298
1299     case ABS_EXPR:
1300       pp_c_identifier (pp, "__builtin_abs");
1301       pp_c_left_paren (pp);
1302       pp_expression (pp, TREE_OPERAND (e, 0));
1303       pp_c_right_paren (pp);
1304       break;
1305
1306     case COMPONENT_REF:
1307       {
1308         tree object = TREE_OPERAND (e, 0);
1309         if (TREE_CODE (object) == INDIRECT_REF)
1310           {
1311             pp_postfix_expression (pp, TREE_OPERAND (object, 0));
1312             pp_c_arrow (pp);
1313           }
1314         else
1315           {
1316             pp_postfix_expression (pp, object);
1317             pp_c_dot (pp);
1318           }
1319         pp_expression (pp, TREE_OPERAND (e, 1));
1320       }
1321       break;
1322
1323     case COMPLEX_CST:
1324     case VECTOR_CST:
1325     case COMPLEX_EXPR:
1326       pp_c_compound_literal (pp, e);
1327       break;
1328
1329     case COMPOUND_LITERAL_EXPR:
1330       e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
1331       /* Fall through.  */
1332     case CONSTRUCTOR:
1333       pp_initializer (pp, e);
1334       break;
1335
1336     case VA_ARG_EXPR:
1337       pp_c_identifier (pp, "__builtin_va_arg");
1338       pp_c_left_paren (pp);
1339       pp_assignment_expression (pp, TREE_OPERAND (e, 0));
1340       pp_separate_with (pp, ',');
1341       pp_type_id (pp, TREE_TYPE (e));
1342       pp_c_right_paren (pp);
1343       break;
1344
1345     case ADDR_EXPR:
1346       if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
1347         {
1348           pp_c_id_expression (pp, TREE_OPERAND (e, 0));
1349           break;
1350         }
1351       /* else fall through.  */
1352
1353     default:
1354       pp_primary_expression (pp, e);
1355       break;
1356     }
1357 }
1358
1359 /* Print out an expression-list; E is expected to be a TREE_LIST.  */
1360
1361 void
1362 pp_c_expression_list (c_pretty_printer *pp, tree e)
1363 {
1364   for (; e != NULL_TREE; e = TREE_CHAIN (e))
1365     {
1366       pp_expression (pp, TREE_VALUE (e));
1367       if (TREE_CHAIN (e))
1368         pp_separate_with (pp, ',');
1369     }
1370 }
1371
1372 /* Print out an expression-list in parens, as in a function call.  */
1373
1374 void
1375 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
1376 {
1377   pp_c_left_paren (pp);
1378   if (t && TREE_CODE (t) == TREE_LIST)
1379     pp_c_expression_list (pp, t);
1380   pp_c_right_paren (pp);
1381 }
1382
1383 /* unary-expression:
1384       postfix-expression
1385       ++ cast-expression
1386       -- cast-expression
1387       unary-operator cast-expression
1388       sizeof unary-expression
1389       sizeof ( type-id )
1390
1391   unary-operator: one of
1392       * &  + - ! ~
1393
1394    GNU extensions.
1395    unary-expression:
1396       __alignof__ unary-expression
1397       __alignof__ ( type-id )
1398       __real__ unary-expression
1399       __imag__ unary-expression  */
1400
1401 void
1402 pp_c_unary_expression (c_pretty_printer *pp, tree e)
1403 {
1404   enum tree_code code = TREE_CODE (e);
1405   switch (code)
1406     {
1407     case PREINCREMENT_EXPR:
1408     case PREDECREMENT_EXPR:
1409       pp_identifier (pp, code == PREINCREMENT_EXPR ? "++" : "--");
1410       pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1411       break;
1412
1413     case ADDR_EXPR:
1414     case INDIRECT_REF:
1415     case NEGATE_EXPR:
1416     case BIT_NOT_EXPR:
1417     case TRUTH_NOT_EXPR:
1418     case CONJ_EXPR:
1419       /* String literal are used by address.  */
1420       if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
1421         pp_ampersand (pp);
1422       else if (code == INDIRECT_REF)
1423         pp_c_star (pp);
1424       else if (code == NEGATE_EXPR)
1425         pp_minus (pp);
1426       else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
1427         pp_complement (pp);
1428       else if (code == TRUTH_NOT_EXPR)
1429         pp_exclamation (pp);
1430       pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1431       break;
1432
1433     case SIZEOF_EXPR:
1434     case ALIGNOF_EXPR:
1435       pp_c_identifier (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
1436       pp_c_whitespace (pp);
1437       if (TYPE_P (TREE_OPERAND (e, 0)))
1438         pp_c_type_cast (pp, TREE_OPERAND (e, 0));
1439       else
1440         pp_unary_expression (pp, TREE_OPERAND (e, 0));
1441       break;
1442
1443     case REALPART_EXPR:
1444     case IMAGPART_EXPR:
1445       pp_c_identifier (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
1446       pp_c_whitespace (pp);
1447       pp_unary_expression (pp, TREE_OPERAND (e, 0));
1448       break;
1449
1450     default:
1451       pp_postfix_expression (pp, e);
1452       break;
1453     }
1454 }
1455
1456 /* cast-expression:
1457       unary-expression
1458       ( type-name ) cast-expression  */
1459
1460 void
1461 pp_c_cast_expression (c_pretty_printer *pp, tree e)
1462 {
1463   switch (TREE_CODE (e))
1464     {
1465     case FLOAT_EXPR:
1466     case FIX_TRUNC_EXPR:
1467     case CONVERT_EXPR:
1468       pp_c_type_cast (pp, TREE_TYPE (e));
1469       pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
1470       break;
1471
1472     default:
1473       pp_unary_expression (pp, e);
1474     }
1475 }
1476
1477 /* multiplicative-expression:
1478       cast-expression
1479       multiplicative-expression * cast-expression
1480       multiplicative-expression / cast-expression
1481       multiplicative-expression % cast-expression   */
1482
1483 static void
1484 pp_c_multiplicative_expression (c_pretty_printer *pp, tree e)
1485 {
1486   enum tree_code code = TREE_CODE (e);
1487   switch (code)
1488     {
1489     case MULT_EXPR:
1490     case TRUNC_DIV_EXPR:
1491     case TRUNC_MOD_EXPR:
1492       pp_multiplicative_expression (pp, TREE_OPERAND (e, 0));
1493       pp_c_whitespace (pp);
1494       if (code == MULT_EXPR)
1495         pp_c_star (pp);
1496       else if (code == TRUNC_DIV_EXPR)
1497         pp_slash (pp);
1498       else
1499         pp_modulo (pp);
1500       pp_c_whitespace (pp);
1501       pp_c_cast_expression (pp, TREE_OPERAND (e, 1));
1502       break;
1503
1504     default:
1505       pp_c_cast_expression (pp, e);
1506       break;
1507     }
1508 }
1509
1510 /* additive-expression:
1511       multiplicative-expression
1512       additive-expression + multiplicative-expression
1513       additive-expression - multiplicative-expression   */
1514
1515 static void
1516 pp_c_additive_expression (c_pretty_printer *pp, tree e)
1517 {
1518   enum tree_code code = TREE_CODE (e);
1519   switch (code)
1520     {
1521     case PLUS_EXPR:
1522     case MINUS_EXPR:
1523       pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
1524       pp_c_whitespace (pp);
1525       if (code == PLUS_EXPR)
1526         pp_plus (pp);
1527       else
1528         pp_minus (pp);
1529       pp_c_whitespace (pp);
1530       pp_multiplicative_expression (pp, TREE_OPERAND (e, 1));
1531       break;
1532
1533     default:
1534       pp_multiplicative_expression (pp, e);
1535       break;
1536     }
1537 }
1538
1539 /* additive-expression:
1540       additive-expression
1541       shift-expression << additive-expression
1542       shift-expression >> additive-expression   */
1543
1544 static void
1545 pp_c_shift_expression (c_pretty_printer *pp, tree e)
1546 {
1547   enum tree_code code = TREE_CODE (e);
1548   switch (code)
1549     {
1550     case LSHIFT_EXPR:
1551     case RSHIFT_EXPR:
1552       pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
1553       pp_c_whitespace (pp);
1554       pp_identifier (pp, code == LSHIFT_EXPR ? "<<" : ">>");
1555       pp_c_whitespace (pp);
1556       pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
1557       break;
1558
1559     default:
1560       pp_c_additive_expression (pp, e);
1561     }
1562 }
1563
1564 /* relational-expression:
1565       shift-expression
1566       relational-expression < shift-expression
1567       relational-expression > shift-expression
1568       relational-expression <= shift-expression
1569       relational-expression >= shift-expression   */
1570
1571 static void
1572 pp_c_relational_expression (c_pretty_printer *pp, tree e)
1573 {
1574   enum tree_code code = TREE_CODE (e);
1575   switch (code)
1576     {
1577     case LT_EXPR:
1578     case GT_EXPR:
1579     case LE_EXPR:
1580     case GE_EXPR:
1581       pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
1582       pp_c_whitespace (pp);
1583       if (code == LT_EXPR)
1584         pp_less (pp);
1585       else if (code == GT_EXPR)
1586         pp_greater (pp);
1587       else if (code == LE_EXPR)
1588         pp_identifier (pp, "<=");
1589       else if (code == GE_EXPR)
1590         pp_identifier (pp, ">=");
1591       pp_c_whitespace (pp);
1592       pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
1593       break;
1594
1595     default:
1596       pp_c_shift_expression (pp, e);
1597       break;
1598     }
1599 }
1600
1601 /* equality-expression:
1602       relational-expression
1603       equality-expression == relational-expression
1604       equality-equality != relational-expression  */
1605
1606 static void
1607 pp_c_equality_expression (c_pretty_printer *pp, tree e)
1608 {
1609   enum tree_code code = TREE_CODE (e);
1610   switch (code)
1611     {
1612     case EQ_EXPR:
1613     case NE_EXPR:
1614       pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
1615       pp_c_whitespace (pp);
1616       pp_identifier (pp, code == EQ_EXPR ? "==" : "!=");
1617       pp_c_whitespace (pp);
1618       pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
1619       break;
1620
1621     default:
1622       pp_c_relational_expression (pp, e);
1623       break;
1624     }
1625 }
1626
1627 /* AND-expression:
1628       equality-expression
1629       AND-expression & equality-equality   */
1630
1631 static void
1632 pp_c_and_expression (c_pretty_printer *pp, tree e)
1633 {
1634   if (TREE_CODE (e) == BIT_AND_EXPR)
1635     {
1636       pp_c_and_expression (pp, TREE_OPERAND (e, 0));
1637       pp_c_whitespace (pp);
1638       pp_ampersand (pp);
1639       pp_c_whitespace (pp);
1640       pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
1641     }
1642   else
1643     pp_c_equality_expression (pp, e);
1644 }
1645
1646 /* exclusive-OR-expression:
1647      AND-expression
1648      exclusive-OR-expression ^ AND-expression  */
1649
1650 static void
1651 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
1652 {
1653   if (TREE_CODE (e) == BIT_XOR_EXPR)
1654     {
1655       pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1656       pp_c_maybe_whitespace (pp);
1657       pp_carret (pp);
1658       pp_c_whitespace (pp);
1659       pp_c_and_expression (pp, TREE_OPERAND (e, 1));
1660     }
1661   else
1662     pp_c_and_expression (pp, e);
1663 }
1664
1665 /* inclusive-OR-expression:
1666      exclusive-OR-expression
1667      inclusive-OR-expression | exclusive-OR-expression  */
1668
1669 static void
1670 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
1671 {
1672   if (TREE_CODE (e) == BIT_IOR_EXPR)
1673     {
1674       pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
1675       pp_c_whitespace (pp);
1676       pp_bar (pp);
1677       pp_c_whitespace (pp);
1678       pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
1679     }
1680   else
1681     pp_c_exclusive_or_expression (pp, e);
1682 }
1683
1684 /* logical-AND-expression:
1685       inclusive-OR-expression
1686       logical-AND-expression && inclusive-OR-expression  */
1687
1688 static void
1689 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
1690 {
1691   if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
1692     {
1693       pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
1694       pp_c_whitespace (pp);
1695       pp_identifier (pp, "&&");
1696       pp_c_whitespace (pp);
1697       pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
1698     }
1699   else
1700     pp_c_inclusive_or_expression (pp, e);
1701 }
1702
1703 /* logical-OR-expression:
1704       logical-AND-expression
1705       logical-OR-expression || logical-AND-expression  */
1706
1707 void
1708 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
1709 {
1710   if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
1711     {
1712       pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1713       pp_c_whitespace (pp);
1714       pp_identifier (pp, "||");
1715       pp_c_whitespace (pp);
1716       pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
1717     }
1718   else
1719     pp_c_logical_and_expression (pp, e);
1720 }
1721
1722 /* conditional-expression:
1723       logical-OR-expression
1724       logical-OR-expression ? expression : conditional-expression  */
1725
1726 static void
1727 pp_c_conditional_expression (c_pretty_printer *pp, tree e)
1728 {
1729   if (TREE_CODE (e) == COND_EXPR)
1730     {
1731       pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
1732       pp_c_whitespace (pp);
1733       pp_question (pp);
1734       pp_c_whitespace (pp);
1735       pp_expression (pp, TREE_OPERAND (e, 1));
1736       pp_c_whitespace (pp);
1737       pp_colon (pp);
1738       pp_c_whitespace (pp);
1739       pp_c_conditional_expression (pp, TREE_OPERAND (e, 2));
1740     }
1741   else
1742     pp_c_logical_or_expression (pp, e);
1743 }
1744
1745
1746 /* assignment-expression:
1747       conditional-expression
1748       unary-expression assignment-operator  assignment-expression
1749
1750    assignment-expression: one of
1751       =    *=    /=    %=    +=    -=    >>=    <<=    &=    ^=    |=  */
1752
1753 static void
1754 pp_c_assignment_expression (c_pretty_printer *pp, tree e)
1755 {
1756   if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
1757     {
1758       pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
1759       pp_c_whitespace (pp);
1760       pp_equal (pp);
1761       pp_space (pp);
1762       pp_c_expression (pp, TREE_OPERAND (e, 1));
1763     }
1764   else
1765     pp_c_conditional_expression (pp, e);
1766 }
1767
1768 /* expression:
1769        assignment-expression
1770        expression , assignment-expression
1771
1772   Implementation note:  instead of going through the usual recursion
1773   chain, I take the liberty of dispatching nodes to the appropriate
1774   functions.  This makes some redundancy, but it worths it. That also
1775   prevents a possible infinite recursion between pp_c_primary_expression ()
1776   and pp_c_expression ().  */
1777
1778 void
1779 pp_c_expression (c_pretty_printer *pp, tree e)
1780 {
1781   switch (TREE_CODE (e))
1782     {
1783     case INTEGER_CST:
1784       pp_c_integer_constant (pp, e);
1785       break;
1786
1787     case REAL_CST:
1788       pp_c_floating_constant (pp, e);
1789       break;
1790
1791     case STRING_CST:
1792       pp_c_string_literal (pp, e);
1793       break;
1794
1795     case IDENTIFIER_NODE:
1796     case FUNCTION_DECL:
1797     case VAR_DECL:
1798     case CONST_DECL:
1799     case PARM_DECL:
1800     case RESULT_DECL:
1801     case FIELD_DECL:
1802     case LABEL_DECL:
1803     case ERROR_MARK:
1804     case STMT_EXPR:
1805       pp_primary_expression (pp, e);
1806       break;
1807
1808     case POSTINCREMENT_EXPR:
1809     case POSTDECREMENT_EXPR:
1810     case ARROW_EXPR:
1811     case ARRAY_REF:
1812     case CALL_EXPR:
1813     case COMPONENT_REF:
1814     case COMPLEX_CST:
1815     case COMPLEX_EXPR:
1816     case VECTOR_CST:
1817     case ORDERED_EXPR:
1818     case UNORDERED_EXPR:
1819     case LTGT_EXPR:
1820     case UNEQ_EXPR:
1821     case UNLE_EXPR:
1822     case UNLT_EXPR:
1823     case UNGE_EXPR:
1824     case UNGT_EXPR:
1825     case ABS_EXPR:
1826     case CONSTRUCTOR:
1827     case COMPOUND_LITERAL_EXPR:
1828     case VA_ARG_EXPR:
1829       pp_postfix_expression (pp, e);
1830       break;
1831
1832     case CONJ_EXPR:
1833     case ADDR_EXPR:
1834     case INDIRECT_REF:
1835     case NEGATE_EXPR:
1836     case BIT_NOT_EXPR:
1837     case TRUTH_NOT_EXPR:
1838     case PREINCREMENT_EXPR:
1839     case PREDECREMENT_EXPR:
1840     case SIZEOF_EXPR:
1841     case ALIGNOF_EXPR:
1842     case REALPART_EXPR:
1843     case IMAGPART_EXPR:
1844       pp_c_unary_expression (pp, e);
1845       break;
1846
1847     case FLOAT_EXPR:
1848     case FIX_TRUNC_EXPR:
1849     case CONVERT_EXPR:
1850       pp_c_cast_expression (pp, e);
1851       break;
1852
1853     case MULT_EXPR:
1854     case TRUNC_MOD_EXPR:
1855     case TRUNC_DIV_EXPR:
1856       pp_multiplicative_expression (pp, e);
1857       break;
1858
1859     case LSHIFT_EXPR:
1860     case RSHIFT_EXPR:
1861       pp_c_shift_expression (pp, e);
1862       break;
1863
1864     case LT_EXPR:
1865     case GT_EXPR:
1866     case LE_EXPR:
1867     case GE_EXPR:
1868       pp_c_relational_expression (pp, e);
1869       break;
1870
1871     case BIT_AND_EXPR:
1872       pp_c_and_expression (pp, e);
1873       break;
1874
1875     case BIT_XOR_EXPR:
1876       pp_c_exclusive_or_expression (pp, e);
1877       break;
1878
1879     case BIT_IOR_EXPR:
1880       pp_c_inclusive_or_expression (pp, e);
1881       break;
1882
1883     case TRUTH_ANDIF_EXPR:
1884       pp_c_logical_and_expression (pp, e);
1885       break;
1886
1887     case TRUTH_ORIF_EXPR:
1888       pp_c_logical_or_expression (pp, e);
1889       break;
1890
1891     case EQ_EXPR:
1892     case NE_EXPR:
1893       pp_c_equality_expression (pp, e);
1894       break;
1895
1896     case COND_EXPR:
1897       pp_conditional_expression (pp, e);
1898       break;
1899
1900     case PLUS_EXPR:
1901     case MINUS_EXPR:
1902       pp_c_additive_expression (pp, e);
1903       break;
1904
1905     case MODIFY_EXPR:
1906     case INIT_EXPR:
1907       pp_assignment_expression (pp, e);
1908       break;
1909
1910     case COMPOUND_EXPR:
1911       pp_c_left_paren (pp);
1912       pp_expression (pp, TREE_OPERAND (e, 0));
1913       pp_separate_with (pp, ',');
1914       pp_assignment_expression (pp, TREE_OPERAND (e, 1));
1915       pp_c_right_paren (pp);
1916       break;
1917
1918     case NOP_EXPR:
1919     case NON_LVALUE_EXPR:
1920     case SAVE_EXPR:
1921       pp_expression (pp, TREE_OPERAND (e, 0));
1922       break;
1923
1924     case TARGET_EXPR:
1925       pp_postfix_expression (pp, TREE_OPERAND (e, 1));
1926       break;
1927
1928     default:
1929       pp_unsupported_tree (pp, e);
1930       break;
1931     }
1932 }
1933
1934
1935 \f
1936 /* Statements.  */
1937
1938 /* statement:
1939       labeled-statement
1940       compound-statement
1941       expression-statement
1942       selection-statement
1943       iteration-statement
1944       jump-statement   */
1945
1946 void
1947 pp_c_statement (c_pretty_printer *pp, tree stmt)
1948 {
1949   enum tree_code code;
1950
1951   if (stmt == NULL)
1952     return;
1953
1954   if (pp_needs_newline (pp))
1955     pp_newline_and_indent (pp, 0);
1956
1957   code = TREE_CODE (stmt);
1958   switch (code)
1959     {
1960       /* expression-statement:
1961             expression(opt) ;  */
1962     case EXPR_STMT:
1963       pp_expression (pp, EXPR_STMT_EXPR (stmt));
1964       pp_c_semicolon (pp);
1965       pp_needs_newline (pp) = true;
1966       break;
1967
1968     default:
1969       dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
1970       break;
1971     }
1972 }
1973
1974 \f
1975 /* Initialize the PRETTY-PRINTER for handling C codes.  */
1976
1977 void
1978 pp_c_pretty_printer_init (c_pretty_printer *pp)
1979 {
1980   pp->offset_list               = 0;
1981
1982   pp->declaration               = pp_c_declaration;
1983   pp->declaration_specifiers    = pp_c_declaration_specifiers;
1984   pp->declarator                = pp_c_declarator;
1985   pp->direct_declarator         = pp_c_direct_declarator;
1986   pp->type_specifier_seq        = pp_c_specifier_qualifier_list;
1987   pp->abstract_declarator       = pp_c_abstract_declarator;
1988   pp->direct_abstract_declarator = pp_c_direct_abstract_declarator;
1989   pp->ptr_operator              = pp_c_pointer;
1990   pp->parameter_list            = pp_c_parameter_type_list;
1991   pp->type_id                   = pp_c_type_id;
1992   pp->simple_type_specifier     = pp_c_type_specifier;
1993   pp->function_specifier        = pp_c_function_specifier;
1994   pp->storage_class_specifier   = pp_c_storage_class_specifier;
1995
1996   pp->statement                 = pp_c_statement;
1997
1998   pp->id_expression             = pp_c_id_expression;
1999   pp->primary_expression        = pp_c_primary_expression;
2000   pp->postfix_expression        = pp_c_postfix_expression;
2001   pp->unary_expression          = pp_c_unary_expression;
2002   pp->initializer               = pp_c_initializer;
2003   pp->multiplicative_expression = pp_c_multiplicative_expression;
2004   pp->conditional_expression    = pp_c_conditional_expression;
2005   pp->assignment_expression     = pp_c_assignment_expression;
2006   pp->expression                = pp_c_expression;
2007 }
2008
2009
2010 /* Print the tree T in full, on file FILE.  */
2011
2012 void
2013 print_c_tree (FILE *file, tree t)
2014 {
2015   static c_pretty_printer pp_rec;
2016   static bool initialized = 0;
2017   c_pretty_printer *pp = &pp_rec;
2018
2019   if (!initialized)
2020     {
2021       initialized = 1;
2022       pp_construct (pp_base (pp), NULL, 0);
2023       pp_c_pretty_printer_init (pp);
2024       pp_needs_newline (pp) = true;
2025     }
2026   pp_base (pp)->buffer->stream = file;
2027
2028   pp_statement (pp, t);
2029
2030   pp_newline (pp);
2031   pp_flush (pp);
2032 }
2033
2034 /* Print the tree T in full, on stderr.  */
2035
2036 void
2037 debug_c_tree (tree t)
2038 {
2039   print_c_tree (stderr, t);
2040   fputc ('\n', stderr);
2041 }
2042
2043 /* Output the DECL_NAME of T.  If T has no DECL_NAME, output a string made
2044    up of T's memory address.  */
2045
2046 void
2047 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
2048 {
2049   const char *name;
2050
2051   gcc_assert (DECL_P (t));
2052
2053   if (DECL_NAME (t))
2054     name = IDENTIFIER_POINTER (DECL_NAME (t));
2055   else
2056     {
2057       static char xname[8];
2058       sprintf (xname, "<U%4x>", ((unsigned)((unsigned long)(t) & 0xffff)));
2059       name = xname;
2060     }
2061
2062   pp_c_identifier (pp, name);
2063 }