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