1 /* Demangler for g++ V3 ABI. 2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 3 Free Software Foundation, Inc. 4 Written by Ian Lance Taylor <ian@wasabisystems.com>. 5 6 This file is part of the libiberty library, which is part of GCC. 7 8 This file is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 In addition to the permissions in the GNU General Public License, the 14 Free Software Foundation gives you unlimited permission to link the 15 compiled version of this file into combinations with other programs, 16 and to distribute those combinations without any restriction coming 17 from the use of this file. (The General Public License restrictions 18 do apply in other respects; for example, they cover modification of 19 the file, and distribution when not linked into a combined 20 executable.) 21 22 This program is distributed in the hope that it will be useful, 23 but WITHOUT ANY WARRANTY; without even the implied warranty of 24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 GNU General Public License for more details. 26 27 You should have received a copy of the GNU General Public License 28 along with this program; if not, write to the Free Software 29 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 30 */ 31 32 /* This code implements a demangler for the g++ V3 ABI. The ABI is 33 described on this web page: 34 http://www.codesourcery.com/cxx-abi/abi.html#mangling 35 36 This code was written while looking at the demangler written by 37 Alex Samuel <samuel@codesourcery.com>. 38 39 This code first pulls the mangled name apart into a list of 40 components, and then walks the list generating the demangled 41 name. 42 43 This file will normally define the following functions, q.v.: 44 char *cplus_demangle_v3(const char *mangled, int options) 45 char *java_demangle_v3(const char *mangled) 46 int cplus_demangle_v3_callback(const char *mangled, int options, 47 demangle_callbackref callback) 48 int java_demangle_v3_callback(const char *mangled, 49 demangle_callbackref callback) 50 enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name) 51 enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name) 52 53 Also, the interface to the component list is public, and defined in 54 demangle.h. The interface consists of these types, which are 55 defined in demangle.h: 56 enum demangle_component_type 57 struct demangle_component 58 demangle_callbackref 59 and these functions defined in this file: 60 cplus_demangle_fill_name 61 cplus_demangle_fill_extended_operator 62 cplus_demangle_fill_ctor 63 cplus_demangle_fill_dtor 64 cplus_demangle_print 65 cplus_demangle_print_callback 66 and other functions defined in the file cp-demint.c. 67 68 This file also defines some other functions and variables which are 69 only to be used by the file cp-demint.c. 70 71 Preprocessor macros you can define while compiling this file: 72 73 IN_LIBGCC2 74 If defined, this file defines the following functions, q.v.: 75 char *__cxa_demangle (const char *mangled, char *buf, size_t *len, 76 int *status) 77 int __gcclibcxx_demangle_callback (const char *, 78 void (*) 79 (const char *, size_t, void *), 80 void *) 81 instead of cplus_demangle_v3[_callback]() and 82 java_demangle_v3[_callback](). 83 84 IN_GLIBCPP_V3 85 If defined, this file defines only __cxa_demangle() and 86 __gcclibcxx_demangle_callback(), and no other publically visible 87 functions or variables. 88 89 STANDALONE_DEMANGLER 90 If defined, this file defines a main() function which demangles 91 any arguments, or, if none, demangles stdin. 92 93 CP_DEMANGLE_DEBUG 94 If defined, turns on debugging mode, which prints information on 95 stdout about the mangled string. This is not generally useful. 96 */ 97 98 #if defined (_AIX) && !defined (__GNUC__) 99 #pragma alloca 100 #endif 101 102 #ifdef HAVE_CONFIG_H 103 #include "config.h" 104 #endif 105 106 #include <stdio.h> 107 108 #ifdef HAVE_STDLIB_H 109 #include <stdlib.h> 110 #endif 111 #ifdef HAVE_STRING_H 112 #include <string.h> 113 #endif 114 115 #ifdef HAVE_ALLOCA_H 116 # include <alloca.h> 117 #else 118 # ifndef alloca 119 # ifdef __GNUC__ 120 # define alloca __builtin_alloca 121 # else 122 extern char *alloca (); 123 # endif /* __GNUC__ */ 124 # endif /* alloca */ 125 #endif /* HAVE_ALLOCA_H */ 126 127 #include "ansidecl.h" 128 #include "libiberty.h" 129 #include "demangle.h" 130 #include "cp-demangle.h" 131 132 /* If IN_GLIBCPP_V3 is defined, some functions are made static. We 133 also rename them via #define to avoid compiler errors when the 134 static definition conflicts with the extern declaration in a header 135 file. */ 136 #ifdef IN_GLIBCPP_V3 137 138 #define CP_STATIC_IF_GLIBCPP_V3 static 139 140 #define cplus_demangle_fill_name d_fill_name 141 static int d_fill_name (struct demangle_component *, const char *, int); 142 143 #define cplus_demangle_fill_extended_operator d_fill_extended_operator 144 static int 145 d_fill_extended_operator (struct demangle_component *, int, 146 struct demangle_component *); 147 148 #define cplus_demangle_fill_ctor d_fill_ctor 149 static int 150 d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds, 151 struct demangle_component *); 152 153 #define cplus_demangle_fill_dtor d_fill_dtor 154 static int 155 d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds, 156 struct demangle_component *); 157 158 #define cplus_demangle_mangled_name d_mangled_name 159 static struct demangle_component *d_mangled_name (struct d_info *, int); 160 161 #define cplus_demangle_type d_type 162 static struct demangle_component *d_type (struct d_info *); 163 164 #define cplus_demangle_print d_print 165 static char *d_print (int, const struct demangle_component *, int, size_t *); 166 167 #define cplus_demangle_print_callback d_print_callback 168 static int d_print_callback (int, const struct demangle_component *, 169 demangle_callbackref, void *); 170 171 #define cplus_demangle_init_info d_init_info 172 static void d_init_info (const char *, int, size_t, struct d_info *); 173 174 #else /* ! defined(IN_GLIBCPP_V3) */ 175 #define CP_STATIC_IF_GLIBCPP_V3 176 #endif /* ! defined(IN_GLIBCPP_V3) */ 177 178 /* See if the compiler supports dynamic arrays. */ 179 180 #ifdef __GNUC__ 181 #define CP_DYNAMIC_ARRAYS 182 #else 183 #ifdef __STDC__ 184 #ifdef __STDC_VERSION__ 185 #if __STDC_VERSION__ >= 199901L 186 #define CP_DYNAMIC_ARRAYS 187 #endif /* __STDC__VERSION >= 199901L */ 188 #endif /* defined (__STDC_VERSION__) */ 189 #endif /* defined (__STDC__) */ 190 #endif /* ! defined (__GNUC__) */ 191 192 /* We avoid pulling in the ctype tables, to prevent pulling in 193 additional unresolved symbols when this code is used in a library. 194 FIXME: Is this really a valid reason? This comes from the original 195 V3 demangler code. 196 197 As of this writing this file has the following undefined references 198 when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy, 199 strcat, strlen. */ 200 201 #define IS_DIGIT(c) ((c) >= '0' && (c) <= '9') 202 #define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z') 203 #define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z') 204 205 /* The prefix prepended by GCC to an identifier represnting the 206 anonymous namespace. */ 207 #define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_" 208 #define ANONYMOUS_NAMESPACE_PREFIX_LEN \ 209 (sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1) 210 211 /* Information we keep for the standard substitutions. */ 212 213 struct d_standard_sub_info 214 { 215 /* The code for this substitution. */ 216 char code; 217 /* The simple string it expands to. */ 218 const char *simple_expansion; 219 /* The length of the simple expansion. */ 220 int simple_len; 221 /* The results of a full, verbose, expansion. This is used when 222 qualifying a constructor/destructor, or when in verbose mode. */ 223 const char *full_expansion; 224 /* The length of the full expansion. */ 225 int full_len; 226 /* What to set the last_name field of d_info to; NULL if we should 227 not set it. This is only relevant when qualifying a 228 constructor/destructor. */ 229 const char *set_last_name; 230 /* The length of set_last_name. */ 231 int set_last_name_len; 232 }; 233 234 /* Accessors for subtrees of struct demangle_component. */ 235 236 #define d_left(dc) ((dc)->u.s_binary.left) 237 #define d_right(dc) ((dc)->u.s_binary.right) 238 239 /* A list of templates. This is used while printing. */ 240 241 struct d_print_template 242 { 243 /* Next template on the list. */ 244 struct d_print_template *next; 245 /* This template. */ 246 const struct demangle_component *template_decl; 247 }; 248 249 /* A list of type modifiers. This is used while printing. */ 250 251 struct d_print_mod 252 { 253 /* Next modifier on the list. These are in the reverse of the order 254 in which they appeared in the mangled string. */ 255 struct d_print_mod *next; 256 /* The modifier. */ 257 const struct demangle_component *mod; 258 /* Whether this modifier was printed. */ 259 int printed; 260 /* The list of templates which applies to this modifier. */ 261 struct d_print_template *templates; 262 }; 263 264 /* We use these structures to hold information during printing. */ 265 266 struct d_growable_string 267 { 268 /* Buffer holding the result. */ 269 char *buf; 270 /* Current length of data in buffer. */ 271 size_t len; 272 /* Allocated size of buffer. */ 273 size_t alc; 274 /* Set to 1 if we had a memory allocation failure. */ 275 int allocation_failure; 276 }; 277 278 enum { D_PRINT_BUFFER_LENGTH = 256 }; 279 struct d_print_info 280 { 281 /* Fixed-length allocated buffer for demangled data, flushed to the 282 callback with a NUL termination once full. */ 283 char buf[D_PRINT_BUFFER_LENGTH]; 284 /* Current length of data in buffer. */ 285 size_t len; 286 /* The last character printed, saved individually so that it survives 287 any buffer flush. */ 288 char last_char; 289 /* Callback function to handle demangled buffer flush. */ 290 demangle_callbackref callback; 291 /* Opaque callback argument. */ 292 void *opaque; 293 /* The current list of templates, if any. */ 294 struct d_print_template *templates; 295 /* The current list of modifiers (e.g., pointer, reference, etc.), 296 if any. */ 297 struct d_print_mod *modifiers; 298 /* Set to 1 if we saw a demangling error. */ 299 int demangle_failure; 300 /* The current index into any template argument packs we are using 301 for printing. */ 302 int pack_index; 303 /* Number of d_print_flush calls so far. */ 304 unsigned long int flush_count; 305 }; 306 307 #ifdef CP_DEMANGLE_DEBUG 308 static void d_dump (struct demangle_component *, int); 309 #endif 310 311 static struct demangle_component * 312 d_make_empty (struct d_info *); 313 314 static struct demangle_component * 315 d_make_comp (struct d_info *, enum demangle_component_type, 316 struct demangle_component *, 317 struct demangle_component *); 318 319 static struct demangle_component * 320 d_make_name (struct d_info *, const char *, int); 321 322 static struct demangle_component * 323 d_make_demangle_mangled_name (struct d_info *, const char *); 324 325 static struct demangle_component * 326 d_make_builtin_type (struct d_info *, 327 const struct demangle_builtin_type_info *); 328 329 static struct demangle_component * 330 d_make_operator (struct d_info *, 331 const struct demangle_operator_info *); 332 333 static struct demangle_component * 334 d_make_extended_operator (struct d_info *, int, 335 struct demangle_component *); 336 337 static struct demangle_component * 338 d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds, 339 struct demangle_component *); 340 341 static struct demangle_component * 342 d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds, 343 struct demangle_component *); 344 345 static struct demangle_component * 346 d_make_template_param (struct d_info *, long); 347 348 static struct demangle_component * 349 d_make_sub (struct d_info *, const char *, int); 350 351 static int 352 has_return_type (struct demangle_component *); 353 354 static int 355 is_ctor_dtor_or_conversion (struct demangle_component *); 356 357 static struct demangle_component *d_encoding (struct d_info *, int); 358 359 static struct demangle_component *d_name (struct d_info *); 360 361 static struct demangle_component *d_nested_name (struct d_info *); 362 363 static struct demangle_component *d_prefix (struct d_info *); 364 365 static struct demangle_component *d_unqualified_name (struct d_info *); 366 367 static struct demangle_component *d_source_name (struct d_info *); 368 369 static long d_number (struct d_info *); 370 371 static struct demangle_component *d_identifier (struct d_info *, int); 372 373 static struct demangle_component *d_operator_name (struct d_info *); 374 375 static struct demangle_component *d_special_name (struct d_info *); 376 377 static int d_call_offset (struct d_info *, int); 378 379 static struct demangle_component *d_ctor_dtor_name (struct d_info *); 380 381 static struct demangle_component ** 382 d_cv_qualifiers (struct d_info *, struct demangle_component **, int); 383 384 static struct demangle_component * 385 d_function_type (struct d_info *); 386 387 static struct demangle_component * 388 d_bare_function_type (struct d_info *, int); 389 390 static struct demangle_component * 391 d_class_enum_type (struct d_info *); 392 393 static struct demangle_component *d_array_type (struct d_info *); 394 395 static struct demangle_component *d_vector_type (struct d_info *); 396 397 static struct demangle_component * 398 d_pointer_to_member_type (struct d_info *); 399 400 static struct demangle_component * 401 d_template_param (struct d_info *); 402 403 static struct demangle_component *d_template_args (struct d_info *); 404 405 static struct demangle_component * 406 d_template_arg (struct d_info *); 407 408 static struct demangle_component *d_expression (struct d_info *); 409 410 static struct demangle_component *d_expr_primary (struct d_info *); 411 412 static struct demangle_component *d_local_name (struct d_info *); 413 414 static int d_discriminator (struct d_info *); 415 416 static struct demangle_component *d_lambda (struct d_info *); 417 418 static struct demangle_component *d_unnamed_type (struct d_info *); 419 420 static struct demangle_component * 421 d_clone_suffix (struct d_info *, struct demangle_component *); 422 423 static int 424 d_add_substitution (struct d_info *, struct demangle_component *); 425 426 static struct demangle_component *d_substitution (struct d_info *, int); 427 428 static void d_growable_string_init (struct d_growable_string *, size_t); 429 430 static inline void 431 d_growable_string_resize (struct d_growable_string *, size_t); 432 433 static inline void 434 d_growable_string_append_buffer (struct d_growable_string *, 435 const char *, size_t); 436 static void 437 d_growable_string_callback_adapter (const char *, size_t, void *); 438 439 static void 440 d_print_init (struct d_print_info *, demangle_callbackref, void *); 441 442 static inline void d_print_error (struct d_print_info *); 443 444 static inline int d_print_saw_error (struct d_print_info *); 445 446 static inline void d_print_flush (struct d_print_info *); 447 448 static inline void d_append_char (struct d_print_info *, char); 449 450 static inline void d_append_buffer (struct d_print_info *, 451 const char *, size_t); 452 453 static inline void d_append_string (struct d_print_info *, const char *); 454 455 static inline char d_last_char (struct d_print_info *); 456 457 static void 458 d_print_comp (struct d_print_info *, int, const struct demangle_component *); 459 460 static void 461 d_print_java_identifier (struct d_print_info *, const char *, int); 462 463 static void 464 d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int); 465 466 static void 467 d_print_mod (struct d_print_info *, int, const struct demangle_component *); 468 469 static void 470 d_print_function_type (struct d_print_info *, int, 471 const struct demangle_component *, 472 struct d_print_mod *); 473 474 static void 475 d_print_array_type (struct d_print_info *, int, 476 const struct demangle_component *, 477 struct d_print_mod *); 478 479 static void 480 d_print_expr_op (struct d_print_info *, int, const struct demangle_component *); 481 482 static void 483 d_print_cast (struct d_print_info *, int, const struct demangle_component *); 484 485 static int d_demangle_callback (const char *, int, 486 demangle_callbackref, void *); 487 static char *d_demangle (const char *, int, size_t *); 488 489 #ifdef CP_DEMANGLE_DEBUG 490 491 static void 492 d_dump (struct demangle_component *dc, int indent) 493 { 494 int i; 495 496 if (dc == NULL) 497 { 498 if (indent == 0) 499 printf ("failed demangling\n"); 500 return; 501 } 502 503 for (i = 0; i < indent; ++i) 504 putchar (' '); 505 506 switch (dc->type) 507 { 508 case DEMANGLE_COMPONENT_NAME: 509 printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s); 510 return; 511 case DEMANGLE_COMPONENT_TEMPLATE_PARAM: 512 printf ("template parameter %ld\n", dc->u.s_number.number); 513 return; 514 case DEMANGLE_COMPONENT_CTOR: 515 printf ("constructor %d\n", (int) dc->u.s_ctor.kind); 516 d_dump (dc->u.s_ctor.name, indent + 2); 517 return; 518 case DEMANGLE_COMPONENT_DTOR: 519 printf ("destructor %d\n", (int) dc->u.s_dtor.kind); 520 d_dump (dc->u.s_dtor.name, indent + 2); 521 return; 522 case DEMANGLE_COMPONENT_SUB_STD: 523 printf ("standard substitution %s\n", dc->u.s_string.string); 524 return; 525 case DEMANGLE_COMPONENT_BUILTIN_TYPE: 526 printf ("builtin type %s\n", dc->u.s_builtin.type->name); 527 return; 528 case DEMANGLE_COMPONENT_OPERATOR: 529 printf ("operator %s\n", dc->u.s_operator.op->name); 530 return; 531 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: 532 printf ("extended operator with %d args\n", 533 dc->u.s_extended_operator.args); 534 d_dump (dc->u.s_extended_operator.name, indent + 2); 535 return; 536 537 case DEMANGLE_COMPONENT_QUAL_NAME: 538 printf ("qualified name\n"); 539 break; 540 case DEMANGLE_COMPONENT_LOCAL_NAME: 541 printf ("local name\n"); 542 break; 543 case DEMANGLE_COMPONENT_TYPED_NAME: 544 printf ("typed name\n"); 545 break; 546 case DEMANGLE_COMPONENT_TEMPLATE: 547 printf ("template\n"); 548 break; 549 case DEMANGLE_COMPONENT_VTABLE: 550 printf ("vtable\n"); 551 break; 552 case DEMANGLE_COMPONENT_VTT: 553 printf ("VTT\n"); 554 break; 555 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: 556 printf ("construction vtable\n"); 557 break; 558 case DEMANGLE_COMPONENT_TYPEINFO: 559 printf ("typeinfo\n"); 560 break; 561 case DEMANGLE_COMPONENT_TYPEINFO_NAME: 562 printf ("typeinfo name\n"); 563 break; 564 case DEMANGLE_COMPONENT_TYPEINFO_FN: 565 printf ("typeinfo function\n"); 566 break; 567 case DEMANGLE_COMPONENT_THUNK: 568 printf ("thunk\n"); 569 break; 570 case DEMANGLE_COMPONENT_VIRTUAL_THUNK: 571 printf ("virtual thunk\n"); 572 break; 573 case DEMANGLE_COMPONENT_COVARIANT_THUNK: 574 printf ("covariant thunk\n"); 575 break; 576 case DEMANGLE_COMPONENT_JAVA_CLASS: 577 printf ("java class\n"); 578 break; 579 case DEMANGLE_COMPONENT_GUARD: 580 printf ("guard\n"); 581 break; 582 case DEMANGLE_COMPONENT_REFTEMP: 583 printf ("reference temporary\n"); 584 break; 585 case DEMANGLE_COMPONENT_HIDDEN_ALIAS: 586 printf ("hidden alias\n"); 587 break; 588 case DEMANGLE_COMPONENT_TRANSACTION_CLONE: 589 printf ("transaction clone\n"); 590 break; 591 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE: 592 printf ("non-transaction clone\n"); 593 break; 594 case DEMANGLE_COMPONENT_RESTRICT: 595 printf ("restrict\n"); 596 break; 597 case DEMANGLE_COMPONENT_VOLATILE: 598 printf ("volatile\n"); 599 break; 600 case DEMANGLE_COMPONENT_CONST: 601 printf ("const\n"); 602 break; 603 case DEMANGLE_COMPONENT_RESTRICT_THIS: 604 printf ("restrict this\n"); 605 break; 606 case DEMANGLE_COMPONENT_VOLATILE_THIS: 607 printf ("volatile this\n"); 608 break; 609 case DEMANGLE_COMPONENT_CONST_THIS: 610 printf ("const this\n"); 611 break; 612 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: 613 printf ("vendor type qualifier\n"); 614 break; 615 case DEMANGLE_COMPONENT_POINTER: 616 printf ("pointer\n"); 617 break; 618 case DEMANGLE_COMPONENT_REFERENCE: 619 printf ("reference\n"); 620 break; 621 case DEMANGLE_COMPONENT_RVALUE_REFERENCE: 622 printf ("rvalue reference\n"); 623 break; 624 case DEMANGLE_COMPONENT_COMPLEX: 625 printf ("complex\n"); 626 break; 627 case DEMANGLE_COMPONENT_IMAGINARY: 628 printf ("imaginary\n"); 629 break; 630 case DEMANGLE_COMPONENT_VENDOR_TYPE: 631 printf ("vendor type\n"); 632 break; 633 case DEMANGLE_COMPONENT_FUNCTION_TYPE: 634 printf ("function type\n"); 635 break; 636 case DEMANGLE_COMPONENT_ARRAY_TYPE: 637 printf ("array type\n"); 638 break; 639 case DEMANGLE_COMPONENT_PTRMEM_TYPE: 640 printf ("pointer to member type\n"); 641 break; 642 case DEMANGLE_COMPONENT_FIXED_TYPE: 643 printf ("fixed-point type\n"); 644 break; 645 case DEMANGLE_COMPONENT_ARGLIST: 646 printf ("argument list\n"); 647 break; 648 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: 649 printf ("template argument list\n"); 650 break; 651 case DEMANGLE_COMPONENT_INITIALIZER_LIST: 652 printf ("initializer list\n"); 653 break; 654 case DEMANGLE_COMPONENT_CAST: 655 printf ("cast\n"); 656 break; 657 case DEMANGLE_COMPONENT_NULLARY: 658 printf ("nullary operator\n"); 659 break; 660 case DEMANGLE_COMPONENT_UNARY: 661 printf ("unary operator\n"); 662 break; 663 case DEMANGLE_COMPONENT_BINARY: 664 printf ("binary operator\n"); 665 break; 666 case DEMANGLE_COMPONENT_BINARY_ARGS: 667 printf ("binary operator arguments\n"); 668 break; 669 case DEMANGLE_COMPONENT_TRINARY: 670 printf ("trinary operator\n"); 671 break; 672 case DEMANGLE_COMPONENT_TRINARY_ARG1: 673 printf ("trinary operator arguments 1\n"); 674 break; 675 case DEMANGLE_COMPONENT_TRINARY_ARG2: 676 printf ("trinary operator arguments 1\n"); 677 break; 678 case DEMANGLE_COMPONENT_LITERAL: 679 printf ("literal\n"); 680 break; 681 case DEMANGLE_COMPONENT_LITERAL_NEG: 682 printf ("negative literal\n"); 683 break; 684 case DEMANGLE_COMPONENT_JAVA_RESOURCE: 685 printf ("java resource\n"); 686 break; 687 case DEMANGLE_COMPONENT_COMPOUND_NAME: 688 printf ("compound name\n"); 689 break; 690 case DEMANGLE_COMPONENT_CHARACTER: 691 printf ("character '%c'\n", dc->u.s_character.character); 692 return; 693 case DEMANGLE_COMPONENT_DECLTYPE: 694 printf ("decltype\n"); 695 break; 696 case DEMANGLE_COMPONENT_PACK_EXPANSION: 697 printf ("pack expansion\n"); 698 break; 699 } 700 701 d_dump (d_left (dc), indent + 2); 702 d_dump (d_right (dc), indent + 2); 703 } 704 705 #endif /* CP_DEMANGLE_DEBUG */ 706 707 /* Fill in a DEMANGLE_COMPONENT_NAME. */ 708 709 CP_STATIC_IF_GLIBCPP_V3 710 int 711 cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len) 712 { 713 if (p == NULL || s == NULL || len == 0) 714 return 0; 715 p->type = DEMANGLE_COMPONENT_NAME; 716 p->u.s_name.s = s; 717 p->u.s_name.len = len; 718 return 1; 719 } 720 721 /* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */ 722 723 CP_STATIC_IF_GLIBCPP_V3 724 int 725 cplus_demangle_fill_extended_operator (struct demangle_component *p, int args, 726 struct demangle_component *name) 727 { 728 if (p == NULL || args < 0 || name == NULL) 729 return 0; 730 p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR; 731 p->u.s_extended_operator.args = args; 732 p->u.s_extended_operator.name = name; 733 return 1; 734 } 735 736 /* Fill in a DEMANGLE_COMPONENT_CTOR. */ 737 738 CP_STATIC_IF_GLIBCPP_V3 739 int 740 cplus_demangle_fill_ctor (struct demangle_component *p, 741 enum gnu_v3_ctor_kinds kind, 742 struct demangle_component *name) 743 { 744 if (p == NULL 745 || name == NULL 746 || (int) kind < gnu_v3_complete_object_ctor 747 || (int) kind > gnu_v3_object_ctor_group) 748 return 0; 749 p->type = DEMANGLE_COMPONENT_CTOR; 750 p->u.s_ctor.kind = kind; 751 p->u.s_ctor.name = name; 752 return 1; 753 } 754 755 /* Fill in a DEMANGLE_COMPONENT_DTOR. */ 756 757 CP_STATIC_IF_GLIBCPP_V3 758 int 759 cplus_demangle_fill_dtor (struct demangle_component *p, 760 enum gnu_v3_dtor_kinds kind, 761 struct demangle_component *name) 762 { 763 if (p == NULL 764 || name == NULL 765 || (int) kind < gnu_v3_deleting_dtor 766 || (int) kind > gnu_v3_object_dtor_group) 767 return 0; 768 p->type = DEMANGLE_COMPONENT_DTOR; 769 p->u.s_dtor.kind = kind; 770 p->u.s_dtor.name = name; 771 return 1; 772 } 773 774 /* Add a new component. */ 775 776 static struct demangle_component * 777 d_make_empty (struct d_info *di) 778 { 779 struct demangle_component *p; 780 781 if (di->next_comp >= di->num_comps) 782 return NULL; 783 p = &di->comps[di->next_comp]; 784 ++di->next_comp; 785 return p; 786 } 787 788 /* Add a new generic component. */ 789 790 static struct demangle_component * 791 d_make_comp (struct d_info *di, enum demangle_component_type type, 792 struct demangle_component *left, 793 struct demangle_component *right) 794 { 795 struct demangle_component *p; 796 797 /* We check for errors here. A typical error would be a NULL return 798 from a subroutine. We catch those here, and return NULL 799 upward. */ 800 switch (type) 801 { 802 /* These types require two parameters. */ 803 case DEMANGLE_COMPONENT_QUAL_NAME: 804 case DEMANGLE_COMPONENT_LOCAL_NAME: 805 case DEMANGLE_COMPONENT_TYPED_NAME: 806 case DEMANGLE_COMPONENT_TEMPLATE: 807 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: 808 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: 809 case DEMANGLE_COMPONENT_PTRMEM_TYPE: 810 case DEMANGLE_COMPONENT_UNARY: 811 case DEMANGLE_COMPONENT_BINARY: 812 case DEMANGLE_COMPONENT_BINARY_ARGS: 813 case DEMANGLE_COMPONENT_TRINARY: 814 case DEMANGLE_COMPONENT_TRINARY_ARG1: 815 case DEMANGLE_COMPONENT_LITERAL: 816 case DEMANGLE_COMPONENT_LITERAL_NEG: 817 case DEMANGLE_COMPONENT_COMPOUND_NAME: 818 case DEMANGLE_COMPONENT_VECTOR_TYPE: 819 case DEMANGLE_COMPONENT_CLONE: 820 if (left == NULL || right == NULL) 821 return NULL; 822 break; 823 824 /* These types only require one parameter. */ 825 case DEMANGLE_COMPONENT_VTABLE: 826 case DEMANGLE_COMPONENT_VTT: 827 case DEMANGLE_COMPONENT_TYPEINFO: 828 case DEMANGLE_COMPONENT_TYPEINFO_NAME: 829 case DEMANGLE_COMPONENT_TYPEINFO_FN: 830 case DEMANGLE_COMPONENT_THUNK: 831 case DEMANGLE_COMPONENT_VIRTUAL_THUNK: 832 case DEMANGLE_COMPONENT_COVARIANT_THUNK: 833 case DEMANGLE_COMPONENT_JAVA_CLASS: 834 case DEMANGLE_COMPONENT_GUARD: 835 case DEMANGLE_COMPONENT_REFTEMP: 836 case DEMANGLE_COMPONENT_HIDDEN_ALIAS: 837 case DEMANGLE_COMPONENT_TRANSACTION_CLONE: 838 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE: 839 case DEMANGLE_COMPONENT_POINTER: 840 case DEMANGLE_COMPONENT_REFERENCE: 841 case DEMANGLE_COMPONENT_RVALUE_REFERENCE: 842 case DEMANGLE_COMPONENT_COMPLEX: 843 case DEMANGLE_COMPONENT_IMAGINARY: 844 case DEMANGLE_COMPONENT_VENDOR_TYPE: 845 case DEMANGLE_COMPONENT_CAST: 846 case DEMANGLE_COMPONENT_JAVA_RESOURCE: 847 case DEMANGLE_COMPONENT_DECLTYPE: 848 case DEMANGLE_COMPONENT_PACK_EXPANSION: 849 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: 850 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS: 851 case DEMANGLE_COMPONENT_NULLARY: 852 case DEMANGLE_COMPONENT_TRINARY_ARG2: 853 if (left == NULL) 854 return NULL; 855 break; 856 857 /* This needs a right parameter, but the left parameter can be 858 empty. */ 859 case DEMANGLE_COMPONENT_ARRAY_TYPE: 860 case DEMANGLE_COMPONENT_INITIALIZER_LIST: 861 if (right == NULL) 862 return NULL; 863 break; 864 865 /* These are allowed to have no parameters--in some cases they 866 will be filled in later. */ 867 case DEMANGLE_COMPONENT_FUNCTION_TYPE: 868 case DEMANGLE_COMPONENT_RESTRICT: 869 case DEMANGLE_COMPONENT_VOLATILE: 870 case DEMANGLE_COMPONENT_CONST: 871 case DEMANGLE_COMPONENT_RESTRICT_THIS: 872 case DEMANGLE_COMPONENT_VOLATILE_THIS: 873 case DEMANGLE_COMPONENT_CONST_THIS: 874 case DEMANGLE_COMPONENT_ARGLIST: 875 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: 876 break; 877 878 /* Other types should not be seen here. */ 879 default: 880 return NULL; 881 } 882 883 p = d_make_empty (di); 884 if (p != NULL) 885 { 886 p->type = type; 887 p->u.s_binary.left = left; 888 p->u.s_binary.right = right; 889 } 890 return p; 891 } 892 893 /* Add a new demangle mangled name component. */ 894 895 static struct demangle_component * 896 d_make_demangle_mangled_name (struct d_info *di, const char *s) 897 { 898 if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z') 899 return d_make_name (di, s, strlen (s)); 900 d_advance (di, 2); 901 return d_encoding (di, 0); 902 } 903 904 /* Add a new name component. */ 905 906 static struct demangle_component * 907 d_make_name (struct d_info *di, const char *s, int len) 908 { 909 struct demangle_component *p; 910 911 p = d_make_empty (di); 912 if (! cplus_demangle_fill_name (p, s, len)) 913 return NULL; 914 return p; 915 } 916 917 /* Add a new builtin type component. */ 918 919 static struct demangle_component * 920 d_make_builtin_type (struct d_info *di, 921 const struct demangle_builtin_type_info *type) 922 { 923 struct demangle_component *p; 924 925 if (type == NULL) 926 return NULL; 927 p = d_make_empty (di); 928 if (p != NULL) 929 { 930 p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE; 931 p->u.s_builtin.type = type; 932 } 933 return p; 934 } 935 936 /* Add a new operator component. */ 937 938 static struct demangle_component * 939 d_make_operator (struct d_info *di, const struct demangle_operator_info *op) 940 { 941 struct demangle_component *p; 942 943 p = d_make_empty (di); 944 if (p != NULL) 945 { 946 p->type = DEMANGLE_COMPONENT_OPERATOR; 947 p->u.s_operator.op = op; 948 } 949 return p; 950 } 951 952 /* Add a new extended operator component. */ 953 954 static struct demangle_component * 955 d_make_extended_operator (struct d_info *di, int args, 956 struct demangle_component *name) 957 { 958 struct demangle_component *p; 959 960 p = d_make_empty (di); 961 if (! cplus_demangle_fill_extended_operator (p, args, name)) 962 return NULL; 963 return p; 964 } 965 966 static struct demangle_component * 967 d_make_default_arg (struct d_info *di, int num, 968 struct demangle_component *sub) 969 { 970 struct demangle_component *p = d_make_empty (di); 971 if (p) 972 { 973 p->type = DEMANGLE_COMPONENT_DEFAULT_ARG; 974 p->u.s_unary_num.num = num; 975 p->u.s_unary_num.sub = sub; 976 } 977 return p; 978 } 979 980 /* Add a new constructor component. */ 981 982 static struct demangle_component * 983 d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind, 984 struct demangle_component *name) 985 { 986 struct demangle_component *p; 987 988 p = d_make_empty (di); 989 if (! cplus_demangle_fill_ctor (p, kind, name)) 990 return NULL; 991 return p; 992 } 993 994 /* Add a new destructor component. */ 995 996 static struct demangle_component * 997 d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind, 998 struct demangle_component *name) 999 { 1000 struct demangle_component *p; 1001 1002 p = d_make_empty (di); 1003 if (! cplus_demangle_fill_dtor (p, kind, name)) 1004 return NULL; 1005 return p; 1006 } 1007 1008 /* Add a new template parameter. */ 1009 1010 static struct demangle_component * 1011 d_make_template_param (struct d_info *di, long i) 1012 { 1013 struct demangle_component *p; 1014 1015 p = d_make_empty (di); 1016 if (p != NULL) 1017 { 1018 p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM; 1019 p->u.s_number.number = i; 1020 } 1021 return p; 1022 } 1023 1024 /* Add a new function parameter. */ 1025 1026 static struct demangle_component * 1027 d_make_function_param (struct d_info *di, long i) 1028 { 1029 struct demangle_component *p; 1030 1031 p = d_make_empty (di); 1032 if (p != NULL) 1033 { 1034 p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM; 1035 p->u.s_number.number = i; 1036 } 1037 return p; 1038 } 1039 1040 /* Add a new standard substitution component. */ 1041 1042 static struct demangle_component * 1043 d_make_sub (struct d_info *di, const char *name, int len) 1044 { 1045 struct demangle_component *p; 1046 1047 p = d_make_empty (di); 1048 if (p != NULL) 1049 { 1050 p->type = DEMANGLE_COMPONENT_SUB_STD; 1051 p->u.s_string.string = name; 1052 p->u.s_string.len = len; 1053 } 1054 return p; 1055 } 1056 1057 /* <mangled-name> ::= _Z <encoding> [<clone-suffix>]* 1058 1059 TOP_LEVEL is non-zero when called at the top level. */ 1060 1061 CP_STATIC_IF_GLIBCPP_V3 1062 struct demangle_component * 1063 cplus_demangle_mangled_name (struct d_info *di, int top_level) 1064 { 1065 struct demangle_component *p; 1066 1067 if (! d_check_char (di, '_') 1068 /* Allow missing _ if not at toplevel to work around a 1069 bug in G++ abi-version=2 mangling; see the comment in 1070 write_template_arg. */ 1071 && top_level) 1072 return NULL; 1073 if (! d_check_char (di, 'Z')) 1074 return NULL; 1075 p = d_encoding (di, top_level); 1076 1077 /* If at top level and parsing parameters, check for a clone 1078 suffix. */ 1079 if (top_level && (di->options & DMGL_PARAMS) != 0) 1080 while (d_peek_char (di) == '.' 1081 && (IS_LOWER (d_peek_next_char (di)) 1082 || d_peek_next_char (di) == '_' 1083 || IS_DIGIT (d_peek_next_char (di)))) 1084 p = d_clone_suffix (di, p); 1085 1086 return p; 1087 } 1088 1089 /* Return whether a function should have a return type. The argument 1090 is the function name, which may be qualified in various ways. The 1091 rules are that template functions have return types with some 1092 exceptions, function types which are not part of a function name 1093 mangling have return types with some exceptions, and non-template 1094 function names do not have return types. The exceptions are that 1095 constructors, destructors, and conversion operators do not have 1096 return types. */ 1097 1098 static int 1099 has_return_type (struct demangle_component *dc) 1100 { 1101 if (dc == NULL) 1102 return 0; 1103 switch (dc->type) 1104 { 1105 default: 1106 return 0; 1107 case DEMANGLE_COMPONENT_TEMPLATE: 1108 return ! is_ctor_dtor_or_conversion (d_left (dc)); 1109 case DEMANGLE_COMPONENT_RESTRICT_THIS: 1110 case DEMANGLE_COMPONENT_VOLATILE_THIS: 1111 case DEMANGLE_COMPONENT_CONST_THIS: 1112 return has_return_type (d_left (dc)); 1113 } 1114 } 1115 1116 /* Return whether a name is a constructor, a destructor, or a 1117 conversion operator. */ 1118 1119 static int 1120 is_ctor_dtor_or_conversion (struct demangle_component *dc) 1121 { 1122 if (dc == NULL) 1123 return 0; 1124 switch (dc->type) 1125 { 1126 default: 1127 return 0; 1128 case DEMANGLE_COMPONENT_QUAL_NAME: 1129 case DEMANGLE_COMPONENT_LOCAL_NAME: 1130 return is_ctor_dtor_or_conversion (d_right (dc)); 1131 case DEMANGLE_COMPONENT_CTOR: 1132 case DEMANGLE_COMPONENT_DTOR: 1133 case DEMANGLE_COMPONENT_CAST: 1134 return 1; 1135 } 1136 } 1137 1138 /* <encoding> ::= <(function) name> <bare-function-type> 1139 ::= <(data) name> 1140 ::= <special-name> 1141 1142 TOP_LEVEL is non-zero when called at the top level, in which case 1143 if DMGL_PARAMS is not set we do not demangle the function 1144 parameters. We only set this at the top level, because otherwise 1145 we would not correctly demangle names in local scopes. */ 1146 1147 static struct demangle_component * 1148 d_encoding (struct d_info *di, int top_level) 1149 { 1150 char peek = d_peek_char (di); 1151 1152 if (peek == 'G' || peek == 'T') 1153 return d_special_name (di); 1154 else 1155 { 1156 struct demangle_component *dc; 1157 1158 dc = d_name (di); 1159 1160 if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0) 1161 { 1162 /* Strip off any initial CV-qualifiers, as they really apply 1163 to the `this' parameter, and they were not output by the 1164 v2 demangler without DMGL_PARAMS. */ 1165 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS 1166 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS 1167 || dc->type == DEMANGLE_COMPONENT_CONST_THIS) 1168 dc = d_left (dc); 1169 1170 /* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then 1171 there may be CV-qualifiers on its right argument which 1172 really apply here; this happens when parsing a class 1173 which is local to a function. */ 1174 if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME) 1175 { 1176 struct demangle_component *dcr; 1177 1178 dcr = d_right (dc); 1179 while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS 1180 || dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS 1181 || dcr->type == DEMANGLE_COMPONENT_CONST_THIS) 1182 dcr = d_left (dcr); 1183 dc->u.s_binary.right = dcr; 1184 } 1185 1186 return dc; 1187 } 1188 1189 peek = d_peek_char (di); 1190 if (dc == NULL || peek == '\0' || peek == 'E') 1191 return dc; 1192 return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc, 1193 d_bare_function_type (di, has_return_type (dc))); 1194 } 1195 } 1196 1197 /* <name> ::= <nested-name> 1198 ::= <unscoped-name> 1199 ::= <unscoped-template-name> <template-args> 1200 ::= <local-name> 1201 1202 <unscoped-name> ::= <unqualified-name> 1203 ::= St <unqualified-name> 1204 1205 <unscoped-template-name> ::= <unscoped-name> 1206 ::= <substitution> 1207 */ 1208 1209 static struct demangle_component * 1210 d_name (struct d_info *di) 1211 { 1212 char peek = d_peek_char (di); 1213 struct demangle_component *dc; 1214 1215 switch (peek) 1216 { 1217 case 'N': 1218 return d_nested_name (di); 1219 1220 case 'Z': 1221 return d_local_name (di); 1222 1223 case 'L': 1224 case 'U': 1225 return d_unqualified_name (di); 1226 1227 case 'S': 1228 { 1229 int subst; 1230 1231 if (d_peek_next_char (di) != 't') 1232 { 1233 dc = d_substitution (di, 0); 1234 subst = 1; 1235 } 1236 else 1237 { 1238 d_advance (di, 2); 1239 dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, 1240 d_make_name (di, "std", 3), 1241 d_unqualified_name (di)); 1242 di->expansion += 3; 1243 subst = 0; 1244 } 1245 1246 if (d_peek_char (di) != 'I') 1247 { 1248 /* The grammar does not permit this case to occur if we 1249 called d_substitution() above (i.e., subst == 1). We 1250 don't bother to check. */ 1251 } 1252 else 1253 { 1254 /* This is <template-args>, which means that we just saw 1255 <unscoped-template-name>, which is a substitution 1256 candidate if we didn't just get it from a 1257 substitution. */ 1258 if (! subst) 1259 { 1260 if (! d_add_substitution (di, dc)) 1261 return NULL; 1262 } 1263 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc, 1264 d_template_args (di)); 1265 } 1266 1267 return dc; 1268 } 1269 1270 default: 1271 dc = d_unqualified_name (di); 1272 if (d_peek_char (di) == 'I') 1273 { 1274 /* This is <template-args>, which means that we just saw 1275 <unscoped-template-name>, which is a substitution 1276 candidate. */ 1277 if (! d_add_substitution (di, dc)) 1278 return NULL; 1279 dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc, 1280 d_template_args (di)); 1281 } 1282 return dc; 1283 } 1284 } 1285 1286 /* <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E 1287 ::= N [<CV-qualifiers>] <template-prefix> <template-args> E 1288 */ 1289 1290 static struct demangle_component * 1291 d_nested_name (struct d_info *di) 1292 { 1293 struct demangle_component *ret; 1294 struct demangle_component **pret; 1295 1296 if (! d_check_char (di, 'N')) 1297 return NULL; 1298 1299 pret = d_cv_qualifiers (di, &ret, 1); 1300 if (pret == NULL) 1301 return NULL; 1302 1303 *pret = d_prefix (di); 1304 if (*pret == NULL) 1305 return NULL; 1306 1307 if (! d_check_char (di, 'E')) 1308 return NULL; 1309 1310 return ret; 1311 } 1312 1313 /* <prefix> ::= <prefix> <unqualified-name> 1314 ::= <template-prefix> <template-args> 1315 ::= <template-param> 1316 ::= <decltype> 1317 ::= 1318 ::= <substitution> 1319 1320 <template-prefix> ::= <prefix> <(template) unqualified-name> 1321 ::= <template-param> 1322 ::= <substitution> 1323 */ 1324 1325 static struct demangle_component * 1326 d_prefix (struct d_info *di) 1327 { 1328 struct demangle_component *ret = NULL; 1329 1330 while (1) 1331 { 1332 char peek; 1333 enum demangle_component_type comb_type; 1334 struct demangle_component *dc; 1335 1336 peek = d_peek_char (di); 1337 if (peek == '\0') 1338 return NULL; 1339 1340 /* The older code accepts a <local-name> here, but I don't see 1341 that in the grammar. The older code does not accept a 1342 <template-param> here. */ 1343 1344 comb_type = DEMANGLE_COMPONENT_QUAL_NAME; 1345 if (peek == 'D') 1346 { 1347 char peek2 = d_peek_next_char (di); 1348 if (peek2 == 'T' || peek2 == 't') 1349 /* Decltype. */ 1350 dc = cplus_demangle_type (di); 1351 else 1352 /* Destructor name. */ 1353 dc = d_unqualified_name (di); 1354 } 1355 else if (IS_DIGIT (peek) 1356 || IS_LOWER (peek) 1357 || peek == 'C' 1358 || peek == 'U' 1359 || peek == 'L') 1360 dc = d_unqualified_name (di); 1361 else if (peek == 'S') 1362 dc = d_substitution (di, 1); 1363 else if (peek == 'I') 1364 { 1365 if (ret == NULL) 1366 return NULL; 1367 comb_type = DEMANGLE_COMPONENT_TEMPLATE; 1368 dc = d_template_args (di); 1369 } 1370 else if (peek == 'T') 1371 dc = d_template_param (di); 1372 else if (peek == 'E') 1373 return ret; 1374 else if (peek == 'M') 1375 { 1376 /* Initializer scope for a lambda. We don't need to represent 1377 this; the normal code will just treat the variable as a type 1378 scope, which gives appropriate output. */ 1379 if (ret == NULL) 1380 return NULL; 1381 d_advance (di, 1); 1382 continue; 1383 } 1384 else 1385 return NULL; 1386 1387 if (ret == NULL) 1388 ret = dc; 1389 else 1390 ret = d_make_comp (di, comb_type, ret, dc); 1391 1392 if (peek != 'S' && d_peek_char (di) != 'E') 1393 { 1394 if (! d_add_substitution (di, ret)) 1395 return NULL; 1396 } 1397 } 1398 } 1399 1400 /* <unqualified-name> ::= <operator-name> 1401 ::= <ctor-dtor-name> 1402 ::= <source-name> 1403 ::= <local-source-name> 1404 1405 <local-source-name> ::= L <source-name> <discriminator> 1406 */ 1407 1408 static struct demangle_component * 1409 d_unqualified_name (struct d_info *di) 1410 { 1411 char peek; 1412 1413 peek = d_peek_char (di); 1414 if (IS_DIGIT (peek)) 1415 return d_source_name (di); 1416 else if (IS_LOWER (peek)) 1417 { 1418 struct demangle_component *ret; 1419 1420 ret = d_operator_name (di); 1421 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR) 1422 { 1423 di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2; 1424 if (!strcmp (ret->u.s_operator.op->code, "li")) 1425 ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret, 1426 d_source_name (di)); 1427 } 1428 return ret; 1429 } 1430 else if (peek == 'C' || peek == 'D') 1431 return d_ctor_dtor_name (di); 1432 else if (peek == 'L') 1433 { 1434 struct demangle_component * ret; 1435 1436 d_advance (di, 1); 1437 1438 ret = d_source_name (di); 1439 if (ret == NULL) 1440 return NULL; 1441 if (! d_discriminator (di)) 1442 return NULL; 1443 return ret; 1444 } 1445 else if (peek == 'U') 1446 { 1447 switch (d_peek_next_char (di)) 1448 { 1449 case 'l': 1450 return d_lambda (di); 1451 case 't': 1452 return d_unnamed_type (di); 1453 default: 1454 return NULL; 1455 } 1456 } 1457 else 1458 return NULL; 1459 } 1460 1461 /* <source-name> ::= <(positive length) number> <identifier> */ 1462 1463 static struct demangle_component * 1464 d_source_name (struct d_info *di) 1465 { 1466 long len; 1467 struct demangle_component *ret; 1468 1469 len = d_number (di); 1470 if (len <= 0) 1471 return NULL; 1472 ret = d_identifier (di, len); 1473 di->last_name = ret; 1474 return ret; 1475 } 1476 1477 /* number ::= [n] <(non-negative decimal integer)> */ 1478 1479 static long 1480 d_number (struct d_info *di) 1481 { 1482 int negative; 1483 char peek; 1484 long ret; 1485 1486 negative = 0; 1487 peek = d_peek_char (di); 1488 if (peek == 'n') 1489 { 1490 negative = 1; 1491 d_advance (di, 1); 1492 peek = d_peek_char (di); 1493 } 1494 1495 ret = 0; 1496 while (1) 1497 { 1498 if (! IS_DIGIT (peek)) 1499 { 1500 if (negative) 1501 ret = - ret; 1502 return ret; 1503 } 1504 ret = ret * 10 + peek - '0'; 1505 d_advance (di, 1); 1506 peek = d_peek_char (di); 1507 } 1508 } 1509 1510 /* Like d_number, but returns a demangle_component. */ 1511 1512 static struct demangle_component * 1513 d_number_component (struct d_info *di) 1514 { 1515 struct demangle_component *ret = d_make_empty (di); 1516 if (ret) 1517 { 1518 ret->type = DEMANGLE_COMPONENT_NUMBER; 1519 ret->u.s_number.number = d_number (di); 1520 } 1521 return ret; 1522 } 1523 1524 /* identifier ::= <(unqualified source code identifier)> */ 1525 1526 static struct demangle_component * 1527 d_identifier (struct d_info *di, int len) 1528 { 1529 const char *name; 1530 1531 name = d_str (di); 1532 1533 if (di->send - name < len) 1534 return NULL; 1535 1536 d_advance (di, len); 1537 1538 /* A Java mangled name may have a trailing '$' if it is a C++ 1539 keyword. This '$' is not included in the length count. We just 1540 ignore the '$'. */ 1541 if ((di->options & DMGL_JAVA) != 0 1542 && d_peek_char (di) == '$') 1543 d_advance (di, 1); 1544 1545 /* Look for something which looks like a gcc encoding of an 1546 anonymous namespace, and replace it with a more user friendly 1547 name. */ 1548 if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2 1549 && memcmp (name, ANONYMOUS_NAMESPACE_PREFIX, 1550 ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0) 1551 { 1552 const char *s; 1553 1554 s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN; 1555 if ((*s == '.' || *s == '_' || *s == '$') 1556 && s[1] == 'N') 1557 { 1558 di->expansion -= len - sizeof "(anonymous namespace)"; 1559 return d_make_name (di, "(anonymous namespace)", 1560 sizeof "(anonymous namespace)" - 1); 1561 } 1562 } 1563 1564 return d_make_name (di, name, len); 1565 } 1566 1567 /* operator_name ::= many different two character encodings. 1568 ::= cv <type> 1569 ::= v <digit> <source-name> 1570 1571 This list is sorted for binary search. */ 1572 1573 #define NL(s) s, (sizeof s) - 1 1574 1575 CP_STATIC_IF_GLIBCPP_V3 1576 const struct demangle_operator_info cplus_demangle_operators[] = 1577 { 1578 { "aN", NL ("&="), 2 }, 1579 { "aS", NL ("="), 2 }, 1580 { "aa", NL ("&&"), 2 }, 1581 { "ad", NL ("&"), 1 }, 1582 { "an", NL ("&"), 2 }, 1583 { "at", NL ("alignof "), 1 }, 1584 { "az", NL ("alignof "), 1 }, 1585 { "cc", NL ("const_cast"), 2 }, 1586 { "cl", NL ("()"), 2 }, 1587 { "cm", NL (","), 2 }, 1588 { "co", NL ("~"), 1 }, 1589 { "dV", NL ("/="), 2 }, 1590 { "da", NL ("delete[] "), 1 }, 1591 { "dc", NL ("dynamic_cast"), 2 }, 1592 { "de", NL ("*"), 1 }, 1593 { "dl", NL ("delete "), 1 }, 1594 { "ds", NL (".*"), 2 }, 1595 { "dt", NL ("."), 2 }, 1596 { "dv", NL ("/"), 2 }, 1597 { "eO", NL ("^="), 2 }, 1598 { "eo", NL ("^"), 2 }, 1599 { "eq", NL ("=="), 2 }, 1600 { "ge", NL (">="), 2 }, 1601 { "gs", NL ("::"), 1 }, 1602 { "gt", NL (">"), 2 }, 1603 { "ix", NL ("[]"), 2 }, 1604 { "lS", NL ("<<="), 2 }, 1605 { "le", NL ("<="), 2 }, 1606 { "li", NL ("operator\"\" "), 1 }, 1607 { "ls", NL ("<<"), 2 }, 1608 { "lt", NL ("<"), 2 }, 1609 { "mI", NL ("-="), 2 }, 1610 { "mL", NL ("*="), 2 }, 1611 { "mi", NL ("-"), 2 }, 1612 { "ml", NL ("*"), 2 }, 1613 { "mm", NL ("--"), 1 }, 1614 { "na", NL ("new[]"), 3 }, 1615 { "ne", NL ("!="), 2 }, 1616 { "ng", NL ("-"), 1 }, 1617 { "nt", NL ("!"), 1 }, 1618 { "nw", NL ("new"), 3 }, 1619 { "oR", NL ("|="), 2 }, 1620 { "oo", NL ("||"), 2 }, 1621 { "or", NL ("|"), 2 }, 1622 { "pL", NL ("+="), 2 }, 1623 { "pl", NL ("+"), 2 }, 1624 { "pm", NL ("->*"), 2 }, 1625 { "pp", NL ("++"), 1 }, 1626 { "ps", NL ("+"), 1 }, 1627 { "pt", NL ("->"), 2 }, 1628 { "qu", NL ("?"), 3 }, 1629 { "rM", NL ("%="), 2 }, 1630 { "rS", NL (">>="), 2 }, 1631 { "rc", NL ("reinterpret_cast"), 2 }, 1632 { "rm", NL ("%"), 2 }, 1633 { "rs", NL (">>"), 2 }, 1634 { "sc", NL ("static_cast"), 2 }, 1635 { "st", NL ("sizeof "), 1 }, 1636 { "sz", NL ("sizeof "), 1 }, 1637 { "tr", NL ("throw"), 0 }, 1638 { "tw", NL ("throw "), 1 }, 1639 { NULL, NULL, 0, 0 } 1640 }; 1641 1642 static struct demangle_component * 1643 d_operator_name (struct d_info *di) 1644 { 1645 char c1; 1646 char c2; 1647 1648 c1 = d_next_char (di); 1649 c2 = d_next_char (di); 1650 if (c1 == 'v' && IS_DIGIT (c2)) 1651 return d_make_extended_operator (di, c2 - '0', d_source_name (di)); 1652 else if (c1 == 'c' && c2 == 'v') 1653 return d_make_comp (di, DEMANGLE_COMPONENT_CAST, 1654 cplus_demangle_type (di), NULL); 1655 else 1656 { 1657 /* LOW is the inclusive lower bound. */ 1658 int low = 0; 1659 /* HIGH is the exclusive upper bound. We subtract one to ignore 1660 the sentinel at the end of the array. */ 1661 int high = ((sizeof (cplus_demangle_operators) 1662 / sizeof (cplus_demangle_operators[0])) 1663 - 1); 1664 1665 while (1) 1666 { 1667 int i; 1668 const struct demangle_operator_info *p; 1669 1670 i = low + (high - low) / 2; 1671 p = cplus_demangle_operators + i; 1672 1673 if (c1 == p->code[0] && c2 == p->code[1]) 1674 return d_make_operator (di, p); 1675 1676 if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1])) 1677 high = i; 1678 else 1679 low = i + 1; 1680 if (low == high) 1681 return NULL; 1682 } 1683 } 1684 } 1685 1686 static struct demangle_component * 1687 d_make_character (struct d_info *di, int c) 1688 { 1689 struct demangle_component *p; 1690 p = d_make_empty (di); 1691 if (p != NULL) 1692 { 1693 p->type = DEMANGLE_COMPONENT_CHARACTER; 1694 p->u.s_character.character = c; 1695 } 1696 return p; 1697 } 1698 1699 static struct demangle_component * 1700 d_java_resource (struct d_info *di) 1701 { 1702 struct demangle_component *p = NULL; 1703 struct demangle_component *next = NULL; 1704 long len, i; 1705 char c; 1706 const char *str; 1707 1708 len = d_number (di); 1709 if (len <= 1) 1710 return NULL; 1711 1712 /* Eat the leading '_'. */ 1713 if (d_next_char (di) != '_') 1714 return NULL; 1715 len--; 1716 1717 str = d_str (di); 1718 i = 0; 1719 1720 while (len > 0) 1721 { 1722 c = str[i]; 1723 if (!c) 1724 return NULL; 1725 1726 /* Each chunk is either a '$' escape... */ 1727 if (c == '$') 1728 { 1729 i++; 1730 switch (str[i++]) 1731 { 1732 case 'S': 1733 c = '/'; 1734 break; 1735 case '_': 1736 c = '.'; 1737 break; 1738 case '$': 1739 c = '$'; 1740 break; 1741 default: 1742 return NULL; 1743 } 1744 next = d_make_character (di, c); 1745 d_advance (di, i); 1746 str = d_str (di); 1747 len -= i; 1748 i = 0; 1749 if (next == NULL) 1750 return NULL; 1751 } 1752 /* ... or a sequence of characters. */ 1753 else 1754 { 1755 while (i < len && str[i] && str[i] != '$') 1756 i++; 1757 1758 next = d_make_name (di, str, i); 1759 d_advance (di, i); 1760 str = d_str (di); 1761 len -= i; 1762 i = 0; 1763 if (next == NULL) 1764 return NULL; 1765 } 1766 1767 if (p == NULL) 1768 p = next; 1769 else 1770 { 1771 p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next); 1772 if (p == NULL) 1773 return NULL; 1774 } 1775 } 1776 1777 p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL); 1778 1779 return p; 1780 } 1781 1782 /* <special-name> ::= TV <type> 1783 ::= TT <type> 1784 ::= TI <type> 1785 ::= TS <type> 1786 ::= GV <(object) name> 1787 ::= T <call-offset> <(base) encoding> 1788 ::= Tc <call-offset> <call-offset> <(base) encoding> 1789 Also g++ extensions: 1790 ::= TC <type> <(offset) number> _ <(base) type> 1791 ::= TF <type> 1792 ::= TJ <type> 1793 ::= GR <name> 1794 ::= GA <encoding> 1795 ::= Gr <resource name> 1796 ::= GTt <encoding> 1797 ::= GTn <encoding> 1798 */ 1799 1800 static struct demangle_component * 1801 d_special_name (struct d_info *di) 1802 { 1803 di->expansion += 20; 1804 if (d_check_char (di, 'T')) 1805 { 1806 switch (d_next_char (di)) 1807 { 1808 case 'V': 1809 di->expansion -= 5; 1810 return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE, 1811 cplus_demangle_type (di), NULL); 1812 case 'T': 1813 di->expansion -= 10; 1814 return d_make_comp (di, DEMANGLE_COMPONENT_VTT, 1815 cplus_demangle_type (di), NULL); 1816 case 'I': 1817 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO, 1818 cplus_demangle_type (di), NULL); 1819 case 'S': 1820 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME, 1821 cplus_demangle_type (di), NULL); 1822 1823 case 'h': 1824 if (! d_call_offset (di, 'h')) 1825 return NULL; 1826 return d_make_comp (di, DEMANGLE_COMPONENT_THUNK, 1827 d_encoding (di, 0), NULL); 1828 1829 case 'v': 1830 if (! d_call_offset (di, 'v')) 1831 return NULL; 1832 return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK, 1833 d_encoding (di, 0), NULL); 1834 1835 case 'c': 1836 if (! d_call_offset (di, '\0')) 1837 return NULL; 1838 if (! d_call_offset (di, '\0')) 1839 return NULL; 1840 return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK, 1841 d_encoding (di, 0), NULL); 1842 1843 case 'C': 1844 { 1845 struct demangle_component *derived_type; 1846 long offset; 1847 struct demangle_component *base_type; 1848 1849 derived_type = cplus_demangle_type (di); 1850 offset = d_number (di); 1851 if (offset < 0) 1852 return NULL; 1853 if (! d_check_char (di, '_')) 1854 return NULL; 1855 base_type = cplus_demangle_type (di); 1856 /* We don't display the offset. FIXME: We should display 1857 it in verbose mode. */ 1858 di->expansion += 5; 1859 return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, 1860 base_type, derived_type); 1861 } 1862 1863 case 'F': 1864 return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN, 1865 cplus_demangle_type (di), NULL); 1866 case 'J': 1867 return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS, 1868 cplus_demangle_type (di), NULL); 1869 1870 default: 1871 return NULL; 1872 } 1873 } 1874 else if (d_check_char (di, 'G')) 1875 { 1876 switch (d_next_char (di)) 1877 { 1878 case 'V': 1879 return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL); 1880 1881 case 'R': 1882 { 1883 struct demangle_component *name = d_name (di); 1884 return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name, 1885 d_number_component (di)); 1886 } 1887 1888 case 'A': 1889 return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS, 1890 d_encoding (di, 0), NULL); 1891 1892 case 'T': 1893 switch (d_next_char (di)) 1894 { 1895 case 'n': 1896 return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE, 1897 d_encoding (di, 0), NULL); 1898 default: 1899 /* ??? The proposal is that other letters (such as 'h') stand 1900 for different variants of transaction cloning, such as 1901 compiling directly for hardware transaction support. But 1902 they still should all be transactional clones of some sort 1903 so go ahead and call them that. */ 1904 case 't': 1905 return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE, 1906 d_encoding (di, 0), NULL); 1907 } 1908 1909 case 'r': 1910 return d_java_resource (di); 1911 1912 default: 1913 return NULL; 1914 } 1915 } 1916 else 1917 return NULL; 1918 } 1919 1920 /* <call-offset> ::= h <nv-offset> _ 1921 ::= v <v-offset> _ 1922 1923 <nv-offset> ::= <(offset) number> 1924 1925 <v-offset> ::= <(offset) number> _ <(virtual offset) number> 1926 1927 The C parameter, if not '\0', is a character we just read which is 1928 the start of the <call-offset>. 1929 1930 We don't display the offset information anywhere. FIXME: We should 1931 display it in verbose mode. */ 1932 1933 static int 1934 d_call_offset (struct d_info *di, int c) 1935 { 1936 if (c == '\0') 1937 c = d_next_char (di); 1938 1939 if (c == 'h') 1940 d_number (di); 1941 else if (c == 'v') 1942 { 1943 d_number (di); 1944 if (! d_check_char (di, '_')) 1945 return 0; 1946 d_number (di); 1947 } 1948 else 1949 return 0; 1950 1951 if (! d_check_char (di, '_')) 1952 return 0; 1953 1954 return 1; 1955 } 1956 1957 /* <ctor-dtor-name> ::= C1 1958 ::= C2 1959 ::= C3 1960 ::= D0 1961 ::= D1 1962 ::= D2 1963 */ 1964 1965 static struct demangle_component * 1966 d_ctor_dtor_name (struct d_info *di) 1967 { 1968 if (di->last_name != NULL) 1969 { 1970 if (di->last_name->type == DEMANGLE_COMPONENT_NAME) 1971 di->expansion += di->last_name->u.s_name.len; 1972 else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD) 1973 di->expansion += di->last_name->u.s_string.len; 1974 } 1975 switch (d_peek_char (di)) 1976 { 1977 case 'C': 1978 { 1979 enum gnu_v3_ctor_kinds kind; 1980 1981 switch (d_peek_next_char (di)) 1982 { 1983 case '1': 1984 kind = gnu_v3_complete_object_ctor; 1985 break; 1986 case '2': 1987 kind = gnu_v3_base_object_ctor; 1988 break; 1989 case '3': 1990 kind = gnu_v3_complete_object_allocating_ctor; 1991 break; 1992 case '5': 1993 kind = gnu_v3_object_ctor_group; 1994 break; 1995 default: 1996 return NULL; 1997 } 1998 d_advance (di, 2); 1999 return d_make_ctor (di, kind, di->last_name); 2000 } 2001 2002 case 'D': 2003 { 2004 enum gnu_v3_dtor_kinds kind; 2005 2006 switch (d_peek_next_char (di)) 2007 { 2008 case '0': 2009 kind = gnu_v3_deleting_dtor; 2010 break; 2011 case '1': 2012 kind = gnu_v3_complete_object_dtor; 2013 break; 2014 case '2': 2015 kind = gnu_v3_base_object_dtor; 2016 break; 2017 case '5': 2018 kind = gnu_v3_object_dtor_group; 2019 break; 2020 default: 2021 return NULL; 2022 } 2023 d_advance (di, 2); 2024 return d_make_dtor (di, kind, di->last_name); 2025 } 2026 2027 default: 2028 return NULL; 2029 } 2030 } 2031 2032 /* <type> ::= <builtin-type> 2033 ::= <function-type> 2034 ::= <class-enum-type> 2035 ::= <array-type> 2036 ::= <pointer-to-member-type> 2037 ::= <template-param> 2038 ::= <template-template-param> <template-args> 2039 ::= <substitution> 2040 ::= <CV-qualifiers> <type> 2041 ::= P <type> 2042 ::= R <type> 2043 ::= O <type> (C++0x) 2044 ::= C <type> 2045 ::= G <type> 2046 ::= U <source-name> <type> 2047 2048 <builtin-type> ::= various one letter codes 2049 ::= u <source-name> 2050 */ 2051 2052 CP_STATIC_IF_GLIBCPP_V3 2053 const struct demangle_builtin_type_info 2054 cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] = 2055 { 2056 /* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT }, 2057 /* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL }, 2058 /* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT }, 2059 /* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT }, 2060 /* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT }, 2061 /* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT }, 2062 /* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT }, 2063 /* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT }, 2064 /* i */ { NL ("int"), NL ("int"), D_PRINT_INT }, 2065 /* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED }, 2066 /* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, 2067 /* l */ { NL ("long"), NL ("long"), D_PRINT_LONG }, 2068 /* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG }, 2069 /* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT }, 2070 /* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"), 2071 D_PRINT_DEFAULT }, 2072 /* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, 2073 /* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, 2074 /* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, 2075 /* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT }, 2076 /* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT }, 2077 /* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, 2078 /* v */ { NL ("void"), NL ("void"), D_PRINT_VOID }, 2079 /* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT }, 2080 /* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG }, 2081 /* y */ { NL ("unsigned long long"), NL ("unsigned long long"), 2082 D_PRINT_UNSIGNED_LONG_LONG }, 2083 /* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT }, 2084 /* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT }, 2085 /* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT }, 2086 /* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT }, 2087 /* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT }, 2088 /* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT }, 2089 /* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT }, 2090 /* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"), 2091 D_PRINT_DEFAULT }, 2092 }; 2093 2094 CP_STATIC_IF_GLIBCPP_V3 2095 struct demangle_component * 2096 cplus_demangle_type (struct d_info *di) 2097 { 2098 char peek; 2099 struct demangle_component *ret; 2100 int can_subst; 2101 2102 /* The ABI specifies that when CV-qualifiers are used, the base type 2103 is substitutable, and the fully qualified type is substitutable, 2104 but the base type with a strict subset of the CV-qualifiers is 2105 not substitutable. The natural recursive implementation of the 2106 CV-qualifiers would cause subsets to be substitutable, so instead 2107 we pull them all off now. 2108 2109 FIXME: The ABI says that order-insensitive vendor qualifiers 2110 should be handled in the same way, but we have no way to tell 2111 which vendor qualifiers are order-insensitive and which are 2112 order-sensitive. So we just assume that they are all 2113 order-sensitive. g++ 3.4 supports only one vendor qualifier, 2114 __vector, and it treats it as order-sensitive when mangling 2115 names. */ 2116 2117 peek = d_peek_char (di); 2118 if (peek == 'r' || peek == 'V' || peek == 'K') 2119 { 2120 struct demangle_component **pret; 2121 2122 pret = d_cv_qualifiers (di, &ret, 0); 2123 if (pret == NULL) 2124 return NULL; 2125 *pret = cplus_demangle_type (di); 2126 if (! *pret || ! d_add_substitution (di, ret)) 2127 return NULL; 2128 return ret; 2129 } 2130 2131 can_subst = 1; 2132 2133 switch (peek) 2134 { 2135 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': 2136 case 'h': case 'i': case 'j': case 'l': case 'm': case 'n': 2137 case 'o': case 's': case 't': 2138 case 'v': case 'w': case 'x': case 'y': case 'z': 2139 ret = d_make_builtin_type (di, 2140 &cplus_demangle_builtin_types[peek - 'a']); 2141 di->expansion += ret->u.s_builtin.type->len; 2142 can_subst = 0; 2143 d_advance (di, 1); 2144 break; 2145 2146 case 'u': 2147 d_advance (di, 1); 2148 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE, 2149 d_source_name (di), NULL); 2150 break; 2151 2152 case 'F': 2153 ret = d_function_type (di); 2154 break; 2155 2156 case '0': case '1': case '2': case '3': case '4': 2157 case '5': case '6': case '7': case '8': case '9': 2158 case 'N': 2159 case 'Z': 2160 ret = d_class_enum_type (di); 2161 break; 2162 2163 case 'A': 2164 ret = d_array_type (di); 2165 break; 2166 2167 case 'M': 2168 ret = d_pointer_to_member_type (di); 2169 break; 2170 2171 case 'T': 2172 ret = d_template_param (di); 2173 if (d_peek_char (di) == 'I') 2174 { 2175 /* This is <template-template-param> <template-args>. The 2176 <template-template-param> part is a substitution 2177 candidate. */ 2178 if (! d_add_substitution (di, ret)) 2179 return NULL; 2180 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, 2181 d_template_args (di)); 2182 } 2183 break; 2184 2185 case 'S': 2186 /* If this is a special substitution, then it is the start of 2187 <class-enum-type>. */ 2188 { 2189 char peek_next; 2190 2191 peek_next = d_peek_next_char (di); 2192 if (IS_DIGIT (peek_next) 2193 || peek_next == '_' 2194 || IS_UPPER (peek_next)) 2195 { 2196 ret = d_substitution (di, 0); 2197 /* The substituted name may have been a template name and 2198 may be followed by tepmlate args. */ 2199 if (d_peek_char (di) == 'I') 2200 ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, 2201 d_template_args (di)); 2202 else 2203 can_subst = 0; 2204 } 2205 else 2206 { 2207 ret = d_class_enum_type (di); 2208 /* If the substitution was a complete type, then it is not 2209 a new substitution candidate. However, if the 2210 substitution was followed by template arguments, then 2211 the whole thing is a substitution candidate. */ 2212 if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD) 2213 can_subst = 0; 2214 } 2215 } 2216 break; 2217 2218 case 'O': 2219 d_advance (di, 1); 2220 ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE, 2221 cplus_demangle_type (di), NULL); 2222 break; 2223 2224 case 'P': 2225 d_advance (di, 1); 2226 ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER, 2227 cplus_demangle_type (di), NULL); 2228 break; 2229 2230 case 'R': 2231 d_advance (di, 1); 2232 ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE, 2233 cplus_demangle_type (di), NULL); 2234 break; 2235 2236 case 'C': 2237 d_advance (di, 1); 2238 ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX, 2239 cplus_demangle_type (di), NULL); 2240 break; 2241 2242 case 'G': 2243 d_advance (di, 1); 2244 ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY, 2245 cplus_demangle_type (di), NULL); 2246 break; 2247 2248 case 'U': 2249 d_advance (di, 1); 2250 ret = d_source_name (di); 2251 ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL, 2252 cplus_demangle_type (di), ret); 2253 break; 2254 2255 case 'D': 2256 can_subst = 0; 2257 d_advance (di, 1); 2258 peek = d_next_char (di); 2259 switch (peek) 2260 { 2261 case 'T': 2262 case 't': 2263 /* decltype (expression) */ 2264 ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE, 2265 d_expression (di), NULL); 2266 if (ret && d_next_char (di) != 'E') 2267 ret = NULL; 2268 can_subst = 1; 2269 break; 2270 2271 case 'p': 2272 /* Pack expansion. */ 2273 ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION, 2274 cplus_demangle_type (di), NULL); 2275 can_subst = 1; 2276 break; 2277 2278 case 'a': 2279 /* auto */ 2280 ret = d_make_name (di, "auto", 4); 2281 break; 2282 2283 case 'f': 2284 /* 32-bit decimal floating point */ 2285 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]); 2286 di->expansion += ret->u.s_builtin.type->len; 2287 break; 2288 case 'd': 2289 /* 64-bit DFP */ 2290 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]); 2291 di->expansion += ret->u.s_builtin.type->len; 2292 break; 2293 case 'e': 2294 /* 128-bit DFP */ 2295 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]); 2296 di->expansion += ret->u.s_builtin.type->len; 2297 break; 2298 case 'h': 2299 /* 16-bit half-precision FP */ 2300 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]); 2301 di->expansion += ret->u.s_builtin.type->len; 2302 break; 2303 case 's': 2304 /* char16_t */ 2305 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]); 2306 di->expansion += ret->u.s_builtin.type->len; 2307 break; 2308 case 'i': 2309 /* char32_t */ 2310 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]); 2311 di->expansion += ret->u.s_builtin.type->len; 2312 break; 2313 2314 case 'F': 2315 /* Fixed point types. DF<int bits><length><fract bits><sat> */ 2316 ret = d_make_empty (di); 2317 ret->type = DEMANGLE_COMPONENT_FIXED_TYPE; 2318 if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di)))) 2319 /* For demangling we don't care about the bits. */ 2320 d_number (di); 2321 ret->u.s_fixed.length = cplus_demangle_type (di); 2322 if (ret->u.s_fixed.length == NULL) 2323 return NULL; 2324 d_number (di); 2325 peek = d_next_char (di); 2326 ret->u.s_fixed.sat = (peek == 's'); 2327 break; 2328 2329 case 'v': 2330 ret = d_vector_type (di); 2331 can_subst = 1; 2332 break; 2333 2334 case 'n': 2335 /* decltype(nullptr) */ 2336 ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]); 2337 di->expansion += ret->u.s_builtin.type->len; 2338 break; 2339 2340 default: 2341 return NULL; 2342 } 2343 break; 2344 2345 default: 2346 return NULL; 2347 } 2348 2349 if (can_subst) 2350 { 2351 if (! d_add_substitution (di, ret)) 2352 return NULL; 2353 } 2354 2355 return ret; 2356 } 2357 2358 /* <CV-qualifiers> ::= [r] [V] [K] */ 2359 2360 static struct demangle_component ** 2361 d_cv_qualifiers (struct d_info *di, 2362 struct demangle_component **pret, int member_fn) 2363 { 2364 struct demangle_component **pstart; 2365 char peek; 2366 2367 pstart = pret; 2368 peek = d_peek_char (di); 2369 while (peek == 'r' || peek == 'V' || peek == 'K') 2370 { 2371 enum demangle_component_type t; 2372 2373 d_advance (di, 1); 2374 if (peek == 'r') 2375 { 2376 t = (member_fn 2377 ? DEMANGLE_COMPONENT_RESTRICT_THIS 2378 : DEMANGLE_COMPONENT_RESTRICT); 2379 di->expansion += sizeof "restrict"; 2380 } 2381 else if (peek == 'V') 2382 { 2383 t = (member_fn 2384 ? DEMANGLE_COMPONENT_VOLATILE_THIS 2385 : DEMANGLE_COMPONENT_VOLATILE); 2386 di->expansion += sizeof "volatile"; 2387 } 2388 else 2389 { 2390 t = (member_fn 2391 ? DEMANGLE_COMPONENT_CONST_THIS 2392 : DEMANGLE_COMPONENT_CONST); 2393 di->expansion += sizeof "const"; 2394 } 2395 2396 *pret = d_make_comp (di, t, NULL, NULL); 2397 if (*pret == NULL) 2398 return NULL; 2399 pret = &d_left (*pret); 2400 2401 peek = d_peek_char (di); 2402 } 2403 2404 if (!member_fn && peek == 'F') 2405 { 2406 while (pstart != pret) 2407 { 2408 switch ((*pstart)->type) 2409 { 2410 case DEMANGLE_COMPONENT_RESTRICT: 2411 (*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS; 2412 break; 2413 case DEMANGLE_COMPONENT_VOLATILE: 2414 (*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS; 2415 break; 2416 case DEMANGLE_COMPONENT_CONST: 2417 (*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS; 2418 break; 2419 default: 2420 break; 2421 } 2422 pstart = &d_left (*pstart); 2423 } 2424 } 2425 2426 return pret; 2427 } 2428 2429 /* <function-type> ::= F [Y] <bare-function-type> E */ 2430 2431 static struct demangle_component * 2432 d_function_type (struct d_info *di) 2433 { 2434 struct demangle_component *ret; 2435 2436 if (! d_check_char (di, 'F')) 2437 return NULL; 2438 if (d_peek_char (di) == 'Y') 2439 { 2440 /* Function has C linkage. We don't print this information. 2441 FIXME: We should print it in verbose mode. */ 2442 d_advance (di, 1); 2443 } 2444 ret = d_bare_function_type (di, 1); 2445 if (! d_check_char (di, 'E')) 2446 return NULL; 2447 return ret; 2448 } 2449 2450 /* <type>+ */ 2451 2452 static struct demangle_component * 2453 d_parmlist (struct d_info *di) 2454 { 2455 struct demangle_component *tl; 2456 struct demangle_component **ptl; 2457 2458 tl = NULL; 2459 ptl = &tl; 2460 while (1) 2461 { 2462 struct demangle_component *type; 2463 2464 char peek = d_peek_char (di); 2465 if (peek == '\0' || peek == 'E' || peek == '.') 2466 break; 2467 type = cplus_demangle_type (di); 2468 if (type == NULL) 2469 return NULL; 2470 *ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL); 2471 if (*ptl == NULL) 2472 return NULL; 2473 ptl = &d_right (*ptl); 2474 } 2475 2476 /* There should be at least one parameter type besides the optional 2477 return type. A function which takes no arguments will have a 2478 single parameter type void. */ 2479 if (tl == NULL) 2480 return NULL; 2481 2482 /* If we have a single parameter type void, omit it. */ 2483 if (d_right (tl) == NULL 2484 && d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE 2485 && d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID) 2486 { 2487 di->expansion -= d_left (tl)->u.s_builtin.type->len; 2488 d_left (tl) = NULL; 2489 } 2490 2491 return tl; 2492 } 2493 2494 /* <bare-function-type> ::= [J]<type>+ */ 2495 2496 static struct demangle_component * 2497 d_bare_function_type (struct d_info *di, int has_return_type) 2498 { 2499 struct demangle_component *return_type; 2500 struct demangle_component *tl; 2501 char peek; 2502 2503 /* Detect special qualifier indicating that the first argument 2504 is the return type. */ 2505 peek = d_peek_char (di); 2506 if (peek == 'J') 2507 { 2508 d_advance (di, 1); 2509 has_return_type = 1; 2510 } 2511 2512 if (has_return_type) 2513 { 2514 return_type = cplus_demangle_type (di); 2515 if (return_type == NULL) 2516 return NULL; 2517 } 2518 else 2519 return_type = NULL; 2520 2521 tl = d_parmlist (di); 2522 if (tl == NULL) 2523 return NULL; 2524 2525 return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, 2526 return_type, tl); 2527 } 2528 2529 /* <class-enum-type> ::= <name> */ 2530 2531 static struct demangle_component * 2532 d_class_enum_type (struct d_info *di) 2533 { 2534 return d_name (di); 2535 } 2536 2537 /* <array-type> ::= A <(positive dimension) number> _ <(element) type> 2538 ::= A [<(dimension) expression>] _ <(element) type> 2539 */ 2540 2541 static struct demangle_component * 2542 d_array_type (struct d_info *di) 2543 { 2544 char peek; 2545 struct demangle_component *dim; 2546 2547 if (! d_check_char (di, 'A')) 2548 return NULL; 2549 2550 peek = d_peek_char (di); 2551 if (peek == '_') 2552 dim = NULL; 2553 else if (IS_DIGIT (peek)) 2554 { 2555 const char *s; 2556 2557 s = d_str (di); 2558 do 2559 { 2560 d_advance (di, 1); 2561 peek = d_peek_char (di); 2562 } 2563 while (IS_DIGIT (peek)); 2564 dim = d_make_name (di, s, d_str (di) - s); 2565 if (dim == NULL) 2566 return NULL; 2567 } 2568 else 2569 { 2570 dim = d_expression (di); 2571 if (dim == NULL) 2572 return NULL; 2573 } 2574 2575 if (! d_check_char (di, '_')) 2576 return NULL; 2577 2578 return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim, 2579 cplus_demangle_type (di)); 2580 } 2581 2582 /* <vector-type> ::= Dv <number> _ <type> 2583 ::= Dv _ <expression> _ <type> */ 2584 2585 static struct demangle_component * 2586 d_vector_type (struct d_info *di) 2587 { 2588 char peek; 2589 struct demangle_component *dim; 2590 2591 peek = d_peek_char (di); 2592 if (peek == '_') 2593 { 2594 d_advance (di, 1); 2595 dim = d_expression (di); 2596 } 2597 else 2598 dim = d_number_component (di); 2599 2600 if (dim == NULL) 2601 return NULL; 2602 2603 if (! d_check_char (di, '_')) 2604 return NULL; 2605 2606 return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim, 2607 cplus_demangle_type (di)); 2608 } 2609 2610 /* <pointer-to-member-type> ::= M <(class) type> <(member) type> */ 2611 2612 static struct demangle_component * 2613 d_pointer_to_member_type (struct d_info *di) 2614 { 2615 struct demangle_component *cl; 2616 struct demangle_component *mem; 2617 struct demangle_component **pmem; 2618 2619 if (! d_check_char (di, 'M')) 2620 return NULL; 2621 2622 cl = cplus_demangle_type (di); 2623 2624 /* The ABI specifies that any type can be a substitution source, and 2625 that M is followed by two types, and that when a CV-qualified 2626 type is seen both the base type and the CV-qualified types are 2627 substitution sources. The ABI also specifies that for a pointer 2628 to a CV-qualified member function, the qualifiers are attached to 2629 the second type. Given the grammar, a plain reading of the ABI 2630 suggests that both the CV-qualified member function and the 2631 non-qualified member function are substitution sources. However, 2632 g++ does not work that way. g++ treats only the CV-qualified 2633 member function as a substitution source. FIXME. So to work 2634 with g++, we need to pull off the CV-qualifiers here, in order to 2635 avoid calling add_substitution() in cplus_demangle_type(). But 2636 for a CV-qualified member which is not a function, g++ does 2637 follow the ABI, so we need to handle that case here by calling 2638 d_add_substitution ourselves. */ 2639 2640 pmem = d_cv_qualifiers (di, &mem, 1); 2641 if (pmem == NULL) 2642 return NULL; 2643 *pmem = cplus_demangle_type (di); 2644 if (*pmem == NULL) 2645 return NULL; 2646 2647 if (pmem != &mem && (*pmem)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE) 2648 { 2649 if (! d_add_substitution (di, mem)) 2650 return NULL; 2651 } 2652 2653 return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem); 2654 } 2655 2656 /* <non-negative number> _ */ 2657 2658 static long 2659 d_compact_number (struct d_info *di) 2660 { 2661 long num; 2662 if (d_peek_char (di) == '_') 2663 num = 0; 2664 else if (d_peek_char (di) == 'n') 2665 return -1; 2666 else 2667 num = d_number (di) + 1; 2668 2669 if (! d_check_char (di, '_')) 2670 return -1; 2671 return num; 2672 } 2673 2674 /* <template-param> ::= T_ 2675 ::= T <(parameter-2 non-negative) number> _ 2676 */ 2677 2678 static struct demangle_component * 2679 d_template_param (struct d_info *di) 2680 { 2681 long param; 2682 2683 if (! d_check_char (di, 'T')) 2684 return NULL; 2685 2686 param = d_compact_number (di); 2687 if (param < 0) 2688 return NULL; 2689 2690 ++di->did_subs; 2691 2692 return d_make_template_param (di, param); 2693 } 2694 2695 /* <template-args> ::= I <template-arg>+ E */ 2696 2697 static struct demangle_component * 2698 d_template_args (struct d_info *di) 2699 { 2700 struct demangle_component *hold_last_name; 2701 struct demangle_component *al; 2702 struct demangle_component **pal; 2703 2704 /* Preserve the last name we saw--don't let the template arguments 2705 clobber it, as that would give us the wrong name for a subsequent 2706 constructor or destructor. */ 2707 hold_last_name = di->last_name; 2708 2709 if (d_peek_char (di) != 'I' 2710 && d_peek_char (di) != 'J') 2711 return NULL; 2712 d_advance (di, 1); 2713 2714 if (d_peek_char (di) == 'E') 2715 { 2716 /* An argument pack can be empty. */ 2717 d_advance (di, 1); 2718 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL); 2719 } 2720 2721 al = NULL; 2722 pal = &al; 2723 while (1) 2724 { 2725 struct demangle_component *a; 2726 2727 a = d_template_arg (di); 2728 if (a == NULL) 2729 return NULL; 2730 2731 *pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL); 2732 if (*pal == NULL) 2733 return NULL; 2734 pal = &d_right (*pal); 2735 2736 if (d_peek_char (di) == 'E') 2737 { 2738 d_advance (di, 1); 2739 break; 2740 } 2741 } 2742 2743 di->last_name = hold_last_name; 2744 2745 return al; 2746 } 2747 2748 /* <template-arg> ::= <type> 2749 ::= X <expression> E 2750 ::= <expr-primary> 2751 */ 2752 2753 static struct demangle_component * 2754 d_template_arg (struct d_info *di) 2755 { 2756 struct demangle_component *ret; 2757 2758 switch (d_peek_char (di)) 2759 { 2760 case 'X': 2761 d_advance (di, 1); 2762 ret = d_expression (di); 2763 if (! d_check_char (di, 'E')) 2764 return NULL; 2765 return ret; 2766 2767 case 'L': 2768 return d_expr_primary (di); 2769 2770 case 'I': 2771 case 'J': 2772 /* An argument pack. */ 2773 return d_template_args (di); 2774 2775 default: 2776 return cplus_demangle_type (di); 2777 } 2778 } 2779 2780 /* Parse a sequence of expressions until we hit the terminator 2781 character. */ 2782 2783 static struct demangle_component * 2784 d_exprlist (struct d_info *di, char terminator) 2785 { 2786 struct demangle_component *list = NULL; 2787 struct demangle_component **p = &list; 2788 2789 if (d_peek_char (di) == terminator) 2790 { 2791 d_advance (di, 1); 2792 return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL); 2793 } 2794 2795 while (1) 2796 { 2797 struct demangle_component *arg = d_expression (di); 2798 if (arg == NULL) 2799 return NULL; 2800 2801 *p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL); 2802 if (*p == NULL) 2803 return NULL; 2804 p = &d_right (*p); 2805 2806 if (d_peek_char (di) == terminator) 2807 { 2808 d_advance (di, 1); 2809 break; 2810 } 2811 } 2812 2813 return list; 2814 } 2815 2816 /* Returns nonzero iff OP is an operator for a C++ cast: const_cast, 2817 dynamic_cast, static_cast or reinterpret_cast. */ 2818 2819 static int 2820 op_is_new_cast (struct demangle_component *op) 2821 { 2822 const char *code = op->u.s_operator.op->code; 2823 return (code[1] == 'c' 2824 && (code[0] == 's' || code[0] == 'd' 2825 || code[0] == 'c' || code[0] == 'r')); 2826 } 2827 2828 /* <expression> ::= <(unary) operator-name> <expression> 2829 ::= <(binary) operator-name> <expression> <expression> 2830 ::= <(trinary) operator-name> <expression> <expression> <expression> 2831 ::= cl <expression>+ E 2832 ::= st <type> 2833 ::= <template-param> 2834 ::= sr <type> <unqualified-name> 2835 ::= sr <type> <unqualified-name> <template-args> 2836 ::= <expr-primary> 2837 */ 2838 2839 static struct demangle_component * 2840 d_expression (struct d_info *di) 2841 { 2842 char peek; 2843 2844 peek = d_peek_char (di); 2845 if (peek == 'L') 2846 return d_expr_primary (di); 2847 else if (peek == 'T') 2848 return d_template_param (di); 2849 else if (peek == 's' && d_peek_next_char (di) == 'r') 2850 { 2851 struct demangle_component *type; 2852 struct demangle_component *name; 2853 2854 d_advance (di, 2); 2855 type = cplus_demangle_type (di); 2856 name = d_unqualified_name (di); 2857 if (d_peek_char (di) != 'I') 2858 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name); 2859 else 2860 return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, 2861 d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, 2862 d_template_args (di))); 2863 } 2864 else if (peek == 's' && d_peek_next_char (di) == 'p') 2865 { 2866 d_advance (di, 2); 2867 return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION, 2868 d_expression (di), NULL); 2869 } 2870 else if (peek == 'f' && d_peek_next_char (di) == 'p') 2871 { 2872 /* Function parameter used in a late-specified return type. */ 2873 int index; 2874 d_advance (di, 2); 2875 if (d_peek_char (di) == 'T') 2876 { 2877 /* 'this' parameter. */ 2878 d_advance (di, 1); 2879 index = 0; 2880 } 2881 else 2882 { 2883 index = d_compact_number (di) + 1; 2884 if (index == 0) 2885 return NULL; 2886 } 2887 return d_make_function_param (di, index); 2888 } 2889 else if (IS_DIGIT (peek) 2890 || (peek == 'o' && d_peek_next_char (di) == 'n')) 2891 { 2892 /* We can get an unqualified name as an expression in the case of 2893 a dependent function call, i.e. decltype(f(t)). */ 2894 struct demangle_component *name; 2895 2896 if (peek == 'o') 2897 /* operator-function-id, i.e. operator+(t). */ 2898 d_advance (di, 2); 2899 2900 name = d_unqualified_name (di); 2901 if (name == NULL) 2902 return NULL; 2903 if (d_peek_char (di) == 'I') 2904 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, 2905 d_template_args (di)); 2906 else 2907 return name; 2908 } 2909 else if ((peek == 'i' || peek == 't') 2910 && d_peek_next_char (di) == 'l') 2911 { 2912 /* Brace-enclosed initializer list, untyped or typed. */ 2913 struct demangle_component *type = NULL; 2914 if (peek == 't') 2915 type = cplus_demangle_type (di); 2916 d_advance (di, 2); 2917 return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST, 2918 type, d_exprlist (di, 'E')); 2919 } 2920 else 2921 { 2922 struct demangle_component *op; 2923 const char *code = NULL; 2924 int args; 2925 2926 op = d_operator_name (di); 2927 if (op == NULL) 2928 return NULL; 2929 2930 if (op->type == DEMANGLE_COMPONENT_OPERATOR) 2931 { 2932 code = op->u.s_operator.op->code; 2933 di->expansion += op->u.s_operator.op->len - 2; 2934 if (strcmp (code, "st") == 0) 2935 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, 2936 cplus_demangle_type (di)); 2937 } 2938 2939 switch (op->type) 2940 { 2941 default: 2942 return NULL; 2943 case DEMANGLE_COMPONENT_OPERATOR: 2944 args = op->u.s_operator.op->args; 2945 break; 2946 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: 2947 args = op->u.s_extended_operator.args; 2948 break; 2949 case DEMANGLE_COMPONENT_CAST: 2950 args = 1; 2951 break; 2952 } 2953 2954 switch (args) 2955 { 2956 case 0: 2957 return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL); 2958 2959 case 1: 2960 { 2961 struct demangle_component *operand; 2962 int suffix = 0; 2963 2964 if (code && (code[0] == 'p' || code[0] == 'm') 2965 && code[1] == code[0]) 2966 /* pp_ and mm_ are the prefix variants. */ 2967 suffix = !d_check_char (di, '_'); 2968 2969 if (op->type == DEMANGLE_COMPONENT_CAST 2970 && d_check_char (di, '_')) 2971 operand = d_exprlist (di, 'E'); 2972 else 2973 operand = d_expression (di); 2974 2975 if (suffix) 2976 /* Indicate the suffix variant for d_print_comp. */ 2977 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, 2978 d_make_comp (di, 2979 DEMANGLE_COMPONENT_BINARY_ARGS, 2980 operand, operand)); 2981 else 2982 return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, 2983 operand); 2984 } 2985 case 2: 2986 { 2987 struct demangle_component *left; 2988 struct demangle_component *right; 2989 2990 if (op_is_new_cast (op)) 2991 left = cplus_demangle_type (di); 2992 else 2993 left = d_expression (di); 2994 if (!strcmp (code, "cl")) 2995 right = d_exprlist (di, 'E'); 2996 else if (!strcmp (code, "dt") || !strcmp (code, "pt")) 2997 { 2998 right = d_unqualified_name (di); 2999 if (d_peek_char (di) == 'I') 3000 right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, 3001 right, d_template_args (di)); 3002 } 3003 else 3004 right = d_expression (di); 3005 3006 return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op, 3007 d_make_comp (di, 3008 DEMANGLE_COMPONENT_BINARY_ARGS, 3009 left, right)); 3010 } 3011 case 3: 3012 { 3013 struct demangle_component *first; 3014 struct demangle_component *second; 3015 struct demangle_component *third; 3016 3017 if (!strcmp (code, "qu")) 3018 { 3019 /* ?: expression. */ 3020 first = d_expression (di); 3021 second = d_expression (di); 3022 third = d_expression (di); 3023 } 3024 else if (code[0] == 'n') 3025 { 3026 /* new-expression. */ 3027 if (code[1] != 'w' && code[1] != 'a') 3028 return NULL; 3029 first = d_exprlist (di, '_'); 3030 second = cplus_demangle_type (di); 3031 if (d_peek_char (di) == 'E') 3032 { 3033 d_advance (di, 1); 3034 third = NULL; 3035 } 3036 else if (d_peek_char (di) == 'p' 3037 && d_peek_next_char (di) == 'i') 3038 { 3039 /* Parenthesized initializer. */ 3040 d_advance (di, 2); 3041 third = d_exprlist (di, 'E'); 3042 } 3043 else if (d_peek_char (di) == 'i' 3044 && d_peek_next_char (di) == 'l') 3045 /* initializer-list. */ 3046 third = d_expression (di); 3047 else 3048 return NULL; 3049 } 3050 else 3051 return NULL; 3052 return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op, 3053 d_make_comp (di, 3054 DEMANGLE_COMPONENT_TRINARY_ARG1, 3055 first, 3056 d_make_comp (di, 3057 DEMANGLE_COMPONENT_TRINARY_ARG2, 3058 second, third))); 3059 } 3060 default: 3061 return NULL; 3062 } 3063 } 3064 } 3065 3066 /* <expr-primary> ::= L <type> <(value) number> E 3067 ::= L <type> <(value) float> E 3068 ::= L <mangled-name> E 3069 */ 3070 3071 static struct demangle_component * 3072 d_expr_primary (struct d_info *di) 3073 { 3074 struct demangle_component *ret; 3075 3076 if (! d_check_char (di, 'L')) 3077 return NULL; 3078 if (d_peek_char (di) == '_' 3079 /* Workaround for G++ bug; see comment in write_template_arg. */ 3080 || d_peek_char (di) == 'Z') 3081 ret = cplus_demangle_mangled_name (di, 0); 3082 else 3083 { 3084 struct demangle_component *type; 3085 enum demangle_component_type t; 3086 const char *s; 3087 3088 type = cplus_demangle_type (di); 3089 if (type == NULL) 3090 return NULL; 3091 3092 /* If we have a type we know how to print, we aren't going to 3093 print the type name itself. */ 3094 if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE 3095 && type->u.s_builtin.type->print != D_PRINT_DEFAULT) 3096 di->expansion -= type->u.s_builtin.type->len; 3097 3098 /* Rather than try to interpret the literal value, we just 3099 collect it as a string. Note that it's possible to have a 3100 floating point literal here. The ABI specifies that the 3101 format of such literals is machine independent. That's fine, 3102 but what's not fine is that versions of g++ up to 3.2 with 3103 -fabi-version=1 used upper case letters in the hex constant, 3104 and dumped out gcc's internal representation. That makes it 3105 hard to tell where the constant ends, and hard to dump the 3106 constant in any readable form anyhow. We don't attempt to 3107 handle these cases. */ 3108 3109 t = DEMANGLE_COMPONENT_LITERAL; 3110 if (d_peek_char (di) == 'n') 3111 { 3112 t = DEMANGLE_COMPONENT_LITERAL_NEG; 3113 d_advance (di, 1); 3114 } 3115 s = d_str (di); 3116 while (d_peek_char (di) != 'E') 3117 { 3118 if (d_peek_char (di) == '\0') 3119 return NULL; 3120 d_advance (di, 1); 3121 } 3122 ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s)); 3123 } 3124 if (! d_check_char (di, 'E')) 3125 return NULL; 3126 return ret; 3127 } 3128 3129 /* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>] 3130 ::= Z <(function) encoding> E s [<discriminator>] 3131 */ 3132 3133 static struct demangle_component * 3134 d_local_name (struct d_info *di) 3135 { 3136 struct demangle_component *function; 3137 3138 if (! d_check_char (di, 'Z')) 3139 return NULL; 3140 3141 function = d_encoding (di, 0); 3142 3143 if (! d_check_char (di, 'E')) 3144 return NULL; 3145 3146 if (d_peek_char (di) == 's') 3147 { 3148 d_advance (di, 1); 3149 if (! d_discriminator (di)) 3150 return NULL; 3151 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, 3152 d_make_name (di, "string literal", 3153 sizeof "string literal" - 1)); 3154 } 3155 else 3156 { 3157 struct demangle_component *name; 3158 int num = -1; 3159 3160 if (d_peek_char (di) == 'd') 3161 { 3162 /* Default argument scope: d <number> _. */ 3163 d_advance (di, 1); 3164 num = d_compact_number (di); 3165 if (num < 0) 3166 return NULL; 3167 } 3168 3169 name = d_name (di); 3170 if (name) 3171 switch (name->type) 3172 { 3173 /* Lambdas and unnamed types have internal discriminators. */ 3174 case DEMANGLE_COMPONENT_LAMBDA: 3175 case DEMANGLE_COMPONENT_UNNAMED_TYPE: 3176 break; 3177 default: 3178 if (! d_discriminator (di)) 3179 return NULL; 3180 } 3181 if (num >= 0) 3182 name = d_make_default_arg (di, num, name); 3183 return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name); 3184 } 3185 } 3186 3187 /* <discriminator> ::= _ <(non-negative) number> 3188 3189 We demangle the discriminator, but we don't print it out. FIXME: 3190 We should print it out in verbose mode. */ 3191 3192 static int 3193 d_discriminator (struct d_info *di) 3194 { 3195 long discrim; 3196 3197 if (d_peek_char (di) != '_') 3198 return 1; 3199 d_advance (di, 1); 3200 discrim = d_number (di); 3201 if (discrim < 0) 3202 return 0; 3203 return 1; 3204 } 3205 3206 /* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */ 3207 3208 static struct demangle_component * 3209 d_lambda (struct d_info *di) 3210 { 3211 struct demangle_component *tl; 3212 struct demangle_component *ret; 3213 int num; 3214 3215 if (! d_check_char (di, 'U')) 3216 return NULL; 3217 if (! d_check_char (di, 'l')) 3218 return NULL; 3219 3220 tl = d_parmlist (di); 3221 if (tl == NULL) 3222 return NULL; 3223 3224 if (! d_check_char (di, 'E')) 3225 return NULL; 3226 3227 num = d_compact_number (di); 3228 if (num < 0) 3229 return NULL; 3230 3231 ret = d_make_empty (di); 3232 if (ret) 3233 { 3234 ret->type = DEMANGLE_COMPONENT_LAMBDA; 3235 ret->u.s_unary_num.sub = tl; 3236 ret->u.s_unary_num.num = num; 3237 } 3238 3239 if (! d_add_substitution (di, ret)) 3240 return NULL; 3241 3242 return ret; 3243 } 3244 3245 /* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */ 3246 3247 static struct demangle_component * 3248 d_unnamed_type (struct d_info *di) 3249 { 3250 struct demangle_component *ret; 3251 long num; 3252 3253 if (! d_check_char (di, 'U')) 3254 return NULL; 3255 if (! d_check_char (di, 't')) 3256 return NULL; 3257 3258 num = d_compact_number (di); 3259 if (num < 0) 3260 return NULL; 3261 3262 ret = d_make_empty (di); 3263 if (ret) 3264 { 3265 ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE; 3266 ret->u.s_number.number = num; 3267 } 3268 3269 if (! d_add_substitution (di, ret)) 3270 return NULL; 3271 3272 return ret; 3273 } 3274 3275 /* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]* 3276 */ 3277 3278 static struct demangle_component * 3279 d_clone_suffix (struct d_info *di, struct demangle_component *encoding) 3280 { 3281 const char *suffix = d_str (di); 3282 const char *pend = suffix; 3283 struct demangle_component *n; 3284 3285 if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_')) 3286 { 3287 pend += 2; 3288 while (IS_LOWER (*pend) || *pend == '_') 3289 ++pend; 3290 } 3291 while (*pend == '.' && IS_DIGIT (pend[1])) 3292 { 3293 pend += 2; 3294 while (IS_DIGIT (*pend)) 3295 ++pend; 3296 } 3297 d_advance (di, pend - suffix); 3298 n = d_make_name (di, suffix, pend - suffix); 3299 return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n); 3300 } 3301 3302 /* Add a new substitution. */ 3303 3304 static int 3305 d_add_substitution (struct d_info *di, struct demangle_component *dc) 3306 { 3307 if (dc == NULL) 3308 return 0; 3309 if (di->next_sub >= di->num_subs) 3310 return 0; 3311 di->subs[di->next_sub] = dc; 3312 ++di->next_sub; 3313 return 1; 3314 } 3315 3316 /* <substitution> ::= S <seq-id> _ 3317 ::= S_ 3318 ::= St 3319 ::= Sa 3320 ::= Sb 3321 ::= Ss 3322 ::= Si 3323 ::= So 3324 ::= Sd 3325 3326 If PREFIX is non-zero, then this type is being used as a prefix in 3327 a qualified name. In this case, for the standard substitutions, we 3328 need to check whether we are being used as a prefix for a 3329 constructor or destructor, and return a full template name. 3330 Otherwise we will get something like std::iostream::~iostream() 3331 which does not correspond particularly well to any function which 3332 actually appears in the source. 3333 */ 3334 3335 static const struct d_standard_sub_info standard_subs[] = 3336 { 3337 { 't', NL ("std"), 3338 NL ("std"), 3339 NULL, 0 }, 3340 { 'a', NL ("std::allocator"), 3341 NL ("std::allocator"), 3342 NL ("allocator") }, 3343 { 'b', NL ("std::basic_string"), 3344 NL ("std::basic_string"), 3345 NL ("basic_string") }, 3346 { 's', NL ("std::string"), 3347 NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"), 3348 NL ("basic_string") }, 3349 { 'i', NL ("std::istream"), 3350 NL ("std::basic_istream<char, std::char_traits<char> >"), 3351 NL ("basic_istream") }, 3352 { 'o', NL ("std::ostream"), 3353 NL ("std::basic_ostream<char, std::char_traits<char> >"), 3354 NL ("basic_ostream") }, 3355 { 'd', NL ("std::iostream"), 3356 NL ("std::basic_iostream<char, std::char_traits<char> >"), 3357 NL ("basic_iostream") } 3358 }; 3359 3360 static struct demangle_component * 3361 d_substitution (struct d_info *di, int prefix) 3362 { 3363 char c; 3364 3365 if (! d_check_char (di, 'S')) 3366 return NULL; 3367 3368 c = d_next_char (di); 3369 if (c == '_' || IS_DIGIT (c) || IS_UPPER (c)) 3370 { 3371 unsigned int id; 3372 3373 id = 0; 3374 if (c != '_') 3375 { 3376 do 3377 { 3378 unsigned int new_id; 3379 3380 if (IS_DIGIT (c)) 3381 new_id = id * 36 + c - '0'; 3382 else if (IS_UPPER (c)) 3383 new_id = id * 36 + c - 'A' + 10; 3384 else 3385 return NULL; 3386 if (new_id < id) 3387 return NULL; 3388 id = new_id; 3389 c = d_next_char (di); 3390 } 3391 while (c != '_'); 3392 3393 ++id; 3394 } 3395 3396 if (id >= (unsigned int) di->next_sub) 3397 return NULL; 3398 3399 ++di->did_subs; 3400 3401 return di->subs[id]; 3402 } 3403 else 3404 { 3405 int verbose; 3406 const struct d_standard_sub_info *p; 3407 const struct d_standard_sub_info *pend; 3408 3409 verbose = (di->options & DMGL_VERBOSE) != 0; 3410 if (! verbose && prefix) 3411 { 3412 char peek; 3413 3414 peek = d_peek_char (di); 3415 if (peek == 'C' || peek == 'D') 3416 verbose = 1; 3417 } 3418 3419 pend = (&standard_subs[0] 3420 + sizeof standard_subs / sizeof standard_subs[0]); 3421 for (p = &standard_subs[0]; p < pend; ++p) 3422 { 3423 if (c == p->code) 3424 { 3425 const char *s; 3426 int len; 3427 3428 if (p->set_last_name != NULL) 3429 di->last_name = d_make_sub (di, p->set_last_name, 3430 p->set_last_name_len); 3431 if (verbose) 3432 { 3433 s = p->full_expansion; 3434 len = p->full_len; 3435 } 3436 else 3437 { 3438 s = p->simple_expansion; 3439 len = p->simple_len; 3440 } 3441 di->expansion += len; 3442 return d_make_sub (di, s, len); 3443 } 3444 } 3445 3446 return NULL; 3447 } 3448 } 3449 3450 /* Initialize a growable string. */ 3451 3452 static void 3453 d_growable_string_init (struct d_growable_string *dgs, size_t estimate) 3454 { 3455 dgs->buf = NULL; 3456 dgs->len = 0; 3457 dgs->alc = 0; 3458 dgs->allocation_failure = 0; 3459 3460 if (estimate > 0) 3461 d_growable_string_resize (dgs, estimate); 3462 } 3463 3464 /* Grow a growable string to a given size. */ 3465 3466 static inline void 3467 d_growable_string_resize (struct d_growable_string *dgs, size_t need) 3468 { 3469 size_t newalc; 3470 char *newbuf; 3471 3472 if (dgs->allocation_failure) 3473 return; 3474 3475 /* Start allocation at two bytes to avoid any possibility of confusion 3476 with the special value of 1 used as a return in *palc to indicate 3477 allocation failures. */ 3478 newalc = dgs->alc > 0 ? dgs->alc : 2; 3479 while (newalc < need) 3480 newalc <<= 1; 3481 3482 newbuf = (char *) realloc (dgs->buf, newalc); 3483 if (newbuf == NULL) 3484 { 3485 free (dgs->buf); 3486 dgs->buf = NULL; 3487 dgs->len = 0; 3488 dgs->alc = 0; 3489 dgs->allocation_failure = 1; 3490 return; 3491 } 3492 dgs->buf = newbuf; 3493 dgs->alc = newalc; 3494 } 3495 3496 /* Append a buffer to a growable string. */ 3497 3498 static inline void 3499 d_growable_string_append_buffer (struct d_growable_string *dgs, 3500 const char *s, size_t l) 3501 { 3502 size_t need; 3503 3504 need = dgs->len + l + 1; 3505 if (need > dgs->alc) 3506 d_growable_string_resize (dgs, need); 3507 3508 if (dgs->allocation_failure) 3509 return; 3510 3511 memcpy (dgs->buf + dgs->len, s, l); 3512 dgs->buf[dgs->len + l] = '\0'; 3513 dgs->len += l; 3514 } 3515 3516 /* Bridge growable strings to the callback mechanism. */ 3517 3518 static void 3519 d_growable_string_callback_adapter (const char *s, size_t l, void *opaque) 3520 { 3521 struct d_growable_string *dgs = (struct d_growable_string*) opaque; 3522 3523 d_growable_string_append_buffer (dgs, s, l); 3524 } 3525 3526 /* Initialize a print information structure. */ 3527 3528 static void 3529 d_print_init (struct d_print_info *dpi, demangle_callbackref callback, 3530 void *opaque) 3531 { 3532 dpi->len = 0; 3533 dpi->last_char = '\0'; 3534 dpi->templates = NULL; 3535 dpi->modifiers = NULL; 3536 dpi->pack_index = 0; 3537 dpi->flush_count = 0; 3538 3539 dpi->callback = callback; 3540 dpi->opaque = opaque; 3541 3542 dpi->demangle_failure = 0; 3543 } 3544 3545 /* Indicate that an error occurred during printing, and test for error. */ 3546 3547 static inline void 3548 d_print_error (struct d_print_info *dpi) 3549 { 3550 dpi->demangle_failure = 1; 3551 } 3552 3553 static inline int 3554 d_print_saw_error (struct d_print_info *dpi) 3555 { 3556 return dpi->demangle_failure != 0; 3557 } 3558 3559 /* Flush buffered characters to the callback. */ 3560 3561 static inline void 3562 d_print_flush (struct d_print_info *dpi) 3563 { 3564 dpi->buf[dpi->len] = '\0'; 3565 dpi->callback (dpi->buf, dpi->len, dpi->opaque); 3566 dpi->len = 0; 3567 dpi->flush_count++; 3568 } 3569 3570 /* Append characters and buffers for printing. */ 3571 3572 static inline void 3573 d_append_char (struct d_print_info *dpi, char c) 3574 { 3575 if (dpi->len == sizeof (dpi->buf) - 1) 3576 d_print_flush (dpi); 3577 3578 dpi->buf[dpi->len++] = c; 3579 dpi->last_char = c; 3580 } 3581 3582 static inline void 3583 d_append_buffer (struct d_print_info *dpi, const char *s, size_t l) 3584 { 3585 size_t i; 3586 3587 for (i = 0; i < l; i++) 3588 d_append_char (dpi, s[i]); 3589 } 3590 3591 static inline void 3592 d_append_string (struct d_print_info *dpi, const char *s) 3593 { 3594 d_append_buffer (dpi, s, strlen (s)); 3595 } 3596 3597 static inline void 3598 d_append_num (struct d_print_info *dpi, long l) 3599 { 3600 char buf[25]; 3601 sprintf (buf,"%ld", l); 3602 d_append_string (dpi, buf); 3603 } 3604 3605 static inline char 3606 d_last_char (struct d_print_info *dpi) 3607 { 3608 return dpi->last_char; 3609 } 3610 3611 /* Turn components into a human readable string. OPTIONS is the 3612 options bits passed to the demangler. DC is the tree to print. 3613 CALLBACK is a function to call to flush demangled string segments 3614 as they fill the intermediate buffer, and OPAQUE is a generalized 3615 callback argument. On success, this returns 1. On failure, 3616 it returns 0, indicating a bad parse. It does not use heap 3617 memory to build an output string, so cannot encounter memory 3618 allocation failure. */ 3619 3620 CP_STATIC_IF_GLIBCPP_V3 3621 int 3622 cplus_demangle_print_callback (int options, 3623 const struct demangle_component *dc, 3624 demangle_callbackref callback, void *opaque) 3625 { 3626 struct d_print_info dpi; 3627 3628 d_print_init (&dpi, callback, opaque); 3629 3630 d_print_comp (&dpi, options, dc); 3631 3632 d_print_flush (&dpi); 3633 3634 return ! d_print_saw_error (&dpi); 3635 } 3636 3637 /* Turn components into a human readable string. OPTIONS is the 3638 options bits passed to the demangler. DC is the tree to print. 3639 ESTIMATE is a guess at the length of the result. This returns a 3640 string allocated by malloc, or NULL on error. On success, this 3641 sets *PALC to the size of the allocated buffer. On failure, this 3642 sets *PALC to 0 for a bad parse, or to 1 for a memory allocation 3643 failure. */ 3644 3645 CP_STATIC_IF_GLIBCPP_V3 3646 char * 3647 cplus_demangle_print (int options, const struct demangle_component *dc, 3648 int estimate, size_t *palc) 3649 { 3650 struct d_growable_string dgs; 3651 3652 d_growable_string_init (&dgs, estimate); 3653 3654 if (! cplus_demangle_print_callback (options, dc, 3655 d_growable_string_callback_adapter, 3656 &dgs)) 3657 { 3658 free (dgs.buf); 3659 *palc = 0; 3660 return NULL; 3661 } 3662 3663 *palc = dgs.allocation_failure ? 1 : dgs.alc; 3664 return dgs.buf; 3665 } 3666 3667 /* Returns the I'th element of the template arglist ARGS, or NULL on 3668 failure. */ 3669 3670 static struct demangle_component * 3671 d_index_template_argument (struct demangle_component *args, int i) 3672 { 3673 struct demangle_component *a; 3674 3675 for (a = args; 3676 a != NULL; 3677 a = d_right (a)) 3678 { 3679 if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) 3680 return NULL; 3681 if (i <= 0) 3682 break; 3683 --i; 3684 } 3685 if (i != 0 || a == NULL) 3686 return NULL; 3687 3688 return d_left (a); 3689 } 3690 3691 /* Returns the template argument from the current context indicated by DC, 3692 which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */ 3693 3694 static struct demangle_component * 3695 d_lookup_template_argument (struct d_print_info *dpi, 3696 const struct demangle_component *dc) 3697 { 3698 if (dpi->templates == NULL) 3699 { 3700 d_print_error (dpi); 3701 return NULL; 3702 } 3703 3704 return d_index_template_argument 3705 (d_right (dpi->templates->template_decl), 3706 dc->u.s_number.number); 3707 } 3708 3709 /* Returns a template argument pack used in DC (any will do), or NULL. */ 3710 3711 static struct demangle_component * 3712 d_find_pack (struct d_print_info *dpi, 3713 const struct demangle_component *dc) 3714 { 3715 struct demangle_component *a; 3716 if (dc == NULL) 3717 return NULL; 3718 3719 switch (dc->type) 3720 { 3721 case DEMANGLE_COMPONENT_TEMPLATE_PARAM: 3722 a = d_lookup_template_argument (dpi, dc); 3723 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) 3724 return a; 3725 return NULL; 3726 3727 case DEMANGLE_COMPONENT_PACK_EXPANSION: 3728 return NULL; 3729 3730 case DEMANGLE_COMPONENT_LAMBDA: 3731 case DEMANGLE_COMPONENT_NAME: 3732 case DEMANGLE_COMPONENT_OPERATOR: 3733 case DEMANGLE_COMPONENT_BUILTIN_TYPE: 3734 case DEMANGLE_COMPONENT_SUB_STD: 3735 case DEMANGLE_COMPONENT_CHARACTER: 3736 case DEMANGLE_COMPONENT_FUNCTION_PARAM: 3737 case DEMANGLE_COMPONENT_UNNAMED_TYPE: 3738 return NULL; 3739 3740 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: 3741 return d_find_pack (dpi, dc->u.s_extended_operator.name); 3742 case DEMANGLE_COMPONENT_CTOR: 3743 return d_find_pack (dpi, dc->u.s_ctor.name); 3744 case DEMANGLE_COMPONENT_DTOR: 3745 return d_find_pack (dpi, dc->u.s_dtor.name); 3746 3747 default: 3748 a = d_find_pack (dpi, d_left (dc)); 3749 if (a) 3750 return a; 3751 return d_find_pack (dpi, d_right (dc)); 3752 } 3753 } 3754 3755 /* Returns the length of the template argument pack DC. */ 3756 3757 static int 3758 d_pack_length (const struct demangle_component *dc) 3759 { 3760 int count = 0; 3761 while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST 3762 && d_left (dc) != NULL) 3763 { 3764 ++count; 3765 dc = d_right (dc); 3766 } 3767 return count; 3768 } 3769 3770 /* DC is a component of a mangled expression. Print it, wrapped in parens 3771 if needed. */ 3772 3773 static void 3774 d_print_subexpr (struct d_print_info *dpi, int options, 3775 const struct demangle_component *dc) 3776 { 3777 int simple = 0; 3778 if (dc->type == DEMANGLE_COMPONENT_NAME 3779 || dc->type == DEMANGLE_COMPONENT_QUAL_NAME 3780 || dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST 3781 || dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM) 3782 simple = 1; 3783 if (!simple) 3784 d_append_char (dpi, '('); 3785 d_print_comp (dpi, options, dc); 3786 if (!simple) 3787 d_append_char (dpi, ')'); 3788 } 3789 3790 /* Subroutine to handle components. */ 3791 3792 static void 3793 d_print_comp (struct d_print_info *dpi, int options, 3794 const struct demangle_component *dc) 3795 { 3796 /* Magic variable to let reference smashing skip over the next modifier 3797 without needing to modify *dc. */ 3798 const struct demangle_component *mod_inner = NULL; 3799 3800 if (dc == NULL) 3801 { 3802 d_print_error (dpi); 3803 return; 3804 } 3805 if (d_print_saw_error (dpi)) 3806 return; 3807 3808 switch (dc->type) 3809 { 3810 case DEMANGLE_COMPONENT_NAME: 3811 if ((options & DMGL_JAVA) == 0) 3812 d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len); 3813 else 3814 d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len); 3815 return; 3816 3817 case DEMANGLE_COMPONENT_QUAL_NAME: 3818 case DEMANGLE_COMPONENT_LOCAL_NAME: 3819 d_print_comp (dpi, options, d_left (dc)); 3820 if ((options & DMGL_JAVA) == 0) 3821 d_append_string (dpi, "::"); 3822 else 3823 d_append_char (dpi, '.'); 3824 d_print_comp (dpi, options, d_right (dc)); 3825 return; 3826 3827 case DEMANGLE_COMPONENT_TYPED_NAME: 3828 { 3829 struct d_print_mod *hold_modifiers; 3830 struct demangle_component *typed_name; 3831 struct d_print_mod adpm[4]; 3832 unsigned int i; 3833 struct d_print_template dpt; 3834 3835 /* Pass the name down to the type so that it can be printed in 3836 the right place for the type. We also have to pass down 3837 any CV-qualifiers, which apply to the this parameter. */ 3838 hold_modifiers = dpi->modifiers; 3839 dpi->modifiers = 0; 3840 i = 0; 3841 typed_name = d_left (dc); 3842 while (typed_name != NULL) 3843 { 3844 if (i >= sizeof adpm / sizeof adpm[0]) 3845 { 3846 d_print_error (dpi); 3847 return; 3848 } 3849 3850 adpm[i].next = dpi->modifiers; 3851 dpi->modifiers = &adpm[i]; 3852 adpm[i].mod = typed_name; 3853 adpm[i].printed = 0; 3854 adpm[i].templates = dpi->templates; 3855 ++i; 3856 3857 if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS 3858 && typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS 3859 && typed_name->type != DEMANGLE_COMPONENT_CONST_THIS) 3860 break; 3861 3862 typed_name = d_left (typed_name); 3863 } 3864 3865 if (typed_name == NULL) 3866 { 3867 d_print_error (dpi); 3868 return; 3869 } 3870 3871 /* If typed_name is a template, then it applies to the 3872 function type as well. */ 3873 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE) 3874 { 3875 dpt.next = dpi->templates; 3876 dpi->templates = &dpt; 3877 dpt.template_decl = typed_name; 3878 } 3879 3880 /* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then 3881 there may be CV-qualifiers on its right argument which 3882 really apply here; this happens when parsing a class which 3883 is local to a function. */ 3884 if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME) 3885 { 3886 struct demangle_component *local_name; 3887 3888 local_name = d_right (typed_name); 3889 if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG) 3890 local_name = local_name->u.s_unary_num.sub; 3891 while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS 3892 || local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS 3893 || local_name->type == DEMANGLE_COMPONENT_CONST_THIS) 3894 { 3895 if (i >= sizeof adpm / sizeof adpm[0]) 3896 { 3897 d_print_error (dpi); 3898 return; 3899 } 3900 3901 adpm[i] = adpm[i - 1]; 3902 adpm[i].next = &adpm[i - 1]; 3903 dpi->modifiers = &adpm[i]; 3904 3905 adpm[i - 1].mod = local_name; 3906 adpm[i - 1].printed = 0; 3907 adpm[i - 1].templates = dpi->templates; 3908 ++i; 3909 3910 local_name = d_left (local_name); 3911 } 3912 } 3913 3914 d_print_comp (dpi, options, d_right (dc)); 3915 3916 if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE) 3917 dpi->templates = dpt.next; 3918 3919 /* If the modifiers didn't get printed by the type, print them 3920 now. */ 3921 while (i > 0) 3922 { 3923 --i; 3924 if (! adpm[i].printed) 3925 { 3926 d_append_char (dpi, ' '); 3927 d_print_mod (dpi, options, adpm[i].mod); 3928 } 3929 } 3930 3931 dpi->modifiers = hold_modifiers; 3932 3933 return; 3934 } 3935 3936 case DEMANGLE_COMPONENT_TEMPLATE: 3937 { 3938 struct d_print_mod *hold_dpm; 3939 struct demangle_component *dcl; 3940 3941 /* Don't push modifiers into a template definition. Doing so 3942 could give the wrong definition for a template argument. 3943 Instead, treat the template essentially as a name. */ 3944 3945 hold_dpm = dpi->modifiers; 3946 dpi->modifiers = NULL; 3947 3948 dcl = d_left (dc); 3949 3950 if ((options & DMGL_JAVA) != 0 3951 && dcl->type == DEMANGLE_COMPONENT_NAME 3952 && dcl->u.s_name.len == 6 3953 && strncmp (dcl->u.s_name.s, "JArray", 6) == 0) 3954 { 3955 /* Special-case Java arrays, so that JArray<TYPE> appears 3956 instead as TYPE[]. */ 3957 3958 d_print_comp (dpi, options, d_right (dc)); 3959 d_append_string (dpi, "[]"); 3960 } 3961 else 3962 { 3963 d_print_comp (dpi, options, dcl); 3964 if (d_last_char (dpi) == '<') 3965 d_append_char (dpi, ' '); 3966 d_append_char (dpi, '<'); 3967 d_print_comp (dpi, options, d_right (dc)); 3968 /* Avoid generating two consecutive '>' characters, to avoid 3969 the C++ syntactic ambiguity. */ 3970 if (d_last_char (dpi) == '>') 3971 d_append_char (dpi, ' '); 3972 d_append_char (dpi, '>'); 3973 } 3974 3975 dpi->modifiers = hold_dpm; 3976 3977 return; 3978 } 3979 3980 case DEMANGLE_COMPONENT_TEMPLATE_PARAM: 3981 { 3982 struct d_print_template *hold_dpt; 3983 struct demangle_component *a = d_lookup_template_argument (dpi, dc); 3984 3985 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) 3986 a = d_index_template_argument (a, dpi->pack_index); 3987 3988 if (a == NULL) 3989 { 3990 d_print_error (dpi); 3991 return; 3992 } 3993 3994 /* While processing this parameter, we need to pop the list of 3995 templates. This is because the template parameter may 3996 itself be a reference to a parameter of an outer 3997 template. */ 3998 3999 hold_dpt = dpi->templates; 4000 dpi->templates = hold_dpt->next; 4001 4002 d_print_comp (dpi, options, a); 4003 4004 dpi->templates = hold_dpt; 4005 4006 return; 4007 } 4008 4009 case DEMANGLE_COMPONENT_CTOR: 4010 d_print_comp (dpi, options, dc->u.s_ctor.name); 4011 return; 4012 4013 case DEMANGLE_COMPONENT_DTOR: 4014 d_append_char (dpi, '~'); 4015 d_print_comp (dpi, options, dc->u.s_dtor.name); 4016 return; 4017 4018 case DEMANGLE_COMPONENT_VTABLE: 4019 d_append_string (dpi, "vtable for "); 4020 d_print_comp (dpi, options, d_left (dc)); 4021 return; 4022 4023 case DEMANGLE_COMPONENT_VTT: 4024 d_append_string (dpi, "VTT for "); 4025 d_print_comp (dpi, options, d_left (dc)); 4026 return; 4027 4028 case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: 4029 d_append_string (dpi, "construction vtable for "); 4030 d_print_comp (dpi, options, d_left (dc)); 4031 d_append_string (dpi, "-in-"); 4032 d_print_comp (dpi, options, d_right (dc)); 4033 return; 4034 4035 case DEMANGLE_COMPONENT_TYPEINFO: 4036 d_append_string (dpi, "typeinfo for "); 4037 d_print_comp (dpi, options, d_left (dc)); 4038 return; 4039 4040 case DEMANGLE_COMPONENT_TYPEINFO_NAME: 4041 d_append_string (dpi, "typeinfo name for "); 4042 d_print_comp (dpi, options, d_left (dc)); 4043 return; 4044 4045 case DEMANGLE_COMPONENT_TYPEINFO_FN: 4046 d_append_string (dpi, "typeinfo fn for "); 4047 d_print_comp (dpi, options, d_left (dc)); 4048 return; 4049 4050 case DEMANGLE_COMPONENT_THUNK: 4051 d_append_string (dpi, "non-virtual thunk to "); 4052 d_print_comp (dpi, options, d_left (dc)); 4053 return; 4054 4055 case DEMANGLE_COMPONENT_VIRTUAL_THUNK: 4056 d_append_string (dpi, "virtual thunk to "); 4057 d_print_comp (dpi, options, d_left (dc)); 4058 return; 4059 4060 case DEMANGLE_COMPONENT_COVARIANT_THUNK: 4061 d_append_string (dpi, "covariant return thunk to "); 4062 d_print_comp (dpi, options, d_left (dc)); 4063 return; 4064 4065 case DEMANGLE_COMPONENT_JAVA_CLASS: 4066 d_append_string (dpi, "java Class for "); 4067 d_print_comp (dpi, options, d_left (dc)); 4068 return; 4069 4070 case DEMANGLE_COMPONENT_GUARD: 4071 d_append_string (dpi, "guard variable for "); 4072 d_print_comp (dpi, options, d_left (dc)); 4073 return; 4074 4075 case DEMANGLE_COMPONENT_REFTEMP: 4076 d_append_string (dpi, "reference temporary #"); 4077 d_print_comp (dpi, options, d_right (dc)); 4078 d_append_string (dpi, " for "); 4079 d_print_comp (dpi, options, d_left (dc)); 4080 return; 4081 4082 case DEMANGLE_COMPONENT_HIDDEN_ALIAS: 4083 d_append_string (dpi, "hidden alias for "); 4084 d_print_comp (dpi, options, d_left (dc)); 4085 return; 4086 4087 case DEMANGLE_COMPONENT_TRANSACTION_CLONE: 4088 d_append_string (dpi, "transaction clone for "); 4089 d_print_comp (dpi, options, d_left (dc)); 4090 return; 4091 4092 case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE: 4093 d_append_string (dpi, "non-transaction clone for "); 4094 d_print_comp (dpi, options, d_left (dc)); 4095 return; 4096 4097 case DEMANGLE_COMPONENT_SUB_STD: 4098 d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len); 4099 return; 4100 4101 case DEMANGLE_COMPONENT_RESTRICT: 4102 case DEMANGLE_COMPONENT_VOLATILE: 4103 case DEMANGLE_COMPONENT_CONST: 4104 { 4105 struct d_print_mod *pdpm; 4106 4107 /* When printing arrays, it's possible to have cases where the 4108 same CV-qualifier gets pushed on the stack multiple times. 4109 We only need to print it once. */ 4110 4111 for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next) 4112 { 4113 if (! pdpm->printed) 4114 { 4115 if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT 4116 && pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE 4117 && pdpm->mod->type != DEMANGLE_COMPONENT_CONST) 4118 break; 4119 if (pdpm->mod->type == dc->type) 4120 { 4121 d_print_comp (dpi, options, d_left (dc)); 4122 return; 4123 } 4124 } 4125 } 4126 } 4127 goto modifier; 4128 4129 case DEMANGLE_COMPONENT_REFERENCE: 4130 case DEMANGLE_COMPONENT_RVALUE_REFERENCE: 4131 { 4132 /* Handle reference smashing: & + && = &. */ 4133 const struct demangle_component *sub = d_left (dc); 4134 if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM) 4135 { 4136 struct demangle_component *a = d_lookup_template_argument (dpi, sub); 4137 if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) 4138 a = d_index_template_argument (a, dpi->pack_index); 4139 4140 if (a == NULL) 4141 { 4142 d_print_error (dpi); 4143 return; 4144 } 4145 4146 sub = a; 4147 } 4148 4149 if (sub->type == DEMANGLE_COMPONENT_REFERENCE 4150 || sub->type == dc->type) 4151 dc = sub; 4152 else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE) 4153 mod_inner = d_left (sub); 4154 } 4155 /* Fall through. */ 4156 4157 case DEMANGLE_COMPONENT_RESTRICT_THIS: 4158 case DEMANGLE_COMPONENT_VOLATILE_THIS: 4159 case DEMANGLE_COMPONENT_CONST_THIS: 4160 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: 4161 case DEMANGLE_COMPONENT_POINTER: 4162 case DEMANGLE_COMPONENT_COMPLEX: 4163 case DEMANGLE_COMPONENT_IMAGINARY: 4164 modifier: 4165 { 4166 /* We keep a list of modifiers on the stack. */ 4167 struct d_print_mod dpm; 4168 4169 dpm.next = dpi->modifiers; 4170 dpi->modifiers = &dpm; 4171 dpm.mod = dc; 4172 dpm.printed = 0; 4173 dpm.templates = dpi->templates; 4174 4175 if (!mod_inner) 4176 mod_inner = d_left (dc); 4177 4178 d_print_comp (dpi, options, mod_inner); 4179 4180 /* If the modifier didn't get printed by the type, print it 4181 now. */ 4182 if (! dpm.printed) 4183 d_print_mod (dpi, options, dc); 4184 4185 dpi->modifiers = dpm.next; 4186 4187 return; 4188 } 4189 4190 case DEMANGLE_COMPONENT_BUILTIN_TYPE: 4191 if ((options & DMGL_JAVA) == 0) 4192 d_append_buffer (dpi, dc->u.s_builtin.type->name, 4193 dc->u.s_builtin.type->len); 4194 else 4195 d_append_buffer (dpi, dc->u.s_builtin.type->java_name, 4196 dc->u.s_builtin.type->java_len); 4197 return; 4198 4199 case DEMANGLE_COMPONENT_VENDOR_TYPE: 4200 d_print_comp (dpi, options, d_left (dc)); 4201 return; 4202 4203 case DEMANGLE_COMPONENT_FUNCTION_TYPE: 4204 { 4205 if ((options & DMGL_RET_POSTFIX) != 0) 4206 d_print_function_type (dpi, 4207 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP), 4208 dc, dpi->modifiers); 4209 4210 /* Print return type if present */ 4211 if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0) 4212 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP), 4213 d_left (dc)); 4214 else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0) 4215 { 4216 struct d_print_mod dpm; 4217 4218 /* We must pass this type down as a modifier in order to 4219 print it in the right location. */ 4220 dpm.next = dpi->modifiers; 4221 dpi->modifiers = &dpm; 4222 dpm.mod = dc; 4223 dpm.printed = 0; 4224 dpm.templates = dpi->templates; 4225 4226 d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP), 4227 d_left (dc)); 4228 4229 dpi->modifiers = dpm.next; 4230 4231 if (dpm.printed) 4232 return; 4233 4234 /* In standard prefix notation, there is a space between the 4235 return type and the function signature. */ 4236 if ((options & DMGL_RET_POSTFIX) == 0) 4237 d_append_char (dpi, ' '); 4238 } 4239 4240 if ((options & DMGL_RET_POSTFIX) == 0) 4241 d_print_function_type (dpi, 4242 options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP), 4243 dc, dpi->modifiers); 4244 4245 return; 4246 } 4247 4248 case DEMANGLE_COMPONENT_ARRAY_TYPE: 4249 { 4250 struct d_print_mod *hold_modifiers; 4251 struct d_print_mod adpm[4]; 4252 unsigned int i; 4253 struct d_print_mod *pdpm; 4254 4255 /* We must pass this type down as a modifier in order to print 4256 multi-dimensional arrays correctly. If the array itself is 4257 CV-qualified, we act as though the element type were 4258 CV-qualified. We do this by copying the modifiers down 4259 rather than fiddling pointers, so that we don't wind up 4260 with a d_print_mod higher on the stack pointing into our 4261 stack frame after we return. */ 4262 4263 hold_modifiers = dpi->modifiers; 4264 4265 adpm[0].next = hold_modifiers; 4266 dpi->modifiers = &adpm[0]; 4267 adpm[0].mod = dc; 4268 adpm[0].printed = 0; 4269 adpm[0].templates = dpi->templates; 4270 4271 i = 1; 4272 pdpm = hold_modifiers; 4273 while (pdpm != NULL 4274 && (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT 4275 || pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE 4276 || pdpm->mod->type == DEMANGLE_COMPONENT_CONST)) 4277 { 4278 if (! pdpm->printed) 4279 { 4280 if (i >= sizeof adpm / sizeof adpm[0]) 4281 { 4282 d_print_error (dpi); 4283 return; 4284 } 4285 4286 adpm[i] = *pdpm; 4287 adpm[i].next = dpi->modifiers; 4288 dpi->modifiers = &adpm[i]; 4289 pdpm->printed = 1; 4290 ++i; 4291 } 4292 4293 pdpm = pdpm->next; 4294 } 4295 4296 d_print_comp (dpi, options, d_right (dc)); 4297 4298 dpi->modifiers = hold_modifiers; 4299 4300 if (adpm[0].printed) 4301 return; 4302 4303 while (i > 1) 4304 { 4305 --i; 4306 d_print_mod (dpi, options, adpm[i].mod); 4307 } 4308 4309 d_print_array_type (dpi, options, dc, dpi->modifiers); 4310 4311 return; 4312 } 4313 4314 case DEMANGLE_COMPONENT_PTRMEM_TYPE: 4315 case DEMANGLE_COMPONENT_VECTOR_TYPE: 4316 { 4317 struct d_print_mod dpm; 4318 4319 dpm.next = dpi->modifiers; 4320 dpi->modifiers = &dpm; 4321 dpm.mod = dc; 4322 dpm.printed = 0; 4323 dpm.templates = dpi->templates; 4324 4325 d_print_comp (dpi, options, d_right (dc)); 4326 4327 /* If the modifier didn't get printed by the type, print it 4328 now. */ 4329 if (! dpm.printed) 4330 d_print_mod (dpi, options, dc); 4331 4332 dpi->modifiers = dpm.next; 4333 4334 return; 4335 } 4336 4337 case DEMANGLE_COMPONENT_FIXED_TYPE: 4338 if (dc->u.s_fixed.sat) 4339 d_append_string (dpi, "_Sat "); 4340 /* Don't print "int _Accum". */ 4341 if (dc->u.s_fixed.length->u.s_builtin.type 4342 != &cplus_demangle_builtin_types['i'-'a']) 4343 { 4344 d_print_comp (dpi, options, dc->u.s_fixed.length); 4345 d_append_char (dpi, ' '); 4346 } 4347 if (dc->u.s_fixed.accum) 4348 d_append_string (dpi, "_Accum"); 4349 else 4350 d_append_string (dpi, "_Fract"); 4351 return; 4352 4353 case DEMANGLE_COMPONENT_ARGLIST: 4354 case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: 4355 if (d_left (dc) != NULL) 4356 d_print_comp (dpi, options, d_left (dc)); 4357 if (d_right (dc) != NULL) 4358 { 4359 size_t len; 4360 unsigned long int flush_count; 4361 /* Make sure ", " isn't flushed by d_append_string, otherwise 4362 dpi->len -= 2 wouldn't work. */ 4363 if (dpi->len >= sizeof (dpi->buf) - 2) 4364 d_print_flush (dpi); 4365 d_append_string (dpi, ", "); 4366 len = dpi->len; 4367 flush_count = dpi->flush_count; 4368 d_print_comp (dpi, options, d_right (dc)); 4369 /* If that didn't print anything (which can happen with empty 4370 template argument packs), remove the comma and space. */ 4371 if (dpi->flush_count == flush_count && dpi->len == len) 4372 dpi->len -= 2; 4373 } 4374 return; 4375 4376 case DEMANGLE_COMPONENT_INITIALIZER_LIST: 4377 { 4378 struct demangle_component *type = d_left (dc); 4379 struct demangle_component *list = d_right (dc); 4380 4381 if (type) 4382 d_print_comp (dpi, options, type); 4383 d_append_char (dpi, '{'); 4384 d_print_comp (dpi, options, list); 4385 d_append_char (dpi, '}'); 4386 } 4387 return; 4388 4389 case DEMANGLE_COMPONENT_OPERATOR: 4390 { 4391 const struct demangle_operator_info *op = dc->u.s_operator.op; 4392 int len = op->len; 4393 4394 d_append_string (dpi, "operator"); 4395 /* Add a space before new/delete. */ 4396 if (IS_LOWER (op->name[0])) 4397 d_append_char (dpi, ' '); 4398 /* Omit a trailing space. */ 4399 if (op->name[len-1] == ' ') 4400 --len; 4401 d_append_buffer (dpi, op->name, len); 4402 return; 4403 } 4404 4405 case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: 4406 d_append_string (dpi, "operator "); 4407 d_print_comp (dpi, options, dc->u.s_extended_operator.name); 4408 return; 4409 4410 case DEMANGLE_COMPONENT_CAST: 4411 d_append_string (dpi, "operator "); 4412 d_print_cast (dpi, options, dc); 4413 return; 4414 4415 case DEMANGLE_COMPONENT_NULLARY: 4416 d_print_expr_op (dpi, options, d_left (dc)); 4417 return; 4418 4419 case DEMANGLE_COMPONENT_UNARY: 4420 { 4421 struct demangle_component *op = d_left (dc); 4422 struct demangle_component *operand = d_right (dc); 4423 const char *code = NULL; 4424 4425 if (op->type == DEMANGLE_COMPONENT_OPERATOR) 4426 { 4427 code = op->u.s_operator.op->code; 4428 if (!strcmp (code, "ad")) 4429 { 4430 /* Don't print the argument list for the address of a 4431 function. */ 4432 if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME 4433 && d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME 4434 && d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE) 4435 operand = d_left (operand); 4436 } 4437 if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS) 4438 { 4439 /* This indicates a suffix operator. */ 4440 operand = d_left (operand); 4441 d_print_subexpr (dpi, options, operand); 4442 d_print_expr_op (dpi, options, op); 4443 return; 4444 } 4445 } 4446 4447 if (op->type != DEMANGLE_COMPONENT_CAST) 4448 d_print_expr_op (dpi, options, op); 4449 else 4450 { 4451 d_append_char (dpi, '('); 4452 d_print_cast (dpi, options, op); 4453 d_append_char (dpi, ')'); 4454 } 4455 if (code && !strcmp (code, "gs")) 4456 /* Avoid parens after '::'. */ 4457 d_print_comp (dpi, options, operand); 4458 else if (code && !strcmp (code, "st")) 4459 /* Always print parens for sizeof (type). */ 4460 { 4461 d_append_char (dpi, '('); 4462 d_print_comp (dpi, options, operand); 4463 d_append_char (dpi, ')'); 4464 } 4465 else 4466 d_print_subexpr (dpi, options, operand); 4467 } 4468 return; 4469 4470 case DEMANGLE_COMPONENT_BINARY: 4471 if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS) 4472 { 4473 d_print_error (dpi); 4474 return; 4475 } 4476 4477 if (op_is_new_cast (d_left (dc))) 4478 { 4479 d_print_expr_op (dpi, options, d_left (dc)); 4480 d_append_char (dpi, '<'); 4481 d_print_comp (dpi, options, d_left (d_right (dc))); 4482 d_append_string (dpi, ">("); 4483 d_print_comp (dpi, options, d_right (d_right (dc))); 4484 d_append_char (dpi, ')'); 4485 return; 4486 } 4487 4488 /* We wrap an expression which uses the greater-than operator in 4489 an extra layer of parens so that it does not get confused 4490 with the '>' which ends the template parameters. */ 4491 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR 4492 && d_left (dc)->u.s_operator.op->len == 1 4493 && d_left (dc)->u.s_operator.op->name[0] == '>') 4494 d_append_char (dpi, '('); 4495 4496 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0 4497 && d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME) 4498 { 4499 /* Function call used in an expression should not have printed types 4500 of the function arguments. Values of the function arguments still 4501 get printed below. */ 4502 4503 const struct demangle_component *func = d_left (d_right (dc)); 4504 4505 if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE) 4506 d_print_error (dpi); 4507 d_print_subexpr (dpi, options, d_left (func)); 4508 } 4509 else 4510 d_print_subexpr (dpi, options, d_left (d_right (dc))); 4511 if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0) 4512 { 4513 d_append_char (dpi, '['); 4514 d_print_comp (dpi, options, d_right (d_right (dc))); 4515 d_append_char (dpi, ']'); 4516 } 4517 else 4518 { 4519 if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0) 4520 d_print_expr_op (dpi, options, d_left (dc)); 4521 d_print_subexpr (dpi, options, d_right (d_right (dc))); 4522 } 4523 4524 if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR 4525 && d_left (dc)->u.s_operator.op->len == 1 4526 && d_left (dc)->u.s_operator.op->name[0] == '>') 4527 d_append_char (dpi, ')'); 4528 4529 return; 4530 4531 case DEMANGLE_COMPONENT_BINARY_ARGS: 4532 /* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */ 4533 d_print_error (dpi); 4534 return; 4535 4536 case DEMANGLE_COMPONENT_TRINARY: 4537 if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1 4538 || d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2) 4539 { 4540 d_print_error (dpi); 4541 return; 4542 } 4543 { 4544 struct demangle_component *op = d_left (dc); 4545 struct demangle_component *first = d_left (d_right (dc)); 4546 struct demangle_component *second = d_left (d_right (d_right (dc))); 4547 struct demangle_component *third = d_right (d_right (d_right (dc))); 4548 4549 if (!strcmp (op->u.s_operator.op->code, "qu")) 4550 { 4551 d_print_subexpr (dpi, options, first); 4552 d_print_expr_op (dpi, options, op); 4553 d_print_subexpr (dpi, options, second); 4554 d_append_string (dpi, " : "); 4555 d_print_subexpr (dpi, options, third); 4556 } 4557 else 4558 { 4559 d_append_string (dpi, "new "); 4560 if (d_left (first) != NULL) 4561 { 4562 d_print_subexpr (dpi, options, first); 4563 d_append_char (dpi, ' '); 4564 } 4565 d_print_comp (dpi, options, second); 4566 if (third) 4567 d_print_subexpr (dpi, options, third); 4568 } 4569 } 4570 return; 4571 4572 case DEMANGLE_COMPONENT_TRINARY_ARG1: 4573 case DEMANGLE_COMPONENT_TRINARY_ARG2: 4574 /* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */ 4575 d_print_error (dpi); 4576 return; 4577 4578 case DEMANGLE_COMPONENT_LITERAL: 4579 case DEMANGLE_COMPONENT_LITERAL_NEG: 4580 { 4581 enum d_builtin_type_print tp; 4582 4583 /* For some builtin types, produce simpler output. */ 4584 tp = D_PRINT_DEFAULT; 4585 if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE) 4586 { 4587 tp = d_left (dc)->u.s_builtin.type->print; 4588 switch (tp) 4589 { 4590 case D_PRINT_INT: 4591 case D_PRINT_UNSIGNED: 4592 case D_PRINT_LONG: 4593 case D_PRINT_UNSIGNED_LONG: 4594 case D_PRINT_LONG_LONG: 4595 case D_PRINT_UNSIGNED_LONG_LONG: 4596 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME) 4597 { 4598 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG) 4599 d_append_char (dpi, '-'); 4600 d_print_comp (dpi, options, d_right (dc)); 4601 switch (tp) 4602 { 4603 default: 4604 break; 4605 case D_PRINT_UNSIGNED: 4606 d_append_char (dpi, 'u'); 4607 break; 4608 case D_PRINT_LONG: 4609 d_append_char (dpi, 'l'); 4610 break; 4611 case D_PRINT_UNSIGNED_LONG: 4612 d_append_string (dpi, "ul"); 4613 break; 4614 case D_PRINT_LONG_LONG: 4615 d_append_string (dpi, "ll"); 4616 break; 4617 case D_PRINT_UNSIGNED_LONG_LONG: 4618 d_append_string (dpi, "ull"); 4619 break; 4620 } 4621 return; 4622 } 4623 break; 4624 4625 case D_PRINT_BOOL: 4626 if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME 4627 && d_right (dc)->u.s_name.len == 1 4628 && dc->type == DEMANGLE_COMPONENT_LITERAL) 4629 { 4630 switch (d_right (dc)->u.s_name.s[0]) 4631 { 4632 case '0': 4633 d_append_string (dpi, "false"); 4634 return; 4635 case '1': 4636 d_append_string (dpi, "true"); 4637 return; 4638 default: 4639 break; 4640 } 4641 } 4642 break; 4643 4644 default: 4645 break; 4646 } 4647 } 4648 4649 d_append_char (dpi, '('); 4650 d_print_comp (dpi, options, d_left (dc)); 4651 d_append_char (dpi, ')'); 4652 if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG) 4653 d_append_char (dpi, '-'); 4654 if (tp == D_PRINT_FLOAT) 4655 d_append_char (dpi, '['); 4656 d_print_comp (dpi, options, d_right (dc)); 4657 if (tp == D_PRINT_FLOAT) 4658 d_append_char (dpi, ']'); 4659 } 4660 return; 4661 4662 case DEMANGLE_COMPONENT_NUMBER: 4663 d_append_num (dpi, dc->u.s_number.number); 4664 return; 4665 4666 case DEMANGLE_COMPONENT_JAVA_RESOURCE: 4667 d_append_string (dpi, "java resource "); 4668 d_print_comp (dpi, options, d_left (dc)); 4669 return; 4670 4671 case DEMANGLE_COMPONENT_COMPOUND_NAME: 4672 d_print_comp (dpi, options, d_left (dc)); 4673 d_print_comp (dpi, options, d_right (dc)); 4674 return; 4675 4676 case DEMANGLE_COMPONENT_CHARACTER: 4677 d_append_char (dpi, dc->u.s_character.character); 4678 return; 4679 4680 case DEMANGLE_COMPONENT_DECLTYPE: 4681 d_append_string (dpi, "decltype ("); 4682 d_print_comp (dpi, options, d_left (dc)); 4683 d_append_char (dpi, ')'); 4684 return; 4685 4686 case DEMANGLE_COMPONENT_PACK_EXPANSION: 4687 { 4688 int len; 4689 int i; 4690 struct demangle_component *a = d_find_pack (dpi, d_left (dc)); 4691 if (a == NULL) 4692 { 4693 /* d_find_pack won't find anything if the only packs involved 4694 in this expansion are function parameter packs; in that 4695 case, just print the pattern and "...". */ 4696 d_print_subexpr (dpi, options, d_left (dc)); 4697 d_append_string (dpi, "..."); 4698 return; 4699 } 4700 4701 len = d_pack_length (a); 4702 dc = d_left (dc); 4703 for (i = 0; i < len; ++i) 4704 { 4705 dpi->pack_index = i; 4706 d_print_comp (dpi, options, dc); 4707 if (i < len-1) 4708 d_append_string (dpi, ", "); 4709 } 4710 } 4711 return; 4712 4713 case DEMANGLE_COMPONENT_FUNCTION_PARAM: 4714 { 4715 long num = dc->u.s_number.number; 4716 if (num == 0) 4717 d_append_string (dpi, "this"); 4718 else 4719 { 4720 d_append_string (dpi, "{parm#"); 4721 d_append_num (dpi, num); 4722 d_append_char (dpi, '}'); 4723 } 4724 } 4725 return; 4726 4727 case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: 4728 d_append_string (dpi, "global constructors keyed to "); 4729 d_print_comp (dpi, options, dc->u.s_binary.left); 4730 return; 4731 4732 case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS: 4733 d_append_string (dpi, "global destructors keyed to "); 4734 d_print_comp (dpi, options, dc->u.s_binary.left); 4735 return; 4736 4737 case DEMANGLE_COMPONENT_LAMBDA: 4738 d_append_string (dpi, "{lambda("); 4739 d_print_comp (dpi, options, dc->u.s_unary_num.sub); 4740 d_append_string (dpi, ")#"); 4741 d_append_num (dpi, dc->u.s_unary_num.num + 1); 4742 d_append_char (dpi, '}'); 4743 return; 4744 4745 case DEMANGLE_COMPONENT_UNNAMED_TYPE: 4746 d_append_string (dpi, "{unnamed type#"); 4747 d_append_num (dpi, dc->u.s_number.number + 1); 4748 d_append_char (dpi, '}'); 4749 return; 4750 4751 case DEMANGLE_COMPONENT_CLONE: 4752 d_print_comp (dpi, options, d_left (dc)); 4753 d_append_string (dpi, " [clone "); 4754 d_print_comp (dpi, options, d_right (dc)); 4755 d_append_char (dpi, ']'); 4756 return; 4757 4758 default: 4759 d_print_error (dpi); 4760 return; 4761 } 4762 } 4763 4764 /* Print a Java dentifier. For Java we try to handle encoded extended 4765 Unicode characters. The C++ ABI doesn't mention Unicode encoding, 4766 so we don't it for C++. Characters are encoded as 4767 __U<hex-char>+_. */ 4768 4769 static void 4770 d_print_java_identifier (struct d_print_info *dpi, const char *name, int len) 4771 { 4772 const char *p; 4773 const char *end; 4774 4775 end = name + len; 4776 for (p = name; p < end; ++p) 4777 { 4778 if (end - p > 3 4779 && p[0] == '_' 4780 && p[1] == '_' 4781 && p[2] == 'U') 4782 { 4783 unsigned long c; 4784 const char *q; 4785 4786 c = 0; 4787 for (q = p + 3; q < end; ++q) 4788 { 4789 int dig; 4790 4791 if (IS_DIGIT (*q)) 4792 dig = *q - '0'; 4793 else if (*q >= 'A' && *q <= 'F') 4794 dig = *q - 'A' + 10; 4795 else if (*q >= 'a' && *q <= 'f') 4796 dig = *q - 'a' + 10; 4797 else 4798 break; 4799 4800 c = c * 16 + dig; 4801 } 4802 /* If the Unicode character is larger than 256, we don't try 4803 to deal with it here. FIXME. */ 4804 if (q < end && *q == '_' && c < 256) 4805 { 4806 d_append_char (dpi, c); 4807 p = q; 4808 continue; 4809 } 4810 } 4811 4812 d_append_char (dpi, *p); 4813 } 4814 } 4815 4816 /* Print a list of modifiers. SUFFIX is 1 if we are printing 4817 qualifiers on this after printing a function. */ 4818 4819 static void 4820 d_print_mod_list (struct d_print_info *dpi, int options, 4821 struct d_print_mod *mods, int suffix) 4822 { 4823 struct d_print_template *hold_dpt; 4824 4825 if (mods == NULL || d_print_saw_error (dpi)) 4826 return; 4827 4828 if (mods->printed 4829 || (! suffix 4830 && (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS 4831 || mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS 4832 || mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS))) 4833 { 4834 d_print_mod_list (dpi, options, mods->next, suffix); 4835 return; 4836 } 4837 4838 mods->printed = 1; 4839 4840 hold_dpt = dpi->templates; 4841 dpi->templates = mods->templates; 4842 4843 if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE) 4844 { 4845 d_print_function_type (dpi, options, mods->mod, mods->next); 4846 dpi->templates = hold_dpt; 4847 return; 4848 } 4849 else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE) 4850 { 4851 d_print_array_type (dpi, options, mods->mod, mods->next); 4852 dpi->templates = hold_dpt; 4853 return; 4854 } 4855 else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME) 4856 { 4857 struct d_print_mod *hold_modifiers; 4858 struct demangle_component *dc; 4859 4860 /* When this is on the modifier stack, we have pulled any 4861 qualifiers off the right argument already. Otherwise, we 4862 print it as usual, but don't let the left argument see any 4863 modifiers. */ 4864 4865 hold_modifiers = dpi->modifiers; 4866 dpi->modifiers = NULL; 4867 d_print_comp (dpi, options, d_left (mods->mod)); 4868 dpi->modifiers = hold_modifiers; 4869 4870 if ((options & DMGL_JAVA) == 0) 4871 d_append_string (dpi, "::"); 4872 else 4873 d_append_char (dpi, '.'); 4874 4875 dc = d_right (mods->mod); 4876 4877 if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG) 4878 { 4879 d_append_string (dpi, "{default arg#"); 4880 d_append_num (dpi, dc->u.s_unary_num.num + 1); 4881 d_append_string (dpi, "}::"); 4882 dc = dc->u.s_unary_num.sub; 4883 } 4884 4885 while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS 4886 || dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS 4887 || dc->type == DEMANGLE_COMPONENT_CONST_THIS) 4888 dc = d_left (dc); 4889 4890 d_print_comp (dpi, options, dc); 4891 4892 dpi->templates = hold_dpt; 4893 return; 4894 } 4895 4896 d_print_mod (dpi, options, mods->mod); 4897 4898 dpi->templates = hold_dpt; 4899 4900 d_print_mod_list (dpi, options, mods->next, suffix); 4901 } 4902 4903 /* Print a modifier. */ 4904 4905 static void 4906 d_print_mod (struct d_print_info *dpi, int options, 4907 const struct demangle_component *mod) 4908 { 4909 switch (mod->type) 4910 { 4911 case DEMANGLE_COMPONENT_RESTRICT: 4912 case DEMANGLE_COMPONENT_RESTRICT_THIS: 4913 d_append_string (dpi, " restrict"); 4914 return; 4915 case DEMANGLE_COMPONENT_VOLATILE: 4916 case DEMANGLE_COMPONENT_VOLATILE_THIS: 4917 d_append_string (dpi, " volatile"); 4918 return; 4919 case DEMANGLE_COMPONENT_CONST: 4920 case DEMANGLE_COMPONENT_CONST_THIS: 4921 d_append_string (dpi, " const"); 4922 return; 4923 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: 4924 d_append_char (dpi, ' '); 4925 d_print_comp (dpi, options, d_right (mod)); 4926 return; 4927 case DEMANGLE_COMPONENT_POINTER: 4928 /* There is no pointer symbol in Java. */ 4929 if ((options & DMGL_JAVA) == 0) 4930 d_append_char (dpi, '*'); 4931 return; 4932 case DEMANGLE_COMPONENT_REFERENCE: 4933 d_append_char (dpi, '&'); 4934 return; 4935 case DEMANGLE_COMPONENT_RVALUE_REFERENCE: 4936 d_append_string (dpi, "&&"); 4937 return; 4938 case DEMANGLE_COMPONENT_COMPLEX: 4939 d_append_string (dpi, "complex "); 4940 return; 4941 case DEMANGLE_COMPONENT_IMAGINARY: 4942 d_append_string (dpi, "imaginary "); 4943 return; 4944 case DEMANGLE_COMPONENT_PTRMEM_TYPE: 4945 if (d_last_char (dpi) != '(') 4946 d_append_char (dpi, ' '); 4947 d_print_comp (dpi, options, d_left (mod)); 4948 d_append_string (dpi, "::*"); 4949 return; 4950 case DEMANGLE_COMPONENT_TYPED_NAME: 4951 d_print_comp (dpi, options, d_left (mod)); 4952 return; 4953 case DEMANGLE_COMPONENT_VECTOR_TYPE: 4954 d_append_string (dpi, " __vector("); 4955 d_print_comp (dpi, options, d_left (mod)); 4956 d_append_char (dpi, ')'); 4957 return; 4958 4959 default: 4960 /* Otherwise, we have something that won't go back on the 4961 modifier stack, so we can just print it. */ 4962 d_print_comp (dpi, options, mod); 4963 return; 4964 } 4965 } 4966 4967 /* Print a function type, except for the return type. */ 4968 4969 static void 4970 d_print_function_type (struct d_print_info *dpi, int options, 4971 const struct demangle_component *dc, 4972 struct d_print_mod *mods) 4973 { 4974 int need_paren; 4975 int need_space; 4976 struct d_print_mod *p; 4977 struct d_print_mod *hold_modifiers; 4978 4979 need_paren = 0; 4980 need_space = 0; 4981 for (p = mods; p != NULL; p = p->next) 4982 { 4983 if (p->printed) 4984 break; 4985 4986 switch (p->mod->type) 4987 { 4988 case DEMANGLE_COMPONENT_POINTER: 4989 case DEMANGLE_COMPONENT_REFERENCE: 4990 case DEMANGLE_COMPONENT_RVALUE_REFERENCE: 4991 need_paren = 1; 4992 break; 4993 case DEMANGLE_COMPONENT_RESTRICT: 4994 case DEMANGLE_COMPONENT_VOLATILE: 4995 case DEMANGLE_COMPONENT_CONST: 4996 case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: 4997 case DEMANGLE_COMPONENT_COMPLEX: 4998 case DEMANGLE_COMPONENT_IMAGINARY: 4999 case DEMANGLE_COMPONENT_PTRMEM_TYPE: 5000 need_space = 1; 5001 need_paren = 1; 5002 break; 5003 case DEMANGLE_COMPONENT_RESTRICT_THIS: 5004 case DEMANGLE_COMPONENT_VOLATILE_THIS: 5005 case DEMANGLE_COMPONENT_CONST_THIS: 5006 break; 5007 default: 5008 break; 5009 } 5010 if (need_paren) 5011 break; 5012 } 5013 5014 if (need_paren) 5015 { 5016 if (! need_space) 5017 { 5018 if (d_last_char (dpi) != '(' 5019 && d_last_char (dpi) != '*') 5020 need_space = 1; 5021 } 5022 if (need_space && d_last_char (dpi) != ' ') 5023 d_append_char (dpi, ' '); 5024 d_append_char (dpi, '('); 5025 } 5026 5027 hold_modifiers = dpi->modifiers; 5028 dpi->modifiers = NULL; 5029 5030 d_print_mod_list (dpi, options, mods, 0); 5031 5032 if (need_paren) 5033 d_append_char (dpi, ')'); 5034 5035 d_append_char (dpi, '('); 5036 5037 if (d_right (dc) != NULL) 5038 d_print_comp (dpi, options, d_right (dc)); 5039 5040 d_append_char (dpi, ')'); 5041 5042 d_print_mod_list (dpi, options, mods, 1); 5043 5044 dpi->modifiers = hold_modifiers; 5045 } 5046 5047 /* Print an array type, except for the element type. */ 5048 5049 static void 5050 d_print_array_type (struct d_print_info *dpi, int options, 5051 const struct demangle_component *dc, 5052 struct d_print_mod *mods) 5053 { 5054 int need_space; 5055 5056 need_space = 1; 5057 if (mods != NULL) 5058 { 5059 int need_paren; 5060 struct d_print_mod *p; 5061 5062 need_paren = 0; 5063 for (p = mods; p != NULL; p = p->next) 5064 { 5065 if (! p->printed) 5066 { 5067 if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE) 5068 { 5069 need_space = 0; 5070 break; 5071 } 5072 else 5073 { 5074 need_paren = 1; 5075 need_space = 1; 5076 break; 5077 } 5078 } 5079 } 5080 5081 if (need_paren) 5082 d_append_string (dpi, " ("); 5083 5084 d_print_mod_list (dpi, options, mods, 0); 5085 5086 if (need_paren) 5087 d_append_char (dpi, ')'); 5088 } 5089 5090 if (need_space) 5091 d_append_char (dpi, ' '); 5092 5093 d_append_char (dpi, '['); 5094 5095 if (d_left (dc) != NULL) 5096 d_print_comp (dpi, options, d_left (dc)); 5097 5098 d_append_char (dpi, ']'); 5099 } 5100 5101 /* Print an operator in an expression. */ 5102 5103 static void 5104 d_print_expr_op (struct d_print_info *dpi, int options, 5105 const struct demangle_component *dc) 5106 { 5107 if (dc->type == DEMANGLE_COMPONENT_OPERATOR) 5108 d_append_buffer (dpi, dc->u.s_operator.op->name, 5109 dc->u.s_operator.op->len); 5110 else 5111 d_print_comp (dpi, options, dc); 5112 } 5113 5114 /* Print a cast. */ 5115 5116 static void 5117 d_print_cast (struct d_print_info *dpi, int options, 5118 const struct demangle_component *dc) 5119 { 5120 if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE) 5121 d_print_comp (dpi, options, d_left (dc)); 5122 else 5123 { 5124 struct d_print_mod *hold_dpm; 5125 struct d_print_template dpt; 5126 5127 /* It appears that for a templated cast operator, we need to put 5128 the template parameters in scope for the operator name, but 5129 not for the parameters. The effect is that we need to handle 5130 the template printing here. */ 5131 5132 hold_dpm = dpi->modifiers; 5133 dpi->modifiers = NULL; 5134 5135 dpt.next = dpi->templates; 5136 dpi->templates = &dpt; 5137 dpt.template_decl = d_left (dc); 5138 5139 d_print_comp (dpi, options, d_left (d_left (dc))); 5140 5141 dpi->templates = dpt.next; 5142 5143 if (d_last_char (dpi) == '<') 5144 d_append_char (dpi, ' '); 5145 d_append_char (dpi, '<'); 5146 d_print_comp (dpi, options, d_right (d_left (dc))); 5147 /* Avoid generating two consecutive '>' characters, to avoid 5148 the C++ syntactic ambiguity. */ 5149 if (d_last_char (dpi) == '>') 5150 d_append_char (dpi, ' '); 5151 d_append_char (dpi, '>'); 5152 5153 dpi->modifiers = hold_dpm; 5154 } 5155 } 5156 5157 /* Initialize the information structure we use to pass around 5158 information. */ 5159 5160 CP_STATIC_IF_GLIBCPP_V3 5161 void 5162 cplus_demangle_init_info (const char *mangled, int options, size_t len, 5163 struct d_info *di) 5164 { 5165 di->s = mangled; 5166 di->send = mangled + len; 5167 di->options = options; 5168 5169 di->n = mangled; 5170 5171 /* We can not need more components than twice the number of chars in 5172 the mangled string. Most components correspond directly to 5173 chars, but the ARGLIST types are exceptions. */ 5174 di->num_comps = 2 * len; 5175 di->next_comp = 0; 5176 5177 /* Similarly, we can not need more substitutions than there are 5178 chars in the mangled string. */ 5179 di->num_subs = len; 5180 di->next_sub = 0; 5181 di->did_subs = 0; 5182 5183 di->last_name = NULL; 5184 5185 di->expansion = 0; 5186 } 5187 5188 /* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI 5189 mangled name, return strings in repeated callback giving the demangled 5190 name. OPTIONS is the usual libiberty demangler options. On success, 5191 this returns 1. On failure, returns 0. */ 5192 5193 static int 5194 d_demangle_callback (const char *mangled, int options, 5195 demangle_callbackref callback, void *opaque) 5196 { 5197 enum 5198 { 5199 DCT_TYPE, 5200 DCT_MANGLED, 5201 DCT_GLOBAL_CTORS, 5202 DCT_GLOBAL_DTORS 5203 } 5204 type; 5205 struct d_info di; 5206 struct demangle_component *dc; 5207 int status; 5208 5209 if (mangled[0] == '_' && mangled[1] == 'Z') 5210 type = DCT_MANGLED; 5211 else if (strncmp (mangled, "_GLOBAL_", 8) == 0 5212 && (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$') 5213 && (mangled[9] == 'D' || mangled[9] == 'I') 5214 && mangled[10] == '_') 5215 type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS; 5216 else 5217 { 5218 if ((options & DMGL_TYPES) == 0) 5219 return 0; 5220 type = DCT_TYPE; 5221 } 5222 5223 cplus_demangle_init_info (mangled, options, strlen (mangled), &di); 5224 5225 { 5226 #ifdef CP_DYNAMIC_ARRAYS 5227 __extension__ struct demangle_component comps[di.num_comps]; 5228 __extension__ struct demangle_component *subs[di.num_subs]; 5229 5230 di.comps = comps; 5231 di.subs = subs; 5232 #else 5233 di.comps = alloca (di.num_comps * sizeof (*di.comps)); 5234 di.subs = alloca (di.num_subs * sizeof (*di.subs)); 5235 #endif 5236 5237 switch (type) 5238 { 5239 case DCT_TYPE: 5240 dc = cplus_demangle_type (&di); 5241 break; 5242 case DCT_MANGLED: 5243 dc = cplus_demangle_mangled_name (&di, 1); 5244 break; 5245 case DCT_GLOBAL_CTORS: 5246 case DCT_GLOBAL_DTORS: 5247 d_advance (&di, 11); 5248 dc = d_make_comp (&di, 5249 (type == DCT_GLOBAL_CTORS 5250 ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS 5251 : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS), 5252 d_make_demangle_mangled_name (&di, d_str (&di)), 5253 NULL); 5254 d_advance (&di, strlen (d_str (&di))); 5255 break; 5256 } 5257 5258 /* If DMGL_PARAMS is set, then if we didn't consume the entire 5259 mangled string, then we didn't successfully demangle it. If 5260 DMGL_PARAMS is not set, we didn't look at the trailing 5261 parameters. */ 5262 if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0') 5263 dc = NULL; 5264 5265 #ifdef CP_DEMANGLE_DEBUG 5266 d_dump (dc, 0); 5267 #endif 5268 5269 status = (dc != NULL) 5270 ? cplus_demangle_print_callback (options, dc, callback, opaque) 5271 : 0; 5272 } 5273 5274 return status; 5275 } 5276 5277 /* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled 5278 name, return a buffer allocated with malloc holding the demangled 5279 name. OPTIONS is the usual libiberty demangler options. On 5280 success, this sets *PALC to the allocated size of the returned 5281 buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for 5282 a memory allocation failure, and returns NULL. */ 5283 5284 static char * 5285 d_demangle (const char *mangled, int options, size_t *palc) 5286 { 5287 struct d_growable_string dgs; 5288 int status; 5289 5290 d_growable_string_init (&dgs, 0); 5291 5292 status = d_demangle_callback (mangled, options, 5293 d_growable_string_callback_adapter, &dgs); 5294 if (status == 0) 5295 { 5296 free (dgs.buf); 5297 *palc = 0; 5298 return NULL; 5299 } 5300 5301 *palc = dgs.allocation_failure ? 1 : dgs.alc; 5302 return dgs.buf; 5303 } 5304 5305 #if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3) 5306 5307 extern char *__cxa_demangle (const char *, char *, size_t *, int *); 5308 5309 /* ia64 ABI-mandated entry point in the C++ runtime library for 5310 performing demangling. MANGLED_NAME is a NUL-terminated character 5311 string containing the name to be demangled. 5312 5313 OUTPUT_BUFFER is a region of memory, allocated with malloc, of 5314 *LENGTH bytes, into which the demangled name is stored. If 5315 OUTPUT_BUFFER is not long enough, it is expanded using realloc. 5316 OUTPUT_BUFFER may instead be NULL; in that case, the demangled name 5317 is placed in a region of memory allocated with malloc. 5318 5319 If LENGTH is non-NULL, the length of the buffer containing the 5320 demangled name, is placed in *LENGTH. 5321 5322 The return value is a pointer to the start of the NUL-terminated 5323 demangled name, or NULL if the demangling fails. The caller is 5324 responsible for deallocating this memory using free. 5325 5326 *STATUS is set to one of the following values: 5327 0: The demangling operation succeeded. 5328 -1: A memory allocation failure occurred. 5329 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules. 5330 -3: One of the arguments is invalid. 5331 5332 The demangling is performed using the C++ ABI mangling rules, with 5333 GNU extensions. */ 5334 5335 char * 5336 __cxa_demangle (const char *mangled_name, char *output_buffer, 5337 size_t *length, int *status) 5338 { 5339 char *demangled; 5340 size_t alc; 5341 5342 if (mangled_name == NULL) 5343 { 5344 if (status != NULL) 5345 *status = -3; 5346 return NULL; 5347 } 5348 5349 if (output_buffer != NULL && length == NULL) 5350 { 5351 if (status != NULL) 5352 *status = -3; 5353 return NULL; 5354 } 5355 5356 demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc); 5357 5358 if (demangled == NULL) 5359 { 5360 if (status != NULL) 5361 { 5362 if (alc == 1) 5363 *status = -1; 5364 else 5365 *status = -2; 5366 } 5367 return NULL; 5368 } 5369 5370 if (output_buffer == NULL) 5371 { 5372 if (length != NULL) 5373 *length = alc; 5374 } 5375 else 5376 { 5377 if (strlen (demangled) < *length) 5378 { 5379 strcpy (output_buffer, demangled); 5380 free (demangled); 5381 demangled = output_buffer; 5382 } 5383 else 5384 { 5385 free (output_buffer); 5386 *length = alc; 5387 } 5388 } 5389 5390 if (status != NULL) 5391 *status = 0; 5392 5393 return demangled; 5394 } 5395 5396 extern int __gcclibcxx_demangle_callback (const char *, 5397 void (*) 5398 (const char *, size_t, void *), 5399 void *); 5400 5401 /* Alternative, allocationless entry point in the C++ runtime library 5402 for performing demangling. MANGLED_NAME is a NUL-terminated character 5403 string containing the name to be demangled. 5404 5405 CALLBACK is a callback function, called with demangled string 5406 segments as demangling progresses; it is called at least once, 5407 but may be called more than once. OPAQUE is a generalized pointer 5408 used as a callback argument. 5409 5410 The return code is one of the following values, equivalent to 5411 the STATUS values of __cxa_demangle() (excluding -1, since this 5412 function performs no memory allocations): 5413 0: The demangling operation succeeded. 5414 -2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules. 5415 -3: One of the arguments is invalid. 5416 5417 The demangling is performed using the C++ ABI mangling rules, with 5418 GNU extensions. */ 5419 5420 int 5421 __gcclibcxx_demangle_callback (const char *mangled_name, 5422 void (*callback) (const char *, size_t, void *), 5423 void *opaque) 5424 { 5425 int status; 5426 5427 if (mangled_name == NULL || callback == NULL) 5428 return -3; 5429 5430 status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES, 5431 callback, opaque); 5432 if (status == 0) 5433 return -2; 5434 5435 return 0; 5436 } 5437 5438 #else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */ 5439 5440 /* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI 5441 mangled name, return a buffer allocated with malloc holding the 5442 demangled name. Otherwise, return NULL. */ 5443 5444 char * 5445 cplus_demangle_v3 (const char *mangled, int options) 5446 { 5447 size_t alc; 5448 5449 return d_demangle (mangled, options, &alc); 5450 } 5451 5452 int 5453 cplus_demangle_v3_callback (const char *mangled, int options, 5454 demangle_callbackref callback, void *opaque) 5455 { 5456 return d_demangle_callback (mangled, options, callback, opaque); 5457 } 5458 5459 /* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling 5460 conventions, but the output formatting is a little different. 5461 This instructs the C++ demangler not to emit pointer characters ("*"), to 5462 use Java's namespace separator symbol ("." instead of "::"), and to output 5463 JArray<TYPE> as TYPE[]. */ 5464 5465 char * 5466 java_demangle_v3 (const char *mangled) 5467 { 5468 size_t alc; 5469 5470 return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc); 5471 } 5472 5473 int 5474 java_demangle_v3_callback (const char *mangled, 5475 demangle_callbackref callback, void *opaque) 5476 { 5477 return d_demangle_callback (mangled, 5478 DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, 5479 callback, opaque); 5480 } 5481 5482 #endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */ 5483 5484 #ifndef IN_GLIBCPP_V3 5485 5486 /* Demangle a string in order to find out whether it is a constructor 5487 or destructor. Return non-zero on success. Set *CTOR_KIND and 5488 *DTOR_KIND appropriately. */ 5489 5490 static int 5491 is_ctor_or_dtor (const char *mangled, 5492 enum gnu_v3_ctor_kinds *ctor_kind, 5493 enum gnu_v3_dtor_kinds *dtor_kind) 5494 { 5495 struct d_info di; 5496 struct demangle_component *dc; 5497 int ret; 5498 5499 *ctor_kind = (enum gnu_v3_ctor_kinds) 0; 5500 *dtor_kind = (enum gnu_v3_dtor_kinds) 0; 5501 5502 cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di); 5503 5504 { 5505 #ifdef CP_DYNAMIC_ARRAYS 5506 __extension__ struct demangle_component comps[di.num_comps]; 5507 __extension__ struct demangle_component *subs[di.num_subs]; 5508 5509 di.comps = comps; 5510 di.subs = subs; 5511 #else 5512 di.comps = alloca (di.num_comps * sizeof (*di.comps)); 5513 di.subs = alloca (di.num_subs * sizeof (*di.subs)); 5514 #endif 5515 5516 dc = cplus_demangle_mangled_name (&di, 1); 5517 5518 /* Note that because we did not pass DMGL_PARAMS, we don't expect 5519 to demangle the entire string. */ 5520 5521 ret = 0; 5522 while (dc != NULL) 5523 { 5524 switch (dc->type) 5525 { 5526 default: 5527 dc = NULL; 5528 break; 5529 case DEMANGLE_COMPONENT_TYPED_NAME: 5530 case DEMANGLE_COMPONENT_TEMPLATE: 5531 case DEMANGLE_COMPONENT_RESTRICT_THIS: 5532 case DEMANGLE_COMPONENT_VOLATILE_THIS: 5533 case DEMANGLE_COMPONENT_CONST_THIS: 5534 dc = d_left (dc); 5535 break; 5536 case DEMANGLE_COMPONENT_QUAL_NAME: 5537 case DEMANGLE_COMPONENT_LOCAL_NAME: 5538 dc = d_right (dc); 5539 break; 5540 case DEMANGLE_COMPONENT_CTOR: 5541 *ctor_kind = dc->u.s_ctor.kind; 5542 ret = 1; 5543 dc = NULL; 5544 break; 5545 case DEMANGLE_COMPONENT_DTOR: 5546 *dtor_kind = dc->u.s_dtor.kind; 5547 ret = 1; 5548 dc = NULL; 5549 break; 5550 } 5551 } 5552 } 5553 5554 return ret; 5555 } 5556 5557 /* Return whether NAME is the mangled form of a g++ V3 ABI constructor 5558 name. A non-zero return indicates the type of constructor. */ 5559 5560 enum gnu_v3_ctor_kinds 5561 is_gnu_v3_mangled_ctor (const char *name) 5562 { 5563 enum gnu_v3_ctor_kinds ctor_kind; 5564 enum gnu_v3_dtor_kinds dtor_kind; 5565 5566 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind)) 5567 return (enum gnu_v3_ctor_kinds) 0; 5568 return ctor_kind; 5569 } 5570 5571 5572 /* Return whether NAME is the mangled form of a g++ V3 ABI destructor 5573 name. A non-zero return indicates the type of destructor. */ 5574 5575 enum gnu_v3_dtor_kinds 5576 is_gnu_v3_mangled_dtor (const char *name) 5577 { 5578 enum gnu_v3_ctor_kinds ctor_kind; 5579 enum gnu_v3_dtor_kinds dtor_kind; 5580 5581 if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind)) 5582 return (enum gnu_v3_dtor_kinds) 0; 5583 return dtor_kind; 5584 } 5585 5586 #endif /* IN_GLIBCPP_V3 */ 5587 5588 #ifdef STANDALONE_DEMANGLER 5589 5590 #include "getopt.h" 5591 #include "dyn-string.h" 5592 5593 static void print_usage (FILE* fp, int exit_value); 5594 5595 #define IS_ALPHA(CHAR) \ 5596 (((CHAR) >= 'a' && (CHAR) <= 'z') \ 5597 || ((CHAR) >= 'A' && (CHAR) <= 'Z')) 5598 5599 /* Non-zero if CHAR is a character than can occur in a mangled name. */ 5600 #define is_mangled_char(CHAR) \ 5601 (IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \ 5602 || (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$') 5603 5604 /* The name of this program, as invoked. */ 5605 const char* program_name; 5606 5607 /* Prints usage summary to FP and then exits with EXIT_VALUE. */ 5608 5609 static void 5610 print_usage (FILE* fp, int exit_value) 5611 { 5612 fprintf (fp, "Usage: %s [options] [names ...]\n", program_name); 5613 fprintf (fp, "Options:\n"); 5614 fprintf (fp, " -h,--help Display this message.\n"); 5615 fprintf (fp, " -p,--no-params Don't display function parameters\n"); 5616 fprintf (fp, " -v,--verbose Produce verbose demanglings.\n"); 5617 fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n"); 5618 5619 exit (exit_value); 5620 } 5621 5622 /* Option specification for getopt_long. */ 5623 static const struct option long_options[] = 5624 { 5625 { "help", no_argument, NULL, 'h' }, 5626 { "no-params", no_argument, NULL, 'p' }, 5627 { "verbose", no_argument, NULL, 'v' }, 5628 { NULL, no_argument, NULL, 0 }, 5629 }; 5630 5631 /* Main entry for a demangling filter executable. It will demangle 5632 its command line arguments, if any. If none are provided, it will 5633 filter stdin to stdout, replacing any recognized mangled C++ names 5634 with their demangled equivalents. */ 5635 5636 int 5637 main (int argc, char *argv[]) 5638 { 5639 int i; 5640 int opt_char; 5641 int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES; 5642 5643 /* Use the program name of this program, as invoked. */ 5644 program_name = argv[0]; 5645 5646 /* Parse options. */ 5647 do 5648 { 5649 opt_char = getopt_long (argc, argv, "hpv", long_options, NULL); 5650 switch (opt_char) 5651 { 5652 case '?': /* Unrecognized option. */ 5653 print_usage (stderr, 1); 5654 break; 5655 5656 case 'h': 5657 print_usage (stdout, 0); 5658 break; 5659 5660 case 'p': 5661 options &= ~ DMGL_PARAMS; 5662 break; 5663 5664 case 'v': 5665 options |= DMGL_VERBOSE; 5666 break; 5667 } 5668 } 5669 while (opt_char != -1); 5670 5671 if (optind == argc) 5672 /* No command line arguments were provided. Filter stdin. */ 5673 { 5674 dyn_string_t mangled = dyn_string_new (3); 5675 char *s; 5676 5677 /* Read all of input. */ 5678 while (!feof (stdin)) 5679 { 5680 char c; 5681 5682 /* Pile characters into mangled until we hit one that can't 5683 occur in a mangled name. */ 5684 c = getchar (); 5685 while (!feof (stdin) && is_mangled_char (c)) 5686 { 5687 dyn_string_append_char (mangled, c); 5688 if (feof (stdin)) 5689 break; 5690 c = getchar (); 5691 } 5692 5693 if (dyn_string_length (mangled) > 0) 5694 { 5695 #ifdef IN_GLIBCPP_V3 5696 s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL); 5697 #else 5698 s = cplus_demangle_v3 (dyn_string_buf (mangled), options); 5699 #endif 5700 5701 if (s != NULL) 5702 { 5703 fputs (s, stdout); 5704 free (s); 5705 } 5706 else 5707 { 5708 /* It might not have been a mangled name. Print the 5709 original text. */ 5710 fputs (dyn_string_buf (mangled), stdout); 5711 } 5712 5713 dyn_string_clear (mangled); 5714 } 5715 5716 /* If we haven't hit EOF yet, we've read one character that 5717 can't occur in a mangled name, so print it out. */ 5718 if (!feof (stdin)) 5719 putchar (c); 5720 } 5721 5722 dyn_string_delete (mangled); 5723 } 5724 else 5725 /* Demangle command line arguments. */ 5726 { 5727 /* Loop over command line arguments. */ 5728 for (i = optind; i < argc; ++i) 5729 { 5730 char *s; 5731 #ifdef IN_GLIBCPP_V3 5732 int status; 5733 #endif 5734 5735 /* Attempt to demangle. */ 5736 #ifdef IN_GLIBCPP_V3 5737 s = __cxa_demangle (argv[i], NULL, NULL, &status); 5738 #else 5739 s = cplus_demangle_v3 (argv[i], options); 5740 #endif 5741 5742 /* If it worked, print the demangled name. */ 5743 if (s != NULL) 5744 { 5745 printf ("%s\n", s); 5746 free (s); 5747 } 5748 else 5749 { 5750 #ifdef IN_GLIBCPP_V3 5751 fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status); 5752 #else 5753 fprintf (stderr, "Failed: %s\n", argv[i]); 5754 #endif 5755 } 5756 } 5757 } 5758 5759 return 0; 5760 } 5761 5762 #endif /* STANDALONE_DEMANGLER */ 5763