* ldmisc.c (demangle): Restore dots stripped from sym name.
authorAlan Modra <amodra@gmail.com>
Wed, 26 Jun 2002 13:22:55 +0000 (13:22 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 26 Jun 2002 13:22:55 +0000 (13:22 +0000)
ld/ChangeLog
ld/ldmisc.c

index 5fd9bb78a82c63263b0873c0ce6216c813d0c16f..593fd27926383c66cfd4d69c4ba31365a68037a3 100644 (file)
@@ -1,3 +1,7 @@
+2002-06-26  Alan Modra  <amodra@bigpond.net.au>
+
+       * ldmisc.c (demangle): Restore dots stripped from sym name.
+
 2002-06-25  H.J. Lu <hjl@gnu.org>
 
        * Makefile.am (check-DEJAGNU): Set LC_ALL=C and export it.
index 42adceeac3eecfa5eafae5f3ddaf18e90a7a4507..b24678e917e1755e74b278739ebe53eac5dbb836 100644 (file)
@@ -78,13 +78,31 @@ demangle (string)
 
   /* This is a hack for better error reporting on 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.  */
+     on at least some symbols, so we remove all dots to avoid
+     confusing the demangler.  */
   p = string;
   while (*p == '.')
     ++p;
 
   res = cplus_demangle (p, DMGL_ANSI | DMGL_PARAMS);
-  return res ? res : xstrdup (string);
+  if (res)
+    {
+      size_t dots = p - string;
+
+      /* Now put back any stripped dots.  */
+      if (dots != 0)
+       {
+         size_t len = strlen (res) + 1;
+         char *add_dots = xmalloc (len + dots);
+
+         memcpy (add_dots, string, dots);
+         memcpy (add_dots + dots, res, len);
+         free (res);
+         res = add_dots;
+       }
+      return res;
+    }
+  return xstrdup (string);
 }
 
 static void