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