1 /* Demangler for GNU C++ 2 Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999, 3 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. 4 Written by James Clark (jjc (at) jclark.uucp) 5 Rewritten by Fred Fish (fnf (at) cygnus.com) for ARM and Lucid demangling 6 Modified by Satish Pai (pai (at) apollo.hp.com) for HP demangling 7 8 This file is part of the libiberty library. 9 Libiberty is free software; you can redistribute it and/or 10 modify it under the terms of the GNU Library General Public 11 License as published by the Free Software Foundation; either 12 version 2 of the License, or (at your option) any later version. 13 14 In addition to the permissions in the GNU Library General Public 15 License, the Free Software Foundation gives you unlimited permission 16 to link the compiled version of this file into combinations with other 17 programs, and to distribute those combinations without any restriction 18 coming from the use of this file. (The Library Public License 19 restrictions do apply in other respects; for example, they cover 20 modification of the file, and distribution when not linked into a 21 combined executable.) 22 23 Libiberty is distributed in the hope that it will be useful, 24 but WITHOUT ANY WARRANTY; without even the implied warranty of 25 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 26 Library General Public License for more details. 27 28 You should have received a copy of the GNU Library General Public 29 License along with libiberty; see the file COPYING.LIB. If 30 not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, 31 Boston, MA 02110-1301, USA. */ 32 33 /* This file exports two functions; cplus_mangle_opname and cplus_demangle. 34 35 This file imports xmalloc and xrealloc, which are like malloc and 36 realloc except that they generate a fatal error if there is no 37 available memory. */ 38 39 /* This file lives in both GCC and libiberty. When making changes, please 40 try not to break either. */ 41 42 #if 0 /* in valgrind */ 43 #ifdef HAVE_CONFIG_H 44 #include "config.h" 45 #endif 46 #endif /* ! in valgrind */ 47 48 #if 0 /* in valgrind */ 49 #include "safe-ctype.h" 50 #endif /* ! in valgrind */ 51 52 #if 0 /* in valgrind */ 53 #include <sys/types.h> 54 #include <string.h> 55 #include <stdio.h> 56 #endif /* ! in valgrind */ 57 58 #if 0 /* in valgrind */ 59 #ifdef HAVE_STDLIB_H 60 #include <stdlib.h> 61 #else 62 void * malloc (); 63 void * realloc (); 64 #endif 65 #endif /* ! in valgrind */ 66 67 #if 0 /* in valgrind */ 68 #include <demangle.h> 69 #undef CURRENT_DEMANGLING_STYLE 70 #define CURRENT_DEMANGLING_STYLE work->options 71 #endif /* ! in valgrind */ 72 73 #if 0 /* in valgrind */ 74 #include "libiberty.h" 75 #endif /* ! in valgrind */ 76 77 #include "vg_libciface.h" 78 79 #include "ansidecl.h" 80 #include "demangle.h" 81 #include "safe-ctype.h" 82 83 static char *ada_demangle (const char *, int); 84 85 #define min(X,Y) (((X) < (Y)) ? (X) : (Y)) 86 87 /* A value at least one greater than the maximum number of characters 88 that will be output when using the `%d' format with `printf'. */ 89 #define INTBUF_SIZE 32 90 91 extern void fancy_abort (void) ATTRIBUTE_NORETURN; 92 93 /* In order to allow a single demangler executable to demangle strings 94 using various common values of CPLUS_MARKER, as well as any specific 95 one set at compile time, we maintain a string containing all the 96 commonly used ones, and check to see if the marker we are looking for 97 is in that string. CPLUS_MARKER is usually '$' on systems where the 98 assembler can deal with that. Where the assembler can't, it's usually 99 '.' (but on many systems '.' is used for other things). We put the 100 current defined CPLUS_MARKER first (which defaults to '$'), followed 101 by the next most common value, followed by an explicit '$' in case 102 the value of CPLUS_MARKER is not '$'. 103 104 We could avoid this if we could just get g++ to tell us what the actual 105 cplus marker character is as part of the debug information, perhaps by 106 ensuring that it is the character that terminates the gcc<n>_compiled 107 marker symbol (FIXME). */ 108 109 #if !defined (CPLUS_MARKER) 110 #define CPLUS_MARKER '$' 111 #endif 112 113 enum demangling_styles current_demangling_style = auto_demangling; 114 115 static char cplus_markers[] = { CPLUS_MARKER, '.', '$', '\0' }; 116 117 static char char_str[2] = { '\000', '\000' }; 118 119 void 120 set_cplus_marker_for_demangling (int ch) 121 { 122 cplus_markers[0] = ch; 123 } 124 125 typedef struct string /* Beware: these aren't required to be */ 126 { /* '\0' terminated. */ 127 char *b; /* pointer to start of string */ 128 char *p; /* pointer after last character */ 129 char *e; /* pointer after end of allocated space */ 130 } string; 131 132 /* Stuff that is shared between sub-routines. 133 Using a shared structure allows cplus_demangle to be reentrant. */ 134 135 struct work_stuff 136 { 137 int options; 138 char **typevec; 139 char **ktypevec; 140 char **btypevec; 141 int numk; 142 int numb; 143 int ksize; 144 int bsize; 145 int ntypes; 146 int typevec_size; 147 int constructor; 148 int destructor; 149 int static_type; /* A static member function */ 150 int temp_start; /* index in demangled to start of template args */ 151 int type_quals; /* The type qualifiers. */ 152 int dllimported; /* Symbol imported from a PE DLL */ 153 char **tmpl_argvec; /* Template function arguments. */ 154 int ntmpl_args; /* The number of template function arguments. */ 155 int forgetting_types; /* Nonzero if we are not remembering the types 156 we see. */ 157 string* previous_argument; /* The last function argument demangled. */ 158 int nrepeats; /* The number of times to repeat the previous 159 argument. */ 160 }; 161 162 #define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI) 163 #define PRINT_ARG_TYPES (work -> options & DMGL_PARAMS) 164 165 static const struct optable 166 { 167 const char *const in; 168 const char *const out; 169 const int flags; 170 } optable[] = { 171 {"nw", " new", DMGL_ANSI}, /* new (1.92, ansi) */ 172 {"dl", " delete", DMGL_ANSI}, /* new (1.92, ansi) */ 173 {"new", " new", 0}, /* old (1.91, and 1.x) */ 174 {"delete", " delete", 0}, /* old (1.91, and 1.x) */ 175 {"vn", " new []", DMGL_ANSI}, /* GNU, pending ansi */ 176 {"vd", " delete []", DMGL_ANSI}, /* GNU, pending ansi */ 177 {"as", "=", DMGL_ANSI}, /* ansi */ 178 {"ne", "!=", DMGL_ANSI}, /* old, ansi */ 179 {"eq", "==", DMGL_ANSI}, /* old, ansi */ 180 {"ge", ">=", DMGL_ANSI}, /* old, ansi */ 181 {"gt", ">", DMGL_ANSI}, /* old, ansi */ 182 {"le", "<=", DMGL_ANSI}, /* old, ansi */ 183 {"lt", "<", DMGL_ANSI}, /* old, ansi */ 184 {"plus", "+", 0}, /* old */ 185 {"pl", "+", DMGL_ANSI}, /* ansi */ 186 {"apl", "+=", DMGL_ANSI}, /* ansi */ 187 {"minus", "-", 0}, /* old */ 188 {"mi", "-", DMGL_ANSI}, /* ansi */ 189 {"ami", "-=", DMGL_ANSI}, /* ansi */ 190 {"mult", "*", 0}, /* old */ 191 {"ml", "*", DMGL_ANSI}, /* ansi */ 192 {"amu", "*=", DMGL_ANSI}, /* ansi (ARM/Lucid) */ 193 {"aml", "*=", DMGL_ANSI}, /* ansi (GNU/g++) */ 194 {"convert", "+", 0}, /* old (unary +) */ 195 {"negate", "-", 0}, /* old (unary -) */ 196 {"trunc_mod", "%", 0}, /* old */ 197 {"md", "%", DMGL_ANSI}, /* ansi */ 198 {"amd", "%=", DMGL_ANSI}, /* ansi */ 199 {"trunc_div", "/", 0}, /* old */ 200 {"dv", "/", DMGL_ANSI}, /* ansi */ 201 {"adv", "/=", DMGL_ANSI}, /* ansi */ 202 {"truth_andif", "&&", 0}, /* old */ 203 {"aa", "&&", DMGL_ANSI}, /* ansi */ 204 {"truth_orif", "||", 0}, /* old */ 205 {"oo", "||", DMGL_ANSI}, /* ansi */ 206 {"truth_not", "!", 0}, /* old */ 207 {"nt", "!", DMGL_ANSI}, /* ansi */ 208 {"postincrement","++", 0}, /* old */ 209 {"pp", "++", DMGL_ANSI}, /* ansi */ 210 {"postdecrement","--", 0}, /* old */ 211 {"mm", "--", DMGL_ANSI}, /* ansi */ 212 {"bit_ior", "|", 0}, /* old */ 213 {"or", "|", DMGL_ANSI}, /* ansi */ 214 {"aor", "|=", DMGL_ANSI}, /* ansi */ 215 {"bit_xor", "^", 0}, /* old */ 216 {"er", "^", DMGL_ANSI}, /* ansi */ 217 {"aer", "^=", DMGL_ANSI}, /* ansi */ 218 {"bit_and", "&", 0}, /* old */ 219 {"ad", "&", DMGL_ANSI}, /* ansi */ 220 {"aad", "&=", DMGL_ANSI}, /* ansi */ 221 {"bit_not", "~", 0}, /* old */ 222 {"co", "~", DMGL_ANSI}, /* ansi */ 223 {"call", "()", 0}, /* old */ 224 {"cl", "()", DMGL_ANSI}, /* ansi */ 225 {"alshift", "<<", 0}, /* old */ 226 {"ls", "<<", DMGL_ANSI}, /* ansi */ 227 {"als", "<<=", DMGL_ANSI}, /* ansi */ 228 {"arshift", ">>", 0}, /* old */ 229 {"rs", ">>", DMGL_ANSI}, /* ansi */ 230 {"ars", ">>=", DMGL_ANSI}, /* ansi */ 231 {"component", "->", 0}, /* old */ 232 {"pt", "->", DMGL_ANSI}, /* ansi; Lucid C++ form */ 233 {"rf", "->", DMGL_ANSI}, /* ansi; ARM/GNU form */ 234 {"indirect", "*", 0}, /* old */ 235 {"method_call", "->()", 0}, /* old */ 236 {"addr", "&", 0}, /* old (unary &) */ 237 {"array", "[]", 0}, /* old */ 238 {"vc", "[]", DMGL_ANSI}, /* ansi */ 239 {"compound", ", ", 0}, /* old */ 240 {"cm", ", ", DMGL_ANSI}, /* ansi */ 241 {"cond", "?:", 0}, /* old */ 242 {"cn", "?:", DMGL_ANSI}, /* pseudo-ansi */ 243 {"max", ">?", 0}, /* old */ 244 {"mx", ">?", DMGL_ANSI}, /* pseudo-ansi */ 245 {"min", "<?", 0}, /* old */ 246 {"mn", "<?", DMGL_ANSI}, /* pseudo-ansi */ 247 {"nop", "", 0}, /* old (for operator=) */ 248 {"rm", "->*", DMGL_ANSI}, /* ansi */ 249 {"sz", "sizeof ", DMGL_ANSI} /* pseudo-ansi */ 250 }; 251 252 /* These values are used to indicate the various type varieties. 253 They are all non-zero so that they can be used as `success' 254 values. */ 255 typedef enum type_kind_t 256 { 257 tk_none, 258 tk_pointer, 259 tk_reference, 260 tk_integral, 261 tk_bool, 262 tk_char, 263 tk_real 264 } type_kind_t; 265 266 const struct demangler_engine libiberty_demanglers[] = 267 { 268 { 269 NO_DEMANGLING_STYLE_STRING, 270 no_demangling, 271 "Demangling disabled" 272 } 273 , 274 { 275 AUTO_DEMANGLING_STYLE_STRING, 276 auto_demangling, 277 "Automatic selection based on executable" 278 } 279 , 280 { 281 GNU_DEMANGLING_STYLE_STRING, 282 gnu_demangling, 283 "GNU (g++) style demangling" 284 } 285 , 286 { 287 LUCID_DEMANGLING_STYLE_STRING, 288 lucid_demangling, 289 "Lucid (lcc) style demangling" 290 } 291 , 292 { 293 ARM_DEMANGLING_STYLE_STRING, 294 arm_demangling, 295 "ARM style demangling" 296 } 297 , 298 { 299 HP_DEMANGLING_STYLE_STRING, 300 hp_demangling, 301 "HP (aCC) style demangling" 302 } 303 , 304 { 305 EDG_DEMANGLING_STYLE_STRING, 306 edg_demangling, 307 "EDG style demangling" 308 } 309 , 310 { 311 GNU_V3_DEMANGLING_STYLE_STRING, 312 gnu_v3_demangling, 313 "GNU (g++) V3 ABI-style demangling" 314 } 315 , 316 { 317 JAVA_DEMANGLING_STYLE_STRING, 318 java_demangling, 319 "Java style demangling" 320 } 321 , 322 { 323 GNAT_DEMANGLING_STYLE_STRING, 324 gnat_demangling, 325 "GNAT style demangling" 326 } 327 , 328 { 329 NULL, unknown_demangling, NULL 330 } 331 }; 332 333 #define STRING_EMPTY(str) ((str) -> b == (str) -> p) 334 #define APPEND_BLANK(str) {if (!STRING_EMPTY(str)) \ 335 string_append(str, " ");} 336 #define LEN_STRING(str) ( (STRING_EMPTY(str))?0:((str)->p - (str)->b)) 337 338 /* The scope separator appropriate for the language being demangled. */ 339 340 #define SCOPE_STRING(work) ((work->options & DMGL_JAVA) ? "." : "::") 341 342 #define ARM_VTABLE_STRING "__vtbl__" /* Lucid/ARM virtual table prefix */ 343 #define ARM_VTABLE_STRLEN 8 /* strlen (ARM_VTABLE_STRING) */ 344 345 /* Prototypes for local functions */ 346 347 static void delete_work_stuff (struct work_stuff *); 348 349 static void delete_non_B_K_work_stuff (struct work_stuff *); 350 351 static char *mop_up (struct work_stuff *, string *, int); 352 353 static void squangle_mop_up (struct work_stuff *); 354 355 static void work_stuff_copy_to_from (struct work_stuff *, struct work_stuff *); 356 357 #if 0 358 static int 359 demangle_method_args (struct work_stuff *, const char **, string *); 360 #endif 361 362 static char * 363 internal_cplus_demangle (struct work_stuff *, const char *); 364 365 static int 366 demangle_template_template_parm (struct work_stuff *work, 367 const char **, string *); 368 369 static int 370 demangle_template (struct work_stuff *work, const char **, string *, 371 string *, int, int); 372 373 static int 374 arm_pt (const char *, int, const char **, const char **); 375 376 static int 377 demangle_class_name (struct work_stuff *, const char **, string *); 378 379 static int 380 demangle_qualified (struct work_stuff *, const char **, string *, 381 int, int); 382 383 static int demangle_class (struct work_stuff *, const char **, string *); 384 385 static int demangle_fund_type (struct work_stuff *, const char **, string *); 386 387 static int demangle_signature (struct work_stuff *, const char **, string *); 388 389 static int demangle_prefix (struct work_stuff *, const char **, string *); 390 391 static int gnu_special (struct work_stuff *, const char **, string *); 392 393 static int arm_special (const char **, string *); 394 395 static void string_need (string *, int); 396 397 static void string_delete (string *); 398 399 static void 400 string_init (string *); 401 402 static void string_clear (string *); 403 404 #if 0 405 static int string_empty (string *); 406 #endif 407 408 static void string_append (string *, const char *); 409 410 static void string_appends (string *, string *); 411 412 static void string_appendn (string *, const char *, int); 413 414 static void string_prepend (string *, const char *); 415 416 static void string_prependn (string *, const char *, int); 417 418 static void string_append_template_idx (string *, int); 419 420 static int get_count (const char **, int *); 421 422 static int consume_count (const char **); 423 424 static int consume_count_with_underscores (const char**); 425 426 static int demangle_args (struct work_stuff *, const char **, string *); 427 428 static int demangle_nested_args (struct work_stuff*, const char**, string*); 429 430 static int do_type (struct work_stuff *, const char **, string *); 431 432 static int do_arg (struct work_stuff *, const char **, string *); 433 434 static int 435 demangle_function_name (struct work_stuff *, const char **, string *, 436 const char *); 437 438 static int 439 iterate_demangle_function (struct work_stuff *, 440 const char **, string *, const char *); 441 442 static void remember_type (struct work_stuff *, const char *, int); 443 444 static void remember_Btype (struct work_stuff *, const char *, int, int); 445 446 static int register_Btype (struct work_stuff *); 447 448 static void remember_Ktype (struct work_stuff *, const char *, int); 449 450 static void forget_types (struct work_stuff *); 451 452 static void forget_B_and_K_types (struct work_stuff *); 453 454 static void string_prepends (string *, string *); 455 456 static int 457 demangle_template_value_parm (struct work_stuff*, const char**, 458 string*, type_kind_t); 459 460 static int 461 do_hpacc_template_const_value (struct work_stuff *, const char **, string *); 462 463 static int 464 do_hpacc_template_literal (struct work_stuff *, const char **, string *); 465 466 static int snarf_numeric_literal (const char **, string *); 467 468 /* There is a TYPE_QUAL value for each type qualifier. They can be 469 combined by bitwise-or to form the complete set of qualifiers for a 470 type. */ 471 472 #define TYPE_UNQUALIFIED 0x0 473 #define TYPE_QUAL_CONST 0x1 474 #define TYPE_QUAL_VOLATILE 0x2 475 #define TYPE_QUAL_RESTRICT 0x4 476 477 static int code_for_qualifier (int); 478 479 static const char* qualifier_string (int); 480 481 static const char* demangle_qualifier (int); 482 483 static int demangle_expression (struct work_stuff *, const char **, string *, 484 type_kind_t); 485 486 static int 487 demangle_integral_value (struct work_stuff *, const char **, string *); 488 489 static int 490 demangle_real_value (struct work_stuff *, const char **, string *); 491 492 static void 493 demangle_arm_hp_template (struct work_stuff *, const char **, int, string *); 494 495 static void 496 recursively_demangle (struct work_stuff *, const char **, string *, int); 497 498 static void grow_vect (char **, size_t *, size_t, int); 499 500 /* Translate count to integer, consuming tokens in the process. 501 Conversion terminates on the first non-digit character. 502 503 Trying to consume something that isn't a count results in no 504 consumption of input and a return of -1. 505 506 Overflow consumes the rest of the digits, and returns -1. */ 507 508 static int 509 consume_count (const char **type) 510 { 511 int count = 0; 512 513 if (! ISDIGIT ((unsigned char)**type)) 514 return -1; 515 516 while (ISDIGIT ((unsigned char)**type)) 517 { 518 count *= 10; 519 520 /* Check for overflow. 521 We assume that count is represented using two's-complement; 522 no power of two is divisible by ten, so if an overflow occurs 523 when multiplying by ten, the result will not be a multiple of 524 ten. */ 525 if ((count % 10) != 0) 526 { 527 while (ISDIGIT ((unsigned char) **type)) 528 (*type)++; 529 return -1; 530 } 531 532 count += **type - '0'; 533 (*type)++; 534 } 535 536 if (count < 0) 537 count = -1; 538 539 return (count); 540 } 541 542 543 /* Like consume_count, but for counts that are preceded and followed 544 by '_' if they are greater than 10. Also, -1 is returned for 545 failure, since 0 can be a valid value. */ 546 547 static int 548 consume_count_with_underscores (const char **mangled) 549 { 550 int idx; 551 552 if (**mangled == '_') 553 { 554 (*mangled)++; 555 if (!ISDIGIT ((unsigned char)**mangled)) 556 return -1; 557 558 idx = consume_count (mangled); 559 if (**mangled != '_') 560 /* The trailing underscore was missing. */ 561 return -1; 562 563 (*mangled)++; 564 } 565 else 566 { 567 if (**mangled < '0' || **mangled > '9') 568 return -1; 569 570 idx = **mangled - '0'; 571 (*mangled)++; 572 } 573 574 return idx; 575 } 576 577 /* C is the code for a type-qualifier. Return the TYPE_QUAL 578 corresponding to this qualifier. */ 579 580 static int 581 code_for_qualifier (int c) 582 { 583 switch (c) 584 { 585 case 'C': 586 return TYPE_QUAL_CONST; 587 588 case 'V': 589 return TYPE_QUAL_VOLATILE; 590 591 case 'u': 592 return TYPE_QUAL_RESTRICT; 593 594 default: 595 break; 596 } 597 598 /* C was an invalid qualifier. */ 599 abort (); 600 } 601 602 /* Return the string corresponding to the qualifiers given by 603 TYPE_QUALS. */ 604 605 static const char* 606 qualifier_string (int type_quals) 607 { 608 switch (type_quals) 609 { 610 case TYPE_UNQUALIFIED: 611 return ""; 612 613 case TYPE_QUAL_CONST: 614 return "const"; 615 616 case TYPE_QUAL_VOLATILE: 617 return "volatile"; 618 619 case TYPE_QUAL_RESTRICT: 620 return "__restrict"; 621 622 case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE: 623 return "const volatile"; 624 625 case TYPE_QUAL_CONST | TYPE_QUAL_RESTRICT: 626 return "const __restrict"; 627 628 case TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT: 629 return "volatile __restrict"; 630 631 case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT: 632 return "const volatile __restrict"; 633 634 default: 635 break; 636 } 637 638 /* TYPE_QUALS was an invalid qualifier set. */ 639 abort (); 640 } 641 642 /* C is the code for a type-qualifier. Return the string 643 corresponding to this qualifier. This function should only be 644 called with a valid qualifier code. */ 645 646 static const char* 647 demangle_qualifier (int c) 648 { 649 return qualifier_string (code_for_qualifier (c)); 650 } 651 652 int 653 cplus_demangle_opname (const char *opname, char *result, int options) 654 { 655 int len, len1, ret; 656 string type; 657 struct work_stuff work[1]; 658 const char *tem; 659 660 len = strlen(opname); 661 result[0] = '\0'; 662 ret = 0; 663 memset ((char *) work, 0, sizeof (work)); 664 work->options = options; 665 666 if (opname[0] == '_' && opname[1] == '_' 667 && opname[2] == 'o' && opname[3] == 'p') 668 { 669 /* ANSI. */ 670 /* type conversion operator. */ 671 tem = opname + 4; 672 if (do_type (work, &tem, &type)) 673 { 674 strcat (result, "operator "); 675 strncat (result, type.b, type.p - type.b); 676 string_delete (&type); 677 ret = 1; 678 } 679 } 680 else if (opname[0] == '_' && opname[1] == '_' 681 && ISLOWER((unsigned char)opname[2]) 682 && ISLOWER((unsigned char)opname[3])) 683 { 684 if (opname[4] == '\0') 685 { 686 /* Operator. */ 687 size_t i; 688 for (i = 0; i < ARRAY_SIZE (optable); i++) 689 { 690 if (strlen (optable[i].in) == 2 691 && memcmp (optable[i].in, opname + 2, 2) == 0) 692 { 693 strcat (result, "operator"); 694 strcat (result, optable[i].out); 695 ret = 1; 696 break; 697 } 698 } 699 } 700 else 701 { 702 if (opname[2] == 'a' && opname[5] == '\0') 703 { 704 /* Assignment. */ 705 size_t i; 706 for (i = 0; i < ARRAY_SIZE (optable); i++) 707 { 708 if (strlen (optable[i].in) == 3 709 && memcmp (optable[i].in, opname + 2, 3) == 0) 710 { 711 strcat (result, "operator"); 712 strcat (result, optable[i].out); 713 ret = 1; 714 break; 715 } 716 } 717 } 718 } 719 } 720 else if (len >= 3 721 && opname[0] == 'o' 722 && opname[1] == 'p' 723 && strchr (cplus_markers, opname[2]) != NULL) 724 { 725 /* see if it's an assignment expression */ 726 if (len >= 10 /* op$assign_ */ 727 && memcmp (opname + 3, "assign_", 7) == 0) 728 { 729 size_t i; 730 for (i = 0; i < ARRAY_SIZE (optable); i++) 731 { 732 len1 = len - 10; 733 if ((int) strlen (optable[i].in) == len1 734 && memcmp (optable[i].in, opname + 10, len1) == 0) 735 { 736 strcat (result, "operator"); 737 strcat (result, optable[i].out); 738 strcat (result, "="); 739 ret = 1; 740 break; 741 } 742 } 743 } 744 else 745 { 746 size_t i; 747 for (i = 0; i < ARRAY_SIZE (optable); i++) 748 { 749 len1 = len - 3; 750 if ((int) strlen (optable[i].in) == len1 751 && memcmp (optable[i].in, opname + 3, len1) == 0) 752 { 753 strcat (result, "operator"); 754 strcat (result, optable[i].out); 755 ret = 1; 756 break; 757 } 758 } 759 } 760 } 761 else if (len >= 5 && memcmp (opname, "type", 4) == 0 762 && strchr (cplus_markers, opname[4]) != NULL) 763 { 764 /* type conversion operator */ 765 tem = opname + 5; 766 if (do_type (work, &tem, &type)) 767 { 768 strcat (result, "operator "); 769 strncat (result, type.b, type.p - type.b); 770 string_delete (&type); 771 ret = 1; 772 } 773 } 774 squangle_mop_up (work); 775 return ret; 776 777 } 778 779 /* Takes operator name as e.g. "++" and returns mangled 780 operator name (e.g. "postincrement_expr"), or NULL if not found. 781 782 If OPTIONS & DMGL_ANSI == 1, return the ANSI name; 783 if OPTIONS & DMGL_ANSI == 0, return the old GNU name. */ 784 785 const char * 786 cplus_mangle_opname (const char *opname, int options) 787 { 788 size_t i; 789 int len; 790 791 len = strlen (opname); 792 for (i = 0; i < ARRAY_SIZE (optable); i++) 793 { 794 if ((int) strlen (optable[i].out) == len 795 && (options & DMGL_ANSI) == (optable[i].flags & DMGL_ANSI) 796 && memcmp (optable[i].out, opname, len) == 0) 797 return optable[i].in; 798 } 799 return (0); 800 } 801 802 /* Add a routine to set the demangling style to be sure it is valid and 803 allow for any demangler initialization that maybe necessary. */ 804 805 enum demangling_styles 806 cplus_demangle_set_style (enum demangling_styles style) 807 { 808 const struct demangler_engine *demangler = libiberty_demanglers; 809 810 for (; demangler->demangling_style != unknown_demangling; ++demangler) 811 if (style == demangler->demangling_style) 812 { 813 current_demangling_style = style; 814 return current_demangling_style; 815 } 816 817 return unknown_demangling; 818 } 819 820 /* Do string name to style translation */ 821 822 enum demangling_styles 823 cplus_demangle_name_to_style (const char *name) 824 { 825 const struct demangler_engine *demangler = libiberty_demanglers; 826 827 for (; demangler->demangling_style != unknown_demangling; ++demangler) 828 if (strcmp (name, demangler->demangling_style_name) == 0) 829 return demangler->demangling_style; 830 831 return unknown_demangling; 832 } 833 834 /* char *cplus_demangle (const char *mangled, int options) 835 836 If MANGLED is a mangled function name produced by GNU C++, then 837 a pointer to a @code{malloc}ed string giving a C++ representation 838 of the name will be returned; otherwise NULL will be returned. 839 It is the caller's responsibility to free the string which 840 is returned. 841 842 The OPTIONS arg may contain one or more of the following bits: 843 844 DMGL_ANSI ANSI qualifiers such as `const' and `void' are 845 included. 846 DMGL_PARAMS Function parameters are included. 847 848 For example, 849 850 cplus_demangle ("foo__1Ai", DMGL_PARAMS) => "A::foo(int)" 851 cplus_demangle ("foo__1Ai", DMGL_PARAMS | DMGL_ANSI) => "A::foo(int)" 852 cplus_demangle ("foo__1Ai", 0) => "A::foo" 853 854 cplus_demangle ("foo__1Afe", DMGL_PARAMS) => "A::foo(float,...)" 855 cplus_demangle ("foo__1Afe", DMGL_PARAMS | DMGL_ANSI)=> "A::foo(float,...)" 856 cplus_demangle ("foo__1Afe", 0) => "A::foo" 857 858 Note that any leading underscores, or other such characters prepended by 859 the compilation system, are presumed to have already been stripped from 860 MANGLED. */ 861 862 char * 863 ML_(cplus_demangle) (const char *mangled, int options) 864 { 865 char *ret; 866 struct work_stuff work[1]; 867 868 if (current_demangling_style == no_demangling) 869 return xstrdup (mangled); 870 871 memset ((char *) work, 0, sizeof (work)); 872 work->options = options; 873 if ((work->options & DMGL_STYLE_MASK) == 0) 874 work->options |= (int) current_demangling_style & DMGL_STYLE_MASK; 875 876 /* The V3 ABI demangling is implemented elsewhere. */ 877 if (GNU_V3_DEMANGLING || AUTO_DEMANGLING) 878 { 879 ret = cplus_demangle_v3 (mangled, work->options); 880 if (ret || GNU_V3_DEMANGLING) 881 return ret; 882 } 883 884 if (JAVA_DEMANGLING) 885 { 886 ret = java_demangle_v3 (mangled); 887 if (ret) 888 return ret; 889 } 890 891 if (GNAT_DEMANGLING) 892 return ada_demangle(mangled,options); 893 894 ret = internal_cplus_demangle (work, mangled); 895 squangle_mop_up (work); 896 return (ret); 897 } 898 899 900 /* Assuming *OLD_VECT points to an array of *SIZE objects of size 901 ELEMENT_SIZE, grow it to contain at least MIN_SIZE objects, 902 updating *OLD_VECT and *SIZE as necessary. */ 903 904 static void 905 grow_vect (char **old_vect, size_t *size, size_t min_size, int element_size) 906 { 907 if (*size < min_size) 908 { 909 *size *= 2; 910 if (*size < min_size) 911 *size = min_size; 912 *old_vect = XRESIZEVAR (char, *old_vect, *size * element_size); 913 } 914 } 915 916 /* Demangle ada names: 917 1. Discard final __{DIGIT}+ or ${DIGIT}+ 918 2. Convert other instances of embedded "__" to `.'. 919 3. Discard leading _ada_. 920 4. Remove everything after first ___ if it is followed by 'X'. 921 5. Put symbols that should be suppressed in <...> brackets. 922 The resulting string is valid until the next call of ada_demangle. */ 923 924 static char * 925 ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) 926 { 927 int i, j; 928 int len0; 929 const char* p; 930 char *demangled = NULL; 931 int changed; 932 size_t demangled_size = 0; 933 934 changed = 0; 935 936 if (strncmp (mangled, "_ada_", 5) == 0) 937 { 938 mangled += 5; 939 changed = 1; 940 } 941 942 if (mangled[0] == '_' || mangled[0] == '<') 943 goto Suppress; 944 945 p = strstr (mangled, "___"); 946 if (p == NULL) 947 len0 = strlen (mangled); 948 else 949 { 950 if (p[3] == 'X') 951 { 952 len0 = p - mangled; 953 changed = 1; 954 } 955 else 956 goto Suppress; 957 } 958 959 /* Make demangled big enough for possible expansion by operator name. */ 960 grow_vect (&demangled, 961 &demangled_size, 2 * len0 + 1, 962 sizeof (char)); 963 964 if (ISDIGIT ((unsigned char) mangled[len0 - 1])) { 965 for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1) 966 ; 967 if (i > 1 && mangled[i] == '_' && mangled[i - 1] == '_') 968 { 969 len0 = i - 1; 970 changed = 1; 971 } 972 else if (mangled[i] == '$') 973 { 974 len0 = i; 975 changed = 1; 976 } 977 } 978 979 for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]); 980 i += 1, j += 1) 981 demangled[j] = mangled[i]; 982 983 while (i < len0) 984 { 985 if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_') 986 { 987 demangled[j] = '.'; 988 changed = 1; 989 i += 2; j += 1; 990 } 991 else 992 { 993 demangled[j] = mangled[i]; 994 i += 1; j += 1; 995 } 996 } 997 demangled[j] = '\000'; 998 999 for (i = 0; demangled[i] != '\0'; i += 1) 1000 if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ') 1001 goto Suppress; 1002 1003 if (! changed) 1004 return NULL; 1005 else 1006 return demangled; 1007 1008 Suppress: 1009 grow_vect (&demangled, 1010 &demangled_size, strlen (mangled) + 3, 1011 sizeof (char)); 1012 1013 if (mangled[0] == '<') 1014 strcpy (demangled, mangled); 1015 else 1016 sprintf (demangled, "<%s>", mangled); 1017 1018 return demangled; 1019 } 1020 1021 /* This function performs most of what cplus_demangle use to do, but 1022 to be able to demangle a name with a B, K or n code, we need to 1023 have a longer term memory of what types have been seen. The original 1024 now initializes and cleans up the squangle code info, while internal 1025 calls go directly to this routine to avoid resetting that info. */ 1026 1027 static char * 1028 internal_cplus_demangle (struct work_stuff *work, const char *mangled) 1029 { 1030 1031 string decl; 1032 int success = 0; 1033 char *demangled = NULL; 1034 int s1, s2, s3, s4; 1035 s1 = work->constructor; 1036 s2 = work->destructor; 1037 s3 = work->static_type; 1038 s4 = work->type_quals; 1039 work->constructor = work->destructor = 0; 1040 work->type_quals = TYPE_UNQUALIFIED; 1041 work->dllimported = 0; 1042 1043 if ((mangled != NULL) && (*mangled != '\0')) 1044 { 1045 string_init (&decl); 1046 1047 /* First check to see if gnu style demangling is active and if the 1048 string to be demangled contains a CPLUS_MARKER. If so, attempt to 1049 recognize one of the gnu special forms rather than looking for a 1050 standard prefix. In particular, don't worry about whether there 1051 is a "__" string in the mangled string. Consider "_$_5__foo" for 1052 example. */ 1053 1054 if ((AUTO_DEMANGLING || GNU_DEMANGLING)) 1055 { 1056 success = gnu_special (work, &mangled, &decl); 1057 } 1058 if (!success) 1059 { 1060 success = demangle_prefix (work, &mangled, &decl); 1061 } 1062 if (success && (*mangled != '\0')) 1063 { 1064 success = demangle_signature (work, &mangled, &decl); 1065 } 1066 if (work->constructor == 2) 1067 { 1068 string_prepend (&decl, "global constructors keyed to "); 1069 work->constructor = 0; 1070 } 1071 else if (work->destructor == 2) 1072 { 1073 string_prepend (&decl, "global destructors keyed to "); 1074 work->destructor = 0; 1075 } 1076 else if (work->dllimported == 1) 1077 { 1078 string_prepend (&decl, "import stub for "); 1079 work->dllimported = 0; 1080 } 1081 demangled = mop_up (work, &decl, success); 1082 } 1083 work->constructor = s1; 1084 work->destructor = s2; 1085 work->static_type = s3; 1086 work->type_quals = s4; 1087 return demangled; 1088 } 1089 1090 1091 /* Clear out and squangling related storage */ 1092 static void 1093 squangle_mop_up (struct work_stuff *work) 1094 { 1095 /* clean up the B and K type mangling types. */ 1096 forget_B_and_K_types (work); 1097 if (work -> btypevec != NULL) 1098 { 1099 free ((char *) work -> btypevec); 1100 } 1101 if (work -> ktypevec != NULL) 1102 { 1103 free ((char *) work -> ktypevec); 1104 } 1105 } 1106 1107 1108 /* Copy the work state and storage. */ 1109 1110 static void 1111 work_stuff_copy_to_from (struct work_stuff *to, struct work_stuff *from) 1112 { 1113 int i; 1114 1115 delete_work_stuff (to); 1116 1117 /* Shallow-copy scalars. */ 1118 memcpy (to, from, sizeof (*to)); 1119 1120 /* Deep-copy dynamic storage. */ 1121 if (from->typevec_size) 1122 to->typevec = XNEWVEC (char *, from->typevec_size); 1123 1124 for (i = 0; i < from->ntypes; i++) 1125 { 1126 int len = strlen (from->typevec[i]) + 1; 1127 1128 to->typevec[i] = XNEWVEC (char, len); 1129 memcpy (to->typevec[i], from->typevec[i], len); 1130 } 1131 1132 if (from->ksize) 1133 to->ktypevec = XNEWVEC (char *, from->ksize); 1134 1135 for (i = 0; i < from->numk; i++) 1136 { 1137 int len = strlen (from->ktypevec[i]) + 1; 1138 1139 to->ktypevec[i] = XNEWVEC (char, len); 1140 memcpy (to->ktypevec[i], from->ktypevec[i], len); 1141 } 1142 1143 if (from->bsize) 1144 to->btypevec = XNEWVEC (char *, from->bsize); 1145 1146 for (i = 0; i < from->numb; i++) 1147 { 1148 int len = strlen (from->btypevec[i]) + 1; 1149 1150 to->btypevec[i] = XNEWVEC (char , len); 1151 memcpy (to->btypevec[i], from->btypevec[i], len); 1152 } 1153 1154 if (from->ntmpl_args) 1155 to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args); 1156 1157 for (i = 0; i < from->ntmpl_args; i++) 1158 { 1159 int len = strlen (from->tmpl_argvec[i]) + 1; 1160 1161 to->tmpl_argvec[i] = XNEWVEC (char, len); 1162 memcpy (to->tmpl_argvec[i], from->tmpl_argvec[i], len); 1163 } 1164 1165 if (from->previous_argument) 1166 { 1167 to->previous_argument = XNEW (string); 1168 string_init (to->previous_argument); 1169 string_appends (to->previous_argument, from->previous_argument); 1170 } 1171 } 1172 1173 1174 /* Delete dynamic stuff in work_stuff that is not to be re-used. */ 1175 1176 static void 1177 delete_non_B_K_work_stuff (struct work_stuff *work) 1178 { 1179 /* Discard the remembered types, if any. */ 1180 1181 forget_types (work); 1182 if (work -> typevec != NULL) 1183 { 1184 free ((char *) work -> typevec); 1185 work -> typevec = NULL; 1186 work -> typevec_size = 0; 1187 } 1188 if (work->tmpl_argvec) 1189 { 1190 int i; 1191 1192 for (i = 0; i < work->ntmpl_args; i++) 1193 if (work->tmpl_argvec[i]) 1194 free ((char*) work->tmpl_argvec[i]); 1195 1196 free ((char*) work->tmpl_argvec); 1197 work->tmpl_argvec = NULL; 1198 } 1199 if (work->previous_argument) 1200 { 1201 string_delete (work->previous_argument); 1202 free ((char*) work->previous_argument); 1203 work->previous_argument = NULL; 1204 } 1205 } 1206 1207 1208 /* Delete all dynamic storage in work_stuff. */ 1209 static void 1210 delete_work_stuff (struct work_stuff *work) 1211 { 1212 delete_non_B_K_work_stuff (work); 1213 squangle_mop_up (work); 1214 } 1215 1216 1217 /* Clear out any mangled storage */ 1218 1219 static char * 1220 mop_up (struct work_stuff *work, string *declp, int success) 1221 { 1222 char *demangled = NULL; 1223 1224 delete_non_B_K_work_stuff (work); 1225 1226 /* If demangling was successful, ensure that the demangled string is null 1227 terminated and return it. Otherwise, free the demangling decl. */ 1228 1229 if (!success) 1230 { 1231 string_delete (declp); 1232 } 1233 else 1234 { 1235 string_appendn (declp, "", 1); 1236 demangled = declp->b; 1237 } 1238 return (demangled); 1239 } 1240 1241 /* 1242 1243 LOCAL FUNCTION 1244 1245 demangle_signature -- demangle the signature part of a mangled name 1246 1247 SYNOPSIS 1248 1249 static int 1250 demangle_signature (struct work_stuff *work, const char **mangled, 1251 string *declp); 1252 1253 DESCRIPTION 1254 1255 Consume and demangle the signature portion of the mangled name. 1256 1257 DECLP is the string where demangled output is being built. At 1258 entry it contains the demangled root name from the mangled name 1259 prefix. I.E. either a demangled operator name or the root function 1260 name. In some special cases, it may contain nothing. 1261 1262 *MANGLED points to the current unconsumed location in the mangled 1263 name. As tokens are consumed and demangling is performed, the 1264 pointer is updated to continuously point at the next token to 1265 be consumed. 1266 1267 Demangling GNU style mangled names is nasty because there is no 1268 explicit token that marks the start of the outermost function 1269 argument list. */ 1270 1271 static int 1272 demangle_signature (struct work_stuff *work, 1273 const char **mangled, string *declp) 1274 { 1275 int success = 1; 1276 int func_done = 0; 1277 int expect_func = 0; 1278 int expect_return_type = 0; 1279 const char *oldmangled = NULL; 1280 string trawname; 1281 string tname; 1282 1283 while (success && (**mangled != '\0')) 1284 { 1285 switch (**mangled) 1286 { 1287 case 'Q': 1288 oldmangled = *mangled; 1289 success = demangle_qualified (work, mangled, declp, 1, 0); 1290 if (success) 1291 remember_type (work, oldmangled, *mangled - oldmangled); 1292 if (AUTO_DEMANGLING || GNU_DEMANGLING) 1293 expect_func = 1; 1294 oldmangled = NULL; 1295 break; 1296 1297 case 'K': 1298 //oldmangled = *mangled; 1299 success = demangle_qualified (work, mangled, declp, 1, 0); 1300 if (AUTO_DEMANGLING || GNU_DEMANGLING) 1301 { 1302 expect_func = 1; 1303 } 1304 oldmangled = NULL; 1305 break; 1306 1307 case 'S': 1308 /* Static member function */ 1309 if (oldmangled == NULL) 1310 { 1311 oldmangled = *mangled; 1312 } 1313 (*mangled)++; 1314 work -> static_type = 1; 1315 break; 1316 1317 case 'C': 1318 case 'V': 1319 case 'u': 1320 work->type_quals |= code_for_qualifier (**mangled); 1321 1322 /* a qualified member function */ 1323 if (oldmangled == NULL) 1324 oldmangled = *mangled; 1325 (*mangled)++; 1326 break; 1327 1328 case 'L': 1329 /* Local class name follows after "Lnnn_" */ 1330 if (HP_DEMANGLING) 1331 { 1332 while (**mangled && (**mangled != '_')) 1333 (*mangled)++; 1334 if (!**mangled) 1335 success = 0; 1336 else 1337 (*mangled)++; 1338 } 1339 else 1340 success = 0; 1341 break; 1342 1343 case '0': case '1': case '2': case '3': case '4': 1344 case '5': case '6': case '7': case '8': case '9': 1345 if (oldmangled == NULL) 1346 { 1347 oldmangled = *mangled; 1348 } 1349 work->temp_start = -1; /* uppermost call to demangle_class */ 1350 success = demangle_class (work, mangled, declp); 1351 if (success) 1352 { 1353 remember_type (work, oldmangled, *mangled - oldmangled); 1354 } 1355 if (AUTO_DEMANGLING || GNU_DEMANGLING || EDG_DEMANGLING) 1356 { 1357 /* EDG and others will have the "F", so we let the loop cycle 1358 if we are looking at one. */ 1359 if (**mangled != 'F') 1360 expect_func = 1; 1361 } 1362 oldmangled = NULL; 1363 break; 1364 1365 case 'B': 1366 { 1367 string s; 1368 success = do_type (work, mangled, &s); 1369 if (success) 1370 { 1371 string_append (&s, SCOPE_STRING (work)); 1372 string_prepends (declp, &s); 1373 string_delete (&s); 1374 } 1375 oldmangled = NULL; 1376 expect_func = 1; 1377 } 1378 break; 1379 1380 case 'F': 1381 /* Function */ 1382 /* ARM/HP style demangling includes a specific 'F' character after 1383 the class name. For GNU style, it is just implied. So we can 1384 safely just consume any 'F' at this point and be compatible 1385 with either style. */ 1386 1387 oldmangled = NULL; 1388 func_done = 1; 1389 (*mangled)++; 1390 1391 /* For lucid/ARM/HP style we have to forget any types we might 1392 have remembered up to this point, since they were not argument 1393 types. GNU style considers all types seen as available for 1394 back references. See comment in demangle_args() */ 1395 1396 if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) 1397 { 1398 forget_types (work); 1399 } 1400 success = demangle_args (work, mangled, declp); 1401 /* After picking off the function args, we expect to either 1402 find the function return type (preceded by an '_') or the 1403 end of the string. */ 1404 if (success && (AUTO_DEMANGLING || EDG_DEMANGLING) && **mangled == '_') 1405 { 1406 ++(*mangled); 1407 /* At this level, we do not care about the return type. */ 1408 success = do_type (work, mangled, &tname); 1409 string_delete (&tname); 1410 } 1411 1412 break; 1413 1414 case 't': 1415 /* G++ Template */ 1416 string_init(&trawname); 1417 string_init(&tname); 1418 if (oldmangled == NULL) 1419 { 1420 oldmangled = *mangled; 1421 } 1422 success = demangle_template (work, mangled, &tname, 1423 &trawname, 1, 1); 1424 if (success) 1425 { 1426 remember_type (work, oldmangled, *mangled - oldmangled); 1427 } 1428 string_append (&tname, SCOPE_STRING (work)); 1429 1430 string_prepends(declp, &tname); 1431 if (work -> destructor & 1) 1432 { 1433 string_prepend (&trawname, "~"); 1434 string_appends (declp, &trawname); 1435 work->destructor -= 1; 1436 } 1437 if ((work->constructor & 1) || (work->destructor & 1)) 1438 { 1439 string_appends (declp, &trawname); 1440 work->constructor -= 1; 1441 } 1442 string_delete(&trawname); 1443 string_delete(&tname); 1444 oldmangled = NULL; 1445 expect_func = 1; 1446 break; 1447 1448 case '_': 1449 if ((AUTO_DEMANGLING || GNU_DEMANGLING) && expect_return_type) 1450 { 1451 /* Read the return type. */ 1452 string return_type; 1453 1454 (*mangled)++; 1455 success = do_type (work, mangled, &return_type); 1456 APPEND_BLANK (&return_type); 1457 1458 string_prepends (declp, &return_type); 1459 string_delete (&return_type); 1460 break; 1461 } 1462 else 1463 /* At the outermost level, we cannot have a return type specified, 1464 so if we run into another '_' at this point we are dealing with 1465 a mangled name that is either bogus, or has been mangled by 1466 some algorithm we don't know how to deal with. So just 1467 reject the entire demangling. */ 1468 /* However, "_nnn" is an expected suffix for alternate entry point 1469 numbered nnn for a function, with HP aCC, so skip over that 1470 without reporting failure. pai/1997-09-04 */ 1471 if (HP_DEMANGLING) 1472 { 1473 (*mangled)++; 1474 while (**mangled && ISDIGIT ((unsigned char)**mangled)) 1475 (*mangled)++; 1476 } 1477 else 1478 success = 0; 1479 break; 1480 1481 case 'H': 1482 if (AUTO_DEMANGLING || GNU_DEMANGLING) 1483 { 1484 /* A G++ template function. Read the template arguments. */ 1485 success = demangle_template (work, mangled, declp, 0, 0, 1486 0); 1487 if (!(work->constructor & 1)) 1488 expect_return_type = 1; 1489 (*mangled)++; 1490 break; 1491 } 1492 else 1493 /* fall through */ 1494 {;} 1495 1496 default: 1497 if (AUTO_DEMANGLING || GNU_DEMANGLING) 1498 { 1499 /* Assume we have stumbled onto the first outermost function 1500 argument token, and start processing args. */ 1501 func_done = 1; 1502 success = demangle_args (work, mangled, declp); 1503 } 1504 else 1505 { 1506 /* Non-GNU demanglers use a specific token to mark the start 1507 of the outermost function argument tokens. Typically 'F', 1508 for ARM/HP-demangling, for example. So if we find something 1509 we are not prepared for, it must be an error. */ 1510 success = 0; 1511 } 1512 break; 1513 } 1514 /* 1515 if (AUTO_DEMANGLING || GNU_DEMANGLING) 1516 */ 1517 { 1518 if (success && expect_func) 1519 { 1520 func_done = 1; 1521 if (LUCID_DEMANGLING || ARM_DEMANGLING || EDG_DEMANGLING) 1522 { 1523 forget_types (work); 1524 } 1525 success = demangle_args (work, mangled, declp); 1526 /* Since template include the mangling of their return types, 1527 we must set expect_func to 0 so that we don't try do 1528 demangle more arguments the next time we get here. */ 1529 expect_func = 0; 1530 } 1531 } 1532 } 1533 if (success && !func_done) 1534 { 1535 if (AUTO_DEMANGLING || GNU_DEMANGLING) 1536 { 1537 /* With GNU style demangling, bar__3foo is 'foo::bar(void)', and 1538 bar__3fooi is 'foo::bar(int)'. We get here when we find the 1539 first case, and need to ensure that the '(void)' gets added to 1540 the current declp. Note that with ARM/HP, the first case 1541 represents the name of a static data member 'foo::bar', 1542 which is in the current declp, so we leave it alone. */ 1543 success = demangle_args (work, mangled, declp); 1544 } 1545 } 1546 if (success && PRINT_ARG_TYPES) 1547 { 1548 if (work->static_type) 1549 string_append (declp, " static"); 1550 if (work->type_quals != TYPE_UNQUALIFIED) 1551 { 1552 APPEND_BLANK (declp); 1553 string_append (declp, qualifier_string (work->type_quals)); 1554 } 1555 } 1556 1557 return (success); 1558 } 1559 1560 #if 0 1561 1562 static int 1563 demangle_method_args (struct work_stuff *work, const char **mangled, 1564 string *declp) 1565 { 1566 int success = 0; 1567 1568 if (work -> static_type) 1569 { 1570 string_append (declp, *mangled + 1); 1571 *mangled += strlen (*mangled); 1572 success = 1; 1573 } 1574 else 1575 { 1576 success = demangle_args (work, mangled, declp); 1577 } 1578 return (success); 1579 } 1580 1581 #endif 1582 1583 static int 1584 demangle_template_template_parm (struct work_stuff *work, 1585 const char **mangled, string *tname) 1586 { 1587 int i; 1588 int r; 1589 int need_comma = 0; 1590 int success = 1; 1591 string temp; 1592 1593 string_append (tname, "template <"); 1594 /* get size of template parameter list */ 1595 if (get_count (mangled, &r)) 1596 { 1597 for (i = 0; i < r; i++) 1598 { 1599 if (need_comma) 1600 { 1601 string_append (tname, ", "); 1602 } 1603 1604 /* Z for type parameters */ 1605 if (**mangled == 'Z') 1606 { 1607 (*mangled)++; 1608 string_append (tname, "class"); 1609 } 1610 /* z for template parameters */ 1611 else if (**mangled == 'z') 1612 { 1613 (*mangled)++; 1614 success = 1615 demangle_template_template_parm (work, mangled, tname); 1616 if (!success) 1617 { 1618 break; 1619 } 1620 } 1621 else 1622 { 1623 /* temp is initialized in do_type */ 1624 success = do_type (work, mangled, &temp); 1625 if (success) 1626 { 1627 string_appends (tname, &temp); 1628 } 1629 string_delete(&temp); 1630 if (!success) 1631 { 1632 break; 1633 } 1634 } 1635 need_comma = 1; 1636 } 1637 1638 } 1639 if (tname->p[-1] == '>') 1640 string_append (tname, " "); 1641 string_append (tname, "> class"); 1642 return (success); 1643 } 1644 1645 static int 1646 demangle_expression (struct work_stuff *work, const char **mangled, 1647 string *s, type_kind_t tk) 1648 { 1649 int need_operator = 0; 1650 int success; 1651 1652 success = 1; 1653 string_appendn (s, "(", 1); 1654 (*mangled)++; 1655 while (success && **mangled != 'W' && **mangled != '\0') 1656 { 1657 if (need_operator) 1658 { 1659 size_t i; 1660 size_t len; 1661 1662 success = 0; 1663 1664 len = strlen (*mangled); 1665 1666 for (i = 0; i < ARRAY_SIZE (optable); ++i) 1667 { 1668 size_t l = strlen (optable[i].in); 1669 1670 if (l <= len 1671 && memcmp (optable[i].in, *mangled, l) == 0) 1672 { 1673 string_appendn (s, " ", 1); 1674 string_append (s, optable[i].out); 1675 string_appendn (s, " ", 1); 1676 success = 1; 1677 (*mangled) += l; 1678 break; 1679 } 1680 } 1681 1682 if (!success) 1683 break; 1684 } 1685 else 1686 need_operator = 1; 1687 1688 success = demangle_template_value_parm (work, mangled, s, tk); 1689 } 1690 1691 if (**mangled != 'W') 1692 success = 0; 1693 else 1694 { 1695 string_appendn (s, ")", 1); 1696 (*mangled)++; 1697 } 1698 1699 return success; 1700 } 1701 1702 static int 1703 demangle_integral_value (struct work_stuff *work, 1704 const char **mangled, string *s) 1705 { 1706 int success; 1707 1708 if (**mangled == 'E') 1709 success = demangle_expression (work, mangled, s, tk_integral); 1710 else if (**mangled == 'Q' || **mangled == 'K') 1711 success = demangle_qualified (work, mangled, s, 0, 1); 1712 else 1713 { 1714 int value; 1715 1716 /* By default, we let the number decide whether we shall consume an 1717 underscore. */ 1718 int multidigit_without_leading_underscore = 0; 1719 int leave_following_underscore = 0; 1720 1721 success = 0; 1722 1723 if (**mangled == '_') 1724 { 1725 if (mangled[0][1] == 'm') 1726 { 1727 /* Since consume_count_with_underscores does not handle the 1728 `m'-prefix we must do it here, using consume_count and 1729 adjusting underscores: we have to consume the underscore 1730 matching the prepended one. */ 1731 multidigit_without_leading_underscore = 1; 1732 string_appendn (s, "-", 1); 1733 (*mangled) += 2; 1734 } 1735 else 1736 { 1737 /* Do not consume a following underscore; 1738 consume_count_with_underscores will consume what 1739 should be consumed. */ 1740 leave_following_underscore = 1; 1741 } 1742 } 1743 else 1744 { 1745 /* Negative numbers are indicated with a leading `m'. */ 1746 if (**mangled == 'm') 1747 { 1748 string_appendn (s, "-", 1); 1749 (*mangled)++; 1750 } 1751 /* Since consume_count_with_underscores does not handle 1752 multi-digit numbers that do not start with an underscore, 1753 and this number can be an integer template parameter, 1754 we have to call consume_count. */ 1755 multidigit_without_leading_underscore = 1; 1756 /* These multi-digit numbers never end on an underscore, 1757 so if there is one then don't eat it. */ 1758 leave_following_underscore = 1; 1759 } 1760 1761 /* We must call consume_count if we expect to remove a trailing 1762 underscore, since consume_count_with_underscores expects 1763 the leading underscore (that we consumed) if it is to handle 1764 multi-digit numbers. */ 1765 if (multidigit_without_leading_underscore) 1766 value = consume_count (mangled); 1767 else 1768 value = consume_count_with_underscores (mangled); 1769 1770 if (value != -1) 1771 { 1772 char buf[INTBUF_SIZE]; 1773 sprintf (buf, "%d", value); 1774 string_append (s, buf); 1775 1776 /* Numbers not otherwise delimited, might have an underscore 1777 appended as a delimeter, which we should skip. 1778 1779 ??? This used to always remove a following underscore, which 1780 is wrong. If other (arbitrary) cases are followed by an 1781 underscore, we need to do something more radical. */ 1782 1783 if ((value > 9 || multidigit_without_leading_underscore) 1784 && ! leave_following_underscore 1785 && **mangled == '_') 1786 (*mangled)++; 1787 1788 /* All is well. */ 1789 success = 1; 1790 } 1791 } 1792 1793 return success; 1794 } 1795 1796 /* Demangle the real value in MANGLED. */ 1797 1798 static int 1799 demangle_real_value (struct work_stuff *work, 1800 const char **mangled, string *s) 1801 { 1802 if (**mangled == 'E') 1803 return demangle_expression (work, mangled, s, tk_real); 1804 1805 if (**mangled == 'm') 1806 { 1807 string_appendn (s, "-", 1); 1808 (*mangled)++; 1809 } 1810 while (ISDIGIT ((unsigned char)**mangled)) 1811 { 1812 string_appendn (s, *mangled, 1); 1813 (*mangled)++; 1814 } 1815 if (**mangled == '.') /* fraction */ 1816 { 1817 string_appendn (s, ".", 1); 1818 (*mangled)++; 1819 while (ISDIGIT ((unsigned char)**mangled)) 1820 { 1821 string_appendn (s, *mangled, 1); 1822 (*mangled)++; 1823 } 1824 } 1825 if (**mangled == 'e') /* exponent */ 1826 { 1827 string_appendn (s, "e", 1); 1828 (*mangled)++; 1829 while (ISDIGIT ((unsigned char)**mangled)) 1830 { 1831 string_appendn (s, *mangled, 1); 1832 (*mangled)++; 1833 } 1834 } 1835 1836 return 1; 1837 } 1838 1839 static int 1840 demangle_template_value_parm (struct work_stuff *work, const char **mangled, 1841 string *s, type_kind_t tk) 1842 { 1843 int success = 1; 1844 1845 if (**mangled == 'Y') 1846 { 1847 /* The next argument is a template parameter. */ 1848 int idx; 1849 1850 (*mangled)++; 1851 idx = consume_count_with_underscores (mangled); 1852 if (idx == -1 1853 || (work->tmpl_argvec && idx >= work->ntmpl_args) 1854 || consume_count_with_underscores (mangled) == -1) 1855 return -1; 1856 if (work->tmpl_argvec) 1857 string_append (s, work->tmpl_argvec[idx]); 1858 else 1859 string_append_template_idx (s, idx); 1860 } 1861 else if (tk == tk_integral) 1862 success = demangle_integral_value (work, mangled, s); 1863 else if (tk == tk_char) 1864 { 1865 char tmp[2]; 1866 int val; 1867 if (**mangled == 'm') 1868 { 1869 string_appendn (s, "-", 1); 1870 (*mangled)++; 1871 } 1872 string_appendn (s, "'", 1); 1873 val = consume_count(mangled); 1874 if (val <= 0) 1875 success = 0; 1876 else 1877 { 1878 tmp[0] = (char)val; 1879 tmp[1] = '\0'; 1880 string_appendn (s, &tmp[0], 1); 1881 string_appendn (s, "'", 1); 1882 } 1883 } 1884 else if (tk == tk_bool) 1885 { 1886 int val = consume_count (mangled); 1887 if (val == 0) 1888 string_appendn (s, "false", 5); 1889 else if (val == 1) 1890 string_appendn (s, "true", 4); 1891 else 1892 success = 0; 1893 } 1894 else if (tk == tk_real) 1895 success = demangle_real_value (work, mangled, s); 1896 else if (tk == tk_pointer || tk == tk_reference) 1897 { 1898 if (**mangled == 'Q') 1899 success = demangle_qualified (work, mangled, s, 1900 /*isfuncname=*/0, 1901 /*append=*/1); 1902 else 1903 { 1904 int symbol_len = consume_count (mangled); 1905 if (symbol_len == -1) 1906 return -1; 1907 if (symbol_len == 0) 1908 string_appendn (s, "0", 1); 1909 else 1910 { 1911 char *p = XNEWVEC (char, symbol_len + 1), *q; 1912 strncpy (p, *mangled, symbol_len); 1913 p [symbol_len] = '\0'; 1914 /* We use cplus_demangle here, rather than 1915 internal_cplus_demangle, because the name of the entity 1916 mangled here does not make use of any of the squangling 1917 or type-code information we have built up thus far; it is 1918 mangled independently. */ 1919 q = ML_(cplus_demangle) (p, work->options); 1920 if (tk == tk_pointer) 1921 string_appendn (s, "&", 1); 1922 /* FIXME: Pointer-to-member constants should get a 1923 qualifying class name here. */ 1924 if (q) 1925 { 1926 string_append (s, q); 1927 free (q); 1928 } 1929 else 1930 string_append (s, p); 1931 free (p); 1932 } 1933 *mangled += symbol_len; 1934 } 1935 } 1936 1937 return success; 1938 } 1939 1940 /* Demangle the template name in MANGLED. The full name of the 1941 template (e.g., S<int>) is placed in TNAME. The name without the 1942 template parameters (e.g. S) is placed in TRAWNAME if TRAWNAME is 1943 non-NULL. If IS_TYPE is nonzero, this template is a type template, 1944 not a function template. If both IS_TYPE and REMEMBER are nonzero, 1945 the template is remembered in the list of back-referenceable 1946 types. */ 1947 1948 static int 1949 demangle_template (struct work_stuff *work, const char **mangled, 1950 string *tname, string *trawname, 1951 int is_type, int remember) 1952 { 1953 int i; 1954 int r; 1955 int need_comma = 0; 1956 int success = 0; 1957 int is_java_array = 0; 1958 string temp; 1959 1960 (*mangled)++; 1961 if (is_type) 1962 { 1963 /* get template name */ 1964 if (**mangled == 'z') 1965 { 1966 int idx; 1967 (*mangled)++; 1968 (*mangled)++; 1969 1970 idx = consume_count_with_underscores (mangled); 1971 if (idx == -1 1972 || (work->tmpl_argvec && idx >= work->ntmpl_args) 1973 || consume_count_with_underscores (mangled) == -1) 1974 return (0); 1975 1976 if (work->tmpl_argvec) 1977 { 1978 string_append (tname, work->tmpl_argvec[idx]); 1979 if (trawname) 1980 string_append (trawname, work->tmpl_argvec[idx]); 1981 } 1982 else 1983 { 1984 string_append_template_idx (tname, idx); 1985 if (trawname) 1986 string_append_template_idx (trawname, idx); 1987 } 1988 } 1989 else 1990 { 1991 if ((r = consume_count (mangled)) <= 0 1992 || (int) strlen (*mangled) < r) 1993 { 1994 return (0); 1995 } 1996 is_java_array = (work -> options & DMGL_JAVA) 1997 && strncmp (*mangled, "JArray1Z", 8) == 0; 1998 if (! is_java_array) 1999 { 2000 string_appendn (tname, *mangled, r); 2001 } 2002 if (trawname) 2003 string_appendn (trawname, *mangled, r); 2004 *mangled += r; 2005 } 2006 } 2007 if (!is_java_array) 2008 string_append (tname, "<"); 2009 /* get size of template parameter list */ 2010 if (!get_count (mangled, &r)) 2011 { 2012 return (0); 2013 } 2014 if (!is_type) 2015 { 2016 /* Create an array for saving the template argument values. */ 2017 work->tmpl_argvec = XNEWVEC (char *, r); 2018 work->ntmpl_args = r; 2019 for (i = 0; i < r; i++) 2020 work->tmpl_argvec[i] = 0; 2021 } 2022 for (i = 0; i < r; i++) 2023 { 2024 if (need_comma) 2025 { 2026 string_append (tname, ", "); 2027 } 2028 /* Z for type parameters */ 2029 if (**mangled == 'Z') 2030 { 2031 (*mangled)++; 2032 /* temp is initialized in do_type */ 2033 success = do_type (work, mangled, &temp); 2034 if (success) 2035 { 2036 string_appends (tname, &temp); 2037 2038 if (!is_type) 2039 { 2040 /* Save the template argument. */ 2041 int len = temp.p - temp.b; 2042 work->tmpl_argvec[i] = XNEWVEC (char, len + 1); 2043 memcpy (work->tmpl_argvec[i], temp.b, len); 2044 work->tmpl_argvec[i][len] = '\0'; 2045 } 2046 } 2047 string_delete(&temp); 2048 if (!success) 2049 { 2050 break; 2051 } 2052 } 2053 /* z for template parameters */ 2054 else if (**mangled == 'z') 2055 { 2056 int r2; 2057 (*mangled)++; 2058 success = demangle_template_template_parm (work, mangled, tname); 2059 2060 if (success 2061 && (r2 = consume_count (mangled)) > 0 2062 && (int) strlen (*mangled) >= r2) 2063 { 2064 string_append (tname, " "); 2065 string_appendn (tname, *mangled, r2); 2066 if (!is_type) 2067 { 2068 /* Save the template argument. */ 2069 int len = r2; 2070 work->tmpl_argvec[i] = XNEWVEC (char, len + 1); 2071 memcpy (work->tmpl_argvec[i], *mangled, len); 2072 work->tmpl_argvec[i][len] = '\0'; 2073 } 2074 *mangled += r2; 2075 } 2076 if (!success) 2077 { 2078 break; 2079 } 2080 } 2081 else 2082 { 2083 string param; 2084 string* s; 2085 2086 /* otherwise, value parameter */ 2087 2088 /* temp is initialized in do_type */ 2089 success = do_type (work, mangled, &temp); 2090 string_delete(&temp); 2091 if (!success) 2092 break; 2093 2094 if (!is_type) 2095 { 2096 s = ¶m; 2097 string_init (s); 2098 } 2099 else 2100 s = tname; 2101 2102 success = demangle_template_value_parm (work, mangled, s, 2103 (type_kind_t) success); 2104 2105 if (!success) 2106 { 2107 if (!is_type) 2108 string_delete (s); 2109 success = 0; 2110 break; 2111 } 2112 2113 if (!is_type) 2114 { 2115 int len = s->p - s->b; 2116 work->tmpl_argvec[i] = XNEWVEC (char, len + 1); 2117 memcpy (work->tmpl_argvec[i], s->b, len); 2118 work->tmpl_argvec[i][len] = '\0'; 2119 2120 string_appends (tname, s); 2121 string_delete (s); 2122 } 2123 } 2124 need_comma = 1; 2125 } 2126 if (is_java_array) 2127 { 2128 string_append (tname, "[]"); 2129 } 2130 else 2131 { 2132 if (tname->p[-1] == '>') 2133 string_append (tname, " "); 2134 string_append (tname, ">"); 2135 } 2136 2137 if (is_type && remember) 2138 { 2139 const int bindex = register_Btype (work); 2140 remember_Btype (work, tname->b, LEN_STRING (tname), bindex); 2141 } 2142 2143 /* 2144 if (work -> static_type) 2145 { 2146 string_append (declp, *mangled + 1); 2147 *mangled += strlen (*mangled); 2148 success = 1; 2149 } 2150 else 2151 { 2152 success = demangle_args (work, mangled, declp); 2153 } 2154 } 2155 */ 2156 return (success); 2157 } 2158 2159 static int 2160 arm_pt (const char *mangled, 2161 int n, const char **anchor, const char **args) 2162 { 2163 /* Check if ARM template with "__pt__" in it ("parameterized type") */ 2164 /* Allow HP also here, because HP's cfront compiler follows ARM to some extent */ 2165 if ((ARM_DEMANGLING || HP_DEMANGLING) && (*anchor = strstr (mangled, "__pt__"))) 2166 { 2167 int len; 2168 *args = *anchor + 6; 2169 len = consume_count (args); 2170 if (len == -1) 2171 return 0; 2172 if (*args + len == mangled + n && **args == '_') 2173 { 2174 ++*args; 2175 return 1; 2176 } 2177 } 2178 if (AUTO_DEMANGLING || EDG_DEMANGLING) 2179 { 2180 if ((*anchor = strstr (mangled, "__tm__")) 2181 || (*anchor = strstr (mangled, "__ps__")) 2182 || (*anchor = strstr (mangled, "__pt__"))) 2183 { 2184 int len; 2185 *args = *anchor + 6; 2186 len = consume_count (args); 2187 if (len == -1) 2188 return 0; 2189 if (*args + len == mangled + n && **args == '_') 2190 { 2191 ++*args; 2192 return 1; 2193 } 2194 } 2195 else if ((*anchor = strstr (mangled, "__S"))) 2196 { 2197 int len; 2198 *args = *anchor + 3; 2199 len = consume_count (args); 2200 if (len == -1) 2201 return 0; 2202 if (*args + len == mangled + n && **args == '_') 2203 { 2204 ++*args; 2205 return 1; 2206 } 2207 } 2208 } 2209 2210 return 0; 2211 } 2212 2213 static void 2214 demangle_arm_hp_template (struct work_stuff *work, const char **mangled, 2215 int n, string *declp) 2216 { 2217 const char *p; 2218 const char *args; 2219 const char *e = *mangled + n; 2220 string arg; 2221 2222 /* Check for HP aCC template spec: classXt1t2 where t1, t2 are 2223 template args */ 2224 if (HP_DEMANGLING && ((*mangled)[n] == 'X')) 2225 { 2226 char *start_spec_args = NULL; 2227 int hold_options; 2228 2229 /* First check for and omit template specialization pseudo-arguments, 2230 such as in "Spec<#1,#1.*>" */ 2231 start_spec_args = strchr (*mangled, '<'); 2232 if (start_spec_args && (start_spec_args - *mangled < n)) 2233 string_appendn (declp, *mangled, start_spec_args - *mangled); 2234 else 2235 string_appendn (declp, *mangled, n); 2236 (*mangled) += n + 1; 2237 string_init (&arg); 2238 if (work->temp_start == -1) /* non-recursive call */ 2239 work->temp_start = declp->p - declp->b; 2240 2241 /* We want to unconditionally demangle parameter types in 2242 template parameters. */ 2243 hold_options = work->options; 2244 work->options |= DMGL_PARAMS; 2245 2246 string_append (declp, "<"); 2247 while (1) 2248 { 2249 string_delete (&arg); 2250 switch (**mangled) 2251 { 2252 case 'T': 2253 /* 'T' signals a type parameter */ 2254 (*mangled)++; 2255 if (!do_type (work, mangled, &arg)) 2256 goto hpacc_template_args_done; 2257 break; 2258 2259 case 'U': 2260 case 'S': 2261 /* 'U' or 'S' signals an integral value */ 2262 if (!do_hpacc_template_const_value (work, mangled, &arg)) 2263 goto hpacc_template_args_done; 2264 break; 2265 2266 case 'A': 2267 /* 'A' signals a named constant expression (literal) */ 2268 if (!do_hpacc_template_literal (work, mangled, &arg)) 2269 goto hpacc_template_args_done; 2270 break; 2271 2272 default: 2273 /* Today, 1997-09-03, we have only the above types 2274 of template parameters */ 2275 /* FIXME: maybe this should fail and return null */ 2276 goto hpacc_template_args_done; 2277 } 2278 string_appends (declp, &arg); 2279 /* Check if we're at the end of template args. 2280 0 if at end of static member of template class, 2281 _ if done with template args for a function */ 2282 if ((**mangled == '\000') || (**mangled == '_')) 2283 break; 2284 else 2285 string_append (declp, ","); 2286 } 2287 hpacc_template_args_done: 2288 string_append (declp, ">"); 2289 string_delete (&arg); 2290 if (**mangled == '_') 2291 (*mangled)++; 2292 work->options = hold_options; 2293 return; 2294 } 2295 /* ARM template? (Also handles HP cfront extensions) */ 2296 else if (arm_pt (*mangled, n, &p, &args)) 2297 { 2298 int hold_options; 2299 string type_str; 2300 2301 string_init (&arg); 2302 string_appendn (declp, *mangled, p - *mangled); 2303 if (work->temp_start == -1) /* non-recursive call */ 2304 work->temp_start = declp->p - declp->b; 2305 2306 /* We want to unconditionally demangle parameter types in 2307 template parameters. */ 2308 hold_options = work->options; 2309 work->options |= DMGL_PARAMS; 2310 2311 string_append (declp, "<"); 2312 /* should do error checking here */ 2313 while (args < e) { 2314 string_delete (&arg); 2315 2316 /* Check for type or literal here */ 2317 switch (*args) 2318 { 2319 /* HP cfront extensions to ARM for template args */ 2320 /* spec: Xt1Lv1 where t1 is a type, v1 is a literal value */ 2321 /* FIXME: We handle only numeric literals for HP cfront */ 2322 case 'X': 2323 /* A typed constant value follows */ 2324 args++; 2325 if (!do_type (work, &args, &type_str)) 2326 goto cfront_template_args_done; 2327 string_append (&arg, "("); 2328 string_appends (&arg, &type_str); 2329 string_delete (&type_str); 2330 string_append (&arg, ")"); 2331 if (*args != 'L') 2332 goto cfront_template_args_done; 2333 args++; 2334 /* Now snarf a literal value following 'L' */ 2335 if (!snarf_numeric_literal (&args, &arg)) 2336 goto cfront_template_args_done; 2337 break; 2338 2339 case 'L': 2340 /* Snarf a literal following 'L' */ 2341 args++; 2342 if (!snarf_numeric_literal (&args, &arg)) 2343 goto cfront_template_args_done; 2344 break; 2345 default: 2346 /* Not handling other HP cfront stuff */ 2347 { 2348 const char* old_args = args; 2349 if (!do_type (work, &args, &arg)) 2350 goto cfront_template_args_done; 2351 2352 /* Fail if we didn't make any progress: prevent infinite loop. */ 2353 if (args == old_args) 2354 { 2355 work->options = hold_options; 2356 return; 2357 } 2358 } 2359 } 2360 string_appends (declp, &arg); 2361 string_append (declp, ","); 2362 } 2363 cfront_template_args_done: 2364 string_delete (&arg); 2365 if (args >= e) 2366 --declp->p; /* remove extra comma */ 2367 string_append (declp, ">"); 2368 work->options = hold_options; 2369 } 2370 else if (n>10 && strncmp (*mangled, "_GLOBAL_", 8) == 0 2371 && (*mangled)[9] == 'N' 2372 && (*mangled)[8] == (*mangled)[10] 2373 && strchr (cplus_markers, (*mangled)[8])) 2374 { 2375 /* A member of the anonymous namespace. */ 2376 string_append (declp, "{anonymous}"); 2377 } 2378 else 2379 { 2380 if (work->temp_start == -1) /* non-recursive call only */ 2381 work->temp_start = 0; /* disable in recursive calls */ 2382 string_appendn (declp, *mangled, n); 2383 } 2384 *mangled += n; 2385 } 2386 2387 /* Extract a class name, possibly a template with arguments, from the 2388 mangled string; qualifiers, local class indicators, etc. have 2389 already been dealt with */ 2390 2391 static int 2392 demangle_class_name (struct work_stuff *work, const char **mangled, 2393 string *declp) 2394 { 2395 int n; 2396 int success = 0; 2397 2398 n = consume_count (mangled); 2399 if (n == -1) 2400 return 0; 2401 if ((int) strlen (*mangled) >= n) 2402 { 2403 demangle_arm_hp_template (work, mangled, n, declp); 2404 success = 1; 2405 } 2406 2407 return (success); 2408 } 2409 2410 /* 2411 2412 LOCAL FUNCTION 2413 2414 demangle_class -- demangle a mangled class sequence 2415 2416 SYNOPSIS 2417 2418 static int 2419 demangle_class (struct work_stuff *work, const char **mangled, 2420 strint *declp) 2421 2422 DESCRIPTION 2423 2424 DECLP points to the buffer into which demangling is being done. 2425 2426 *MANGLED points to the current token to be demangled. On input, 2427 it points to a mangled class (I.E. "3foo", "13verylongclass", etc.) 2428 On exit, it points to the next token after the mangled class on 2429 success, or the first unconsumed token on failure. 2430 2431 If the CONSTRUCTOR or DESTRUCTOR flags are set in WORK, then 2432 we are demangling a constructor or destructor. In this case 2433 we prepend "class::class" or "class::~class" to DECLP. 2434 2435 Otherwise, we prepend "class::" to the current DECLP. 2436 2437 Reset the constructor/destructor flags once they have been 2438 "consumed". This allows demangle_class to be called later during 2439 the same demangling, to do normal class demangling. 2440 2441 Returns 1 if demangling is successful, 0 otherwise. 2442 2443 */ 2444 2445 static int 2446 demangle_class (struct work_stuff *work, const char **mangled, string *declp) 2447 { 2448 int success = 0; 2449 int btype; 2450 string class_name; 2451 char *save_class_name_end = 0; 2452 2453 string_init (&class_name); 2454 btype = register_Btype (work); 2455 if (demangle_class_name (work, mangled, &class_name)) 2456 { 2457 save_class_name_end = class_name.p; 2458 if ((work->constructor & 1) || (work->destructor & 1)) 2459 { 2460 /* adjust so we don't include template args */ 2461 if (work->temp_start && (work->temp_start != -1)) 2462 { 2463 class_name.p = class_name.b + work->temp_start; 2464 } 2465 string_prepends (declp, &class_name); 2466 if (work -> destructor & 1) 2467 { 2468 string_prepend (declp, "~"); 2469 work -> destructor -= 1; 2470 } 2471 else 2472 { 2473 work -> constructor -= 1; 2474 } 2475 } 2476 class_name.p = save_class_name_end; 2477 remember_Ktype (work, class_name.b, LEN_STRING(&class_name)); 2478 remember_Btype (work, class_name.b, LEN_STRING(&class_name), btype); 2479 string_prepend (declp, SCOPE_STRING (work)); 2480 string_prepends (declp, &class_name); 2481 success = 1; 2482 } 2483 string_delete (&class_name); 2484 return (success); 2485 } 2486 2487 2488 /* Called when there's a "__" in the mangled name, with `scan' pointing to 2489 the rightmost guess. 2490 2491 Find the correct "__"-sequence where the function name ends and the 2492 signature starts, which is ambiguous with GNU mangling. 2493 Call demangle_signature here, so we can make sure we found the right 2494 one; *mangled will be consumed so caller will not make further calls to 2495 demangle_signature. */ 2496 2497 static int 2498 iterate_demangle_function (struct work_stuff *work, const char **mangled, 2499 string *declp, const char *scan) 2500 { 2501 const char *mangle_init = *mangled; 2502 int success = 0; 2503 string decl_init; 2504 struct work_stuff work_init; 2505 2506 if (*(scan + 2) == '\0') 2507 return 0; 2508 2509 /* Do not iterate for some demangling modes, or if there's only one 2510 "__"-sequence. This is the normal case. */ 2511 if (ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING 2512 || strstr (scan + 2, "__") == NULL) 2513 return demangle_function_name (work, mangled, declp, scan); 2514 2515 /* Save state so we can restart if the guess at the correct "__" was 2516 wrong. */ 2517 string_init (&decl_init); 2518 string_appends (&decl_init, declp); 2519 memset (&work_init, 0, sizeof work_init); 2520 work_stuff_copy_to_from (&work_init, work); 2521 2522 /* Iterate over occurrences of __, allowing names and types to have a 2523 "__" sequence in them. We must start with the first (not the last) 2524 occurrence, since "__" most often occur between independent mangled 2525 parts, hence starting at the last occurence inside a signature 2526 might get us a "successful" demangling of the signature. */ 2527 2528 while (scan[2]) 2529 { 2530 if (demangle_function_name (work, mangled, declp, scan)) 2531 { 2532 success = demangle_signature (work, mangled, declp); 2533 if (success) 2534 break; 2535 } 2536 2537 /* Reset demangle state for the next round. */ 2538 *mangled = mangle_init; 2539 string_clear (declp); 2540 string_appends (declp, &decl_init); 2541 work_stuff_copy_to_from (work, &work_init); 2542 2543 /* Leave this underscore-sequence. */ 2544 scan += 2; 2545 2546 /* Scan for the next "__" sequence. */ 2547 while (*scan && (scan[0] != '_' || scan[1] != '_')) 2548 scan++; 2549 2550 /* Move to last "__" in this sequence. */ 2551 while (*scan && *scan == '_') 2552 scan++; 2553 scan -= 2; 2554 } 2555 2556 /* Delete saved state. */ 2557 delete_work_stuff (&work_init); 2558 string_delete (&decl_init); 2559 2560 return success; 2561 } 2562 2563 /* 2564 2565 LOCAL FUNCTION 2566 2567 demangle_prefix -- consume the mangled name prefix and find signature 2568 2569 SYNOPSIS 2570 2571 static int 2572 demangle_prefix (struct work_stuff *work, const char **mangled, 2573 string *declp); 2574 2575 DESCRIPTION 2576 2577 Consume and demangle the prefix of the mangled name. 2578 While processing the function name root, arrange to call 2579 demangle_signature if the root is ambiguous. 2580 2581 DECLP points to the string buffer into which demangled output is 2582 placed. On entry, the buffer is empty. On exit it contains 2583 the root function name, the demangled operator name, or in some 2584 special cases either nothing or the completely demangled result. 2585 2586 MANGLED points to the current pointer into the mangled name. As each 2587 token of the mangled name is consumed, it is updated. Upon entry 2588 the current mangled name pointer points to the first character of 2589 the mangled name. Upon exit, it should point to the first character 2590 of the signature if demangling was successful, or to the first 2591 unconsumed character if demangling of the prefix was unsuccessful. 2592 2593 Returns 1 on success, 0 otherwise. 2594 */ 2595 2596 static int 2597 demangle_prefix (struct work_stuff *work, const char **mangled, 2598 string *declp) 2599 { 2600 int success = 1; 2601 const char *scan; 2602 int i; 2603 2604 if (strlen(*mangled) > 6 2605 && (strncmp(*mangled, "_imp__", 6) == 0 2606 || strncmp(*mangled, "__imp_", 6) == 0)) 2607 { 2608 /* it's a symbol imported from a PE dynamic library. Check for both 2609 new style prefix _imp__ and legacy __imp_ used by older versions 2610 of dlltool. */ 2611 (*mangled) += 6; 2612 work->dllimported = 1; 2613 } 2614 else if (strlen(*mangled) >= 11 && strncmp(*mangled, "_GLOBAL_", 8) == 0) 2615 { 2616 char *marker = strchr (cplus_markers, (*mangled)[8]); 2617 if (marker != NULL && *marker == (*mangled)[10]) 2618 { 2619 if ((*mangled)[9] == 'D') 2620 { 2621 /* it's a GNU global destructor to be executed at program exit */ 2622 (*mangled) += 11; 2623 work->destructor = 2; 2624 if (gnu_special (work, mangled, declp)) 2625 return success; 2626 } 2627 else if ((*mangled)[9] == 'I') 2628 { 2629 /* it's a GNU global constructor to be executed at program init */ 2630 (*mangled) += 11; 2631 work->constructor = 2; 2632 if (gnu_special (work, mangled, declp)) 2633 return success; 2634 } 2635 } 2636 } 2637 else if ((ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) && strncmp(*mangled, "__std__", 7) == 0) 2638 { 2639 /* it's a ARM global destructor to be executed at program exit */ 2640 (*mangled) += 7; 2641 work->destructor = 2; 2642 } 2643 else if ((ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) && strncmp(*mangled, "__sti__", 7) == 0) 2644 { 2645 /* it's a ARM global constructor to be executed at program initial */ 2646 (*mangled) += 7; 2647 work->constructor = 2; 2648 } 2649 2650 /* This block of code is a reduction in strength time optimization 2651 of: 2652 scan = strstr (*mangled, "__"); */ 2653 2654 { 2655 scan = *mangled; 2656 2657 do { 2658 scan = strchr (scan, '_'); 2659 } while (scan != NULL && *++scan != '_'); 2660 2661 if (scan != NULL) --scan; 2662 } 2663 2664 if (scan != NULL) 2665 { 2666 /* We found a sequence of two or more '_', ensure that we start at 2667 the last pair in the sequence. */ 2668 i = strspn (scan, "_"); 2669 if (i > 2) 2670 { 2671 scan += (i - 2); 2672 } 2673 } 2674 2675 if (scan == NULL) 2676 { 2677 success = 0; 2678 } 2679 else if (work -> static_type) 2680 { 2681 if (!ISDIGIT ((unsigned char)scan[0]) && (scan[0] != 't')) 2682 { 2683 success = 0; 2684 } 2685 } 2686 else if ((scan == *mangled) 2687 && (ISDIGIT ((unsigned char)scan[2]) || (scan[2] == 'Q') 2688 || (scan[2] == 't') || (scan[2] == 'K') || (scan[2] == 'H'))) 2689 { 2690 /* The ARM says nothing about the mangling of local variables. 2691 But cfront mangles local variables by prepending __<nesting_level> 2692 to them. As an extension to ARM demangling we handle this case. */ 2693 if ((LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING) 2694 && ISDIGIT ((unsigned char)scan[2])) 2695 { 2696 *mangled = scan + 2; 2697 consume_count (mangled); 2698 string_append (declp, *mangled); 2699 *mangled += strlen (*mangled); 2700 success = 1; 2701 } 2702 else 2703 { 2704 /* A GNU style constructor starts with __[0-9Qt]. But cfront uses 2705 names like __Q2_3foo3bar for nested type names. So don't accept 2706 this style of constructor for cfront demangling. A GNU 2707 style member-template constructor starts with 'H'. */ 2708 if (!(LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING)) 2709 work -> constructor += 1; 2710 *mangled = scan + 2; 2711 } 2712 } 2713 else if (ARM_DEMANGLING && scan[2] == 'p' && scan[3] == 't') 2714 { 2715 /* Cfront-style parameterized type. Handled later as a signature. */ 2716 success = 1; 2717 2718 /* ARM template? */ 2719 demangle_arm_hp_template (work, mangled, strlen (*mangled), declp); 2720 } 2721 else if (EDG_DEMANGLING && ((scan[2] == 't' && scan[3] == 'm') 2722 || (scan[2] == 'p' && scan[3] == 's') 2723 || (scan[2] == 'p' && scan[3] == 't'))) 2724 { 2725 /* EDG-style parameterized type. Handled later as a signature. */ 2726 success = 1; 2727 2728 /* EDG template? */ 2729 demangle_arm_hp_template (work, mangled, strlen (*mangled), declp); 2730 } 2731 else if ((scan == *mangled) && !ISDIGIT ((unsigned char)scan[2]) 2732 && (scan[2] != 't')) 2733 { 2734 /* Mangled name starts with "__". Skip over any leading '_' characters, 2735 then find the next "__" that separates the prefix from the signature. 2736 */ 2737 if (!(ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) 2738 || (arm_special (mangled, declp) == 0)) 2739 { 2740 while (*scan == '_') 2741 { 2742 scan++; 2743 } 2744 if ((scan = strstr (scan, "__")) == NULL || (*(scan + 2) == '\0')) 2745 { 2746 /* No separator (I.E. "__not_mangled"), or empty signature 2747 (I.E. "__not_mangled_either__") */ 2748 success = 0; 2749 } 2750 else 2751 return iterate_demangle_function (work, mangled, declp, scan); 2752 } 2753 } 2754 else if (*(scan + 2) != '\0') 2755 { 2756 /* Mangled name does not start with "__" but does have one somewhere 2757 in there with non empty stuff after it. Looks like a global 2758 function name. Iterate over all "__":s until the right 2759 one is found. */ 2760 return iterate_demangle_function (work, mangled, declp, scan); 2761 } 2762 else 2763 { 2764 /* Doesn't look like a mangled name */ 2765 success = 0; 2766 } 2767 2768 if (!success && (work->constructor == 2 || work->destructor == 2)) 2769 { 2770 string_append (declp, *mangled); 2771 *mangled += strlen (*mangled); 2772 success = 1; 2773 } 2774 return (success); 2775 } 2776 2777 /* 2778 2779 LOCAL FUNCTION 2780 2781 gnu_special -- special handling of gnu mangled strings 2782 2783 SYNOPSIS 2784 2785 static int 2786 gnu_special (struct work_stuff *work, const char **mangled, 2787 string *declp); 2788 2789 2790 DESCRIPTION 2791 2792 Process some special GNU style mangling forms that don't fit 2793 the normal pattern. For example: 2794 2795 _$_3foo (destructor for class foo) 2796 _vt$foo (foo virtual table) 2797 _vt$foo$bar (foo::bar virtual table) 2798 __vt_foo (foo virtual table, new style with thunks) 2799 _3foo$varname (static data member) 2800 _Q22rs2tu$vw (static data member) 2801 __t6vector1Zii (constructor with template) 2802 __thunk_4__$_7ostream (virtual function thunk) 2803 */ 2804 2805 static int 2806 gnu_special (struct work_stuff *work, const char **mangled, string *declp) 2807 { 2808 int n; 2809 int success = 1; 2810 const char *p; 2811 2812 if ((*mangled)[0] == '_' 2813 && strchr (cplus_markers, (*mangled)[1]) != NULL 2814 && (*mangled)[2] == '_') 2815 { 2816 /* Found a GNU style destructor, get past "_<CPLUS_MARKER>_" */ 2817 (*mangled) += 3; 2818 work -> destructor += 1; 2819 } 2820 else if ((*mangled)[0] == '_' 2821 && (((*mangled)[1] == '_' 2822 && (*mangled)[2] == 'v' 2823 && (*mangled)[3] == 't' 2824 && (*mangled)[4] == '_') 2825 || ((*mangled)[1] == 'v' 2826 && (*mangled)[2] == 't' 2827 && strchr (cplus_markers, (*mangled)[3]) != NULL))) 2828 { 2829 /* Found a GNU style virtual table, get past "_vt<CPLUS_MARKER>" 2830 and create the decl. Note that we consume the entire mangled 2831 input string, which means that demangle_signature has no work 2832 to do. */ 2833 if ((*mangled)[2] == 'v') 2834 (*mangled) += 5; /* New style, with thunks: "__vt_" */ 2835 else 2836 (*mangled) += 4; /* Old style, no thunks: "_vt<CPLUS_MARKER>" */ 2837 while (**mangled != '\0') 2838 { 2839 switch (**mangled) 2840 { 2841 case 'Q': 2842 case 'K': 2843 success = demangle_qualified (work, mangled, declp, 0, 1); 2844 break; 2845 case 't': 2846 success = demangle_template (work, mangled, declp, 0, 1, 2847 1); 2848 break; 2849 default: 2850 if (ISDIGIT((unsigned char)*mangled[0])) 2851 { 2852 n = consume_count(mangled); 2853 /* We may be seeing a too-large size, or else a 2854 ".<digits>" indicating a static local symbol. In 2855 any case, declare victory and move on; *don't* try 2856 to use n to allocate. */ 2857 if (n > (int) strlen (*mangled)) 2858 { 2859 success = 1; 2860 break; 2861 } 2862 } 2863 else 2864 { 2865 n = strcspn (*mangled, cplus_markers); 2866 } 2867 string_appendn (declp, *mangled, n); 2868 (*mangled) += n; 2869 } 2870 2871 p = strpbrk (*mangled, cplus_markers); 2872 if (success && ((p == NULL) || (p == *mangled))) 2873 { 2874 if (p != NULL) 2875 { 2876 string_append (declp, SCOPE_STRING (work)); 2877 (*mangled)++; 2878 } 2879 } 2880 else 2881 { 2882 success = 0; 2883 break; 2884 } 2885 } 2886 if (success) 2887 string_append (declp, " virtual table"); 2888 } 2889 else if ((*mangled)[0] == '_' 2890 && (strchr("0123456789Qt", (*mangled)[1]) != NULL) 2891 && (p = strpbrk (*mangled, cplus_markers)) != NULL) 2892 { 2893 /* static data member, "_3foo$varname" for example */ 2894 (*mangled)++; 2895 switch (**mangled) 2896 { 2897 case 'Q': 2898 case 'K': 2899 success = demangle_qualified (work, mangled, declp, 0, 1); 2900 break; 2901 case 't': 2902 success = demangle_template (work, mangled, declp, 0, 1, 1); 2903 break; 2904 default: 2905 n = consume_count (mangled); 2906 if (n < 0 || n > (long) strlen (*mangled)) 2907 { 2908 success = 0; 2909 break; 2910 } 2911 2912 if (n > 10 && strncmp (*mangled, "_GLOBAL_", 8) == 0 2913 && (*mangled)[9] == 'N' 2914 && (*mangled)[8] == (*mangled)[10] 2915 && strchr (cplus_markers, (*mangled)[8])) 2916 { 2917 /* A member of the anonymous namespace. There's information 2918 about what identifier or filename it was keyed to, but 2919 it's just there to make the mangled name unique; we just 2920 step over it. */ 2921 string_append (declp, "{anonymous}"); 2922 (*mangled) += n; 2923 2924 /* Now p points to the marker before the N, so we need to 2925 update it to the first marker after what we consumed. */ 2926 p = strpbrk (*mangled, cplus_markers); 2927 break; 2928 } 2929 2930 string_appendn (declp, *mangled, n); 2931 (*mangled) += n; 2932 } 2933 if (success && (p == *mangled)) 2934 { 2935 /* Consumed everything up to the cplus_marker, append the 2936 variable name. */ 2937 (*mangled)++; 2938 string_append (declp, SCOPE_STRING (work)); 2939 n = strlen (*mangled); 2940 string_appendn (declp, *mangled, n); 2941 (*mangled) += n; 2942 } 2943 else 2944 { 2945 success = 0; 2946 } 2947 } 2948 else if (strncmp (*mangled, "__thunk_", 8) == 0) 2949 { 2950 int delta; 2951 2952 (*mangled) += 8; 2953 delta = consume_count (mangled); 2954 if (delta == -1) 2955 success = 0; 2956 else 2957 { 2958 char *method = internal_cplus_demangle (work, ++*mangled); 2959 2960 if (method) 2961 { 2962 char buf[50]; 2963 sprintf (buf, "virtual function thunk (delta:%d) for ", -delta); 2964 string_append (declp, buf); 2965 string_append (declp, method); 2966 free (method); 2967 n = strlen (*mangled); 2968 (*mangled) += n; 2969 } 2970 else 2971 { 2972 success = 0; 2973 } 2974 } 2975 } 2976 else if (strncmp (*mangled, "__t", 3) == 0 2977 && ((*mangled)[3] == 'i' || (*mangled)[3] == 'f')) 2978 { 2979 p = (*mangled)[3] == 'i' ? " type_info node" : " type_info function"; 2980 (*mangled) += 4; 2981 switch (**mangled) 2982 { 2983 case 'Q': 2984 case 'K': 2985 success = demangle_qualified (work, mangled, declp, 0, 1); 2986 break; 2987 case 't': 2988 success = demangle_template (work, mangled, declp, 0, 1, 1); 2989 break; 2990 default: 2991 success = do_type (work, mangled, declp); 2992 break; 2993 } 2994 if (success && **mangled != '\0') 2995 success = 0; 2996 if (success) 2997 string_append (declp, p); 2998 } 2999 else 3000 { 3001 success = 0; 3002 } 3003 return (success); 3004 } 3005 3006 static void 3007 recursively_demangle(struct work_stuff *work, const char **mangled, 3008 string *result, int namelength) 3009 { 3010 char * recurse = (char *)NULL; 3011 char * recurse_dem = (char *)NULL; 3012 3013 recurse = XNEWVEC (char, namelength + 1); 3014 memcpy (recurse, *mangled, namelength); 3015 recurse[namelength] = '\000'; 3016 3017 recurse_dem = ML_(cplus_demangle) (recurse, work->options); 3018 3019 if (recurse_dem) 3020 { 3021 string_append (result, recurse_dem); 3022 free (recurse_dem); 3023 } 3024 else 3025 { 3026 string_appendn (result, *mangled, namelength); 3027 } 3028 free (recurse); 3029 *mangled += namelength; 3030 } 3031 3032 /* 3033 3034 LOCAL FUNCTION 3035 3036 arm_special -- special handling of ARM/lucid mangled strings 3037 3038 SYNOPSIS 3039 3040 static int 3041 arm_special (const char **mangled, 3042 string *declp); 3043 3044 3045 DESCRIPTION 3046 3047 Process some special ARM style mangling forms that don't fit 3048 the normal pattern. For example: 3049 3050 __vtbl__3foo (foo virtual table) 3051 __vtbl__3foo__3bar (bar::foo virtual table) 3052 3053 */ 3054 3055 static int 3056 arm_special (const char **mangled, string *declp) 3057 { 3058 int n; 3059 int success = 1; 3060 const char *scan; 3061 3062 if (strncmp (*mangled, ARM_VTABLE_STRING, ARM_VTABLE_STRLEN) == 0) 3063 { 3064 /* Found a ARM style virtual table, get past ARM_VTABLE_STRING 3065 and create the decl. Note that we consume the entire mangled 3066 input string, which means that demangle_signature has no work 3067 to do. */ 3068 scan = *mangled + ARM_VTABLE_STRLEN; 3069 while (*scan != '\0') /* first check it can be demangled */ 3070 { 3071 n = consume_count (&scan); 3072 if (n == -1) 3073 { 3074 return (0); /* no good */ 3075 } 3076 scan += n; 3077 if (scan[0] == '_' && scan[1] == '_') 3078 { 3079 scan += 2; 3080 } 3081 } 3082 (*mangled) += ARM_VTABLE_STRLEN; 3083 while (**mangled != '\0') 3084 { 3085 n = consume_count (mangled); 3086 if (n == -1 3087 || n > (long) strlen (*mangled)) 3088 return 0; 3089 string_prependn (declp, *mangled, n); 3090 (*mangled) += n; 3091 if ((*mangled)[0] == '_' && (*mangled)[1] == '_') 3092 { 3093 string_prepend (declp, "::"); 3094 (*mangled) += 2; 3095 } 3096 } 3097 string_append (declp, " virtual table"); 3098 } 3099 else 3100 { 3101 success = 0; 3102 } 3103 return (success); 3104 } 3105 3106 /* 3107 3108 LOCAL FUNCTION 3109 3110 demangle_qualified -- demangle 'Q' qualified name strings 3111 3112 SYNOPSIS 3113 3114 static int 3115 demangle_qualified (struct work_stuff *, const char *mangled, 3116 string *result, int isfuncname, int append); 3117 3118 DESCRIPTION 3119 3120 Demangle a qualified name, such as "Q25Outer5Inner" which is 3121 the mangled form of "Outer::Inner". The demangled output is 3122 prepended or appended to the result string according to the 3123 state of the append flag. 3124 3125 If isfuncname is nonzero, then the qualified name we are building 3126 is going to be used as a member function name, so if it is a 3127 constructor or destructor function, append an appropriate 3128 constructor or destructor name. I.E. for the above example, 3129 the result for use as a constructor is "Outer::Inner::Inner" 3130 and the result for use as a destructor is "Outer::Inner::~Inner". 3131 3132 BUGS 3133 3134 Numeric conversion is ASCII dependent (FIXME). 3135 3136 */ 3137 3138 static int 3139 demangle_qualified (struct work_stuff *work, const char **mangled, 3140 string *result, int isfuncname, int append) 3141 { 3142 int qualifiers = 0; 3143 int success = 1; 3144 char num[2]; 3145 string temp; 3146 string last_name; 3147 int bindex = register_Btype (work); 3148 3149 /* We only make use of ISFUNCNAME if the entity is a constructor or 3150 destructor. */ 3151 isfuncname = (isfuncname 3152 && ((work->constructor & 1) || (work->destructor & 1))); 3153 3154 string_init (&temp); 3155 string_init (&last_name); 3156 3157 if ((*mangled)[0] == 'K') 3158 { 3159 /* Squangling qualified name reuse */ 3160 int idx; 3161 (*mangled)++; 3162 idx = consume_count_with_underscores (mangled); 3163 if (idx == -1 || idx >= work -> numk) 3164 success = 0; 3165 else 3166 string_append (&temp, work -> ktypevec[idx]); 3167 } 3168 else 3169 switch ((*mangled)[1]) 3170 { 3171 case '_': 3172 /* GNU mangled name with more than 9 classes. The count is preceded 3173 by an underscore (to distinguish it from the <= 9 case) and followed 3174 by an underscore. */ 3175 (*mangled)++; 3176 qualifiers = consume_count_with_underscores (mangled); 3177 if (qualifiers == -1) 3178 success = 0; 3179 break; 3180 3181 case '1': 3182 case '2': 3183 case '3': 3184 case '4': 3185 case '5': 3186 case '6': 3187 case '7': 3188 case '8': 3189 case '9': 3190 /* The count is in a single digit. */ 3191 num[0] = (*mangled)[1]; 3192 num[1] = '\0'; 3193 qualifiers = atoi (num); 3194 3195 /* If there is an underscore after the digit, skip it. This is 3196 said to be for ARM-qualified names, but the ARM makes no 3197 mention of such an underscore. Perhaps cfront uses one. */ 3198 if ((*mangled)[2] == '_') 3199 { 3200 (*mangled)++; 3201 } 3202 (*mangled) += 2; 3203 break; 3204 3205 case '0': 3206 default: 3207 success = 0; 3208 } 3209 3210 if (!success) 3211 return success; 3212 3213 /* Pick off the names and collect them in the temp buffer in the order 3214 in which they are found, separated by '::'. */ 3215 3216 while (qualifiers-- > 0) 3217 { 3218 int remember_K = 1; 3219 string_clear (&last_name); 3220 3221 if (*mangled[0] == '_') 3222 (*mangled)++; 3223 3224 if (*mangled[0] == 't') 3225 { 3226 /* Here we always append to TEMP since we will want to use 3227 the template name without the template parameters as a 3228 constructor or destructor name. The appropriate 3229 (parameter-less) value is returned by demangle_template 3230 in LAST_NAME. We do not remember the template type here, 3231 in order to match the G++ mangling algorithm. */ 3232 success = demangle_template(work, mangled, &temp, 3233 &last_name, 1, 0); 3234 if (!success) 3235 break; 3236 } 3237 else if (*mangled[0] == 'K') 3238 { 3239 int idx; 3240 (*mangled)++; 3241 idx = consume_count_with_underscores (mangled); 3242 if (idx == -1 || idx >= work->numk) 3243 success = 0; 3244 else 3245 string_append (&temp, work->ktypevec[idx]); 3246 remember_K = 0; 3247 3248 if (!success) break; 3249 } 3250 else 3251 { 3252 if (EDG_DEMANGLING) 3253 { 3254 int namelength; 3255 /* Now recursively demangle the qualifier 3256 * This is necessary to deal with templates in 3257 * mangling styles like EDG */ 3258 namelength = consume_count (mangled); 3259 if (namelength == -1) 3260 { 3261 success = 0; 3262 break; 3263 } 3264 recursively_demangle(work, mangled, &temp, namelength); 3265 } 3266 else 3267 { 3268 string_delete (&last_name); 3269 success = do_type (work, mangled, &last_name); 3270 if (!success) 3271 break; 3272 string_appends (&temp, &last_name); 3273 } 3274 } 3275 3276 if (remember_K) 3277 remember_Ktype (work, temp.b, LEN_STRING (&temp)); 3278 3279 if (qualifiers > 0) 3280 string_append (&temp, SCOPE_STRING (work)); 3281 } 3282 3283 remember_Btype (work, temp.b, LEN_STRING (&temp), bindex); 3284 3285 /* If we are using the result as a function name, we need to append 3286 the appropriate '::' separated constructor or destructor name. 3287 We do this here because this is the most convenient place, where 3288 we already have a pointer to the name and the length of the name. */ 3289 3290 if (isfuncname) 3291 { 3292 string_append (&temp, SCOPE_STRING (work)); 3293 if (work -> destructor & 1) 3294 string_append (&temp, "~"); 3295 string_appends (&temp, &last_name); 3296 } 3297 3298 /* Now either prepend the temp buffer to the result, or append it, 3299 depending upon the state of the append flag. */ 3300 3301 if (append) 3302 string_appends (result, &temp); 3303 else 3304 { 3305 if (!STRING_EMPTY (result)) 3306 string_append (&temp, SCOPE_STRING (work)); 3307 string_prepends (result, &temp); 3308 } 3309 3310 string_delete (&last_name); 3311 string_delete (&temp); 3312 return (success); 3313 } 3314 3315 /* 3316 3317 LOCAL FUNCTION 3318 3319 get_count -- convert an ascii count to integer, consuming tokens 3320 3321 SYNOPSIS 3322 3323 static int 3324 get_count (const char **type, int *count) 3325 3326 DESCRIPTION 3327 3328 Assume that *type points at a count in a mangled name; set 3329 *count to its value, and set *type to the next character after 3330 the count. There are some weird rules in effect here. 3331 3332 If *type does not point at a string of digits, return zero. 3333 3334 If *type points at a string of digits followed by an 3335 underscore, set *count to their value as an integer, advance 3336 *type to point *after the underscore, and return 1. 3337 3338 If *type points at a string of digits not followed by an 3339 underscore, consume only the first digit. Set *count to its 3340 value as an integer, leave *type pointing after that digit, 3341 and return 1. 3342 3343 The excuse for this odd behavior: in the ARM and HP demangling 3344 styles, a type can be followed by a repeat count of the form 3345 `Nxy', where: 3346 3347 `x' is a single digit specifying how many additional copies 3348 of the type to append to the argument list, and 3349 3350 `y' is one or more digits, specifying the zero-based index of 3351 the first repeated argument in the list. Yes, as you're 3352 unmangling the name you can figure this out yourself, but 3353 it's there anyway. 3354 3355 So, for example, in `bar__3fooFPiN51', the first argument is a 3356 pointer to an integer (`Pi'), and then the next five arguments 3357 are the same (`N5'), and the first repeat is the function's 3358 second argument (`1'). 3359 */ 3360 3361 static int 3362 get_count (const char **type, int *count) 3363 { 3364 const char *p; 3365 int n; 3366 3367 if (!ISDIGIT ((unsigned char)**type)) 3368 return (0); 3369 else 3370 { 3371 *count = **type - '0'; 3372 (*type)++; 3373 if (ISDIGIT ((unsigned char)**type)) 3374 { 3375 p = *type; 3376 n = *count; 3377 do 3378 { 3379 n *= 10; 3380 n += *p - '0'; 3381 p++; 3382 } 3383 while (ISDIGIT ((unsigned char)*p)); 3384 if (*p == '_') 3385 { 3386 *type = p + 1; 3387 *count = n; 3388 } 3389 } 3390 } 3391 return (1); 3392 } 3393 3394 /* RESULT will be initialised here; it will be freed on failure. The 3395 value returned is really a type_kind_t. */ 3396 3397 static int 3398 do_type (struct work_stuff *work, const char **mangled, string *result) 3399 { 3400 int n; 3401 int done; 3402 int success; 3403 string decl; 3404 const char *remembered_type; 3405 int type_quals; 3406 type_kind_t tk = tk_none; 3407 3408 string_init (&decl); 3409 string_init (result); 3410 3411 done = 0; 3412 success = 1; 3413 while (success && !done) 3414 { 3415 int member; 3416 switch (**mangled) 3417 { 3418 3419 /* A pointer type */ 3420 case 'P': 3421 case 'p': 3422 (*mangled)++; 3423 if (! (work -> options & DMGL_JAVA)) 3424 string_prepend (&decl, "*"); 3425 if (tk == tk_none) 3426 tk = tk_pointer; 3427 break; 3428 3429 /* A reference type */ 3430 case 'R': 3431 (*mangled)++; 3432 string_prepend (&decl, "&"); 3433 if (tk == tk_none) 3434 tk = tk_reference; 3435 break; 3436 3437 /* An array */ 3438 case 'A': 3439 { 3440 ++(*mangled); 3441 if (!STRING_EMPTY (&decl) 3442 && (decl.b[0] == '*' || decl.b[0] == '&')) 3443 { 3444 string_prepend (&decl, "("); 3445 string_append (&decl, ")"); 3446 } 3447 string_append (&decl, "["); 3448 if (**mangled != '_') 3449 success = demangle_template_value_parm (work, mangled, &decl, 3450 tk_integral); 3451 if (**mangled == '_') 3452 ++(*mangled); 3453 string_append (&decl, "]"); 3454 break; 3455 } 3456 3457 /* A back reference to a previously seen type */ 3458 case 'T': 3459 (*mangled)++; 3460 if (!get_count (mangled, &n) || n >= work -> ntypes) 3461 { 3462 success = 0; 3463 } 3464 else 3465 { 3466 remembered_type = work -> typevec[n]; 3467 mangled = &remembered_type; 3468 } 3469 break; 3470 3471 /* A function */ 3472 case 'F': 3473 (*mangled)++; 3474 if (!STRING_EMPTY (&decl) 3475 && (decl.b[0] == '*' || decl.b[0] == '&')) 3476 { 3477 string_prepend (&decl, "("); 3478 string_append (&decl, ")"); 3479 } 3480 /* After picking off the function args, we expect to either find the 3481 function return type (preceded by an '_') or the end of the 3482 string. */ 3483 if (!demangle_nested_args (work, mangled, &decl) 3484 || (**mangled != '_' && **mangled != '\0')) 3485 { 3486 success = 0; 3487 break; 3488 } 3489 if (success && (**mangled == '_')) 3490 (*mangled)++; 3491 break; 3492 3493 case 'M': 3494 case 'O': 3495 { 3496 type_quals = TYPE_UNQUALIFIED; 3497 3498 member = **mangled == 'M'; 3499 (*mangled)++; 3500 3501 string_append (&decl, ")"); 3502 3503 /* We don't need to prepend `::' for a qualified name; 3504 demangle_qualified will do that for us. */ 3505 if (**mangled != 'Q') 3506 string_prepend (&decl, SCOPE_STRING (work)); 3507 3508 if (ISDIGIT ((unsigned char)**mangled)) 3509 { 3510 n = consume_count (mangled); 3511 if (n == -1 3512 || (int) strlen (*mangled) < n) 3513 { 3514 success = 0; 3515 break; 3516 } 3517 string_prependn (&decl, *mangled, n); 3518 *mangled += n; 3519 } 3520 else if (**mangled == 'X' || **mangled == 'Y') 3521 { 3522 string temp; 3523 do_type (work, mangled, &temp); 3524 string_prepends (&decl, &temp); 3525 string_delete (&temp); 3526 } 3527 else if (**mangled == 't') 3528 { 3529 string temp; 3530 string_init (&temp); 3531 success = demangle_template (work, mangled, &temp, 3532 NULL, 1, 1); 3533 if (success) 3534 { 3535 string_prependn (&decl, temp.b, temp.p - temp.b); 3536 string_delete (&temp); 3537 } 3538 else 3539 break; 3540 } 3541 else if (**mangled == 'Q') 3542 { 3543 success = demangle_qualified (work, mangled, &decl, 3544 /*isfuncnam=*/0, 3545 /*append=*/0); 3546 if (!success) 3547 break; 3548 } 3549 else 3550 { 3551 success = 0; 3552 break; 3553 } 3554 3555 string_prepend (&decl, "("); 3556 if (member) 3557 { 3558 switch (**mangled) 3559 { 3560 case 'C': 3561 case 'V': 3562 case 'u': 3563 type_quals |= code_for_qualifier (**mangled); 3564 (*mangled)++; 3565 break; 3566 3567 default: 3568 break; 3569 } 3570 3571 if (*(*mangled)++ != 'F') 3572 { 3573 success = 0; 3574 break; 3575 } 3576 } 3577 if ((member && !demangle_nested_args (work, mangled, &decl)) 3578 || **mangled != '_') 3579 { 3580 success = 0; 3581 break; 3582 } 3583 (*mangled)++; 3584 if (! PRINT_ANSI_QUALIFIERS) 3585 { 3586 break; 3587 } 3588 if (type_quals != TYPE_UNQUALIFIED) 3589 { 3590 APPEND_BLANK (&decl); 3591 string_append (&decl, qualifier_string (type_quals)); 3592 } 3593 break; 3594 } 3595 case 'G': 3596 (*mangled)++; 3597 break; 3598 3599 case 'C': 3600 case 'V': 3601 case 'u': 3602 if (PRINT_ANSI_QUALIFIERS) 3603 { 3604 if (!STRING_EMPTY (&decl)) 3605 string_prepend (&decl, " "); 3606 3607 string_prepend (&decl, demangle_qualifier (**mangled)); 3608 } 3609 (*mangled)++; 3610 break; 3611 /* 3612 } 3613 */ 3614 3615 /* fall through */ 3616 default: 3617 done = 1; 3618 break; 3619 } 3620 } 3621 3622 if (success) switch (**mangled) 3623 { 3624 /* A qualified name, such as "Outer::Inner". */ 3625 case 'Q': 3626 case 'K': 3627 { 3628 success = demangle_qualified (work, mangled, result, 0, 1); 3629 break; 3630 } 3631 3632 /* A back reference to a previously seen squangled type */ 3633 case 'B': 3634 (*mangled)++; 3635 if (!get_count (mangled, &n) || n >= work -> numb) 3636 success = 0; 3637 else 3638 string_append (result, work->btypevec[n]); 3639 break; 3640 3641 case 'X': 3642 case 'Y': 3643 /* A template parm. We substitute the corresponding argument. */ 3644 { 3645 int idx; 3646 3647 (*mangled)++; 3648 idx = consume_count_with_underscores (mangled); 3649 3650 if (idx == -1 3651 || (work->tmpl_argvec && idx >= work->ntmpl_args) 3652 || consume_count_with_underscores (mangled) == -1) 3653 { 3654 success = 0; 3655 break; 3656 } 3657 3658 if (work->tmpl_argvec) 3659 string_append (result, work->tmpl_argvec[idx]); 3660 else 3661 string_append_template_idx (result, idx); 3662 3663 success = 1; 3664 } 3665 break; 3666 3667 default: 3668 success = demangle_fund_type (work, mangled, result); 3669 if (tk == tk_none) 3670 tk = (type_kind_t) success; 3671 break; 3672 } 3673 3674 if (success) 3675 { 3676 if (!STRING_EMPTY (&decl)) 3677 { 3678 string_append (result, " "); 3679 string_appends (result, &decl); 3680 } 3681 } 3682 else 3683 string_delete (result); 3684 string_delete (&decl); 3685 3686 if (success) 3687 /* Assume an integral type, if we're not sure. */ 3688 return (int) ((tk == tk_none) ? tk_integral : tk); 3689 else 3690 return 0; 3691 } 3692 3693 /* Given a pointer to a type string that represents a fundamental type 3694 argument (int, long, unsigned int, etc) in TYPE, a pointer to the 3695 string in which the demangled output is being built in RESULT, and 3696 the WORK structure, decode the types and add them to the result. 3697 3698 For example: 3699 3700 "Ci" => "const int" 3701 "Sl" => "signed long" 3702 "CUs" => "const unsigned short" 3703 3704 The value returned is really a type_kind_t. */ 3705 3706 static int 3707 demangle_fund_type (struct work_stuff *work, 3708 const char **mangled, string *result) 3709 { 3710 int done = 0; 3711 int success = 1; 3712 char buf[INTBUF_SIZE + 5 /* 'int%u_t' */]; 3713 /* unsigned int dec = 0; */ /* JRS 2008-Oct-26: unused (see below) */ 3714 type_kind_t tk = tk_integral; 3715 3716 /* First pick off any type qualifiers. There can be more than one. */ 3717 3718 while (!done) 3719 { 3720 switch (**mangled) 3721 { 3722 case 'C': 3723 case 'V': 3724 case 'u': 3725 if (PRINT_ANSI_QUALIFIERS) 3726 { 3727 if (!STRING_EMPTY (result)) 3728 string_prepend (result, " "); 3729 string_prepend (result, demangle_qualifier (**mangled)); 3730 } 3731 (*mangled)++; 3732 break; 3733 case 'U': 3734 (*mangled)++; 3735 APPEND_BLANK (result); 3736 string_append (result, "unsigned"); 3737 break; 3738 case 'S': /* signed char only */ 3739 (*mangled)++; 3740 APPEND_BLANK (result); 3741 string_append (result, "signed"); 3742 break; 3743 case 'J': 3744 (*mangled)++; 3745 APPEND_BLANK (result); 3746 string_append (result, "__complex"); 3747 break; 3748 default: 3749 done = 1; 3750 break; 3751 } 3752 } 3753 3754 /* Now pick off the fundamental type. There can be only one. */ 3755 3756 switch (**mangled) 3757 { 3758 case '\0': 3759 case '_': 3760 break; 3761 case 'v': 3762 (*mangled)++; 3763 APPEND_BLANK (result); 3764 string_append (result, "void"); 3765 break; 3766 case 'x': 3767 (*mangled)++; 3768 APPEND_BLANK (result); 3769 string_append (result, "long long"); 3770 break; 3771 case 'l': 3772 (*mangled)++; 3773 APPEND_BLANK (result); 3774 string_append (result, "long"); 3775 break; 3776 case 'i': 3777 (*mangled)++; 3778 APPEND_BLANK (result); 3779 string_append (result, "int"); 3780 break; 3781 case 's': 3782 (*mangled)++; 3783 APPEND_BLANK (result); 3784 string_append (result, "short"); 3785 break; 3786 case 'b': 3787 (*mangled)++; 3788 APPEND_BLANK (result); 3789 string_append (result, "bool"); 3790 tk = tk_bool; 3791 break; 3792 case 'c': 3793 (*mangled)++; 3794 APPEND_BLANK (result); 3795 string_append (result, "char"); 3796 tk = tk_char; 3797 break; 3798 case 'w': 3799 (*mangled)++; 3800 APPEND_BLANK (result); 3801 string_append (result, "wchar_t"); 3802 tk = tk_char; 3803 break; 3804 case 'r': 3805 (*mangled)++; 3806 APPEND_BLANK (result); 3807 string_append (result, "long double"); 3808 tk = tk_real; 3809 break; 3810 case 'd': 3811 (*mangled)++; 3812 APPEND_BLANK (result); 3813 string_append (result, "double"); 3814 tk = tk_real; 3815 break; 3816 case 'f': 3817 (*mangled)++; 3818 APPEND_BLANK (result); 3819 string_append (result, "float"); 3820 tk = tk_real; 3821 break; 3822 case 'G': 3823 (*mangled)++; 3824 if (!ISDIGIT ((unsigned char)**mangled)) 3825 { 3826 success = 0; 3827 break; 3828 } 3829 case 'I': 3830 (*mangled)++; 3831 if (**mangled == '_') 3832 { 3833 int i; 3834 (*mangled)++; 3835 for (i = 0; 3836 i < (long) sizeof (buf) - 1 && **mangled && **mangled != '_'; 3837 (*mangled)++, i++) 3838 buf[i] = **mangled; 3839 if (**mangled != '_') 3840 { 3841 success = 0; 3842 break; 3843 } 3844 buf[i] = '\0'; 3845 (*mangled)++; 3846 } 3847 else 3848 { 3849 strncpy (buf, *mangled, 2); 3850 buf[2] = '\0'; 3851 *mangled += min (strlen (*mangled), 2); 3852 } 3853 /* JRS 2008-Oct-26: the next two commented out lines have been 3854 replaced by the sprintf that follows. This is to avoid use 3855 of sscanf. This hack is merely copied from the old demangler 3856 port (by Michael Matz, Simon Hausmann?) -- I have no idea if 3857 it is really correct/safe, but it looks ok. */ 3858 /*sscanf (buf, "%x", &dec); 3859 sprintf (buf, "int%u_t", dec);*/ 3860 sprintf (buf, "%s", "intXX_t"); 3861 /* end JRS 2008-Oct-26 */ 3862 APPEND_BLANK (result); 3863 string_append (result, buf); 3864 break; 3865 3866 /* fall through */ 3867 /* An explicit type, such as "6mytype" or "7integer" */ 3868 case '0': 3869 case '1': 3870 case '2': 3871 case '3': 3872 case '4': 3873 case '5': 3874 case '6': 3875 case '7': 3876 case '8': 3877 case '9': 3878 { 3879 int bindex = register_Btype (work); 3880 string btype; 3881 string_init (&btype); 3882 if (demangle_class_name (work, mangled, &btype)) { 3883 remember_Btype (work, btype.b, LEN_STRING (&btype), bindex); 3884 APPEND_BLANK (result); 3885 string_appends (result, &btype); 3886 } 3887 else 3888 success = 0; 3889 string_delete (&btype); 3890 break; 3891 } 3892 case 't': 3893 { 3894 string btype; 3895 string_init (&btype); 3896 success = demangle_template (work, mangled, &btype, 0, 1, 1); 3897 string_appends (result, &btype); 3898 string_delete (&btype); 3899 break; 3900 } 3901 default: 3902 success = 0; 3903 break; 3904 } 3905 3906 return success ? ((int) tk) : 0; 3907 } 3908 3909 3910 /* Handle a template's value parameter for HP aCC (extension from ARM) 3911 **mangled points to 'S' or 'U' */ 3912 3913 static int 3914 do_hpacc_template_const_value (struct work_stuff *work ATTRIBUTE_UNUSED, 3915 const char **mangled, string *result) 3916 { 3917 int unsigned_const; 3918 3919 if (**mangled != 'U' && **mangled != 'S') 3920 return 0; 3921 3922 unsigned_const = (**mangled == 'U'); 3923 3924 (*mangled)++; 3925 3926 switch (**mangled) 3927 { 3928 case 'N': 3929 string_append (result, "-"); 3930 /* fall through */ 3931 case 'P': 3932 (*mangled)++; 3933 break; 3934 case 'M': 3935 /* special case for -2^31 */ 3936 string_append (result, "-2147483648"); 3937 (*mangled)++; 3938 return 1; 3939 default: 3940 return 0; 3941 } 3942 3943 /* We have to be looking at an integer now */ 3944 if (!(ISDIGIT ((unsigned char)**mangled))) 3945 return 0; 3946 3947 /* We only deal with integral values for template 3948 parameters -- so it's OK to look only for digits */ 3949 while (ISDIGIT ((unsigned char)**mangled)) 3950 { 3951 char_str[0] = **mangled; 3952 string_append (result, char_str); 3953 (*mangled)++; 3954 } 3955 3956 if (unsigned_const) 3957 string_append (result, "U"); 3958 3959 /* FIXME? Some day we may have 64-bit (or larger :-) ) constants 3960 with L or LL suffixes. pai/1997-09-03 */ 3961 3962 return 1; /* success */ 3963 } 3964 3965 /* Handle a template's literal parameter for HP aCC (extension from ARM) 3966 **mangled is pointing to the 'A' */ 3967 3968 static int 3969 do_hpacc_template_literal (struct work_stuff *work, const char **mangled, 3970 string *result) 3971 { 3972 int literal_len = 0; 3973 char * recurse; 3974 char * recurse_dem; 3975 3976 if (**mangled != 'A') 3977 return 0; 3978 3979 (*mangled)++; 3980 3981 literal_len = consume_count (mangled); 3982 3983 if (literal_len <= 0) 3984 return 0; 3985 3986 /* Literal parameters are names of arrays, functions, etc. and the 3987 canonical representation uses the address operator */ 3988 string_append (result, "&"); 3989 3990 /* Now recursively demangle the literal name */ 3991 recurse = XNEWVEC (char, literal_len + 1); 3992 memcpy (recurse, *mangled, literal_len); 3993 recurse[literal_len] = '\000'; 3994 3995 recurse_dem = ML_(cplus_demangle) (recurse, work->options); 3996 3997 if (recurse_dem) 3998 { 3999 string_append (result, recurse_dem); 4000 free (recurse_dem); 4001 } 4002 else 4003 { 4004 string_appendn (result, *mangled, literal_len); 4005 } 4006 (*mangled) += literal_len; 4007 free (recurse); 4008 4009 return 1; 4010 } 4011 4012 static int 4013 snarf_numeric_literal (const char **args, string *arg) 4014 { 4015 if (**args == '-') 4016 { 4017 char_str[0] = '-'; 4018 string_append (arg, char_str); 4019 (*args)++; 4020 } 4021 else if (**args == '+') 4022 (*args)++; 4023 4024 if (!ISDIGIT ((unsigned char)**args)) 4025 return 0; 4026 4027 while (ISDIGIT ((unsigned char)**args)) 4028 { 4029 char_str[0] = **args; 4030 string_append (arg, char_str); 4031 (*args)++; 4032 } 4033 4034 return 1; 4035 } 4036 4037 /* Demangle the next argument, given by MANGLED into RESULT, which 4038 *should be an uninitialized* string. It will be initialized here, 4039 and free'd should anything go wrong. */ 4040 4041 static int 4042 do_arg (struct work_stuff *work, const char **mangled, string *result) 4043 { 4044 /* Remember where we started so that we can record the type, for 4045 non-squangling type remembering. */ 4046 const char *start = *mangled; 4047 4048 string_init (result); 4049 4050 if (work->nrepeats > 0) 4051 { 4052 --work->nrepeats; 4053 4054 if (work->previous_argument == 0) 4055 return 0; 4056 4057 /* We want to reissue the previous type in this argument list. */ 4058 string_appends (result, work->previous_argument); 4059 return 1; 4060 } 4061 4062 if (**mangled == 'n') 4063 { 4064 /* A squangling-style repeat. */ 4065 (*mangled)++; 4066 work->nrepeats = consume_count(mangled); 4067 4068 if (work->nrepeats <= 0) 4069 /* This was not a repeat count after all. */ 4070 return 0; 4071 4072 if (work->nrepeats > 9) 4073 { 4074 if (**mangled != '_') 4075 /* The repeat count should be followed by an '_' in this 4076 case. */ 4077 return 0; 4078 else 4079 (*mangled)++; 4080 } 4081 4082 /* Now, the repeat is all set up. */ 4083 return do_arg (work, mangled, result); 4084 } 4085 4086 /* Save the result in WORK->previous_argument so that we can find it 4087 if it's repeated. Note that saving START is not good enough: we 4088 do not want to add additional types to the back-referenceable 4089 type vector when processing a repeated type. */ 4090 if (work->previous_argument) 4091 string_delete (work->previous_argument); 4092 else 4093 work->previous_argument = XNEW (string); 4094 4095 if (!do_type (work, mangled, work->previous_argument)) 4096 return 0; 4097 4098 string_appends (result, work->previous_argument); 4099 4100 remember_type (work, start, *mangled - start); 4101 return 1; 4102 } 4103 4104 static void 4105 remember_type (struct work_stuff *work, const char *start, int len) 4106 { 4107 char *tem; 4108 4109 if (work->forgetting_types) 4110 return; 4111 4112 if (work -> ntypes >= work -> typevec_size) 4113 { 4114 if (work -> typevec_size == 0) 4115 { 4116 work -> typevec_size = 3; 4117 work -> typevec = XNEWVEC (char *, work->typevec_size); 4118 } 4119 else 4120 { 4121 work -> typevec_size *= 2; 4122 work -> typevec 4123 = XRESIZEVEC (char *, work->typevec, work->typevec_size); 4124 } 4125 } 4126 tem = XNEWVEC (char, len + 1); 4127 memcpy (tem, start, len); 4128 tem[len] = '\0'; 4129 work -> typevec[work -> ntypes++] = tem; 4130 } 4131 4132 4133 /* Remember a K type class qualifier. */ 4134 static void 4135 remember_Ktype (struct work_stuff *work, const char *start, int len) 4136 { 4137 char *tem; 4138 4139 if (work -> numk >= work -> ksize) 4140 { 4141 if (work -> ksize == 0) 4142 { 4143 work -> ksize = 5; 4144 work -> ktypevec = XNEWVEC (char *, work->ksize); 4145 } 4146 else 4147 { 4148 work -> ksize *= 2; 4149 work -> ktypevec 4150 = XRESIZEVEC (char *, work->ktypevec, work->ksize); 4151 } 4152 } 4153 tem = XNEWVEC (char, len + 1); 4154 memcpy (tem, start, len); 4155 tem[len] = '\0'; 4156 work -> ktypevec[work -> numk++] = tem; 4157 } 4158 4159 /* Register a B code, and get an index for it. B codes are registered 4160 as they are seen, rather than as they are completed, so map<temp<char> > 4161 registers map<temp<char> > as B0, and temp<char> as B1 */ 4162 4163 static int 4164 register_Btype (struct work_stuff *work) 4165 { 4166 int ret; 4167 4168 if (work -> numb >= work -> bsize) 4169 { 4170 if (work -> bsize == 0) 4171 { 4172 work -> bsize = 5; 4173 work -> btypevec = XNEWVEC (char *, work->bsize); 4174 } 4175 else 4176 { 4177 work -> bsize *= 2; 4178 work -> btypevec 4179 = XRESIZEVEC (char *, work->btypevec, work->bsize); 4180 } 4181 } 4182 ret = work -> numb++; 4183 work -> btypevec[ret] = NULL; 4184 return(ret); 4185 } 4186 4187 /* Store a value into a previously registered B code type. */ 4188 4189 static void 4190 remember_Btype (struct work_stuff *work, const char *start, 4191 int len, int indx) 4192 { 4193 char *tem; 4194 4195 tem = XNEWVEC (char, len + 1); 4196 memcpy (tem, start, len); 4197 tem[len] = '\0'; 4198 work -> btypevec[indx] = tem; 4199 } 4200 4201 /* Lose all the info related to B and K type codes. */ 4202 static void 4203 forget_B_and_K_types (struct work_stuff *work) 4204 { 4205 int i; 4206 4207 while (work -> numk > 0) 4208 { 4209 i = --(work -> numk); 4210 if (work -> ktypevec[i] != NULL) 4211 { 4212 free (work -> ktypevec[i]); 4213 work -> ktypevec[i] = NULL; 4214 } 4215 } 4216 4217 while (work -> numb > 0) 4218 { 4219 i = --(work -> numb); 4220 if (work -> btypevec[i] != NULL) 4221 { 4222 free (work -> btypevec[i]); 4223 work -> btypevec[i] = NULL; 4224 } 4225 } 4226 } 4227 /* Forget the remembered types, but not the type vector itself. */ 4228 4229 static void 4230 forget_types (struct work_stuff *work) 4231 { 4232 int i; 4233 4234 while (work -> ntypes > 0) 4235 { 4236 i = --(work -> ntypes); 4237 if (work -> typevec[i] != NULL) 4238 { 4239 free (work -> typevec[i]); 4240 work -> typevec[i] = NULL; 4241 } 4242 } 4243 } 4244 4245 /* Process the argument list part of the signature, after any class spec 4246 has been consumed, as well as the first 'F' character (if any). For 4247 example: 4248 4249 "__als__3fooRT0" => process "RT0" 4250 "complexfunc5__FPFPc_PFl_i" => process "PFPc_PFl_i" 4251 4252 DECLP must be already initialised, usually non-empty. It won't be freed 4253 on failure. 4254 4255 Note that g++ differs significantly from ARM and lucid style mangling 4256 with regards to references to previously seen types. For example, given 4257 the source fragment: 4258 4259 class foo { 4260 public: 4261 foo::foo (int, foo &ia, int, foo &ib, int, foo &ic); 4262 }; 4263 4264 foo::foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; } 4265 void foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; } 4266 4267 g++ produces the names: 4268 4269 __3fooiRT0iT2iT2 4270 foo__FiR3fooiT1iT1 4271 4272 while lcc (and presumably other ARM style compilers as well) produces: 4273 4274 foo__FiR3fooT1T2T1T2 4275 __ct__3fooFiR3fooT1T2T1T2 4276 4277 Note that g++ bases its type numbers starting at zero and counts all 4278 previously seen types, while lucid/ARM bases its type numbers starting 4279 at one and only considers types after it has seen the 'F' character 4280 indicating the start of the function args. For lucid/ARM style, we 4281 account for this difference by discarding any previously seen types when 4282 we see the 'F' character, and subtracting one from the type number 4283 reference. 4284 4285 */ 4286 4287 static int 4288 demangle_args (struct work_stuff *work, const char **mangled, 4289 string *declp) 4290 { 4291 string arg; 4292 int need_comma = 0; 4293 int r; 4294 int t; 4295 const char *tem; 4296 char temptype; 4297 4298 if (PRINT_ARG_TYPES) 4299 { 4300 string_append (declp, "("); 4301 if (**mangled == '\0') 4302 { 4303 string_append (declp, "void"); 4304 } 4305 } 4306 4307 while ((**mangled != '_' && **mangled != '\0' && **mangled != 'e') 4308 || work->nrepeats > 0) 4309 { 4310 if ((**mangled == 'N') || (**mangled == 'T')) 4311 { 4312 temptype = *(*mangled)++; 4313 4314 if (temptype == 'N') 4315 { 4316 if (!get_count (mangled, &r)) 4317 { 4318 return (0); 4319 } 4320 } 4321 else 4322 { 4323 r = 1; 4324 } 4325 if ((HP_DEMANGLING || ARM_DEMANGLING || EDG_DEMANGLING) && work -> ntypes >= 10) 4326 { 4327 /* If we have 10 or more types we might have more than a 1 digit 4328 index so we'll have to consume the whole count here. This 4329 will lose if the next thing is a type name preceded by a 4330 count but it's impossible to demangle that case properly 4331 anyway. Eg if we already have 12 types is T12Pc "(..., type1, 4332 Pc, ...)" or "(..., type12, char *, ...)" */ 4333 if ((t = consume_count(mangled)) <= 0) 4334 { 4335 return (0); 4336 } 4337 } 4338 else 4339 { 4340 if (!get_count (mangled, &t)) 4341 { 4342 return (0); 4343 } 4344 } 4345 if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) 4346 { 4347 t--; 4348 } 4349 /* Validate the type index. Protect against illegal indices from 4350 malformed type strings. */ 4351 if ((t < 0) || (t >= work -> ntypes)) 4352 { 4353 return (0); 4354 } 4355 while (work->nrepeats > 0 || --r >= 0) 4356 { 4357 tem = work -> typevec[t]; 4358 if (need_comma && PRINT_ARG_TYPES) 4359 { 4360 string_append (declp, ", "); 4361 } 4362 if (!do_arg (work, &tem, &arg)) 4363 { 4364 return (0); 4365 } 4366 if (PRINT_ARG_TYPES) 4367 { 4368 string_appends (declp, &arg); 4369 } 4370 string_delete (&arg); 4371 need_comma = 1; 4372 } 4373 } 4374 else 4375 { 4376 if (need_comma && PRINT_ARG_TYPES) 4377 string_append (declp, ", "); 4378 if (!do_arg (work, mangled, &arg)) 4379 return (0); 4380 if (PRINT_ARG_TYPES) 4381 string_appends (declp, &arg); 4382 string_delete (&arg); 4383 need_comma = 1; 4384 } 4385 } 4386 4387 if (**mangled == 'e') 4388 { 4389 (*mangled)++; 4390 if (PRINT_ARG_TYPES) 4391 { 4392 if (need_comma) 4393 { 4394 string_append (declp, ","); 4395 } 4396 string_append (declp, "..."); 4397 } 4398 } 4399 4400 if (PRINT_ARG_TYPES) 4401 { 4402 string_append (declp, ")"); 4403 } 4404 return (1); 4405 } 4406 4407 /* Like demangle_args, but for demangling the argument lists of function 4408 and method pointers or references, not top-level declarations. */ 4409 4410 static int 4411 demangle_nested_args (struct work_stuff *work, const char **mangled, 4412 string *declp) 4413 { 4414 string* saved_previous_argument; 4415 int result; 4416 int saved_nrepeats; 4417 4418 /* The G++ name-mangling algorithm does not remember types on nested 4419 argument lists, unless -fsquangling is used, and in that case the 4420 type vector updated by remember_type is not used. So, we turn 4421 off remembering of types here. */ 4422 ++work->forgetting_types; 4423 4424 /* For the repeat codes used with -fsquangling, we must keep track of 4425 the last argument. */ 4426 saved_previous_argument = work->previous_argument; 4427 saved_nrepeats = work->nrepeats; 4428 work->previous_argument = 0; 4429 work->nrepeats = 0; 4430 4431 /* Actually demangle the arguments. */ 4432 result = demangle_args (work, mangled, declp); 4433 4434 /* Restore the previous_argument field. */ 4435 if (work->previous_argument) 4436 { 4437 string_delete (work->previous_argument); 4438 free ((char *) work->previous_argument); 4439 } 4440 work->previous_argument = saved_previous_argument; 4441 --work->forgetting_types; 4442 work->nrepeats = saved_nrepeats; 4443 4444 return result; 4445 } 4446 4447 /* Returns 1 if a valid function name was found or 0 otherwise. */ 4448 4449 static int 4450 demangle_function_name (struct work_stuff *work, const char **mangled, 4451 string *declp, const char *scan) 4452 { 4453 size_t i; 4454 string type; 4455 const char *tem; 4456 4457 string_appendn (declp, (*mangled), scan - (*mangled)); 4458 string_need (declp, 1); 4459 *(declp -> p) = '\0'; 4460 4461 /* Consume the function name, including the "__" separating the name 4462 from the signature. We are guaranteed that SCAN points to the 4463 separator. */ 4464 4465 (*mangled) = scan + 2; 4466 /* We may be looking at an instantiation of a template function: 4467 foo__Xt1t2_Ft3t4, where t1, t2, ... are template arguments and a 4468 following _F marks the start of the function arguments. Handle 4469 the template arguments first. */ 4470 4471 if (HP_DEMANGLING && (**mangled == 'X')) 4472 { 4473 demangle_arm_hp_template (work, mangled, 0, declp); 4474 /* This leaves MANGLED pointing to the 'F' marking func args */ 4475 } 4476 4477 if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) 4478 { 4479 4480 /* See if we have an ARM style constructor or destructor operator. 4481 If so, then just record it, clear the decl, and return. 4482 We can't build the actual constructor/destructor decl until later, 4483 when we recover the class name from the signature. */ 4484 4485 if (strcmp (declp -> b, "__ct") == 0) 4486 { 4487 work -> constructor += 1; 4488 string_clear (declp); 4489 return 1; 4490 } 4491 else if (strcmp (declp -> b, "__dt") == 0) 4492 { 4493 work -> destructor += 1; 4494 string_clear (declp); 4495 return 1; 4496 } 4497 } 4498 4499 if (declp->p - declp->b >= 3 4500 && declp->b[0] == 'o' 4501 && declp->b[1] == 'p' 4502 && strchr (cplus_markers, declp->b[2]) != NULL) 4503 { 4504 /* see if it's an assignment expression */ 4505 if (declp->p - declp->b >= 10 /* op$assign_ */ 4506 && memcmp (declp->b + 3, "assign_", 7) == 0) 4507 { 4508 for (i = 0; i < ARRAY_SIZE (optable); i++) 4509 { 4510 int len = declp->p - declp->b - 10; 4511 if ((int) strlen (optable[i].in) == len 4512 && memcmp (optable[i].in, declp->b + 10, len) == 0) 4513 { 4514 string_clear (declp); 4515 string_append (declp, "operator"); 4516 string_append (declp, optable[i].out); 4517 string_append (declp, "="); 4518 break; 4519 } 4520 } 4521 } 4522 else 4523 { 4524 for (i = 0; i < ARRAY_SIZE (optable); i++) 4525 { 4526 int len = declp->p - declp->b - 3; 4527 if ((int) strlen (optable[i].in) == len 4528 && memcmp (optable[i].in, declp->b + 3, len) == 0) 4529 { 4530 string_clear (declp); 4531 string_append (declp, "operator"); 4532 string_append (declp, optable[i].out); 4533 break; 4534 } 4535 } 4536 } 4537 } 4538 else if (declp->p - declp->b >= 5 && memcmp (declp->b, "type", 4) == 0 4539 && strchr (cplus_markers, declp->b[4]) != NULL) 4540 { 4541 /* type conversion operator */ 4542 tem = declp->b + 5; 4543 if (do_type (work, &tem, &type)) 4544 { 4545 string_clear (declp); 4546 string_append (declp, "operator "); 4547 string_appends (declp, &type); 4548 string_delete (&type); 4549 } 4550 } 4551 else if (declp->b[0] == '_' && declp->b[1] == '_' 4552 && declp->b[2] == 'o' && declp->b[3] == 'p') 4553 { 4554 /* ANSI. */ 4555 /* type conversion operator. */ 4556 tem = declp->b + 4; 4557 if (do_type (work, &tem, &type)) 4558 { 4559 string_clear (declp); 4560 string_append (declp, "operator "); 4561 string_appends (declp, &type); 4562 string_delete (&type); 4563 } 4564 } 4565 else if (declp->b[0] == '_' && declp->b[1] == '_' 4566 && ISLOWER((unsigned char)declp->b[2]) 4567 && ISLOWER((unsigned char)declp->b[3])) 4568 { 4569 if (declp->b[4] == '\0') 4570 { 4571 /* Operator. */ 4572 for (i = 0; i < ARRAY_SIZE (optable); i++) 4573 { 4574 if (strlen (optable[i].in) == 2 4575 && memcmp (optable[i].in, declp->b + 2, 2) == 0) 4576 { 4577 string_clear (declp); 4578 string_append (declp, "operator"); 4579 string_append (declp, optable[i].out); 4580 break; 4581 } 4582 } 4583 } 4584 4585 /* BEGIN hack inserted 20050403 by JRS to deal with apparently 4586 non-cfront compliant new[]/delete[] manglings generated by 4587 the Portland Group's C++ compiler. */ 4588 else 4589 if (strcmp (declp -> b, "__nwa") == 0) { 4590 string_clear (declp); 4591 string_append (declp, "operator new[]"); 4592 } 4593 else 4594 if (strcmp (declp -> b, "__dla") == 0) { 4595 string_clear (declp); 4596 string_append (declp, "operator delete[]"); 4597 } 4598 /* END hack */ 4599 4600 else 4601 { 4602 if (declp->b[2] == 'a' && declp->b[5] == '\0') 4603 { 4604 /* Assignment. */ 4605 for (i = 0; i < ARRAY_SIZE (optable); i++) 4606 { 4607 if (strlen (optable[i].in) == 3 4608 && memcmp (optable[i].in, declp->b + 2, 3) == 0) 4609 { 4610 string_clear (declp); 4611 string_append (declp, "operator"); 4612 string_append (declp, optable[i].out); 4613 break; 4614 } 4615 } 4616 } 4617 } 4618 } 4619 4620 /* If a function name was obtained but it's not valid, we were not 4621 successful. */ 4622 if (LEN_STRING (declp) == 1 && declp->b[0] == '.') 4623 return 0; 4624 else 4625 return 1; 4626 } 4627 4628 /* a mini string-handling package */ 4629 4630 static void 4631 string_need (string *s, int n) 4632 { 4633 int tem; 4634 4635 if (s->b == NULL) 4636 { 4637 if (n < 32) 4638 { 4639 n = 32; 4640 } 4641 s->p = s->b = XNEWVEC (char, n); 4642 s->e = s->b + n; 4643 } 4644 else if (s->e - s->p < n) 4645 { 4646 tem = s->p - s->b; 4647 n += tem; 4648 n *= 2; 4649 s->b = XRESIZEVEC (char, s->b, n); 4650 s->p = s->b + tem; 4651 s->e = s->b + n; 4652 } 4653 } 4654 4655 static void 4656 string_delete (string *s) 4657 { 4658 if (s->b != NULL) 4659 { 4660 free (s->b); 4661 s->b = s->e = s->p = NULL; 4662 } 4663 } 4664 4665 static void 4666 string_init (string *s) 4667 { 4668 s->b = s->p = s->e = NULL; 4669 } 4670 4671 static void 4672 string_clear (string *s) 4673 { 4674 s->p = s->b; 4675 } 4676 4677 #if 0 4678 4679 static int 4680 string_empty (string *s) 4681 { 4682 return (s->b == s->p); 4683 } 4684 4685 #endif 4686 4687 static void 4688 string_append (string *p, const char *s) 4689 { 4690 int n; 4691 if (s == NULL || *s == '\0') 4692 return; 4693 n = strlen (s); 4694 string_need (p, n); 4695 memcpy (p->p, s, n); 4696 p->p += n; 4697 } 4698 4699 static void 4700 string_appends (string *p, string *s) 4701 { 4702 int n; 4703 4704 if (s->b != s->p) 4705 { 4706 n = s->p - s->b; 4707 string_need (p, n); 4708 memcpy (p->p, s->b, n); 4709 p->p += n; 4710 } 4711 } 4712 4713 static void 4714 string_appendn (string *p, const char *s, int n) 4715 { 4716 if (n != 0) 4717 { 4718 string_need (p, n); 4719 memcpy (p->p, s, n); 4720 p->p += n; 4721 } 4722 } 4723 4724 static void 4725 string_prepend (string *p, const char *s) 4726 { 4727 if (s != NULL && *s != '\0') 4728 { 4729 string_prependn (p, s, strlen (s)); 4730 } 4731 } 4732 4733 static void 4734 string_prepends (string *p, string *s) 4735 { 4736 if (s->b != s->p) 4737 { 4738 string_prependn (p, s->b, s->p - s->b); 4739 } 4740 } 4741 4742 static void 4743 string_prependn (string *p, const char *s, int n) 4744 { 4745 char *q; 4746 4747 if (n != 0) 4748 { 4749 string_need (p, n); 4750 for (q = p->p - 1; q >= p->b; q--) 4751 { 4752 q[n] = q[0]; 4753 } 4754 memcpy (p->b, s, n); 4755 p->p += n; 4756 } 4757 } 4758 4759 static void 4760 string_append_template_idx (string *s, int idx) 4761 { 4762 char buf[INTBUF_SIZE + 1 /* 'T' */]; 4763 sprintf(buf, "T%d", idx); 4764 string_append (s, buf); 4765 } 4766