2 * Copyright (c) 2007 Hyogeol Lee <hyogeollee@gmail.com>
3 * Copyright (c) 2015-2017 Kai Wang <kaiwang27@gmail.com>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
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.
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.
27 #include <sys/types.h>
38 * @file cpp_demangle.c
39 * @brief Decode IA-64 C++ ABI style implementation.
41 * IA-64 standard ABI(Itanium C++ ABI) references.
43 * http://www.codesourcery.com/cxx-abi/abi.html#mangling \n
44 * http://www.codesourcery.com/cxx-abi/abi-mangling.html
47 /** @brief Dynamic vector data for string. */
57 #define BUFFER_GROWFACTOR 1.618
58 #define BUFFER_GROW(x) (((x)+0.5)*BUFFER_GROWFACTOR)
60 #define ELFTC_FAILURE 0
61 #define ELFTC_ISDIGIT(C) (isdigit((C) & 0xFF))
62 #define ELFTC_SUCCESS 1
64 #define VECTOR_DEF_CAPACITY 8
67 TYPE_PTR, TYPE_REF, TYPE_CMX, TYPE_IMG, TYPE_EXT, TYPE_RST, TYPE_VAT,
68 TYPE_CST, TYPE_VEC, TYPE_RREF
71 struct vector_type_qualifier {
72 size_t size, capacity;
73 enum type_qualifier *q_container;
74 struct vector_str ext_name;
78 READ_FAIL, READ_NEST, READ_TMPL, READ_EXPR, READ_EXPL, READ_LOCAL,
79 READ_TYPE, READ_FUNC, READ_PTRMEM
82 struct read_cmd_item {
87 struct vector_read_cmd {
88 size_t size, capacity;
89 struct read_cmd_item *r_container;
95 PUSH_NON_CV_QUALIFIER,
98 struct cpp_demangle_data {
99 struct vector_str output; /* output string vector */
100 struct vector_str subst; /* substitution string vector */
101 struct vector_str tmpl;
102 struct vector_str class_type;
103 struct vector_str *cur_output; /* ptr to current output vec */
104 struct vector_read_cmd cmd;
105 bool mem_rst; /* restrict member function */
106 bool mem_vat; /* volatile member function */
107 bool mem_cst; /* const member function */
108 bool mem_ref; /* lvalue-ref member func */
109 bool mem_rref; /* rvalue-ref member func */
110 bool is_tmpl; /* template args */
111 bool is_functype; /* function type */
112 bool ref_qualifier; /* ref qualifier */
113 enum type_qualifier ref_qualifier_type; /* ref qualifier type */
114 enum push_qualifier push_qualifier; /* which qualifiers to push */
116 const char *cur; /* current mangled name ptr */
117 const char *last_sname; /* last source name */
120 struct type_delimit {
125 #define CPP_DEMANGLE_TRY_LIMIT 128
126 #define FLOAT_SPRINTF_TRY_LIMIT 5
127 #define FLOAT_QUADRUPLE_BYTES 16
128 #define FLOAT_EXTENED_BYTES 10
130 #define SIMPLE_HASH(x,y) (64 * x + y)
131 #define DEM_PUSH_STR(d,s) cpp_demangle_push_str((d), (s), strlen((s)))
132 #define VEC_PUSH_STR(d,s) vector_str_push((d), (s), strlen((s)))
134 static size_t get_strlen_sum(const struct vector_str *v);
135 static bool vector_str_grow(struct vector_str *v);
138 get_strlen_sum(const struct vector_str *v)
147 for (i = 0; i < v->size; ++i)
148 len += strlen(v->container[i]);
154 * @brief Deallocate resource in vector_str.
157 vector_str_dest(struct vector_str *v)
164 for (i = 0; i < v->size; ++i)
165 free(v->container[i]);
171 * @brief Find string in vector_str.
172 * @param v Destination vector.
173 * @param o String to find.
174 * @param l Length of the string.
175 * @return -1 at failed, 0 at not found, 1 at found.
178 vector_str_find(const struct vector_str *v, const char *o, size_t l)
182 if (v == NULL || o == NULL)
185 for (i = 0; i < v->size; ++i)
186 if (strncmp(v->container[i], o, l) == 0)
193 * @brief Get new allocated flat string from vector.
195 * If l is not NULL, return length of the string.
196 * @param v Destination vector.
197 * @param l Length of the string.
198 * @return NULL at failed or NUL terminated new allocated string.
201 vector_str_get_flat(const struct vector_str *v, size_t *l)
203 ssize_t elem_pos, elem_size, rtn_size;
207 if (v == NULL || v->size == 0)
210 if ((rtn_size = get_strlen_sum(v)) == 0)
213 if ((rtn = malloc(sizeof(char) * (rtn_size + 1))) == NULL)
217 for (i = 0; i < v->size; ++i) {
218 elem_size = strlen(v->container[i]);
220 memcpy(rtn + elem_pos, v->container[i], elem_size);
222 elem_pos += elem_size;
225 rtn[rtn_size] = '\0';
234 vector_str_grow(struct vector_str *v)
242 assert(v->capacity > 0);
244 tmp_cap = BUFFER_GROW(v->capacity);
246 assert(tmp_cap > v->capacity);
248 if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL)
251 for (i = 0; i < v->size; ++i)
252 tmp_ctn[i] = v->container[i];
256 v->container = tmp_ctn;
257 v->capacity = tmp_cap;
263 * @brief Initialize vector_str.
264 * @return false at failed, true at success.
267 vector_str_init(struct vector_str *v)
274 v->capacity = VECTOR_DEF_CAPACITY;
276 assert(v->capacity > 0);
278 if ((v->container = malloc(sizeof(char *) * v->capacity)) == NULL)
281 assert(v->container != NULL);
287 * @brief Remove last element in vector_str.
288 * @return false at failed, true at success.
291 vector_str_pop(struct vector_str *v)
302 free(v->container[v->size]);
303 v->container[v->size] = NULL;
309 * @brief Push back string to vector.
310 * @return false at failed, true at success.
313 vector_str_push(struct vector_str *v, const char *str, size_t len)
316 if (v == NULL || str == NULL)
319 if (v->size == v->capacity && vector_str_grow(v) == false)
322 if ((v->container[v->size] = malloc(sizeof(char) * (len + 1))) == NULL)
325 snprintf(v->container[v->size], len + 1, "%s", str);
333 * @brief Push front org vector to det vector.
334 * @return false at failed, true at success.
337 vector_str_push_vector_head(struct vector_str *dst, struct vector_str *org)
339 size_t i, j, tmp_cap;
342 if (dst == NULL || org == NULL)
345 tmp_cap = BUFFER_GROW(dst->size + org->size);
347 if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL)
350 for (i = 0; i < org->size; ++i)
351 if ((tmp_ctn[i] = strdup(org->container[i])) == NULL) {
352 for (j = 0; j < i; ++j)
360 for (i = 0; i < dst->size; ++i)
361 tmp_ctn[i + org->size] = dst->container[i];
363 free(dst->container);
365 dst->container = tmp_ctn;
366 dst->capacity = tmp_cap;
367 dst->size += org->size;
373 * @brief Push org vector to the tail of det vector.
374 * @return false at failed, true at success.
377 vector_str_push_vector(struct vector_str *dst, struct vector_str *org)
379 size_t i, j, tmp_cap;
382 if (dst == NULL || org == NULL)
385 tmp_cap = BUFFER_GROW(dst->size + org->size);
387 if ((tmp_ctn = malloc(sizeof(char *) * tmp_cap)) == NULL)
390 for (i = 0; i < dst->size; ++i)
391 tmp_ctn[i] = dst->container[i];
393 for (i = 0; i < org->size; ++i)
394 if ((tmp_ctn[i + dst->size] = strdup(org->container[i])) ==
396 for (j = 0; j < i + dst->size; ++j)
404 free(dst->container);
406 dst->container = tmp_ctn;
407 dst->capacity = tmp_cap;
408 dst->size += org->size;
414 * @brief Get new allocated flat string from vector between begin and end.
416 * If r_len is not NULL, string length will be returned.
417 * @return NULL at failed or NUL terminated new allocated string.
420 vector_str_substr(const struct vector_str *v, size_t begin, size_t end,
426 if (v == NULL || begin > end)
430 for (i = begin; i < end + 1; ++i)
431 len += strlen(v->container[i]);
433 if ((rtn = malloc(sizeof(char) * (len + 1))) == NULL)
440 for (i = begin; i < end + 1; ++i) {
441 len = strlen(v->container[i]);
442 memcpy(rtn + cur, v->container[i], len);
450 static void cpp_demangle_data_dest(struct cpp_demangle_data *);
451 static int cpp_demangle_data_init(struct cpp_demangle_data *,
453 static int cpp_demangle_get_subst(struct cpp_demangle_data *, size_t);
454 static int cpp_demangle_get_tmpl_param(struct cpp_demangle_data *, size_t);
455 static int cpp_demangle_push_fp(struct cpp_demangle_data *,
456 char *(*)(const char *, size_t));
457 static int cpp_demangle_push_str(struct cpp_demangle_data *, const char *,
459 static int cpp_demangle_pop_str(struct cpp_demangle_data *);
460 static int cpp_demangle_push_subst(struct cpp_demangle_data *,
461 const char *, size_t);
462 static int cpp_demangle_push_subst_v(struct cpp_demangle_data *,
463 struct vector_str *);
464 static int cpp_demangle_push_type_qualifier(struct cpp_demangle_data *,
465 struct vector_type_qualifier *, const char *);
466 static int cpp_demangle_read_array(struct cpp_demangle_data *);
467 static int cpp_demangle_read_encoding(struct cpp_demangle_data *);
468 static int cpp_demangle_read_expr_primary(struct cpp_demangle_data *);
469 static int cpp_demangle_read_expression(struct cpp_demangle_data *);
470 static int cpp_demangle_read_expression_flat(struct cpp_demangle_data *,
472 static int cpp_demangle_read_expression_binary(struct cpp_demangle_data *,
473 const char *, size_t);
474 static int cpp_demangle_read_expression_unary(struct cpp_demangle_data *,
475 const char *, size_t);
476 static int cpp_demangle_read_expression_trinary(struct cpp_demangle_data *,
477 const char *, size_t, const char *, size_t);
478 static int cpp_demangle_read_function(struct cpp_demangle_data *, int *,
479 struct vector_type_qualifier *);
480 static int cpp_demangle_local_source_name(struct cpp_demangle_data *ddata);
481 static int cpp_demangle_read_local_name(struct cpp_demangle_data *);
482 static int cpp_demangle_read_name(struct cpp_demangle_data *);
483 static int cpp_demangle_read_name_flat(struct cpp_demangle_data *,
485 static int cpp_demangle_read_nested_name(struct cpp_demangle_data *);
486 static int cpp_demangle_read_number(struct cpp_demangle_data *, long *);
487 static int cpp_demangle_read_number_as_string(struct cpp_demangle_data *,
489 static int cpp_demangle_read_nv_offset(struct cpp_demangle_data *);
490 static int cpp_demangle_read_offset(struct cpp_demangle_data *);
491 static int cpp_demangle_read_offset_number(struct cpp_demangle_data *);
492 static int cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *,
493 struct vector_type_qualifier *);
494 static int cpp_demangle_read_sname(struct cpp_demangle_data *);
495 static int cpp_demangle_read_subst(struct cpp_demangle_data *);
496 static int cpp_demangle_read_subst_std(struct cpp_demangle_data *);
497 static int cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *,
499 static int cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *);
500 static int cpp_demangle_read_tmpl_args(struct cpp_demangle_data *);
501 static int cpp_demangle_read_tmpl_param(struct cpp_demangle_data *);
502 static int cpp_demangle_read_type(struct cpp_demangle_data *,
503 struct type_delimit *);
504 static int cpp_demangle_read_type_flat(struct cpp_demangle_data *,
506 static int cpp_demangle_read_uqname(struct cpp_demangle_data *);
507 static int cpp_demangle_read_v_offset(struct cpp_demangle_data *);
508 static char *decode_fp_to_double(const char *, size_t);
509 static char *decode_fp_to_float(const char *, size_t);
510 static char *decode_fp_to_float128(const char *, size_t);
511 static char *decode_fp_to_float80(const char *, size_t);
512 static char *decode_fp_to_long_double(const char *, size_t);
513 static int hex_to_dec(char);
514 static void vector_read_cmd_dest(struct vector_read_cmd *);
515 static struct read_cmd_item *vector_read_cmd_find(struct vector_read_cmd *,
517 static int vector_read_cmd_init(struct vector_read_cmd *);
518 static int vector_read_cmd_pop(struct vector_read_cmd *);
519 static int vector_read_cmd_push(struct vector_read_cmd *, enum read_cmd,
521 static void vector_type_qualifier_dest(struct vector_type_qualifier *);
522 static int vector_type_qualifier_init(struct vector_type_qualifier *);
523 static int vector_type_qualifier_push(struct vector_type_qualifier *,
524 enum type_qualifier);
527 * @brief Decode the input string by IA-64 C++ ABI style.
529 * GNU GCC v3 use IA-64 standard ABI.
530 * @return New allocated demangled string or NULL if failed.
531 * @todo 1. Testing and more test case. 2. Code cleaning.
534 __cxa_demangle_gnu3(const char *org)
536 struct cpp_demangle_data ddata;
537 struct vector_str ret_type;
538 struct type_delimit td;
542 bool has_ret = false, more_type = false;
547 org_len = strlen(org);
548 // Try demangling as a type for short encodings
549 if ((org_len < 2) || (org[0] != '_' || org[1] != 'Z' )) {
550 if (!cpp_demangle_data_init(&ddata, org))
552 if (!cpp_demangle_read_type(&ddata, 0))
554 rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL);
557 if (org_len > 11 && !strncmp(org, "_GLOBAL__I_", 11)) {
558 if ((rtn = malloc(org_len + 19)) == NULL)
560 snprintf(rtn, org_len + 19,
561 "global constructors keyed to %s", org + 11);
565 if (!cpp_demangle_data_init(&ddata, org + 2))
568 if (!cpp_demangle_read_encoding(&ddata))
572 * Pop function name from substitution candidate list.
574 if (*ddata.cur != 0 && ddata.subst.size >= 1) {
575 if (!vector_str_pop(&ddata.subst))
584 * The first type is a return type if we just demangled template
585 * args. (the template args is right next to the function name,
586 * which means it's a template function)
589 ddata.is_tmpl = false;
590 if (!vector_str_init(&ret_type))
592 ddata.cur_output = &ret_type;
596 while (*ddata.cur != '\0') {
598 * Breaking at some gcc info at tail. e.g) @@GLIBCXX_3.4
600 if (*ddata.cur == '@' && *(ddata.cur + 1) == '@')
604 /* Read return type */
605 if (!cpp_demangle_read_type(&ddata, NULL))
608 /* Read function arg type */
609 if (!cpp_demangle_read_type(&ddata, &td))
614 /* Push return type to the beginning */
615 if (!VEC_PUSH_STR(&ret_type, " "))
617 if (!vector_str_push_vector_head(&ddata.output,
620 ddata.cur_output = &ddata.output;
621 vector_str_dest(&ret_type);
624 } else if (more_type)
626 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
632 if (ddata.output.size == 0)
634 if (td.paren && !VEC_PUSH_STR(&ddata.output, ")"))
636 if (ddata.mem_vat && !VEC_PUSH_STR(&ddata.output, " volatile"))
638 if (ddata.mem_cst && !VEC_PUSH_STR(&ddata.output, " const"))
640 if (ddata.mem_rst && !VEC_PUSH_STR(&ddata.output, " restrict"))
642 if (ddata.mem_ref && !VEC_PUSH_STR(&ddata.output, " &"))
644 if (ddata.mem_rref && !VEC_PUSH_STR(&ddata.output, " &&"))
647 rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL);
651 vector_str_dest(&ret_type);
653 cpp_demangle_data_dest(&ddata);
659 cpp_demangle_data_dest(struct cpp_demangle_data *d)
665 vector_read_cmd_dest(&d->cmd);
666 vector_str_dest(&d->class_type);
667 vector_str_dest(&d->tmpl);
668 vector_str_dest(&d->subst);
669 vector_str_dest(&d->output);
673 cpp_demangle_data_init(struct cpp_demangle_data *d, const char *cur)
676 if (d == NULL || cur == NULL)
679 if (!vector_str_init(&d->output))
681 if (!vector_str_init(&d->subst))
683 if (!vector_str_init(&d->tmpl))
685 if (!vector_str_init(&d->class_type))
687 if (!vector_read_cmd_init(&d->cmd))
690 assert(d->output.container != NULL);
691 assert(d->subst.container != NULL);
692 assert(d->tmpl.container != NULL);
693 assert(d->class_type.container != NULL);
701 d->is_functype = false;
702 d->ref_qualifier = false;
703 d->push_qualifier = PUSH_ALL_QUALIFIER;
706 d->cur_output = &d->output;
707 d->last_sname = NULL;
712 vector_str_dest(&d->class_type);
714 vector_str_dest(&d->tmpl);
716 vector_str_dest(&d->subst);
718 vector_str_dest(&d->output);
724 cpp_demangle_push_fp(struct cpp_demangle_data *ddata,
725 char *(*decoder)(const char *, size_t))
732 if (ddata == NULL || decoder == NULL)
736 while (*ddata->cur != 'E')
739 if ((f = decoder(fp, ddata->cur - fp)) == NULL)
743 if ((len = strlen(f)) > 0)
744 rtn = cpp_demangle_push_str(ddata, f, len);
754 cpp_demangle_push_str(struct cpp_demangle_data *ddata, const char *str,
758 if (ddata == NULL || str == NULL || len == 0)
762 * is_tmpl is used to check if the type (function arg) is right next
763 * to template args, and should always be cleared whenever new string
766 ddata->is_tmpl = false;
768 return (vector_str_push(ddata->cur_output, str, len));
772 cpp_demangle_pop_str(struct cpp_demangle_data *ddata)
778 return (vector_str_pop(ddata->cur_output));
782 cpp_demangle_push_subst(struct cpp_demangle_data *ddata, const char *str,
786 if (ddata == NULL || str == NULL || len == 0)
789 if (!vector_str_find(&ddata->subst, str, len))
790 return (vector_str_push(&ddata->subst, str, len));
796 cpp_demangle_push_subst_v(struct cpp_demangle_data *ddata, struct vector_str *v)
802 if (ddata == NULL || v == NULL)
805 if ((str = vector_str_get_flat(v, &str_len)) == NULL)
808 rtn = cpp_demangle_push_subst(ddata, str, str_len);
816 cpp_demangle_push_type_qualifier(struct cpp_demangle_data *ddata,
817 struct vector_type_qualifier *v, const char *type_str)
819 struct vector_str subst_v;
820 enum type_qualifier t;
821 size_t idx, e_idx, e_len;
826 if (ddata == NULL || v == NULL)
829 if ((idx = v->size) == 0)
833 if (type_str != NULL) {
834 if (!vector_str_init(&subst_v))
836 if (!VEC_PUSH_STR(&subst_v, type_str))
843 switch (v->q_container[idx - 1]) {
846 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
848 if (!DEM_PUSH_STR(ddata, "*"))
850 if (type_str != NULL) {
851 if (!VEC_PUSH_STR(&subst_v, "*"))
853 if (!cpp_demangle_push_subst_v(ddata,
861 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
863 if (!DEM_PUSH_STR(ddata, "&"))
865 if (type_str != NULL) {
866 if (!VEC_PUSH_STR(&subst_v, "&"))
868 if (!cpp_demangle_push_subst_v(ddata,
876 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
878 if (!DEM_PUSH_STR(ddata, "&&"))
880 if (type_str != NULL) {
881 if (!VEC_PUSH_STR(&subst_v, "&&"))
883 if (!cpp_demangle_push_subst_v(ddata,
891 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
893 if (!DEM_PUSH_STR(ddata, " complex"))
895 if (type_str != NULL) {
896 if (!VEC_PUSH_STR(&subst_v, " complex"))
898 if (!cpp_demangle_push_subst_v(ddata,
906 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
908 if (!DEM_PUSH_STR(ddata, " imaginary"))
910 if (type_str != NULL) {
911 if (!VEC_PUSH_STR(&subst_v, " imaginary"))
913 if (!cpp_demangle_push_subst_v(ddata,
921 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
923 if (v->ext_name.size == 0 ||
924 e_idx > v->ext_name.size - 1)
926 if ((e_len = strlen(v->ext_name.container[e_idx])) ==
929 if ((buf = malloc(e_len + 2)) == NULL)
931 snprintf(buf, e_len + 2, " %s",
932 v->ext_name.container[e_idx]);
934 if (!DEM_PUSH_STR(ddata, buf)) {
939 if (type_str != NULL) {
940 if (!VEC_PUSH_STR(&subst_v, buf)) {
944 if (!cpp_demangle_push_subst_v(ddata,
955 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
958 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
960 if (!DEM_PUSH_STR(ddata, " restrict"))
962 if (type_str != NULL) {
963 if (!VEC_PUSH_STR(&subst_v, " restrict"))
966 t = v->q_container[idx - 2];
967 if (t == TYPE_RST || t == TYPE_VAT ||
971 if (!cpp_demangle_push_subst_v(ddata,
978 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
981 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
983 if (!DEM_PUSH_STR(ddata, " volatile"))
985 if (type_str != NULL) {
986 if (!VEC_PUSH_STR(&subst_v, " volatile"))
989 t = v->q_container[idx - 2];
990 if (t == TYPE_RST || t == TYPE_VAT ||
994 if (!cpp_demangle_push_subst_v(ddata,
1001 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
1004 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
1006 if (!DEM_PUSH_STR(ddata, " const"))
1008 if (type_str != NULL) {
1009 if (!VEC_PUSH_STR(&subst_v, " const"))
1012 t = v->q_container[idx - 2];
1013 if (t == TYPE_RST || t == TYPE_VAT ||
1017 if (!cpp_demangle_push_subst_v(ddata,
1025 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
1027 if (v->ext_name.size == 0 ||
1028 e_idx > v->ext_name.size - 1)
1030 if ((e_len = strlen(v->ext_name.container[e_idx])) ==
1033 if ((buf = malloc(e_len + 12)) == NULL)
1035 snprintf(buf, e_len + 12, " __vector(%s)",
1036 v->ext_name.container[e_idx]);
1037 if (!DEM_PUSH_STR(ddata, buf)) {
1041 if (type_str != NULL) {
1042 if (!VEC_PUSH_STR(&subst_v, buf)) {
1046 if (!cpp_demangle_push_subst_v(ddata,
1061 if (type_str != NULL)
1062 vector_str_dest(&subst_v);
1068 cpp_demangle_get_subst(struct cpp_demangle_data *ddata, size_t idx)
1072 if (ddata == NULL || ddata->subst.size <= idx)
1074 if ((len = strlen(ddata->subst.container[idx])) == 0)
1076 if (!cpp_demangle_push_str(ddata, ddata->subst.container[idx], len))
1086 cpp_demangle_get_tmpl_param(struct cpp_demangle_data *ddata, size_t idx)
1090 if (ddata == NULL || ddata->tmpl.size <= idx)
1092 if ((len = strlen(ddata->tmpl.container[idx])) == 0)
1094 if (!cpp_demangle_push_str(ddata, ddata->tmpl.container[idx], len))
1103 cpp_demangle_read_array(struct cpp_demangle_data *ddata)
1105 size_t i, num_len, exp_len, p_idx, idx;
1109 if (ddata == NULL || *(++ddata->cur) == '\0')
1112 if (*ddata->cur == '_') {
1113 if (*(++ddata->cur) == '\0')
1116 if (!cpp_demangle_read_type(ddata, NULL))
1119 if (!DEM_PUSH_STR(ddata, " []"))
1122 if (ELFTC_ISDIGIT(*ddata->cur) != 0) {
1124 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1126 if (*ddata->cur != '_')
1128 num_len = ddata->cur - num;
1129 assert(num_len > 0);
1130 if (*(++ddata->cur) == '\0')
1132 if (!cpp_demangle_read_type(ddata, NULL))
1134 if (!DEM_PUSH_STR(ddata, " ["))
1136 if (!cpp_demangle_push_str(ddata, num, num_len))
1138 if (!DEM_PUSH_STR(ddata, "]"))
1141 p_idx = ddata->output.size;
1142 if (!cpp_demangle_read_expression(ddata))
1144 if ((exp = vector_str_substr(&ddata->output, p_idx,
1145 ddata->output.size - 1, &exp_len)) == NULL)
1147 idx = ddata->output.size;
1148 for (i = p_idx; i < idx; ++i)
1149 if (!vector_str_pop(&ddata->output)) {
1153 if (*ddata->cur != '_') {
1158 if (*ddata->cur == '\0') {
1162 if (!cpp_demangle_read_type(ddata, NULL)) {
1166 if (!DEM_PUSH_STR(ddata, " [")) {
1170 if (!cpp_demangle_push_str(ddata, exp, exp_len)) {
1174 if (!DEM_PUSH_STR(ddata, "]")) {
1186 cpp_demangle_read_expr_primary(struct cpp_demangle_data *ddata)
1190 if (ddata == NULL || *(++ddata->cur) == '\0')
1193 if (*ddata->cur == '_' && *(ddata->cur + 1) == 'Z') {
1195 if (*ddata->cur == '\0')
1197 if (!cpp_demangle_read_encoding(ddata))
1203 switch (*ddata->cur) {
1205 if (*(ddata->cur + 2) != 'E')
1207 switch (*(++ddata->cur)) {
1210 return (DEM_PUSH_STR(ddata, "false"));
1213 return (DEM_PUSH_STR(ddata, "true"));
1220 return (cpp_demangle_push_fp(ddata, decode_fp_to_double));
1224 if (sizeof(long double) == 10)
1225 return (cpp_demangle_push_fp(ddata,
1226 decode_fp_to_double));
1227 return (cpp_demangle_push_fp(ddata, decode_fp_to_float80));
1231 return (cpp_demangle_push_fp(ddata, decode_fp_to_float));
1235 if (sizeof(long double) == 16)
1236 return (cpp_demangle_push_fp(ddata,
1237 decode_fp_to_double));
1238 return (cpp_demangle_push_fp(ddata, decode_fp_to_float128));
1249 if (*(++ddata->cur) == 'n') {
1250 if (!DEM_PUSH_STR(ddata, "-"))
1255 while (*ddata->cur != 'E') {
1256 if (!ELFTC_ISDIGIT(*ddata->cur))
1261 return (cpp_demangle_push_str(ddata, num,
1262 ddata->cur - num - 1));
1270 cpp_demangle_read_expression(struct cpp_demangle_data *ddata)
1273 if (ddata == NULL || *ddata->cur == '\0')
1276 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
1277 case SIMPLE_HASH('s', 't'):
1279 return (cpp_demangle_read_type(ddata, NULL));
1281 case SIMPLE_HASH('s', 'r'):
1283 if (!cpp_demangle_read_type(ddata, NULL))
1285 if (!cpp_demangle_read_uqname(ddata))
1287 if (*ddata->cur == 'I')
1288 return (cpp_demangle_read_tmpl_args(ddata));
1291 case SIMPLE_HASH('a', 'a'):
1294 return (cpp_demangle_read_expression_binary(ddata, "&&", 2));
1296 case SIMPLE_HASH('a', 'd'):
1297 /* operator & (unary) */
1299 return (cpp_demangle_read_expression_unary(ddata, "&", 1));
1301 case SIMPLE_HASH('a', 'n'):
1304 return (cpp_demangle_read_expression_binary(ddata, "&", 1));
1306 case SIMPLE_HASH('a', 'N'):
1309 return (cpp_demangle_read_expression_binary(ddata, "&=", 2));
1311 case SIMPLE_HASH('a', 'S'):
1314 return (cpp_demangle_read_expression_binary(ddata, "=", 1));
1316 case SIMPLE_HASH('c', 'l'):
1319 return (cpp_demangle_read_expression_binary(ddata, "()", 2));
1321 case SIMPLE_HASH('c', 'm'):
1324 return (cpp_demangle_read_expression_binary(ddata, ",", 1));
1326 case SIMPLE_HASH('c', 'o'):
1329 return (cpp_demangle_read_expression_binary(ddata, "~", 1));
1331 case SIMPLE_HASH('c', 'v'):
1332 /* operator (cast) */
1334 return (cpp_demangle_read_expression_binary(ddata, "(cast)", 6));
1336 case SIMPLE_HASH('d', 'a'):
1337 /* operator delete [] */
1339 return (cpp_demangle_read_expression_unary(ddata, "delete []", 9));
1341 case SIMPLE_HASH('d', 'e'):
1342 /* operator * (unary) */
1344 return (cpp_demangle_read_expression_unary(ddata, "*", 1));
1346 case SIMPLE_HASH('d', 'l'):
1347 /* operator delete */
1349 return (cpp_demangle_read_expression_unary(ddata, "delete", 6));
1351 case SIMPLE_HASH('d', 'v'):
1354 return (cpp_demangle_read_expression_binary(ddata, "/", 1));
1356 case SIMPLE_HASH('d', 'V'):
1359 return (cpp_demangle_read_expression_binary(ddata, "/=", 2));
1361 case SIMPLE_HASH('e', 'o'):
1364 return (cpp_demangle_read_expression_binary(ddata, "^", 1));
1366 case SIMPLE_HASH('e', 'O'):
1369 return (cpp_demangle_read_expression_binary(ddata, "^=", 2));
1371 case SIMPLE_HASH('e', 'q'):
1374 return (cpp_demangle_read_expression_binary(ddata, "==", 2));
1376 case SIMPLE_HASH('g', 'e'):
1379 return (cpp_demangle_read_expression_binary(ddata, ">=", 2));
1381 case SIMPLE_HASH('g', 't'):
1384 return (cpp_demangle_read_expression_binary(ddata, ">", 1));
1386 case SIMPLE_HASH('i', 'x'):
1389 return (cpp_demangle_read_expression_binary(ddata, "[]", 2));
1391 case SIMPLE_HASH('l', 'e'):
1394 return (cpp_demangle_read_expression_binary(ddata, "<=", 2));
1396 case SIMPLE_HASH('l', 's'):
1399 return (cpp_demangle_read_expression_binary(ddata, "<<", 2));
1401 case SIMPLE_HASH('l', 'S'):
1404 return (cpp_demangle_read_expression_binary(ddata, "<<=", 3));
1406 case SIMPLE_HASH('l', 't'):
1409 return (cpp_demangle_read_expression_binary(ddata, "<", 1));
1411 case SIMPLE_HASH('m', 'i'):
1414 return (cpp_demangle_read_expression_binary(ddata, "-", 1));
1416 case SIMPLE_HASH('m', 'I'):
1419 return (cpp_demangle_read_expression_binary(ddata, "-=", 2));
1421 case SIMPLE_HASH('m', 'l'):
1424 return (cpp_demangle_read_expression_binary(ddata, "*", 1));
1426 case SIMPLE_HASH('m', 'L'):
1429 return (cpp_demangle_read_expression_binary(ddata, "*=", 2));
1431 case SIMPLE_HASH('m', 'm'):
1434 return (cpp_demangle_read_expression_binary(ddata, "--", 2));
1436 case SIMPLE_HASH('n', 'a'):
1437 /* operator new[] */
1439 return (cpp_demangle_read_expression_unary(ddata, "new []", 6));
1441 case SIMPLE_HASH('n', 'e'):
1444 return (cpp_demangle_read_expression_binary(ddata, "!=", 2));
1446 case SIMPLE_HASH('n', 'g'):
1447 /* operator - (unary) */
1449 return (cpp_demangle_read_expression_unary(ddata, "-", 1));
1451 case SIMPLE_HASH('n', 't'):
1454 return (cpp_demangle_read_expression_binary(ddata, "!", 1));
1456 case SIMPLE_HASH('n', 'w'):
1459 return (cpp_demangle_read_expression_unary(ddata, "new", 3));
1461 case SIMPLE_HASH('o', 'o'):
1464 return (cpp_demangle_read_expression_binary(ddata, "||", 2));
1466 case SIMPLE_HASH('o', 'r'):
1469 return (cpp_demangle_read_expression_binary(ddata, "|", 1));
1471 case SIMPLE_HASH('o', 'R'):
1474 return (cpp_demangle_read_expression_binary(ddata, "|=", 2));
1476 case SIMPLE_HASH('p', 'l'):
1479 return (cpp_demangle_read_expression_binary(ddata, "+", 1));
1481 case SIMPLE_HASH('p', 'L'):
1484 return (cpp_demangle_read_expression_binary(ddata, "+=", 2));
1486 case SIMPLE_HASH('p', 'm'):
1489 return (cpp_demangle_read_expression_binary(ddata, "->*", 3));
1491 case SIMPLE_HASH('p', 'p'):
1494 return (cpp_demangle_read_expression_binary(ddata, "++", 2));
1496 case SIMPLE_HASH('p', 's'):
1497 /* operator + (unary) */
1499 return (cpp_demangle_read_expression_unary(ddata, "+", 1));
1501 case SIMPLE_HASH('p', 't'):
1504 return (cpp_demangle_read_expression_binary(ddata, "->", 2));
1506 case SIMPLE_HASH('q', 'u'):
1509 return (cpp_demangle_read_expression_trinary(ddata, "?", 1,
1512 case SIMPLE_HASH('r', 'm'):
1515 return (cpp_demangle_read_expression_binary(ddata, "%", 1));
1517 case SIMPLE_HASH('r', 'M'):
1520 return (cpp_demangle_read_expression_binary(ddata, "%=", 2));
1522 case SIMPLE_HASH('r', 's'):
1525 return (cpp_demangle_read_expression_binary(ddata, ">>", 2));
1527 case SIMPLE_HASH('r', 'S'):
1530 return (cpp_demangle_read_expression_binary(ddata, ">>=", 3));
1532 case SIMPLE_HASH('r', 'z'):
1533 /* operator sizeof */
1535 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
1537 case SIMPLE_HASH('s', 'v'):
1538 /* operator sizeof */
1540 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
1543 switch (*ddata->cur) {
1545 return (cpp_demangle_read_expr_primary(ddata));
1547 return (cpp_demangle_read_tmpl_param(ddata));
1554 cpp_demangle_read_expression_flat(struct cpp_demangle_data *ddata, char **str)
1556 struct vector_str *output;
1557 size_t i, p_idx, idx, exp_len;
1560 output = &ddata->output;
1562 p_idx = output->size;
1564 if (!cpp_demangle_read_expression(ddata))
1567 if ((exp = vector_str_substr(output, p_idx, output->size - 1,
1572 for (i = p_idx; i < idx; ++i) {
1573 if (!vector_str_pop(output)) {
1585 cpp_demangle_read_expression_binary(struct cpp_demangle_data *ddata,
1586 const char *name, size_t len)
1589 if (ddata == NULL || name == NULL || len == 0)
1591 if (!cpp_demangle_read_expression(ddata))
1593 if (!cpp_demangle_push_str(ddata, name, len))
1596 return (cpp_demangle_read_expression(ddata));
1600 cpp_demangle_read_expression_unary(struct cpp_demangle_data *ddata,
1601 const char *name, size_t len)
1604 if (ddata == NULL || name == NULL || len == 0)
1606 if (!cpp_demangle_read_expression(ddata))
1609 return (cpp_demangle_push_str(ddata, name, len));
1613 cpp_demangle_read_expression_trinary(struct cpp_demangle_data *ddata,
1614 const char *name1, size_t len1, const char *name2, size_t len2)
1617 if (ddata == NULL || name1 == NULL || len1 == 0 || name2 == NULL ||
1621 if (!cpp_demangle_read_expression(ddata))
1623 if (!cpp_demangle_push_str(ddata, name1, len1))
1625 if (!cpp_demangle_read_expression(ddata))
1627 if (!cpp_demangle_push_str(ddata, name2, len2))
1630 return (cpp_demangle_read_expression(ddata));
1634 cpp_demangle_read_function(struct cpp_demangle_data *ddata, int *ext_c,
1635 struct vector_type_qualifier *v)
1637 struct type_delimit td;
1638 struct read_cmd_item *rc;
1639 size_t class_type_size, class_type_len, limit;
1640 const char *class_type;
1642 bool paren, non_cv_qualifier;
1644 if (ddata == NULL || *ddata->cur != 'F' || v == NULL)
1648 if (*ddata->cur == 'Y') {
1655 if (!cpp_demangle_read_type(ddata, NULL))
1658 if (*ddata->cur != 'E') {
1659 if (!DEM_PUSH_STR(ddata, " "))
1662 non_cv_qualifier = false;
1664 for (i = 0; (size_t) i < v->size; i++) {
1665 if (v->q_container[i] != TYPE_RST &&
1666 v->q_container[i] != TYPE_VAT &&
1667 v->q_container[i] != TYPE_CST) {
1668 non_cv_qualifier = true;
1675 rc = vector_read_cmd_find(&ddata->cmd, READ_PTRMEM);
1676 if (non_cv_qualifier || rc != NULL) {
1677 if (!DEM_PUSH_STR(ddata, "("))
1682 /* Push non-cv qualifiers. */
1683 ddata->push_qualifier = PUSH_NON_CV_QUALIFIER;
1684 if (!cpp_demangle_push_type_qualifier(ddata, v, NULL))
1688 if (non_cv_qualifier && !DEM_PUSH_STR(ddata, " "))
1690 if ((class_type_size = ddata->class_type.size) == 0)
1693 ddata->class_type.container[class_type_size - 1];
1694 if (class_type == NULL)
1696 if ((class_type_len = strlen(class_type)) == 0)
1698 if (!cpp_demangle_push_str(ddata, class_type,
1701 if (!DEM_PUSH_STR(ddata, "::*"))
1703 /* Push pointer-to-member qualifiers. */
1704 ddata->push_qualifier = PUSH_ALL_QUALIFIER;
1705 if (!cpp_demangle_push_type_qualifier(ddata, rc->data,
1712 if (!DEM_PUSH_STR(ddata, ")"))
1720 ddata->is_functype = true;
1722 if (!cpp_demangle_read_type(ddata, &td))
1724 if (*ddata->cur == 'E')
1726 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1729 ddata->is_functype = false;
1731 if (!DEM_PUSH_STR(ddata, ")"))
1736 /* Push CV qualifiers. */
1737 ddata->push_qualifier = PUSH_CV_QUALIFIER;
1738 if (!cpp_demangle_push_type_qualifier(ddata, v, NULL))
1741 ddata->push_qualifier = PUSH_ALL_QUALIFIER;
1743 /* Release type qualifier vector. */
1744 vector_type_qualifier_dest(v);
1745 if (!vector_type_qualifier_init(v))
1748 /* Push ref-qualifiers. */
1749 if (ddata->ref_qualifier) {
1750 switch (ddata->ref_qualifier_type) {
1752 if (!DEM_PUSH_STR(ddata, " &"))
1756 if (!DEM_PUSH_STR(ddata, " &&"))
1762 ddata->ref_qualifier = false;
1771 /* read encoding, encoding are function name, data name, special-name */
1773 cpp_demangle_read_encoding(struct cpp_demangle_data *ddata)
1775 char *name, *type, *num_str;
1779 if (ddata == NULL || *ddata->cur == '\0')
1783 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
1784 case SIMPLE_HASH('G', 'A'):
1785 if (!DEM_PUSH_STR(ddata, "hidden alias for "))
1788 if (*ddata->cur == '\0')
1790 return (cpp_demangle_read_encoding(ddata));
1792 case SIMPLE_HASH('G', 'R'):
1793 if (!DEM_PUSH_STR(ddata, "reference temporary #"))
1796 if (*ddata->cur == '\0')
1798 if (!cpp_demangle_read_name_flat(ddata, &name))
1801 if (!cpp_demangle_read_number_as_string(ddata, &num_str))
1803 if (!DEM_PUSH_STR(ddata, num_str))
1805 if (!DEM_PUSH_STR(ddata, " for "))
1807 if (!DEM_PUSH_STR(ddata, name))
1816 case SIMPLE_HASH('G', 'T'):
1818 if (*ddata->cur == '\0')
1820 switch (*ddata->cur) {
1822 if (!DEM_PUSH_STR(ddata, "non-transaction clone for "))
1827 if (!DEM_PUSH_STR(ddata, "transaction clone for "))
1832 return (cpp_demangle_read_encoding(ddata));
1834 case SIMPLE_HASH('G', 'V'):
1835 /* sentry object for 1 time init */
1836 if (!DEM_PUSH_STR(ddata, "guard variable for "))
1841 case SIMPLE_HASH('T', 'c'):
1842 /* virtual function covariant override thunk */
1843 if (!DEM_PUSH_STR(ddata,
1844 "virtual function covariant override "))
1847 if (*ddata->cur == '\0')
1849 if (!cpp_demangle_read_offset(ddata))
1851 if (!cpp_demangle_read_offset(ddata))
1853 return (cpp_demangle_read_encoding(ddata));
1855 case SIMPLE_HASH('T', 'C'):
1856 /* construction vtable */
1857 if (!DEM_PUSH_STR(ddata, "construction vtable for "))
1860 if (*ddata->cur == '\0')
1862 if (!cpp_demangle_read_type_flat(ddata, &type))
1865 if (!cpp_demangle_read_number(ddata, &offset))
1867 if (*ddata->cur++ != '_')
1869 if (!cpp_demangle_read_type(ddata, NULL))
1871 if (!DEM_PUSH_STR(ddata, "-in-"))
1873 if (!DEM_PUSH_STR(ddata, type))
1880 case SIMPLE_HASH('T', 'D'):
1881 /* typeinfo common proxy */
1884 case SIMPLE_HASH('T', 'F'):
1886 if (!DEM_PUSH_STR(ddata, "typeinfo fn for "))
1889 if (*ddata->cur == '\0')
1891 return (cpp_demangle_read_type(ddata, NULL));
1893 case SIMPLE_HASH('T', 'h'):
1894 /* virtual function non-virtual override thunk */
1895 if (!DEM_PUSH_STR(ddata,
1896 "virtual function non-virtual override "))
1899 if (*ddata->cur == '\0')
1901 if (!cpp_demangle_read_nv_offset(ddata))
1903 return (cpp_demangle_read_encoding(ddata));
1905 case SIMPLE_HASH('T', 'H'):
1906 /* TLS init function */
1907 if (!DEM_PUSH_STR(ddata, "TLS init function for "))
1910 if (*ddata->cur == '\0')
1914 case SIMPLE_HASH('T', 'I'):
1915 /* typeinfo structure */
1916 if (!DEM_PUSH_STR(ddata, "typeinfo for "))
1919 if (*ddata->cur == '\0')
1921 return (cpp_demangle_read_type(ddata, NULL));
1923 case SIMPLE_HASH('T', 'J'):
1925 if (!DEM_PUSH_STR(ddata, "java Class for "))
1928 if (*ddata->cur == '\0')
1930 return (cpp_demangle_read_type(ddata, NULL));
1932 case SIMPLE_HASH('T', 'S'):
1933 /* RTTI name (NTBS) */
1934 if (!DEM_PUSH_STR(ddata, "typeinfo name for "))
1937 if (*ddata->cur == '\0')
1939 return (cpp_demangle_read_type(ddata, NULL));
1941 case SIMPLE_HASH('T', 'T'):
1943 if (!DEM_PUSH_STR(ddata, "VTT for "))
1946 if (*ddata->cur == '\0')
1948 return (cpp_demangle_read_type(ddata, NULL));
1950 case SIMPLE_HASH('T', 'v'):
1951 /* virtual function virtual override thunk */
1952 if (!DEM_PUSH_STR(ddata, "virtual function virtual override "))
1955 if (*ddata->cur == '\0')
1957 if (!cpp_demangle_read_v_offset(ddata))
1959 return (cpp_demangle_read_encoding(ddata));
1961 case SIMPLE_HASH('T', 'V'):
1963 if (!DEM_PUSH_STR(ddata, "vtable for "))
1966 if (*ddata->cur == '\0')
1968 return (cpp_demangle_read_type(ddata, NULL));
1970 case SIMPLE_HASH('T', 'W'):
1971 /* TLS wrapper function */
1972 if (!DEM_PUSH_STR(ddata, "TLS wrapper function for "))
1975 if (*ddata->cur == '\0')
1980 return (cpp_demangle_read_name(ddata));
1984 cpp_demangle_read_local_name(struct cpp_demangle_data *ddata)
1986 struct vector_str local_name;
1987 struct type_delimit td;
1993 if (*(++ddata->cur) == '\0')
1996 if (!vector_str_init(&local_name))
1998 ddata->cur_output = &local_name;
2000 if (!cpp_demangle_read_encoding(ddata)) {
2001 vector_str_dest(&local_name);
2005 ddata->cur_output = &ddata->output;
2013 * The first type is a return type if we just demangled template
2014 * args. (the template args is right next to the function name,
2015 * which means it's a template function)
2017 if (ddata->is_tmpl) {
2018 ddata->is_tmpl = false;
2020 /* Read return type */
2021 if (!cpp_demangle_read_type(ddata, NULL)) {
2022 vector_str_dest(&local_name);
2029 /* Now we can push the name after possible return type is handled. */
2030 if (!vector_str_push_vector(&ddata->output, &local_name)) {
2031 vector_str_dest(&local_name);
2034 vector_str_dest(&local_name);
2036 while (*ddata->cur != '\0') {
2037 if (!cpp_demangle_read_type(ddata, &td))
2041 if (*ddata->cur == 'E')
2043 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2049 if (*(++ddata->cur) == '\0')
2051 if (td.paren == true) {
2052 if (!DEM_PUSH_STR(ddata, ")"))
2056 if (*ddata->cur == 's')
2059 if (!DEM_PUSH_STR(ddata, "::"))
2061 if (!cpp_demangle_read_name(ddata))
2064 if (*ddata->cur == '_') {
2066 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
2074 cpp_demangle_read_name(struct cpp_demangle_data *ddata)
2076 struct vector_str *output, v;
2077 size_t p_idx, subst_str_len;
2081 if (ddata == NULL || *ddata->cur == '\0')
2084 output = ddata->cur_output;
2088 switch (*ddata->cur) {
2090 return (cpp_demangle_read_subst(ddata));
2092 return (cpp_demangle_read_nested_name(ddata));
2094 return (cpp_demangle_read_local_name(ddata));
2097 if (!vector_str_init(&v))
2100 p_idx = output->size;
2102 if (!cpp_demangle_read_uqname(ddata))
2104 if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2105 &subst_str_len)) == NULL)
2107 if (subst_str_len > 8 && strstr(subst_str, "operator") != NULL) {
2111 if (!vector_str_push(&v, subst_str, subst_str_len))
2113 if (!cpp_demangle_push_subst_v(ddata, &v))
2116 if (*ddata->cur == 'I') {
2117 p_idx = output->size;
2118 if (!cpp_demangle_read_tmpl_args(ddata))
2121 if ((subst_str = vector_str_substr(output, p_idx,
2122 output->size - 1, &subst_str_len)) == NULL)
2124 if (!vector_str_push(&v, subst_str, subst_str_len))
2126 if (!cpp_demangle_push_subst_v(ddata, &v))
2134 vector_str_dest(&v);
2140 cpp_demangle_read_name_flat(struct cpp_demangle_data *ddata, char **str)
2142 struct vector_str *output;
2143 size_t i, p_idx, idx, name_len;
2146 output = ddata->cur_output;
2148 p_idx = output->size;
2150 if (!cpp_demangle_read_name(ddata))
2153 if ((name = vector_str_substr(output, p_idx, output->size - 1,
2154 &name_len)) == NULL)
2158 for (i = p_idx; i < idx; ++i) {
2159 if (!vector_str_pop(output)) {
2171 cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
2173 struct vector_str *output, v;
2174 size_t limit, p_idx, subst_str_len;
2178 if (ddata == NULL || *ddata->cur != 'N')
2180 if (*(++ddata->cur) == '\0')
2184 switch (*ddata->cur) {
2186 ddata->mem_rst = true;
2189 ddata->mem_vat = true;
2192 ddata->mem_cst = true;
2195 ddata->mem_ref = true;
2198 ddata->mem_rref = true;
2203 } while (*(++ddata->cur));
2206 output = ddata->cur_output;
2207 if (!vector_str_init(&v))
2213 p_idx = output->size;
2214 switch (*ddata->cur) {
2216 if (!cpp_demangle_read_tmpl_args(ddata))
2220 if (!cpp_demangle_read_subst(ddata))
2224 if (!cpp_demangle_read_tmpl_param(ddata))
2228 if (!cpp_demangle_read_uqname(ddata))
2232 if (p_idx == output->size)
2234 if ((subst_str = vector_str_substr(output, p_idx,
2235 output->size - 1, &subst_str_len)) == NULL)
2237 if (!vector_str_push(&v, subst_str, subst_str_len)) {
2243 if (!cpp_demangle_push_subst_v(ddata, &v))
2247 if (*ddata->cur == 'E')
2249 else if (*ddata->cur != 'I' && *ddata->cur != 'C' &&
2250 *ddata->cur != 'D' && p_idx != output->size) {
2251 if (!DEM_PUSH_STR(ddata, "::"))
2253 if (!VEC_PUSH_STR(&v, "::"))
2256 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2264 vector_str_dest(&v);
2271 * number ::= [n] <decimal>
2274 cpp_demangle_read_number(struct cpp_demangle_data *ddata, long *rtn)
2276 long len, negative_factor;
2278 if (ddata == NULL || rtn == NULL)
2281 negative_factor = 1;
2282 if (*ddata->cur == 'n') {
2283 negative_factor = -1;
2287 if (ELFTC_ISDIGIT(*ddata->cur) == 0)
2291 if ((len = strtol(ddata->cur, (char **) NULL, 10)) == 0 &&
2295 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
2299 assert(negative_factor == 1 || negative_factor == -1);
2301 *rtn = len * negative_factor;
2307 cpp_demangle_read_number_as_string(struct cpp_demangle_data *ddata, char **str)
2311 if (!cpp_demangle_read_number(ddata, &n)) {
2316 if (asprintf(str, "%ld", n) < 0) {
2325 cpp_demangle_read_nv_offset(struct cpp_demangle_data *ddata)
2331 if (!DEM_PUSH_STR(ddata, "offset : "))
2334 return (cpp_demangle_read_offset_number(ddata));
2337 /* read offset, offset are nv-offset, v-offset */
2339 cpp_demangle_read_offset(struct cpp_demangle_data *ddata)
2345 if (*ddata->cur == 'h') {
2347 return (cpp_demangle_read_nv_offset(ddata));
2348 } else if (*ddata->cur == 'v') {
2350 return (cpp_demangle_read_v_offset(ddata));
2357 cpp_demangle_read_offset_number(struct cpp_demangle_data *ddata)
2362 if (ddata == NULL || *ddata->cur == '\0')
2365 /* offset could be negative */
2366 if (*ddata->cur == 'n') {
2368 start = ddata->cur + 1;
2374 while (*ddata->cur != '_')
2377 if (negative && !DEM_PUSH_STR(ddata, "-"))
2380 assert(start != NULL);
2382 if (!cpp_demangle_push_str(ddata, start, ddata->cur - start))
2384 if (!DEM_PUSH_STR(ddata, " "))
2393 cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *ddata,
2394 struct vector_type_qualifier *v)
2396 size_t class_type_len, i, idx, p_idx;
2397 int p_func_type, rtn;
2400 if (ddata == NULL || *ddata->cur != 'M' || *(++ddata->cur) == '\0')
2403 p_idx = ddata->output.size;
2404 if (!cpp_demangle_read_type(ddata, NULL))
2407 if ((class_type = vector_str_substr(&ddata->output, p_idx,
2408 ddata->output.size - 1, &class_type_len)) == NULL)
2412 idx = ddata->output.size;
2413 for (i = p_idx; i < idx; ++i)
2414 if (!vector_str_pop(&ddata->output))
2417 if (!vector_read_cmd_push(&ddata->cmd, READ_PTRMEM, v))
2420 if (!vector_str_push(&ddata->class_type, class_type, class_type_len))
2423 p_func_type = ddata->func_type;
2424 if (!cpp_demangle_read_type(ddata, NULL))
2427 if (p_func_type == ddata->func_type) {
2428 if (!DEM_PUSH_STR(ddata, " "))
2430 if (!cpp_demangle_push_str(ddata, class_type, class_type_len))
2432 if (!DEM_PUSH_STR(ddata, "::*"))
2438 if (!vector_str_pop(&ddata->class_type))
2441 if (!vector_read_cmd_pop(&ddata->cmd))
2446 vector_type_qualifier_dest(v);
2447 if (!vector_type_qualifier_init(v))
2453 /* read source-name, source-name is <len> <ID> */
2455 cpp_demangle_read_sname(struct cpp_demangle_data *ddata)
2460 if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 ||
2464 if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0))
2465 err = DEM_PUSH_STR(ddata, "(anonymous namespace)");
2467 err = cpp_demangle_push_str(ddata, ddata->cur, len);
2472 assert(ddata->cur_output->size > 0);
2473 if (vector_read_cmd_find(&ddata->cmd, READ_TMPL) == NULL)
2475 ddata->cur_output->container[ddata->output.size - 1];
2483 cpp_demangle_read_subst(struct cpp_demangle_data *ddata)
2487 if (ddata == NULL || *ddata->cur == '\0')
2490 /* abbreviations of the form Sx */
2491 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2492 case SIMPLE_HASH('S', 'a'):
2493 /* std::allocator */
2494 if (!DEM_PUSH_STR(ddata, "std::allocator"))
2497 if (*ddata->cur == 'I')
2498 return (cpp_demangle_read_subst_stdtmpl(ddata,
2502 case SIMPLE_HASH('S', 'b'):
2503 /* std::basic_string */
2504 if (!DEM_PUSH_STR(ddata, "std::basic_string"))
2507 if (*ddata->cur == 'I')
2508 return (cpp_demangle_read_subst_stdtmpl(ddata,
2509 "std::basic_string"));
2512 case SIMPLE_HASH('S', 'd'):
2513 /* std::basic_iostream<char, std::char_traits<char> > */
2514 if (!DEM_PUSH_STR(ddata, "std::basic_iostream<char, "
2515 "std::char_traits<char> >"))
2517 ddata->last_sname = "basic_iostream";
2519 if (*ddata->cur == 'I')
2520 return (cpp_demangle_read_subst_stdtmpl(ddata,
2521 "std::basic_iostream<char, std::char_traits"
2525 case SIMPLE_HASH('S', 'i'):
2526 /* std::basic_istream<char, std::char_traits<char> > */
2527 if (!DEM_PUSH_STR(ddata, "std::basic_istream<char, "
2528 "std::char_traits<char> >"))
2530 ddata->last_sname = "basic_istream";
2532 if (*ddata->cur == 'I')
2533 return (cpp_demangle_read_subst_stdtmpl(ddata,
2534 "std::basic_istream<char, std::char_traits"
2538 case SIMPLE_HASH('S', 'o'):
2539 /* std::basic_ostream<char, std::char_traits<char> > */
2540 if (!DEM_PUSH_STR(ddata, "std::basic_ostream<char, "
2541 "std::char_traits<char> >"))
2543 ddata->last_sname = "basic_ostream";
2545 if (*ddata->cur == 'I')
2546 return (cpp_demangle_read_subst_stdtmpl(ddata,
2547 "std::basic_ostream<char, std::char_traits"
2551 case SIMPLE_HASH('S', 's'):
2553 * std::basic_string<char, std::char_traits<char>,
2554 * std::allocator<char> >
2558 if (!DEM_PUSH_STR(ddata, "std::basic_string<char, "
2559 "std::char_traits<char>, std::allocator<char> >"))
2561 ddata->last_sname = "string";
2563 if (*ddata->cur == 'I')
2564 return (cpp_demangle_read_subst_stdtmpl(ddata,
2565 "std::basic_string<char, std::char_traits<char>,"
2566 " std::allocator<char> >"));
2569 case SIMPLE_HASH('S', 't'):
2571 return (cpp_demangle_read_subst_std(ddata));
2574 if (*(++ddata->cur) == '\0')
2577 /* Skip unknown substitution abbreviations. */
2578 if (!(*ddata->cur >= '0' && *ddata->cur <= '9') &&
2579 !(*ddata->cur >= 'A' && *ddata->cur <= 'Z') &&
2580 *ddata->cur != '_') {
2586 if (*ddata->cur == '_')
2587 return (cpp_demangle_get_subst(ddata, 0));
2590 /* substitution number is base 36 */
2591 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2595 /* first was '_', so increase one */
2598 while (*ddata->cur != '_')
2603 return (cpp_demangle_get_subst(ddata, nth));
2611 cpp_demangle_read_subst_std(struct cpp_demangle_data *ddata)
2613 struct vector_str *output, v;
2614 size_t p_idx, subst_str_len;
2621 if (!vector_str_init(&v))
2626 if (!DEM_PUSH_STR(ddata, "std::"))
2629 if (!VEC_PUSH_STR(&v, "std::"))
2634 output = ddata->cur_output;
2636 p_idx = output->size;
2637 if (!cpp_demangle_read_uqname(ddata))
2640 if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2641 &subst_str_len)) == NULL)
2644 if (!vector_str_push(&v, subst_str, subst_str_len))
2647 if (!cpp_demangle_push_subst_v(ddata, &v))
2650 if (*ddata->cur == 'I') {
2651 p_idx = output->size;
2652 if (!cpp_demangle_read_tmpl_args(ddata))
2655 if ((subst_str = vector_str_substr(output, p_idx,
2656 output->size - 1, &subst_str_len)) == NULL)
2658 if (!vector_str_push(&v, subst_str, subst_str_len))
2660 if (!cpp_demangle_push_subst_v(ddata, &v))
2667 vector_str_dest(&v);
2673 cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *ddata,
2676 struct vector_str *output;
2677 size_t p_idx, substr_len, len;
2679 char *subst_str, *substr;
2681 if (ddata == NULL || str == NULL)
2684 if ((len = strlen(str)) == 0)
2687 output = ddata->cur_output;
2689 p_idx = output->size;
2693 if (!cpp_demangle_read_tmpl_args(ddata))
2695 if ((substr = vector_str_substr(output, p_idx, output->size - 1,
2696 &substr_len)) == NULL)
2700 if ((subst_str = malloc(sizeof(char) * (substr_len + len + 1))) ==
2704 memcpy(subst_str, str, len);
2705 memcpy(subst_str + len, substr, substr_len);
2706 subst_str[substr_len + len] = '\0';
2708 if (!cpp_demangle_push_subst(ddata, subst_str, substr_len + len))
2720 cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata)
2723 if (ddata == NULL || *ddata->cur == '\0')
2726 switch (*ddata->cur) {
2728 return (cpp_demangle_read_expr_primary(ddata));
2731 if (!cpp_demangle_read_expression(ddata))
2733 return (*ddata->cur++ == 'E');
2736 return (cpp_demangle_read_type(ddata, NULL));
2740 cpp_demangle_read_tmpl_args(struct cpp_demangle_data *ddata)
2742 struct vector_str *v;
2743 size_t arg_len, idx, limit, size;
2746 if (ddata == NULL || *ddata->cur == '\0')
2751 if (!vector_read_cmd_push(&ddata->cmd, READ_TMPL, NULL))
2754 if (!DEM_PUSH_STR(ddata, "<"))
2758 v = ddata->cur_output;
2761 if (!cpp_demangle_read_tmpl_arg(ddata))
2763 if ((arg = vector_str_substr(v, idx, v->size - 1, &arg_len)) ==
2766 if (!vector_str_find(&ddata->tmpl, arg, arg_len) &&
2767 !vector_str_push(&ddata->tmpl, arg, arg_len)) {
2774 if (*ddata->cur == 'E') {
2778 if (!strncmp(v->container[size - 1], ">", 1)) {
2779 if (!DEM_PUSH_STR(ddata, " >"))
2781 } else if (!DEM_PUSH_STR(ddata, ">"))
2783 ddata->is_tmpl = true;
2785 } else if (*ddata->cur != 'I' &&
2786 !DEM_PUSH_STR(ddata, ", "))
2789 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2793 return (vector_read_cmd_pop(&ddata->cmd));
2797 * Read template parameter that forms in 'T[number]_'.
2798 * This function much like to read_subst but only for types.
2801 cpp_demangle_read_tmpl_param(struct cpp_demangle_data *ddata)
2805 if (ddata == NULL || *ddata->cur != 'T')
2810 if (*ddata->cur == '_')
2811 return (cpp_demangle_get_tmpl_param(ddata, 0));
2815 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2822 while (*ddata->cur != '_')
2827 return (cpp_demangle_get_tmpl_param(ddata, nth));
2835 cpp_demangle_read_type(struct cpp_demangle_data *ddata,
2836 struct type_delimit *td)
2838 struct vector_type_qualifier v;
2839 struct vector_str *output, sv;
2840 size_t p_idx, type_str_len, subst_str_len;
2841 int extern_c, is_builtin;
2844 char *type_str, *exp_str, *num_str, *subst_str;
2845 bool skip_ref_qualifier, omit_void;
2850 output = ddata->cur_output;
2852 if (td->paren == false) {
2853 if (!DEM_PUSH_STR(ddata, "("))
2855 if (ddata->output.size < 2)
2861 if (*ddata->cur != 'I') {
2862 if (!DEM_PUSH_STR(ddata, ", "))
2868 assert(output != NULL);
2870 * [r, V, K] [P, R, O, C, G, U] builtin, function, class-enum, array
2871 * pointer-to-member, template-param, template-template-param, subst
2874 if (!vector_type_qualifier_init(&v))
2879 p_idx = output->size;
2880 type_str = exp_str = num_str = NULL;
2881 skip_ref_qualifier = false;
2885 /* Clear ref-qualifier flag */
2886 if (*ddata->cur != 'R' && *ddata->cur != 'O' && *ddata->cur != 'E')
2887 ddata->ref_qualifier = false;
2890 switch (*ddata->cur) {
2893 if (!DEM_PUSH_STR(ddata, "signed char"))
2900 if (!cpp_demangle_read_array(ddata))
2907 if (!DEM_PUSH_STR(ddata, "bool"))
2914 if (!vector_type_qualifier_push(&v, TYPE_CMX))
2923 if (!DEM_PUSH_STR(ddata, "char"))
2930 if (!DEM_PUSH_STR(ddata, "double"))
2937 switch (*ddata->cur) {
2940 if (!DEM_PUSH_STR(ddata, "auto"))
2945 /* decltype(auto) */
2946 if (!DEM_PUSH_STR(ddata, "decltype(auto)"))
2951 /* IEEE 754r decimal floating point (64 bits) */
2952 if (!DEM_PUSH_STR(ddata, "decimal64"))
2957 /* IEEE 754r decimal floating point (128 bits) */
2958 if (!DEM_PUSH_STR(ddata, "decimal128"))
2963 /* IEEE 754r decimal floating point (32 bits) */
2964 if (!DEM_PUSH_STR(ddata, "decimal32"))
2969 /* IEEE 754r half-precision floating point (16 bits) */
2970 if (!DEM_PUSH_STR(ddata, "half"))
2976 if (!DEM_PUSH_STR(ddata, "char32_t"))
2981 /* std::nullptr_t (i.e., decltype(nullptr)) */
2982 if (!DEM_PUSH_STR(ddata, "decltype(nullptr)"))
2988 if (!DEM_PUSH_STR(ddata, "char16_t"))
2993 /* gcc vector_size extension. */
2995 if (*ddata->cur == '_') {
2997 if (!cpp_demangle_read_expression_flat(ddata,
3000 if (!VEC_PUSH_STR(&v.ext_name, exp_str))
3003 if (!cpp_demangle_read_number_as_string(ddata,
3006 if (!VEC_PUSH_STR(&v.ext_name, num_str))
3009 if (*ddata->cur != '_')
3012 if (!vector_type_qualifier_push(&v, TYPE_VEC))
3024 if (!DEM_PUSH_STR(ddata, "long double"))
3030 /* unexpected end except ref-qualifiers */
3031 if (ddata->ref_qualifier && ddata->is_functype) {
3032 skip_ref_qualifier = true;
3033 /* Pop the delimiter. */
3034 cpp_demangle_pop_str(ddata);
3041 if (!DEM_PUSH_STR(ddata, "float"))
3048 if (!cpp_demangle_read_function(ddata, &extern_c, &v))
3055 if (!DEM_PUSH_STR(ddata, "__float128"))
3062 if (!vector_type_qualifier_push(&v, TYPE_IMG))
3071 if (!DEM_PUSH_STR(ddata, "unsigned char"))
3078 if (!DEM_PUSH_STR(ddata, "int"))
3084 /* template args. */
3085 /* handles <substitute><template-args> */
3086 p_idx = output->size;
3087 if (!cpp_demangle_read_tmpl_args(ddata))
3089 if ((subst_str = vector_str_substr(output, p_idx,
3090 output->size - 1, &subst_str_len)) == NULL)
3092 if (!vector_str_init(&sv)) {
3096 if (!vector_str_push(&sv, subst_str, subst_str_len)) {
3098 vector_str_dest(&sv);
3102 if (!cpp_demangle_push_subst_v(ddata, &sv)) {
3103 vector_str_dest(&sv);
3106 vector_str_dest(&sv);
3111 if (!DEM_PUSH_STR(ddata, "unsigned int"))
3118 if (!vector_type_qualifier_push(&v, TYPE_CST))
3127 if (!DEM_PUSH_STR(ddata, "long"))
3134 if (!DEM_PUSH_STR(ddata, "unsigned long"))
3141 /* pointer to member */
3142 if (!cpp_demangle_read_pointer_to_member(ddata, &v))
3149 if (!DEM_PUSH_STR(ddata, "__int128"))
3155 /* unsigned __int128 */
3156 if (!DEM_PUSH_STR(ddata, "unsigned __int128"))
3162 /* rvalue reference */
3163 if (ddata->ref_qualifier)
3165 if (!vector_type_qualifier_push(&v, TYPE_RREF))
3167 ddata->ref_qualifier = true;
3168 ddata->ref_qualifier_type = TYPE_RREF;
3176 if (!vector_type_qualifier_push(&v, TYPE_PTR))
3185 if (!vector_type_qualifier_push(&v, TYPE_RST))
3194 if (ddata->ref_qualifier)
3196 if (!vector_type_qualifier_push(&v, TYPE_REF))
3198 ddata->ref_qualifier = true;
3199 ddata->ref_qualifier_type = TYPE_REF;
3206 /* short, local string */
3207 if (!DEM_PUSH_STR(ddata, "short"))
3214 if (!cpp_demangle_read_subst(ddata))
3220 /* unsigned short */
3221 if (!DEM_PUSH_STR(ddata, "unsigned short"))
3227 /* template parameter */
3228 if (!cpp_demangle_read_tmpl_param(ddata))
3234 /* vendor extended builtin */
3236 if (!cpp_demangle_read_sname(ddata))
3242 /* vendor extended type qualifier */
3244 if (!cpp_demangle_read_number(ddata, &len))
3248 if (!vector_str_push(&v.ext_name, ddata->cur, len))
3251 if (!vector_type_qualifier_push(&v, TYPE_EXT))
3260 if (td && td->firstp) {
3262 * peek into next bytes and see if we should omit
3266 for (p = ddata->cur + 1; *p != '\0'; p++) {
3269 if (*p != 'R' && *p != 'O') {
3275 if (!omit_void && !DEM_PUSH_STR(ddata, "void"))
3282 if (!vector_type_qualifier_push(&v, TYPE_VAT))
3291 if (!DEM_PUSH_STR(ddata, "wchar_t"))
3298 if (!DEM_PUSH_STR(ddata, "long long"))
3304 /* unsigned long long */
3305 if (!DEM_PUSH_STR(ddata, "unsigned long long"))
3312 if (!DEM_PUSH_STR(ddata, "..."))
3318 if (!cpp_demangle_read_name(ddata))
3324 type_str = vector_str_substr(output, p_idx, output->size - 1,
3327 if (is_builtin == 0) {
3328 if (!vector_str_find(&ddata->subst, type_str, type_str_len) &&
3329 !vector_str_push(&ddata->subst, type_str, type_str_len))
3333 if (!skip_ref_qualifier &&
3334 !cpp_demangle_push_type_qualifier(ddata, &v, type_str))
3343 vector_type_qualifier_dest(&v);
3350 vector_type_qualifier_dest(&v);
3356 cpp_demangle_read_type_flat(struct cpp_demangle_data *ddata, char **str)
3358 struct vector_str *output;
3359 size_t i, p_idx, idx, type_len;
3362 output = ddata->cur_output;
3364 p_idx = output->size;
3366 if (!cpp_demangle_read_type(ddata, NULL))
3369 if ((type = vector_str_substr(output, p_idx, output->size - 1,
3370 &type_len)) == NULL)
3374 for (i = p_idx; i < idx; ++i) {
3375 if (!vector_str_pop(output)) {
3387 * read unqualified-name, unqualified name are operator-name, ctor-dtor-name,
3391 cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
3395 if (ddata == NULL || *ddata->cur == '\0')
3399 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3400 case SIMPLE_HASH('a', 'a'):
3402 if (!DEM_PUSH_STR(ddata, "operator&&"))
3407 case SIMPLE_HASH('a', 'd'):
3408 /* operator & (unary) */
3409 if (!DEM_PUSH_STR(ddata, "operator&"))
3414 case SIMPLE_HASH('a', 'n'):
3416 if (!DEM_PUSH_STR(ddata, "operator&"))
3421 case SIMPLE_HASH('a', 'N'):
3423 if (!DEM_PUSH_STR(ddata, "operator&="))
3428 case SIMPLE_HASH('a', 'S'):
3430 if (!DEM_PUSH_STR(ddata, "operator="))
3435 case SIMPLE_HASH('c', 'l'):
3437 if (!DEM_PUSH_STR(ddata, "operator()"))
3442 case SIMPLE_HASH('c', 'm'):
3444 if (!DEM_PUSH_STR(ddata, "operator,"))
3449 case SIMPLE_HASH('c', 'o'):
3451 if (!DEM_PUSH_STR(ddata, "operator~"))
3456 case SIMPLE_HASH('c', 'v'):
3457 /* operator (cast) */
3458 if (!DEM_PUSH_STR(ddata, "operator(cast)"))
3461 return (cpp_demangle_read_type(ddata, NULL));
3463 case SIMPLE_HASH('d', 'a'):
3464 /* operator delete [] */
3465 if (!DEM_PUSH_STR(ddata, "operator delete []"))
3470 case SIMPLE_HASH('d', 'e'):
3471 /* operator * (unary) */
3472 if (!DEM_PUSH_STR(ddata, "operator*"))
3477 case SIMPLE_HASH('d', 'l'):
3478 /* operator delete */
3479 if (!DEM_PUSH_STR(ddata, "operator delete"))
3484 case SIMPLE_HASH('d', 'v'):
3486 if (!DEM_PUSH_STR(ddata, "operator/"))
3491 case SIMPLE_HASH('d', 'V'):
3493 if (!DEM_PUSH_STR(ddata, "operator/="))
3498 case SIMPLE_HASH('e', 'o'):
3500 if (!DEM_PUSH_STR(ddata, "operator^"))
3505 case SIMPLE_HASH('e', 'O'):
3507 if (!DEM_PUSH_STR(ddata, "operator^="))
3512 case SIMPLE_HASH('e', 'q'):
3514 if (!DEM_PUSH_STR(ddata, "operator=="))
3519 case SIMPLE_HASH('g', 'e'):
3521 if (!DEM_PUSH_STR(ddata, "operator>="))
3526 case SIMPLE_HASH('g', 't'):
3528 if (!DEM_PUSH_STR(ddata, "operator>"))
3533 case SIMPLE_HASH('i', 'x'):
3535 if (!DEM_PUSH_STR(ddata, "operator[]"))
3540 case SIMPLE_HASH('l', 'e'):
3542 if (!DEM_PUSH_STR(ddata, "operator<="))
3547 case SIMPLE_HASH('l', 's'):
3549 if (!DEM_PUSH_STR(ddata, "operator<<"))
3554 case SIMPLE_HASH('l', 'S'):
3556 if (!DEM_PUSH_STR(ddata, "operator<<="))
3561 case SIMPLE_HASH('l', 't'):
3563 if (!DEM_PUSH_STR(ddata, "operator<"))
3568 case SIMPLE_HASH('m', 'i'):
3570 if (!DEM_PUSH_STR(ddata, "operator-"))
3575 case SIMPLE_HASH('m', 'I'):
3577 if (!DEM_PUSH_STR(ddata, "operator-="))
3582 case SIMPLE_HASH('m', 'l'):
3584 if (!DEM_PUSH_STR(ddata, "operator*"))
3589 case SIMPLE_HASH('m', 'L'):
3591 if (!DEM_PUSH_STR(ddata, "operator*="))
3596 case SIMPLE_HASH('m', 'm'):
3598 if (!DEM_PUSH_STR(ddata, "operator--"))
3603 case SIMPLE_HASH('n', 'a'):
3604 /* operator new[] */
3605 if (!DEM_PUSH_STR(ddata, "operator new []"))
3610 case SIMPLE_HASH('n', 'e'):
3612 if (!DEM_PUSH_STR(ddata, "operator!="))
3617 case SIMPLE_HASH('n', 'g'):
3618 /* operator - (unary) */
3619 if (!DEM_PUSH_STR(ddata, "operator-"))
3624 case SIMPLE_HASH('n', 't'):
3626 if (!DEM_PUSH_STR(ddata, "operator!"))
3631 case SIMPLE_HASH('n', 'w'):
3633 if (!DEM_PUSH_STR(ddata, "operator new"))
3638 case SIMPLE_HASH('o', 'o'):
3640 if (!DEM_PUSH_STR(ddata, "operator||"))
3645 case SIMPLE_HASH('o', 'r'):
3647 if (!DEM_PUSH_STR(ddata, "operator|"))
3652 case SIMPLE_HASH('o', 'R'):
3654 if (!DEM_PUSH_STR(ddata, "operator|="))
3659 case SIMPLE_HASH('p', 'l'):
3661 if (!DEM_PUSH_STR(ddata, "operator+"))
3666 case SIMPLE_HASH('p', 'L'):
3668 if (!DEM_PUSH_STR(ddata, "operator+="))
3673 case SIMPLE_HASH('p', 'm'):
3675 if (!DEM_PUSH_STR(ddata, "operator->*"))
3680 case SIMPLE_HASH('p', 'p'):
3682 if (!DEM_PUSH_STR(ddata, "operator++"))
3687 case SIMPLE_HASH('p', 's'):
3688 /* operator + (unary) */
3689 if (!DEM_PUSH_STR(ddata, "operator+"))
3694 case SIMPLE_HASH('p', 't'):
3696 if (!DEM_PUSH_STR(ddata, "operator->"))
3701 case SIMPLE_HASH('q', 'u'):
3703 if (!DEM_PUSH_STR(ddata, "operator?"))
3708 case SIMPLE_HASH('r', 'm'):
3710 if (!DEM_PUSH_STR(ddata, "operator%"))
3715 case SIMPLE_HASH('r', 'M'):
3717 if (!DEM_PUSH_STR(ddata, "operator%="))
3722 case SIMPLE_HASH('r', 's'):
3724 if (!DEM_PUSH_STR(ddata, "operator>>"))
3729 case SIMPLE_HASH('r', 'S'):
3731 if (!DEM_PUSH_STR(ddata, "operator>>="))
3736 case SIMPLE_HASH('r', 'z'):
3737 /* operator sizeof */
3738 if (!DEM_PUSH_STR(ddata, "operator sizeof "))
3743 case SIMPLE_HASH('s', 'r'):
3744 /* scope resolution operator */
3745 if (!DEM_PUSH_STR(ddata, "scope resolution operator "))
3750 case SIMPLE_HASH('s', 'v'):
3751 /* operator sizeof */
3752 if (!DEM_PUSH_STR(ddata, "operator sizeof "))
3758 /* vendor extened operator */
3759 if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) {
3760 if (!DEM_PUSH_STR(ddata, "vendor extened operator "))
3762 if (!cpp_demangle_push_str(ddata, ddata->cur + 1, 1))
3765 return (cpp_demangle_read_sname(ddata));
3768 /* ctor-dtor-name */
3769 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3770 case SIMPLE_HASH('C', '1'):
3771 case SIMPLE_HASH('C', '2'):
3772 case SIMPLE_HASH('C', '3'):
3773 if (ddata->last_sname == NULL)
3775 if ((len = strlen(ddata->last_sname)) == 0)
3777 if (!DEM_PUSH_STR(ddata, "::"))
3779 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3784 case SIMPLE_HASH('D', '0'):
3785 case SIMPLE_HASH('D', '1'):
3786 case SIMPLE_HASH('D', '2'):
3787 if (ddata->last_sname == NULL)
3789 if ((len = strlen(ddata->last_sname)) == 0)
3791 if (!DEM_PUSH_STR(ddata, "::~"))
3793 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3800 if (ELFTC_ISDIGIT(*ddata->cur) != 0)
3801 return (cpp_demangle_read_sname(ddata));
3803 /* local source name */
3804 if (*ddata->cur == 'L')
3805 return (cpp_demangle_local_source_name(ddata));
3811 * Read local source name.
3814 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775
3815 * http://gcc.gnu.org/viewcvs?view=rev&revision=124467
3818 cpp_demangle_local_source_name(struct cpp_demangle_data *ddata)
3821 if (ddata == NULL || *ddata->cur != 'L')
3826 if (!cpp_demangle_read_sname(ddata))
3830 if (*ddata->cur == '_') {
3832 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
3840 cpp_demangle_read_v_offset(struct cpp_demangle_data *ddata)
3846 if (!DEM_PUSH_STR(ddata, "offset : "))
3849 if (!cpp_demangle_read_offset_number(ddata))
3852 if (!DEM_PUSH_STR(ddata, "virtual offset : "))
3855 return (!cpp_demangle_read_offset_number(ddata));
3859 * Decode floating point representation to string
3860 * Return new allocated string or NULL
3863 * Replace these functions to macro.
3866 decode_fp_to_double(const char *p, size_t len)
3869 size_t rtn_len, limit, i;
3873 if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(double))
3876 memset(&f, 0, sizeof(double));
3878 for (i = 0; i < len / 2; ++i) {
3879 byte = hex_to_dec(p[len - i * 2 - 1]) +
3880 hex_to_dec(p[len - i * 2 - 2]) * 16;
3882 if (byte < 0 || byte > 255)
3885 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3886 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3887 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3888 ((unsigned char *)&f)[sizeof(double) - i - 1] =
3889 (unsigned char)(byte);
3890 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3896 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3899 if (snprintf(rtn, rtn_len, "%fld", f) >= (int)rtn_len) {
3901 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3903 rtn_len *= BUFFER_GROWFACTOR;
3911 decode_fp_to_float(const char *p, size_t len)
3913 size_t i, rtn_len, limit;
3918 if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(float))
3921 memset(&f, 0, sizeof(float));
3923 for (i = 0; i < len / 2; ++i) {
3924 byte = hex_to_dec(p[len - i * 2 - 1]) +
3925 hex_to_dec(p[len - i * 2 - 2]) * 16;
3926 if (byte < 0 || byte > 255)
3928 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3929 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3930 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3931 ((unsigned char *)&f)[sizeof(float) - i - 1] =
3932 (unsigned char)(byte);
3933 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3939 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3942 if (snprintf(rtn, rtn_len, "%ff", f) >= (int)rtn_len) {
3944 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3946 rtn_len *= BUFFER_GROWFACTOR;
3954 decode_fp_to_float128(const char *p, size_t len)
3957 size_t rtn_len, limit, i;
3959 unsigned char buf[FLOAT_QUADRUPLE_BYTES];
3962 switch(sizeof(long double)) {
3963 case FLOAT_QUADRUPLE_BYTES:
3964 return (decode_fp_to_long_double(p, len));
3965 case FLOAT_EXTENED_BYTES:
3966 if (p == NULL || len == 0 || len % 2 != 0 ||
3967 len / 2 > FLOAT_QUADRUPLE_BYTES)
3970 memset(buf, 0, FLOAT_QUADRUPLE_BYTES);
3972 for (i = 0; i < len / 2; ++i) {
3973 byte = hex_to_dec(p[len - i * 2 - 1]) +
3974 hex_to_dec(p[len - i * 2 - 2]) * 16;
3975 if (byte < 0 || byte > 255)
3977 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3978 buf[i] = (unsigned char)(byte);
3979 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3980 buf[FLOAT_QUADRUPLE_BYTES - i -1] =
3981 (unsigned char)(byte);
3982 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3984 memset(&f, 0, FLOAT_EXTENED_BYTES);
3986 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3987 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3988 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3989 memcpy(&f, buf + 6, FLOAT_EXTENED_BYTES);
3990 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3995 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3998 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
4000 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
4002 rtn_len *= BUFFER_GROWFACTOR;
4013 decode_fp_to_float80(const char *p, size_t len)
4016 size_t rtn_len, limit, i;
4018 unsigned char buf[FLOAT_EXTENED_BYTES];
4021 switch(sizeof(long double)) {
4022 case FLOAT_QUADRUPLE_BYTES:
4023 if (p == NULL || len == 0 || len % 2 != 0 ||
4024 len / 2 > FLOAT_EXTENED_BYTES)
4027 memset(buf, 0, FLOAT_EXTENED_BYTES);
4029 for (i = 0; i < len / 2; ++i) {
4030 byte = hex_to_dec(p[len - i * 2 - 1]) +
4031 hex_to_dec(p[len - i * 2 - 2]) * 16;
4033 if (byte < 0 || byte > 255)
4036 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
4037 buf[i] = (unsigned char)(byte);
4038 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4039 buf[FLOAT_EXTENED_BYTES - i -1] =
4040 (unsigned char)(byte);
4041 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4044 memset(&f, 0, FLOAT_QUADRUPLE_BYTES);
4046 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
4047 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
4048 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4049 memcpy((unsigned char *)(&f) + 6, buf, FLOAT_EXTENED_BYTES);
4050 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4055 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
4058 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
4060 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
4062 rtn_len *= BUFFER_GROWFACTOR;
4067 case FLOAT_EXTENED_BYTES:
4068 return (decode_fp_to_long_double(p, len));
4075 decode_fp_to_long_double(const char *p, size_t len)
4078 size_t rtn_len, limit, i;
4082 if (p == NULL || len == 0 || len % 2 != 0 ||
4083 len / 2 > sizeof(long double))
4086 memset(&f, 0, sizeof(long double));
4088 for (i = 0; i < len / 2; ++i) {
4089 byte = hex_to_dec(p[len - i * 2 - 1]) +
4090 hex_to_dec(p[len - i * 2 - 2]) * 16;
4092 if (byte < 0 || byte > 255)
4095 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
4096 ((unsigned char *)&f)[i] = (unsigned char)(byte);
4097 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4098 ((unsigned char *)&f)[sizeof(long double) - i - 1] =
4099 (unsigned char)(byte);
4100 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
4106 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
4109 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
4111 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
4113 rtn_len *= BUFFER_GROWFACTOR;
4120 /* Simple hex to integer function used by decode_to_* function. */
4164 * @brief Test input string is mangled by IA-64 C++ ABI style.
4166 * Test string heads with "_Z" or "_GLOBAL__I_".
4167 * @return Return 0 at false.
4170 is_cpp_mangled_gnu3(const char *org)
4175 return ((len > 2 && *org == '_' && *(org + 1) == 'Z') ||
4176 (len > 11 && !strncmp(org, "_GLOBAL__I_", 11)));
4180 vector_read_cmd_dest(struct vector_read_cmd *v)
4186 free(v->r_container);
4189 static struct read_cmd_item *
4190 vector_read_cmd_find(struct vector_read_cmd *v, enum read_cmd dst)
4194 if (v == NULL || dst == READ_FAIL)
4197 for (i = (int) v->size - 1; i >= 0; i--)
4198 if (v->r_container[i].cmd == dst)
4199 return (&v->r_container[i]);
4205 vector_read_cmd_init(struct vector_read_cmd *v)
4212 v->capacity = VECTOR_DEF_CAPACITY;
4214 if ((v->r_container = malloc(sizeof(*v->r_container) * v->capacity))
4222 vector_read_cmd_pop(struct vector_read_cmd *v)
4225 if (v == NULL || v->size == 0)
4229 v->r_container[v->size].cmd = READ_FAIL;
4230 v->r_container[v->size].data = NULL;
4236 vector_read_cmd_push(struct vector_read_cmd *v, enum read_cmd cmd, void *data)
4238 struct read_cmd_item *tmp_r_ctn;
4245 if (v->size == v->capacity) {
4246 tmp_cap = BUFFER_GROW(v->capacity);
4247 if ((tmp_r_ctn = malloc(sizeof(*tmp_r_ctn) * tmp_cap)) == NULL)
4249 for (i = 0; i < v->size; ++i)
4250 tmp_r_ctn[i] = v->r_container[i];
4251 free(v->r_container);
4252 v->r_container = tmp_r_ctn;
4253 v->capacity = tmp_cap;
4256 v->r_container[v->size].cmd = cmd;
4257 v->r_container[v->size].data = data;
4264 vector_type_qualifier_dest(struct vector_type_qualifier *v)
4270 free(v->q_container);
4271 vector_str_dest(&v->ext_name);
4274 /* size, capacity, ext_name */
4276 vector_type_qualifier_init(struct vector_type_qualifier *v)
4283 v->capacity = VECTOR_DEF_CAPACITY;
4285 if ((v->q_container = malloc(sizeof(enum type_qualifier) * v->capacity))
4289 assert(v->q_container != NULL);
4291 if (!vector_str_init(&v->ext_name)) {
4292 free(v->q_container);
4300 vector_type_qualifier_push(struct vector_type_qualifier *v,
4301 enum type_qualifier t)
4303 enum type_qualifier *tmp_ctn;
4310 if (v->size == v->capacity) {
4311 tmp_cap = BUFFER_GROW(v->capacity);
4312 if ((tmp_ctn = malloc(sizeof(enum type_qualifier) * tmp_cap))
4315 for (i = 0; i < v->size; ++i)
4316 tmp_ctn[i] = v->q_container[i];
4317 free(v->q_container);
4318 v->q_container = tmp_ctn;
4319 v->capacity = tmp_cap;
4322 v->q_container[v->size] = t;