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