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 #include "_libelftc.h"
40 ELFTC_VCSID("$Id: libelftc_dem_gnu3.c 3583 2017-10-15 15:38:47Z emaste $");
43 * @file cpp_demangle.c
44 * @brief Decode IA-64 C++ ABI style implementation.
46 * IA-64 standard ABI(Itanium C++ ABI) references.
48 * http://www.codesourcery.com/cxx-abi/abi.html#mangling \n
49 * http://www.codesourcery.com/cxx-abi/abi-mangling.html
53 TYPE_PTR, TYPE_REF, TYPE_CMX, TYPE_IMG, TYPE_EXT, TYPE_RST, TYPE_VAT,
54 TYPE_CST, TYPE_VEC, TYPE_RREF
57 struct vector_type_qualifier {
58 size_t size, capacity;
59 enum type_qualifier *q_container;
60 struct vector_str ext_name;
64 READ_FAIL, READ_NEST, READ_TMPL, READ_EXPR, READ_EXPL, READ_LOCAL,
65 READ_TYPE, READ_FUNC, READ_PTRMEM
68 struct read_cmd_item {
73 struct vector_read_cmd {
74 size_t size, capacity;
75 struct read_cmd_item *r_container;
81 PUSH_NON_CV_QUALIFIER,
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 */
102 const char *cur; /* current mangled name ptr */
103 const char *last_sname; /* last source name */
106 struct type_delimit {
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
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)))
120 static void cpp_demangle_data_dest(struct cpp_demangle_data *);
121 static int cpp_demangle_data_init(struct cpp_demangle_data *,
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 *,
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 *,
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 *,
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 *,
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 *,
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 *,
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 *,
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,
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);
197 * @brief Decode the input string by IA-64 C++ ABI style.
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.
204 cpp_demangle_gnu3(const char *org)
206 struct cpp_demangle_data ddata;
207 struct vector_str ret_type;
208 struct type_delimit td;
212 bool has_ret, more_type;
214 if (org == NULL || (org_len = strlen(org)) < 2)
217 if (org_len > 11 && !strncmp(org, "_GLOBAL__I_", 11)) {
218 if ((rtn = malloc(org_len + 19)) == NULL)
220 snprintf(rtn, org_len + 19,
221 "global constructors keyed to %s", org + 11);
225 if (org[0] != '_' || org[1] != 'Z')
228 if (!cpp_demangle_data_init(&ddata, org + 2))
232 has_ret = more_type = false;
234 if (!cpp_demangle_read_encoding(&ddata))
238 * Pop function name from substitution candidate list.
240 if (*ddata.cur != 0 && ddata.subst.size >= 1) {
241 if (!vector_str_pop(&ddata.subst))
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)
255 ddata.is_tmpl = false;
256 if (!vector_str_init(&ret_type))
258 ddata.cur_output = &ret_type;
262 while (*ddata.cur != '\0') {
264 * Breaking at some gcc info at tail. e.g) @@GLIBCXX_3.4
266 if (*ddata.cur == '@' && *(ddata.cur + 1) == '@')
270 /* Read return type */
271 if (!cpp_demangle_read_type(&ddata, NULL))
274 /* Read function arg type */
275 if (!cpp_demangle_read_type(&ddata, &td))
280 /* Push return type to the beginning */
281 if (!VEC_PUSH_STR(&ret_type, " "))
283 if (!vector_str_push_vector_head(&ddata.output,
286 ddata.cur_output = &ddata.output;
287 vector_str_dest(&ret_type);
290 } else if (more_type)
292 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
298 if (ddata.output.size == 0)
300 if (td.paren && !VEC_PUSH_STR(&ddata.output, ")"))
302 if (ddata.mem_vat && !VEC_PUSH_STR(&ddata.output, " volatile"))
304 if (ddata.mem_cst && !VEC_PUSH_STR(&ddata.output, " const"))
306 if (ddata.mem_rst && !VEC_PUSH_STR(&ddata.output, " restrict"))
308 if (ddata.mem_ref && !VEC_PUSH_STR(&ddata.output, " &"))
310 if (ddata.mem_rref && !VEC_PUSH_STR(&ddata.output, " &&"))
313 rtn = vector_str_get_flat(&ddata.output, (size_t *) NULL);
317 vector_str_dest(&ret_type);
319 cpp_demangle_data_dest(&ddata);
325 cpp_demangle_data_dest(struct cpp_demangle_data *d)
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);
339 cpp_demangle_data_init(struct cpp_demangle_data *d, const char *cur)
342 if (d == NULL || cur == NULL)
345 if (!vector_str_init(&d->output))
347 if (!vector_str_init(&d->subst))
349 if (!vector_str_init(&d->tmpl))
351 if (!vector_str_init(&d->class_type))
353 if (!vector_read_cmd_init(&d->cmd))
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);
367 d->is_functype = false;
368 d->ref_qualifier = false;
369 d->push_qualifier = PUSH_ALL_QUALIFIER;
372 d->cur_output = &d->output;
373 d->last_sname = NULL;
378 vector_str_dest(&d->class_type);
380 vector_str_dest(&d->tmpl);
382 vector_str_dest(&d->subst);
384 vector_str_dest(&d->output);
390 cpp_demangle_push_fp(struct cpp_demangle_data *ddata,
391 char *(*decoder)(const char *, size_t))
398 if (ddata == NULL || decoder == NULL)
402 while (*ddata->cur != 'E')
405 if ((f = decoder(fp, ddata->cur - fp)) == NULL)
409 if ((len = strlen(f)) > 0)
410 rtn = cpp_demangle_push_str(ddata, f, len);
420 cpp_demangle_push_str(struct cpp_demangle_data *ddata, const char *str,
424 if (ddata == NULL || str == NULL || len == 0)
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
432 ddata->is_tmpl = false;
434 return (vector_str_push(ddata->cur_output, str, len));
438 cpp_demangle_pop_str(struct cpp_demangle_data *ddata)
444 return (vector_str_pop(ddata->cur_output));
448 cpp_demangle_push_subst(struct cpp_demangle_data *ddata, const char *str,
452 if (ddata == NULL || str == NULL || len == 0)
455 if (!vector_str_find(&ddata->subst, str, len))
456 return (vector_str_push(&ddata->subst, str, len));
462 cpp_demangle_push_subst_v(struct cpp_demangle_data *ddata, struct vector_str *v)
468 if (ddata == NULL || v == NULL)
471 if ((str = vector_str_get_flat(v, &str_len)) == NULL)
474 rtn = cpp_demangle_push_subst(ddata, str, str_len);
482 cpp_demangle_push_type_qualifier(struct cpp_demangle_data *ddata,
483 struct vector_type_qualifier *v, const char *type_str)
485 struct vector_str subst_v;
486 enum type_qualifier t;
487 size_t idx, e_idx, e_len;
492 if (ddata == NULL || v == NULL)
495 if ((idx = v->size) == 0)
499 if (type_str != NULL) {
500 if (!vector_str_init(&subst_v))
502 if (!VEC_PUSH_STR(&subst_v, type_str))
509 switch (v->q_container[idx - 1]) {
512 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
514 if (!DEM_PUSH_STR(ddata, "*"))
516 if (type_str != NULL) {
517 if (!VEC_PUSH_STR(&subst_v, "*"))
519 if (!cpp_demangle_push_subst_v(ddata,
527 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
529 if (!DEM_PUSH_STR(ddata, "&"))
531 if (type_str != NULL) {
532 if (!VEC_PUSH_STR(&subst_v, "&"))
534 if (!cpp_demangle_push_subst_v(ddata,
542 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
544 if (!DEM_PUSH_STR(ddata, "&&"))
546 if (type_str != NULL) {
547 if (!VEC_PUSH_STR(&subst_v, "&&"))
549 if (!cpp_demangle_push_subst_v(ddata,
557 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
559 if (!DEM_PUSH_STR(ddata, " complex"))
561 if (type_str != NULL) {
562 if (!VEC_PUSH_STR(&subst_v, " complex"))
564 if (!cpp_demangle_push_subst_v(ddata,
572 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
574 if (!DEM_PUSH_STR(ddata, " imaginary"))
576 if (type_str != NULL) {
577 if (!VEC_PUSH_STR(&subst_v, " imaginary"))
579 if (!cpp_demangle_push_subst_v(ddata,
587 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
589 if (v->ext_name.size == 0 ||
590 e_idx > v->ext_name.size - 1)
592 if ((e_len = strlen(v->ext_name.container[e_idx])) ==
595 if ((buf = malloc(e_len + 2)) == NULL)
597 snprintf(buf, e_len + 2, " %s",
598 v->ext_name.container[e_idx]);
600 if (!DEM_PUSH_STR(ddata, buf)) {
605 if (type_str != NULL) {
606 if (!VEC_PUSH_STR(&subst_v, buf)) {
610 if (!cpp_demangle_push_subst_v(ddata,
621 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
624 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
626 if (!DEM_PUSH_STR(ddata, " restrict"))
628 if (type_str != NULL) {
629 if (!VEC_PUSH_STR(&subst_v, " restrict"))
632 t = v->q_container[idx - 2];
633 if (t == TYPE_RST || t == TYPE_VAT ||
637 if (!cpp_demangle_push_subst_v(ddata,
644 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
647 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
649 if (!DEM_PUSH_STR(ddata, " volatile"))
651 if (type_str != NULL) {
652 if (!VEC_PUSH_STR(&subst_v, " volatile"))
655 t = v->q_container[idx - 2];
656 if (t == TYPE_RST || t == TYPE_VAT ||
660 if (!cpp_demangle_push_subst_v(ddata,
667 if (ddata->push_qualifier == PUSH_NON_CV_QUALIFIER &&
670 if (ddata->push_qualifier == PUSH_CV_QUALIFIER && !cv)
672 if (!DEM_PUSH_STR(ddata, " const"))
674 if (type_str != NULL) {
675 if (!VEC_PUSH_STR(&subst_v, " const"))
678 t = v->q_container[idx - 2];
679 if (t == TYPE_RST || t == TYPE_VAT ||
683 if (!cpp_demangle_push_subst_v(ddata,
691 if (ddata->push_qualifier == PUSH_CV_QUALIFIER)
693 if (v->ext_name.size == 0 ||
694 e_idx > v->ext_name.size - 1)
696 if ((e_len = strlen(v->ext_name.container[e_idx])) ==
699 if ((buf = malloc(e_len + 12)) == NULL)
701 snprintf(buf, e_len + 12, " __vector(%s)",
702 v->ext_name.container[e_idx]);
703 if (!DEM_PUSH_STR(ddata, buf)) {
707 if (type_str != NULL) {
708 if (!VEC_PUSH_STR(&subst_v, buf)) {
712 if (!cpp_demangle_push_subst_v(ddata,
727 if (type_str != NULL)
728 vector_str_dest(&subst_v);
734 cpp_demangle_get_subst(struct cpp_demangle_data *ddata, size_t idx)
738 if (ddata == NULL || ddata->subst.size <= idx)
740 if ((len = strlen(ddata->subst.container[idx])) == 0)
742 if (!cpp_demangle_push_str(ddata, ddata->subst.container[idx], len))
752 cpp_demangle_get_tmpl_param(struct cpp_demangle_data *ddata, size_t idx)
756 if (ddata == NULL || ddata->tmpl.size <= idx)
758 if ((len = strlen(ddata->tmpl.container[idx])) == 0)
760 if (!cpp_demangle_push_str(ddata, ddata->tmpl.container[idx], len))
769 cpp_demangle_read_array(struct cpp_demangle_data *ddata)
771 size_t i, num_len, exp_len, p_idx, idx;
775 if (ddata == NULL || *(++ddata->cur) == '\0')
778 if (*ddata->cur == '_') {
779 if (*(++ddata->cur) == '\0')
782 if (!cpp_demangle_read_type(ddata, NULL))
785 if (!DEM_PUSH_STR(ddata, "[]"))
788 if (ELFTC_ISDIGIT(*ddata->cur) != 0) {
790 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
792 if (*ddata->cur != '_')
794 num_len = ddata->cur - num;
796 if (*(++ddata->cur) == '\0')
798 if (!cpp_demangle_read_type(ddata, NULL))
800 if (!DEM_PUSH_STR(ddata, "["))
802 if (!cpp_demangle_push_str(ddata, num, num_len))
804 if (!DEM_PUSH_STR(ddata, "]"))
807 p_idx = ddata->output.size;
808 if (!cpp_demangle_read_expression(ddata))
810 if ((exp = vector_str_substr(&ddata->output, p_idx,
811 ddata->output.size - 1, &exp_len)) == NULL)
813 idx = ddata->output.size;
814 for (i = p_idx; i < idx; ++i)
815 if (!vector_str_pop(&ddata->output)) {
819 if (*ddata->cur != '_') {
824 if (*ddata->cur == '\0') {
828 if (!cpp_demangle_read_type(ddata, NULL)) {
832 if (!DEM_PUSH_STR(ddata, "[")) {
836 if (!cpp_demangle_push_str(ddata, exp, exp_len)) {
840 if (!DEM_PUSH_STR(ddata, "]")) {
852 cpp_demangle_read_expr_primary(struct cpp_demangle_data *ddata)
856 if (ddata == NULL || *(++ddata->cur) == '\0')
859 if (*ddata->cur == '_' && *(ddata->cur + 1) == 'Z') {
861 if (*ddata->cur == '\0')
863 if (!cpp_demangle_read_encoding(ddata))
869 switch (*ddata->cur) {
871 if (*(ddata->cur + 2) != 'E')
873 switch (*(++ddata->cur)) {
876 return (DEM_PUSH_STR(ddata, "false"));
879 return (DEM_PUSH_STR(ddata, "true"));
886 return (cpp_demangle_push_fp(ddata, decode_fp_to_double));
890 if (sizeof(long double) == 10)
891 return (cpp_demangle_push_fp(ddata,
892 decode_fp_to_double));
893 return (cpp_demangle_push_fp(ddata, decode_fp_to_float80));
897 return (cpp_demangle_push_fp(ddata, decode_fp_to_float));
901 if (sizeof(long double) == 16)
902 return (cpp_demangle_push_fp(ddata,
903 decode_fp_to_double));
904 return (cpp_demangle_push_fp(ddata, decode_fp_to_float128));
915 if (*(++ddata->cur) == 'n') {
916 if (!DEM_PUSH_STR(ddata, "-"))
921 while (*ddata->cur != 'E') {
922 if (!ELFTC_ISDIGIT(*ddata->cur))
927 return (cpp_demangle_push_str(ddata, num,
928 ddata->cur - num - 1));
936 cpp_demangle_read_expression(struct cpp_demangle_data *ddata)
939 if (ddata == NULL || *ddata->cur == '\0')
942 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
943 case SIMPLE_HASH('s', 't'):
945 return (cpp_demangle_read_type(ddata, NULL));
947 case SIMPLE_HASH('s', 'r'):
949 if (!cpp_demangle_read_type(ddata, NULL))
951 if (!cpp_demangle_read_uqname(ddata))
953 if (*ddata->cur == 'I')
954 return (cpp_demangle_read_tmpl_args(ddata));
957 case SIMPLE_HASH('a', 'a'):
960 return (cpp_demangle_read_expression_binary(ddata, "&&", 2));
962 case SIMPLE_HASH('a', 'd'):
963 /* operator & (unary) */
965 return (cpp_demangle_read_expression_unary(ddata, "&", 1));
967 case SIMPLE_HASH('a', 'n'):
970 return (cpp_demangle_read_expression_binary(ddata, "&", 1));
972 case SIMPLE_HASH('a', 'N'):
975 return (cpp_demangle_read_expression_binary(ddata, "&=", 2));
977 case SIMPLE_HASH('a', 'S'):
980 return (cpp_demangle_read_expression_binary(ddata, "=", 1));
982 case SIMPLE_HASH('c', 'l'):
985 return (cpp_demangle_read_expression_binary(ddata, "()", 2));
987 case SIMPLE_HASH('c', 'm'):
990 return (cpp_demangle_read_expression_binary(ddata, ",", 1));
992 case SIMPLE_HASH('c', 'o'):
995 return (cpp_demangle_read_expression_binary(ddata, "~", 1));
997 case SIMPLE_HASH('c', 'v'):
998 /* operator (cast) */
1000 return (cpp_demangle_read_expression_binary(ddata, "(cast)", 6));
1002 case SIMPLE_HASH('d', 'a'):
1003 /* operator delete [] */
1005 return (cpp_demangle_read_expression_unary(ddata, "delete []", 9));
1007 case SIMPLE_HASH('d', 'e'):
1008 /* operator * (unary) */
1010 return (cpp_demangle_read_expression_unary(ddata, "*", 1));
1012 case SIMPLE_HASH('d', 'l'):
1013 /* operator delete */
1015 return (cpp_demangle_read_expression_unary(ddata, "delete", 6));
1017 case SIMPLE_HASH('d', 'v'):
1020 return (cpp_demangle_read_expression_binary(ddata, "/", 1));
1022 case SIMPLE_HASH('d', 'V'):
1025 return (cpp_demangle_read_expression_binary(ddata, "/=", 2));
1027 case SIMPLE_HASH('e', 'o'):
1030 return (cpp_demangle_read_expression_binary(ddata, "^", 1));
1032 case SIMPLE_HASH('e', 'O'):
1035 return (cpp_demangle_read_expression_binary(ddata, "^=", 2));
1037 case SIMPLE_HASH('e', 'q'):
1040 return (cpp_demangle_read_expression_binary(ddata, "==", 2));
1042 case SIMPLE_HASH('g', 'e'):
1045 return (cpp_demangle_read_expression_binary(ddata, ">=", 2));
1047 case SIMPLE_HASH('g', 't'):
1050 return (cpp_demangle_read_expression_binary(ddata, ">", 1));
1052 case SIMPLE_HASH('i', 'x'):
1055 return (cpp_demangle_read_expression_binary(ddata, "[]", 2));
1057 case SIMPLE_HASH('l', 'e'):
1060 return (cpp_demangle_read_expression_binary(ddata, "<=", 2));
1062 case SIMPLE_HASH('l', 's'):
1065 return (cpp_demangle_read_expression_binary(ddata, "<<", 2));
1067 case SIMPLE_HASH('l', 'S'):
1070 return (cpp_demangle_read_expression_binary(ddata, "<<=", 3));
1072 case SIMPLE_HASH('l', 't'):
1075 return (cpp_demangle_read_expression_binary(ddata, "<", 1));
1077 case SIMPLE_HASH('m', 'i'):
1080 return (cpp_demangle_read_expression_binary(ddata, "-", 1));
1082 case SIMPLE_HASH('m', 'I'):
1085 return (cpp_demangle_read_expression_binary(ddata, "-=", 2));
1087 case SIMPLE_HASH('m', 'l'):
1090 return (cpp_demangle_read_expression_binary(ddata, "*", 1));
1092 case SIMPLE_HASH('m', 'L'):
1095 return (cpp_demangle_read_expression_binary(ddata, "*=", 2));
1097 case SIMPLE_HASH('m', 'm'):
1100 return (cpp_demangle_read_expression_binary(ddata, "--", 2));
1102 case SIMPLE_HASH('n', 'a'):
1103 /* operator new[] */
1105 return (cpp_demangle_read_expression_unary(ddata, "new []", 6));
1107 case SIMPLE_HASH('n', 'e'):
1110 return (cpp_demangle_read_expression_binary(ddata, "!=", 2));
1112 case SIMPLE_HASH('n', 'g'):
1113 /* operator - (unary) */
1115 return (cpp_demangle_read_expression_unary(ddata, "-", 1));
1117 case SIMPLE_HASH('n', 't'):
1120 return (cpp_demangle_read_expression_binary(ddata, "!", 1));
1122 case SIMPLE_HASH('n', 'w'):
1125 return (cpp_demangle_read_expression_unary(ddata, "new", 3));
1127 case SIMPLE_HASH('o', 'o'):
1130 return (cpp_demangle_read_expression_binary(ddata, "||", 2));
1132 case SIMPLE_HASH('o', 'r'):
1135 return (cpp_demangle_read_expression_binary(ddata, "|", 1));
1137 case SIMPLE_HASH('o', 'R'):
1140 return (cpp_demangle_read_expression_binary(ddata, "|=", 2));
1142 case SIMPLE_HASH('p', 'l'):
1145 return (cpp_demangle_read_expression_binary(ddata, "+", 1));
1147 case SIMPLE_HASH('p', 'L'):
1150 return (cpp_demangle_read_expression_binary(ddata, "+=", 2));
1152 case SIMPLE_HASH('p', 'm'):
1155 return (cpp_demangle_read_expression_binary(ddata, "->*", 3));
1157 case SIMPLE_HASH('p', 'p'):
1160 return (cpp_demangle_read_expression_binary(ddata, "++", 2));
1162 case SIMPLE_HASH('p', 's'):
1163 /* operator + (unary) */
1165 return (cpp_demangle_read_expression_unary(ddata, "+", 1));
1167 case SIMPLE_HASH('p', 't'):
1170 return (cpp_demangle_read_expression_binary(ddata, "->", 2));
1172 case SIMPLE_HASH('q', 'u'):
1175 return (cpp_demangle_read_expression_trinary(ddata, "?", 1,
1178 case SIMPLE_HASH('r', 'm'):
1181 return (cpp_demangle_read_expression_binary(ddata, "%", 1));
1183 case SIMPLE_HASH('r', 'M'):
1186 return (cpp_demangle_read_expression_binary(ddata, "%=", 2));
1188 case SIMPLE_HASH('r', 's'):
1191 return (cpp_demangle_read_expression_binary(ddata, ">>", 2));
1193 case SIMPLE_HASH('r', 'S'):
1196 return (cpp_demangle_read_expression_binary(ddata, ">>=", 3));
1198 case SIMPLE_HASH('r', 'z'):
1199 /* operator sizeof */
1201 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
1203 case SIMPLE_HASH('s', 'v'):
1204 /* operator sizeof */
1206 return (cpp_demangle_read_expression_unary(ddata, "sizeof", 6));
1209 switch (*ddata->cur) {
1211 return (cpp_demangle_read_expr_primary(ddata));
1213 return (cpp_demangle_read_tmpl_param(ddata));
1220 cpp_demangle_read_expression_flat(struct cpp_demangle_data *ddata, char **str)
1222 struct vector_str *output;
1223 size_t i, p_idx, idx, exp_len;
1226 output = &ddata->output;
1228 p_idx = output->size;
1230 if (!cpp_demangle_read_expression(ddata))
1233 if ((exp = vector_str_substr(output, p_idx, output->size - 1,
1238 for (i = p_idx; i < idx; ++i) {
1239 if (!vector_str_pop(output)) {
1251 cpp_demangle_read_expression_binary(struct cpp_demangle_data *ddata,
1252 const char *name, size_t len)
1255 if (ddata == NULL || name == NULL || len == 0)
1257 if (!cpp_demangle_read_expression(ddata))
1259 if (!cpp_demangle_push_str(ddata, name, len))
1262 return (cpp_demangle_read_expression(ddata));
1266 cpp_demangle_read_expression_unary(struct cpp_demangle_data *ddata,
1267 const char *name, size_t len)
1270 if (ddata == NULL || name == NULL || len == 0)
1272 if (!cpp_demangle_read_expression(ddata))
1275 return (cpp_demangle_push_str(ddata, name, len));
1279 cpp_demangle_read_expression_trinary(struct cpp_demangle_data *ddata,
1280 const char *name1, size_t len1, const char *name2, size_t len2)
1283 if (ddata == NULL || name1 == NULL || len1 == 0 || name2 == NULL ||
1287 if (!cpp_demangle_read_expression(ddata))
1289 if (!cpp_demangle_push_str(ddata, name1, len1))
1291 if (!cpp_demangle_read_expression(ddata))
1293 if (!cpp_demangle_push_str(ddata, name2, len2))
1296 return (cpp_demangle_read_expression(ddata));
1300 cpp_demangle_read_function(struct cpp_demangle_data *ddata, int *ext_c,
1301 struct vector_type_qualifier *v)
1303 struct type_delimit td;
1304 struct read_cmd_item *rc;
1305 size_t class_type_size, class_type_len, limit;
1306 const char *class_type;
1308 bool paren, non_cv_qualifier;
1310 if (ddata == NULL || *ddata->cur != 'F' || v == NULL)
1314 if (*ddata->cur == 'Y') {
1321 if (!cpp_demangle_read_type(ddata, NULL))
1324 if (*ddata->cur != 'E') {
1325 if (!DEM_PUSH_STR(ddata, " "))
1328 non_cv_qualifier = false;
1330 for (i = 0; (size_t) i < v->size; i++) {
1331 if (v->q_container[i] != TYPE_RST &&
1332 v->q_container[i] != TYPE_VAT &&
1333 v->q_container[i] != TYPE_CST) {
1334 non_cv_qualifier = true;
1341 rc = vector_read_cmd_find(&ddata->cmd, READ_PTRMEM);
1342 if (non_cv_qualifier || rc != NULL) {
1343 if (!DEM_PUSH_STR(ddata, "("))
1348 /* Push non-cv qualifiers. */
1349 ddata->push_qualifier = PUSH_NON_CV_QUALIFIER;
1350 if (!cpp_demangle_push_type_qualifier(ddata, v, NULL))
1354 if (non_cv_qualifier && !DEM_PUSH_STR(ddata, " "))
1356 if ((class_type_size = ddata->class_type.size) == 0)
1359 ddata->class_type.container[class_type_size - 1];
1360 if (class_type == NULL)
1362 if ((class_type_len = strlen(class_type)) == 0)
1364 if (!cpp_demangle_push_str(ddata, class_type,
1367 if (!DEM_PUSH_STR(ddata, "::*"))
1369 /* Push pointer-to-member qualifiers. */
1370 ddata->push_qualifier = PUSH_ALL_QUALIFIER;
1371 if (!cpp_demangle_push_type_qualifier(ddata, rc->data,
1378 if (!DEM_PUSH_STR(ddata, ")"))
1386 ddata->is_functype = true;
1388 if (!cpp_demangle_read_type(ddata, &td))
1390 if (*ddata->cur == 'E')
1392 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1395 ddata->is_functype = false;
1397 if (!DEM_PUSH_STR(ddata, ")"))
1402 /* Push CV qualifiers. */
1403 ddata->push_qualifier = PUSH_CV_QUALIFIER;
1404 if (!cpp_demangle_push_type_qualifier(ddata, v, NULL))
1407 ddata->push_qualifier = PUSH_ALL_QUALIFIER;
1409 /* Release type qualifier vector. */
1410 vector_type_qualifier_dest(v);
1411 if (!vector_type_qualifier_init(v))
1414 /* Push ref-qualifiers. */
1415 if (ddata->ref_qualifier) {
1416 switch (ddata->ref_qualifier_type) {
1418 if (!DEM_PUSH_STR(ddata, " &"))
1422 if (!DEM_PUSH_STR(ddata, " &&"))
1428 ddata->ref_qualifier = false;
1437 /* read encoding, encoding are function name, data name, special-name */
1439 cpp_demangle_read_encoding(struct cpp_demangle_data *ddata)
1441 char *name, *type, *num_str;
1445 if (ddata == NULL || *ddata->cur == '\0')
1449 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
1450 case SIMPLE_HASH('G', 'A'):
1451 if (!DEM_PUSH_STR(ddata, "hidden alias for "))
1454 if (*ddata->cur == '\0')
1456 return (cpp_demangle_read_encoding(ddata));
1458 case SIMPLE_HASH('G', 'R'):
1459 if (!DEM_PUSH_STR(ddata, "reference temporary #"))
1462 if (*ddata->cur == '\0')
1464 if (!cpp_demangle_read_name_flat(ddata, &name))
1467 if (!cpp_demangle_read_number_as_string(ddata, &num_str))
1469 if (!DEM_PUSH_STR(ddata, num_str))
1471 if (!DEM_PUSH_STR(ddata, " for "))
1473 if (!DEM_PUSH_STR(ddata, name))
1482 case SIMPLE_HASH('G', 'T'):
1484 if (*ddata->cur == '\0')
1486 switch (*ddata->cur) {
1488 if (!DEM_PUSH_STR(ddata, "non-transaction clone for "))
1493 if (!DEM_PUSH_STR(ddata, "transaction clone for "))
1498 return (cpp_demangle_read_encoding(ddata));
1500 case SIMPLE_HASH('G', 'V'):
1501 /* sentry object for 1 time init */
1502 if (!DEM_PUSH_STR(ddata, "guard variable for "))
1507 case SIMPLE_HASH('T', 'c'):
1508 /* virtual function covariant override thunk */
1509 if (!DEM_PUSH_STR(ddata,
1510 "virtual function covariant override "))
1513 if (*ddata->cur == '\0')
1515 if (!cpp_demangle_read_offset(ddata))
1517 if (!cpp_demangle_read_offset(ddata))
1519 return (cpp_demangle_read_encoding(ddata));
1521 case SIMPLE_HASH('T', 'C'):
1522 /* construction vtable */
1523 if (!DEM_PUSH_STR(ddata, "construction vtable for "))
1526 if (*ddata->cur == '\0')
1528 if (!cpp_demangle_read_type_flat(ddata, &type))
1531 if (!cpp_demangle_read_number(ddata, &offset))
1533 if (*ddata->cur++ != '_')
1535 if (!cpp_demangle_read_type(ddata, NULL))
1537 if (!DEM_PUSH_STR(ddata, "-in-"))
1539 if (!DEM_PUSH_STR(ddata, type))
1546 case SIMPLE_HASH('T', 'D'):
1547 /* typeinfo common proxy */
1550 case SIMPLE_HASH('T', 'F'):
1552 if (!DEM_PUSH_STR(ddata, "typeinfo fn for "))
1555 if (*ddata->cur == '\0')
1557 return (cpp_demangle_read_type(ddata, NULL));
1559 case SIMPLE_HASH('T', 'h'):
1560 /* virtual function non-virtual override thunk */
1561 if (!DEM_PUSH_STR(ddata,
1562 "virtual function non-virtual override "))
1565 if (*ddata->cur == '\0')
1567 if (!cpp_demangle_read_nv_offset(ddata))
1569 return (cpp_demangle_read_encoding(ddata));
1571 case SIMPLE_HASH('T', 'H'):
1572 /* TLS init function */
1573 if (!DEM_PUSH_STR(ddata, "TLS init function for "))
1576 if (*ddata->cur == '\0')
1580 case SIMPLE_HASH('T', 'I'):
1581 /* typeinfo structure */
1582 if (!DEM_PUSH_STR(ddata, "typeinfo for "))
1585 if (*ddata->cur == '\0')
1587 return (cpp_demangle_read_type(ddata, NULL));
1589 case SIMPLE_HASH('T', 'J'):
1591 if (!DEM_PUSH_STR(ddata, "java Class for "))
1594 if (*ddata->cur == '\0')
1596 return (cpp_demangle_read_type(ddata, NULL));
1598 case SIMPLE_HASH('T', 'S'):
1599 /* RTTI name (NTBS) */
1600 if (!DEM_PUSH_STR(ddata, "typeinfo name for "))
1603 if (*ddata->cur == '\0')
1605 return (cpp_demangle_read_type(ddata, NULL));
1607 case SIMPLE_HASH('T', 'T'):
1609 if (!DEM_PUSH_STR(ddata, "VTT for "))
1612 if (*ddata->cur == '\0')
1614 return (cpp_demangle_read_type(ddata, NULL));
1616 case SIMPLE_HASH('T', 'v'):
1617 /* virtual function virtual override thunk */
1618 if (!DEM_PUSH_STR(ddata, "virtual function virtual override "))
1621 if (*ddata->cur == '\0')
1623 if (!cpp_demangle_read_v_offset(ddata))
1625 return (cpp_demangle_read_encoding(ddata));
1627 case SIMPLE_HASH('T', 'V'):
1629 if (!DEM_PUSH_STR(ddata, "vtable for "))
1632 if (*ddata->cur == '\0')
1634 return (cpp_demangle_read_type(ddata, NULL));
1636 case SIMPLE_HASH('T', 'W'):
1637 /* TLS wrapper function */
1638 if (!DEM_PUSH_STR(ddata, "TLS wrapper function for "))
1641 if (*ddata->cur == '\0')
1646 return (cpp_demangle_read_name(ddata));
1650 cpp_demangle_read_local_name(struct cpp_demangle_data *ddata)
1652 struct vector_str local_name;
1653 struct type_delimit td;
1659 if (*(++ddata->cur) == '\0')
1662 if (!vector_str_init(&local_name))
1664 ddata->cur_output = &local_name;
1666 if (!cpp_demangle_read_encoding(ddata)) {
1667 vector_str_dest(&local_name);
1671 ddata->cur_output = &ddata->output;
1679 * The first type is a return type if we just demangled template
1680 * args. (the template args is right next to the function name,
1681 * which means it's a template function)
1683 if (ddata->is_tmpl) {
1684 ddata->is_tmpl = false;
1686 /* Read return type */
1687 if (!cpp_demangle_read_type(ddata, NULL)) {
1688 vector_str_dest(&local_name);
1695 /* Now we can push the name after possible return type is handled. */
1696 if (!vector_str_push_vector(&ddata->output, &local_name)) {
1697 vector_str_dest(&local_name);
1700 vector_str_dest(&local_name);
1702 while (*ddata->cur != '\0') {
1703 if (!cpp_demangle_read_type(ddata, &td))
1707 if (*ddata->cur == 'E')
1709 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1715 if (*(++ddata->cur) == '\0')
1717 if (td.paren == true) {
1718 if (!DEM_PUSH_STR(ddata, ")"))
1722 if (*ddata->cur == 's')
1725 if (!DEM_PUSH_STR(ddata, "::"))
1727 if (!cpp_demangle_read_name(ddata))
1730 if (*ddata->cur == '_') {
1732 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1740 cpp_demangle_read_name(struct cpp_demangle_data *ddata)
1742 struct vector_str *output, v;
1743 size_t p_idx, subst_str_len;
1747 if (ddata == NULL || *ddata->cur == '\0')
1750 output = ddata->cur_output;
1754 switch (*ddata->cur) {
1756 return (cpp_demangle_read_subst(ddata));
1758 return (cpp_demangle_read_nested_name(ddata));
1760 return (cpp_demangle_read_local_name(ddata));
1763 if (!vector_str_init(&v))
1766 p_idx = output->size;
1768 if (!cpp_demangle_read_uqname(ddata))
1770 if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
1771 &subst_str_len)) == NULL)
1773 if (subst_str_len > 8 && strstr(subst_str, "operator") != NULL) {
1777 if (!vector_str_push(&v, subst_str, subst_str_len))
1779 if (!cpp_demangle_push_subst_v(ddata, &v))
1782 if (*ddata->cur == 'I') {
1783 p_idx = output->size;
1784 if (!cpp_demangle_read_tmpl_args(ddata))
1787 if ((subst_str = vector_str_substr(output, p_idx,
1788 output->size - 1, &subst_str_len)) == NULL)
1790 if (!vector_str_push(&v, subst_str, subst_str_len))
1792 if (!cpp_demangle_push_subst_v(ddata, &v))
1800 vector_str_dest(&v);
1806 cpp_demangle_read_name_flat(struct cpp_demangle_data *ddata, char **str)
1808 struct vector_str *output;
1809 size_t i, p_idx, idx, name_len;
1812 output = ddata->cur_output;
1814 p_idx = output->size;
1816 if (!cpp_demangle_read_name(ddata))
1819 if ((name = vector_str_substr(output, p_idx, output->size - 1,
1820 &name_len)) == NULL)
1824 for (i = p_idx; i < idx; ++i) {
1825 if (!vector_str_pop(output)) {
1837 cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
1839 struct vector_str *output, v;
1840 size_t limit, p_idx, subst_str_len;
1844 if (ddata == NULL || *ddata->cur != 'N')
1846 if (*(++ddata->cur) == '\0')
1850 switch (*ddata->cur) {
1852 ddata->mem_rst = true;
1855 ddata->mem_vat = true;
1858 ddata->mem_cst = true;
1861 ddata->mem_ref = true;
1864 ddata->mem_rref = true;
1869 } while (*(++ddata->cur));
1872 output = ddata->cur_output;
1873 if (!vector_str_init(&v))
1879 p_idx = output->size;
1880 switch (*ddata->cur) {
1882 if (!cpp_demangle_read_tmpl_args(ddata))
1886 if (!cpp_demangle_read_subst(ddata))
1890 if (!cpp_demangle_read_tmpl_param(ddata))
1894 if (!cpp_demangle_read_uqname(ddata))
1898 if (p_idx == output->size)
1900 if ((subst_str = vector_str_substr(output, p_idx,
1901 output->size - 1, &subst_str_len)) == NULL)
1903 if (!vector_str_push(&v, subst_str, subst_str_len)) {
1909 if (!cpp_demangle_push_subst_v(ddata, &v))
1913 if (*ddata->cur == 'E')
1915 else if (*ddata->cur != 'I' && *ddata->cur != 'C' &&
1916 *ddata->cur != 'D' && p_idx != output->size) {
1917 if (!DEM_PUSH_STR(ddata, "::"))
1919 if (!VEC_PUSH_STR(&v, "::"))
1922 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1930 vector_str_dest(&v);
1937 * number ::= [n] <decimal>
1940 cpp_demangle_read_number(struct cpp_demangle_data *ddata, long *rtn)
1942 long len, negative_factor;
1944 if (ddata == NULL || rtn == NULL)
1947 negative_factor = 1;
1948 if (*ddata->cur == 'n') {
1949 negative_factor = -1;
1953 if (ELFTC_ISDIGIT(*ddata->cur) == 0)
1957 if ((len = strtol(ddata->cur, (char **) NULL, 10)) == 0 &&
1961 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1965 assert(negative_factor == 1 || negative_factor == -1);
1967 *rtn = len * negative_factor;
1973 cpp_demangle_read_number_as_string(struct cpp_demangle_data *ddata, char **str)
1977 if (!cpp_demangle_read_number(ddata, &n)) {
1982 if (asprintf(str, "%ld", n) < 0) {
1991 cpp_demangle_read_nv_offset(struct cpp_demangle_data *ddata)
1997 if (!DEM_PUSH_STR(ddata, "offset : "))
2000 return (cpp_demangle_read_offset_number(ddata));
2003 /* read offset, offset are nv-offset, v-offset */
2005 cpp_demangle_read_offset(struct cpp_demangle_data *ddata)
2011 if (*ddata->cur == 'h') {
2013 return (cpp_demangle_read_nv_offset(ddata));
2014 } else if (*ddata->cur == 'v') {
2016 return (cpp_demangle_read_v_offset(ddata));
2023 cpp_demangle_read_offset_number(struct cpp_demangle_data *ddata)
2028 if (ddata == NULL || *ddata->cur == '\0')
2031 /* offset could be negative */
2032 if (*ddata->cur == 'n') {
2034 start = ddata->cur + 1;
2040 while (*ddata->cur != '_')
2043 if (negative && !DEM_PUSH_STR(ddata, "-"))
2046 assert(start != NULL);
2048 if (!cpp_demangle_push_str(ddata, start, ddata->cur - start))
2050 if (!DEM_PUSH_STR(ddata, " "))
2059 cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *ddata,
2060 struct vector_type_qualifier *v)
2062 size_t class_type_len, i, idx, p_idx;
2063 int p_func_type, rtn;
2066 if (ddata == NULL || *ddata->cur != 'M' || *(++ddata->cur) == '\0')
2069 p_idx = ddata->output.size;
2070 if (!cpp_demangle_read_type(ddata, NULL))
2073 if ((class_type = vector_str_substr(&ddata->output, p_idx,
2074 ddata->output.size - 1, &class_type_len)) == NULL)
2078 idx = ddata->output.size;
2079 for (i = p_idx; i < idx; ++i)
2080 if (!vector_str_pop(&ddata->output))
2083 if (!vector_read_cmd_push(&ddata->cmd, READ_PTRMEM, v))
2086 if (!vector_str_push(&ddata->class_type, class_type, class_type_len))
2089 p_func_type = ddata->func_type;
2090 if (!cpp_demangle_read_type(ddata, NULL))
2093 if (p_func_type == ddata->func_type) {
2094 if (!DEM_PUSH_STR(ddata, " "))
2096 if (!cpp_demangle_push_str(ddata, class_type, class_type_len))
2098 if (!DEM_PUSH_STR(ddata, "::*"))
2104 if (!vector_str_pop(&ddata->class_type))
2107 if (!vector_read_cmd_pop(&ddata->cmd))
2112 vector_type_qualifier_dest(v);
2113 if (!vector_type_qualifier_init(v))
2119 /* read source-name, source-name is <len> <ID> */
2121 cpp_demangle_read_sname(struct cpp_demangle_data *ddata)
2126 if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 ||
2130 if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0))
2131 err = DEM_PUSH_STR(ddata, "(anonymous namespace)");
2133 err = cpp_demangle_push_str(ddata, ddata->cur, len);
2138 assert(ddata->output.size > 0);
2139 if (vector_read_cmd_find(&ddata->cmd, READ_TMPL) == NULL)
2141 ddata->output.container[ddata->output.size - 1];
2149 cpp_demangle_read_subst(struct cpp_demangle_data *ddata)
2153 if (ddata == NULL || *ddata->cur == '\0')
2156 /* abbreviations of the form Sx */
2157 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2158 case SIMPLE_HASH('S', 'a'):
2159 /* std::allocator */
2160 if (!DEM_PUSH_STR(ddata, "std::allocator"))
2163 if (*ddata->cur == 'I')
2164 return (cpp_demangle_read_subst_stdtmpl(ddata,
2168 case SIMPLE_HASH('S', 'b'):
2169 /* std::basic_string */
2170 if (!DEM_PUSH_STR(ddata, "std::basic_string"))
2173 if (*ddata->cur == 'I')
2174 return (cpp_demangle_read_subst_stdtmpl(ddata,
2175 "std::basic_string"));
2178 case SIMPLE_HASH('S', 'd'):
2179 /* std::basic_iostream<char, std::char_traits<char> > */
2180 if (!DEM_PUSH_STR(ddata, "std::basic_iostream<char, "
2181 "std::char_traits<char> >"))
2183 ddata->last_sname = "basic_iostream";
2185 if (*ddata->cur == 'I')
2186 return (cpp_demangle_read_subst_stdtmpl(ddata,
2187 "std::basic_iostream<char, std::char_traits"
2191 case SIMPLE_HASH('S', 'i'):
2192 /* std::basic_istream<char, std::char_traits<char> > */
2193 if (!DEM_PUSH_STR(ddata, "std::basic_istream<char, "
2194 "std::char_traits<char> >"))
2196 ddata->last_sname = "basic_istream";
2198 if (*ddata->cur == 'I')
2199 return (cpp_demangle_read_subst_stdtmpl(ddata,
2200 "std::basic_istream<char, std::char_traits"
2204 case SIMPLE_HASH('S', 'o'):
2205 /* std::basic_ostream<char, std::char_traits<char> > */
2206 if (!DEM_PUSH_STR(ddata, "std::basic_ostream<char, "
2207 "std::char_traits<char> >"))
2209 ddata->last_sname = "basic_ostream";
2211 if (*ddata->cur == 'I')
2212 return (cpp_demangle_read_subst_stdtmpl(ddata,
2213 "std::basic_ostream<char, std::char_traits"
2217 case SIMPLE_HASH('S', 's'):
2219 * std::basic_string<char, std::char_traits<char>,
2220 * std::allocator<char> >
2224 if (!DEM_PUSH_STR(ddata, "std::basic_string<char, "
2225 "std::char_traits<char>, std::allocator<char> >"))
2227 ddata->last_sname = "string";
2229 if (*ddata->cur == 'I')
2230 return (cpp_demangle_read_subst_stdtmpl(ddata,
2231 "std::basic_string<char, std::char_traits<char>,"
2232 " std::allocator<char> >"));
2235 case SIMPLE_HASH('S', 't'):
2237 return (cpp_demangle_read_subst_std(ddata));
2240 if (*(++ddata->cur) == '\0')
2243 /* Skip unknown substitution abbreviations. */
2244 if (!(*ddata->cur >= '0' && *ddata->cur <= '9') &&
2245 !(*ddata->cur >= 'A' && *ddata->cur <= 'Z') &&
2246 *ddata->cur != '_') {
2252 if (*ddata->cur == '_')
2253 return (cpp_demangle_get_subst(ddata, 0));
2256 /* substitution number is base 36 */
2257 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2261 /* first was '_', so increase one */
2264 while (*ddata->cur != '_')
2269 return (cpp_demangle_get_subst(ddata, nth));
2277 cpp_demangle_read_subst_std(struct cpp_demangle_data *ddata)
2279 struct vector_str *output, v;
2280 size_t p_idx, subst_str_len;
2287 if (!vector_str_init(&v))
2292 if (!DEM_PUSH_STR(ddata, "std::"))
2295 if (!VEC_PUSH_STR(&v, "std::"))
2300 output = ddata->cur_output;
2302 p_idx = output->size;
2303 if (!cpp_demangle_read_uqname(ddata))
2306 if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2307 &subst_str_len)) == NULL)
2310 if (!vector_str_push(&v, subst_str, subst_str_len))
2313 if (!cpp_demangle_push_subst_v(ddata, &v))
2316 if (*ddata->cur == 'I') {
2317 p_idx = output->size;
2318 if (!cpp_demangle_read_tmpl_args(ddata))
2321 if ((subst_str = vector_str_substr(output, p_idx,
2322 output->size - 1, &subst_str_len)) == NULL)
2324 if (!vector_str_push(&v, subst_str, subst_str_len))
2326 if (!cpp_demangle_push_subst_v(ddata, &v))
2333 vector_str_dest(&v);
2339 cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *ddata,
2342 struct vector_str *output;
2343 size_t p_idx, substr_len, len;
2345 char *subst_str, *substr;
2347 if (ddata == NULL || str == NULL)
2350 if ((len = strlen(str)) == 0)
2353 output = ddata->cur_output;
2355 p_idx = output->size;
2359 if (!cpp_demangle_read_tmpl_args(ddata))
2361 if ((substr = vector_str_substr(output, p_idx, output->size - 1,
2362 &substr_len)) == NULL)
2366 if ((subst_str = malloc(sizeof(char) * (substr_len + len + 1))) ==
2370 memcpy(subst_str, str, len);
2371 memcpy(subst_str + len, substr, substr_len);
2372 subst_str[substr_len + len] = '\0';
2374 if (!cpp_demangle_push_subst(ddata, subst_str, substr_len + len))
2386 cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata)
2389 if (ddata == NULL || *ddata->cur == '\0')
2392 switch (*ddata->cur) {
2394 return (cpp_demangle_read_expr_primary(ddata));
2397 if (!cpp_demangle_read_expression(ddata))
2399 return (*ddata->cur++ == 'E');
2402 return (cpp_demangle_read_type(ddata, NULL));
2406 cpp_demangle_read_tmpl_args(struct cpp_demangle_data *ddata)
2408 struct vector_str *v;
2409 size_t arg_len, idx, limit, size;
2412 if (ddata == NULL || *ddata->cur == '\0')
2417 if (!vector_read_cmd_push(&ddata->cmd, READ_TMPL, NULL))
2420 if (!DEM_PUSH_STR(ddata, "<"))
2427 if (!cpp_demangle_read_tmpl_arg(ddata))
2429 if ((arg = vector_str_substr(v, idx, v->size - 1, &arg_len)) ==
2432 if (!vector_str_find(&ddata->tmpl, arg, arg_len) &&
2433 !vector_str_push(&ddata->tmpl, arg, arg_len)) {
2440 if (*ddata->cur == 'E') {
2444 if (!strncmp(v->container[size - 1], ">", 1)) {
2445 if (!DEM_PUSH_STR(ddata, " >"))
2447 } else if (!DEM_PUSH_STR(ddata, ">"))
2449 ddata->is_tmpl = true;
2451 } else if (*ddata->cur != 'I' &&
2452 !DEM_PUSH_STR(ddata, ", "))
2455 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2459 return (vector_read_cmd_pop(&ddata->cmd));
2463 * Read template parameter that forms in 'T[number]_'.
2464 * This function much like to read_subst but only for types.
2467 cpp_demangle_read_tmpl_param(struct cpp_demangle_data *ddata)
2471 if (ddata == NULL || *ddata->cur != 'T')
2476 if (*ddata->cur == '_')
2477 return (cpp_demangle_get_tmpl_param(ddata, 0));
2481 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2488 while (*ddata->cur != '_')
2493 return (cpp_demangle_get_tmpl_param(ddata, nth));
2501 cpp_demangle_read_type(struct cpp_demangle_data *ddata,
2502 struct type_delimit *td)
2504 struct vector_type_qualifier v;
2505 struct vector_str *output, sv;
2506 size_t p_idx, type_str_len, subst_str_len;
2507 int extern_c, is_builtin;
2510 char *type_str, *exp_str, *num_str, *subst_str;
2511 bool skip_ref_qualifier, omit_void;
2516 output = ddata->cur_output;
2518 if (td->paren == false) {
2519 if (!DEM_PUSH_STR(ddata, "("))
2521 if (ddata->output.size < 2)
2527 if (*ddata->cur != 'I') {
2528 if (!DEM_PUSH_STR(ddata, ", "))
2534 assert(output != NULL);
2536 * [r, V, K] [P, R, O, C, G, U] builtin, function, class-enum, array
2537 * pointer-to-member, template-param, template-template-param, subst
2540 if (!vector_type_qualifier_init(&v))
2545 p_idx = output->size;
2546 type_str = exp_str = num_str = NULL;
2547 skip_ref_qualifier = false;
2551 /* Clear ref-qualifier flag */
2552 if (*ddata->cur != 'R' && *ddata->cur != 'O' && *ddata->cur != 'E')
2553 ddata->ref_qualifier = false;
2556 switch (*ddata->cur) {
2559 if (!DEM_PUSH_STR(ddata, "signed char"))
2566 if (!cpp_demangle_read_array(ddata))
2573 if (!DEM_PUSH_STR(ddata, "bool"))
2580 if (!vector_type_qualifier_push(&v, TYPE_CMX))
2589 if (!DEM_PUSH_STR(ddata, "char"))
2596 if (!DEM_PUSH_STR(ddata, "double"))
2603 switch (*ddata->cur) {
2606 if (!DEM_PUSH_STR(ddata, "auto"))
2611 /* decltype(auto) */
2612 if (!DEM_PUSH_STR(ddata, "decltype(auto)"))
2617 /* IEEE 754r decimal floating point (64 bits) */
2618 if (!DEM_PUSH_STR(ddata, "decimal64"))
2623 /* IEEE 754r decimal floating point (128 bits) */
2624 if (!DEM_PUSH_STR(ddata, "decimal128"))
2629 /* IEEE 754r decimal floating point (32 bits) */
2630 if (!DEM_PUSH_STR(ddata, "decimal32"))
2635 /* IEEE 754r half-precision floating point (16 bits) */
2636 if (!DEM_PUSH_STR(ddata, "half"))
2642 if (!DEM_PUSH_STR(ddata, "char32_t"))
2647 /* std::nullptr_t (i.e., decltype(nullptr)) */
2648 if (!DEM_PUSH_STR(ddata, "decltype(nullptr)"))
2654 if (!DEM_PUSH_STR(ddata, "char16_t"))
2659 /* gcc vector_size extension. */
2661 if (*ddata->cur == '_') {
2663 if (!cpp_demangle_read_expression_flat(ddata,
2666 if (!VEC_PUSH_STR(&v.ext_name, exp_str))
2669 if (!cpp_demangle_read_number_as_string(ddata,
2672 if (!VEC_PUSH_STR(&v.ext_name, num_str))
2675 if (*ddata->cur != '_')
2678 if (!vector_type_qualifier_push(&v, TYPE_VEC))
2690 if (!DEM_PUSH_STR(ddata, "long double"))
2696 /* unexpected end except ref-qualifiers */
2697 if (ddata->ref_qualifier && ddata->is_functype) {
2698 skip_ref_qualifier = true;
2699 /* Pop the delimiter. */
2700 cpp_demangle_pop_str(ddata);
2707 if (!DEM_PUSH_STR(ddata, "float"))
2714 if (!cpp_demangle_read_function(ddata, &extern_c, &v))
2721 if (!DEM_PUSH_STR(ddata, "__float128"))
2728 if (!vector_type_qualifier_push(&v, TYPE_IMG))
2737 if (!DEM_PUSH_STR(ddata, "unsigned char"))
2744 if (!DEM_PUSH_STR(ddata, "int"))
2750 /* template args. */
2751 /* handles <substitute><template-args> */
2752 p_idx = output->size;
2753 if (!cpp_demangle_read_tmpl_args(ddata))
2755 if ((subst_str = vector_str_substr(output, p_idx,
2756 output->size - 1, &subst_str_len)) == NULL)
2758 if (!vector_str_init(&sv)) {
2762 if (!vector_str_push(&sv, subst_str, subst_str_len)) {
2764 vector_str_dest(&sv);
2768 if (!cpp_demangle_push_subst_v(ddata, &sv)) {
2769 vector_str_dest(&sv);
2772 vector_str_dest(&sv);
2777 if (!DEM_PUSH_STR(ddata, "unsigned int"))
2784 if (!vector_type_qualifier_push(&v, TYPE_CST))
2793 if (!DEM_PUSH_STR(ddata, "long"))
2800 if (!DEM_PUSH_STR(ddata, "unsigned long"))
2807 /* pointer to member */
2808 if (!cpp_demangle_read_pointer_to_member(ddata, &v))
2815 if (!DEM_PUSH_STR(ddata, "__int128"))
2821 /* unsigned __int128 */
2822 if (!DEM_PUSH_STR(ddata, "unsigned __int128"))
2828 /* rvalue reference */
2829 if (ddata->ref_qualifier)
2831 if (!vector_type_qualifier_push(&v, TYPE_RREF))
2833 ddata->ref_qualifier = true;
2834 ddata->ref_qualifier_type = TYPE_RREF;
2842 if (!vector_type_qualifier_push(&v, TYPE_PTR))
2851 if (!vector_type_qualifier_push(&v, TYPE_RST))
2860 if (ddata->ref_qualifier)
2862 if (!vector_type_qualifier_push(&v, TYPE_REF))
2864 ddata->ref_qualifier = true;
2865 ddata->ref_qualifier_type = TYPE_REF;
2872 /* short, local string */
2873 if (!DEM_PUSH_STR(ddata, "short"))
2880 if (!cpp_demangle_read_subst(ddata))
2886 /* unsigned short */
2887 if (!DEM_PUSH_STR(ddata, "unsigned short"))
2893 /* template parameter */
2894 if (!cpp_demangle_read_tmpl_param(ddata))
2900 /* vendor extended builtin */
2902 if (!cpp_demangle_read_sname(ddata))
2908 /* vendor extended type qualifier */
2910 if (!cpp_demangle_read_number(ddata, &len))
2914 if (!vector_str_push(&v.ext_name, ddata->cur, len))
2917 if (!vector_type_qualifier_push(&v, TYPE_EXT))
2926 if (td && td->firstp) {
2928 * peek into next bytes and see if we should omit
2932 for (p = ddata->cur + 1; *p != '\0'; p++) {
2935 if (*p != 'R' && *p != 'O') {
2941 if (!omit_void && !DEM_PUSH_STR(ddata, "void"))
2948 if (!vector_type_qualifier_push(&v, TYPE_VAT))
2957 if (!DEM_PUSH_STR(ddata, "wchar_t"))
2964 if (!DEM_PUSH_STR(ddata, "long long"))
2970 /* unsigned long long */
2971 if (!DEM_PUSH_STR(ddata, "unsigned long long"))
2978 if (!DEM_PUSH_STR(ddata, "..."))
2984 if (!cpp_demangle_read_name(ddata))
2990 type_str = vector_str_substr(output, p_idx, output->size - 1,
2993 if (is_builtin == 0) {
2994 if (!vector_str_find(&ddata->subst, type_str, type_str_len) &&
2995 !vector_str_push(&ddata->subst, type_str, type_str_len))
2999 if (!skip_ref_qualifier &&
3000 !cpp_demangle_push_type_qualifier(ddata, &v, type_str))
3009 vector_type_qualifier_dest(&v);
3016 vector_type_qualifier_dest(&v);
3022 cpp_demangle_read_type_flat(struct cpp_demangle_data *ddata, char **str)
3024 struct vector_str *output;
3025 size_t i, p_idx, idx, type_len;
3028 output = ddata->cur_output;
3030 p_idx = output->size;
3032 if (!cpp_demangle_read_type(ddata, NULL))
3035 if ((type = vector_str_substr(output, p_idx, output->size - 1,
3036 &type_len)) == NULL)
3040 for (i = p_idx; i < idx; ++i) {
3041 if (!vector_str_pop(output)) {
3053 * read unqualified-name, unqualified name are operator-name, ctor-dtor-name,
3057 cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
3061 if (ddata == NULL || *ddata->cur == '\0')
3065 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3066 case SIMPLE_HASH('a', 'a'):
3068 if (!DEM_PUSH_STR(ddata, "operator&&"))
3073 case SIMPLE_HASH('a', 'd'):
3074 /* operator & (unary) */
3075 if (!DEM_PUSH_STR(ddata, "operator&"))
3080 case SIMPLE_HASH('a', 'n'):
3082 if (!DEM_PUSH_STR(ddata, "operator&"))
3087 case SIMPLE_HASH('a', 'N'):
3089 if (!DEM_PUSH_STR(ddata, "operator&="))
3094 case SIMPLE_HASH('a', 'S'):
3096 if (!DEM_PUSH_STR(ddata, "operator="))
3101 case SIMPLE_HASH('c', 'l'):
3103 if (!DEM_PUSH_STR(ddata, "operator()"))
3108 case SIMPLE_HASH('c', 'm'):
3110 if (!DEM_PUSH_STR(ddata, "operator,"))
3115 case SIMPLE_HASH('c', 'o'):
3117 if (!DEM_PUSH_STR(ddata, "operator~"))
3122 case SIMPLE_HASH('c', 'v'):
3123 /* operator (cast) */
3124 if (!DEM_PUSH_STR(ddata, "operator(cast)"))
3127 return (cpp_demangle_read_type(ddata, NULL));
3129 case SIMPLE_HASH('d', 'a'):
3130 /* operator delete [] */
3131 if (!DEM_PUSH_STR(ddata, "operator delete []"))
3136 case SIMPLE_HASH('d', 'e'):
3137 /* operator * (unary) */
3138 if (!DEM_PUSH_STR(ddata, "operator*"))
3143 case SIMPLE_HASH('d', 'l'):
3144 /* operator delete */
3145 if (!DEM_PUSH_STR(ddata, "operator delete"))
3150 case SIMPLE_HASH('d', 'v'):
3152 if (!DEM_PUSH_STR(ddata, "operator/"))
3157 case SIMPLE_HASH('d', 'V'):
3159 if (!DEM_PUSH_STR(ddata, "operator/="))
3164 case SIMPLE_HASH('e', 'o'):
3166 if (!DEM_PUSH_STR(ddata, "operator^"))
3171 case SIMPLE_HASH('e', 'O'):
3173 if (!DEM_PUSH_STR(ddata, "operator^="))
3178 case SIMPLE_HASH('e', 'q'):
3180 if (!DEM_PUSH_STR(ddata, "operator=="))
3185 case SIMPLE_HASH('g', 'e'):
3187 if (!DEM_PUSH_STR(ddata, "operator>="))
3192 case SIMPLE_HASH('g', 't'):
3194 if (!DEM_PUSH_STR(ddata, "operator>"))
3199 case SIMPLE_HASH('i', 'x'):
3201 if (!DEM_PUSH_STR(ddata, "operator[]"))
3206 case SIMPLE_HASH('l', 'e'):
3208 if (!DEM_PUSH_STR(ddata, "operator<="))
3213 case SIMPLE_HASH('l', 's'):
3215 if (!DEM_PUSH_STR(ddata, "operator<<"))
3220 case SIMPLE_HASH('l', 'S'):
3222 if (!DEM_PUSH_STR(ddata, "operator<<="))
3227 case SIMPLE_HASH('l', 't'):
3229 if (!DEM_PUSH_STR(ddata, "operator<"))
3234 case SIMPLE_HASH('m', 'i'):
3236 if (!DEM_PUSH_STR(ddata, "operator-"))
3241 case SIMPLE_HASH('m', 'I'):
3243 if (!DEM_PUSH_STR(ddata, "operator-="))
3248 case SIMPLE_HASH('m', 'l'):
3250 if (!DEM_PUSH_STR(ddata, "operator*"))
3255 case SIMPLE_HASH('m', 'L'):
3257 if (!DEM_PUSH_STR(ddata, "operator*="))
3262 case SIMPLE_HASH('m', 'm'):
3264 if (!DEM_PUSH_STR(ddata, "operator--"))
3269 case SIMPLE_HASH('n', 'a'):
3270 /* operator new[] */
3271 if (!DEM_PUSH_STR(ddata, "operator new []"))
3276 case SIMPLE_HASH('n', 'e'):
3278 if (!DEM_PUSH_STR(ddata, "operator!="))
3283 case SIMPLE_HASH('n', 'g'):
3284 /* operator - (unary) */
3285 if (!DEM_PUSH_STR(ddata, "operator-"))
3290 case SIMPLE_HASH('n', 't'):
3292 if (!DEM_PUSH_STR(ddata, "operator!"))
3297 case SIMPLE_HASH('n', 'w'):
3299 if (!DEM_PUSH_STR(ddata, "operator new"))
3304 case SIMPLE_HASH('o', 'o'):
3306 if (!DEM_PUSH_STR(ddata, "operator||"))
3311 case SIMPLE_HASH('o', 'r'):
3313 if (!DEM_PUSH_STR(ddata, "operator|"))
3318 case SIMPLE_HASH('o', 'R'):
3320 if (!DEM_PUSH_STR(ddata, "operator|="))
3325 case SIMPLE_HASH('p', 'l'):
3327 if (!DEM_PUSH_STR(ddata, "operator+"))
3332 case SIMPLE_HASH('p', 'L'):
3334 if (!DEM_PUSH_STR(ddata, "operator+="))
3339 case SIMPLE_HASH('p', 'm'):
3341 if (!DEM_PUSH_STR(ddata, "operator->*"))
3346 case SIMPLE_HASH('p', 'p'):
3348 if (!DEM_PUSH_STR(ddata, "operator++"))
3353 case SIMPLE_HASH('p', 's'):
3354 /* operator + (unary) */
3355 if (!DEM_PUSH_STR(ddata, "operator+"))
3360 case SIMPLE_HASH('p', 't'):
3362 if (!DEM_PUSH_STR(ddata, "operator->"))
3367 case SIMPLE_HASH('q', 'u'):
3369 if (!DEM_PUSH_STR(ddata, "operator?"))
3374 case SIMPLE_HASH('r', 'm'):
3376 if (!DEM_PUSH_STR(ddata, "operator%"))
3381 case SIMPLE_HASH('r', 'M'):
3383 if (!DEM_PUSH_STR(ddata, "operator%="))
3388 case SIMPLE_HASH('r', 's'):
3390 if (!DEM_PUSH_STR(ddata, "operator>>"))
3395 case SIMPLE_HASH('r', 'S'):
3397 if (!DEM_PUSH_STR(ddata, "operator>>="))
3402 case SIMPLE_HASH('r', 'z'):
3403 /* operator sizeof */
3404 if (!DEM_PUSH_STR(ddata, "operator sizeof "))
3409 case SIMPLE_HASH('s', 'r'):
3410 /* scope resolution operator */
3411 if (!DEM_PUSH_STR(ddata, "scope resolution operator "))
3416 case SIMPLE_HASH('s', 'v'):
3417 /* operator sizeof */
3418 if (!DEM_PUSH_STR(ddata, "operator sizeof "))
3424 /* vendor extened operator */
3425 if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) {
3426 if (!DEM_PUSH_STR(ddata, "vendor extened operator "))
3428 if (!cpp_demangle_push_str(ddata, ddata->cur + 1, 1))
3431 return (cpp_demangle_read_sname(ddata));
3434 /* ctor-dtor-name */
3435 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3436 case SIMPLE_HASH('C', '1'):
3437 case SIMPLE_HASH('C', '2'):
3438 case SIMPLE_HASH('C', '3'):
3439 if (ddata->last_sname == NULL)
3441 if ((len = strlen(ddata->last_sname)) == 0)
3443 if (!DEM_PUSH_STR(ddata, "::"))
3445 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3450 case SIMPLE_HASH('D', '0'):
3451 case SIMPLE_HASH('D', '1'):
3452 case SIMPLE_HASH('D', '2'):
3453 if (ddata->last_sname == NULL)
3455 if ((len = strlen(ddata->last_sname)) == 0)
3457 if (!DEM_PUSH_STR(ddata, "::~"))
3459 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3466 if (ELFTC_ISDIGIT(*ddata->cur) != 0)
3467 return (cpp_demangle_read_sname(ddata));
3469 /* local source name */
3470 if (*ddata->cur == 'L')
3471 return (cpp_demangle_local_source_name(ddata));
3477 * Read local source name.
3480 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775
3481 * http://gcc.gnu.org/viewcvs?view=rev&revision=124467
3484 cpp_demangle_local_source_name(struct cpp_demangle_data *ddata)
3487 if (ddata == NULL || *ddata->cur != 'L')
3492 if (!cpp_demangle_read_sname(ddata))
3496 if (*ddata->cur == '_') {
3498 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
3506 cpp_demangle_read_v_offset(struct cpp_demangle_data *ddata)
3512 if (!DEM_PUSH_STR(ddata, "offset : "))
3515 if (!cpp_demangle_read_offset_number(ddata))
3518 if (!DEM_PUSH_STR(ddata, "virtual offset : "))
3521 return (!cpp_demangle_read_offset_number(ddata));
3525 * Decode floating point representation to string
3526 * Return new allocated string or NULL
3529 * Replace these functions to macro.
3532 decode_fp_to_double(const char *p, size_t len)
3535 size_t rtn_len, limit, i;
3539 if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(double))
3542 memset(&f, 0, sizeof(double));
3544 for (i = 0; i < len / 2; ++i) {
3545 byte = hex_to_dec(p[len - i * 2 - 1]) +
3546 hex_to_dec(p[len - i * 2 - 2]) * 16;
3548 if (byte < 0 || byte > 255)
3551 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3552 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3553 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3554 ((unsigned char *)&f)[sizeof(double) - i - 1] =
3555 (unsigned char)(byte);
3556 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3562 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3565 if (snprintf(rtn, rtn_len, "%fld", f) >= (int)rtn_len) {
3567 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3569 rtn_len *= BUFFER_GROWFACTOR;
3577 decode_fp_to_float(const char *p, size_t len)
3579 size_t i, rtn_len, limit;
3584 if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(float))
3587 memset(&f, 0, sizeof(float));
3589 for (i = 0; i < len / 2; ++i) {
3590 byte = hex_to_dec(p[len - i * 2 - 1]) +
3591 hex_to_dec(p[len - i * 2 - 2]) * 16;
3592 if (byte < 0 || byte > 255)
3594 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3595 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3596 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3597 ((unsigned char *)&f)[sizeof(float) - i - 1] =
3598 (unsigned char)(byte);
3599 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3605 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3608 if (snprintf(rtn, rtn_len, "%ff", f) >= (int)rtn_len) {
3610 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3612 rtn_len *= BUFFER_GROWFACTOR;
3620 decode_fp_to_float128(const char *p, size_t len)
3623 size_t rtn_len, limit, i;
3625 unsigned char buf[FLOAT_QUADRUPLE_BYTES];
3628 switch(sizeof(long double)) {
3629 case FLOAT_QUADRUPLE_BYTES:
3630 return (decode_fp_to_long_double(p, len));
3631 case FLOAT_EXTENED_BYTES:
3632 if (p == NULL || len == 0 || len % 2 != 0 ||
3633 len / 2 > FLOAT_QUADRUPLE_BYTES)
3636 memset(buf, 0, FLOAT_QUADRUPLE_BYTES);
3638 for (i = 0; i < len / 2; ++i) {
3639 byte = hex_to_dec(p[len - i * 2 - 1]) +
3640 hex_to_dec(p[len - i * 2 - 2]) * 16;
3641 if (byte < 0 || byte > 255)
3643 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3644 buf[i] = (unsigned char)(byte);
3645 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3646 buf[FLOAT_QUADRUPLE_BYTES - i -1] =
3647 (unsigned char)(byte);
3648 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3650 memset(&f, 0, FLOAT_EXTENED_BYTES);
3652 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3653 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3654 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3655 memcpy(&f, buf + 6, FLOAT_EXTENED_BYTES);
3656 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3661 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3664 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3666 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3668 rtn_len *= BUFFER_GROWFACTOR;
3679 decode_fp_to_float80(const char *p, size_t len)
3682 size_t rtn_len, limit, i;
3684 unsigned char buf[FLOAT_EXTENED_BYTES];
3687 switch(sizeof(long double)) {
3688 case FLOAT_QUADRUPLE_BYTES:
3689 if (p == NULL || len == 0 || len % 2 != 0 ||
3690 len / 2 > FLOAT_EXTENED_BYTES)
3693 memset(buf, 0, FLOAT_EXTENED_BYTES);
3695 for (i = 0; i < len / 2; ++i) {
3696 byte = hex_to_dec(p[len - i * 2 - 1]) +
3697 hex_to_dec(p[len - i * 2 - 2]) * 16;
3699 if (byte < 0 || byte > 255)
3702 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3703 buf[i] = (unsigned char)(byte);
3704 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3705 buf[FLOAT_EXTENED_BYTES - i -1] =
3706 (unsigned char)(byte);
3707 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3710 memset(&f, 0, FLOAT_QUADRUPLE_BYTES);
3712 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3713 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3714 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3715 memcpy((unsigned char *)(&f) + 6, buf, FLOAT_EXTENED_BYTES);
3716 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3721 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3724 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3726 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3728 rtn_len *= BUFFER_GROWFACTOR;
3733 case FLOAT_EXTENED_BYTES:
3734 return (decode_fp_to_long_double(p, len));
3741 decode_fp_to_long_double(const char *p, size_t len)
3744 size_t rtn_len, limit, i;
3748 if (p == NULL || len == 0 || len % 2 != 0 ||
3749 len / 2 > sizeof(long double))
3752 memset(&f, 0, sizeof(long double));
3754 for (i = 0; i < len / 2; ++i) {
3755 byte = hex_to_dec(p[len - i * 2 - 1]) +
3756 hex_to_dec(p[len - i * 2 - 2]) * 16;
3758 if (byte < 0 || byte > 255)
3761 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3762 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3763 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3764 ((unsigned char *)&f)[sizeof(long double) - i - 1] =
3765 (unsigned char)(byte);
3766 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3772 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3775 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3777 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3779 rtn_len *= BUFFER_GROWFACTOR;
3786 /* Simple hex to integer function used by decode_to_* function. */
3830 * @brief Test input string is mangled by IA-64 C++ ABI style.
3832 * Test string heads with "_Z" or "_GLOBAL__I_".
3833 * @return Return 0 at false.
3836 is_cpp_mangled_gnu3(const char *org)
3841 return ((len > 2 && *org == '_' && *(org + 1) == 'Z') ||
3842 (len > 11 && !strncmp(org, "_GLOBAL__I_", 11)));
3846 vector_read_cmd_dest(struct vector_read_cmd *v)
3852 free(v->r_container);
3855 static struct read_cmd_item *
3856 vector_read_cmd_find(struct vector_read_cmd *v, enum read_cmd dst)
3860 if (v == NULL || dst == READ_FAIL)
3863 for (i = (int) v->size - 1; i >= 0; i--)
3864 if (v->r_container[i].cmd == dst)
3865 return (&v->r_container[i]);
3871 vector_read_cmd_init(struct vector_read_cmd *v)
3878 v->capacity = VECTOR_DEF_CAPACITY;
3880 if ((v->r_container = malloc(sizeof(*v->r_container) * v->capacity))
3888 vector_read_cmd_pop(struct vector_read_cmd *v)
3891 if (v == NULL || v->size == 0)
3895 v->r_container[v->size].cmd = READ_FAIL;
3896 v->r_container[v->size].data = NULL;
3902 vector_read_cmd_push(struct vector_read_cmd *v, enum read_cmd cmd, void *data)
3904 struct read_cmd_item *tmp_r_ctn;
3911 if (v->size == v->capacity) {
3912 tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3913 if ((tmp_r_ctn = malloc(sizeof(*tmp_r_ctn) * tmp_cap)) == NULL)
3915 for (i = 0; i < v->size; ++i)
3916 tmp_r_ctn[i] = v->r_container[i];
3917 free(v->r_container);
3918 v->r_container = tmp_r_ctn;
3919 v->capacity = tmp_cap;
3922 v->r_container[v->size].cmd = cmd;
3923 v->r_container[v->size].data = data;
3930 vector_type_qualifier_dest(struct vector_type_qualifier *v)
3936 free(v->q_container);
3937 vector_str_dest(&v->ext_name);
3940 /* size, capacity, ext_name */
3942 vector_type_qualifier_init(struct vector_type_qualifier *v)
3949 v->capacity = VECTOR_DEF_CAPACITY;
3951 if ((v->q_container = malloc(sizeof(enum type_qualifier) * v->capacity))
3955 assert(v->q_container != NULL);
3957 if (!vector_str_init(&v->ext_name)) {
3958 free(v->q_container);
3966 vector_type_qualifier_push(struct vector_type_qualifier *v,
3967 enum type_qualifier t)
3969 enum type_qualifier *tmp_ctn;
3976 if (v->size == v->capacity) {
3977 tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3978 if ((tmp_ctn = malloc(sizeof(enum type_qualifier) * tmp_cap))
3981 for (i = 0; i < v->size; ++i)
3982 tmp_ctn[i] = v->q_container[i];
3983 free(v->q_container);
3984 v->q_container = tmp_ctn;
3985 v->capacity = tmp_cap;
3988 v->q_container[v->size] = t;