00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "coretypes.h"
00025 #include "tm.h"
00026 #include "real.h"
00027 #include "c-pretty-print.h"
00028 #include "c-tree.h"
00029 #include "tree-iterator.h"
00030 #include "diagnostic.h"
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #define pp_c_maybe_whitespace(PP) \
00041 do { \
00042 if (pp_base (PP)->padding == pp_before) \
00043 pp_c_whitespace (PP); \
00044 } while (0)
00045
00046
00047 static void pp_c_char (c_pretty_printer *, int);
00048
00049
00050 static void pp_c_initializer_list (c_pretty_printer *, tree);
00051 static void pp_c_brace_enclosed_initializer_list (c_pretty_printer *, tree);
00052
00053 static void pp_c_multiplicative_expression (c_pretty_printer *, tree);
00054 static void pp_c_additive_expression (c_pretty_printer *, tree);
00055 static void pp_c_shift_expression (c_pretty_printer *, tree);
00056 static void pp_c_relational_expression (c_pretty_printer *, tree);
00057 static void pp_c_equality_expression (c_pretty_printer *, tree);
00058 static void pp_c_and_expression (c_pretty_printer *, tree);
00059 static void pp_c_exclusive_or_expression (c_pretty_printer *, tree);
00060 static void pp_c_inclusive_or_expression (c_pretty_printer *, tree);
00061 static void pp_c_logical_and_expression (c_pretty_printer *, tree);
00062 static void pp_c_conditional_expression (c_pretty_printer *, tree);
00063 static void pp_c_assignment_expression (c_pretty_printer *, tree);
00064
00065
00066
00067
00068
00069
00070 void
00071 pp_c_whitespace (c_pretty_printer *pp)
00072 {
00073 pp_space (pp);
00074 pp_base (pp)->padding = pp_none;
00075 }
00076
00077 void
00078 pp_c_left_paren (c_pretty_printer *pp)
00079 {
00080 pp_left_paren (pp);
00081 pp_base (pp)->padding = pp_none;
00082 }
00083
00084 void
00085 pp_c_right_paren (c_pretty_printer *pp)
00086 {
00087 pp_right_paren (pp);
00088 pp_base (pp)->padding = pp_none;
00089 }
00090
00091 void
00092 pp_c_left_brace (c_pretty_printer *pp)
00093 {
00094 pp_left_brace (pp);
00095 pp_base (pp)->padding = pp_none;
00096 }
00097
00098 void
00099 pp_c_right_brace (c_pretty_printer *pp)
00100 {
00101 pp_right_brace (pp);
00102 pp_base (pp)->padding = pp_none;
00103 }
00104
00105 void
00106 pp_c_left_bracket (c_pretty_printer *pp)
00107 {
00108 pp_left_bracket (pp);
00109 pp_base (pp)->padding = pp_none;
00110 }
00111
00112 void
00113 pp_c_right_bracket (c_pretty_printer *pp)
00114 {
00115 pp_right_bracket (pp);
00116 pp_base (pp)->padding = pp_none;
00117 }
00118
00119 void
00120 pp_c_dot (c_pretty_printer *pp)
00121 {
00122 pp_dot (pp);
00123 pp_base (pp)->padding = pp_none;
00124 }
00125
00126 void
00127 pp_c_ampersand (c_pretty_printer *pp)
00128 {
00129 pp_ampersand (pp);
00130 pp_base (pp)->padding = pp_none;
00131 }
00132
00133 void
00134 pp_c_star (c_pretty_printer *pp)
00135 {
00136 pp_star (pp);
00137 pp_base (pp)->padding = pp_none;
00138 }
00139
00140 void
00141 pp_c_arrow (c_pretty_printer *pp)
00142 {
00143 pp_arrow (pp);
00144 pp_base (pp)->padding = pp_none;
00145 }
00146
00147 void
00148 pp_c_semicolon (c_pretty_printer *pp)
00149 {
00150 pp_semicolon (pp);
00151 pp_base (pp)->padding = pp_none;
00152 }
00153
00154 void
00155 pp_c_complement (c_pretty_printer *pp)
00156 {
00157 pp_complement (pp);
00158 pp_base (pp)->padding = pp_none;
00159 }
00160
00161 void
00162 pp_c_exclamation (c_pretty_printer *pp)
00163 {
00164 pp_exclamation (pp);
00165 pp_base (pp)->padding = pp_none;
00166 }
00167
00168
00169
00170 static void
00171 pp_c_cv_qualifier (c_pretty_printer *pp, const char *cv)
00172 {
00173 const char *p = pp_last_position_in_text (pp);
00174
00175
00176
00177 if (p != NULL && (*p == '*' || *p == '&'))
00178 pp_c_whitespace (pp);
00179 pp_c_identifier (pp, cv);
00180 }
00181
00182
00183
00184 static void
00185 pp_c_type_cast (c_pretty_printer *pp, tree t)
00186 {
00187 pp_c_left_paren (pp);
00188 pp_type_id (pp, t);
00189 pp_c_right_paren (pp);
00190 }
00191
00192
00193
00194
00195 void
00196 pp_c_space_for_pointer_operator (c_pretty_printer *pp, tree t)
00197 {
00198 if (POINTER_TYPE_P (t))
00199 {
00200 tree pointee = strip_pointer_operator (TREE_TYPE (t));
00201 if (TREE_CODE (pointee) != ARRAY_TYPE
00202 && TREE_CODE (pointee) != FUNCTION_TYPE)
00203 pp_c_whitespace (pp);
00204 }
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 void
00225 pp_c_type_qualifier_list (c_pretty_printer *pp, tree t)
00226 {
00227 int qualifiers;
00228
00229 if (!TYPE_P (t))
00230 t = TREE_TYPE (t);
00231
00232 qualifiers = TYPE_QUALS (t);
00233 if (qualifiers & TYPE_QUAL_CONST)
00234 pp_c_cv_qualifier (pp, "const");
00235 if (qualifiers & TYPE_QUAL_VOLATILE)
00236 pp_c_cv_qualifier (pp, "volatile");
00237 if (qualifiers & TYPE_QUAL_RESTRICT)
00238 pp_c_cv_qualifier (pp, flag_isoc99 ? "restrict" : "__restrict__");
00239 }
00240
00241
00242
00243
00244
00245 static void
00246 pp_c_pointer (c_pretty_printer *pp, tree t)
00247 {
00248 if (!TYPE_P (t) && TREE_CODE (t) != TYPE_DECL)
00249 t = TREE_TYPE (t);
00250 switch (TREE_CODE (t))
00251 {
00252 case POINTER_TYPE:
00253
00254 case REFERENCE_TYPE:
00255 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
00256 pp_c_pointer (pp, TREE_TYPE (t));
00257 if (TREE_CODE (t) == POINTER_TYPE)
00258 pp_c_star (pp);
00259 else
00260 pp_c_ampersand (pp);
00261 pp_c_type_qualifier_list (pp, t);
00262 break;
00263
00264
00265
00266 case DECL_EXPR:
00267 pp_declaration (pp, DECL_EXPR_DECL (t));
00268 pp_needs_newline (pp) = true;
00269 break;
00270
00271 default:
00272 pp_unsupported_tree (pp, t);
00273 }
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 void
00299 pp_c_type_specifier (c_pretty_printer *pp, tree t)
00300 {
00301 const enum tree_code code = TREE_CODE (t);
00302 switch (code)
00303 {
00304 case ERROR_MARK:
00305 pp_c_identifier (pp, "<type-error>");
00306 break;
00307
00308 case IDENTIFIER_NODE:
00309 pp_c_tree_decl_identifier (pp, t);
00310 break;
00311
00312 case VOID_TYPE:
00313 case BOOLEAN_TYPE:
00314 case CHAR_TYPE:
00315 case INTEGER_TYPE:
00316 case REAL_TYPE:
00317 if (TYPE_NAME (t))
00318 {
00319 t = TYPE_NAME (t);
00320 pp_c_type_specifier (pp, t);
00321 }
00322 else
00323 {
00324 int prec = TYPE_PRECISION (t);
00325 t = c_common_type_for_mode (TYPE_MODE (t), TYPE_UNSIGNED (t));
00326 pp_c_type_specifier (pp, t);
00327 if (TYPE_PRECISION (t) != prec)
00328 {
00329 pp_string (pp, ":");
00330 pp_decimal_int (pp, prec);
00331 }
00332 }
00333 break;
00334
00335 case TYPE_DECL:
00336 if (DECL_NAME (t))
00337 pp_id_expression (pp, t);
00338 else
00339 pp_c_identifier (pp, "<typedef-error>");
00340 break;
00341
00342 case UNION_TYPE:
00343 case RECORD_TYPE:
00344 case ENUMERAL_TYPE:
00345 if (code == UNION_TYPE)
00346 pp_c_identifier (pp, "union");
00347 else if (code == RECORD_TYPE)
00348 pp_c_identifier (pp, "struct");
00349 else if (code == ENUMERAL_TYPE)
00350 pp_c_identifier (pp, "enum");
00351 else
00352 pp_c_identifier (pp, "<tag-error>");
00353
00354 if (TYPE_NAME (t))
00355 pp_id_expression (pp, TYPE_NAME (t));
00356 else
00357 pp_c_identifier (pp, "<anonymous>");
00358 break;
00359
00360 default:
00361 pp_unsupported_tree (pp, t);
00362 break;
00363 }
00364 }
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377 void
00378 pp_c_specifier_qualifier_list (c_pretty_printer *pp, tree t)
00379 {
00380 const enum tree_code code = TREE_CODE (t);
00381
00382 if (TREE_CODE (t) != POINTER_TYPE)
00383 pp_c_type_qualifier_list (pp, t);
00384 switch (code)
00385 {
00386 case REFERENCE_TYPE:
00387 case POINTER_TYPE:
00388 {
00389
00390 tree pointee = strip_pointer_operator (TREE_TYPE (t));
00391 pp_c_specifier_qualifier_list (pp, pointee);
00392 if (TREE_CODE (pointee) == ARRAY_TYPE
00393 || TREE_CODE (pointee) == FUNCTION_TYPE)
00394 {
00395 pp_c_whitespace (pp);
00396 pp_c_left_paren (pp);
00397 }
00398 else if (!c_dialect_cxx ())
00399 pp_c_whitespace (pp);
00400 pp_ptr_operator (pp, t);
00401 }
00402 break;
00403
00404 case FUNCTION_TYPE:
00405 case ARRAY_TYPE:
00406 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
00407 break;
00408
00409 case VECTOR_TYPE:
00410 case COMPLEX_TYPE:
00411 pp_c_specifier_qualifier_list (pp, TREE_TYPE (t));
00412 if (code == COMPLEX_TYPE)
00413 pp_c_identifier (pp, flag_isoc99 ? "_Complex" : "__complex__");
00414 else if (code == VECTOR_TYPE)
00415 pp_c_identifier (pp, "__vector__");
00416 break;
00417
00418 default:
00419 pp_simple_type_specifier (pp, t);
00420 break;
00421 }
00422 }
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436 void
00437 pp_c_parameter_type_list (c_pretty_printer *pp, tree t)
00438 {
00439 bool want_parm_decl = DECL_P (t) && !(pp->flags & pp_c_flag_abstract);
00440 tree parms = want_parm_decl ? DECL_ARGUMENTS (t) : TYPE_ARG_TYPES (t);
00441 pp_c_left_paren (pp);
00442 if (parms == void_list_node)
00443 pp_c_identifier (pp, "void");
00444 else
00445 {
00446 bool first = true;
00447 for ( ; parms && parms != void_list_node; parms = TREE_CHAIN (parms))
00448 {
00449 if (!first)
00450 pp_separate_with (pp, ',');
00451 first = false;
00452 pp_declaration_specifiers
00453 (pp, want_parm_decl ? parms : TREE_VALUE (parms));
00454 if (want_parm_decl)
00455 pp_declarator (pp, parms);
00456 else
00457 pp_abstract_declarator (pp, TREE_VALUE (parms));
00458 }
00459 }
00460 pp_c_right_paren (pp);
00461 }
00462
00463
00464
00465
00466
00467 static void
00468 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
00469 {
00470 if (TREE_CODE (t) == POINTER_TYPE)
00471 {
00472 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
00473 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
00474 pp_c_right_paren (pp);
00475 t = TREE_TYPE (t);
00476 }
00477
00478 pp_direct_abstract_declarator (pp, t);
00479 }
00480
00481
00482
00483
00484
00485
00486
00487 void
00488 pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
00489 {
00490 switch (TREE_CODE (t))
00491 {
00492 case POINTER_TYPE:
00493 pp_abstract_declarator (pp, t);
00494 break;
00495
00496 case FUNCTION_TYPE:
00497 pp_c_parameter_type_list (pp, t);
00498 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
00499 break;
00500
00501 case ARRAY_TYPE:
00502 pp_c_left_bracket (pp);
00503 if (TYPE_DOMAIN (t) && TYPE_MAX_VALUE (TYPE_DOMAIN (t)))
00504 pp_expression (pp, TYPE_MAX_VALUE (TYPE_DOMAIN (t)));
00505 pp_c_right_bracket (pp);
00506 pp_direct_abstract_declarator (pp, TREE_TYPE (t));
00507 break;
00508
00509 case IDENTIFIER_NODE:
00510 case VOID_TYPE:
00511 case BOOLEAN_TYPE:
00512 case INTEGER_TYPE:
00513 case REAL_TYPE:
00514 case ENUMERAL_TYPE:
00515 case RECORD_TYPE:
00516 case UNION_TYPE:
00517 case VECTOR_TYPE:
00518 case COMPLEX_TYPE:
00519 case TYPE_DECL:
00520 break;
00521
00522 default:
00523 pp_unsupported_tree (pp, t);
00524 break;
00525 }
00526 }
00527
00528
00529
00530
00531 void
00532 pp_c_type_id (c_pretty_printer *pp, tree t)
00533 {
00534 pp_c_specifier_qualifier_list (pp, t);
00535 pp_abstract_declarator (pp, t);
00536 }
00537
00538
00539
00540
00541
00542
00543
00544
00545 void
00546 pp_c_storage_class_specifier (c_pretty_printer *pp, tree t)
00547 {
00548 if (TREE_CODE (t) == TYPE_DECL)
00549 pp_c_identifier (pp, "typedef");
00550 else if (DECL_P (t))
00551 {
00552 if (DECL_REGISTER (t))
00553 pp_c_identifier (pp, "register");
00554 else if (TREE_STATIC (t) && TREE_CODE (t) == VAR_DECL)
00555 pp_c_identifier (pp, "static");
00556 }
00557 }
00558
00559
00560
00561
00562 void
00563 pp_c_function_specifier (c_pretty_printer *pp, tree t)
00564 {
00565 if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
00566 pp_c_identifier (pp, "inline");
00567 }
00568
00569
00570
00571
00572
00573
00574
00575 void
00576 pp_c_declaration_specifiers (c_pretty_printer *pp, tree t)
00577 {
00578 pp_storage_class_specifier (pp, t);
00579 pp_function_specifier (pp, t);
00580 pp_c_specifier_qualifier_list (pp, DECL_P (t) ? TREE_TYPE (t) : t);
00581 }
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593 void
00594 pp_c_direct_declarator (c_pretty_printer *pp, tree t)
00595 {
00596 switch (TREE_CODE (t))
00597 {
00598 case VAR_DECL:
00599 case PARM_DECL:
00600 case TYPE_DECL:
00601 case FIELD_DECL:
00602 case LABEL_DECL:
00603 pp_c_space_for_pointer_operator (pp, TREE_TYPE (t));
00604 pp_c_tree_decl_identifier (pp, t);
00605 break;
00606
00607 case ARRAY_TYPE:
00608 case POINTER_TYPE:
00609 pp_abstract_declarator (pp, TREE_TYPE (t));
00610 break;
00611
00612 case FUNCTION_TYPE:
00613 pp_parameter_list (pp, t);
00614 pp_abstract_declarator (pp, TREE_TYPE (t));
00615 break;
00616
00617 case FUNCTION_DECL:
00618 pp_c_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
00619 pp_c_tree_decl_identifier (pp, t);
00620 if (pp_c_base (pp)->flags & pp_c_flag_abstract)
00621 pp_abstract_declarator (pp, TREE_TYPE (t));
00622 else
00623 {
00624 pp_parameter_list (pp, t);
00625 pp_abstract_declarator (pp, TREE_TYPE (TREE_TYPE (t)));
00626 }
00627 break;
00628
00629 case INTEGER_TYPE:
00630 case REAL_TYPE:
00631 case ENUMERAL_TYPE:
00632 case UNION_TYPE:
00633 case RECORD_TYPE:
00634 break;
00635
00636 default:
00637 pp_unsupported_tree (pp, t);
00638 break;
00639 }
00640 }
00641
00642
00643
00644
00645
00646 void
00647 pp_c_declarator (c_pretty_printer *pp, tree t)
00648 {
00649 switch (TREE_CODE (t))
00650 {
00651 case INTEGER_TYPE:
00652 case REAL_TYPE:
00653 case ENUMERAL_TYPE:
00654 case UNION_TYPE:
00655 case RECORD_TYPE:
00656 break;
00657
00658 case VAR_DECL:
00659 case PARM_DECL:
00660 case FIELD_DECL:
00661 case ARRAY_TYPE:
00662 case FUNCTION_TYPE:
00663 case FUNCTION_DECL:
00664 case TYPE_DECL:
00665 pp_direct_declarator (pp, t);
00666 break;
00667
00668
00669 default:
00670 pp_unsupported_tree (pp, t);
00671 break;
00672 }
00673 }
00674
00675
00676
00677
00678 void
00679 pp_c_declaration (c_pretty_printer *pp, tree t)
00680 {
00681 pp_declaration_specifiers (pp, t);
00682 pp_c_init_declarator (pp, t);
00683 }
00684
00685
00686
00687 void
00688 pp_c_attributes (c_pretty_printer *pp, tree attributes)
00689 {
00690 if (attributes == NULL_TREE)
00691 return;
00692
00693 pp_c_identifier (pp, "__attribute__");
00694 pp_c_left_paren (pp);
00695 pp_c_left_paren (pp);
00696 for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
00697 {
00698 pp_tree_identifier (pp, TREE_PURPOSE (attributes));
00699 if (TREE_VALUE (attributes))
00700 pp_c_call_argument_list (pp, TREE_VALUE (attributes));
00701
00702 if (TREE_CHAIN (attributes))
00703 pp_separate_with (pp, ',');
00704 }
00705 pp_c_right_paren (pp);
00706 pp_c_right_paren (pp);
00707 }
00708
00709
00710
00711
00712 void
00713 pp_c_function_definition (c_pretty_printer *pp, tree t)
00714 {
00715 pp_declaration_specifiers (pp, t);
00716 pp_declarator (pp, t);
00717 pp_needs_newline (pp) = true;
00718 pp_statement (pp, DECL_SAVED_TREE (t));
00719 pp_newline (pp);
00720 pp_flush (pp);
00721 }
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742 static void
00743 pp_c_char (c_pretty_printer *pp, int c)
00744 {
00745 if (ISPRINT (c))
00746 {
00747 switch (c)
00748 {
00749 case '\\': pp_string (pp, "\\\\"); break;
00750 case '\'': pp_string (pp, "\\\'"); break;
00751 case '\"': pp_string (pp, "\\\""); break;
00752 default: pp_character (pp, c);
00753 }
00754 }
00755 else
00756 pp_scalar (pp, "\\%03o", (unsigned) c);
00757 }
00758
00759
00760
00761 void
00762 pp_c_string_literal (c_pretty_printer *pp, tree s)
00763 {
00764 const char *p = TREE_STRING_POINTER (s);
00765 int n = TREE_STRING_LENGTH (s) - 1;
00766 int i;
00767 pp_doublequote (pp);
00768 for (i = 0; i < n; ++i)
00769 pp_c_char (pp, p[i]);
00770 pp_doublequote (pp);
00771 }
00772
00773
00774
00775 static void
00776 pp_c_integer_constant (c_pretty_printer *pp, tree i)
00777 {
00778 tree type = TREE_TYPE (i);
00779
00780 if (TREE_INT_CST_HIGH (i) == 0)
00781 pp_wide_integer (pp, TREE_INT_CST_LOW (i));
00782 else
00783 {
00784 if (tree_int_cst_sgn (i) < 0)
00785 {
00786 pp_character (pp, '-');
00787 i = build_int_cst_wide (NULL_TREE,
00788 -TREE_INT_CST_LOW (i),
00789 ~TREE_INT_CST_HIGH (i)
00790 + !TREE_INT_CST_LOW (i));
00791 }
00792 sprintf (pp_buffer (pp)->digit_buffer,
00793 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
00794 TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
00795 pp_string (pp, pp_buffer (pp)->digit_buffer);
00796 }
00797 if (TYPE_UNSIGNED (type))
00798 pp_character (pp, 'u');
00799 if (type == long_integer_type_node || type == long_unsigned_type_node)
00800 pp_character (pp, 'l');
00801 else if (type == long_long_integer_type_node
00802 || type == long_long_unsigned_type_node)
00803 pp_string (pp, "ll");
00804 }
00805
00806
00807
00808 static void
00809 pp_c_character_constant (c_pretty_printer *pp, tree c)
00810 {
00811 tree type = TREE_TYPE (c);
00812 if (type == wchar_type_node)
00813 pp_character (pp, 'L');
00814 pp_quote (pp);
00815 if (host_integerp (c, TYPE_UNSIGNED (type)))
00816 pp_c_char (pp, tree_low_cst (c, TYPE_UNSIGNED (type)));
00817 else
00818 pp_scalar (pp, "\\x%x", (unsigned) TREE_INT_CST_LOW (c));
00819 pp_quote (pp);
00820 }
00821
00822
00823
00824 static void
00825 pp_c_bool_constant (c_pretty_printer *pp, tree b)
00826 {
00827 if (b == boolean_false_node)
00828 {
00829 if (c_dialect_cxx ())
00830 pp_c_identifier (pp, "false");
00831 else if (flag_isoc99)
00832 pp_c_identifier (pp, "_False");
00833 else
00834 pp_unsupported_tree (pp, b);
00835 }
00836 else if (b == boolean_true_node)
00837 {
00838 if (c_dialect_cxx ())
00839 pp_c_identifier (pp, "true");
00840 else if (flag_isoc99)
00841 pp_c_identifier (pp, "_True");
00842 else
00843 pp_unsupported_tree (pp, b);
00844 }
00845 else if (TREE_CODE (b) == INTEGER_CST)
00846 pp_c_integer_constant (pp, b);
00847 else
00848 pp_unsupported_tree (pp, b);
00849 }
00850
00851
00852
00853
00854
00855
00856 static bool
00857 pp_c_enumeration_constant (c_pretty_printer *pp, tree e)
00858 {
00859 bool value_is_named = true;
00860 tree type = TREE_TYPE (e);
00861 tree value;
00862
00863
00864 for (value = TYPE_VALUES (type);
00865 value != NULL_TREE && !tree_int_cst_equal (TREE_VALUE (value), e);
00866 value = TREE_CHAIN (value))
00867 ;
00868
00869 if (value != NULL_TREE)
00870 pp_id_expression (pp, TREE_PURPOSE (value));
00871 else
00872 {
00873
00874 pp_c_type_cast (pp, type);
00875 value_is_named = false;
00876 }
00877
00878 return value_is_named;
00879 }
00880
00881
00882
00883 static void
00884 pp_c_floating_constant (c_pretty_printer *pp, tree r)
00885 {
00886 real_to_decimal (pp_buffer (pp)->digit_buffer, &TREE_REAL_CST (r),
00887 sizeof (pp_buffer (pp)->digit_buffer), 0, 1);
00888 pp_string (pp, pp_buffer(pp)->digit_buffer);
00889 if (TREE_TYPE (r) == float_type_node)
00890 pp_character (pp, 'f');
00891 else if (TREE_TYPE (r) == long_double_type_node)
00892 pp_character (pp, 'l');
00893 }
00894
00895
00896
00897
00898 static void
00899 pp_c_compound_literal (c_pretty_printer *pp, tree e)
00900 {
00901 tree type = TREE_TYPE (e);
00902 pp_c_type_cast (pp, type);
00903
00904 switch (TREE_CODE (type))
00905 {
00906 case RECORD_TYPE:
00907 case UNION_TYPE:
00908 case ARRAY_TYPE:
00909 case VECTOR_TYPE:
00910 case COMPLEX_TYPE:
00911 pp_c_brace_enclosed_initializer_list (pp, e);
00912 break;
00913
00914 default:
00915 pp_unsupported_tree (pp, e);
00916 break;
00917 }
00918 }
00919
00920
00921
00922
00923
00924
00925
00926 void
00927 pp_c_constant (c_pretty_printer *pp, tree e)
00928 {
00929 const enum tree_code code = TREE_CODE (e);
00930
00931 switch (code)
00932 {
00933 case INTEGER_CST:
00934 {
00935 tree type = TREE_TYPE (e);
00936 if (type == boolean_type_node)
00937 pp_c_bool_constant (pp, e);
00938 else if (type == char_type_node)
00939 pp_c_character_constant (pp, e);
00940 else if (TREE_CODE (type) == ENUMERAL_TYPE
00941 && pp_c_enumeration_constant (pp, e))
00942 ;
00943 else
00944 pp_c_integer_constant (pp, e);
00945 }
00946 break;
00947
00948 case REAL_CST:
00949 pp_c_floating_constant (pp, e);
00950 break;
00951
00952 case STRING_CST:
00953 pp_c_string_literal (pp, e);
00954 break;
00955
00956 default:
00957 pp_unsupported_tree (pp, e);
00958 break;
00959 }
00960 }
00961
00962
00963
00964 void
00965 pp_c_identifier (c_pretty_printer *pp, const char *id)
00966 {
00967 pp_c_maybe_whitespace (pp);
00968 pp_identifier (pp, id);
00969 pp_base (pp)->padding = pp_before;
00970 }
00971
00972
00973
00974
00975
00976
00977
00978
00979 void
00980 pp_c_primary_expression (c_pretty_printer *pp, tree e)
00981 {
00982 switch (TREE_CODE (e))
00983 {
00984 case VAR_DECL:
00985 case PARM_DECL:
00986 case FIELD_DECL:
00987 case CONST_DECL:
00988 case FUNCTION_DECL:
00989 case LABEL_DECL:
00990 pp_c_tree_decl_identifier (pp, e);
00991 break;
00992
00993 case IDENTIFIER_NODE:
00994 pp_c_tree_identifier (pp, e);
00995 break;
00996
00997 case ERROR_MARK:
00998 pp_c_identifier (pp, "<erroneous-expression>");
00999 break;
01000
01001 case RESULT_DECL:
01002 pp_c_identifier (pp, "<return-value>");
01003 break;
01004
01005 case INTEGER_CST:
01006 case REAL_CST:
01007 case STRING_CST:
01008 pp_c_constant (pp, e);
01009 break;
01010
01011 case TARGET_EXPR:
01012 pp_c_identifier (pp, "__builtin_memcpy");
01013 pp_c_left_paren (pp);
01014 pp_ampersand (pp);
01015 pp_primary_expression (pp, TREE_OPERAND (e, 0));
01016 pp_separate_with (pp, ',');
01017 pp_ampersand (pp);
01018 pp_initializer (pp, TREE_OPERAND (e, 1));
01019 if (TREE_OPERAND (e, 2))
01020 {
01021 pp_separate_with (pp, ',');
01022 pp_c_expression (pp, TREE_OPERAND (e, 2));
01023 }
01024 pp_c_right_paren (pp);
01025 break;
01026
01027 case STMT_EXPR:
01028 pp_c_left_paren (pp);
01029 pp_statement (pp, STMT_EXPR_STMT (e));
01030 pp_c_right_paren (pp);
01031 break;
01032
01033 default:
01034
01035 pp_c_left_paren (pp);
01036 pp_expression (pp, e);
01037 pp_c_right_paren (pp);
01038 break;
01039 }
01040 }
01041
01042
01043
01044
01045
01046
01047
01048 static void
01049 pp_c_initializer (c_pretty_printer *pp, tree e)
01050 {
01051 if (TREE_CODE (e) == CONSTRUCTOR)
01052 pp_c_brace_enclosed_initializer_list (pp, e);
01053 else
01054 pp_expression (pp, e);
01055 }
01056
01057
01058
01059
01060
01061 void
01062 pp_c_init_declarator (c_pretty_printer *pp, tree t)
01063 {
01064 pp_declarator (pp, t);
01065
01066
01067 if (TREE_CODE (t) != FUNCTION_DECL && DECL_INITIAL (t))
01068 {
01069 tree init = DECL_INITIAL (t);
01070
01071
01072
01073
01074 if (TREE_CODE (init) == TREE_LIST)
01075 {
01076 pp_c_left_paren (pp);
01077 pp_expression (pp, TREE_VALUE (init));
01078 pp_right_paren (pp);
01079 }
01080 else
01081 {
01082 pp_space (pp);
01083 pp_equal (pp);
01084 pp_space (pp);
01085 pp_c_initializer (pp, init);
01086 }
01087 }
01088 }
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105 static void
01106 pp_c_initializer_list (c_pretty_printer *pp, tree e)
01107 {
01108 tree type = TREE_TYPE (e);
01109 const enum tree_code code = TREE_CODE (type);
01110
01111 switch (code)
01112 {
01113 case RECORD_TYPE:
01114 case UNION_TYPE:
01115 case ARRAY_TYPE:
01116 {
01117 tree init = TREE_OPERAND (e, 0);
01118 for (; init != NULL_TREE; init = TREE_CHAIN (init))
01119 {
01120 if (code == RECORD_TYPE || code == UNION_TYPE)
01121 {
01122 pp_c_dot (pp);
01123 pp_c_primary_expression (pp, TREE_PURPOSE (init));
01124 }
01125 else
01126 {
01127 pp_c_left_bracket (pp);
01128 if (TREE_PURPOSE (init))
01129 pp_c_constant (pp, TREE_PURPOSE (init));
01130 pp_c_right_bracket (pp);
01131 }
01132 pp_c_whitespace (pp);
01133 pp_equal (pp);
01134 pp_c_whitespace (pp);
01135 pp_initializer (pp, TREE_VALUE (init));
01136 if (TREE_CHAIN (init))
01137 pp_separate_with (pp, ',');
01138 }
01139 }
01140 return;
01141
01142 case VECTOR_TYPE:
01143 if (TREE_CODE (e) == VECTOR_CST)
01144 pp_c_expression_list (pp, TREE_VECTOR_CST_ELTS (e));
01145 else if (TREE_CODE (e) == CONSTRUCTOR)
01146 pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
01147 else
01148 break;
01149 return;
01150
01151 case COMPLEX_TYPE:
01152 if (TREE_CODE (e) == CONSTRUCTOR)
01153 pp_c_expression_list (pp, CONSTRUCTOR_ELTS (e));
01154 else if (TREE_CODE (e) == COMPLEX_CST || TREE_CODE (e) == COMPLEX_EXPR)
01155 {
01156 const bool cst = TREE_CODE (e) == COMPLEX_CST;
01157 pp_expression (pp, cst ? TREE_REALPART (e) : TREE_OPERAND (e, 0));
01158 pp_separate_with (pp, ',');
01159 pp_expression (pp, cst ? TREE_IMAGPART (e) : TREE_OPERAND (e, 1));
01160 }
01161 else
01162 break;
01163 return;
01164
01165 default:
01166 break;
01167 }
01168
01169 pp_unsupported_tree (pp, type);
01170 }
01171
01172
01173
01174 static void
01175 pp_c_brace_enclosed_initializer_list (c_pretty_printer *pp, tree l)
01176 {
01177 pp_c_left_brace (pp);
01178 pp_c_initializer_list (pp, l);
01179 pp_c_right_brace (pp);
01180 }
01181
01182
01183
01184
01185
01186
01187
01188
01189 void
01190 pp_c_id_expression (c_pretty_printer *pp, tree t)
01191 {
01192 switch (TREE_CODE (t))
01193 {
01194 case VAR_DECL:
01195 case PARM_DECL:
01196 case CONST_DECL:
01197 case TYPE_DECL:
01198 case FUNCTION_DECL:
01199 case FIELD_DECL:
01200 case LABEL_DECL:
01201 pp_c_tree_decl_identifier (pp, t);
01202 break;
01203
01204 case IDENTIFIER_NODE:
01205 pp_c_tree_identifier (pp, t);
01206 break;
01207
01208 default:
01209 pp_unsupported_tree (pp, t);
01210 break;
01211 }
01212 }
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225 void
01226 pp_c_postfix_expression (c_pretty_printer *pp, tree e)
01227 {
01228 enum tree_code code = TREE_CODE (e);
01229 switch (code)
01230 {
01231 case POSTINCREMENT_EXPR:
01232 case POSTDECREMENT_EXPR:
01233 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
01234 pp_identifier (pp, code == POSTINCREMENT_EXPR ? "++" : "--");
01235 break;
01236
01237 case ARROW_EXPR:
01238 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
01239 pp_c_arrow (pp);
01240 break;
01241
01242 case ARRAY_REF:
01243 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
01244 pp_c_left_bracket (pp);
01245 pp_expression (pp, TREE_OPERAND (e, 1));
01246 pp_c_right_bracket (pp);
01247 break;
01248
01249 case CALL_EXPR:
01250 pp_postfix_expression (pp, TREE_OPERAND (e, 0));
01251 pp_c_call_argument_list (pp, TREE_OPERAND (e, 1));
01252 break;
01253
01254 case UNORDERED_EXPR:
01255 pp_c_identifier (pp, flag_isoc99
01256 ? "isunordered"
01257 : "__builtin_isunordered");
01258 goto two_args_fun;
01259
01260 case ORDERED_EXPR:
01261 pp_c_identifier (pp, flag_isoc99
01262 ? "!isunordered"
01263 : "!__builtin_isunordered");
01264 goto two_args_fun;
01265
01266 case UNLT_EXPR:
01267 pp_c_identifier (pp, flag_isoc99
01268 ? "!isgreaterequal"
01269 : "!__builtin_isgreaterequal");
01270 goto two_args_fun;
01271
01272 case UNLE_EXPR:
01273 pp_c_identifier (pp, flag_isoc99
01274 ? "!isgreater"
01275 : "!__builtin_isgreater");
01276 goto two_args_fun;
01277
01278 case UNGT_EXPR:
01279 pp_c_identifier (pp, flag_isoc99
01280 ? "!islessequal"
01281 : "!__builtin_islessequal");
01282 goto two_args_fun;
01283
01284 case UNGE_EXPR:
01285 pp_c_identifier (pp, flag_isoc99
01286 ? "!isless"
01287 : "!__builtin_isless");
01288 goto two_args_fun;
01289
01290 case UNEQ_EXPR:
01291 pp_c_identifier (pp, flag_isoc99
01292 ? "!islessgreater"
01293 : "!__builtin_islessgreater");
01294 goto two_args_fun;
01295
01296 case LTGT_EXPR:
01297 pp_c_identifier (pp, flag_isoc99
01298 ? "islessgreater"
01299 : "__builtin_islessgreater");
01300 goto two_args_fun;
01301
01302 two_args_fun:
01303 pp_c_left_paren (pp);
01304 pp_expression (pp, TREE_OPERAND (e, 0));
01305 pp_separate_with (pp, ',');
01306 pp_expression (pp, TREE_OPERAND (e, 1));
01307 pp_c_right_paren (pp);
01308 break;
01309
01310 case ABS_EXPR:
01311 pp_c_identifier (pp, "__builtin_abs");
01312 pp_c_left_paren (pp);
01313 pp_expression (pp, TREE_OPERAND (e, 0));
01314 pp_c_right_paren (pp);
01315 break;
01316
01317 case COMPONENT_REF:
01318 {
01319 tree object = TREE_OPERAND (e, 0);
01320 if (TREE_CODE (object) == INDIRECT_REF)
01321 {
01322 pp_postfix_expression (pp, TREE_OPERAND (object, 0));
01323 pp_c_arrow (pp);
01324 }
01325 else
01326 {
01327 pp_postfix_expression (pp, object);
01328 pp_c_dot (pp);
01329 }
01330 pp_expression (pp, TREE_OPERAND (e, 1));
01331 }
01332 break;
01333
01334 case COMPLEX_CST:
01335 case VECTOR_CST:
01336 case COMPLEX_EXPR:
01337 pp_c_compound_literal (pp, e);
01338 break;
01339
01340 case COMPOUND_LITERAL_EXPR:
01341 e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e));
01342
01343 case CONSTRUCTOR:
01344 pp_initializer (pp, e);
01345 break;
01346
01347 case VA_ARG_EXPR:
01348 pp_c_identifier (pp, "__builtin_va_arg");
01349 pp_c_left_paren (pp);
01350 pp_assignment_expression (pp, TREE_OPERAND (e, 0));
01351 pp_separate_with (pp, ',');
01352 pp_type_id (pp, TREE_TYPE (e));
01353 pp_c_right_paren (pp);
01354 break;
01355
01356 case ADDR_EXPR:
01357 if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL)
01358 {
01359 pp_c_id_expression (pp, TREE_OPERAND (e, 0));
01360 break;
01361 }
01362
01363
01364 default:
01365 pp_primary_expression (pp, e);
01366 break;
01367 }
01368 }
01369
01370
01371
01372 void
01373 pp_c_expression_list (c_pretty_printer *pp, tree e)
01374 {
01375 for (; e != NULL_TREE; e = TREE_CHAIN (e))
01376 {
01377 pp_expression (pp, TREE_VALUE (e));
01378 if (TREE_CHAIN (e))
01379 pp_separate_with (pp, ',');
01380 }
01381 }
01382
01383
01384
01385 void
01386 pp_c_call_argument_list (c_pretty_printer *pp, tree t)
01387 {
01388 pp_c_left_paren (pp);
01389 if (t && TREE_CODE (t) == TREE_LIST)
01390 pp_c_expression_list (pp, t);
01391 pp_c_right_paren (pp);
01392 }
01393
01394
01395
01396
01397
01398
01399
01400
01401
01402
01403
01404
01405
01406
01407
01408
01409
01410
01411
01412 void
01413 pp_c_unary_expression (c_pretty_printer *pp, tree e)
01414 {
01415 enum tree_code code = TREE_CODE (e);
01416 switch (code)
01417 {
01418 case PREINCREMENT_EXPR:
01419 case PREDECREMENT_EXPR:
01420 pp_identifier (pp, code == PREINCREMENT_EXPR ? "++" : "--");
01421 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
01422 break;
01423
01424 case ADDR_EXPR:
01425 case INDIRECT_REF:
01426 case NEGATE_EXPR:
01427 case BIT_NOT_EXPR:
01428 case TRUTH_NOT_EXPR:
01429 case CONJ_EXPR:
01430
01431 if (code == ADDR_EXPR && TREE_CODE (TREE_OPERAND (e, 0)) != STRING_CST)
01432 pp_ampersand (pp);
01433 else if (code == INDIRECT_REF)
01434 pp_c_star (pp);
01435 else if (code == NEGATE_EXPR)
01436 pp_minus (pp);
01437 else if (code == BIT_NOT_EXPR || code == CONJ_EXPR)
01438 pp_complement (pp);
01439 else if (code == TRUTH_NOT_EXPR)
01440 pp_exclamation (pp);
01441 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
01442 break;
01443
01444 case SIZEOF_EXPR:
01445 case ALIGNOF_EXPR:
01446 pp_c_identifier (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
01447 pp_c_whitespace (pp);
01448 if (TYPE_P (TREE_OPERAND (e, 0)))
01449 pp_c_type_cast (pp, TREE_OPERAND (e, 0));
01450 else
01451 pp_unary_expression (pp, TREE_OPERAND (e, 0));
01452 break;
01453
01454 case REALPART_EXPR:
01455 case IMAGPART_EXPR:
01456 pp_c_identifier (pp, code == REALPART_EXPR ? "__real__" : "__imag__");
01457 pp_c_whitespace (pp);
01458 pp_unary_expression (pp, TREE_OPERAND (e, 0));
01459 break;
01460
01461 default:
01462 pp_postfix_expression (pp, e);
01463 break;
01464 }
01465 }
01466
01467
01468
01469
01470
01471 void
01472 pp_c_cast_expression (c_pretty_printer *pp, tree e)
01473 {
01474 switch (TREE_CODE (e))
01475 {
01476 case FLOAT_EXPR:
01477 case FIX_TRUNC_EXPR:
01478 case CONVERT_EXPR:
01479 pp_c_type_cast (pp, TREE_TYPE (e));
01480 pp_c_cast_expression (pp, TREE_OPERAND (e, 0));
01481 break;
01482
01483 default:
01484 pp_unary_expression (pp, e);
01485 }
01486 }
01487
01488
01489
01490
01491
01492
01493
01494 static void
01495 pp_c_multiplicative_expression (c_pretty_printer *pp, tree e)
01496 {
01497 enum tree_code code = TREE_CODE (e);
01498 switch (code)
01499 {
01500 case MULT_EXPR:
01501 case TRUNC_DIV_EXPR:
01502 case TRUNC_MOD_EXPR:
01503 pp_multiplicative_expression (pp, TREE_OPERAND (e, 0));
01504 pp_c_whitespace (pp);
01505 if (code == MULT_EXPR)
01506 pp_c_star (pp);
01507 else if (code == TRUNC_DIV_EXPR)
01508 pp_slash (pp);
01509 else
01510 pp_modulo (pp);
01511 pp_c_whitespace (pp);
01512 pp_c_cast_expression (pp, TREE_OPERAND (e, 1));
01513 break;
01514
01515 default:
01516 pp_c_cast_expression (pp, e);
01517 break;
01518 }
01519 }
01520
01521
01522
01523
01524
01525
01526 static void
01527 pp_c_additive_expression (c_pretty_printer *pp, tree e)
01528 {
01529 enum tree_code code = TREE_CODE (e);
01530 switch (code)
01531 {
01532 case PLUS_EXPR:
01533 case MINUS_EXPR:
01534 pp_c_additive_expression (pp, TREE_OPERAND (e, 0));
01535 pp_c_whitespace (pp);
01536 if (code == PLUS_EXPR)
01537 pp_plus (pp);
01538 else
01539 pp_minus (pp);
01540 pp_c_whitespace (pp);
01541 pp_multiplicative_expression (pp, TREE_OPERAND (e, 1));
01542 break;
01543
01544 default:
01545 pp_multiplicative_expression (pp, e);
01546 break;
01547 }
01548 }
01549
01550
01551
01552
01553
01554
01555 static void
01556 pp_c_shift_expression (c_pretty_printer *pp, tree e)
01557 {
01558 enum tree_code code = TREE_CODE (e);
01559 switch (code)
01560 {
01561 case LSHIFT_EXPR:
01562 case RSHIFT_EXPR:
01563 pp_c_shift_expression (pp, TREE_OPERAND (e, 0));
01564 pp_c_whitespace (pp);
01565 pp_identifier (pp, code == LSHIFT_EXPR ? "<<" : ">>");
01566 pp_c_whitespace (pp);
01567 pp_c_additive_expression (pp, TREE_OPERAND (e, 1));
01568 break;
01569
01570 default:
01571 pp_c_additive_expression (pp, e);
01572 }
01573 }
01574
01575
01576
01577
01578
01579
01580
01581
01582 static void
01583 pp_c_relational_expression (c_pretty_printer *pp, tree e)
01584 {
01585 enum tree_code code = TREE_CODE (e);
01586 switch (code)
01587 {
01588 case LT_EXPR:
01589 case GT_EXPR:
01590 case LE_EXPR:
01591 case GE_EXPR:
01592 pp_c_relational_expression (pp, TREE_OPERAND (e, 0));
01593 pp_c_whitespace (pp);
01594 if (code == LT_EXPR)
01595 pp_less (pp);
01596 else if (code == GT_EXPR)
01597 pp_greater (pp);
01598 else if (code == LE_EXPR)
01599 pp_identifier (pp, "<=");
01600 else if (code == GE_EXPR)
01601 pp_identifier (pp, ">=");
01602 pp_c_whitespace (pp);
01603 pp_c_shift_expression (pp, TREE_OPERAND (e, 1));
01604 break;
01605
01606 default:
01607 pp_c_shift_expression (pp, e);
01608 break;
01609 }
01610 }
01611
01612
01613
01614
01615
01616
01617 static void
01618 pp_c_equality_expression (c_pretty_printer *pp, tree e)
01619 {
01620 enum tree_code code = TREE_CODE (e);
01621 switch (code)
01622 {
01623 case EQ_EXPR:
01624 case NE_EXPR:
01625 pp_c_equality_expression (pp, TREE_OPERAND (e, 0));
01626 pp_c_whitespace (pp);
01627 pp_identifier (pp, code == EQ_EXPR ? "==" : "!=");
01628 pp_c_whitespace (pp);
01629 pp_c_relational_expression (pp, TREE_OPERAND (e, 1));
01630 break;
01631
01632 default:
01633 pp_c_relational_expression (pp, e);
01634 break;
01635 }
01636 }
01637
01638
01639
01640
01641
01642 static void
01643 pp_c_and_expression (c_pretty_printer *pp, tree e)
01644 {
01645 if (TREE_CODE (e) == BIT_AND_EXPR)
01646 {
01647 pp_c_and_expression (pp, TREE_OPERAND (e, 0));
01648 pp_c_whitespace (pp);
01649 pp_ampersand (pp);
01650 pp_c_whitespace (pp);
01651 pp_c_equality_expression (pp, TREE_OPERAND (e, 1));
01652 }
01653 else
01654 pp_c_equality_expression (pp, e);
01655 }
01656
01657
01658
01659
01660
01661 static void
01662 pp_c_exclusive_or_expression (c_pretty_printer *pp, tree e)
01663 {
01664 if (TREE_CODE (e) == BIT_XOR_EXPR)
01665 {
01666 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
01667 pp_c_maybe_whitespace (pp);
01668 pp_carret (pp);
01669 pp_c_whitespace (pp);
01670 pp_c_and_expression (pp, TREE_OPERAND (e, 1));
01671 }
01672 else
01673 pp_c_and_expression (pp, e);
01674 }
01675
01676
01677
01678
01679
01680 static void
01681 pp_c_inclusive_or_expression (c_pretty_printer *pp, tree e)
01682 {
01683 if (TREE_CODE (e) == BIT_IOR_EXPR)
01684 {
01685 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 0));
01686 pp_c_whitespace (pp);
01687 pp_bar (pp);
01688 pp_c_whitespace (pp);
01689 pp_c_exclusive_or_expression (pp, TREE_OPERAND (e, 1));
01690 }
01691 else
01692 pp_c_exclusive_or_expression (pp, e);
01693 }
01694
01695
01696
01697
01698
01699 static void
01700 pp_c_logical_and_expression (c_pretty_printer *pp, tree e)
01701 {
01702 if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
01703 {
01704 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 0));
01705 pp_c_whitespace (pp);
01706 pp_identifier (pp, "&&");
01707 pp_c_whitespace (pp);
01708 pp_c_inclusive_or_expression (pp, TREE_OPERAND (e, 1));
01709 }
01710 else
01711 pp_c_inclusive_or_expression (pp, e);
01712 }
01713
01714
01715
01716
01717
01718 void
01719 pp_c_logical_or_expression (c_pretty_printer *pp, tree e)
01720 {
01721 if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
01722 {
01723 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
01724 pp_c_whitespace (pp);
01725 pp_identifier (pp, "||");
01726 pp_c_whitespace (pp);
01727 pp_c_logical_and_expression (pp, TREE_OPERAND (e, 1));
01728 }
01729 else
01730 pp_c_logical_and_expression (pp, e);
01731 }
01732
01733
01734
01735
01736
01737 static void
01738 pp_c_conditional_expression (c_pretty_printer *pp, tree e)
01739 {
01740 if (TREE_CODE (e) == COND_EXPR)
01741 {
01742 pp_c_logical_or_expression (pp, TREE_OPERAND (e, 0));
01743 pp_c_whitespace (pp);
01744 pp_question (pp);
01745 pp_c_whitespace (pp);
01746 pp_expression (pp, TREE_OPERAND (e, 1));
01747 pp_c_whitespace (pp);
01748 pp_colon (pp);
01749 pp_c_whitespace (pp);
01750 pp_c_conditional_expression (pp, TREE_OPERAND (e, 2));
01751 }
01752 else
01753 pp_c_logical_or_expression (pp, e);
01754 }
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764 static void
01765 pp_c_assignment_expression (c_pretty_printer *pp, tree e)
01766 {
01767 if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
01768 {
01769 pp_c_unary_expression (pp, TREE_OPERAND (e, 0));
01770 pp_c_whitespace (pp);
01771 pp_equal (pp);
01772 pp_space (pp);
01773 pp_c_expression (pp, TREE_OPERAND (e, 1));
01774 }
01775 else
01776 pp_c_conditional_expression (pp, e);
01777 }
01778
01779
01780
01781
01782
01783
01784
01785
01786
01787
01788
01789 void
01790 pp_c_expression (c_pretty_printer *pp, tree e)
01791 {
01792 switch (TREE_CODE (e))
01793 {
01794 case INTEGER_CST:
01795 pp_c_integer_constant (pp, e);
01796 break;
01797
01798 case REAL_CST:
01799 pp_c_floating_constant (pp, e);
01800 break;
01801
01802 case STRING_CST:
01803 pp_c_string_literal (pp, e);
01804 break;
01805
01806 case IDENTIFIER_NODE:
01807 case FUNCTION_DECL:
01808 case VAR_DECL:
01809 case CONST_DECL:
01810 case PARM_DECL:
01811 case RESULT_DECL:
01812 case FIELD_DECL:
01813 case LABEL_DECL:
01814 case ERROR_MARK:
01815 case STMT_EXPR:
01816 pp_primary_expression (pp, e);
01817 break;
01818
01819 case POSTINCREMENT_EXPR:
01820 case POSTDECREMENT_EXPR:
01821 case ARROW_EXPR:
01822 case ARRAY_REF:
01823 case CALL_EXPR:
01824 case COMPONENT_REF:
01825 case COMPLEX_CST:
01826 case COMPLEX_EXPR:
01827 case VECTOR_CST:
01828 case ORDERED_EXPR:
01829 case UNORDERED_EXPR:
01830 case LTGT_EXPR:
01831 case UNEQ_EXPR:
01832 case UNLE_EXPR:
01833 case UNLT_EXPR:
01834 case UNGE_EXPR:
01835 case UNGT_EXPR:
01836 case ABS_EXPR:
01837 case CONSTRUCTOR:
01838 case COMPOUND_LITERAL_EXPR:
01839 case VA_ARG_EXPR:
01840 pp_postfix_expression (pp, e);
01841 break;
01842
01843 case CONJ_EXPR:
01844 case ADDR_EXPR:
01845 case INDIRECT_REF:
01846 case NEGATE_EXPR:
01847 case BIT_NOT_EXPR:
01848 case TRUTH_NOT_EXPR:
01849 case PREINCREMENT_EXPR:
01850 case PREDECREMENT_EXPR:
01851 case SIZEOF_EXPR:
01852 case ALIGNOF_EXPR:
01853 case REALPART_EXPR:
01854 case IMAGPART_EXPR:
01855 pp_c_unary_expression (pp, e);
01856 break;
01857
01858 case FLOAT_EXPR:
01859 case FIX_TRUNC_EXPR:
01860 case CONVERT_EXPR:
01861 pp_c_cast_expression (pp, e);
01862 break;
01863
01864 case MULT_EXPR:
01865 case TRUNC_MOD_EXPR:
01866 case TRUNC_DIV_EXPR:
01867 pp_multiplicative_expression (pp, e);
01868 break;
01869
01870 case LSHIFT_EXPR:
01871 case RSHIFT_EXPR:
01872 pp_c_shift_expression (pp, e);
01873 break;
01874
01875 case LT_EXPR:
01876 case GT_EXPR:
01877 case LE_EXPR:
01878 case GE_EXPR:
01879 pp_c_relational_expression (pp, e);
01880 break;
01881
01882 case BIT_AND_EXPR:
01883 pp_c_and_expression (pp, e);
01884 break;
01885
01886 case BIT_XOR_EXPR:
01887 pp_c_exclusive_or_expression (pp, e);
01888 break;
01889
01890 case BIT_IOR_EXPR:
01891 pp_c_inclusive_or_expression (pp, e);
01892 break;
01893
01894 case TRUTH_ANDIF_EXPR:
01895 pp_c_logical_and_expression (pp, e);
01896 break;
01897
01898 case TRUTH_ORIF_EXPR:
01899 pp_c_logical_or_expression (pp, e);
01900 break;
01901
01902 case EQ_EXPR:
01903 case NE_EXPR:
01904 pp_c_equality_expression (pp, e);
01905 break;
01906
01907 case COND_EXPR:
01908 pp_conditional_expression (pp, e);
01909 break;
01910
01911 case PLUS_EXPR:
01912 case MINUS_EXPR:
01913 pp_c_additive_expression (pp, e);
01914 break;
01915
01916 case MODIFY_EXPR:
01917 case INIT_EXPR:
01918 pp_assignment_expression (pp, e);
01919 break;
01920
01921 case COMPOUND_EXPR:
01922 pp_c_left_paren (pp);
01923 pp_expression (pp, TREE_OPERAND (e, 0));
01924 pp_separate_with (pp, ',');
01925 pp_assignment_expression (pp, TREE_OPERAND (e, 1));
01926 pp_c_right_paren (pp);
01927 break;
01928
01929 case NOP_EXPR:
01930 case NON_LVALUE_EXPR:
01931 case SAVE_EXPR:
01932 pp_expression (pp, TREE_OPERAND (e, 0));
01933 break;
01934
01935 case TARGET_EXPR:
01936 pp_postfix_expression (pp, TREE_OPERAND (e, 1));
01937 break;
01938
01939 default:
01940 pp_unsupported_tree (pp, e);
01941 break;
01942 }
01943 }
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953
01954
01955
01956
01957 void
01958 pp_c_statement (c_pretty_printer *pp, tree stmt)
01959 {
01960 enum tree_code code;
01961
01962 if (stmt == NULL)
01963 return;
01964
01965 if (pp_needs_newline (pp))
01966 pp_newline_and_indent (pp, 0);
01967
01968 code = TREE_CODE (stmt);
01969 switch (code)
01970 {
01971
01972
01973 case EXPR_STMT:
01974 pp_expression (pp, EXPR_STMT_EXPR (stmt));
01975 pp_c_semicolon (pp);
01976 pp_needs_newline (pp) = true;
01977 break;
01978
01979 case SWITCH_STMT:
01980 pp_c_identifier (pp, "switch");
01981 pp_space (pp);
01982 pp_c_left_paren (pp);
01983 pp_expression (pp, SWITCH_COND (stmt));
01984 pp_c_right_paren (pp);
01985 pp_indentation (pp) += 3;
01986 pp_needs_newline (pp) = true;
01987 pp_statement (pp, SWITCH_BODY (stmt));
01988 pp_newline_and_indent (pp, -3);
01989 break;
01990
01991
01992
01993
01994
01995
01996 case WHILE_STMT:
01997 pp_c_identifier (pp, "while");
01998 pp_space (pp);
01999 pp_c_left_paren (pp);
02000 pp_expression (pp, WHILE_COND (stmt));
02001 pp_c_right_paren (pp);
02002 pp_newline_and_indent (pp, 3);
02003 pp_statement (pp, WHILE_BODY (stmt));
02004 pp_indentation (pp) -= 3;
02005 pp_needs_newline (pp) = true;
02006 break;
02007
02008 case DO_STMT:
02009 pp_c_identifier (pp, "do");
02010 pp_newline_and_indent (pp, 3);
02011 pp_statement (pp, DO_BODY (stmt));
02012 pp_newline_and_indent (pp, -3);
02013 pp_c_identifier (pp, "while");
02014 pp_space (pp);
02015 pp_c_left_paren (pp);
02016 pp_expression (pp, DO_COND (stmt));
02017 pp_c_right_paren (pp);
02018 pp_c_semicolon (pp);
02019 pp_needs_newline (pp) = true;
02020 break;
02021
02022 case FOR_STMT:
02023 pp_c_identifier (pp, "for");
02024 pp_space (pp);
02025 pp_c_left_paren (pp);
02026 if (FOR_INIT_STMT (stmt))
02027 pp_statement (pp, FOR_INIT_STMT (stmt));
02028 else
02029 pp_c_semicolon (pp);
02030 pp_needs_newline (pp) = false;
02031 pp_c_whitespace (pp);
02032 if (FOR_COND (stmt))
02033 pp_expression (pp, FOR_COND (stmt));
02034 pp_c_semicolon (pp);
02035 pp_needs_newline (pp) = false;
02036 pp_c_whitespace (pp);
02037 if (FOR_EXPR (stmt))
02038 pp_expression (pp, FOR_EXPR (stmt));
02039 pp_c_right_paren (pp);
02040 pp_newline_and_indent (pp, 3);
02041 pp_statement (pp, FOR_BODY (stmt));
02042 pp_indentation (pp) -= 3;
02043 pp_needs_newline (pp) = true;
02044 break;
02045
02046
02047
02048
02049
02050 case BREAK_STMT:
02051 case CONTINUE_STMT:
02052 pp_identifier (pp, code == BREAK_STMT ? "break" : "continue");
02053 pp_c_semicolon (pp);
02054 pp_needs_newline (pp) = true;
02055 break;
02056
02057 default:
02058 dump_generic_node (pp_base (pp), stmt, pp_indentation (pp), 0, true);
02059 break;
02060 }
02061 }
02062
02063
02064
02065
02066 void
02067 pp_c_pretty_printer_init (c_pretty_printer *pp)
02068 {
02069 pp->offset_list = 0;
02070
02071 pp->declaration = pp_c_declaration;
02072 pp->declaration_specifiers = pp_c_declaration_specifiers;
02073 pp->declarator = pp_c_declarator;
02074 pp->direct_declarator = pp_c_direct_declarator;
02075 pp->type_specifier_seq = pp_c_specifier_qualifier_list;
02076 pp->abstract_declarator = pp_c_abstract_declarator;
02077 pp->direct_abstract_declarator = pp_c_direct_abstract_declarator;
02078 pp->ptr_operator = pp_c_pointer;
02079 pp->parameter_list = pp_c_parameter_type_list;
02080 pp->type_id = pp_c_type_id;
02081 pp->simple_type_specifier = pp_c_type_specifier;
02082 pp->function_specifier = pp_c_function_specifier;
02083 pp->storage_class_specifier = pp_c_storage_class_specifier;
02084
02085 pp->statement = pp_c_statement;
02086
02087 pp->id_expression = pp_c_id_expression;
02088 pp->primary_expression = pp_c_primary_expression;
02089 pp->postfix_expression = pp_c_postfix_expression;
02090 pp->unary_expression = pp_c_unary_expression;
02091 pp->initializer = pp_c_initializer;
02092 pp->multiplicative_expression = pp_c_multiplicative_expression;
02093 pp->conditional_expression = pp_c_conditional_expression;
02094 pp->assignment_expression = pp_c_assignment_expression;
02095 pp->expression = pp_c_expression;
02096 }
02097
02098
02099
02100
02101 void
02102 print_c_tree (FILE *file, tree t)
02103 {
02104 static c_pretty_printer pp_rec;
02105 static bool initialized = 0;
02106 c_pretty_printer *pp = &pp_rec;
02107
02108 if (!initialized)
02109 {
02110 initialized = 1;
02111 pp_construct (pp_base (pp), NULL, 0);
02112 pp_c_pretty_printer_init (pp);
02113 pp_needs_newline (pp) = true;
02114 }
02115 pp_base (pp)->buffer->stream = file;
02116
02117 pp_statement (pp, t);
02118
02119 pp_newline (pp);
02120 pp_flush (pp);
02121 }
02122
02123
02124
02125 void
02126 debug_c_tree (tree t)
02127 {
02128 print_c_tree (stderr, t);
02129 fputc ('\n', stderr);
02130 }
02131
02132
02133
02134
02135 void
02136 pp_c_tree_decl_identifier (c_pretty_printer *pp, tree t)
02137 {
02138 const char *name;
02139
02140 gcc_assert (DECL_P (t));
02141
02142 if (DECL_NAME (t))
02143 name = IDENTIFIER_POINTER (DECL_NAME (t));
02144 else
02145 {
02146 static char xname[8];
02147 sprintf (xname, "<U%4x>", ((unsigned)((unsigned long)(t) & 0xffff)));
02148 name = xname;
02149 }
02150
02151 pp_c_identifier (pp, name);
02152 }