* nm.c (print_symname): When demangling, strip leading dots from
authorAlan Modra <amodra@gmail.com>
Wed, 26 Jun 2002 13:23:45 +0000 (13:23 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 26 Jun 2002 13:23:45 +0000 (13:23 +0000)
symbol names to avoid confusing the demangler.

binutils/ChangeLog
binutils/nm.c

index 72ccd381b42c75d88e89c499c53a36c0f6de2c2f..8d39f9aabbfc8908e24469322196c85f359aa061 100644 (file)
@@ -1,3 +1,8 @@
+2002-06-26  Alan Modra  <amodra@bigpond.net.au>
+
+       * nm.c (print_symname): When demangling, strip leading dots from
+       symbol names to avoid confusing the demangler.
+
 2002-06-25  H.J. Lu <hjl@gnu.org>
 
        * Makefile.am (check-DEJAGNU): Set LC_ALL=C and export it.
index 306f2c60e3e352acc9f23e346943e957aa44ded6..f97732e0e231157ee8014090c4dfc1cce4a89a2e 100644 (file)
@@ -1086,6 +1086,7 @@ print_symname (format, name, abfd)
   if (do_demangle && *name)
     {
       char *res;
+      const char *p;
 
       /* In this mode, give a user-level view of the symbol name
         even if it's not mangled; strip off any leading
@@ -1093,9 +1094,30 @@ print_symname (format, name, abfd)
       if (bfd_get_symbol_leading_char (abfd) == name[0])
        name++;
 
-      res = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
+      /* This is a hack for XCOFF, PowerPC64-ELF 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;
+
+      res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS);
       if (res)
        {
+         size_t dots = p - name;
+
+         /* Now put back any stripped dots.  */
+         if (dots != 0)
+           {
+             size_t len = strlen (res) + 1;
+             char *add_dots = xmalloc (len + dots);
+
+             memcpy (add_dots, name, dots);
+             memcpy (add_dots + dots, res, len);
+             free (res);
+             res = add_dots;
+           }
          printf (format, res);
          free (res);
          return;