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