merge from gcc
authorDJ Delorie <dj@redhat.com>
Sun, 3 Feb 2002 13:12:45 +0000 (13:12 +0000)
committerDJ Delorie <dj@redhat.com>
Sun, 3 Feb 2002 13:12:45 +0000 (13:12 +0000)
include/ChangeLog
include/demangle.h
libiberty/ChangeLog
libiberty/cp-demangle.c
libiberty/cplus-dem.c
libiberty/testsuite/regress-demangle

index ae28dc164897d2ca6b40da24695627b9926ceb9a..aab620e4b187e3abac329e86b98e115c8e913c87 100644 (file)
@@ -1,3 +1,7 @@
+2002-02-02  H.J. Lu  (hjl@gnu.org)
+
+       * demangle.h (cplus_demangle_v3_type): New prototype.
+
 2002-01-31  Ivan Guzvinec  <ivang@opencores.org>
 
        * dis-asm.h : Add support for or32 targets
index a898218f4b84c7b8b50d9ad94028d7dc25c06d07..cbe28041301ddfb7c57d41f684741d79dd6e2d29 100644 (file)
@@ -127,6 +127,11 @@ cplus_demangle_name_to_style PARAMS ((const char *name));
 extern char*
 cplus_demangle_v3 PARAMS ((const char* mangled));
 
+/* V3 ABI demangling entry points, defined in cp-demangle.c. Also
+   demagle types. */
+extern char*
+cplus_demangle_v3_type PARAMS ((const char* mangled));
+
 extern char*
 java_demangle_v3 PARAMS ((const char* mangled));
 
index 04b01d7474c5b66a572a9d246d667fca1624a331..a2638236e7588a3a53f5dee76568b7e9186d22e5 100644 (file)
@@ -1,3 +1,21 @@
+2002-02-02  H.J. Lu  (hjl@gnu.org)
+
+       * cp-demangle.c (cp_demangle_type): Do not protect with
+       IN_LIBGCC2.
+       (cplus_demangle_v3_all): New.
+       (cplus_demangle_v3): Call cplus_demangle_v3_all.
+       (cplus_demangle_v3_type): Call cplus_demangle_v3_all.
+
+       * cplus-dem.c (cplus_demangle_v3_p): New function pointer.
+       Initialized to cplus_demangle_v3.
+       (cplus_demangle_with_style): Call cplus_demangle_v3_p instead
+       of cplus_demangle_v3.
+       (main): Set cplus_demangle_v3_p to cplus_demangle_v3_type for
+       command line symbol.
+
+       * testsuite/regress-demangle: Pass the mangled name at the
+       command line.
+
 2002-02-01  H.J. Lu  <hjl@gnu.org>
 
        * cp-demangle.c (cp_demangle_type): Call demangling_new with
index 01c956b82f9afce6244dda847ab9d39022ad8a5b..26e20107b19e752c60c7d54c0281ebb621ac3db5 100644 (file)
@@ -938,10 +938,10 @@ static status_t demangle_discriminator
   PARAMS ((demangling_t, int));
 static status_t cp_demangle
   PARAMS ((const char *, dyn_string_t, int));
-#ifdef IN_LIBGCC2
 static status_t cp_demangle_type
   PARAMS ((const char*, dyn_string_t));
-#endif
+static char* cplus_demangle_v3_all
+  PARAMS ((const char*, int));
 
 /* When passed to demangle_bare_function_type, indicates that the
    function's return type is not encoded before its parameter types.  */
@@ -3533,7 +3533,6 @@ cp_demangle (name, result, style)
    dyn_string_t.  On success, returns STATUS_OK.  On failiure, returns
    an error message, and the contents of RESULT are unchanged.  */
 
-#ifdef IN_LIBGCC2
 static status_t
 cp_demangle_type (type_name, result)
      const char* type_name;
@@ -3571,6 +3570,7 @@ cp_demangle_type (type_name, result)
   return status;
 }
 
+#ifdef IN_LIBGCC2
 extern char *__cxa_demangle PARAMS ((const char *, char *, size_t *, int *));
 
 /* ia64 ABI-mandated entry point in the C++ runtime library for performing
@@ -3689,18 +3689,44 @@ __cxa_demangle (mangled_name, output_buffer, length, status)
 char *
 cplus_demangle_v3 (mangled)
      const char* mangled;
+{
+  return cplus_demangle_v3_all (mangled, 0);
+}
+
+char *
+cplus_demangle_v3_type (mangled)
+     const char* mangled;
+{
+  return cplus_demangle_v3_all (mangled, 1);
+}
+
+static char *
+cplus_demangle_v3_all (mangled, type)
+     const char* mangled;
+     int type;
 {
   dyn_string_t demangled;
   status_t status;
 
-  /* If this isn't a mangled name, don't pretend to demangle it.  */
-  if (strncmp (mangled, "_Z", 2) != 0)
-    return NULL;
+  if (mangled[0] == '_' && mangled[1] == 'Z')
+    /* It is not a type.  */
+    type = 0;
+  else
+    {
+      /* It is a type. Stop if we don't want to demangle types. */
+      if (!type)
+       return NULL;
+    }
 
   /* Create a dyn_string to hold the demangled name.  */
   demangled = dyn_string_new (0);
   /* Attempt the demangling.  */
-  status = cp_demangle ((char *) mangled, demangled, 0);
+  if (!type)
+    /* Appears to be a function or variable name.  */
+    status = cp_demangle (mangled, demangled, 0);
+  else
+    /* Try to demangle it as the name of a type.  */
+    status = cp_demangle_type (mangled, demangled);
 
   if (STATUS_NO_ERROR (status))
     /* Demangling succeeded.  */
index 5af8826368629a1fa86b4ad80ba3f42dd23e2720..b66d26de6a113c669249e5b9337539a34b97c9d2 100644 (file)
@@ -478,6 +478,9 @@ do_hpacc_template_literal PARAMS ((struct work_stuff *, const char **, string *)
 static int
 snarf_numeric_literal PARAMS ((const char **, string *));
 
+static char* (*cplus_demangle_v3_p) PARAMS ((const char* mangled))
+  = cplus_demangle_v3;
+
 /* There is a TYPE_QUAL value for each type qualifier.  They can be
    combined by bitwise-or to form the complete set of qualifiers for a
    type.  */
@@ -911,7 +914,7 @@ cplus_demangle (mangled, options)
   /* The V3 ABI demangling is implemented elsewhere.  */
   if (GNU_V3_DEMANGLING || AUTO_DEMANGLING)
     {
-      ret = cplus_demangle_v3 (mangled);
+      ret = cplus_demangle_v3_p (mangled);
       if (ret || GNU_V3_DEMANGLING)
        return ret;
     }
@@ -5086,6 +5089,7 @@ main (argc, argv)
 
   if (optind < argc)
     {
+      cplus_demangle_v3_p = cplus_demangle_v3_type;
       for ( ; optind < argc; optind++)
        {
          demangle_it (argv[optind]);
index 1086762dbb261f860a6309342f58e5bc1ec4eb6a..303dda54e0cf4333c95a1434c43ecc92d43107f8 100755 (executable)
@@ -10,7 +10,7 @@ sed -e '/^#/ d' "$1" | (
      read mangled
      read demangled
 
-     x="`echo $mangled | ./test-filter $type`"
+     x="`./test-filter $type $mangled`"
      count=`expr $count + 1`
      if test "x$x" != "x$demangled"; then
        failures=`expr $failures + 1`