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