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 vector_str_init(&local_name);
1663 ddata->cur_output = &local_name;
1665 if (!cpp_demangle_read_encoding(ddata)) {
1666 vector_str_dest(&local_name);
1670 ddata->cur_output = &ddata->output;
1678 * The first type is a return type if we just demangled template
1679 * args. (the template args is right next to the function name,
1680 * which means it's a template function)
1682 if (ddata->is_tmpl) {
1683 ddata->is_tmpl = false;
1685 /* Read return type */
1686 if (!cpp_demangle_read_type(ddata, NULL)) {
1687 vector_str_dest(&local_name);
1694 /* Now we can push the name after possible return type is handled. */
1695 if (!vector_str_push_vector(&ddata->output, &local_name)) {
1696 vector_str_dest(&local_name);
1699 vector_str_dest(&local_name);
1701 while (*ddata->cur != '\0') {
1702 if (!cpp_demangle_read_type(ddata, &td))
1706 if (*ddata->cur == 'E')
1708 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1714 if (*(++ddata->cur) == '\0')
1716 if (td.paren == true) {
1717 if (!DEM_PUSH_STR(ddata, ")"))
1721 if (*ddata->cur == 's')
1724 if (!DEM_PUSH_STR(ddata, "::"))
1726 if (!cpp_demangle_read_name(ddata))
1729 if (*ddata->cur == '_') {
1731 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1739 cpp_demangle_read_name(struct cpp_demangle_data *ddata)
1741 struct vector_str *output, v;
1742 size_t p_idx, subst_str_len;
1746 if (ddata == NULL || *ddata->cur == '\0')
1749 output = ddata->cur_output;
1753 switch (*ddata->cur) {
1755 return (cpp_demangle_read_subst(ddata));
1757 return (cpp_demangle_read_nested_name(ddata));
1759 return (cpp_demangle_read_local_name(ddata));
1762 if (!vector_str_init(&v))
1765 p_idx = output->size;
1767 if (!cpp_demangle_read_uqname(ddata))
1769 if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
1770 &subst_str_len)) == NULL)
1772 if (subst_str_len > 8 && strstr(subst_str, "operator") != NULL) {
1776 if (!vector_str_push(&v, subst_str, subst_str_len))
1778 if (!cpp_demangle_push_subst_v(ddata, &v))
1781 if (*ddata->cur == 'I') {
1782 p_idx = output->size;
1783 if (!cpp_demangle_read_tmpl_args(ddata))
1786 if ((subst_str = vector_str_substr(output, p_idx,
1787 output->size - 1, &subst_str_len)) == NULL)
1789 if (!vector_str_push(&v, subst_str, subst_str_len))
1791 if (!cpp_demangle_push_subst_v(ddata, &v))
1799 vector_str_dest(&v);
1805 cpp_demangle_read_name_flat(struct cpp_demangle_data *ddata, char **str)
1807 struct vector_str *output;
1808 size_t i, p_idx, idx, name_len;
1811 output = ddata->cur_output;
1813 p_idx = output->size;
1815 if (!cpp_demangle_read_name(ddata))
1818 if ((name = vector_str_substr(output, p_idx, output->size - 1,
1819 &name_len)) == NULL)
1823 for (i = p_idx; i < idx; ++i) {
1824 if (!vector_str_pop(output)) {
1836 cpp_demangle_read_nested_name(struct cpp_demangle_data *ddata)
1838 struct vector_str *output, v;
1839 size_t limit, p_idx, subst_str_len;
1843 if (ddata == NULL || *ddata->cur != 'N')
1845 if (*(++ddata->cur) == '\0')
1849 switch (*ddata->cur) {
1851 ddata->mem_rst = true;
1854 ddata->mem_vat = true;
1857 ddata->mem_cst = true;
1860 ddata->mem_ref = true;
1863 ddata->mem_rref = true;
1868 } while (*(++ddata->cur));
1871 output = ddata->cur_output;
1872 if (!vector_str_init(&v))
1878 p_idx = output->size;
1879 switch (*ddata->cur) {
1881 if (!cpp_demangle_read_tmpl_args(ddata))
1885 if (!cpp_demangle_read_subst(ddata))
1889 if (!cpp_demangle_read_tmpl_param(ddata))
1893 if (!cpp_demangle_read_uqname(ddata))
1897 if (p_idx == output->size)
1899 if ((subst_str = vector_str_substr(output, p_idx,
1900 output->size - 1, &subst_str_len)) == NULL)
1902 if (!vector_str_push(&v, subst_str, subst_str_len)) {
1908 if (!cpp_demangle_push_subst_v(ddata, &v))
1912 if (*ddata->cur == 'E')
1914 else if (*ddata->cur != 'I' && *ddata->cur != 'C' &&
1915 *ddata->cur != 'D' && p_idx != output->size) {
1916 if (!DEM_PUSH_STR(ddata, "::"))
1918 if (!VEC_PUSH_STR(&v, "::"))
1921 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
1929 vector_str_dest(&v);
1936 * number ::= [n] <decimal>
1939 cpp_demangle_read_number(struct cpp_demangle_data *ddata, long *rtn)
1941 long len, negative_factor;
1943 if (ddata == NULL || rtn == NULL)
1946 negative_factor = 1;
1947 if (*ddata->cur == 'n') {
1948 negative_factor = -1;
1952 if (ELFTC_ISDIGIT(*ddata->cur) == 0)
1956 if ((len = strtol(ddata->cur, (char **) NULL, 10)) == 0 &&
1960 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
1964 assert(negative_factor == 1 || negative_factor == -1);
1966 *rtn = len * negative_factor;
1972 cpp_demangle_read_number_as_string(struct cpp_demangle_data *ddata, char **str)
1976 if (!cpp_demangle_read_number(ddata, &n)) {
1981 if (asprintf(str, "%ld", n) < 0) {
1990 cpp_demangle_read_nv_offset(struct cpp_demangle_data *ddata)
1996 if (!DEM_PUSH_STR(ddata, "offset : "))
1999 return (cpp_demangle_read_offset_number(ddata));
2002 /* read offset, offset are nv-offset, v-offset */
2004 cpp_demangle_read_offset(struct cpp_demangle_data *ddata)
2010 if (*ddata->cur == 'h') {
2012 return (cpp_demangle_read_nv_offset(ddata));
2013 } else if (*ddata->cur == 'v') {
2015 return (cpp_demangle_read_v_offset(ddata));
2022 cpp_demangle_read_offset_number(struct cpp_demangle_data *ddata)
2027 if (ddata == NULL || *ddata->cur == '\0')
2030 /* offset could be negative */
2031 if (*ddata->cur == 'n') {
2033 start = ddata->cur + 1;
2039 while (*ddata->cur != '_')
2042 if (negative && !DEM_PUSH_STR(ddata, "-"))
2045 assert(start != NULL);
2047 if (!cpp_demangle_push_str(ddata, start, ddata->cur - start))
2049 if (!DEM_PUSH_STR(ddata, " "))
2058 cpp_demangle_read_pointer_to_member(struct cpp_demangle_data *ddata,
2059 struct vector_type_qualifier *v)
2061 size_t class_type_len, i, idx, p_idx;
2062 int p_func_type, rtn;
2065 if (ddata == NULL || *ddata->cur != 'M' || *(++ddata->cur) == '\0')
2068 p_idx = ddata->output.size;
2069 if (!cpp_demangle_read_type(ddata, NULL))
2072 if ((class_type = vector_str_substr(&ddata->output, p_idx,
2073 ddata->output.size - 1, &class_type_len)) == NULL)
2077 idx = ddata->output.size;
2078 for (i = p_idx; i < idx; ++i)
2079 if (!vector_str_pop(&ddata->output))
2082 if (!vector_read_cmd_push(&ddata->cmd, READ_PTRMEM, v))
2085 if (!vector_str_push(&ddata->class_type, class_type, class_type_len))
2088 p_func_type = ddata->func_type;
2089 if (!cpp_demangle_read_type(ddata, NULL))
2092 if (p_func_type == ddata->func_type) {
2093 if (!DEM_PUSH_STR(ddata, " "))
2095 if (!cpp_demangle_push_str(ddata, class_type, class_type_len))
2097 if (!DEM_PUSH_STR(ddata, "::*"))
2103 if (!vector_str_pop(&ddata->class_type))
2106 if (!vector_read_cmd_pop(&ddata->cmd))
2111 vector_type_qualifier_dest(v);
2112 if (!vector_type_qualifier_init(v))
2118 /* read source-name, source-name is <len> <ID> */
2120 cpp_demangle_read_sname(struct cpp_demangle_data *ddata)
2125 if (ddata == NULL || cpp_demangle_read_number(ddata, &len) == 0 ||
2129 if (len == 12 && (memcmp("_GLOBAL__N_1", ddata->cur, 12) == 0))
2130 err = DEM_PUSH_STR(ddata, "(anonymous namespace)");
2132 err = cpp_demangle_push_str(ddata, ddata->cur, len);
2137 assert(ddata->output.size > 0);
2138 if (vector_read_cmd_find(&ddata->cmd, READ_TMPL) == NULL)
2140 ddata->output.container[ddata->output.size - 1];
2148 cpp_demangle_read_subst(struct cpp_demangle_data *ddata)
2152 if (ddata == NULL || *ddata->cur == '\0')
2155 /* abbreviations of the form Sx */
2156 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
2157 case SIMPLE_HASH('S', 'a'):
2158 /* std::allocator */
2159 if (!DEM_PUSH_STR(ddata, "std::allocator"))
2162 if (*ddata->cur == 'I')
2163 return (cpp_demangle_read_subst_stdtmpl(ddata,
2167 case SIMPLE_HASH('S', 'b'):
2168 /* std::basic_string */
2169 if (!DEM_PUSH_STR(ddata, "std::basic_string"))
2172 if (*ddata->cur == 'I')
2173 return (cpp_demangle_read_subst_stdtmpl(ddata,
2174 "std::basic_string"));
2177 case SIMPLE_HASH('S', 'd'):
2178 /* std::basic_iostream<char, std::char_traits<char> > */
2179 if (!DEM_PUSH_STR(ddata, "std::basic_iostream<char, "
2180 "std::char_traits<char> >"))
2182 ddata->last_sname = "basic_iostream";
2184 if (*ddata->cur == 'I')
2185 return (cpp_demangle_read_subst_stdtmpl(ddata,
2186 "std::basic_iostream<char, std::char_traits"
2190 case SIMPLE_HASH('S', 'i'):
2191 /* std::basic_istream<char, std::char_traits<char> > */
2192 if (!DEM_PUSH_STR(ddata, "std::basic_istream<char, "
2193 "std::char_traits<char> >"))
2195 ddata->last_sname = "basic_istream";
2197 if (*ddata->cur == 'I')
2198 return (cpp_demangle_read_subst_stdtmpl(ddata,
2199 "std::basic_istream<char, std::char_traits"
2203 case SIMPLE_HASH('S', 'o'):
2204 /* std::basic_ostream<char, std::char_traits<char> > */
2205 if (!DEM_PUSH_STR(ddata, "std::basic_ostream<char, "
2206 "std::char_traits<char> >"))
2208 ddata->last_sname = "basic_ostream";
2210 if (*ddata->cur == 'I')
2211 return (cpp_demangle_read_subst_stdtmpl(ddata,
2212 "std::basic_ostream<char, std::char_traits"
2216 case SIMPLE_HASH('S', 's'):
2218 * std::basic_string<char, std::char_traits<char>,
2219 * std::allocator<char> >
2223 if (!DEM_PUSH_STR(ddata, "std::basic_string<char, "
2224 "std::char_traits<char>, std::allocator<char> >"))
2226 ddata->last_sname = "string";
2228 if (*ddata->cur == 'I')
2229 return (cpp_demangle_read_subst_stdtmpl(ddata,
2230 "std::basic_string<char, std::char_traits<char>,"
2231 " std::allocator<char> >"));
2234 case SIMPLE_HASH('S', 't'):
2236 return (cpp_demangle_read_subst_std(ddata));
2239 if (*(++ddata->cur) == '\0')
2242 /* Skip unknown substitution abbreviations. */
2243 if (!(*ddata->cur >= '0' && *ddata->cur <= '9') &&
2244 !(*ddata->cur >= 'A' && *ddata->cur <= 'Z') &&
2245 *ddata->cur != '_') {
2251 if (*ddata->cur == '_')
2252 return (cpp_demangle_get_subst(ddata, 0));
2255 /* substitution number is base 36 */
2256 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2260 /* first was '_', so increase one */
2263 while (*ddata->cur != '_')
2268 return (cpp_demangle_get_subst(ddata, nth));
2276 cpp_demangle_read_subst_std(struct cpp_demangle_data *ddata)
2278 struct vector_str *output, v;
2279 size_t p_idx, subst_str_len;
2286 if (!vector_str_init(&v))
2291 if (!DEM_PUSH_STR(ddata, "std::"))
2294 if (!VEC_PUSH_STR(&v, "std::"))
2299 output = ddata->cur_output;
2301 p_idx = output->size;
2302 if (!cpp_demangle_read_uqname(ddata))
2305 if ((subst_str = vector_str_substr(output, p_idx, output->size - 1,
2306 &subst_str_len)) == NULL)
2309 if (!vector_str_push(&v, subst_str, subst_str_len))
2312 if (!cpp_demangle_push_subst_v(ddata, &v))
2315 if (*ddata->cur == 'I') {
2316 p_idx = output->size;
2317 if (!cpp_demangle_read_tmpl_args(ddata))
2320 if ((subst_str = vector_str_substr(output, p_idx,
2321 output->size - 1, &subst_str_len)) == NULL)
2323 if (!vector_str_push(&v, subst_str, subst_str_len))
2325 if (!cpp_demangle_push_subst_v(ddata, &v))
2332 vector_str_dest(&v);
2338 cpp_demangle_read_subst_stdtmpl(struct cpp_demangle_data *ddata,
2341 struct vector_str *output;
2342 size_t p_idx, substr_len, len;
2344 char *subst_str, *substr;
2346 if (ddata == NULL || str == NULL)
2349 if ((len = strlen(str)) == 0)
2352 output = ddata->cur_output;
2354 p_idx = output->size;
2358 if (!cpp_demangle_read_tmpl_args(ddata))
2360 if ((substr = vector_str_substr(output, p_idx, output->size - 1,
2361 &substr_len)) == NULL)
2365 if ((subst_str = malloc(sizeof(char) * (substr_len + len + 1))) ==
2369 memcpy(subst_str, str, len);
2370 memcpy(subst_str + len, substr, substr_len);
2371 subst_str[substr_len + len] = '\0';
2373 if (!cpp_demangle_push_subst(ddata, subst_str, substr_len + len))
2385 cpp_demangle_read_tmpl_arg(struct cpp_demangle_data *ddata)
2388 if (ddata == NULL || *ddata->cur == '\0')
2391 switch (*ddata->cur) {
2393 return (cpp_demangle_read_expr_primary(ddata));
2396 if (!cpp_demangle_read_expression(ddata))
2398 return (*ddata->cur++ == 'E');
2401 return (cpp_demangle_read_type(ddata, NULL));
2405 cpp_demangle_read_tmpl_args(struct cpp_demangle_data *ddata)
2407 struct vector_str *v;
2408 size_t arg_len, idx, limit, size;
2411 if (ddata == NULL || *ddata->cur == '\0')
2416 if (!vector_read_cmd_push(&ddata->cmd, READ_TMPL, NULL))
2419 if (!DEM_PUSH_STR(ddata, "<"))
2426 if (!cpp_demangle_read_tmpl_arg(ddata))
2428 if ((arg = vector_str_substr(v, idx, v->size - 1, &arg_len)) ==
2431 if (!vector_str_find(&ddata->tmpl, arg, arg_len) &&
2432 !vector_str_push(&ddata->tmpl, arg, arg_len)) {
2439 if (*ddata->cur == 'E') {
2443 if (!strncmp(v->container[size - 1], ">", 1)) {
2444 if (!DEM_PUSH_STR(ddata, " >"))
2446 } else if (!DEM_PUSH_STR(ddata, ">"))
2448 ddata->is_tmpl = true;
2450 } else if (*ddata->cur != 'I' &&
2451 !DEM_PUSH_STR(ddata, ", "))
2454 if (limit++ > CPP_DEMANGLE_TRY_LIMIT)
2458 return (vector_read_cmd_pop(&ddata->cmd));
2462 * Read template parameter that forms in 'T[number]_'.
2463 * This function much like to read_subst but only for types.
2466 cpp_demangle_read_tmpl_param(struct cpp_demangle_data *ddata)
2470 if (ddata == NULL || *ddata->cur != 'T')
2475 if (*ddata->cur == '_')
2476 return (cpp_demangle_get_tmpl_param(ddata, 0));
2480 if ((nth = strtol(ddata->cur, (char **) NULL, 36)) == 0 &&
2487 while (*ddata->cur != '_')
2492 return (cpp_demangle_get_tmpl_param(ddata, nth));
2500 cpp_demangle_read_type(struct cpp_demangle_data *ddata,
2501 struct type_delimit *td)
2503 struct vector_type_qualifier v;
2504 struct vector_str *output, sv;
2505 size_t p_idx, type_str_len, subst_str_len;
2506 int extern_c, is_builtin;
2509 char *type_str, *exp_str, *num_str, *subst_str;
2510 bool skip_ref_qualifier, omit_void;
2515 output = ddata->cur_output;
2517 if (td->paren == false) {
2518 if (!DEM_PUSH_STR(ddata, "("))
2520 if (ddata->output.size < 2)
2526 if (*ddata->cur != 'I') {
2527 if (!DEM_PUSH_STR(ddata, ", "))
2533 assert(output != NULL);
2535 * [r, V, K] [P, R, O, C, G, U] builtin, function, class-enum, array
2536 * pointer-to-member, template-param, template-template-param, subst
2539 if (!vector_type_qualifier_init(&v))
2544 p_idx = output->size;
2545 type_str = exp_str = num_str = NULL;
2546 skip_ref_qualifier = false;
2550 /* Clear ref-qualifier flag */
2551 if (*ddata->cur != 'R' && *ddata->cur != 'O' && *ddata->cur != 'E')
2552 ddata->ref_qualifier = false;
2555 switch (*ddata->cur) {
2558 if (!DEM_PUSH_STR(ddata, "signed char"))
2565 if (!cpp_demangle_read_array(ddata))
2572 if (!DEM_PUSH_STR(ddata, "bool"))
2579 if (!vector_type_qualifier_push(&v, TYPE_CMX))
2588 if (!DEM_PUSH_STR(ddata, "char"))
2595 if (!DEM_PUSH_STR(ddata, "double"))
2602 switch (*ddata->cur) {
2605 if (!DEM_PUSH_STR(ddata, "auto"))
2610 /* decltype(auto) */
2611 if (!DEM_PUSH_STR(ddata, "decltype(auto)"))
2616 /* IEEE 754r decimal floating point (64 bits) */
2617 if (!DEM_PUSH_STR(ddata, "decimal64"))
2622 /* IEEE 754r decimal floating point (128 bits) */
2623 if (!DEM_PUSH_STR(ddata, "decimal128"))
2628 /* IEEE 754r decimal floating point (32 bits) */
2629 if (!DEM_PUSH_STR(ddata, "decimal32"))
2634 /* IEEE 754r half-precision floating point (16 bits) */
2635 if (!DEM_PUSH_STR(ddata, "half"))
2641 if (!DEM_PUSH_STR(ddata, "char32_t"))
2646 /* std::nullptr_t (i.e., decltype(nullptr)) */
2647 if (!DEM_PUSH_STR(ddata, "decltype(nullptr)"))
2653 if (!DEM_PUSH_STR(ddata, "char16_t"))
2658 /* gcc vector_size extension. */
2660 if (*ddata->cur == '_') {
2662 if (!cpp_demangle_read_expression_flat(ddata,
2665 if (!VEC_PUSH_STR(&v.ext_name, exp_str))
2668 if (!cpp_demangle_read_number_as_string(ddata,
2671 if (!VEC_PUSH_STR(&v.ext_name, num_str))
2674 if (*ddata->cur != '_')
2677 if (!vector_type_qualifier_push(&v, TYPE_VEC))
2689 if (!DEM_PUSH_STR(ddata, "long double"))
2695 /* unexpected end except ref-qualifiers */
2696 if (ddata->ref_qualifier && ddata->is_functype) {
2697 skip_ref_qualifier = true;
2698 /* Pop the delimiter. */
2699 cpp_demangle_pop_str(ddata);
2706 if (!DEM_PUSH_STR(ddata, "float"))
2713 if (!cpp_demangle_read_function(ddata, &extern_c, &v))
2720 if (!DEM_PUSH_STR(ddata, "__float128"))
2727 if (!vector_type_qualifier_push(&v, TYPE_IMG))
2736 if (!DEM_PUSH_STR(ddata, "unsigned char"))
2743 if (!DEM_PUSH_STR(ddata, "int"))
2749 /* template args. */
2750 /* handles <substitute><template-args> */
2751 p_idx = output->size;
2752 if (!cpp_demangle_read_tmpl_args(ddata))
2754 if ((subst_str = vector_str_substr(output, p_idx,
2755 output->size - 1, &subst_str_len)) == NULL)
2757 if (!vector_str_init(&sv)) {
2761 if (!vector_str_push(&sv, subst_str, subst_str_len)) {
2763 vector_str_dest(&sv);
2767 if (!cpp_demangle_push_subst_v(ddata, &sv)) {
2768 vector_str_dest(&sv);
2771 vector_str_dest(&sv);
2776 if (!DEM_PUSH_STR(ddata, "unsigned int"))
2783 if (!vector_type_qualifier_push(&v, TYPE_CST))
2792 if (!DEM_PUSH_STR(ddata, "long"))
2799 if (!DEM_PUSH_STR(ddata, "unsigned long"))
2806 /* pointer to member */
2807 if (!cpp_demangle_read_pointer_to_member(ddata, &v))
2814 if (!DEM_PUSH_STR(ddata, "__int128"))
2820 /* unsigned __int128 */
2821 if (!DEM_PUSH_STR(ddata, "unsigned __int128"))
2827 /* rvalue reference */
2828 if (ddata->ref_qualifier)
2830 if (!vector_type_qualifier_push(&v, TYPE_RREF))
2832 ddata->ref_qualifier = true;
2833 ddata->ref_qualifier_type = TYPE_RREF;
2841 if (!vector_type_qualifier_push(&v, TYPE_PTR))
2850 if (!vector_type_qualifier_push(&v, TYPE_RST))
2859 if (ddata->ref_qualifier)
2861 if (!vector_type_qualifier_push(&v, TYPE_REF))
2863 ddata->ref_qualifier = true;
2864 ddata->ref_qualifier_type = TYPE_REF;
2871 /* short, local string */
2872 if (!DEM_PUSH_STR(ddata, "short"))
2879 if (!cpp_demangle_read_subst(ddata))
2885 /* unsigned short */
2886 if (!DEM_PUSH_STR(ddata, "unsigned short"))
2892 /* template parameter */
2893 if (!cpp_demangle_read_tmpl_param(ddata))
2899 /* vendor extended builtin */
2901 if (!cpp_demangle_read_sname(ddata))
2907 /* vendor extended type qualifier */
2909 if (!cpp_demangle_read_number(ddata, &len))
2913 if (!vector_str_push(&v.ext_name, ddata->cur, len))
2916 if (!vector_type_qualifier_push(&v, TYPE_EXT))
2925 if (td && td->firstp) {
2927 * peek into next bytes and see if we should omit
2931 for (p = ddata->cur + 1; *p != '\0'; p++) {
2934 if (*p != 'R' && *p != 'O') {
2940 if (!omit_void && !DEM_PUSH_STR(ddata, "void"))
2947 if (!vector_type_qualifier_push(&v, TYPE_VAT))
2956 if (!DEM_PUSH_STR(ddata, "wchar_t"))
2963 if (!DEM_PUSH_STR(ddata, "long long"))
2969 /* unsigned long long */
2970 if (!DEM_PUSH_STR(ddata, "unsigned long long"))
2977 if (!DEM_PUSH_STR(ddata, "..."))
2983 if (!cpp_demangle_read_name(ddata))
2989 type_str = vector_str_substr(output, p_idx, output->size - 1,
2992 if (is_builtin == 0) {
2993 if (!vector_str_find(&ddata->subst, type_str, type_str_len) &&
2994 !vector_str_push(&ddata->subst, type_str, type_str_len))
2998 if (!skip_ref_qualifier &&
2999 !cpp_demangle_push_type_qualifier(ddata, &v, type_str))
3008 vector_type_qualifier_dest(&v);
3015 vector_type_qualifier_dest(&v);
3021 cpp_demangle_read_type_flat(struct cpp_demangle_data *ddata, char **str)
3023 struct vector_str *output;
3024 size_t i, p_idx, idx, type_len;
3027 output = ddata->cur_output;
3029 p_idx = output->size;
3031 if (!cpp_demangle_read_type(ddata, NULL))
3034 if ((type = vector_str_substr(output, p_idx, output->size - 1,
3035 &type_len)) == NULL)
3039 for (i = p_idx; i < idx; ++i) {
3040 if (!vector_str_pop(output)) {
3052 * read unqualified-name, unqualified name are operator-name, ctor-dtor-name,
3056 cpp_demangle_read_uqname(struct cpp_demangle_data *ddata)
3060 if (ddata == NULL || *ddata->cur == '\0')
3064 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3065 case SIMPLE_HASH('a', 'a'):
3067 if (!DEM_PUSH_STR(ddata, "operator&&"))
3072 case SIMPLE_HASH('a', 'd'):
3073 /* operator & (unary) */
3074 if (!DEM_PUSH_STR(ddata, "operator&"))
3079 case SIMPLE_HASH('a', 'n'):
3081 if (!DEM_PUSH_STR(ddata, "operator&"))
3086 case SIMPLE_HASH('a', 'N'):
3088 if (!DEM_PUSH_STR(ddata, "operator&="))
3093 case SIMPLE_HASH('a', 'S'):
3095 if (!DEM_PUSH_STR(ddata, "operator="))
3100 case SIMPLE_HASH('c', 'l'):
3102 if (!DEM_PUSH_STR(ddata, "operator()"))
3107 case SIMPLE_HASH('c', 'm'):
3109 if (!DEM_PUSH_STR(ddata, "operator,"))
3114 case SIMPLE_HASH('c', 'o'):
3116 if (!DEM_PUSH_STR(ddata, "operator~"))
3121 case SIMPLE_HASH('c', 'v'):
3122 /* operator (cast) */
3123 if (!DEM_PUSH_STR(ddata, "operator(cast)"))
3126 return (cpp_demangle_read_type(ddata, NULL));
3128 case SIMPLE_HASH('d', 'a'):
3129 /* operator delete [] */
3130 if (!DEM_PUSH_STR(ddata, "operator delete []"))
3135 case SIMPLE_HASH('d', 'e'):
3136 /* operator * (unary) */
3137 if (!DEM_PUSH_STR(ddata, "operator*"))
3142 case SIMPLE_HASH('d', 'l'):
3143 /* operator delete */
3144 if (!DEM_PUSH_STR(ddata, "operator delete"))
3149 case SIMPLE_HASH('d', 'v'):
3151 if (!DEM_PUSH_STR(ddata, "operator/"))
3156 case SIMPLE_HASH('d', 'V'):
3158 if (!DEM_PUSH_STR(ddata, "operator/="))
3163 case SIMPLE_HASH('e', 'o'):
3165 if (!DEM_PUSH_STR(ddata, "operator^"))
3170 case SIMPLE_HASH('e', 'O'):
3172 if (!DEM_PUSH_STR(ddata, "operator^="))
3177 case SIMPLE_HASH('e', 'q'):
3179 if (!DEM_PUSH_STR(ddata, "operator=="))
3184 case SIMPLE_HASH('g', 'e'):
3186 if (!DEM_PUSH_STR(ddata, "operator>="))
3191 case SIMPLE_HASH('g', 't'):
3193 if (!DEM_PUSH_STR(ddata, "operator>"))
3198 case SIMPLE_HASH('i', 'x'):
3200 if (!DEM_PUSH_STR(ddata, "operator[]"))
3205 case SIMPLE_HASH('l', 'e'):
3207 if (!DEM_PUSH_STR(ddata, "operator<="))
3212 case SIMPLE_HASH('l', 's'):
3214 if (!DEM_PUSH_STR(ddata, "operator<<"))
3219 case SIMPLE_HASH('l', 'S'):
3221 if (!DEM_PUSH_STR(ddata, "operator<<="))
3226 case SIMPLE_HASH('l', 't'):
3228 if (!DEM_PUSH_STR(ddata, "operator<"))
3233 case SIMPLE_HASH('m', 'i'):
3235 if (!DEM_PUSH_STR(ddata, "operator-"))
3240 case SIMPLE_HASH('m', 'I'):
3242 if (!DEM_PUSH_STR(ddata, "operator-="))
3247 case SIMPLE_HASH('m', 'l'):
3249 if (!DEM_PUSH_STR(ddata, "operator*"))
3254 case SIMPLE_HASH('m', 'L'):
3256 if (!DEM_PUSH_STR(ddata, "operator*="))
3261 case SIMPLE_HASH('m', 'm'):
3263 if (!DEM_PUSH_STR(ddata, "operator--"))
3268 case SIMPLE_HASH('n', 'a'):
3269 /* operator new[] */
3270 if (!DEM_PUSH_STR(ddata, "operator new []"))
3275 case SIMPLE_HASH('n', 'e'):
3277 if (!DEM_PUSH_STR(ddata, "operator!="))
3282 case SIMPLE_HASH('n', 'g'):
3283 /* operator - (unary) */
3284 if (!DEM_PUSH_STR(ddata, "operator-"))
3289 case SIMPLE_HASH('n', 't'):
3291 if (!DEM_PUSH_STR(ddata, "operator!"))
3296 case SIMPLE_HASH('n', 'w'):
3298 if (!DEM_PUSH_STR(ddata, "operator new"))
3303 case SIMPLE_HASH('o', 'o'):
3305 if (!DEM_PUSH_STR(ddata, "operator||"))
3310 case SIMPLE_HASH('o', 'r'):
3312 if (!DEM_PUSH_STR(ddata, "operator|"))
3317 case SIMPLE_HASH('o', 'R'):
3319 if (!DEM_PUSH_STR(ddata, "operator|="))
3324 case SIMPLE_HASH('p', 'l'):
3326 if (!DEM_PUSH_STR(ddata, "operator+"))
3331 case SIMPLE_HASH('p', 'L'):
3333 if (!DEM_PUSH_STR(ddata, "operator+="))
3338 case SIMPLE_HASH('p', 'm'):
3340 if (!DEM_PUSH_STR(ddata, "operator->*"))
3345 case SIMPLE_HASH('p', 'p'):
3347 if (!DEM_PUSH_STR(ddata, "operator++"))
3352 case SIMPLE_HASH('p', 's'):
3353 /* operator + (unary) */
3354 if (!DEM_PUSH_STR(ddata, "operator+"))
3359 case SIMPLE_HASH('p', 't'):
3361 if (!DEM_PUSH_STR(ddata, "operator->"))
3366 case SIMPLE_HASH('q', 'u'):
3368 if (!DEM_PUSH_STR(ddata, "operator?"))
3373 case SIMPLE_HASH('r', 'm'):
3375 if (!DEM_PUSH_STR(ddata, "operator%"))
3380 case SIMPLE_HASH('r', 'M'):
3382 if (!DEM_PUSH_STR(ddata, "operator%="))
3387 case SIMPLE_HASH('r', 's'):
3389 if (!DEM_PUSH_STR(ddata, "operator>>"))
3394 case SIMPLE_HASH('r', 'S'):
3396 if (!DEM_PUSH_STR(ddata, "operator>>="))
3401 case SIMPLE_HASH('r', 'z'):
3402 /* operator sizeof */
3403 if (!DEM_PUSH_STR(ddata, "operator sizeof "))
3408 case SIMPLE_HASH('s', 'r'):
3409 /* scope resolution operator */
3410 if (!DEM_PUSH_STR(ddata, "scope resolution operator "))
3415 case SIMPLE_HASH('s', 'v'):
3416 /* operator sizeof */
3417 if (!DEM_PUSH_STR(ddata, "operator sizeof "))
3423 /* vendor extened operator */
3424 if (*ddata->cur == 'v' && ELFTC_ISDIGIT(*(ddata->cur + 1))) {
3425 if (!DEM_PUSH_STR(ddata, "vendor extened operator "))
3427 if (!cpp_demangle_push_str(ddata, ddata->cur + 1, 1))
3430 return (cpp_demangle_read_sname(ddata));
3433 /* ctor-dtor-name */
3434 switch (SIMPLE_HASH(*ddata->cur, *(ddata->cur + 1))) {
3435 case SIMPLE_HASH('C', '1'):
3436 case SIMPLE_HASH('C', '2'):
3437 case SIMPLE_HASH('C', '3'):
3438 if (ddata->last_sname == NULL)
3440 if ((len = strlen(ddata->last_sname)) == 0)
3442 if (!DEM_PUSH_STR(ddata, "::"))
3444 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3449 case SIMPLE_HASH('D', '0'):
3450 case SIMPLE_HASH('D', '1'):
3451 case SIMPLE_HASH('D', '2'):
3452 if (ddata->last_sname == NULL)
3454 if ((len = strlen(ddata->last_sname)) == 0)
3456 if (!DEM_PUSH_STR(ddata, "::~"))
3458 if (!cpp_demangle_push_str(ddata, ddata->last_sname, len))
3465 if (ELFTC_ISDIGIT(*ddata->cur) != 0)
3466 return (cpp_demangle_read_sname(ddata));
3468 /* local source name */
3469 if (*ddata->cur == 'L')
3470 return (cpp_demangle_local_source_name(ddata));
3476 * Read local source name.
3479 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775
3480 * http://gcc.gnu.org/viewcvs?view=rev&revision=124467
3483 cpp_demangle_local_source_name(struct cpp_demangle_data *ddata)
3486 if (ddata == NULL || *ddata->cur != 'L')
3491 if (!cpp_demangle_read_sname(ddata))
3495 if (*ddata->cur == '_') {
3497 while (ELFTC_ISDIGIT(*ddata->cur) != 0)
3505 cpp_demangle_read_v_offset(struct cpp_demangle_data *ddata)
3511 if (!DEM_PUSH_STR(ddata, "offset : "))
3514 if (!cpp_demangle_read_offset_number(ddata))
3517 if (!DEM_PUSH_STR(ddata, "virtual offset : "))
3520 return (!cpp_demangle_read_offset_number(ddata));
3524 * Decode floating point representation to string
3525 * Return new allocated string or NULL
3528 * Replace these functions to macro.
3531 decode_fp_to_double(const char *p, size_t len)
3534 size_t rtn_len, limit, i;
3538 if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(double))
3541 memset(&f, 0, sizeof(double));
3543 for (i = 0; i < len / 2; ++i) {
3544 byte = hex_to_dec(p[len - i * 2 - 1]) +
3545 hex_to_dec(p[len - i * 2 - 2]) * 16;
3547 if (byte < 0 || byte > 255)
3550 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3551 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3552 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3553 ((unsigned char *)&f)[sizeof(double) - i - 1] =
3554 (unsigned char)(byte);
3555 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3561 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3564 if (snprintf(rtn, rtn_len, "%fld", f) >= (int)rtn_len) {
3566 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3568 rtn_len *= BUFFER_GROWFACTOR;
3576 decode_fp_to_float(const char *p, size_t len)
3578 size_t i, rtn_len, limit;
3583 if (p == NULL || len == 0 || len % 2 != 0 || len / 2 > sizeof(float))
3586 memset(&f, 0, sizeof(float));
3588 for (i = 0; i < len / 2; ++i) {
3589 byte = hex_to_dec(p[len - i * 2 - 1]) +
3590 hex_to_dec(p[len - i * 2 - 2]) * 16;
3591 if (byte < 0 || byte > 255)
3593 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3594 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3595 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3596 ((unsigned char *)&f)[sizeof(float) - i - 1] =
3597 (unsigned char)(byte);
3598 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3604 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3607 if (snprintf(rtn, rtn_len, "%ff", f) >= (int)rtn_len) {
3609 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3611 rtn_len *= BUFFER_GROWFACTOR;
3619 decode_fp_to_float128(const char *p, size_t len)
3622 size_t rtn_len, limit, i;
3624 unsigned char buf[FLOAT_QUADRUPLE_BYTES];
3627 switch(sizeof(long double)) {
3628 case FLOAT_QUADRUPLE_BYTES:
3629 return (decode_fp_to_long_double(p, len));
3630 case FLOAT_EXTENED_BYTES:
3631 if (p == NULL || len == 0 || len % 2 != 0 ||
3632 len / 2 > FLOAT_QUADRUPLE_BYTES)
3635 memset(buf, 0, FLOAT_QUADRUPLE_BYTES);
3637 for (i = 0; i < len / 2; ++i) {
3638 byte = hex_to_dec(p[len - i * 2 - 1]) +
3639 hex_to_dec(p[len - i * 2 - 2]) * 16;
3640 if (byte < 0 || byte > 255)
3642 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3643 buf[i] = (unsigned char)(byte);
3644 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3645 buf[FLOAT_QUADRUPLE_BYTES - i -1] =
3646 (unsigned char)(byte);
3647 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3649 memset(&f, 0, FLOAT_EXTENED_BYTES);
3651 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3652 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3653 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3654 memcpy(&f, buf + 6, FLOAT_EXTENED_BYTES);
3655 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3660 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3663 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3665 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3667 rtn_len *= BUFFER_GROWFACTOR;
3678 decode_fp_to_float80(const char *p, size_t len)
3681 size_t rtn_len, limit, i;
3683 unsigned char buf[FLOAT_EXTENED_BYTES];
3686 switch(sizeof(long double)) {
3687 case FLOAT_QUADRUPLE_BYTES:
3688 if (p == NULL || len == 0 || len % 2 != 0 ||
3689 len / 2 > FLOAT_EXTENED_BYTES)
3692 memset(buf, 0, FLOAT_EXTENED_BYTES);
3694 for (i = 0; i < len / 2; ++i) {
3695 byte = hex_to_dec(p[len - i * 2 - 1]) +
3696 hex_to_dec(p[len - i * 2 - 2]) * 16;
3698 if (byte < 0 || byte > 255)
3701 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3702 buf[i] = (unsigned char)(byte);
3703 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3704 buf[FLOAT_EXTENED_BYTES - i -1] =
3705 (unsigned char)(byte);
3706 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3709 memset(&f, 0, FLOAT_QUADRUPLE_BYTES);
3711 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3712 memcpy(&f, buf, FLOAT_EXTENED_BYTES);
3713 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3714 memcpy((unsigned char *)(&f) + 6, buf, FLOAT_EXTENED_BYTES);
3715 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3720 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3723 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3725 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3727 rtn_len *= BUFFER_GROWFACTOR;
3732 case FLOAT_EXTENED_BYTES:
3733 return (decode_fp_to_long_double(p, len));
3740 decode_fp_to_long_double(const char *p, size_t len)
3743 size_t rtn_len, limit, i;
3747 if (p == NULL || len == 0 || len % 2 != 0 ||
3748 len / 2 > sizeof(long double))
3751 memset(&f, 0, sizeof(long double));
3753 for (i = 0; i < len / 2; ++i) {
3754 byte = hex_to_dec(p[len - i * 2 - 1]) +
3755 hex_to_dec(p[len - i * 2 - 2]) * 16;
3757 if (byte < 0 || byte > 255)
3760 #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN
3761 ((unsigned char *)&f)[i] = (unsigned char)(byte);
3762 #else /* ELFTC_BYTE_ORDER != ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3763 ((unsigned char *)&f)[sizeof(long double) - i - 1] =
3764 (unsigned char)(byte);
3765 #endif /* ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_LITTLE_ENDIAN */
3771 if ((rtn = malloc(sizeof(char) * rtn_len)) == NULL)
3774 if (snprintf(rtn, rtn_len, "%Lfd", f) >= (int)rtn_len) {
3776 if (limit++ > FLOAT_SPRINTF_TRY_LIMIT)
3778 rtn_len *= BUFFER_GROWFACTOR;
3785 /* Simple hex to integer function used by decode_to_* function. */
3829 * @brief Test input string is mangled by IA-64 C++ ABI style.
3831 * Test string heads with "_Z" or "_GLOBAL__I_".
3832 * @return Return 0 at false.
3835 is_cpp_mangled_gnu3(const char *org)
3840 return ((len > 2 && *org == '_' && *(org + 1) == 'Z') ||
3841 (len > 11 && !strncmp(org, "_GLOBAL__I_", 11)));
3845 vector_read_cmd_dest(struct vector_read_cmd *v)
3851 free(v->r_container);
3854 static struct read_cmd_item *
3855 vector_read_cmd_find(struct vector_read_cmd *v, enum read_cmd dst)
3859 if (v == NULL || dst == READ_FAIL)
3862 for (i = (int) v->size - 1; i >= 0; i--)
3863 if (v->r_container[i].cmd == dst)
3864 return (&v->r_container[i]);
3870 vector_read_cmd_init(struct vector_read_cmd *v)
3877 v->capacity = VECTOR_DEF_CAPACITY;
3879 if ((v->r_container = malloc(sizeof(*v->r_container) * v->capacity))
3887 vector_read_cmd_pop(struct vector_read_cmd *v)
3890 if (v == NULL || v->size == 0)
3894 v->r_container[v->size].cmd = READ_FAIL;
3895 v->r_container[v->size].data = NULL;
3901 vector_read_cmd_push(struct vector_read_cmd *v, enum read_cmd cmd, void *data)
3903 struct read_cmd_item *tmp_r_ctn;
3910 if (v->size == v->capacity) {
3911 tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3912 if ((tmp_r_ctn = malloc(sizeof(*tmp_r_ctn) * tmp_cap)) == NULL)
3914 for (i = 0; i < v->size; ++i)
3915 tmp_r_ctn[i] = v->r_container[i];
3916 free(v->r_container);
3917 v->r_container = tmp_r_ctn;
3918 v->capacity = tmp_cap;
3921 v->r_container[v->size].cmd = cmd;
3922 v->r_container[v->size].data = data;
3929 vector_type_qualifier_dest(struct vector_type_qualifier *v)
3935 free(v->q_container);
3936 vector_str_dest(&v->ext_name);
3939 /* size, capacity, ext_name */
3941 vector_type_qualifier_init(struct vector_type_qualifier *v)
3948 v->capacity = VECTOR_DEF_CAPACITY;
3950 if ((v->q_container = malloc(sizeof(enum type_qualifier) * v->capacity))
3954 assert(v->q_container != NULL);
3956 if (vector_str_init(&v->ext_name) == false) {
3957 free(v->q_container);
3965 vector_type_qualifier_push(struct vector_type_qualifier *v,
3966 enum type_qualifier t)
3968 enum type_qualifier *tmp_ctn;
3975 if (v->size == v->capacity) {
3976 tmp_cap = v->capacity * BUFFER_GROWFACTOR;
3977 if ((tmp_ctn = malloc(sizeof(enum type_qualifier) * tmp_cap))
3980 for (i = 0; i < v->size; ++i)
3981 tmp_ctn[i] = v->q_container[i];
3982 free(v->q_container);
3983 v->q_container = tmp_ctn;
3984 v->capacity = tmp_cap;
3987 v->q_container[v->size] = t;