diff options
author | 2003-11-24 16:47:34 +0000 | |
---|---|---|
committer | 2003-11-24 16:47:34 +0000 | |
commit | 01e9b57fbaeda3f78fe9ec05b7fa83d05db4d7fb (patch) | |
tree | d0e1973b7f14164c04ff4f4f4a6c4e7303ae8726 /gnu/lib/libiberty/src/cplus-dem.c | |
parent | And the includes are taken from GCC 2.95.pre3 test3 (diff) | |
download | wireguard-openbsd-01e9b57fbaeda3f78fe9ec05b7fa83d05db4d7fb.tar.xz wireguard-openbsd-01e9b57fbaeda3f78fe9ec05b7fa83d05db4d7fb.zip |
OpenBSD changes: synch somewhere between binutils-2.10 and 2.11
Support for mkstemps in choose-temp.
Diffstat (limited to 'gnu/lib/libiberty/src/cplus-dem.c')
-rw-r--r-- | gnu/lib/libiberty/src/cplus-dem.c | 953 |
1 files changed, 222 insertions, 731 deletions
diff --git a/gnu/lib/libiberty/src/cplus-dem.c b/gnu/lib/libiberty/src/cplus-dem.c index a42f45e6426..ff6625244df 100644 --- a/gnu/lib/libiberty/src/cplus-dem.c +++ b/gnu/lib/libiberty/src/cplus-dem.c @@ -1,6 +1,5 @@ /* Demangler for GNU C++ - Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999, - 2000 Free Software Foundation, Inc. + Copyright 1989, 91, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.uucp) Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling Modified by Satish Pai (pai@apollo.hp.com) for HP demangling @@ -34,8 +33,7 @@ Boston, MA 02111-1307, USA. */ #include "config.h" #endif -#include "safe-ctype.h" - +#include <ctype.h> #include <sys/types.h> #include <string.h> #include <stdio.h> @@ -53,16 +51,8 @@ char * realloc (); #include "libiberty.h" -static char *ada_demangle PARAMS ((const char *, int)); - #define min(X,Y) (((X) < (Y)) ? (X) : (Y)) -/* A value at least one greater than the maximum number of characters - that will be output when using the `%d' format with `printf'. */ -#define INTBUF_SIZE 32 - -extern void fancy_abort PARAMS ((void)) ATTRIBUTE_NORETURN; - static const char *mystrstr PARAMS ((const char *, const char *)); static const char * @@ -102,7 +92,7 @@ mystrstr (s1, s2) #define CPLUS_MARKER '$' #endif -enum demangling_styles current_demangling_style = auto_demangling; +enum demangling_styles current_demangling_style = gnu_demangling; static char cplus_markers[] = { CPLUS_MARKER, '.', '$', '\0' }; @@ -295,24 +285,6 @@ struct demangler_engine libiberty_demanglers[] = } , { - GNU_V3_DEMANGLING_STYLE_STRING, - gnu_v3_demangling, - "GNU (g++) V3 ABI-style demangling" - } - , - { - JAVA_DEMANGLING_STYLE_STRING, - java_demangling, - "Java style demangling" - } - , - { - GNAT_DEMANGLING_STYLE_STRING, - gnat_demangling, - "GNAT style demangling" - } - , - { NULL, unknown_demangling, NULL } }; @@ -333,21 +305,12 @@ struct demangler_engine libiberty_demanglers[] = /* Prototypes for local functions */ -static void -delete_work_stuff PARAMS ((struct work_stuff *)); - -static void -delete_non_B_K_work_stuff PARAMS ((struct work_stuff *)); - static char * mop_up PARAMS ((struct work_stuff *, string *, int)); static void squangle_mop_up PARAMS ((struct work_stuff *)); -static void -work_stuff_copy_to_from PARAMS ((struct work_stuff *, struct work_stuff *)); - #if 0 static int demangle_method_args PARAMS ((struct work_stuff *, const char **, string *)); @@ -425,9 +388,6 @@ string_prepend PARAMS ((string *, const char *)); static void string_prependn PARAMS ((string *, const char *, int)); -static void -string_append_template_idx PARAMS ((string *, int)); - static int get_count PARAMS ((const char **, int *)); @@ -453,10 +413,6 @@ static void demangle_function_name PARAMS ((struct work_stuff *, const char **, string *, const char *)); -static int -iterate_demangle_function PARAMS ((struct work_stuff *, - const char **, string *, const char *)); - static void remember_type PARAMS ((struct work_stuff *, const char *, int)); @@ -509,28 +465,6 @@ qualifier_string PARAMS ((int)); static const char* demangle_qualifier PARAMS ((int)); -static int -demangle_expression PARAMS ((struct work_stuff *, const char **, string *, - type_kind_t)); - -static int -demangle_integral_value PARAMS ((struct work_stuff *, const char **, - string *)); - -static int -demangle_real_value PARAMS ((struct work_stuff *, const char **, string *)); - -static void -demangle_arm_hp_template PARAMS ((struct work_stuff *, const char **, int, - string *)); - -static void -recursively_demangle PARAMS ((struct work_stuff *, const char **, string *, - int)); - -static void -grow_vect PARAMS ((void **, size_t *, size_t, int)); - /* Translate count to integer, consuming tokens in the process. Conversion terminates on the first non-digit character. @@ -545,10 +479,10 @@ consume_count (type) { int count = 0; - if (! ISDIGIT ((unsigned char)**type)) + if (! isdigit ((unsigned char)**type)) return -1; - while (ISDIGIT ((unsigned char)**type)) + while (isdigit ((unsigned char)**type)) { count *= 10; @@ -559,7 +493,7 @@ consume_count (type) ten. */ if ((count % 10) != 0) { - while (ISDIGIT ((unsigned char) **type)) + while (isdigit ((unsigned char) **type)) (*type)++; return -1; } @@ -585,7 +519,7 @@ consume_count_with_underscores (mangled) if (**mangled == '_') { (*mangled)++; - if (!ISDIGIT ((unsigned char)**mangled)) + if (!isdigit ((unsigned char)**mangled)) return -1; idx = consume_count (mangled); @@ -717,14 +651,14 @@ cplus_demangle_opname (opname, result, options) } } else if (opname[0] == '_' && opname[1] == '_' - && ISLOWER((unsigned char)opname[2]) - && ISLOWER((unsigned char)opname[3])) + && opname[2] >= 'a' && opname[2] <= 'z' + && opname[3] >= 'a' && opname[3] <= 'z') { if (opname[4] == '\0') { /* Operator. */ size_t i; - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { if (strlen (optable[i].in) == 2 && memcmp (optable[i].in, opname + 2, 2) == 0) @@ -742,7 +676,7 @@ cplus_demangle_opname (opname, result, options) { /* Assignment. */ size_t i; - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { if (strlen (optable[i].in) == 3 && memcmp (optable[i].in, opname + 2, 3) == 0) @@ -766,7 +700,7 @@ cplus_demangle_opname (opname, result, options) && memcmp (opname + 3, "assign_", 7) == 0) { size_t i; - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { len1 = len - 10; if ((int) strlen (optable[i].in) == len1 @@ -783,7 +717,7 @@ cplus_demangle_opname (opname, result, options) else { size_t i; - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { len1 = len - 3; if ((int) strlen (optable[i].in) == len1 @@ -814,7 +748,6 @@ cplus_demangle_opname (opname, result, options) return ret; } - /* Takes operator name as e.g. "++" and returns mangled operator name (e.g. "postincrement_expr"), or NULL if not found. @@ -830,7 +763,7 @@ cplus_mangle_opname (opname, options) int len; len = strlen (opname); - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { if ((int) strlen (optable[i].out) == len && (options & DMGL_ANSI) == (optable[i].flags & DMGL_ANSI) @@ -910,20 +843,9 @@ cplus_demangle (mangled, options) char *ret; struct work_stuff work[1]; memset ((char *) work, 0, sizeof (work)); - work->options = options; - if ((work->options & DMGL_STYLE_MASK) == 0) - work->options |= (int) current_demangling_style & DMGL_STYLE_MASK; - - /* The V3 ABI demangling is implemented elsewhere. */ - if (GNU_V3_DEMANGLING || AUTO_DEMANGLING) - { - ret = cplus_demangle_v3 (mangled); - if (ret || GNU_V3_DEMANGLING) - return ret; - } - - if (GNAT_DEMANGLING) - return ada_demangle(mangled,options); + work -> options = options; + if ((work -> options & DMGL_STYLE_MASK) == 0) + work -> options |= (int) current_demangling_style & DMGL_STYLE_MASK; ret = internal_cplus_demangle (work, mangled); squangle_mop_up (work); @@ -931,139 +853,6 @@ cplus_demangle (mangled, options) } -/* Assuming *OLD_VECT points to an array of *SIZE objects of size - ELEMENT_SIZE, grow it to contain at least MIN_SIZE objects, - updating *OLD_VECT and *SIZE as necessary. */ - -static void -grow_vect (old_vect, size, min_size, element_size) - void **old_vect; - size_t *size; - size_t min_size; - int element_size; -{ - if (*size < min_size) - { - *size *= 2; - if (*size < min_size) - *size = min_size; - *old_vect = xrealloc (*old_vect, *size * element_size); - } -} - -/* Demangle ada names: - 1. Discard final __{DIGIT}+ or ${DIGIT}+ - 2. Convert other instances of embedded "__" to `.'. - 3. Discard leading _ada_. - 4. Remove everything after first ___ if it is followed by 'X'. - 5. Put symbols that should be suppressed in <...> brackets. - The resulting string is valid until the next call of ada_demangle. */ - -static char * -ada_demangle (mangled, option) - const char *mangled; - int option ATTRIBUTE_UNUSED; -{ - int i, j; - int len0; - const char* p; - char *demangled = NULL; - int at_start_name; - int changed; - char *demangling_buffer = NULL; - size_t demangling_buffer_size = 0; - - changed = 0; - - if (strncmp (mangled, "_ada_", 5) == 0) - { - mangled += 5; - changed = 1; - } - - if (mangled[0] == '_' || mangled[0] == '<') - goto Suppress; - - p = strstr (mangled, "___"); - if (p == NULL) - len0 = strlen (mangled); - else - { - if (p[3] == 'X') - { - len0 = p - mangled; - changed = 1; - } - else - goto Suppress; - } - - /* Make demangled big enough for possible expansion by operator name. */ - grow_vect ((void **) &(demangling_buffer), - &demangling_buffer_size, 2 * len0 + 1, - sizeof (char)); - demangled = demangling_buffer; - - if (ISDIGIT ((unsigned char) mangled[len0 - 1])) { - for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1) - ; - if (i > 1 && mangled[i] == '_' && mangled[i - 1] == '_') - { - len0 = i - 1; - changed = 1; - } - else if (mangled[i] == '$') - { - len0 = i; - changed = 1; - } - } - - for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]); - i += 1, j += 1) - demangled[j] = mangled[i]; - - at_start_name = 1; - while (i < len0) - { - at_start_name = 0; - - if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_') - { - demangled[j] = '.'; - changed = at_start_name = 1; - i += 2; j += 1; - } - else - { - demangled[j] = mangled[i]; - i += 1; j += 1; - } - } - demangled[j] = '\000'; - - for (i = 0; demangled[i] != '\0'; i += 1) - if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ') - goto Suppress; - - if (! changed) - return NULL; - else - return demangled; - - Suppress: - grow_vect ((void **) &(demangling_buffer), - &demangling_buffer_size, strlen (mangled) + 3, - sizeof (char)); - demangled = demangling_buffer; - if (mangled[0] == '<') - strcpy (demangled, mangled); - else - sprintf (demangled, "<%s>", mangled); - - return demangled; -} - /* This function performs most of what cplus_demangle use to do, but to be able to demangle a name with a B, K or n code, we need to have a longer term memory of what types have been seen. The original @@ -1079,7 +868,7 @@ internal_cplus_demangle (work, mangled) string decl; int success = 0; char *demangled = NULL; - int s1, s2, s3, s4; + int s1,s2,s3,s4; s1 = work->constructor; s2 = work->destructor; s3 = work->static_type; @@ -1132,7 +921,7 @@ internal_cplus_demangle (work, mangled) work->destructor = s2; work->static_type = s3; work->type_quals = s4; - return demangled; + return (demangled); } @@ -1153,85 +942,16 @@ squangle_mop_up (work) } } +/* Clear out any mangled storage */ -/* Copy the work state and storage. */ - -static void -work_stuff_copy_to_from (to, from) - struct work_stuff *to; - struct work_stuff *from; -{ - int i; - - delete_work_stuff (to); - - /* Shallow-copy scalars. */ - memcpy (to, from, sizeof (*to)); - - /* Deep-copy dynamic storage. */ - if (from->typevec_size) - to->typevec - = (char **) xmalloc (from->typevec_size * sizeof (to->typevec[0])); - - for (i = 0; i < from->ntypes; i++) - { - int len = strlen (from->typevec[i]) + 1; - - to->typevec[i] = xmalloc (len); - memcpy (to->typevec[i], from->typevec[i], len); - } - - if (from->ksize) - to->ktypevec - = (char **) xmalloc (from->ksize * sizeof (to->ktypevec[0])); - - for (i = 0; i < from->numk; i++) - { - int len = strlen (from->ktypevec[i]) + 1; - - to->ktypevec[i] = xmalloc (len); - memcpy (to->ktypevec[i], from->ktypevec[i], len); - } - - if (from->bsize) - to->btypevec - = (char **) xmalloc (from->bsize * sizeof (to->btypevec[0])); - - for (i = 0; i < from->numb; i++) - { - int len = strlen (from->btypevec[i]) + 1; - - to->btypevec[i] = xmalloc (len); - memcpy (to->btypevec[i], from->btypevec[i], len); - } - - if (from->ntmpl_args) - to->tmpl_argvec - = xmalloc (from->ntmpl_args * sizeof (to->tmpl_argvec[0])); - - for (i = 0; i < from->ntmpl_args; i++) - { - int len = strlen (from->tmpl_argvec[i]) + 1; - - to->tmpl_argvec[i] = xmalloc (len); - memcpy (to->tmpl_argvec[i], from->tmpl_argvec[i], len); - } - - if (from->previous_argument) - { - to->previous_argument = (string*) xmalloc (sizeof (string)); - string_init (to->previous_argument); - string_appends (to->previous_argument, from->previous_argument); - } -} - - -/* Delete dynamic stuff in work_stuff that is not to be re-used. */ - -static void -delete_non_B_K_work_stuff (work) +static char * +mop_up (work, declp, success) struct work_stuff *work; + string *declp; + int success; { + char *demangled = NULL; + /* Discard the remembered types, if any. */ forget_types (work); @@ -1258,30 +978,6 @@ delete_non_B_K_work_stuff (work) free ((char*) work->previous_argument); work->previous_argument = NULL; } -} - - -/* Delete all dynamic storage in work_stuff. */ -static void -delete_work_stuff (work) - struct work_stuff *work; -{ - delete_non_B_K_work_stuff (work); - squangle_mop_up (work); -} - - -/* Clear out any mangled storage */ - -static char * -mop_up (work, declp, success) - struct work_stuff *work; - string *declp; - int success; -{ - char *demangled = NULL; - - delete_non_B_K_work_stuff (work); /* If demangling was successful, ensure that the demangled string is null terminated and return it. Otherwise, free the demangling decl. */ @@ -1293,7 +989,7 @@ mop_up (work, declp, success) else { string_appendn (declp, "", 1); - demangled = declp->b; + demangled = declp -> b; } return (demangled); } @@ -1507,7 +1203,7 @@ demangle_signature (work, mangled, declp) break; case '_': - if ((AUTO_DEMANGLING || GNU_DEMANGLING) && expect_return_type) + if (GNU_DEMANGLING && expect_return_type) { /* Read the return type. */ string return_type; @@ -1533,7 +1229,7 @@ demangle_signature (work, mangled, declp) if (HP_DEMANGLING) { (*mangled)++; - while (**mangled && ISDIGIT ((unsigned char)**mangled)) + while (**mangled && isdigit ((unsigned char)**mangled)) (*mangled)++; } else @@ -1541,7 +1237,7 @@ demangle_signature (work, mangled, declp) break; case 'H': - if (AUTO_DEMANGLING || GNU_DEMANGLING) + if (GNU_DEMANGLING) { /* A G++ template function. Read the template arguments. */ success = demangle_template (work, mangled, declp, 0, 0, @@ -1709,190 +1405,87 @@ demangle_template_template_parm (work, mangled, tname) } static int -demangle_expression (work, mangled, s, tk) +demangle_integral_value (work, mangled, s) struct work_stuff *work; const char** mangled; string* s; - type_kind_t tk; { - int need_operator = 0; int success; - success = 1; - string_appendn (s, "(", 1); - (*mangled)++; - while (success && **mangled != 'W' && **mangled != '\0') + if (**mangled == 'E') { - if (need_operator) - { - size_t i; - size_t len; + int need_operator = 0; - success = 0; + success = 1; + string_appendn (s, "(", 1); + (*mangled)++; + while (success && **mangled != 'W' && **mangled != '\0') + { + if (need_operator) + { + size_t i; + size_t len; - len = strlen (*mangled); + success = 0; - for (i = 0; i < ARRAY_SIZE (optable); ++i) - { - size_t l = strlen (optable[i].in); + len = strlen (*mangled); - if (l <= len - && memcmp (optable[i].in, *mangled, l) == 0) + for (i = 0; + i < sizeof (optable) / sizeof (optable [0]); + ++i) { - string_appendn (s, " ", 1); - string_append (s, optable[i].out); - string_appendn (s, " ", 1); - success = 1; - (*mangled) += l; - break; + size_t l = strlen (optable[i].in); + + if (l <= len + && memcmp (optable[i].in, *mangled, l) == 0) + { + string_appendn (s, " ", 1); + string_append (s, optable[i].out); + string_appendn (s, " ", 1); + success = 1; + (*mangled) += l; + break; + } } + + if (!success) + break; } + else + need_operator = 1; - if (!success) - break; + success = demangle_template_value_parm (work, mangled, s, + tk_integral); } - else - need_operator = 1; - success = demangle_template_value_parm (work, mangled, s, tk); - } - - if (**mangled != 'W') - success = 0; - else - { - string_appendn (s, ")", 1); - (*mangled)++; + if (**mangled != 'W') + success = 0; + else + { + string_appendn (s, ")", 1); + (*mangled)++; + } } - - return success; -} - -static int -demangle_integral_value (work, mangled, s) - struct work_stuff *work; - const char** mangled; - string* s; -{ - int success; - - if (**mangled == 'E') - success = demangle_expression (work, mangled, s, tk_integral); else if (**mangled == 'Q' || **mangled == 'K') success = demangle_qualified (work, mangled, s, 0, 1); else { - int value; - - /* By default, we let the number decide whether we shall consume an - underscore. */ - int consume_following_underscore = 0; - int leave_following_underscore = 0; - success = 0; - /* Negative numbers are indicated with a leading `m'. */ if (**mangled == 'm') { string_appendn (s, "-", 1); (*mangled)++; } - else if (mangled[0][0] == '_' && mangled[0][1] == 'm') - { - /* Since consume_count_with_underscores does not handle the - `m'-prefix we must do it here, using consume_count and - adjusting underscores: we have to consume the underscore - matching the prepended one. */ - consume_following_underscore = 1; - string_appendn (s, "-", 1); - (*mangled) += 2; - } - else if (**mangled == '_') - { - /* Do not consume a following underscore; - consume_following_underscore will consume what should be - consumed. */ - leave_following_underscore = 1; - } - - /* We must call consume_count if we expect to remove a trailing - underscore, since consume_count_with_underscores expects - the leading underscore (that we consumed) if it is to handle - multi-digit numbers. */ - if (consume_following_underscore) - value = consume_count (mangled); - else - value = consume_count_with_underscores (mangled); - - if (value != -1) - { - char buf[INTBUF_SIZE]; - sprintf (buf, "%d", value); - string_append (s, buf); - - /* Numbers not otherwise delimited, might have an underscore - appended as a delimeter, which we should skip. - - ??? This used to always remove a following underscore, which - is wrong. If other (arbitrary) cases are followed by an - underscore, we need to do something more radical. */ - - if ((value > 9 || consume_following_underscore) - && ! leave_following_underscore - && **mangled == '_') - (*mangled)++; - - /* All is well. */ - success = 1; - } - } - - return success; -} - -/* Demangle the real value in MANGLED. */ - -static int -demangle_real_value (work, mangled, s) - struct work_stuff *work; - const char **mangled; - string* s; -{ - if (**mangled == 'E') - return demangle_expression (work, mangled, s, tk_real); - - if (**mangled == 'm') - { - string_appendn (s, "-", 1); - (*mangled)++; - } - while (ISDIGIT ((unsigned char)**mangled)) - { - string_appendn (s, *mangled, 1); - (*mangled)++; - } - if (**mangled == '.') /* fraction */ - { - string_appendn (s, ".", 1); - (*mangled)++; - while (ISDIGIT ((unsigned char)**mangled)) - { - string_appendn (s, *mangled, 1); - (*mangled)++; - } - } - if (**mangled == 'e') /* exponent */ - { - string_appendn (s, "e", 1); - (*mangled)++; - while (ISDIGIT ((unsigned char)**mangled)) + while (isdigit ((unsigned char)**mangled)) { string_appendn (s, *mangled, 1); (*mangled)++; + success = 1; } } - return 1; + return success; } static int @@ -1918,7 +1511,11 @@ demangle_template_value_parm (work, mangled, s, tk) if (work->tmpl_argvec) string_append (s, work->tmpl_argvec[idx]); else - string_append_template_idx (s, idx); + { + char buf[10]; + sprintf(buf, "T%d", idx); + string_append (s, buf); + } } else if (tk == tk_integral) success = demangle_integral_value (work, mangled, s); @@ -1954,7 +1551,38 @@ demangle_template_value_parm (work, mangled, s, tk) success = 0; } else if (tk == tk_real) - success = demangle_real_value (work, mangled, s); + { + if (**mangled == 'm') + { + string_appendn (s, "-", 1); + (*mangled)++; + } + while (isdigit ((unsigned char)**mangled)) + { + string_appendn (s, *mangled, 1); + (*mangled)++; + } + if (**mangled == '.') /* fraction */ + { + string_appendn (s, ".", 1); + (*mangled)++; + while (isdigit ((unsigned char)**mangled)) + { + string_appendn (s, *mangled, 1); + (*mangled)++; + } + } + if (**mangled == 'e') /* exponent */ + { + string_appendn (s, "e", 1); + (*mangled)++; + while (isdigit ((unsigned char)**mangled)) + { + string_appendn (s, *mangled, 1); + (*mangled)++; + } + } + } else if (tk == tk_pointer || tk == tk_reference) { if (**mangled == 'Q') @@ -2004,7 +1632,7 @@ demangle_template_value_parm (work, mangled, s, tk) template parameters (e.g. S) is placed in TRAWNAME if TRAWNAME is non-NULL. If IS_TYPE is nonzero, this template is a type template, not a function template. If both IS_TYPE and REMEMBER are nonzero, - the template is remembered in the list of back-referenceable + the tmeplate is remembered in the list of back-referenceable types. */ static int @@ -2052,9 +1680,11 @@ demangle_template (work, mangled, tname, trawname, is_type, remember) } else { - string_append_template_idx (tname, idx); + char buf[10]; + sprintf(buf, "T%d", idx); + string_append (tname, buf); if (trawname) - string_append_template_idx (trawname, idx); + string_append (trawname, buf); } } else @@ -2536,86 +2166,6 @@ demangle_class (work, mangled, declp) return (success); } - -/* Called when there's a "__" in the mangled name, with `scan' pointing to - the rightmost guess. - - Find the correct "__"-sequence where the function name ends and the - signature starts, which is ambiguous with GNU mangling. - Call demangle_signature here, so we can make sure we found the right - one; *mangled will be consumed so caller will not make further calls to - demangle_signature. */ - -static int -iterate_demangle_function (work, mangled, declp, scan) - struct work_stuff *work; - const char **mangled; - string *declp; - const char *scan; -{ - const char *mangle_init = *mangled; - int success = 0; - string decl_init; - struct work_stuff work_init; - - if (*(scan + 2) == '\0') - return 0; - - /* Do not iterate for some demangling modes, or if there's only one - "__"-sequence. This is the normal case. */ - if (ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING - || mystrstr (scan + 2, "__") == NULL) - { - demangle_function_name (work, mangled, declp, scan); - return 1; - } - - /* Save state so we can restart if the guess at the correct "__" was - wrong. */ - string_init (&decl_init); - string_appends (&decl_init, declp); - memset (&work_init, 0, sizeof work_init); - work_stuff_copy_to_from (&work_init, work); - - /* Iterate over occurrences of __, allowing names and types to have a - "__" sequence in them. We must start with the first (not the last) - occurrence, since "__" most often occur between independent mangled - parts, hence starting at the last occurence inside a signature - might get us a "successful" demangling of the signature. */ - - while (scan[2]) - { - demangle_function_name (work, mangled, declp, scan); - success = demangle_signature (work, mangled, declp); - if (success) - break; - - /* Reset demangle state for the next round. */ - *mangled = mangle_init; - string_clear (declp); - string_appends (declp, &decl_init); - work_stuff_copy_to_from (work, &work_init); - - /* Leave this underscore-sequence. */ - scan += 2; - - /* Scan for the next "__" sequence. */ - while (*scan && (scan[0] != '_' || scan[1] != '_')) - scan++; - - /* Move to last "__" in this sequence. */ - while (*scan && *scan == '_') - scan++; - scan -= 2; - } - - /* Delete saved state. */ - delete_work_stuff (&work_init); - string_delete (&decl_init); - - return success; -} - /* LOCAL FUNCTION @@ -2631,8 +2181,6 @@ SYNOPSIS DESCRIPTION Consume and demangle the prefix of the mangled name. - While processing the function name root, arrange to call - demangle_signature if the root is ambiguous. DECLP points to the string buffer into which demangled output is placed. On entry, the buffer is empty. On exit it contains @@ -2736,20 +2284,20 @@ demangle_prefix (work, mangled, declp) } else if (work -> static_type) { - if (!ISDIGIT ((unsigned char)scan[0]) && (scan[0] != 't')) + if (!isdigit ((unsigned char)scan[0]) && (scan[0] != 't')) { success = 0; } } else if ((scan == *mangled) - && (ISDIGIT ((unsigned char)scan[2]) || (scan[2] == 'Q') + && (isdigit ((unsigned char)scan[2]) || (scan[2] == 'Q') || (scan[2] == 't') || (scan[2] == 'K') || (scan[2] == 'H'))) { /* The ARM says nothing about the mangling of local variables. But cfront mangles local variables by prepending __<nesting_level> to them. As an extension to ARM demangling we handle this case. */ if ((LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING) - && ISDIGIT ((unsigned char)scan[2])) + && isdigit ((unsigned char)scan[2])) { *mangled = scan + 2; consume_count (mangled); @@ -2786,7 +2334,7 @@ demangle_prefix (work, mangled, declp) /* EDG template? */ demangle_arm_hp_template (work, mangled, strlen (*mangled), declp); } - else if ((scan == *mangled) && !ISDIGIT ((unsigned char)scan[2]) + else if ((scan == *mangled) && !isdigit ((unsigned char)scan[2]) && (scan[2] != 't')) { /* Mangled name starts with "__". Skip over any leading '_' characters, @@ -2806,16 +2354,29 @@ demangle_prefix (work, mangled, declp) success = 0; } else - return iterate_demangle_function (work, mangled, declp, scan); + { + const char *tmp; + + /* Look for the LAST occurrence of __, allowing names to + have the '__' sequence embedded in them. */ + if (!(ARM_DEMANGLING || HP_DEMANGLING)) + { + while ((tmp = mystrstr (scan + 2, "__")) != NULL) + scan = tmp; + } + if (*(scan + 2) == '\0') + success = 0; + else + demangle_function_name (work, mangled, declp, scan); + } } } else if (*(scan + 2) != '\0') { /* Mangled name does not start with "__" but does have one somewhere in there with non empty stuff after it. Looks like a global - function name. Iterate over all "__":s until the right - one is found. */ - return iterate_demangle_function (work, mangled, declp, scan); + function name. */ + demangle_function_name (work, mangled, declp, scan); } else { @@ -2908,7 +2469,7 @@ gnu_special (work, mangled, declp) 1); break; default: - if (ISDIGIT((unsigned char)*mangled[0])) + if (isdigit((unsigned char)*mangled[0])) { n = consume_count(mangled); /* We may be seeing a too-large size, or else a @@ -2964,30 +2525,11 @@ gnu_special (work, mangled, declp) break; default: n = consume_count (mangled); - if (n < 0 || n > (long) strlen (*mangled)) + if (n < 0 || n > strlen (*mangled)) { success = 0; break; } - - if (n > 10 && strncmp (*mangled, "_GLOBAL_", 8) == 0 - && (*mangled)[9] == 'N' - && (*mangled)[8] == (*mangled)[10] - && strchr (cplus_markers, (*mangled)[8])) - { - /* A member of the anonymous namespace. There's information - about what identifier or filename it was keyed to, but - it's just there to make the mangled name unique; we just - step over it. */ - string_append (declp, "{anonymous}"); - (*mangled) += n; - - /* Now p points to the marker before the N, so we need to - update it to the first marker after what we consumed. */ - p = strpbrk (*mangled, cplus_markers); - break; - } - string_appendn (declp, *mangled, n); (*mangled) += n; } @@ -3049,7 +2591,7 @@ gnu_special (work, mangled, declp) success = demangle_template (work, mangled, declp, 0, 1, 1); break; default: - success = do_type (work, mangled, declp); + success = demangle_fund_type (work, mangled, declp); break; } if (success && **mangled != '\0') @@ -3150,7 +2692,7 @@ arm_special (mangled, declp) { n = consume_count (mangled); if (n == -1 - || n > (long) strlen (*mangled)) + || n > strlen (*mangled)) return 0; string_prependn (declp, *mangled, n); (*mangled) += n; @@ -3211,6 +2753,7 @@ demangle_qualified (work, mangled, result, isfuncname, append) { int qualifiers = 0; int success = 1; + const char *p; char num[2]; string temp; string last_name; @@ -3242,10 +2785,19 @@ demangle_qualified (work, mangled, result, isfuncname, append) /* GNU mangled name with more than 9 classes. The count is preceded by an underscore (to distinguish it from the <= 9 case) and followed by an underscore. */ - (*mangled)++; - qualifiers = consume_count_with_underscores (mangled); - if (qualifiers == -1) + p = *mangled + 2; + qualifiers = atoi (p); + if (!isdigit ((unsigned char)*p) || *p == '0') + success = 0; + + /* Skip the digits. */ + while (isdigit ((unsigned char)*p)) + ++p; + + if (*p != '_') success = 0; + + *mangled = p + 1; break; case '1': @@ -3435,13 +2987,15 @@ get_count (type, count) const char *p; int n; - if (!ISDIGIT ((unsigned char)**type)) - return (0); + if (!isdigit ((unsigned char)**type)) + { + return (0); + } else { *count = **type - '0'; (*type)++; - if (ISDIGIT ((unsigned char)**type)) + if (isdigit ((unsigned char)**type)) { p = *type; n = *count; @@ -3451,7 +3005,7 @@ get_count (type, count) n += *p - '0'; p++; } - while (ISDIGIT ((unsigned char)*p)); + while (isdigit ((unsigned char)*p)); if (*p == '_') { *type = p + 1; @@ -3575,13 +3129,8 @@ do_type (work, mangled, result) (*mangled)++; string_append (&decl, ")"); - - /* We don't need to prepend `::' for a qualified name; - demangle_qualified will do that for us. */ - if (**mangled != 'Q') - string_prepend (&decl, SCOPE_STRING (work)); - - if (ISDIGIT ((unsigned char)**mangled)) + string_prepend (&decl, SCOPE_STRING (work)); + if (isdigit ((unsigned char)**mangled)) { n = consume_count (mangled); if (n == -1 @@ -3613,14 +3162,6 @@ do_type (work, mangled, result) else break; } - else if (**mangled == 'Q') - { - success = demangle_qualified (work, mangled, &decl, - /*isfuncnam=*/0, - /*append=*/0); - if (!success) - break; - } else { success = 0; @@ -3733,7 +3274,11 @@ do_type (work, mangled, result) if (work->tmpl_argvec) string_append (result, work->tmpl_argvec[idx]); else - string_append_template_idx (result, idx); + { + char buf[10]; + sprintf(buf, "T%d", idx); + string_append (result, buf); + } success = 1; } @@ -3787,7 +3332,7 @@ demangle_fund_type (work, mangled, result) int done = 0; int success = 1; char buf[10]; - unsigned int dec = 0; + int dec = 0; string btype; type_kind_t tk = tk_integral; @@ -3901,7 +3446,7 @@ demangle_fund_type (work, mangled, result) break; case 'G': (*mangled)++; - if (!ISDIGIT ((unsigned char)**mangled)) + if (!isdigit ((unsigned char)**mangled)) { success = 0; break; @@ -3913,7 +3458,7 @@ demangle_fund_type (work, mangled, result) int i; (*mangled)++; for (i = 0; - i < (long) sizeof (buf) - 1 && **mangled && **mangled != '_'; + i < sizeof (buf) - 1 && **mangled && **mangled != '_'; (*mangled)++, i++) buf[i] = **mangled; if (**mangled != '_') @@ -3931,7 +3476,7 @@ demangle_fund_type (work, mangled, result) *mangled += min (strlen (*mangled), 2); } sscanf (buf, "%x", &dec); - sprintf (buf, "int%u_t", dec); + sprintf (buf, "int%i_t", dec); APPEND_BLANK (result); string_append (result, buf); break; @@ -3982,7 +3527,7 @@ demangle_fund_type (work, mangled, result) static int do_hpacc_template_const_value (work, mangled, result) - struct work_stuff *work ATTRIBUTE_UNUSED; + struct work_stuff *work; const char **mangled; string *result; { @@ -4013,12 +3558,12 @@ do_hpacc_template_const_value (work, mangled, result) } /* We have to be looking at an integer now */ - if (!(ISDIGIT ((unsigned char)**mangled))) + if (!(isdigit ((unsigned char)**mangled))) return 0; /* We only deal with integral values for template parameters -- so it's OK to look only for digits */ - while (ISDIGIT ((unsigned char)**mangled)) + while (isdigit ((unsigned char)**mangled)) { char_str[0] = **mangled; string_append (result, char_str); @@ -4097,10 +3642,10 @@ snarf_numeric_literal (args, arg) else if (**args == '+') (*args)++; - if (!ISDIGIT ((unsigned char)**args)) + if (!isdigit ((unsigned char)**args)) return 0; - while (ISDIGIT ((unsigned char)**args)) + while (isdigit ((unsigned char)**args)) { char_str[0] = **args; string_append (arg, char_str); @@ -4606,7 +4151,7 @@ demangle_function_name (work, mangled, declp, scan) if (declp->p - declp->b >= 10 /* op$assign_ */ && memcmp (declp->b + 3, "assign_", 7) == 0) { - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { int len = declp->p - declp->b - 10; if ((int) strlen (optable[i].in) == len @@ -4622,7 +4167,7 @@ demangle_function_name (work, mangled, declp, scan) } else { - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { int len = declp->p - declp->b - 3; if ((int) strlen (optable[i].in) == len @@ -4664,13 +4209,13 @@ demangle_function_name (work, mangled, declp, scan) } } else if (declp->b[0] == '_' && declp->b[1] == '_' - && ISLOWER((unsigned char)declp->b[2]) - && ISLOWER((unsigned char)declp->b[3])) + && declp->b[2] >= 'a' && declp->b[2] <= 'z' + && declp->b[3] >= 'a' && declp->b[3] <= 'z') { if (declp->b[4] == '\0') { /* Operator. */ - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { if (strlen (optable[i].in) == 2 && memcmp (optable[i].in, declp->b + 2, 2) == 0) @@ -4687,7 +4232,7 @@ demangle_function_name (work, mangled, declp, scan) if (declp->b[2] == 'a' && declp->b[5] == '\0') { /* Assignment. */ - for (i = 0; i < ARRAY_SIZE (optable); i++) + for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) { if (strlen (optable[i].in) == 3 && memcmp (optable[i].in, declp->b + 2, 3) == 0) @@ -4852,16 +4397,6 @@ string_prependn (p, s, n) } } -static void -string_append_template_idx (s, idx) - string *s; - int idx; -{ - char buf[INTBUF_SIZE + 1 /* 'T' */]; - sprintf(buf, "T%d", idx); - string_append (s, buf); -} - /* To generate a standalone demangler program for testing purposes, just compile and link this file with -DMAIN and libiberty.a. When run, it demangles each command line arg, or each stdin string, and @@ -4871,14 +4406,13 @@ string_append_template_idx (s, idx) #include "getopt.h" -static const char *program_name; -static const char *program_version = VERSION; +static char *program_name; +static char *program_version = VERSION; static int flags = DMGL_PARAMS | DMGL_ANSI; static void demangle_it PARAMS ((char *)); -static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN; -static void fatal PARAMS ((const char *)) ATTRIBUTE_NORETURN; -static void print_demangler_list PARAMS ((FILE *)); +static void usage PARAMS ((FILE *, int)); +static void fatal PARAMS ((char *)); static void demangle_it (mangled_name) @@ -4898,43 +4432,16 @@ demangle_it (mangled_name) } } -static void -print_demangler_list (stream) - FILE *stream; -{ - struct demangler_engine *demangler; - - fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name); - - for (demangler = libiberty_demanglers + 1; - demangler->demangling_style != unknown_demangling; - ++demangler) - fprintf (stream, ",%s", demangler->demangling_style_name); - - fprintf (stream, "}"); -} - static void usage (stream, status) FILE *stream; int status; { fprintf (stream, "\ -Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores] \n", +Usage: %s [-_] [-n] [-s {gnu,lucid,arm,hp,edg}] [--strip-underscores]\n\ + [--no-strip-underscores] [--format={gnu,lucid,arm,hp,edg}]\n\ + [--help] [--version] [arg...]\n", program_name); - - fprintf (stream, "\ - [-s "); - print_demangler_list (stream); - fprintf (stream, "]\n"); - - fprintf (stream, "\ - [--format "); - print_demangler_list (stream); - fprintf (stream, "]\n"); - - fprintf (stream, "\ - [--help] [--version] [arg...]\n"); exit (status); } @@ -4966,15 +4473,6 @@ fancy_abort () } -static const char * -standard_symbol_characters PARAMS ((void)); - -static const char * -hp_symbol_characters PARAMS ((void)); - -static const char * -gnu_v3_symbol_characters PARAMS ((void)); - /* Return the string of non-alnum characters that may occur as a valid symbol component, in the standard assembler symbol syntax. */ @@ -5023,19 +4521,6 @@ hp_symbol_characters () } -/* Return the string of non-alnum characters that may occur - as a valid symbol component in the GNU C++ V3 ABI mangling - scheme. */ - -static const char * -gnu_v3_symbol_characters () -{ - return "_$."; -} - - -extern int main PARAMS ((int, char **)); - int main (argc, argv) int argc; @@ -5043,7 +4528,7 @@ main (argc, argv) { char *result; int c; - const char *valid_symbols; + char *valid_symbols; program_name = argv[0]; @@ -5063,7 +4548,7 @@ main (argc, argv) break; case 'v': printf ("GNU %s (C++ demangler), version %s\n", program_name, program_version); - return (0); + exit (0); case '_': strip_underscore = 1; break; @@ -5071,19 +4556,32 @@ main (argc, argv) flags |= DMGL_JAVA; break; case 's': - { - enum demangling_styles style; - - style = cplus_demangle_name_to_style (optarg); - if (style == unknown_demangling) - { - fprintf (stderr, "%s: unknown demangling style `%s'\n", - program_name, optarg); - return (1); - } - else - cplus_demangle_set_style (style); - } + if (strcmp (optarg, "gnu") == 0) + { + current_demangling_style = gnu_demangling; + } + else if (strcmp (optarg, "lucid") == 0) + { + current_demangling_style = lucid_demangling; + } + else if (strcmp (optarg, "arm") == 0) + { + current_demangling_style = arm_demangling; + } + else if (strcmp (optarg, "hp") == 0) + { + current_demangling_style = hp_demangling; + } + else if (strcmp (optarg, "edg") == 0) + { + current_demangling_style = edg_demangling; + } + else + { + fprintf (stderr, "%s: unknown demangling style `%s'\n", + program_name, optarg); + exit (1); + } break; } } @@ -5102,18 +4600,12 @@ main (argc, argv) case gnu_demangling: case lucid_demangling: case arm_demangling: - case java_demangling: case edg_demangling: - case gnat_demangling: - case auto_demangling: valid_symbols = standard_symbol_characters (); break; case hp_demangling: valid_symbols = hp_symbol_characters (); break; - case gnu_v3_demangling: - valid_symbols = gnu_v3_symbol_characters (); - break; default: /* Folks should explicitly indicate the appropriate alphabet for each demangling. Providing a default would allow the @@ -5126,7 +4618,7 @@ main (argc, argv) int i = 0; c = getchar (); /* Try to read a label. */ - while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c))) + while (c != EOF && (isalnum (c) || strchr (valid_symbols, c))) { if (i >= MBUF_SIZE-1) break; @@ -5163,16 +4655,15 @@ main (argc, argv) if (c == EOF) break; putchar (c); - fflush (stdout); } } - return (0); + exit (0); } static void fatal (str) - const char *str; + char *str; { fprintf (stderr, "%s: %s\n", program_name, str); exit (1); |