aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libiberty/ChangeLog18
-rw-r--r--libiberty/cp-demangle.c40
-rw-r--r--libiberty/cplus-dem.c6
-rwxr-xr-xlibiberty/testsuite/regress-demangle2
4 files changed, 57 insertions, 9 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 04b01d7..a263823 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -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
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index 01c956b..26e2010 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -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
@@ -3690,17 +3690,43 @@ 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. */
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index 5af8826..b66d26d 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -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]);
diff --git a/libiberty/testsuite/regress-demangle b/libiberty/testsuite/regress-demangle
index 1086762d..303dda5 100755
--- a/libiberty/testsuite/regress-demangle
+++ b/libiberty/testsuite/regress-demangle
@@ -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`