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