Commit e4796f1c by Ian Lance Taylor Committed by Ian Lance Taylor

cp-demangle.c (d_encoding): When DMGL_PARAMS is not set...

	* cp-demangle.c (d_encoding): When DMGL_PARAMS is not set, strip
	CV-qualifiers from D_COMP_LOCAL_NAME right subtree.
	* cplus-dem.c (demangle_arm_hp_template): Set DMGL_PARAMS when
	demangling template parameters.
	* testsuite/test-demangle.c (fail): New static function.
	(main): Support new options in input file: --no-params,
	--is-v3-ctor, and --is-v3-dtor.
	* testsuite/demangle-expected: Add --no-params to most tests, and
	add the correct result when parameters are not demangled.  Add
	some simple tests for V3 constructor/destructor recognition.

From-SVN: r75336
parent 3864b6fe
2004-01-02 Ian Lance Taylor <ian@wasabisystems.com>
* cp-demangle.c (d_encoding): When DMGL_PARAMS is not set, strip
CV-qualifiers from D_COMP_LOCAL_NAME right subtree.
* cplus-dem.c (demangle_arm_hp_template): Set DMGL_PARAMS when
demangling template parameters.
* testsuite/test-demangle.c (fail): New static function.
(main): Support new options in input file: --no-params,
--is-v3-ctor, and --is-v3-dtor.
* testsuite/demangle-expected: Add --no-params to most tests, and
add the correct result when parameters are not demangled. Add
some simple tests for V3 constructor/destructor recognition.
2003-12-25 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2003-12-25 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cp-demangle.c (is_ctor_or_dtor): Fix error in last change. * cp-demangle.c (is_ctor_or_dtor): Fix error in last change.
......
/* Demangler for g++ V3 ABI. /* Demangler for g++ V3 ABI.
Copyright (C) 2003 Free Software Foundation, Inc. Copyright (C) 2003, 2004 Free Software Foundation, Inc.
Written by Ian Lance Taylor <ian@wasabisystems.com>. Written by Ian Lance Taylor <ian@wasabisystems.com>.
This file is part of the libiberty library, which is part of GCC. This file is part of the libiberty library, which is part of GCC.
...@@ -1109,6 +1109,23 @@ d_encoding (di, top_level) ...@@ -1109,6 +1109,23 @@ d_encoding (di, top_level)
|| dc->type == D_COMP_VOLATILE_THIS || dc->type == D_COMP_VOLATILE_THIS
|| dc->type == D_COMP_CONST_THIS) || dc->type == D_COMP_CONST_THIS)
dc = d_left (dc); dc = d_left (dc);
/* If the top level is a D_COMP_LOCAL_NAME, then there may
be CV-qualifiers on its right argument which really apply
here; this happens when parsing a class which is local to
a function. */
if (dc->type == D_COMP_LOCAL_NAME)
{
struct d_comp *dcr;
dcr = d_right (dc);
while (dcr->type == D_COMP_RESTRICT_THIS
|| dcr->type == D_COMP_VOLATILE_THIS
|| dcr->type == D_COMP_CONST_THIS)
dcr = d_left (dcr);
dc->u.s_binary.right = dcr;
}
return dc; return dc;
} }
......
/* Demangler for GNU C++ /* Demangler for GNU C++
Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999, Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001 Free Software Foundation, Inc. 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Written by James Clark (jjc@jclark.uucp) Written by James Clark (jjc@jclark.uucp)
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling
Modified by Satish Pai (pai@apollo.hp.com) for HP demangling Modified by Satish Pai (pai@apollo.hp.com) for HP demangling
...@@ -2318,6 +2318,7 @@ demangle_arm_hp_template (work, mangled, n, declp) ...@@ -2318,6 +2318,7 @@ demangle_arm_hp_template (work, mangled, n, declp)
if (HP_DEMANGLING && ((*mangled)[n] == 'X')) if (HP_DEMANGLING && ((*mangled)[n] == 'X'))
{ {
char *start_spec_args = NULL; char *start_spec_args = NULL;
int hold_options;
/* First check for and omit template specialization pseudo-arguments, /* First check for and omit template specialization pseudo-arguments,
such as in "Spec<#1,#1.*>" */ such as in "Spec<#1,#1.*>" */
...@@ -2330,6 +2331,12 @@ demangle_arm_hp_template (work, mangled, n, declp) ...@@ -2330,6 +2331,12 @@ demangle_arm_hp_template (work, mangled, n, declp)
string_init (&arg); string_init (&arg);
if (work->temp_start == -1) /* non-recursive call */ if (work->temp_start == -1) /* non-recursive call */
work->temp_start = declp->p - declp->b; work->temp_start = declp->p - declp->b;
/* We want to unconditionally demangle parameter types in
template parameters. */
hold_options = work->options;
work->options |= DMGL_PARAMS;
string_append (declp, "<"); string_append (declp, "<");
while (1) while (1)
{ {
...@@ -2376,17 +2383,25 @@ demangle_arm_hp_template (work, mangled, n, declp) ...@@ -2376,17 +2383,25 @@ demangle_arm_hp_template (work, mangled, n, declp)
string_delete (&arg); string_delete (&arg);
if (**mangled == '_') if (**mangled == '_')
(*mangled)++; (*mangled)++;
work->options = hold_options;
return; return;
} }
/* ARM template? (Also handles HP cfront extensions) */ /* ARM template? (Also handles HP cfront extensions) */
else if (arm_pt (work, *mangled, n, &p, &args)) else if (arm_pt (work, *mangled, n, &p, &args))
{ {
int hold_options;
string type_str; string type_str;
string_init (&arg); string_init (&arg);
string_appendn (declp, *mangled, p - *mangled); string_appendn (declp, *mangled, p - *mangled);
if (work->temp_start == -1) /* non-recursive call */ if (work->temp_start == -1) /* non-recursive call */
work->temp_start = declp->p - declp->b; work->temp_start = declp->p - declp->b;
/* We want to unconditionally demangle parameter types in
template parameters. */
hold_options = work->options;
work->options |= DMGL_PARAMS;
string_append (declp, "<"); string_append (declp, "<");
/* should do error checking here */ /* should do error checking here */
while (args < e) { while (args < e) {
...@@ -2430,7 +2445,10 @@ demangle_arm_hp_template (work, mangled, n, declp) ...@@ -2430,7 +2445,10 @@ demangle_arm_hp_template (work, mangled, n, declp)
/* Fail if we didn't make any progress: prevent infinite loop. */ /* Fail if we didn't make any progress: prevent infinite loop. */
if (args == old_args) if (args == old_args)
return; {
work->options = hold_options;
return;
}
} }
} }
string_appends (declp, &arg); string_appends (declp, &arg);
...@@ -2441,6 +2459,7 @@ demangle_arm_hp_template (work, mangled, n, declp) ...@@ -2441,6 +2459,7 @@ demangle_arm_hp_template (work, mangled, n, declp)
if (args >= e) if (args >= e)
--declp->p; /* remove extra comma */ --declp->p; /* remove extra comma */
string_append (declp, ">"); string_append (declp, ">");
work->options = hold_options;
} }
else if (n>10 && strncmp (*mangled, "_GLOBAL_", 8) == 0 else if (n>10 && strncmp (*mangled, "_GLOBAL_", 8) == 0
&& (*mangled)[9] == 'N' && (*mangled)[9] == 'N'
......
/* Demangler test program, /* Demangler test program,
Copyright (C) 2002 Free Software Foundation, Inc. Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
Written by Zack Weinberg <zack@codesourcery.com Written by Zack Weinberg <zack@codesourcery.com
This file is part of GNU libiberty. This file is part of GNU libiberty.
...@@ -80,16 +80,39 @@ getline(buf) ...@@ -80,16 +80,39 @@ getline(buf)
buf->alloced = alloc; buf->alloced = alloc;
} }
/* The tester operates on a data file consisting of triples of lines: static void
format switch fail (lineno, opts, in, out, exp)
int lineno;
const char *opts;
const char *in;
const char *out;
const char *exp;
{
printf ("\
FAIL at line %d, options %s:\n\
in: %s\n\
out: %s\n\
exp: %s\n",
lineno, opts, in, out != NULL ? out : "(null)", exp);
}
/* The tester operates on a data file consisting of groups of lines:
options
input to be demangled input to be demangled
expected output expected output
The format switch is expected to be either the empty string, a Supported options:
line of the form --format=<name>, or just <name> by itself. */ --format=<name> Sets the demangling style.
--no-params There are two lines of expected output; the first
is with DMGL_PARAMS, the second is without it.
--is-v3-ctor Calls is_gnu_v3_mangled_ctor on input; expected
output is an integer representing ctor_kind.
--is-v3-dtor Likewise, but for dtors.
#define FORMATS "--format=" For compatibility, just in case it matters, the options line may be
#define FORMATL (sizeof FORMATS - 1) empty, to mean --format=auto. If it doesn't start with --, then it
may contain only a format name.
*/
int int
main(argc, argv) main(argc, argv)
...@@ -97,10 +120,12 @@ main(argc, argv) ...@@ -97,10 +120,12 @@ main(argc, argv)
char **argv; char **argv;
{ {
enum demangling_styles style; enum demangling_styles style;
int no_params;
int is_v3_ctor;
int is_v3_dtor;
struct line format; struct line format;
struct line input; struct line input;
struct line expect; struct line expect;
char *fstyle;
char *result; char *result;
int failures = 0; int failures = 0;
int tests = 0; int tests = 0;
...@@ -126,20 +151,98 @@ main(argc, argv) ...@@ -126,20 +151,98 @@ main(argc, argv)
tests++; tests++;
fstyle = format.data; no_params = 0;
if (!strncmp (fstyle, FORMATS, FORMATL)) is_v3_ctor = 0;
fstyle += FORMATL; is_v3_dtor = 0;
if (format.data[0] == '\0')
if (fstyle[0] == '\0')
style = auto_demangling; style = auto_demangling;
else if (format.data[0] != '-')
{
style = cplus_demangle_name_to_style (format.data);
if (style == unknown_demangling)
{
printf ("FAIL at line %d: unknown demangling style %s\n",
lineno, format.data);
failures++;
continue;
}
}
else else
style = cplus_demangle_name_to_style (fstyle); {
char *p;
char *opt;
if (style == unknown_demangling) p = format.data;
while (*p != '\0')
{
char c;
opt = p;
p += strcspn (p, " \t=");
c = *p;
*p = '\0';
if (strcmp (opt, "--format") == 0 && c == '=')
{
char *fstyle;
*p = c;
++p;
fstyle = p;
p += strcspn (p, " \t");
c = *p;
*p = '\0';
style = cplus_demangle_name_to_style (fstyle);
if (style == unknown_demangling)
{
printf ("FAIL at line %d: unknown demangling style %s\n",
lineno, fstyle);
failures++;
continue;
}
}
else if (strcmp (opt, "--no-params") == 0)
no_params = 1;
else if (strcmp (opt, "--is-v3-ctor") == 0)
is_v3_ctor = 1;
else if (strcmp (opt, "--is-v3-dtor") == 0)
is_v3_dtor = 1;
else
{
printf ("FAIL at line %d: unrecognized option %s\n",
lineno, opt);
failures++;
continue;
}
*p = c;
p += strspn (p, " \t");
}
}
if (is_v3_ctor || is_v3_dtor)
{ {
printf ("FAIL at line %d: unknown demangling style %s\n", char buf[20];
lineno, fstyle);
failures++; if (is_v3_ctor)
{
enum gnu_v3_ctor_kinds kc;
kc = is_gnu_v3_mangled_ctor (input.data);
sprintf (buf, "%d", (int) kc);
}
else
{
enum gnu_v3_dtor_kinds kd;
kd = is_gnu_v3_mangled_dtor (input.data);
sprintf (buf, "%d", (int) kd);
}
if (strcmp (buf, expect.data) != 0)
{
fail (lineno, format.data, input.data, buf, expect.data);
failures++;
}
continue; continue;
} }
...@@ -152,18 +255,25 @@ main(argc, argv) ...@@ -152,18 +255,25 @@ main(argc, argv)
? strcmp (result, expect.data) ? strcmp (result, expect.data)
: strcmp (input.data, expect.data)) : strcmp (input.data, expect.data))
{ {
printf ("\ fail (lineno, format.data, input.data, result, expect.data);
FAIL at line %d, style %s:\n\
in: %s\n\
out: %s\n\
exp: %s\n",
lineno, fstyle,
input.data,
result,
expect.data);
failures++; failures++;
} }
free (result); free (result);
if (no_params)
{
getline (&expect);
result = cplus_demangle (input.data, DMGL_ANSI|DMGL_TYPES);
if (result
? strcmp (result, expect.data)
: strcmp (input.data, expect.data))
{
fail (lineno, format.data, input.data, result, expect.data);
failures++;
}
free (result);
}
} }
free (format.data); free (format.data);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment