1 /*- 2 * Copyright (c) 2007 Hyogeol Lee <hyogeollee@gmail.com> 3 * Copyright (c) 2015-2017 Kai Wang <kaiwang27@gmail.com> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer 11 * in this position and unchanged. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 #include <sys/types.h> 28 #include <assert.h> 29 #include <ctype.h> 30 #include <errno.h> 31 #include <limits.h> 32 #include <stdbool.h> 33 #include <stdio.h> 34 #include <stdlib.h> 35 #include <string.h> 36 37 /** 38 * @file cpp_demangle.c 39 * @brief Decode IA-64 C++ ABI style implementation. 40 * 41 * IA-64 standard ABI(Itanium C++ ABI) references. 42 * 43 * http://www.codesourcery.com/cxx-abi/abi.html#mangling \n 44 * http://www.codesourcery.com/cxx-abi/abi-mangling.html 45 */ 46 47 /** @brief Dynamic vector data for string. */ 48 struct vector_str { 49 /** Current size */ 50 size_t size; 51 /** Total capacity */ 52 size_t capacity; 53 /** String array */ 54 char **container; 55 }; 56 57 #define BUFFER_GROWFACTOR 1.618 58 #define BUFFER_GROW(x) (((x)+0.5)*BUFFER_GROWFACTOR) 59 60 #define ELFTC_FAILURE 0 61 #define ELFTC_ISDIGIT(C) (isdigit((C) & 0xFF)) 62 #define ELFTC_SUCCESS 1 63 64 #define VECTOR_DEF_CAPACITY 8 65 66 enum type_qualifier { 67 TYPE_PTR, TYPE_REF, TYPE_CMX, TYPE_IMG, TYPE_EXT, TYPE_RST, TYPE_VAT, 68 TYPE_CST, TYPE_VEC, TYPE_RREF 69 }; 70 71 struct vector_type_qualifier { 72 size_t size, capacity; 73 enum type_qualifier *q_container; 74 struct vector_str ext_name; 75 }; 76 77 enum read_cmd { 78 READ_FAIL, READ_NEST, READ_TMPL, READ_EXPR, READ_EXPL, READ_LOCAL, 79 READ_TYPE, READ_FUNC, READ_PTRMEM 80 }; 81 82 struct read_cmd_item { 83 enum read_cmd cmd; 84 void *data; 85 }; 86 87 struct vector_read_cmd { 88 size_t size, capacity; 89 struct read_cmd_item *r_container; 90 }; 91 92 enum push_qualifier { 93 PUSH_ALL_QUALIFIER, 94 PUSH_CV_QUALIFIER, 95 PUSH_NON_CV_QUALIFIER, 96 }; 97 98 struct cpp_demangle_data { 99 struct vector_str output; /* output string vector */ 100 struct vector_str subst; /* substitution string vector */ 101 struct vector_str tmpl; 102 struct vector_str class_type; 103 struct vector_str *cur_output; /* ptr to current output vec */ 104 struct vector_read_cmd cmd; 105 bool mem_rst; /* restrict member function */ 106 bool mem_vat; /* volatile member function */ 107 bool mem_cst; /* const member function */ 108 bool mem_ref; /* lvalue-ref member func */ 109 bool mem_rref; /* rvalue-ref member func */ 110 bool is_tmpl; /* template args */ 111 bool is_functype; /* function type */ 112 bool ref_qualifier; /* ref qualifier */ 113 enum type_qualifier ref_qualifier_type; /* ref qualifier type */ 114 enum push_qualifier push_qualifier; /* which qualifiers to push */ 115 int func_type; 116 const char *cur; /* current mangled name ptr */ 117 const char *last_sname; /* last source name */ 118 }; 119 120 struct type_delimit { 121 bool paren; 122 bool firstp; 123 }; 124 125 #define CPP_DEMANGLE_TRY_LIMIT 128 126 #define FLOAT_SPRINTF_TRY_LIMIT 5 127 #define FLOAT_QUADRUPLE_BYTES 16 128 #define FLOAT_EXTENED_BYTES 10 129 130 #define SIMPLE_HASH(x,y) (64 * x + y) 131 #define DEM_PUSH_STR(d,s) cpp_demangle_push_str((d), (s), strlen((s))) 132 #define VEC_PUSH_STR(d,s) vector_str_push((d), (s), strlen((s))) 133 134 static size_t get_strlen_sum(const struct vector_str *v); 135 static bool vector_str_grow(struct vector_str *v); 136 137 static size_t 138 get_strlen_sum(const struct vector_str *v) 139 { 140 size_t i, len = 0; 141 142 if (v == NULL) 143 return (0); 144 145 assert(v->size > 0); 146 147 for (i = 0; i < v->size; ++i) 148 len += strlen(v->container[i]); 149 150 return (len); 151 } 152 153 /** 154 * @brief Deallocate resource in vector_str. 155 */ 156 static void 157 vector_str_dest(struct vector_str *v) 158 { 159 size_t i; 160 161 if (v == NULL) 162 return; 163 164 for (i = 0; i < v->size; ++i) 165 free(v->container[i]); 166 167 free(v->container); 168 } 169 170 /** 171 * @brief Find string in vector_str. 172 * @param v Destination vector. 173 * @param o String to find. 174 * @param l Length of the string. 175 * @return -1 at failed, 0 at not found, 1 at found. 176 */ 177 static int 178 vector_str_find(const struct vector_str *v, const char *o, size_t l) 179 { 180 size_t i; 181 182 if (v == NULL || o == NULL) 183 return (-1); 184 185 for (i = 0; i < v->size; ++i) 186 if (strncmp(v->container[i], o, l) == 0) 187 return (1); 188 189 return (0); 190 } 191 192 /** 193 * @brief Get new allocated flat string from vector. 194 * 195 * If l is not NULL, return length of the string. 196 * @param v Destination vector. 197 * @param l Length of the string. 198 * @return NULL at failed or NUL terminated new allocated string. 199 */ 200 static char * 201 vector_str_get_flat(const struct vector_str *v, size_t *l) 202 { 203 ssize_t elem_pos, elem_size, rtn_size; 204 size_t i; 205 char *rtn; 206 207 if (v == NULL || v->size == 0) 208 return (NULL); 209 210 if ((rtn_size = get_strlen_sum(v)) == 0) 211 return (NULL); 212 213 if ((rtn = malloc(sizeof(char) * (rtn_size + 1))) == NULL) 214 return (NULL); 215 216 elem_pos = 0; 217 for (i = 0; i < v->size; ++i) { 218 elem_size = strlen(v->container[i]); 219 220 memcpy(rtn + elem_pos, v->container[i], elem_size); 221 222 elem_pos += elem_size; 223 } 224 225 rtn[rtn_size] = '\0'; 226 227 if (l != NULL) 228 *l = rtn_size; 229 230 return (rtn); 231 } 232 233 static bool 234 vector_str_grow(struct vector_str *v) 235 { 236 size_t i, tmp_cap; 237 char **tmp_ctn; 238 239 if (v == NULL) 240 return (false); 241 242 assert(v->capacity > 0); 243 244 tmp_cap = BUFFER_GROW(v->capacity); 245 246 assert(tmp_cap > v->capacity); 247 248 if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL) 249 return (false); 250 251 for (i = 0; i < v->size; ++i) 252 tmp_ctn[i] = v->container[i]; 253 254 free(v->container); 255 256 v->container = tmp_ctn; 257 v->capacity = tmp_cap; 258 259 return (true); 260 } 261 262 /** 263 * @brief Initialize vector_str. 264 * @return false at failed, true at success. 265 */ 266 static bool 267 vector_str_init(struct vector_str *v) 268 { 269 270 if (v == NULL) 271 return (false); 272 273 v->size = 0; 274 v->capacity = VECTOR_DEF_CAPACITY; 275 276 assert(v->capacity > 0); 277 278 if ((v->container = malloc(sizeof(char *) * v->capacity)) == NULL) 279 return (false); 280 281 assert(v->container != NULL); 282 283 return (true); 284 } 285 286 /** 287 * @brief Remove last element in vector_str. 288 * @return false at failed, true at success. 289 */ 290 static bool 291 vector_str_pop(struct vector_str *v) 292 { 293 294 if (v == NULL) 295 return (false); 296 297 if (v->size == 0) 298 return (true); 299 300 --v->size; 301 302 free(v->container[v->size]); 303 v->container[v->size] = NULL; 304 305 return (true); 306 } 307 308 /** 309 * @brief Push back string to vector. 310 * @return false at failed, true at success. 311 */ 312 static bool 313 vector_str_push(struct vector_str *v, const char *str, size_t len) 314 { 315 316 if (v == NULL || str == NULL) 317 return (false); 318 319 if (v->size == v->capacity && vector_str_grow(v) == false) 320 return (false); 321 322 if ((v->container[v->size] = malloc(sizeof(char) * (len + 1))) == NULL) 323 return (false); 324 325 snprintf(v->container[v->size], len + 1, "%s", str); 326 327 ++v->size; 328 329 return (true); 330 } 331 332 /** 333 * @brief Push front org vector to det vector. 334 * @return false at failed, true at success. 335 */ 336 static bool 337 vector_str_push_vector_head(struct vector_str *dst, struct vector_str *org) 338 { 339 size_t i, j, tmp_cap; 340 char **tmp_ctn; 341 342 if (dst == NULL || org == NULL) 343 return (false); 344 345 tmp_cap = BUFFER_GROW(dst->size + org->size); 346 347 if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL) 348 return (false); 349 350 for (i = 0; i < org->size; ++i) 351 if ((tmp_ctn[i] = strdup(org->container[i])) == NULL) { 352 for (j = 0; j < i; ++j) 353 free(tmp_ctn[j]); 354 355 free(tmp_ctn); 356 357 return (false); 358 } 359 360 for (i = 0; i < dst->size; ++i) 361 tmp_ctn[i + org->size] = dst->container[i]; 362 363 free(dst->container); 364 365 dst->container = tmp_ctn; 366 dst->capacity = tmp_cap; 367 dst->size += org->size; 368 369 return (true); 370 } 371 372 /** 373 * @brief Push org vector to the tail of det vector. 374 * @return false at failed, true at success. 375 */ 376 static bool 377 vector_str_push_vector(struct vector_str *dst, struct vector_str *org) 378 { 379 size_t i, j, tmp_cap; 380 char **tmp_ctn; 381 382 if (dst == NULL || org == NULL) 383 return (false); 384 385 tmp_cap = BUFFER_GROW(dst->size + org->size); 386 387 if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL) 388 return (false); 389 390 for (i = 0; i < dst->size; ++i) 391 tmp_ctn[i] = dst->container[i]; 392 393 for (i = 0; i < org->size; ++i) 394 if ((tmp_ctn[i + dst->size] = strdup(org->container[i])) == 395 NULL) { 396 for (j = 0; j < i + dst->size; ++j) 397 free(tmp_ctn[j]); 398 399 free(tmp_ctn); 400 401 return (false); 402 } 403 404 free(dst->container); 405 406 dst->container = tmp_ctn; 407 dst->capacity = tmp_cap; 408 dst->size += org->size; 409 410 return (true); 411 } 412 413 /** 414 * @brief Get new allocated flat string from vector between begin and end. 415 * 416 * If r_len is not NULL, string length will be returned. 417 * @return NULL at failed or NUL terminated new allocated string. 418 */ 419 static char * 420 vector_str_substr(const struct vector_str *v, size_t begin, size_t end, 421 size_t *r_len) 422 { 423 size_t cur, i, len; 424 char *rtn; 425 426 if (v == NULL || begin > end) 427 return (NULL); 428 429 len = 0; 430 for (i = begin; i < end + 1; ++i) 431 len += strlen(v->container[i]); 432 433 if ((rtn = malloc(sizeof(char) * (len + 1))) == NULL) 434 return (NULL); 435 436 if (r_len != NULL) 437 *r_len = len; 438 439 cur = 0; 440 for (i = begin; i < end + 1; ++i) { 441 len = strlen(v->container[i]); 442 memcpy(rtn + cur, v->container[i], len); 443 cur += len; 444 } 445 rtn[cur] = '\0'; 446 447 return (rtn); 448 } 449 450 static void cpp_demangle_data_dest(struct cpp_demangle_data *); 451 static int cpp_demangle_data_init(struct cpp_demangle_data *, 452 const char *); 453 static int cpp_demangle_get_subst(struct cpp_demangle_data *, size_t); 454 static int cpp_demangle_get_tmpl_param(struct cpp_demangle_data *, size_t); 455 static int cpp_demangle_push_fp(struct cpp_demangle_data *, 456 char *(*)(const char *, size_t)); 457 static int cpp_demangle_push_str(struct cpp_demangle_data *, const char *, 458 size_t); 459 static int cpp_demangle_pop_str(struct cpp_demangle_data *); 460 static int cpp_demangle_push_subst(struct cpp_demangle_data *, 461 const char *, size_t); 462 static int cpp_demangle_push_subst_v(struct cpp_demangle_data *, 463 struct vector_str *); 464 static int cpp_demangle_push_type_qualifier(struct cpp_demangle_data *, 465 struct vector_type_qualifier *, const char *); 466 static int cpp_demangle_read_array(struct cpp_demangle_data *); 467 static int cpp_demangle_read_encoding(struct cpp_demangle_data *); 468 static int cpp_demangle_read_expr_primary(struct cpp_demangle_data *); 469 static int cpp_demangle_read_expression(struct cpp_demangle_data *); 470 static int cpp_demangle_read_expression_flat(struct cpp_demangle_data *, 471 char **); 472 static int cpp_demangle_read_expression_binary(struct cpp_demangle_data *, 473 const char *, size_t); 474 static int cpp_demangle_read_expression_unary(struct cpp_demangle_data *, 475 const char *, size_t); 476 static int cpp_demangle_read_expression_trinary(struct cpp_demangle_data *, 477 const char *, size_t, const char *, size_t); 478 static int cpp_demangle_read_function(struct cpp_demangle_data *, int *, 479 struct vector_type_qualifier *); 480 static int cpp_demangle_local_source_name(struct cpp_demangle_data *ddata); 481 static int cpp_demangle_read_local_name(struct cpp_demangle_data *); 482 static int cpp_demangle_read_name(struct cpp_demangle_data *); 483 static int cpp_demangle_read_name_flat(struct cpp_demangle_data *, 484 char**); 485 static int cpp_demangle_read_nested_name(struct cpp_demangle_data *); 486 static int cpp_demangle_read_number(struct cpp_demangle_data *, long *); 487 static int cpp_demangle_read_number_as_string(struct cpp_demangle_data *, 488 char **); 489 static int cpp_demangle_read_nv_offset(struct cpp_demangle_data *); 490 static int cpp_demangle_read_offset(struct cpp_demangle_data *); 491 static int cpp_demangle_read_offset_number(struct cpp_demangle_data *); 492 static int cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *, 493 struct vector_type_qualifier *); 494 static int cpp_demangle_read_sname(struct cpp_demangle_data *); 495 static int cpp_demangle_read_subst(struct cpp_demangle_data *); 496 static int cpp_demangle_read_subst_std(struct cpp_demangle_data *); 497 static int cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *, 498 const char *); 499 static int cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *); 500 static int cpp_demangle_read_tmpl_args(struct cpp_demangle_data *); 501 static int cpp_demangle_read_tmpl_param(struct cpp_demangle_data *); 502 static int cpp_demangle_read_type(struct cpp_demangle_data *, 503 struct type_delimit *); 504 static int cpp_demangle_read_type_flat(struct cpp_demangle_data *, 505 char **); 506 static int cpp_demangle_read_uqname(struct cpp_demangle_data *); 507 static int cpp_demangle_read_v_offset(struct cpp_demangle_data *); 508 static char *decode_fp_to_double(const char *, size_t); 509 static char *decode_fp_to_float(const char *, size_t); 510 static char *decode_fp_to_float128(const char *, size_t); 511 static char *decode_fp_to_float80(const char *, size_t); 512 static char *decode_fp_to_long_double(const char *, size_t); 513 static int hex_to_dec(char); 514 static void vector_read_cmd_dest(struct vector_read_cmd *); 515 static struct read_cmd_item *vector_read_cmd_find(struct vector_read_cmd *, 516 enum read_cmd); 517 static int vector_read_cmd_init(struct vector_read_cmd *); 518 static int vector_read_cmd_pop(struct vector_read_cmd *); 519 static int vector_read_cmd_push(struct vector_read_cmd *, enum read_cmd, 520 void *); 521 static void vector_type_qualifier_dest(struct vector_type_qualifier *); 522 static int vector_type_qualifier_init(struct vector_type_qualifier *); 523 static int vector_type_qualifier_push(struct vector_type_qualifier *, 524 enum type_qualifier); 525 526 /** 527 * @brief Decode the input string by IA-64 C++ ABI style. 528 * 529 * GNU GCC v3 use IA-64 standard ABI. 530 * @return New allocated demangled string or NULL if failed. 531 * @todo 1. Testing and more test case. 2. Code cleaning. 532 */ 533 char * 534 __cxa_demangle_gnu3(const char *org) 535 { 536 struct cpp_demangle_data ddata; 537 struct vector_str ret_type; 538 struct type_delimit td; 539 ssize_t org_len; 540 unsigned int limit; 541 char *rtn = NULL; 542 bool has_ret = false, more_type = false; 543 544 if (org == NULL) 545 return (NULL); 546 547 org_len = strlen(org); 548 // Try demangling as a type for short encodings 549 if ((org_len < 2) || (org[0] != '_' || org[1] != 'Z' )) { 550 if (!cpp_demangle_data_init(&ddata, org)) 551 return (NULL); 552 if (!cpp_demangle_read_type(&ddata, 0)) 553 goto clean; 554 rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL); 555 goto clean; 556 } 557 if (org_len > 11 && !strncmp(org, "_GLOBAL__I_", 11)) { 558 if ((rtn = malloc(org_len + 19)) == NULL) 559 return (NULL); 560 snprintf(rtn, org_len + 19, 561 "global constructors keyed to %s", org + 11); 562 return (rtn); 563 } 564 565 if (!cpp_demangle_data_init(&ddata, org + 2)) 566 return (NULL); 567 568 if (!cpp_demangle_read_encoding(&ddata)) 569 goto clean; 570 571 /* 572 * Pop function name from substitution candidate list. 573 */ 574 if (*ddata.cur != 0 && ddata.subst.size >= 1) { 575 if (!vector_str_pop(&ddata.subst)) 576 goto clean; 577 } 578 579 td.paren = false; 580 td.firstp = true; 581 limit = 0; 582 583 /* 584 * The first type is a return type if we just demangled template 585 * args. (the template args is right next to the function name, 586 * which means it's a template function) 587 */ 588 if (ddata.is_tmpl) { 589 ddata.is_tmpl = false; 590 if (!vector_str_init(&ret_type)) 591 goto clean; 592 ddata.cur_output = &ret_type; 593 has_ret = true; 594 } 595 596 while (*ddata.cur != '\0') { 597 /* 598 * Breaking at some gcc info at tail. e.g) @@GLIBCXX_3.4 599 */ 600 if (*ddata.cur == '@' && *(ddata.cur + 1) == '@') 601 break; 602 603 if (has_ret) { 604 /* Read return type */ 605 if (!cpp_demangle_read_type(&ddata, NULL)) 606 goto clean; 607 } else { 608 /* Read function arg type */ 609 if (!cpp_demangle_read_type(&ddata, &td)) 610 goto clean; 611 } 612 613 if (has_ret) { 614 /* Push return type to the beginning */ 615 if (!VEC_PUSH_STR(&ret_type, " ")) 616 goto clean; 617 if (!vector_str_push_vector_head(&ddata.output, 618 &ret_type)) 619 goto clean; 620 ddata.cur_output = &ddata.output; 621 vector_str_dest(&ret_type); 622 has_ret = false; 623 more_type = true; 624 } else if (more_type) 625 more_type = false; 626 if (limit++ > CPP_DEMANGLE_TRY_LIMIT) 627 goto clean; 628 } 629 if (more_type) 630 goto clean; 631 632 if (ddata.output.size == 0) 633 goto clean; 634 if (td.paren && !VEC_PUSH_STR(&ddata.output, ")")) 635 goto clean; 636 if (ddata.mem_vat && !VEC_PUSH_STR(&ddata.output, " volatile")) 637 goto clean; 638 if (ddata.mem_cst && !VEC_PUSH_STR(&ddata.output, " const")) 639 goto clean; 640 if (ddata.mem_rst && !VEC_PUSH_STR(&ddata.output, " restrict")) 641 goto clean; 642 if (ddata.mem_ref && !VEC_PUSH_STR(&ddata.output, " &")) 643 goto clean; 644 if (ddata.mem_rref && !VEC_PUSH_STR(&ddata.output, " &&")) 645 goto clean; 646 647 rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL); 648 649 clean: 650 if (has_ret) 651 vector_str_dest(&ret_type); 652 653 cpp_demangle_data_dest(&ddata); 654 655 return (rtn); 656 } 657 658 static void 659 cpp_demangle_data_dest(struct cpp_demangle_data *d) 660 { 661 662 if (d == NULL) 663 return; 664 665 vector_read_cmd_dest(&d->cmd); 666 vector_str_dest(&d->class_type); 667 vector_str_dest(&d->tmpl); 668 vector_str_dest(&d->subst); 669 vector_str_dest(&d->output); 670 } 671 672 static int 673 cpp_demangle_data_init(struct cpp_demangle_data *d, const char *cur) 674 { 675 676 if (d == NULL || cur == NULL) 677 return (0); 678 679 if (!vector_str_init(&d->output)) 680 return (0); 681 if (!vector_str_init(&d->subst)) 682 goto clean1; 683 if (!vector_str_init(&d->tmpl)) 684 goto clean2; 685 if (!vector_str_init(&d->class_type)) 686 goto clean3; 687 if (!vector_read_cmd_init(&d->cmd)) 688 goto clean4; 689 690 assert(d->output.container != NULL); 691 assert(d->subst.container != NULL); 692 assert(d->tmpl.container != NULL); 693 assert(d->class_type.container != NULL); 694 695 d->mem_rst = false; 696 d->mem_vat = false; 697 d->mem_cst = false; 698 d->mem_ref = false; 699 d->mem_rref = false; 700 d->is_tmpl = false; 701 d->is_functype = false; 702 d->ref_qualifier = false; 703 d->push_qualifier = PUSH_ALL_QUALIFIER; 704 d->func_type = 0; 705 d->cur = cur; 706 d->cur_output = &d->output; 707 d->last_sname = NULL; 708 709 return (1); 710 711 clean4: 712 vector_str_dest(&d->class_type); 713 clean3: 714 vector_str_dest(&d->tmpl); 715 clean2: 716 vector_str_dest(&d->subst); 717 clean1: 718 vector_str_dest(&d->output); 719 720 return (0); 721 } 722 723 static int 724 cpp_demangle_push_fp(struct cpp_demangle_data *ddata, 725 char *(*decoder)(const char *, size_t)) 726 { 727 size_t len; 728 int rtn; 729 const char *fp; 730 char *f; 731 732 if (ddata == NULL || decoder == NULL) 733 return (0); 734 735 fp = ddata->cur; 736 while (*ddata->cur != 'E') 737 ++ddata->cur; 738 739 if ((f = decoder(fp, ddata->cur - fp)) == NULL) 740 return (0); 741 742 rtn = 0; 743 if ((len = strlen(f)) > 0) 744 rtn = cpp_demangle_push_str(ddata, f, len); 745 746 free(f); 747 748 ++ddata->cur; 749 750 return (rtn); 751 } 752 753 static int 754 cpp_demangle_push_str(struct cpp_demangle_data *ddata, const char *str, 755 size_t len) 756 { 757 758 if (ddata == NULL || str == NULL || len == 0) 759 return (0); 760 761 /* 762 * is_tmpl is used to check if the type (function arg) is right next 763 * to template args, and should always be cleared whenever new string 764 * pushed. 765 */ 766 ddata->is_tmpl = false; 767 768 return (vector_str_push(ddata->cur_output, str, len)); 769 } 770 771 static int 772 cpp_demangle_pop_str(struct cpp_demangle_data *ddata) 773 { 774 775 if (ddata == NULL) 776 return (0); 777 778 return (vector_str_pop(ddata->cur_output)); 779 } 780 781 static int 782 cpp_demangle_push_subst(struct cpp_demangle_data *ddata, const char *str, 783 size_t len) 784 { 785 786 if (ddata == NULL || str == NULL || len == 0) 787 return (0); 788 789 if (!vector_str_find(&ddata->subst, str, len)) 790 return (vector_str_push(&ddata->subst, str, len)); 791 792 return (1); 793 } 794 795 static int 796 cpp_demangle_push_subst_v(struct cpp_demangle_data *ddata, struct vector_str *v) 797 { 798 size_t str_len; 799 int rtn; 800 char *str; 801 802 if (ddata == NULL || v == NULL) 803 return (0); 804 805 if ((str = vector_str_get_flat(v, &str_len)) == NULL) 806 return (0); 807 808 rtn = cpp_demangle_push_subst(ddata, str, str_len); 809 810 free(str); 811 812 return (rtn); 813 } 814 815 static int 816 cpp_demangle_push_type_qualifier(struct cpp_demangle_data *ddata, 817 struct vector_type_qualifier *v, const char *type_str) 818 { 819 struct vector_str subst_v; 820 enum type_qualifier t; 821 size_t idx, e_idx, e_len; 822 char *buf; 823 int rtn; 824 bool cv; 825 826 if (ddata == NULL || v == NULL) 827 return (0); 828 829 if ((idx = v->size) == 0) 830 return (1); 831 832 rtn = 0; 833 if (type_str != NULL) { 834 if (!vector_str_init(&subst_v)) 835 return (0); 836 if (!VEC_PUSH_STR(&subst_v, type_str)) 837 goto clean; 838 } 839 840 cv = true; 841 e_idx = 0; 842 while (idx > 0) { 843 switch (v->q_container[idx - 1]) { 844 case TYPE_PTR: 845 cv = false; 846 if (ddata->push_qualifier == PUSH_CV_QUALIFIER) 847 break; 848 if (!DEM_PUSH_STR(ddata, "*")) 849 goto clean; 850 if (type_str != NULL) { 851 if (!VEC_PUSH_STR(&subst_v, "*")) 852 goto clean; 853 if (!cpp_demangle_push_subst_v(ddata, 854 &subst_v)) 855 goto clean; 856 } 857 break; 858 859 case TYPE_REF: 860 cv = false; 861 if (ddata->push_qualifier == PUSH_CV_QUALIFIER) 862 break; 863 if (!DEM_PUSH_STR(ddata, "&")) 864 goto clean; 865 if (type_str != NULL) { 866 if (!VEC_PUSH_STR(&subst_v, "&")) 867 goto clean; 868 if (!cpp_demangle_push_subst_v(ddata, 869 &subst_v)) 870 goto clean; 871 } 872 break; 873 874 case TYPE_RREF: 875 cv = false; 876 if (ddata->push_qualifier == PUSH_CV_QUALIFIER) 877 break; 878 if (!DEM_PUSH_STR(ddata, "&&")) 879 goto clean; 880 if (type_str != NULL) { 881 if (!VEC_PUSH_STR(&subst_v, "&&")) 882 goto clean; 883 if (!cpp_demangle_push_subst_v(ddata, 884 &subst_v)) 885 goto clean; 886 } 887 break; 888 889 case TYPE_CMX: 890 cv = false; 891 if (ddata->push_qualifier == PUSH_CV_QUALIFIER) 892 break; 893 if (!DEM_PUSH_STR(ddata, " complex")) 894 goto clean; 895 if (type_str != NULL) { 896 if (!VEC_PUSH_STR(&subst_v, " complex")) 897 goto clean; 898 if (!cpp_demangle_push_subst_v(ddata, 899 &subst_v)) 900 goto clean; 901 } 902 break; 903 904 case TYPE_IMG: 905 cv = false; 906 if (ddata->push_qualifier == PUSH_CV_QUALIFIER) 907 break; 908 if (!DEM_PUSH_STR(ddata, " imaginary")) 909 goto clean; 910 if (type_str != NULL) { 911 if (!VEC_PUSH_STR(&subst_v, " imaginary")) 912 goto clean; 913 if (!cpp_demangle_push_subst_v(ddata, 914 &subst_v)) 915 goto clean; 916 } 917 break; 918 919 case TYPE_EXT: 920 cv = false; 921 if (ddata->push_qualifier == PUSH_CV_QUALIFIER) 922 break; 923 if (v->ext_name.size == 0 || 924 e_idx > v->ext_name.size - 1) 925 goto clean; 926 if ((e_len = strlen(v->ext_name.container[e_idx])) == 927 0) 928 goto clean; 929 if ((buf = malloc(e_len + 2)) == NULL) 930 goto clean; 931 snprintf(buf, e_len + 2, " %s", 932 v->ext_name.container[e_idx]); 933 934 if (!DEM_PUSH_STR(ddata, buf)) { 935 free(buf); 936 goto clean; 937 } 938 939 if (type_str != NULL) { 940 if (!VEC_PUSH_STR(&subst_v, buf)) { 941 free(buf); 942 goto clean; 943 } 944 if (!cpp_demangle_push_subst_v(ddata, 945 &subst_v)) { 946 free(buf); 947 goto clean; 948 } 949 } 950 free(buf); 951 ++e_idx; 952 break; 953 954 case TYPE_RST: 955 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER && 956 cv) 957 break; 958 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv) 959 break; 960 if (!DEM_PUSH_STR(ddata, " restrict")) 961 goto clean; 962 if (type_str != NULL) { 963 if (!VEC_PUSH_STR(&subst_v, " restrict")) 964 goto clean; 965 if (idx - 1 > 0) { 966 t = v->q_container[idx - 2]; 967 if (t == TYPE_RST || t == TYPE_VAT || 968 t == TYPE_CST) 969 break; 970 } 971 if (!cpp_demangle_push_subst_v(ddata, 972 &subst_v)) 973 goto clean; 974 } 975 break; 976 977 case TYPE_VAT: 978 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER && 979 cv) 980 break; 981 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv) 982 break; 983 if (!DEM_PUSH_STR(ddata, " volatile")) 984 goto clean; 985 if (type_str != NULL) { 986 if (!VEC_PUSH_STR(&subst_v, " volatile")) 987 goto clean; 988 if (idx - 1 > 0) { 989 t = v->q_container[idx - 2]; 990 if (t == TYPE_RST || t == TYPE_VAT || 991 t == TYPE_CST) 992 break; 993 } 994 if (!cpp_demangle_push_subst_v(ddata, 995 &subst_v)) 996 goto clean; 997 } 998 break; 999 1000 case TYPE_CST: 1001 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER && 1002 cv) 1003 break; 1004 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv) 1005 break; 1006 if (!DEM_PUSH_STR(ddata, " const")) 1007 goto clean; 1008 if (type_str != NULL) { 1009 if (!VEC_PUSH_STR(&subst_v, " const")) 1010 goto clean; 1011 if (idx - 1 > 0) { 1012 t = v->q_container[idx - 2]; 1013 if (t == TYPE_RST || t == TYPE_VAT || 1014 t == TYPE_CST) 1015 break; 1016 } 1017 if (!cpp_demangle_push_subst_v(ddata, 1018 &subst_v)) 1019 goto clean; 1020 } 1021 break; 1022 1023 case TYPE_VEC: 1024 cv = false; 1025 if (ddata->push_qualifier == PUSH_CV_QUALIFIER) 1026 break; 1027 if (v->ext_name.size == 0 || 1028 e_idx > v->ext_name.size - 1) 1029 goto clean; 1030 if ((e_len = strlen(v->ext_name.container[e_idx])) == 1031 0) 1032 goto clean; 1033 if ((buf = malloc(e_len + 12)) == NULL) 1034 goto clean; 1035 snprintf(buf, e_len + 12, " __vector(%s)", 1036 v->ext_name.container[e_idx]); 1037 if (!DEM_PUSH_STR(ddata, buf)) { 1038 free(buf); 1039 goto clean; 1040 } 1041 if (type_str != NULL) { 1042 if (!VEC_PUSH_STR(&subst_v, buf)) { 1043 free(buf); 1044 goto clean; 1045 } 1046 if (!cpp_demangle_push_subst_v(ddata, 1047 &subst_v)) { 1048 free(buf); 1049 goto clean; 1050 } 1051 } 1052 free(buf); 1053 ++e_idx; 1054 break; 1055 } 1056 --idx; 1057 } 1058 1059 rtn = 1; 1060 clean: 1061 if (type_str != NULL) 1062 vector_str_dest(&subst_v); 1063 1064 return (rtn); 1065 } 1066 1067 static int 1068 cpp_demangle_get_subst(struct cpp_demangle_data *ddata, size_t idx) 1069 { 1070 size_t len; 1071 1072 if (ddata == NULL || ddata->subst.size <= idx) 1073 return (0); 1074 if ((len = strlen(ddata->subst.container[idx])) == 0) 1075 return (0); 1076 if (!cpp_demangle_push_str(ddata, ddata->subst.container[idx], len)) 1077 return (0); 1078 1079 /* skip '_' */ 1080 ++ddata->cur; 1081 1082 return (1); 1083 } 1084 1085 static int 1086 cpp_demangle_get_tmpl_param(struct cpp_demangle_data *ddata, size_t idx) 1087 { 1088 size_t len; 1089 1090 if (ddata == NULL || ddata->tmpl.size <= idx) 1091 return (0); 1092 if ((len = strlen(ddata->tmpl.container[idx])) == 0) 1093 return (0); 1094 if (!cpp_demangle_push_str(ddata, ddata->tmpl.container[idx], len)) 1095 return (0); 1096 1097 ++ddata->cur; 1098 1099 return (1); 1100 } 1101 1102 static int 1103 cpp_demangle_read_array(struct cpp_demangle_data *ddata) 1104 { 1105 size_t i, num_len, exp_len, p_idx, idx; 1106 const char *num; 1107 char *exp; 1108 1109 if (ddata == NULL || *(++ddata->cur) == '\0') 1110 return (0); 1111 1112 if (*ddata->cur == '_') { 1113 if (*(++ddata->cur) == '\0') 1114 return (0); 1115 1116 if (!cpp_demangle_read_type(ddata, NULL)) 1117 return (0); 1118 1119 if (!DEM_PUSH_STR(ddata, " []")) 1120 return (0); 1121 } else { 1122 if (ELFTC_ISDIGIT(*ddata->cur) != 0) { 1123 num = ddata->cur; 1124 while (ELFTC_ISDIGIT(*ddata->cur) != 0) 1125 ++ddata->cur; 1126 if (*ddata->cur != '_') 1127 return (0); 1128 num_len = ddata->cur - num; 1129 assert(num_len > 0); 1130 if (*(++ddata->cur) == '\0') 1131 return (0); 1132 if (!cpp_demangle_read_type(ddata, NULL)) 1133 return (0); 1134 if (!DEM_PUSH_STR(ddata, " [")) 1135 return (0); 1136 if (!cpp_demangle_push_str(ddata, num, num_len)) 1137 return (0); 1138 if (!DEM_PUSH_STR(ddata, "]")) 1139 return (0); 1140 } else { 1141 p_idx = ddata->output.size; 1142 if (!cpp_demangle_read_expression(ddata)) 1143 return (0); 1144 if ((exp = vector_str_substr(&ddata->output, p_idx, 1145 ddata->output.size - 1, &exp_len)) == NULL) 1146 return (0); 1147 idx = ddata->output.size; 1148 for (i = p_idx; i < idx; ++i) 1149 if (!vector_str_pop(&ddata->output)) { 1150 free(exp); 1151 return (0); 1152 } 1153 if (*ddata->cur != '_') { 1154 free(exp); 1155 return (0); 1156 } 1157 ++ddata->cur; 1158 if (*ddata->cur == '\0') { 1159 free(exp); 1160 return (0); 1161 } 1162 if (!cpp_demangle_read_type(ddata, NULL)) { 1163 free(exp); 1164 return (0); 1165 } 1166 if (!DEM_PUSH_STR(ddata, " [")) { 1167 free(exp); 1168 return (0); 1169 } 1170 if (!cpp_demangle_push_str(ddata, exp, exp_len)) { 1171 free(exp); 1172 return (0); 1173 } 1174 if (!DEM_PUSH_STR(ddata, "]")) { 1175 free(exp); 1176 return (0); 1177 } 1178 free(exp); 1179 } 1180 } 1181 1182 return (1); 1183 } 1184 1185 static int 1186 cpp_demangle_read_expr_primary(struct cpp_demangle_data *ddata) 1187 { 1188 const char *num; 1189 1190 if (ddata == NULL || *(++ddata->cur) == '\0') 1191 return (0); 1192 1193 if (*ddata->cur == '_' && *(ddata->cur + 1) == 'Z') { 1194 ddata->cur += 2; 1195 if (*ddata->cur == '\0') 1196 return (0); 1197 if (!cpp_demangle_read_encoding(ddata)) 1198 return (0); 1199 ++ddata->cur; 1200 return (1); 1201 } 1202 1203 switch (*ddata->cur) { 1204 case 'b': 1205 if (*(ddata->cur + 2) != 'E') 1206 return (0); 1207 switch (*(++ddata->cur)) { 1208 case '0': 1209 ddata->cur += 2; 1210 return (DEM_PUSH_STR(ddata, "false")); 1211 case '1': 1212 ddata->cur += 2; 1213 return (DEM_PUSH_STR(ddata, "true")); 1214 default: 1215 return (0); 1216 } 1217 1218 case 'd': 1219 ++ddata->cur; 1220 return (cpp_demangle_push_fp(ddata, decode_fp_to_double)); 1221 1222 case 'e': 1223 ++ddata->cur; 1224 if (sizeof(long double) == 10) 1225 return (cpp_demangle_push_fp(ddata, 1226 decode_fp_to_double)); 1227 return (cpp_demangle_push_fp(ddata, decode_fp_to_float80)); 1228 1229 case 'f': 1230 ++ddata->cur; 1231 return (cpp_demangle_push_fp(ddata, decode_fp_to_float)); 1232 1233 case 'g': 1234 ++ddata->cur; 1235 if (sizeof(long double) == 16) 1236 return (cpp_demangle_push_fp(ddata, 1237 decode_fp_to_double)); 1238 return (cpp_demangle_push_fp(ddata, decode_fp_to_float128)); 1239 1240 case 'i': 1241 case 'j': 1242 case 'l': 1243 case 'm': 1244 case 'n': 1245 case 's': 1246 case 't': 1247 case 'x': 1248 case 'y': 1249 if (*(++ddata->cur) == 'n') { 1250 if (!DEM_PUSH_STR(ddata, "-")) 1251 return (0); 1252 ++ddata->cur; 1253 } 1254 num = ddata->cur; 1255 while (*ddata->cur != 'E') { 1256 if (!ELFTC_ISDIGIT(*ddata->cur)) 1257 return (0); 1258 ++ddata->cur; 1259 } 1260 ++ddata->cur; 1261 return (cpp_demangle_push_str(ddata, num, 1262 ddata->cur - num - 1)); 1263 1264 default: 1265 return (0); 1266 } 1267 } 1268 1269 static int 1270 cpp_demangle_read_expression(struct cpp_demangle_data *ddata) 1271 { 1272 1273 if (ddata == NULL || *ddata->cur == '\0') 1274 return (0); 1275 1276 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) { 1277 case SIMPLE_HASH('s', 't'): 1278 ddata->cur += 2; 1279 return (cpp_demangle_read_type(ddata, NULL)); 1280 1281 case SIMPLE_HASH('s', 'r'): 1282 ddata->cur += 2; 1283 if (!cpp_demangle_read_type(ddata, NULL)) 1284 return (0); 1285 if (!cpp_demangle_read_uqname(ddata)) 1286 return (0); 1287 if (*ddata->cur == 'I') 1288 return (cpp_demangle_read_tmpl_args(ddata)); 1289 return (1); 1290 1291 case SIMPLE_HASH('a', 'a'): 1292 /* operator && */ 1293 ddata->cur += 2; 1294 return (cpp_demangle_read_expression_binary(ddata, "&&", 2)); 1295 1296 case SIMPLE_HASH('a', 'd'): 1297 /* operator & (unary) */ 1298 ddata->cur += 2; 1299 return (cpp_demangle_read_expression_unary(ddata, "&", 1)); 1300 1301 case SIMPLE_HASH('a', 'n'): 1302 /* operator & */ 1303 ddata->cur += 2; 1304 return (cpp_demangle_read_expression_binary(ddata, "&", 1)); 1305 1306 case SIMPLE_HASH('a', 'N'): 1307 /* operator &= */ 1308 ddata->cur += 2; 1309 return (cpp_demangle_read_expression_binary(ddata, "&=", 2)); 1310 1311 case SIMPLE_HASH('a', 'S'): 1312 /* operator = */ 1313 ddata->cur += 2; 1314 return (cpp_demangle_read_expression_binary(ddata, "=", 1)); 1315 1316 case SIMPLE_HASH('c', 'l'): 1317 /* operator () */ 1318 ddata->cur += 2; 1319 return (cpp_demangle_read_expression_binary(ddata, "()", 2)); 1320 1321 case SIMPLE_HASH('c', 'm'): 1322 /* operator , */ 1323 ddata->cur += 2; 1324 return (cpp_demangle_read_expression_binary(ddata, ",", 1)); 1325 1326 case SIMPLE_HASH('c', 'o'): 1327 /* operator ~ */ 1328 ddata->cur += 2; 1329 return (cpp_demangle_read_expression_binary(ddata, "~", 1)); 1330 1331 case SIMPLE_HASH('c', 'v'): 1332 /* operator (cast) */ 1333 ddata->cur += 2; 1334 return (cpp_demangle_read_expression_binary(ddata, "(cast)", 6)); 1335 1336 case SIMPLE_HASH('d', 'a'): 1337 /* operator delete [] */ 1338 ddata->cur += 2; 1339 return (cpp_demangle_read_expression_unary(ddata, "delete []", 9)); 1340 1341 case SIMPLE_HASH('d', 'e'): 1342 /* operator * (unary) */ 1343 ddata->cur += 2; 1344 return (cpp_demangle_read_expression_unary(ddata, "*", 1)); 1345 1346 case SIMPLE_HASH('d', 'l'): 1347 /* operator delete */ 1348 ddata->cur += 2; 1349 return (cpp_demangle_read_expression_unary(ddata, "delete", 6)); 1350 1351 case SIMPLE_HASH('d', 'v'): 1352 /* operator / */ 1353 ddata->cur += 2; 1354 return (cpp_demangle_read_expression_binary(ddata, "/", 1)); 1355 1356 case SIMPLE_HASH('d', 'V'): 1357 /* operator /= */ 1358 ddata->cur += 2; 1359 return (cpp_demangle_read_expression_binary(ddata, "/=", 2)); 1360 1361 case SIMPLE_HASH('e', 'o'): 1362 /* operator ^ */ 1363 ddata->cur += 2; 1364 return (cpp_demangle_read_expression_binary(ddata, "^", 1)); 1365 1366 case SIMPLE_HASH('e', 'O'): 1367 /* operator ^= */ 1368 ddata->cur += 2; 1369 return (cpp_demangle_read_expression_binary(ddata, "^=", 2)); 1370 1371 case SIMPLE_HASH('e', 'q'): 1372 /* operator == */ 1373 ddata->cur += 2; 1374 return (cpp_demangle_read_expression_binary(ddata, "==", 2)); 1375 1376 case SIMPLE_HASH('g', 'e'): 1377 /* operator >= */ 1378 ddata->cur += 2; 1379 return (cpp_demangle_read_expression_binary(ddata, ">=", 2)); 1380 1381 case SIMPLE_HASH('g', 't'): 1382 /* operator > */ 1383 ddata->cur += 2; 1384 return (cpp_demangle_read_expression_binary(ddata, ">", 1)); 1385 1386 case SIMPLE_HASH('i', 'x'): 1387 /* operator [] */ 1388 ddata->cur += 2; 1389 return (cpp_demangle_read_expression_binary(ddata, "[]", 2)); 1390 1391 case SIMPLE_HASH('l', 'e'): 1392 /* operator <= */ 1393 ddata->cur += 2; 1394 return (cpp_demangle_read_expression_binary(ddata, "<=", 2)); 1395 1396 case SIMPLE_HASH('l', 's'): 1397 /* operator << */ 1398 ddata->cur += 2; 1399 return (cpp_demangle_read_expression_binary(ddata, "<<", 2)); 1400 1401 case SIMPLE_HASH('l', 'S'): 1402 /* operator <<= */ 1403 ddata->cur += 2; 1404 return (cpp_demangle_read_expression_binary(ddata, "<<=", 3)); 1405 1406 case SIMPLE_HASH('l', 't'): 1407 /* operator < */ 1408 ddata->cur += 2; 1409 return (cpp_demangle_read_expression_binary(ddata, "<", 1)); 1410 1411 case SIMPLE_HASH('m', 'i'): 1412 /* operator - */ 1413 ddata->cur += 2; 1414 return (cpp_demangle_read_expression_binary(ddata, "-", 1)); 1415 1416 case SIMPLE_HASH('m', 'I'): 1417 /* operator -= */ 1418 ddata->cur += 2; 1419 return (cpp_demangle_read_expression_binary(ddata, "-=", 2)); 1420 1421 case SIMPLE_HASH('m', 'l'): 1422 /* operator * */ 1423 ddata->cur += 2; 1424 return (cpp_demangle_read_expression_binary(ddata, "*", 1)); 1425 1426 case SIMPLE_HASH('m', 'L'): 1427 /* operator *= */ 1428 ddata->cur += 2; 1429 return (cpp_demangle_read_expression_binary(ddata, "*=", 2)); 1430 1431 case SIMPLE_HASH('m', 'm'): 1432 /* operator -- */ 1433 ddata->cur += 2; 1434 return (cpp_demangle_read_expression_binary(ddata, "--", 2)); 1435 1436 case SIMPLE_HASH('n', 'a'): 1437 /* operator new[] */ 1438 ddata->cur += 2; 1439 return (cpp_demangle_read_expression_unary(ddata, "new []", 6)); 1440 1441 case SIMPLE_HASH('n', 'e'): 1442 /* operator != */ 1443 ddata->cur += 2; 1444 return (cpp_demangle_read_expression_binary(ddata, "!=", 2)); 1445 1446 case SIMPLE_HASH('n', 'g'): 1447 /* operator - (unary) */ 1448 ddata->cur += 2; 1449 return (cpp_demangle_read_expression_unary(ddata, "-", 1)); 1450 1451 case SIMPLE_HASH('n', 't'): 1452 /* operator ! */ 1453 ddata->cur += 2; 1454 return (cpp_demangle_read_expression_binary(ddata, "!", 1)); 1455 1456 case SIMPLE_HASH('n', 'w'): 1457 /* operator new */ 1458 ddata->cur += 2; 1459 return (cpp_demangle_read_expression_unary(ddata, "new", 3)); 1460 1461 case SIMPLE_HASH('o', 'o'): 1462 /* operator || */ 1463 ddata->cur += 2; 1464 return (cpp_demangle_read_expression_binary(ddata, "||", 2)); 1465 1466 case SIMPLE_HASH('o', 'r'): 1467 /* operator | */ 1468 ddata->cur += 2; 1469 return (cpp_demangle_read_expression_binary(ddata, "|", 1)); 1470 1471 case SIMPLE_HASH('o', 'R'): 1472 /* operator |= */ 1473 ddata->cur += 2; 1474 return (cpp_demangle_read_expression_binary(ddata, "|=", 2)); 1475 1476 case SIMPLE_HASH('p', 'l'): 1477 /* operator + */ 1478 ddata->cur += 2; 1479 return (cpp_demangle_read_expression_binary(ddata, "+", 1)); 1480 1481 case SIMPLE_HASH('p', 'L'): 1482 /* operator += */ 1483 ddata->cur += 2; 1484 return (cpp_demangle_read_expression_binary(ddata, "+=", 2)); 1485 1486 case SIMPLE_HASH('p', 'm'): 1487 /* operator ->* */ 1488 ddata->cur += 2; 1489 return (cpp_demangle_read_expression_binary(ddata, "->*", 3)); 1490 1491 case SIMPLE_HASH('p', 'p'): 1492 /* operator ++ */ 1493 ddata->cur += 2; 1494 return (cpp_demangle_read_expression_binary(ddata, "++", 2)); 1495 1496 case SIMPLE_HASH('p', 's'): 1497 /* operator + (unary) */ 1498 ddata->cur += 2; 1499 return (cpp_demangle_read_expression_unary(ddata, "+", 1)); 1500 1501 case SIMPLE_HASH('p', 't'): 1502 /* operator -> */ 1503 ddata->cur += 2; 1504 return (cpp_demangle_read_expression_binary(ddata, "->", 2)); 1505 1506 case SIMPLE_HASH('q', 'u'): 1507 /* operator ? */ 1508 ddata->cur += 2; 1509 return (cpp_demangle_read_expression_trinary(ddata, "?", 1, 1510 ":", 1)); 1511 1512 case SIMPLE_HASH('r', 'm'): 1513 /* operator % */ 1514 ddata->cur += 2; 1515 return (cpp_demangle_read_expression_binary(ddata, "%", 1)); 1516 1517 case SIMPLE_HASH('r', 'M'): 1518 /* operator %= */ 1519 ddata->cur += 2; 1520 return (cpp_demangle_read_expression_binary(ddata, "%=", 2)); 1521 1522 case SIMPLE_HASH('r', 's'): 1523 /* operator >> */ 1524 ddata->cur += 2; 1525 return (cpp_demangle_read_expression_binary(ddata, ">>", 2)); 1526 1527 case SIMPLE_HASH('r', 'S'): 1528 /* operator >>= */ 1529 ddata->cur += 2; 1530 return (cpp_demangle_read_expression_binary(ddata, ">>=", 3)); 1531 1532 case SIMPLE_HASH('r', 'z'): 1533 /* operator sizeof */ 1534 ddata->cur += 2; 1535 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6)); 1536 1537 case SIMPLE_HASH('s', 'v'): 1538 /* operator sizeof */ 1539 ddata->cur += 2; 1540 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6)); 1541 } 1542 1543 switch (*ddata->cur) { 1544 case 'L': 1545 return (cpp_demangle_read_expr_primary(ddata)); 1546 case 'T': 1547 return (cpp_demangle_read_tmpl_param(ddata)); 1548 } 1549 1550 return (0); 1551 } 1552 1553 static int 1554 cpp_demangle_read_expression_flat(struct cpp_demangle_data *ddata, char **str) 1555 { 1556 struct vector_str *output; 1557 size_t i, p_idx, idx, exp_len; 1558 char *exp; 1559 1560 output = &ddata->output; 1561 1562 p_idx = output->size; 1563 1564 if (!cpp_demangle_read_expression(ddata)) 1565 return (0); 1566 1567 if ((exp = vector_str_substr(output, p_idx, output->size - 1, 1568 &exp_len)) == NULL) 1569 return (0); 1570 1571 idx = output->size; 1572 for (i = p_idx; i < idx; ++i) { 1573 if (!vector_str_pop(output)) { 1574 free(exp); 1575 return (0); 1576 } 1577 } 1578 1579 *str = exp; 1580 1581 return (1); 1582 } 1583 1584 static int 1585 cpp_demangle_read_expression_binary(struct cpp_demangle_data *ddata, 1586 const char *name, size_t len) 1587 { 1588 1589 if (ddata == NULL || name == NULL || len == 0) 1590 return (0); 1591 if (!cpp_demangle_read_expression(ddata)) 1592 return (0); 1593 if (!cpp_demangle_push_str(ddata, name, len)) 1594 return (0); 1595 1596 return (cpp_demangle_read_expression(ddata)); 1597 } 1598 1599 static int 1600 cpp_demangle_read_expression_unary(struct cpp_demangle_data *ddata, 1601 const char *name, size_t len) 1602 { 1603 1604 if (ddata == NULL || name == NULL || len == 0) 1605 return (0); 1606 if (!cpp_demangle_read_expression(ddata)) 1607 return (0); 1608 1609 return (cpp_demangle_push_str(ddata, name, len)); 1610 } 1611 1612 static int 1613 cpp_demangle_read_expression_trinary(struct cpp_demangle_data *ddata, 1614 const char *name1, size_t len1, const char *name2, size_t len2) 1615 { 1616 1617 if (ddata == NULL || name1 == NULL || len1 == 0 || name2 == NULL || 1618 len2 == 0) 1619 return (0); 1620 1621 if (!cpp_demangle_read_expression(ddata)) 1622 return (0); 1623 if (!cpp_demangle_push_str(ddata, name1, len1)) 1624 return (0); 1625 if (!cpp_demangle_read_expression(ddata)) 1626 return (0); 1627 if (!cpp_demangle_push_str(ddata, name2, len2)) 1628 return (0); 1629 1630 return (cpp_demangle_read_expression(ddata)); 1631 } 1632 1633 static int 1634 cpp_demangle_read_function(struct cpp_demangle_data *ddata, int *ext_c, 1635 struct vector_type_qualifier *v) 1636 { 1637 struct type_delimit td; 1638 struct read_cmd_item *rc; 1639 size_t class_type_size, class_type_len, limit; 1640 const char *class_type; 1641 int i; 1642 bool paren, non_cv_qualifier; 1643 1644 if (ddata == NULL || *ddata->cur != 'F' || v == NULL) 1645 return (0); 1646 1647 ++ddata->cur; 1648 if (*ddata->cur == 'Y') { 1649 if (ext_c != NULL) 1650 *ext_c = 1; 1651 ++ddata->cur; 1652 } 1653 1654 /* Return type */ 1655 if (!cpp_demangle_read_type(ddata, NULL)) 1656 return (0); 1657 1658 if (*ddata->cur != 'E') { 1659 if (!DEM_PUSH_STR(ddata, " ")) 1660 return (0); 1661 1662 non_cv_qualifier = false; 1663 if (v->size > 0) { 1664 for (i = 0; (size_t) i < v->size; i++) { 1665 if (v->q_container[i] != TYPE_RST && 1666 v->q_container[i] != TYPE_VAT && 1667 v->q_container[i] != TYPE_CST) { 1668 non_cv_qualifier = true; 1669 break; 1670 } 1671 } 1672 } 1673 1674 paren = false; 1675 rc = vector_read_cmd_find(&ddata->cmd, READ_PTRMEM); 1676 if (non_cv_qualifier || rc != NULL) { 1677 if (!DEM_PUSH_STR(ddata, "(")) 1678 return (0); 1679 paren = true; 1680 } 1681 1682 /* Push non-cv qualifiers. */ 1683 ddata->push_qualifier = PUSH_NON_CV_QUALIFIER; 1684 if (!cpp_demangle_push_type_qualifier(ddata, v, NULL)) 1685 return (0); 1686 1687 if (rc) { 1688 if (non_cv_qualifier && !DEM_PUSH_STR(ddata, " ")) 1689 return (0); 1690 if ((class_type_size = ddata->class_type.size) == 0) 1691 return (0); 1692 class_type = 1693 ddata->class_type.container[class_type_size - 1]; 1694 if (class_type == NULL) 1695 return (0); 1696 if ((class_type_len = strlen(class_type)) == 0) 1697 return (0); 1698 if (!cpp_demangle_push_str(ddata, class_type, 1699 class_type_len)) 1700 return (0); 1701 if (!DEM_PUSH_STR(ddata, "::*")) 1702 return (0); 1703 /* Push pointer-to-member qualifiers. */ 1704 ddata->push_qualifier = PUSH_ALL_QUALIFIER; 1705 if (!cpp_demangle_push_type_qualifier(ddata, rc->data, 1706 NULL)) 1707 return (0); 1708 ++ddata->func_type; 1709 } 1710 1711 if (paren) { 1712 if (!DEM_PUSH_STR(ddata, ")")) 1713 return (0); 1714 paren = false; 1715 } 1716 1717 td.paren = false; 1718 td.firstp = true; 1719 limit = 0; 1720 ddata->is_functype = true; 1721 for (;;) { 1722 if (!cpp_demangle_read_type(ddata, &td)) 1723 return (0); 1724 if (*ddata->cur == 'E') 1725 break; 1726 if (limit++ > CPP_DEMANGLE_TRY_LIMIT) 1727 return (0); 1728 } 1729 ddata->is_functype = false; 1730 if (td.paren) { 1731 if (!DEM_PUSH_STR(ddata, ")")) 1732 return (0); 1733 td.paren = false; 1734 } 1735 1736 /* Push CV qualifiers. */ 1737 ddata->push_qualifier = PUSH_CV_QUALIFIER; 1738 if (!cpp_demangle_push_type_qualifier(ddata, v, NULL)) 1739 return (0); 1740 1741 ddata->push_qualifier = PUSH_ALL_QUALIFIER; 1742 1743 /* Release type qualifier vector. */ 1744 vector_type_qualifier_dest(v); 1745 if (!vector_type_qualifier_init(v)) 1746 return (0); 1747 1748 /* Push ref-qualifiers. */ 1749 if (ddata->ref_qualifier) { 1750 switch (ddata->ref_qualifier_type) { 1751 case TYPE_REF: 1752 if (!DEM_PUSH_STR(ddata, " &")) 1753 return (0); 1754 break; 1755 case TYPE_RREF: 1756 if (!DEM_PUSH_STR(ddata, " &&")) 1757 return (0); 1758 break; 1759 default: 1760 return (0); 1761 } 1762 ddata->ref_qualifier = false; 1763 } 1764 } 1765 1766 ++ddata->cur; 1767 1768 return (1); 1769 } 1770 1771 /* read encoding, encoding are function name, data name, special-name */ 1772 static int 1773 cpp_demangle_read_encoding(struct cpp_demangle_data *ddata) 1774 { 1775 char *name, *type, *num_str; 1776 long offset; 1777 int rtn; 1778 1779 if (ddata == NULL || *ddata->cur == '\0') 1780 return (0); 1781 1782 /* special name */ 1783 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) { 1784 case SIMPLE_HASH('G', 'A'): 1785 if (!DEM_PUSH_STR(ddata, "hidden alias for ")) 1786 return (0); 1787 ddata->cur += 2; 1788 if (*ddata->cur == '\0') 1789 return (0); 1790 return (cpp_demangle_read_encoding(ddata)); 1791 1792 case SIMPLE_HASH('G', 'R'): 1793 if (!DEM_PUSH_STR(ddata, "reference temporary #")) 1794 return (0); 1795 ddata->cur += 2; 1796 if (*ddata->cur == '\0') 1797 return (0); 1798 if (!cpp_demangle_read_name_flat(ddata, &name)) 1799 return (0); 1800 rtn = 0; 1801 if (!cpp_demangle_read_number_as_string(ddata, &num_str)) 1802 goto clean1; 1803 if (!DEM_PUSH_STR(ddata, num_str)) 1804 goto clean2; 1805 if (!DEM_PUSH_STR(ddata, " for ")) 1806 goto clean2; 1807 if (!DEM_PUSH_STR(ddata, name)) 1808 goto clean2; 1809 rtn = 1; 1810 clean2: 1811 free(num_str); 1812 clean1: 1813 free(name); 1814 return (rtn); 1815 1816 case SIMPLE_HASH('G', 'T'): 1817 ddata->cur += 2; 1818 if (*ddata->cur == '\0') 1819 return (0); 1820 switch (*ddata->cur) { 1821 case 'n': 1822 if (!DEM_PUSH_STR(ddata, "non-transaction clone for ")) 1823 return (0); 1824 break; 1825 case 't': 1826 default: 1827 if (!DEM_PUSH_STR(ddata, "transaction clone for ")) 1828 return (0); 1829 break; 1830 } 1831 ++ddata->cur; 1832 return (cpp_demangle_read_encoding(ddata)); 1833 1834 case SIMPLE_HASH('G', 'V'): 1835 /* sentry object for 1 time init */ 1836 if (!DEM_PUSH_STR(ddata, "guard variable for ")) 1837 return (0); 1838 ddata->cur += 2; 1839 break; 1840 1841 case SIMPLE_HASH('T', 'c'): 1842 /* virtual function covariant override thunk */ 1843 if (!DEM_PUSH_STR(ddata, 1844 "virtual function covariant override ")) 1845 return (0); 1846 ddata->cur += 2; 1847 if (*ddata->cur == '\0') 1848 return (0); 1849 if (!cpp_demangle_read_offset(ddata)) 1850 return (0); 1851 if (!cpp_demangle_read_offset(ddata)) 1852 return (0); 1853 return (cpp_demangle_read_encoding(ddata)); 1854 1855 case SIMPLE_HASH('T', 'C'): 1856 /* construction vtable */ 1857 if (!DEM_PUSH_STR(ddata, "construction vtable for ")) 1858 return (0); 1859 ddata->cur += 2; 1860 if (*ddata->cur == '\0') 1861 return (0); 1862 if (!cpp_demangle_read_type_flat(ddata, &type)) 1863 return (0); 1864 rtn = 0; 1865 if (!cpp_demangle_read_number(ddata, &offset)) 1866 goto clean3; 1867 if (*ddata->cur++ != '_') 1868 goto clean3; 1869 if (!cpp_demangle_read_type(ddata, NULL)) 1870 goto clean3; 1871 if (!DEM_PUSH_STR(ddata, "-in-")) 1872 goto clean3; 1873 if (!DEM_PUSH_STR(ddata, type)) 1874 goto clean3; 1875 rtn = 1; 1876 clean3: 1877 free(type); 1878 return (rtn); 1879 1880 case SIMPLE_HASH('T', 'D'): 1881 /* typeinfo common proxy */ 1882 break; 1883 1884 case SIMPLE_HASH('T', 'F'): 1885 /* typeinfo fn */ 1886 if (!DEM_PUSH_STR(ddata, "typeinfo fn for ")) 1887 return (0); 1888 ddata->cur += 2; 1889 if (*ddata->cur == '\0') 1890 return (0); 1891 return (cpp_demangle_read_type(ddata, NULL)); 1892 1893 case SIMPLE_HASH('T', 'h'): 1894 /* virtual function non-virtual override thunk */ 1895 if (!DEM_PUSH_STR(ddata, 1896 "virtual function non-virtual override ")) 1897 return (0); 1898 ddata->cur += 2; 1899 if (*ddata->cur == '\0') 1900 return (0); 1901 if (!cpp_demangle_read_nv_offset(ddata)) 1902 return (0); 1903 return (cpp_demangle_read_encoding(ddata)); 1904 1905 case SIMPLE_HASH('T', 'H'): 1906 /* TLS init function */ 1907 if (!DEM_PUSH_STR(ddata, "TLS init function for ")) 1908 return (0); 1909 ddata->cur += 2; 1910 if (*ddata->cur == '\0') 1911 return (0); 1912 break; 1913 1914 case SIMPLE_HASH('T', 'I'): 1915 /* typeinfo structure */ 1916 if (!DEM_PUSH_STR(ddata, "typeinfo for ")) 1917 return (0); 1918 ddata->cur += 2; 1919 if (*ddata->cur == '\0') 1920 return (0); 1921 return (cpp_demangle_read_type(ddata, NULL)); 1922 1923 case SIMPLE_HASH('T', 'J'): 1924 /* java class */ 1925 if (!DEM_PUSH_STR(ddata, "java Class for ")) 1926 return (0); 1927 ddata->cur += 2; 1928 if (*ddata->cur == '\0') 1929 return (0); 1930 return (cpp_demangle_read_type(ddata, NULL)); 1931 1932 case SIMPLE_HASH('T', 'S'): 1933 /* RTTI name (NTBS) */ 1934 if (!DEM_PUSH_STR(ddata, "typeinfo name for ")) 1935 return (0); 1936 ddata->cur += 2; 1937 if (*ddata->cur == '\0') 1938 return (0); 1939 return (cpp_demangle_read_type(ddata, NULL)); 1940 1941 case SIMPLE_HASH('T', 'T'): 1942 /* VTT table */ 1943 if (!DEM_PUSH_STR(ddata, "VTT for ")) 1944 return (0); 1945 ddata->cur += 2; 1946 if (*ddata->cur == '\0') 1947 return (0); 1948 return (cpp_demangle_read_type(ddata, NULL)); 1949 1950 case SIMPLE_HASH('T', 'v'): 1951 /* virtual function virtual override thunk */ 1952 if (!DEM_PUSH_STR(ddata, "virtual function virtual override ")) 1953 return (0); 1954 ddata->cur += 2; 1955 if (*ddata->cur == '\0') 1956 return (0); 1957 if (!cpp_demangle_read_v_offset(ddata)) 1958 return (0); 1959 return (cpp_demangle_read_encoding(ddata)); 1960 1961 case SIMPLE_HASH('T', 'V'): 1962 /* virtual table */ 1963 if (!DEM_PUSH_STR(ddata, "vtable for ")) 1964 return (0); 1965 ddata->cur += 2; 1966 if (*ddata->cur == '\0') 1967 return (0); 1968 return (cpp_demangle_read_type(ddata, NULL)); 1969 1970 case SIMPLE_HASH('T', 'W'): 1971 /* TLS wrapper function */ 1972 if (!DEM_PUSH_STR(ddata, "TLS wrapper function for ")) 1973 return (0); 1974 ddata->cur += 2; 1975 if (*ddata->cur == '\0') 1976 return (0); 1977 break; 1978 } 1979 1980 return (cpp_demangle_read_name(ddata)); 1981 } 1982 1983 static int 1984 cpp_demangle_read_local_name(struct cpp_demangle_data *ddata) 1985 { 1986 struct vector_str local_name; 1987 struct type_delimit td; 1988 size_t limit; 1989 bool more_type; 1990 1991 if (ddata == NULL) 1992 return (0); 1993 if (*(++ddata->cur) == '\0') 1994 return (0); 1995 1996 if (!vector_str_init(&local_name)) 1997 return (0); 1998 ddata->cur_output = &local_name; 1999 2000 if (!cpp_demangle_read_encoding(ddata)) { 2001 vector_str_dest(&local_name); 2002 return (0); 2003 } 2004 2005 ddata->cur_output = &ddata->output; 2006 2007 td.paren = false; 2008 td.firstp = true; 2009 more_type = false; 2010 limit = 0; 2011 2012 /* 2013 * The first type is a return type if we just demangled template 2014 * args. (the template args is right next to the function name, 2015 * which means it's a template function) 2016 */ 2017 if (ddata->is_tmpl) { 2018 ddata->is_tmpl = false; 2019 2020 /* Read return type */ 2021 if (!cpp_demangle_read_type(ddata, NULL)) { 2022 vector_str_dest(&local_name); 2023 return (0); 2024 } 2025 2026 more_type = true; 2027 } 2028 2029 /* Now we can push the name after possible return type is handled. */ 2030 if (!vector_str_push_vector(&ddata->output, &local_name)) { 2031 vector_str_dest(&local_name); 2032 return (0); 2033 } 2034 vector_str_dest(&local_name); 2035 2036 while (*ddata->cur != '\0') { 2037 if (!cpp_demangle_read_type(ddata, &td)) 2038 return (0); 2039 if (more_type) 2040 more_type = false; 2041 if (*ddata->cur == 'E') 2042 break; 2043 if (limit++ > CPP_DEMANGLE_TRY_LIMIT) 2044 return (0); 2045 } 2046 if (more_type) 2047 return (0); 2048 2049 if (*(++ddata->cur) == '\0') 2050 return (0); 2051 if (td.paren == true) { 2052 if (!DEM_PUSH_STR(ddata, ")")) 2053 return (0); 2054 td.paren = false; 2055 } 2056 if (*ddata->cur == 's') 2057 ++ddata->cur; 2058 else { 2059 if (!DEM_PUSH_STR(ddata, "::")) 2060 return (0); 2061 if (!cpp_demangle_read_name(ddata)) 2062 return (0); 2063 } 2064 if (*ddata->cur == '_') { 2065 ++ddata->cur; 2066 while (ELFTC_ISDIGIT(*ddata->cur) != 0) 2067 ++ddata->cur; 2068 } 2069 2070 return (1); 2071 } 2072 2073 static int 2074 cpp_demangle_read_name(struct cpp_demangle_data *ddata) 2075 { 2076 struct vector_str *output, v; 2077 size_t p_idx, subst_str_len; 2078 int rtn; 2079 char *subst_str; 2080 2081 if (ddata == NULL || *ddata->cur == '\0') 2082 return (0); 2083 2084 output = ddata->cur_output; 2085 2086 subst_str = NULL; 2087 2088 switch (*ddata->cur) { 2089 case 'S': 2090 return (cpp_demangle_read_subst(ddata)); 2091 case 'N': 2092 return (cpp_demangle_read_nested_name(ddata)); 2093 case 'Z': 2094 return (cpp_demangle_read_local_name(ddata)); 2095 } 2096 2097 if (!vector_str_init(&v)) 2098 return (0); 2099 2100 p_idx = output->size; 2101 rtn = 0; 2102 if (!cpp_demangle_read_uqname(ddata)) 2103 goto clean; 2104 if ((subst_str = vector_str_substr(output, p_idx, output->size - 1, 2105 &subst_str_len)) == NULL) 2106 goto clean; 2107 if (subst_str_len > 8 && strstr(subst_str, "operator") != NULL) { 2108 rtn = 1; 2109 goto clean; 2110 } 2111 if (!vector_str_push(&v, subst_str, subst_str_len)) 2112 goto clean; 2113 if (!cpp_demangle_push_subst_v(ddata, &v)) 2114 goto clean; 2115 2116 if (*ddata->cur == 'I') { 2117 p_idx = output->size; 2118 if (!cpp_demangle_read_tmpl_args(ddata)) 2119 goto clean; 2120 free(subst_str); 2121 if ((subst_str = vector_str_substr(output, p_idx, 2122 output->size - 1, &subst_str_len)) == NULL) 2123 goto clean; 2124 if (!vector_str_push(&v, subst_str, subst_str_len)) 2125 goto clean; 2126 if (!cpp_demangle_push_subst_v(ddata, &v)) 2127 goto clean; 2128 } 2129 2130 rtn = 1; 2131 2132 clean: 2133 free(subst_str); 2134 vector_str_dest(&v); 2135 2136 return (rtn); 2137 } 2138 2139 static int 2140 cpp_demangle_read_name_flat(struct cpp_demangle_data *ddata, char **str) 2141 { 2142 struct vector_str *output; 2143 size_t i, p_idx, idx, name_len; 2144 char *name; 2145 2146 output = ddata->cur_output; 2147 2148 p_idx = output->size; 2149 2150 if (!cpp_demangle_read_name(ddata)) 2151 return (0); 2152 2153 if ((name = vector_str_substr(output, p_idx, output->size - 1, 2154 &name_len)) == NULL) 2155 return (0); 2156 2157 idx = output->size; 2158 for (i = p_idx; i < idx; ++i) { 2159 if (!vector_str_pop(output)) { 2160 free(name); 2161 return (0); 2162 } 2163 } 2164 2165 *str = name; 2166 2167 return (1); 2168 } 2169 2170 static int 2171 cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata) 2172 { 2173 struct vector_str *output, v; 2174 size_t limit, p_idx, subst_str_len; 2175 int rtn; 2176 char *subst_str; 2177 2178 if (ddata == NULL || *ddata->cur != 'N') 2179 return (0); 2180 if (*(++ddata->cur) == '\0') 2181 return (0); 2182 2183 do { 2184 switch (*ddata->cur) { 2185 case 'r': 2186 ddata->mem_rst = true; 2187 break; 2188 case 'V': 2189 ddata->mem_vat = true; 2190 break; 2191 case 'K': 2192 ddata->mem_cst = true; 2193 break; 2194 case 'R': 2195 ddata->mem_ref = true; 2196 break; 2197 case 'O': 2198 ddata->mem_rref = true; 2199 break; 2200 default: 2201 goto next; 2202 } 2203 } while (*(++ddata->cur)); 2204 2205 next: 2206 output = ddata->cur_output; 2207 if (!vector_str_init(&v)) 2208 return (0); 2209 2210 rtn = 0; 2211 limit = 0; 2212 for (;;) { 2213 p_idx = output->size; 2214 switch (*ddata->cur) { 2215 case 'I': 2216 if (!cpp_demangle_read_tmpl_args(ddata)) 2217 goto clean; 2218 break; 2219 case 'S': 2220 if (!cpp_demangle_read_subst(ddata)) 2221 goto clean; 2222 break; 2223 case 'T': 2224 if (!cpp_demangle_read_tmpl_param(ddata)) 2225 goto clean; 2226 break; 2227 default: 2228 if (!cpp_demangle_read_uqname(ddata)) 2229 goto clean; 2230 } 2231 2232 if (p_idx == output->size) 2233 goto next_comp; 2234 if ((subst_str = vector_str_substr(output, p_idx, 2235 output->size - 1, &subst_str_len)) == NULL) 2236 goto clean; 2237 if (!vector_str_push(&v, subst_str, subst_str_len)) { 2238 free(subst_str); 2239 goto clean; 2240 } 2241 free(subst_str); 2242 2243 if (!cpp_demangle_push_subst_v(ddata, &v)) 2244 goto clean; 2245 2246 next_comp: 2247 if (*ddata->cur == 'E') 2248 break; 2249 else if (*ddata->cur != 'I' && *ddata->cur != 'C' && 2250 *ddata->cur != 'D' && p_idx != output->size) { 2251 if (!DEM_PUSH_STR(ddata, "::")) 2252 goto clean; 2253 if (!VEC_PUSH_STR(&v, "::")) 2254 goto clean; 2255 } 2256 if (limit++ > CPP_DEMANGLE_TRY_LIMIT) 2257 goto clean; 2258 } 2259 2260 ++ddata->cur; 2261 rtn = 1; 2262 2263 clean: 2264 vector_str_dest(&v); 2265 2266 return (rtn); 2267 } 2268 2269 /* 2270 * read number 2271 * number ::= [n] <decimal> 2272 */ 2273 static int 2274 cpp_demangle_read_number(struct cpp_demangle_data *ddata, long *rtn) 2275 { 2276 long len, negative_factor; 2277 2278 if (ddata == NULL || rtn == NULL) 2279 return (0); 2280 2281 negative_factor = 1; 2282 if (*ddata->cur == 'n') { 2283 negative_factor = -1; 2284 2285 ++ddata->cur; 2286 } 2287 if (ELFTC_ISDIGIT(*ddata->cur) == 0) 2288 return (0); 2289 2290 errno = 0; 2291 if ((len = strtol(ddata->cur, (char **) NULL, 10)) == 0 && 2292 errno != 0) 2293 return (0); 2294 2295 while (ELFTC_ISDIGIT(*ddata->cur) != 0) 2296 ++ddata->cur; 2297 2298 assert(len >= 0); 2299 assert(negative_factor == 1 || negative_factor == -1); 2300 2301 *rtn = len * negative_factor; 2302 2303 return (1); 2304 } 2305 2306 static int 2307 cpp_demangle_read_number_as_string(struct cpp_demangle_data *ddata, char **str) 2308 { 2309 long n; 2310 2311 if (!cpp_demangle_read_number(ddata, &n)) { 2312 *str = NULL; 2313 return (0); 2314 } 2315 2316 if (asprintf(str, "%ld", n) < 0) { 2317 *str = NULL; 2318 return (0); 2319 } 2320 2321 return (1); 2322 } 2323 2324 static int 2325 cpp_demangle_read_nv_offset(struct cpp_demangle_data *ddata) 2326 { 2327 2328 if (ddata == NULL) 2329 return (0); 2330 2331 if (!DEM_PUSH_STR(ddata, "offset : ")) 2332 return (0); 2333 2334 return (cpp_demangle_read_offset_number(ddata)); 2335 } 2336 2337 /* read offset, offset are nv-offset, v-offset */ 2338 static int 2339 cpp_demangle_read_offset(struct cpp_demangle_data *ddata) 2340 { 2341 2342 if (ddata == NULL) 2343 return (0); 2344 2345 if (*ddata->cur == 'h') { 2346 ++ddata->cur; 2347 return (cpp_demangle_read_nv_offset(ddata)); 2348 } else if (*ddata->cur == 'v') { 2349 ++ddata->cur; 2350 return (cpp_demangle_read_v_offset(ddata)); 2351 } 2352 2353 return (0); 2354 } 2355 2356 static int 2357 cpp_demangle_read_offset_number(struct cpp_demangle_data *ddata) 2358 { 2359 bool negative; 2360 const char *start; 2361 2362 if (ddata == NULL || *ddata->cur == '\0') 2363 return (0); 2364 2365 /* offset could be negative */ 2366 if (*ddata->cur == 'n') { 2367 negative = true; 2368 start = ddata->cur + 1; 2369 } else { 2370 negative = false; 2371 start = ddata->cur; 2372 } 2373 2374 while (*ddata->cur != '_') 2375 ++ddata->cur; 2376 2377 if (negative && !DEM_PUSH_STR(ddata, "-")) 2378 return (0); 2379 2380 assert(start != NULL); 2381 2382 if (!cpp_demangle_push_str(ddata, start, ddata->cur - start)) 2383 return (0); 2384 if (!DEM_PUSH_STR(ddata, " ")) 2385 return (0); 2386 2387 ++ddata->cur; 2388 2389 return (1); 2390 } 2391 2392 static int 2393 cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *ddata, 2394 struct vector_type_qualifier *v) 2395 { 2396 size_t class_type_len, i, idx, p_idx; 2397 int p_func_type, rtn; 2398 char *class_type; 2399 2400 if (ddata == NULL || *ddata->cur != 'M' || *(++ddata->cur) == '\0') 2401 return (0); 2402 2403 p_idx = ddata->output.size; 2404 if (!cpp_demangle_read_type(ddata, NULL)) 2405 return (0); 2406 2407 if ((class_type = vector_str_substr(&ddata->output, p_idx, 2408 ddata->output.size - 1, &class_type_len)) == NULL) 2409 return (0); 2410 2411 rtn = 0; 2412 idx = ddata->output.size; 2413 for (i = p_idx; i < idx; ++i) 2414 if (!vector_str_pop(&ddata->output)) 2415 goto clean1; 2416 2417 if (!vector_read_cmd_push(&ddata->cmd, READ_PTRMEM, v)) 2418 goto clean1; 2419 2420 if (!vector_str_push(&ddata->class_type, class_type, class_type_len)) 2421 goto clean2; 2422 2423 p_func_type = ddata->func_type; 2424 if (!cpp_demangle_read_type(ddata, NULL)) 2425 goto clean3; 2426 2427 if (p_func_type == ddata->func_type) { 2428 if (!DEM_PUSH_STR(ddata, " ")) 2429 goto clean3; 2430 if (!cpp_demangle_push_str(ddata, class_type, class_type_len)) 2431 goto clean3; 2432 if (!DEM_PUSH_STR(ddata, "::*")) 2433 goto clean3; 2434 } 2435 2436 rtn = 1; 2437 clean3: 2438 if (!vector_str_pop(&ddata->class_type)) 2439 rtn = 0; 2440 clean2: 2441 if (!vector_read_cmd_pop(&ddata->cmd)) 2442 rtn = 0; 2443 clean1: 2444 free(class_type); 2445 2446 vector_type_qualifier_dest(v); 2447 if (!vector_type_qualifier_init(v)) 2448 return (0); 2449 2450 return (rtn); 2451 } 2452 2453 /* read source-name, source-name is <len> <ID> */ 2454 static int 2455 cpp_demangle_read_sname(struct cpp_demangle_data *ddata) 2456 { 2457 long len; 2458 int err; 2459 2460 if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 || 2461 len <= 0) 2462 return (0); 2463 2464 if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0)) 2465 err = DEM_PUSH_STR(ddata, "(anonymous namespace)"); 2466 else 2467 err = cpp_demangle_push_str(ddata, ddata->cur, len); 2468 2469 if (err == 0) 2470 return (0); 2471 2472 assert(ddata->cur_output->size > 0); 2473 if (vector_read_cmd_find(&ddata->cmd, READ_TMPL) == NULL) 2474 ddata->last_sname = 2475 ddata->cur_output->container[ddata->cur_output->size - 1]; 2476 2477 ddata->cur += len; 2478 2479 return (1); 2480 } 2481 2482 static int 2483 cpp_demangle_read_subst(struct cpp_demangle_data *ddata) 2484 { 2485 long nth; 2486 2487 if (ddata == NULL || *ddata->cur == '\0') 2488 return (0); 2489 2490 /* abbreviations of the form Sx */ 2491 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) { 2492 case SIMPLE_HASH('S', 'a'): 2493 /* std::allocator */ 2494 if (!DEM_PUSH_STR(ddata, "std::allocator")) 2495 return (0); 2496 ddata->cur += 2; 2497 if (*ddata->cur == 'I') 2498 return (cpp_demangle_read_subst_stdtmpl(ddata, 2499 "std::allocator")); 2500 return (1); 2501 2502 case SIMPLE_HASH('S', 'b'): 2503 /* std::basic_string */ 2504 if (!DEM_PUSH_STR(ddata, "std::basic_string")) 2505 return (0); 2506 ddata->cur += 2; 2507 if (*ddata->cur == 'I') 2508 return (cpp_demangle_read_subst_stdtmpl(ddata, 2509 "std::basic_string")); 2510 return (1); 2511 2512 case SIMPLE_HASH('S', 'd'): 2513 /* std::basic_iostream<char, std::char_traits<char> > */ 2514 if (!DEM_PUSH_STR(ddata, "std::basic_iostream<char, " 2515 "std::char_traits<char> >")) 2516 return (0); 2517 ddata->last_sname = "basic_iostream"; 2518 ddata->cur += 2; 2519 if (*ddata->cur == 'I') 2520 return (cpp_demangle_read_subst_stdtmpl(ddata, 2521 "std::basic_iostream<char, std::char_traits" 2522 "<char> >")); 2523 return (1); 2524 2525 case SIMPLE_HASH('S', 'i'): 2526 /* std::basic_istream<char, std::char_traits<char> > */ 2527 if (!DEM_PUSH_STR(ddata, "std::basic_istream<char, " 2528 "std::char_traits<char> >")) 2529 return (0); 2530 ddata->last_sname = "basic_istream"; 2531 ddata->cur += 2; 2532 if (*ddata->cur == 'I') 2533 return (cpp_demangle_read_subst_stdtmpl(ddata, 2534 "std::basic_istream<char, std::char_traits" 2535 "<char> >")); 2536 return (1); 2537 2538 case SIMPLE_HASH('S', 'o'): 2539 /* std::basic_ostream<char, std::char_traits<char> > */ 2540 if (!DEM_PUSH_STR(ddata, "std::basic_ostream<char, " 2541 "std::char_traits<char> >")) 2542 return (0); 2543 ddata->last_sname = "basic_ostream"; 2544 ddata->cur += 2; 2545 if (*ddata->cur == 'I') 2546 return (cpp_demangle_read_subst_stdtmpl(ddata, 2547 "std::basic_ostream<char, std::char_traits" 2548 "<char> >")); 2549 return (1); 2550 2551 case SIMPLE_HASH('S', 's'): 2552 /* 2553 * std::basic_string<char, std::char_traits<char>, 2554 * std::allocator<char> > 2555 * 2556 * a.k.a std::string 2557 */ 2558 if (!DEM_PUSH_STR(ddata, "std::basic_string<char, " 2559 "std::char_traits<char>, std::allocator<char> >")) 2560 return (0); 2561 ddata->last_sname = "string"; 2562 ddata->cur += 2; 2563 if (*ddata->cur == 'I') 2564 return (cpp_demangle_read_subst_stdtmpl(ddata, 2565 "std::basic_string<char, std::char_traits<char>," 2566 " std::allocator<char> >")); 2567 return (1); 2568 2569 case SIMPLE_HASH('S', 't'): 2570 /* std:: */ 2571 return (cpp_demangle_read_subst_std(ddata)); 2572 } 2573 2574 if (*(++ddata->cur) == '\0') 2575 return (0); 2576 2577 /* Skip unknown substitution abbreviations. */ 2578 if (!(*ddata->cur >= '0' && *ddata->cur <= '9') && 2579 !(*ddata->cur >= 'A' && *ddata->cur <= 'Z') && 2580 *ddata->cur != '_') { 2581 ++ddata->cur; 2582 return (1); 2583 } 2584 2585 /* substitution */ 2586 if (*ddata->cur == '_') 2587 return (cpp_demangle_get_subst(ddata, 0)); 2588 else { 2589 errno = 0; 2590 /* substitution number is base 36 */ 2591 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 && 2592 errno != 0) 2593 return (0); 2594 2595 /* first was '_', so increase one */ 2596 ++nth; 2597 2598 while (*ddata->cur != '_') 2599 ++ddata->cur; 2600 2601 assert(nth > 0); 2602 2603 return (cpp_demangle_get_subst(ddata, nth)); 2604 } 2605 2606 /* NOTREACHED */ 2607 return (0); 2608 } 2609 2610 static int 2611 cpp_demangle_read_subst_std(struct cpp_demangle_data *ddata) 2612 { 2613 struct vector_str *output, v; 2614 size_t p_idx, subst_str_len; 2615 int rtn; 2616 char *subst_str; 2617 2618 if (ddata == NULL) 2619 return (0); 2620 2621 if (!vector_str_init(&v)) 2622 return (0); 2623 2624 subst_str = NULL; 2625 rtn = 0; 2626 if (!DEM_PUSH_STR(ddata, "std::")) 2627 goto clean; 2628 2629 if (!VEC_PUSH_STR(&v, "std::")) 2630 goto clean; 2631 2632 ddata->cur += 2; 2633 2634 output = ddata->cur_output; 2635 2636 p_idx = output->size; 2637 if (!cpp_demangle_read_uqname(ddata)) 2638 goto clean; 2639 2640 if ((subst_str = vector_str_substr(output, p_idx, output->size - 1, 2641 &subst_str_len)) == NULL) 2642 goto clean; 2643 2644 if (!vector_str_push(&v, subst_str, subst_str_len)) 2645 goto clean; 2646 2647 if (!cpp_demangle_push_subst_v(ddata, &v)) 2648 goto clean; 2649 2650 if (*ddata->cur == 'I') { 2651 p_idx = output->size; 2652 if (!cpp_demangle_read_tmpl_args(ddata)) 2653 goto clean; 2654 free(subst_str); 2655 if ((subst_str = vector_str_substr(output, p_idx, 2656 output->size - 1, &subst_str_len)) == NULL) 2657 goto clean; 2658 if (!vector_str_push(&v, subst_str, subst_str_len)) 2659 goto clean; 2660 if (!cpp_demangle_push_subst_v(ddata, &v)) 2661 goto clean; 2662 } 2663 2664 rtn = 1; 2665 clean: 2666 free(subst_str); 2667 vector_str_dest(&v); 2668 2669 return (rtn); 2670 } 2671 2672 static int 2673 cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *ddata, 2674 const char *str) 2675 { 2676 struct vector_str *output; 2677 size_t p_idx, substr_len, len; 2678 int rtn; 2679 char *subst_str, *substr; 2680 2681 if (ddata == NULL || str == NULL) 2682 return (0); 2683 2684 if ((len = strlen(str)) == 0) 2685 return (0); 2686 2687 output = ddata->cur_output; 2688 2689 p_idx = output->size; 2690 substr = NULL; 2691 subst_str = NULL; 2692 2693 if (!cpp_demangle_read_tmpl_args(ddata)) 2694 return (0); 2695 if ((substr = vector_str_substr(output, p_idx, output->size - 1, 2696 &substr_len)) == NULL) 2697 return (0); 2698 2699 rtn = 0; 2700 if ((subst_str = malloc(sizeof(char) * (substr_len + len + 1))) == 2701 NULL) 2702 goto clean; 2703 2704 memcpy(subst_str, str, len); 2705 memcpy(subst_str + len, substr, substr_len); 2706 subst_str[substr_len + len] = '\0'; 2707 2708 if (!cpp_demangle_push_subst(ddata, subst_str, substr_len + len)) 2709 goto clean; 2710 2711 rtn = 1; 2712 clean: 2713 free(subst_str); 2714 free(substr); 2715 2716 return (rtn); 2717 } 2718 2719 static int 2720 cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata) 2721 { 2722 2723 if (ddata == NULL || *ddata->cur == '\0') 2724 return (0); 2725 2726 switch (*ddata->cur) { 2727 case 'L': 2728 return (cpp_demangle_read_expr_primary(ddata)); 2729 case 'X': 2730 ++ddata->cur; 2731 if (!cpp_demangle_read_expression(ddata)) 2732 return (0); 2733 return (*ddata->cur++ == 'E'); 2734 } 2735 2736 return (cpp_demangle_read_type(ddata, NULL)); 2737 } 2738 2739 static int 2740 cpp_demangle_read_tmpl_args(struct cpp_demangle_data *ddata) 2741 { 2742 struct vector_str *v; 2743 size_t arg_len, idx, limit, size; 2744 char *arg; 2745 2746 if (ddata == NULL || *ddata->cur == '\0') 2747 return (0); 2748 2749 ++ddata->cur; 2750 2751 if (!vector_read_cmd_push(&ddata->cmd, READ_TMPL, NULL)) 2752 return (0); 2753 2754 if (!DEM_PUSH_STR(ddata, "<")) 2755 return (0); 2756 2757 limit = 0; 2758 v = ddata->cur_output; 2759 for (;;) { 2760 idx = v->size; 2761 if (!cpp_demangle_read_tmpl_arg(ddata)) 2762 return (0); 2763 if ((arg = vector_str_substr(v, idx, v->size - 1, &arg_len)) == 2764 NULL) 2765 return (0); 2766 if (!vector_str_find(&ddata->tmpl, arg, arg_len) && 2767 !vector_str_push(&ddata->tmpl, arg, arg_len)) { 2768 free(arg); 2769 return (0); 2770 } 2771 2772 free(arg); 2773 2774 if (*ddata->cur == 'E') { 2775 ++ddata->cur; 2776 size = v->size; 2777 assert(size > 0); 2778 if (!strncmp(v->container[size - 1], ">", 1)) { 2779 if (!DEM_PUSH_STR(ddata, " >")) 2780 return (0); 2781 } else if (!DEM_PUSH_STR(ddata, ">")) 2782 return (0); 2783 ddata->is_tmpl = true; 2784 break; 2785 } else if (*ddata->cur != 'I' && 2786 !DEM_PUSH_STR(ddata, ", ")) 2787 return (0); 2788 2789 if (limit++ > CPP_DEMANGLE_TRY_LIMIT) 2790 return (0); 2791 } 2792 2793 return (vector_read_cmd_pop(&ddata->cmd)); 2794 } 2795 2796 /* 2797 * Read template parameter that forms in 'T[number]_'. 2798 * This function much like to read_subst but only for types. 2799 */ 2800 static int 2801 cpp_demangle_read_tmpl_param(struct cpp_demangle_data *ddata) 2802 { 2803 long nth; 2804 2805 if (ddata == NULL || *ddata->cur != 'T') 2806 return (0); 2807 2808 ++ddata->cur; 2809 2810 if (*ddata->cur == '_') 2811 return (cpp_demangle_get_tmpl_param(ddata, 0)); 2812 else { 2813 2814 errno = 0; 2815 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 && 2816 errno != 0) 2817 return (0); 2818 2819 /* T_ is first */ 2820 ++nth; 2821 2822 while (*ddata->cur != '_') 2823 ++ddata->cur; 2824 2825 assert(nth > 0); 2826 2827 return (cpp_demangle_get_tmpl_param(ddata, nth)); 2828 } 2829 2830 /* NOTREACHED */ 2831 return (0); 2832 } 2833 2834 static int 2835 cpp_demangle_read_type(struct cpp_demangle_data *ddata, 2836 struct type_delimit *td) 2837 { 2838 struct vector_type_qualifier v; 2839 struct vector_str *output, sv; 2840 size_t p_idx, type_str_len, subst_str_len; 2841 int extern_c, is_builtin; 2842 long len; 2843 const char *p; 2844 char *type_str, *exp_str, *num_str, *subst_str; 2845 bool skip_ref_qualifier, omit_void; 2846 2847 if (ddata == NULL) 2848 return (0); 2849 2850 output = ddata->cur_output; 2851 if (td) { 2852 if (td->paren == false) { 2853 if (!DEM_PUSH_STR(ddata, "(")) 2854 return (0); 2855 if (ddata->output.size < 2) 2856 return (0); 2857 td->paren = true; 2858 } 2859 2860 if (!td->firstp) { 2861 if (*ddata->cur != 'I') { 2862 if (!DEM_PUSH_STR(ddata, ", ")) 2863 return (0); 2864 } 2865 } 2866 } 2867 2868 assert(output != NULL); 2869 /* 2870 * [r, V, K] [P, R, O, C, G, U] builtin, function, class-enum, array 2871 * pointer-to-member, template-param, template-template-param, subst 2872 */ 2873 2874 if (!vector_type_qualifier_init(&v)) 2875 return (0); 2876 2877 extern_c = 0; 2878 is_builtin = 1; 2879 p_idx = output->size; 2880 type_str = exp_str = num_str = NULL; 2881 skip_ref_qualifier = false; 2882 2883 again: 2884 2885 /* Clear ref-qualifier flag */ 2886 if (*ddata->cur != 'R' && *ddata->cur != 'O' && *ddata->cur != 'E') 2887 ddata->ref_qualifier = false; 2888 2889 /* builtin type */ 2890 switch (*ddata->cur) { 2891 case 'a': 2892 /* signed char */ 2893 if (!DEM_PUSH_STR(ddata, "signed char")) 2894 goto clean; 2895 ++ddata->cur; 2896 goto rtn; 2897 2898 case 'A': 2899 /* array type */ 2900 if (!cpp_demangle_read_array(ddata)) 2901 goto clean; 2902 is_builtin = 0; 2903 goto rtn; 2904 2905 case 'b': 2906 /* bool */ 2907 if (!DEM_PUSH_STR(ddata, "bool")) 2908 goto clean; 2909 ++ddata->cur; 2910 goto rtn; 2911 2912 case 'C': 2913 /* complex pair */ 2914 if (!vector_type_qualifier_push(&v, TYPE_CMX)) 2915 goto clean; 2916 ++ddata->cur; 2917 if (td) 2918 td->firstp = false; 2919 goto again; 2920 2921 case 'c': 2922 /* char */ 2923 if (!DEM_PUSH_STR(ddata, "char")) 2924 goto clean; 2925 ++ddata->cur; 2926 goto rtn; 2927 2928 case 'd': 2929 /* double */ 2930 if (!DEM_PUSH_STR(ddata, "double")) 2931 goto clean; 2932 ++ddata->cur; 2933 goto rtn; 2934 2935 case 'D': 2936 ++ddata->cur; 2937 switch (*ddata->cur) { 2938 case 'a': 2939 /* auto */ 2940 if (!DEM_PUSH_STR(ddata, "auto")) 2941 goto clean; 2942 ++ddata->cur; 2943 break; 2944 case 'c': 2945 /* decltype(auto) */ 2946 if (!DEM_PUSH_STR(ddata, "decltype(auto)")) 2947 goto clean; 2948 ++ddata->cur; 2949 break; 2950 case 'd': 2951 /* IEEE 754r decimal floating point (64 bits) */ 2952 if (!DEM_PUSH_STR(ddata, "decimal64")) 2953 goto clean; 2954 ++ddata->cur; 2955 break; 2956 case 'e': 2957 /* IEEE 754r decimal floating point (128 bits) */ 2958 if (!DEM_PUSH_STR(ddata, "decimal128")) 2959 goto clean; 2960 ++ddata->cur; 2961 break; 2962 case 'f': 2963 /* IEEE 754r decimal floating point (32 bits) */ 2964 if (!DEM_PUSH_STR(ddata, "decimal32")) 2965 goto clean; 2966 ++ddata->cur; 2967 break; 2968 case 'h': 2969 /* IEEE 754r half-precision floating point (16 bits) */ 2970 if (!DEM_PUSH_STR(ddata, "half")) 2971 goto clean; 2972 ++ddata->cur; 2973 break; 2974 case 'i': 2975 /* char32_t */ 2976 if (!DEM_PUSH_STR(ddata, "char32_t")) 2977 goto clean; 2978 ++ddata->cur; 2979 break; 2980 case 'n': 2981 /* std::nullptr_t (i.e., decltype(nullptr)) */ 2982 if (!DEM_PUSH_STR(ddata, "decltype(nullptr)")) 2983 goto clean; 2984 ++ddata->cur; 2985 break; 2986 case 's': 2987 /* char16_t */ 2988 if (!DEM_PUSH_STR(ddata, "char16_t")) 2989 goto clean; 2990 ++ddata->cur; 2991 break; 2992 case 'v': 2993 /* gcc vector_size extension. */ 2994 ++ddata->cur; 2995 if (*ddata->cur == '_') { 2996 ++ddata->cur; 2997 if (!cpp_demangle_read_expression_flat(ddata, 2998 &exp_str)) 2999 goto clean; 3000 if (!VEC_PUSH_STR(&v.ext_name, exp_str)) 3001 goto clean; 3002 } else { 3003 if (!cpp_demangle_read_number_as_string(ddata, 3004 &num_str)) 3005 goto clean; 3006 if (!VEC_PUSH_STR(&v.ext_name, num_str)) 3007 goto clean; 3008 } 3009 if (*ddata->cur != '_') 3010 goto clean; 3011 ++ddata->cur; 3012 if (!vector_type_qualifier_push(&v, TYPE_VEC)) 3013 goto clean; 3014 if (td) 3015 td->firstp = false; 3016 goto again; 3017 default: 3018 goto clean; 3019 } 3020 goto rtn; 3021 3022 case 'e': 3023 /* long double */ 3024 if (!DEM_PUSH_STR(ddata, "long double")) 3025 goto clean; 3026 ++ddata->cur; 3027 goto rtn; 3028 3029 case 'E': 3030 /* unexpected end except ref-qualifiers */ 3031 if (ddata->ref_qualifier && ddata->is_functype) { 3032 skip_ref_qualifier = true; 3033 /* Pop the delimiter. */ 3034 cpp_demangle_pop_str(ddata); 3035 goto rtn; 3036 } 3037 goto clean; 3038 3039 case 'f': 3040 /* float */ 3041 if (!DEM_PUSH_STR(ddata, "float")) 3042 goto clean; 3043 ++ddata->cur; 3044 goto rtn; 3045 3046 case 'F': 3047 /* function */ 3048 if (!cpp_demangle_read_function(ddata, &extern_c, &v)) 3049 goto clean; 3050 is_builtin = 0; 3051 goto rtn; 3052 3053 case 'g': 3054 /* __float128 */ 3055 if (!DEM_PUSH_STR(ddata, "__float128")) 3056 goto clean; 3057 ++ddata->cur; 3058 goto rtn; 3059 3060 case 'G': 3061 /* imaginary */ 3062 if (!vector_type_qualifier_push(&v, TYPE_IMG)) 3063 goto clean; 3064 ++ddata->cur; 3065 if (td) 3066 td->firstp = false; 3067 goto again; 3068 3069 case 'h': 3070 /* unsigned char */ 3071 if (!DEM_PUSH_STR(ddata, "unsigned char")) 3072 goto clean; 3073 ++ddata->cur; 3074 goto rtn; 3075 3076 case 'i': 3077 /* int */ 3078 if (!DEM_PUSH_STR(ddata, "int")) 3079 goto clean; 3080 ++ddata->cur; 3081 goto rtn; 3082 3083 case 'I': 3084 /* template args. */ 3085 /* handles <substitute><template-args> */ 3086 p_idx = output->size; 3087 if (!cpp_demangle_read_tmpl_args(ddata)) 3088 goto clean; 3089 if ((subst_str = vector_str_substr(output, p_idx, 3090 output->size - 1, &subst_str_len)) == NULL) 3091 goto clean; 3092 if (!vector_str_init(&sv)) { 3093 free(subst_str); 3094 goto clean; 3095 } 3096 if (!vector_str_push(&sv, subst_str, subst_str_len)) { 3097 free(subst_str); 3098 vector_str_dest(&sv); 3099 goto clean; 3100 } 3101 free(subst_str); 3102 if (!cpp_demangle_push_subst_v(ddata, &sv)) { 3103 vector_str_dest(&sv); 3104 goto clean; 3105 } 3106 vector_str_dest(&sv); 3107 goto rtn; 3108 3109 case 'j': 3110 /* unsigned int */ 3111 if (!DEM_PUSH_STR(ddata, "unsigned int")) 3112 goto clean; 3113 ++ddata->cur; 3114 goto rtn; 3115 3116 case 'K': 3117 /* const */ 3118 if (!vector_type_qualifier_push(&v, TYPE_CST)) 3119 goto clean; 3120 ++ddata->cur; 3121 if (td) 3122 td->firstp = false; 3123 goto again; 3124 3125 case 'l': 3126 /* long */ 3127 if (!DEM_PUSH_STR(ddata, "long")) 3128 goto clean; 3129 ++ddata->cur; 3130 goto rtn; 3131 3132 case 'm': 3133 /* unsigned long */ 3134 if (!DEM_PUSH_STR(ddata, "unsigned long")) 3135 goto clean; 3136 3137 ++ddata->cur; 3138 3139 goto rtn; 3140 case 'M': 3141 /* pointer to member */ 3142 if (!cpp_demangle_read_pointer_to_member(ddata, &v)) 3143 goto clean; 3144 is_builtin = 0; 3145 goto rtn; 3146 3147 case 'n': 3148 /* __int128 */ 3149 if (!DEM_PUSH_STR(ddata, "__int128")) 3150 goto clean; 3151 ++ddata->cur; 3152 goto rtn; 3153 3154 case 'o': 3155 /* unsigned __int128 */ 3156 if (!DEM_PUSH_STR(ddata, "unsigned __int128")) 3157 goto clean; 3158 ++ddata->cur; 3159 goto rtn; 3160 3161 case 'O': 3162 /* rvalue reference */ 3163 if (ddata->ref_qualifier) 3164 goto clean; 3165 if (!vector_type_qualifier_push(&v, TYPE_RREF)) 3166 goto clean; 3167 ddata->ref_qualifier = true; 3168 ddata->ref_qualifier_type = TYPE_RREF; 3169 ++ddata->cur; 3170 if (td) 3171 td->firstp = false; 3172 goto again; 3173 3174 case 'P': 3175 /* pointer */ 3176 if (!vector_type_qualifier_push(&v, TYPE_PTR)) 3177 goto clean; 3178 ++ddata->cur; 3179 if (td) 3180 td->firstp = false; 3181 goto again; 3182 3183 case 'r': 3184 /* restrict */ 3185 if (!vector_type_qualifier_push(&v, TYPE_RST)) 3186 goto clean; 3187 ++ddata->cur; 3188 if (td) 3189 td->firstp = false; 3190 goto again; 3191 3192 case 'R': 3193 /* reference */ 3194 if (ddata->ref_qualifier) 3195 goto clean; 3196 if (!vector_type_qualifier_push(&v, TYPE_REF)) 3197 goto clean; 3198 ddata->ref_qualifier = true; 3199 ddata->ref_qualifier_type = TYPE_REF; 3200 ++ddata->cur; 3201 if (td) 3202 td->firstp = false; 3203 goto again; 3204 3205 case 's': 3206 /* short, local string */ 3207 if (!DEM_PUSH_STR(ddata, "short")) 3208 goto clean; 3209 ++ddata->cur; 3210 goto rtn; 3211 3212 case 'S': 3213 /* substitution */ 3214 if (!cpp_demangle_read_subst(ddata)) 3215 goto clean; 3216 is_builtin = 0; 3217 goto rtn; 3218 3219 case 't': 3220 /* unsigned short */ 3221 if (!DEM_PUSH_STR(ddata, "unsigned short")) 3222 goto clean; 3223 ++ddata->cur; 3224 goto rtn; 3225 3226 case 'T': 3227 /* template parameter */ 3228 if (!cpp_demangle_read_tmpl_param(ddata)) 3229 goto clean; 3230 is_builtin = 0; 3231 goto rtn; 3232 3233 case 'u': 3234 /* vendor extended builtin */ 3235 ++ddata->cur; 3236 if (!cpp_demangle_read_sname(ddata)) 3237 goto clean; 3238 is_builtin = 0; 3239 goto rtn; 3240 3241 case 'U': 3242 /* vendor extended type qualifier */ 3243 ++ddata->cur; 3244 if (!cpp_demangle_read_number(ddata, &len)) 3245 goto clean; 3246 if (len <= 0) 3247 goto clean; 3248 if (!vector_str_push(&v.ext_name, ddata->cur, len)) 3249 goto clean; 3250 ddata->cur += len; 3251 if (!vector_type_qualifier_push(&v, TYPE_EXT)) 3252 goto clean; 3253 if (td) 3254 td->firstp = false; 3255 goto again; 3256 3257 case 'v': 3258 /* void */ 3259 omit_void = false; 3260 if (td && td->firstp) { 3261 /* 3262 * peek into next bytes and see if we should omit 3263 * the "void". 3264 */ 3265 omit_void = true; 3266 for (p = ddata->cur + 1; *p != '\0'; p++) { 3267 if (*p == 'E') 3268 break; 3269 if (*p != 'R' && *p != 'O') { 3270 omit_void = false; 3271 break; 3272 } 3273 } 3274 } 3275 if (!omit_void && !DEM_PUSH_STR(ddata, "void")) 3276 goto clean; 3277 ++ddata->cur; 3278 goto rtn; 3279 3280 case 'V': 3281 /* volatile */ 3282 if (!vector_type_qualifier_push(&v, TYPE_VAT)) 3283 goto clean; 3284 ++ddata->cur; 3285 if (td) 3286 td->firstp = false; 3287 goto again; 3288 3289 case 'w': 3290 /* wchar_t */ 3291 if (!DEM_PUSH_STR(ddata, "wchar_t")) 3292 goto clean; 3293 ++ddata->cur; 3294 goto rtn; 3295 3296 case 'x': 3297 /* long long */ 3298 if (!DEM_PUSH_STR(ddata, "long long")) 3299 goto clean; 3300 ++ddata->cur; 3301 goto rtn; 3302 3303 case 'y': 3304 /* unsigned long long */ 3305 if (!DEM_PUSH_STR(ddata, "unsigned long long")) 3306 goto clean; 3307 ++ddata->cur; 3308 goto rtn; 3309 3310 case 'z': 3311 /* ellipsis */ 3312 if (!DEM_PUSH_STR(ddata, "...")) 3313 goto clean; 3314 ++ddata->cur; 3315 goto rtn; 3316 } 3317 3318 if (!cpp_demangle_read_name(ddata)) 3319 goto clean; 3320 3321 is_builtin = 0; 3322 rtn: 3323 3324 type_str = vector_str_substr(output, p_idx, output->size - 1, 3325 &type_str_len); 3326 3327 if (is_builtin == 0) { 3328 if (!vector_str_find(&ddata->subst, type_str, type_str_len) && 3329 !vector_str_push(&ddata->subst, type_str, type_str_len)) 3330 goto clean; 3331 } 3332 3333 if (!skip_ref_qualifier && 3334 !cpp_demangle_push_type_qualifier(ddata, &v, type_str)) 3335 goto clean; 3336 3337 if (td) 3338 td->firstp = false; 3339 3340 free(type_str); 3341 free(exp_str); 3342 free(num_str); 3343 vector_type_qualifier_dest(&v); 3344 3345 return (1); 3346 clean: 3347 free(type_str); 3348 free(exp_str); 3349 free(num_str); 3350 vector_type_qualifier_dest(&v); 3351 3352 return (0); 3353 } 3354 3355 static int 3356 cpp_demangle_read_type_flat(struct cpp_demangle_data *ddata, char **str) 3357 { 3358 struct vector_str *output; 3359 size_t i, p_idx, idx, type_len; 3360 char *type; 3361 3362 output = ddata->cur_output; 3363 3364 p_idx = output->size; 3365 3366 if (!cpp_demangle_read_type(ddata, NULL)) 3367 return (0); 3368 3369 if ((type = vector_str_substr(output, p_idx, output->size - 1, 3370 &type_len)) == NULL) 3371 return (0); 3372 3373 idx = output->size; 3374 for (i = p_idx; i < idx; ++i) { 3375 if (!vector_str_pop(output)) { 3376 free(type); 3377 return (0); 3378 } 3379 } 3380 3381 *str = type; 3382 3383 return (1); 3384 } 3385 3386 /* 3387 * read unqualified-name, unqualified name are operator-name, ctor-dtor-name, 3388 * source-name 3389 */ 3390 static int 3391 cpp_demangle_read_uqname(struct cpp_demangle_data *ddata) 3392 { 3393 size_t len; 3394 3395 if (ddata == NULL || *ddata->cur == '\0') 3396 return (0); 3397 3398 /* operator name */ 3399 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) { 3400 case SIMPLE_HASH('a', 'a'): 3401 /* operator && */ 3402 if (!DEM_PUSH_STR(ddata, "operator&&")) 3403 return (0); 3404 ddata->cur += 2; 3405 return (1); 3406 3407 case SIMPLE_HASH('a', 'd'): 3408 /* operator & (unary) */ 3409 if (!DEM_PUSH_STR(ddata, "operator&")) 3410 return (0); 3411 ddata->cur += 2; 3412 return (1); 3413 3414 case SIMPLE_HASH('a', 'n'): 3415 /* operator & */ 3416 if (!DEM_PUSH_STR(ddata, "operator&")) 3417 return (0); 3418 ddata->cur += 2; 3419 return (1); 3420 3421 case SIMPLE_HASH('a', 'N'): 3422 /* operator &= */ 3423 if (!DEM_PUSH_STR(ddata, "operator&=")) 3424 return (0); 3425 ddata->cur += 2; 3426 return (1); 3427 3428 case SIMPLE_HASH('a', 'S'): 3429 /* operator = */ 3430 if (!DEM_PUSH_STR(ddata, "operator=")) 3431 return (0); 3432 ddata->cur += 2; 3433 return (1); 3434 3435 case SIMPLE_HASH('c', 'l'): 3436 /* operator () */ 3437 if (!DEM_PUSH_STR(ddata, "operator()")) 3438 return (0); 3439 ddata->cur += 2; 3440 return (1); 3441 3442 case SIMPLE_HASH('c', 'm'): 3443 /* operator , */ 3444 if (!DEM_PUSH_STR(ddata, "operator,")) 3445 return (0); 3446 ddata->cur += 2; 3447 return (1); 3448 3449 case SIMPLE_HASH('c', 'o'): 3450 /* operator ~ */ 3451 if (!DEM_PUSH_STR(ddata, "operator~")) 3452 return (0); 3453 ddata->cur += 2; 3454 return (1); 3455 3456 case SIMPLE_HASH('c', 'v'): 3457 /* operator (cast) */ 3458 if (!DEM_PUSH_STR(ddata, "operator(cast)")) 3459 return (0); 3460 ddata->cur += 2; 3461 return (cpp_demangle_read_type(ddata, NULL)); 3462 3463 case SIMPLE_HASH('d', 'a'): 3464 /* operator delete [] */ 3465 if (!DEM_PUSH_STR(ddata, "operator delete []")) 3466 return (0); 3467 ddata->cur += 2; 3468 return (1); 3469 3470 case SIMPLE_HASH('d', 'e'): 3471 /* operator * (unary) */ 3472 if (!DEM_PUSH_STR(ddata, "operator*")) 3473 return (0); 3474 ddata->cur += 2; 3475 return (1); 3476 3477 case SIMPLE_HASH('d', 'l'): 3478 /* operator delete */ 3479 if (!DEM_PUSH_STR(ddata, "operator delete")) 3480 return (0); 3481 ddata->cur += 2; 3482 return (1); 3483 3484 case SIMPLE_HASH('d', 'v'): 3485 /* operator / */ 3486 if (!DEM_PUSH_STR(ddata, "operator/")) 3487 return (0); 3488 ddata->cur += 2; 3489 return (1); 3490 3491 case SIMPLE_HASH('d', 'V'): 3492 /* operator /= */ 3493 if (!DEM_PUSH_STR(ddata, "operator/=")) 3494 return (0); 3495 ddata->cur += 2; 3496 return (1); 3497 3498 case SIMPLE_HASH('e', 'o'): 3499 /* operator ^ */ 3500 if (!DEM_PUSH_STR(ddata, "operator^")) 3501 return (0); 3502 ddata->cur += 2; 3503 return (1); 3504 3505 case SIMPLE_HASH('e', 'O'): 3506 /* operator ^= */ 3507 if (!DEM_PUSH_STR(ddata, "operator^=")) 3508 return (0); 3509 ddata->cur += 2; 3510 return (1); 3511 3512 case SIMPLE_HASH('e', 'q'): 3513 /* operator == */ 3514 if (!DEM_PUSH_STR(ddata, "operator==")) 3515 return (0); 3516 ddata->cur += 2; 3517 return (1); 3518 3519 case SIMPLE_HASH('g', 'e'): 3520 /* operator >= */ 3521 if (!DEM_PUSH_STR(ddata, "operator>=")) 3522 return (0); 3523 ddata->cur += 2; 3524 return (1); 3525 3526 case SIMPLE_HASH('g', 't'): 3527 /* operator > */ 3528 if (!DEM_PUSH_STR(ddata, "operator>")) 3529 return (0); 3530 ddata->cur += 2; 3531 return (1); 3532 3533 case SIMPLE_HASH('i', 'x'): 3534 /* operator [] */ 3535 if (!DEM_PUSH_STR(ddata, "operator[]")) 3536 return (0); 3537 ddata->cur += 2; 3538 return (1); 3539 3540 case SIMPLE_HASH('l', 'e'): 3541 /* operator <= */ 3542 if (!DEM_PUSH_STR(ddata, "operator<=")) 3543 return (0); 3544 ddata->cur += 2; 3545 return (1); 3546 3547 case SIMPLE_HASH('l', 's'): 3548 /* operator << */ 3549 if (!DEM_PUSH_STR(ddata, "operator<<")) 3550 return (0); 3551 ddata->cur += 2; 3552 return (1); 3553 3554 case SIMPLE_HASH('l', 'S'): 3555 /* operator <<= */ 3556 if (!DEM_PUSH_STR(ddata, "operator<<=")) 3557 return (0); 3558 ddata->cur += 2; 3559 return (1); 3560 3561 case SIMPLE_HASH('l', 't'): 3562 /* operator < */ 3563 if (!DEM_PUSH_STR(ddata, "operator<")) 3564 return (0); 3565 ddata->cur += 2; 3566 return (1); 3567 3568 case SIMPLE_HASH('m', 'i'): 3569 /* operator - */ 3570 if (!DEM_PUSH_STR(ddata, "operator-")) 3571 return (0); 3572 ddata->cur += 2; 3573 return (1); 3574 3575 case SIMPLE_HASH('m', 'I'): 3576 /* operator -= */ 3577 if (!DEM_PUSH_STR(ddata, "operator-=")) 3578 return (0); 3579 ddata->cur += 2; 3580 return (1); 3581 3582 case SIMPLE_HASH('m', 'l'): 3583 /* operator * */ 3584 if (!DEM_PUSH_STR(ddata, "operator*")) 3585 return (0); 3586 ddata->cur += 2; 3587 return (1); 3588 3589 case SIMPLE_HASH('m', 'L'): 3590 /* operator *= */ 3591 if (!DEM_PUSH_STR(ddata, "operator*=")) 3592 return (0); 3593 ddata->cur += 2; 3594 return (1); 3595 3596 case SIMPLE_HASH('m', 'm'): 3597 /* operator -- */ 3598 if (!DEM_PUSH_STR(ddata, "operator--")) 3599 return (0); 3600 ddata->cur += 2; 3601 return (1); 3602 3603 case SIMPLE_HASH('n', 'a'): 3604 /* operator new[] */ 3605 if (!DEM_PUSH_STR(ddata, "operator new []")) 3606 return (0); 3607 ddata->cur += 2; 3608 return (1); 3609 3610 case SIMPLE_HASH('n', 'e'): 3611 /* operator != */ 3612 if (!DEM_PUSH_STR(ddata, "operator!=")) 3613 return (0); 3614 ddata->cur += 2; 3615 return (1); 3616 3617 case SIMPLE_HASH('n', 'g'): 3618 /* operator - (unary) */ 3619 if (!DEM_PUSH_STR(ddata, "operator-")) 3620 return (0); 3621 ddata->cur += 2; 3622 return (1); 3623 3624 case SIMPLE_HASH('n', 't'): 3625 /* operator ! */ 3626 if (!DEM_PUSH_STR(ddata, "operator!")) 3627 return (0); 3628 ddata->cur += 2; 3629 return (1); 3630 3631 case SIMPLE_HASH('n', 'w'): 3632 /* operator new */ 3633 if (!DEM_PUSH_STR(ddata, "operator new")) 3634 return (0); 3635 ddata->cur += 2; 3636 return (1); 3637 3638 case SIMPLE_HASH('o', 'o'): 3639 /* operator || */ 3640 if (!DEM_PUSH_STR(ddata, "operator||")) 3641 return (0); 3642 ddata->cur += 2; 3643 return (1); 3644 3645 case SIMPLE_HASH('o', 'r'): 3646 /* operator | */ 3647 if (!DEM_PUSH_STR(ddata, "operator|")) 3648 return (0); 3649 ddata->cur += 2; 3650 return (1); 3651 3652 case SIMPLE_HASH('o', 'R'): 3653 /* operator |= */ 3654 if (!DEM_PUSH_STR(ddata, "operator|=")) 3655 return (0); 3656 ddata->cur += 2; 3657 return (1); 3658 3659 case SIMPLE_HASH('p', 'l'): 3660 /* operator + */ 3661 if (!DEM_PUSH_STR(ddata, "operator+")) 3662 return (0); 3663 ddata->cur += 2; 3664 return (1); 3665 3666 case SIMPLE_HASH('p', 'L'): 3667 /* operator += */ 3668 if (!DEM_PUSH_STR(ddata, "operator+=")) 3669 return (0); 3670 ddata->cur += 2; 3671 return (1); 3672 3673 case SIMPLE_HASH('p', 'm'): 3674 /* operator ->* */ 3675 if (!DEM_PUSH_STR(ddata, "operator->*")) 3676 return (0); 3677 ddata->cur += 2; 3678 return (1); 3679 3680 case SIMPLE_HASH('p', 'p'): 3681 /* operator ++ */ 3682 if (!DEM_PUSH_STR(ddata, "operator++")) 3683 return (0); 3684 ddata->cur += 2; 3685 return (1); 3686 3687 case SIMPLE_HASH('p', 's'): 3688 /* operator + (unary) */ 3689 if (!DEM_PUSH_STR(ddata, "operator+")) 3690 return (0); 3691 ddata->cur += 2; 3692 return (1); 3693 3694 case SIMPLE_HASH('p', 't'): 3695 /* operator -> */ 3696 if (!DEM_PUSH_STR(ddata, "operator->")) 3697 return (0); 3698 ddata->cur += 2; 3699 return (1); 3700 3701 case SIMPLE_HASH('q', 'u'): 3702 /* operator ? */ 3703 if (!DEM_PUSH_STR(ddata, "operator?")) 3704 return (0); 3705 ddata->cur += 2; 3706 return (1); 3707 3708 case SIMPLE_HASH('r', 'm'): 3709 /* operator % */ 3710 if (!DEM_PUSH_STR(ddata, "operator%")) 3711 return (0); 3712 ddata->cur += 2; 3713 return (1); 3714 3715 case SIMPLE_HASH('r', 'M'): 3716 /* operator %= */ 3717 if (!DEM_PUSH_STR(ddata, "operator%=")) 3718 return (0); 3719 ddata->cur += 2; 3720 return (1); 3721 3722 case SIMPLE_HASH('r', 's'): 3723 /* operator >> */ 3724 if (!DEM_PUSH_STR(ddata, "operator>>")) 3725 return (0); 3726 ddata->cur += 2; 3727 return (1); 3728 3729 case SIMPLE_HASH('r', 'S'): 3730 /* operator >>= */ 3731 if (!DEM_PUSH_STR(ddata, "operator>>=")) 3732 return (0); 3733 ddata->cur += 2; 3734 return (1); 3735 3736 case SIMPLE_HASH('r', 'z'): 3737 /* operator sizeof */ 3738 if (!DEM_PUSH_STR(ddata, "operator sizeof ")) 3739 return (0); 3740 ddata->cur += 2; 3741 return (1); 3742 3743 case SIMPLE_HASH('s', 'r'): 3744 /* scope resolution operator */ 3745 if (!DEM_PUSH_STR(ddata, "scope resolution operator ")) 3746 return (0); 3747 ddata->cur += 2; 3748 return (1); 3749 3750 case SIMPLE_HASH('s', 'v'): 3751 /* operator sizeof */ 3752 if (!DEM_PUSH_STR(ddata, "operator sizeof ")) 3753 return (0); 3754 ddata->cur += 2; 3755 return (1); 3756 } 3757 3758 /* vendor extened operator */ 3759 if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) { 3760 if (!DEM_PUSH_STR(ddata, "vendor extened operator ")) 3761 return (0); 3762 if (!cpp_demangle_push_str(ddata, ddata->cur + 1, 1)) 3763 return (0); 3764 ddata->cur += 2; 3765 return (cpp_demangle_read_sname(ddata)); 3766 } 3767 3768 /* ctor-dtor-name */ 3769 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) { 3770 case SIMPLE_HASH('C', '1'): 3771 case SIMPLE_HASH('C', '2'): 3772 case SIMPLE_HASH('C', '3'): 3773 if (ddata->last_sname == NULL) 3774 return (0); 3775 if ((len = strlen(ddata->last_sname)) == 0) 3776 return (0); 3777 if (!DEM_PUSH_STR(ddata, "::")) 3778 return (0); 3779 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len)) 3780 return (0); 3781 ddata->cur +=2; 3782 return (1); 3783 3784 case SIMPLE_HASH('D', '0'): 3785 case SIMPLE_HASH('D', '1'): 3786 case SIMPLE_HASH('D', '2'): 3787 if (ddata->last_sname == NULL) 3788 return (0); 3789 if ((len = strlen(ddata->last_sname)) == 0) 3790 return (0); 3791 if (!DEM_PUSH_STR(ddata, "::~")) 3792 return (0); 3793 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len)) 3794 return (0); 3795 ddata->cur +=2; 3796 return (1); 3797 } 3798 3799 /* source name */ 3800 if (ELFTC_ISDIGIT(*ddata->cur) != 0) 3801 return (cpp_demangle_read_sname(ddata)); 3802 3803 /* local source name */ 3804 if (*ddata->cur == 'L') 3805 return (cpp_demangle_local_source_name(ddata)); 3806 3807 return (1); 3808 } 3809 3810 /* 3811 * Read local source name. 3812 * 3813 * References: 3814 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775 3815 * http://gcc.gnu.org/viewcvs?view=rev&revision=124467 3816 */ 3817 static int 3818 cpp_demangle_local_source_name(struct cpp_demangle_data *ddata) 3819 { 3820 /* L */ 3821 if (ddata == NULL || *ddata->cur != 'L') 3822 return (0); 3823 ++ddata->cur; 3824 3825 /* source name */ 3826 if (!cpp_demangle_read_sname(ddata)) 3827 return (0); 3828 3829 /* discriminator */ 3830 if (*ddata->cur == '_') { 3831 ++ddata->cur; 3832 while (ELFTC_ISDIGIT(*ddata->cur) != 0) 3833 ++ddata->cur; 3834 } 3835 3836 return (1); 3837 } 3838 3839 static int 3840 cpp_demangle_read_v_offset(struct cpp_demangle_data *ddata) 3841 { 3842 3843 if (ddata == NULL) 3844 return (0); 3845 3846 if (!DEM_PUSH_STR(ddata, "offset : ")) 3847 return (0); 3848 3849 if (!cpp_demangle_read_offset_number(ddata)) 3850 return (0); 3851 3852 if (!DEM_PUSH_STR(ddata, "virtual offset : ")) 3853 return (0); 3854 3855 return (!cpp_demangle_read_offset_number(ddata)); 3856 } 3857 3858 /* 3859 * Decode floating point representation to string 3860 * Return new allocated string or NULL 3861 * 3862 * Todo 3863 * Replace these functions to macro. 3864 */ 3865 static char * 3866 decode_fp_to_double(const char *p, size_t len) 3867 { 3868 double f; 3869 size_t rtn_len, limit, i; 3870 int byte; 3871 char *rtn; 3872 3873 if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(double)) 3874 return (NULL); 3875 3876 memset(&f, 0, sizeof(double)); 3877 3878 for (i = 0; i < len / 2; ++i) { 3879 byte = hex_to_dec(p[len - i * 2 - 1]) + 3880 hex_to_dec(p[len - i * 2 - 2]) * 16; 3881 3882 if (byte < 0 || byte > 255) 3883 return (NULL); 3884 3885 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN 3886 ((unsigned char *)&f)[i] = (unsigned char)(byte); 3887 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 3888 ((unsigned char *)&f)[sizeof(double) - i - 1] = 3889 (unsigned char)(byte); 3890 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 3891 } 3892 3893 rtn_len = 64; 3894 limit = 0; 3895 again: 3896 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL) 3897 return (NULL); 3898 3899 if (snprintf(rtn, rtn_len, "%fld", f) >= (int)rtn_len) { 3900 free(rtn); 3901 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT) 3902 return (NULL); 3903 rtn_len *= BUFFER_GROWFACTOR; 3904 goto again; 3905 } 3906 3907 return rtn; 3908 } 3909 3910 static char * 3911 decode_fp_to_float(const char *p, size_t len) 3912 { 3913 size_t i, rtn_len, limit; 3914 float f; 3915 int byte; 3916 char *rtn; 3917 3918 if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(float)) 3919 return (NULL); 3920 3921 memset(&f, 0, sizeof(float)); 3922 3923 for (i = 0; i < len / 2; ++i) { 3924 byte = hex_to_dec(p[len - i * 2 - 1]) + 3925 hex_to_dec(p[len - i * 2 - 2]) * 16; 3926 if (byte < 0 || byte > 255) 3927 return (NULL); 3928 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN 3929 ((unsigned char *)&f)[i] = (unsigned char)(byte); 3930 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 3931 ((unsigned char *)&f)[sizeof(float) - i - 1] = 3932 (unsigned char)(byte); 3933 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 3934 } 3935 3936 rtn_len = 64; 3937 limit = 0; 3938 again: 3939 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL) 3940 return (NULL); 3941 3942 if (snprintf(rtn, rtn_len, "%ff", f) >= (int)rtn_len) { 3943 free(rtn); 3944 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT) 3945 return (NULL); 3946 rtn_len *= BUFFER_GROWFACTOR; 3947 goto again; 3948 } 3949 3950 return rtn; 3951 } 3952 3953 static char * 3954 decode_fp_to_float128(const char *p, size_t len) 3955 { 3956 long double f; 3957 size_t rtn_len, limit, i; 3958 int byte; 3959 unsigned char buf[FLOAT_QUADRUPLE_BYTES]; 3960 char *rtn; 3961 3962 switch(sizeof(long double)) { 3963 case FLOAT_QUADRUPLE_BYTES: 3964 return (decode_fp_to_long_double(p, len)); 3965 case FLOAT_EXTENED_BYTES: 3966 if (p == NULL || len == 0 || len % 2 != 0 || 3967 len / 2 > FLOAT_QUADRUPLE_BYTES) 3968 return (NULL); 3969 3970 memset(buf, 0, FLOAT_QUADRUPLE_BYTES); 3971 3972 for (i = 0; i < len / 2; ++i) { 3973 byte = hex_to_dec(p[len - i * 2 - 1]) + 3974 hex_to_dec(p[len - i * 2 - 2]) * 16; 3975 if (byte < 0 || byte > 255) 3976 return (NULL); 3977 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN 3978 buf[i] = (unsigned char)(byte); 3979 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 3980 buf[FLOAT_QUADRUPLE_BYTES - i -1] = 3981 (unsigned char)(byte); 3982 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 3983 } 3984 memset(&f, 0, FLOAT_EXTENED_BYTES); 3985 3986 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN 3987 memcpy(&f, buf, FLOAT_EXTENED_BYTES); 3988 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 3989 memcpy(&f, buf + 6, FLOAT_EXTENED_BYTES); 3990 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 3991 3992 rtn_len = 256; 3993 limit = 0; 3994 again: 3995 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL) 3996 return (NULL); 3997 3998 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) { 3999 free(rtn); 4000 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT) 4001 return (NULL); 4002 rtn_len *= BUFFER_GROWFACTOR; 4003 goto again; 4004 } 4005 4006 return (rtn); 4007 default: 4008 return (NULL); 4009 } 4010 } 4011 4012 static char * 4013 decode_fp_to_float80(const char *p, size_t len) 4014 { 4015 long double f; 4016 size_t rtn_len, limit, i; 4017 int byte; 4018 unsigned char buf[FLOAT_EXTENED_BYTES]; 4019 char *rtn; 4020 4021 switch(sizeof(long double)) { 4022 case FLOAT_QUADRUPLE_BYTES: 4023 if (p == NULL || len == 0 || len % 2 != 0 || 4024 len / 2 > FLOAT_EXTENED_BYTES) 4025 return (NULL); 4026 4027 memset(buf, 0, FLOAT_EXTENED_BYTES); 4028 4029 for (i = 0; i < len / 2; ++i) { 4030 byte = hex_to_dec(p[len - i * 2 - 1]) + 4031 hex_to_dec(p[len - i * 2 - 2]) * 16; 4032 4033 if (byte < 0 || byte > 255) 4034 return (NULL); 4035 4036 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN 4037 buf[i] = (unsigned char)(byte); 4038 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 4039 buf[FLOAT_EXTENED_BYTES - i -1] = 4040 (unsigned char)(byte); 4041 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 4042 } 4043 4044 memset(&f, 0, FLOAT_QUADRUPLE_BYTES); 4045 4046 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN 4047 memcpy(&f, buf, FLOAT_EXTENED_BYTES); 4048 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 4049 memcpy((unsigned char *)(&f) + 6, buf, FLOAT_EXTENED_BYTES); 4050 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 4051 4052 rtn_len = 256; 4053 limit = 0; 4054 again: 4055 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL) 4056 return (NULL); 4057 4058 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) { 4059 free(rtn); 4060 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT) 4061 return (NULL); 4062 rtn_len *= BUFFER_GROWFACTOR; 4063 goto again; 4064 } 4065 4066 return (rtn); 4067 case FLOAT_EXTENED_BYTES: 4068 return (decode_fp_to_long_double(p, len)); 4069 default: 4070 return (NULL); 4071 } 4072 } 4073 4074 static char * 4075 decode_fp_to_long_double(const char *p, size_t len) 4076 { 4077 long double f; 4078 size_t rtn_len, limit, i; 4079 int byte; 4080 char *rtn; 4081 4082 if (p == NULL || len == 0 || len % 2 != 0 || 4083 len / 2 > sizeof(long double)) 4084 return (NULL); 4085 4086 memset(&f, 0, sizeof(long double)); 4087 4088 for (i = 0; i < len / 2; ++i) { 4089 byte = hex_to_dec(p[len - i * 2 - 1]) + 4090 hex_to_dec(p[len - i * 2 - 2]) * 16; 4091 4092 if (byte < 0 || byte > 255) 4093 return (NULL); 4094 4095 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN 4096 ((unsigned char *)&f)[i] = (unsigned char)(byte); 4097 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 4098 ((unsigned char *)&f)[sizeof(long double) - i - 1] = 4099 (unsigned char)(byte); 4100 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */ 4101 } 4102 4103 rtn_len = 256; 4104 limit = 0; 4105 again: 4106 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL) 4107 return (NULL); 4108 4109 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) { 4110 free(rtn); 4111 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT) 4112 return (NULL); 4113 rtn_len *= BUFFER_GROWFACTOR; 4114 goto again; 4115 } 4116 4117 return (rtn); 4118 } 4119 4120 /* Simple hex to integer function used by decode_to_* function. */ 4121 static int 4122 hex_to_dec(char c) 4123 { 4124 4125 switch (c) { 4126 case '0': 4127 return (0); 4128 case '1': 4129 return (1); 4130 case '2': 4131 return (2); 4132 case '3': 4133 return (3); 4134 case '4': 4135 return (4); 4136 case '5': 4137 return (5); 4138 case '6': 4139 return (6); 4140 case '7': 4141 return (7); 4142 case '8': 4143 return (8); 4144 case '9': 4145 return (9); 4146 case 'a': 4147 return (10); 4148 case 'b': 4149 return (11); 4150 case 'c': 4151 return (12); 4152 case 'd': 4153 return (13); 4154 case 'e': 4155 return (14); 4156 case 'f': 4157 return (15); 4158 default: 4159 return (-1); 4160 } 4161 } 4162 4163 /** 4164 * @brief Test input string is mangled by IA-64 C++ ABI style. 4165 * 4166 * Test string heads with "_Z" or "_GLOBAL__I_". 4167 * @return Return 0 at false. 4168 */ 4169 bool 4170 is_cpp_mangled_gnu3(const char *org) 4171 { 4172 size_t len; 4173 4174 len = strlen(org); 4175 return ((len > 2 && *org == '_' && *(org + 1) == 'Z') || 4176 (len > 11 && !strncmp(org, "_GLOBAL__I_", 11))); 4177 } 4178 4179 static void 4180 vector_read_cmd_dest(struct vector_read_cmd *v) 4181 { 4182 4183 if (v == NULL) 4184 return; 4185 4186 free(v->r_container); 4187 } 4188 4189 static struct read_cmd_item * 4190 vector_read_cmd_find(struct vector_read_cmd *v, enum read_cmd dst) 4191 { 4192 int i; 4193 4194 if (v == NULL || dst == READ_FAIL) 4195 return (NULL); 4196 4197 for (i = (int) v->size - 1; i >= 0; i--) 4198 if (v->r_container[i].cmd == dst) 4199 return (&v->r_container[i]); 4200 4201 return (NULL); 4202 } 4203 4204 static int 4205 vector_read_cmd_init(struct vector_read_cmd *v) 4206 { 4207 4208 if (v == NULL) 4209 return (0); 4210 4211 v->size = 0; 4212 v->capacity = VECTOR_DEF_CAPACITY; 4213 4214 if ((v->r_container = malloc(sizeof(*v->r_container) * v->capacity)) 4215 == NULL) 4216 return (0); 4217 4218 return (1); 4219 } 4220 4221 static int 4222 vector_read_cmd_pop(struct vector_read_cmd *v) 4223 { 4224 4225 if (v == NULL || v->size == 0) 4226 return (0); 4227 4228 --v->size; 4229 v->r_container[v->size].cmd = READ_FAIL; 4230 v->r_container[v->size].data = NULL; 4231 4232 return (1); 4233 } 4234 4235 static int 4236 vector_read_cmd_push(struct vector_read_cmd *v, enum read_cmd cmd, void *data) 4237 { 4238 struct read_cmd_item *tmp_r_ctn; 4239 size_t tmp_cap; 4240 size_t i; 4241 4242 if (v == NULL) 4243 return (0); 4244 4245 if (v->size == v->capacity) { 4246 tmp_cap = BUFFER_GROW(v->capacity); 4247 if ((tmp_r_ctn = malloc(sizeof(*tmp_r_ctn) * tmp_cap)) == NULL) 4248 return (0); 4249 for (i = 0; i < v->size; ++i) 4250 tmp_r_ctn[i] = v->r_container[i]; 4251 free(v->r_container); 4252 v->r_container = tmp_r_ctn; 4253 v->capacity = tmp_cap; 4254 } 4255 4256 v->r_container[v->size].cmd = cmd; 4257 v->r_container[v->size].data = data; 4258 ++v->size; 4259 4260 return (1); 4261 } 4262 4263 static void 4264 vector_type_qualifier_dest(struct vector_type_qualifier *v) 4265 { 4266 4267 if (v == NULL) 4268 return; 4269 4270 free(v->q_container); 4271 vector_str_dest(&v->ext_name); 4272 } 4273 4274 /* size, capacity, ext_name */ 4275 static int 4276 vector_type_qualifier_init(struct vector_type_qualifier *v) 4277 { 4278 4279 if (v == NULL) 4280 return (0); 4281 4282 v->size = 0; 4283 v->capacity = VECTOR_DEF_CAPACITY; 4284 4285 if ((v->q_container = malloc(sizeof(enum type_qualifier) * v->capacity)) 4286 == NULL) 4287 return (0); 4288 4289 assert(v->q_container != NULL); 4290 4291 if (!vector_str_init(&v->ext_name)) { 4292 free(v->q_container); 4293 return (0); 4294 } 4295 4296 return (1); 4297 } 4298 4299 static int 4300 vector_type_qualifier_push(struct vector_type_qualifier *v, 4301 enum type_qualifier t) 4302 { 4303 enum type_qualifier *tmp_ctn; 4304 size_t tmp_cap; 4305 size_t i; 4306 4307 if (v == NULL) 4308 return (0); 4309 4310 if (v->size == v->capacity) { 4311 tmp_cap = BUFFER_GROW(v->capacity); 4312 if ((tmp_ctn = malloc(sizeof(enum type_qualifier) * tmp_cap)) 4313 == NULL) 4314 return (0); 4315 for (i = 0; i < v->size; ++i) 4316 tmp_ctn[i] = v->q_container[i]; 4317 free(v->q_container); 4318 v->q_container = tmp_ctn; 4319 v->capacity = tmp_cap; 4320 } 4321 4322 v->q_container[v->size] = t; 4323 ++v->size; 4324 4325 return (1); 4326 } 4327