diff options
author | Alan Modra <amodra@gmail.com> | 2004-10-18 07:08:52 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2004-10-18 07:08:52 +0000 |
commit | 2bb2d727c1a0724b85265e77ecd174168ccc1593 (patch) | |
tree | cc27ffdf476efd96d7f032999fc840786e62c7e4 /binutils | |
parent | 40d98813d0301e10967fb9795a5eaf9bf3edc13c (diff) | |
download | gdb-2bb2d727c1a0724b85265e77ecd174168ccc1593.zip gdb-2bb2d727c1a0724b85265e77ecd174168ccc1593.tar.gz gdb-2bb2d727c1a0724b85265e77ecd174168ccc1593.tar.bz2 |
* budemang.c (demangle): Handle "@plt" suffix.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 4 | ||||
-rw-r--r-- | binutils/budemang.c | 57 |
2 files changed, 45 insertions, 16 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index b1c45c5..7ba39be 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2004-10-18 Alan Modra <amodra@bigpond.net.au> + + * budemang.c (demangle): Handle "@plt" suffix. + 2004-10-14 Nick Clifton <nickc@redhat.com> * nm.c (usage): Fix description of --special-syms switch. diff --git a/binutils/budemang.c b/binutils/budemang.c index 525a1c8..c992570 100644 --- a/binutils/budemang.c +++ b/binutils/budemang.c @@ -38,8 +38,9 @@ char * demangle (bfd *abfd, const char *name) { - char *res; - const char *p; + char *res, *alloc; + const char *pre, *suf; + size_t pre_len; if (abfd != NULL && bfd_get_symbol_leading_char (abfd) == name[0]) ++name; @@ -48,28 +49,52 @@ demangle (bfd *abfd, const char *name) or the MS PE format. These formats have a number of leading '.'s on at least some symbols, so we remove all dots to avoid confusing the demangler. */ - p = name; - while (*p == '.') - ++p; + pre = name; + while (*name == '.') + ++name; + pre_len = pre - name; - res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS); - if (res) + alloc = NULL; + suf = strchr (name, '@'); + if (suf != NULL) { - size_t dots = p - name; + alloc = xmalloc (suf - name + 1); + memcpy (alloc, name, suf - name); + alloc[suf - name] = '\0'; + name = alloc; + } - /* Now put back any stripped dots. */ - if (dots != 0) + res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS); + if (res != NULL) + { + /* Now put back any suffix, or stripped dots. */ + if (pre_len != 0 || suf != NULL) { - size_t len = strlen (res) + 1; - char *add_dots = xmalloc (len + dots); + size_t len; + size_t suf_len; + char *final; + + if (alloc != NULL) + free (alloc); - memcpy (add_dots, name, dots); - memcpy (add_dots + dots, res, len); + len = strlen (res); + if (suf == NULL) + suf = res + len; + suf_len = strlen (suf) + 1; + final = xmalloc (pre_len + len + suf_len); + + memcpy (final, pre, pre_len); + memcpy (final + pre_len, res, len); + memcpy (final + pre_len + len, suf, suf_len); free (res); - res = add_dots; + res = final; } + return res; } - return xstrdup (name); + if (alloc != NULL) + free (alloc); + + return xstrdup (pre); } |