aboutsummaryrefslogtreecommitdiff
path: root/binutils/budemang.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2004-10-18 07:08:52 +0000
committerAlan Modra <amodra@gmail.com>2004-10-18 07:08:52 +0000
commit2bb2d727c1a0724b85265e77ecd174168ccc1593 (patch)
treecc27ffdf476efd96d7f032999fc840786e62c7e4 /binutils/budemang.c
parent40d98813d0301e10967fb9795a5eaf9bf3edc13c (diff)
downloadgdb-2bb2d727c1a0724b85265e77ecd174168ccc1593.zip
gdb-2bb2d727c1a0724b85265e77ecd174168ccc1593.tar.gz
gdb-2bb2d727c1a0724b85265e77ecd174168ccc1593.tar.bz2
* budemang.c (demangle): Handle "@plt" suffix.
Diffstat (limited to 'binutils/budemang.c')
-rw-r--r--binutils/budemang.c57
1 files changed, 41 insertions, 16 deletions
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);
}