[Demangle PATCH] Some pre-fix cleanups

https://gcc.gnu.org/ml/gcc-patches/2017-09/msg00983.html

	* cp-demangle.c (is_fnqual_component_type): Reimplement using
	FNQUAL_COMPONENT_CASE.
	(d_encoding): Hold bare_function_type in local var.
	(d_local_name): Build name in both cases and build result once.
	Collapse switch-if to single conditional.
	* testsuite/demangle-expected: Realign blank lines with tests.

From-SVN: r252802
This commit is contained in:
Nathan Sidwell 2017-09-15 10:50:05 +00:00 committed by Nathan Sidwell
parent 897da3034c
commit 9d89efebaa
3 changed files with 47 additions and 42 deletions

View File

@ -1,3 +1,12 @@
2017-09-15 Nathan Sidwell <nathan@acm.org>
* cp-demangle.c (is_fnqual_component_type): Reimplement using
FNQUAL_COMPONENT_CASE.
(d_encoding): Hold bare_function_type in local var.
(d_local_name): Build name in both cases and build result once.
Collapse switch-if to single conditional.
* testsuite/demangle-expected: Realign blank lines with tests.
2017-09-12 Jiong Wang <jiong.wang@arm.com> 2017-09-12 Jiong Wang <jiong.wang@arm.com>
* dwarfnames.c (DW_CFA_DUP): New define. * dwarfnames.c (DW_CFA_DUP): New define.

View File

@ -568,22 +568,6 @@ static int d_demangle_callback (const char *, int,
demangle_callbackref, void *); demangle_callbackref, void *);
static char *d_demangle (const char *, int, size_t *); static char *d_demangle (const char *, int, size_t *);
/* True iff TYPE is a demangling component representing a
function-type-qualifier. */
static int
is_fnqual_component_type (enum demangle_component_type type)
{
return (type == DEMANGLE_COMPONENT_RESTRICT_THIS
|| type == DEMANGLE_COMPONENT_VOLATILE_THIS
|| type == DEMANGLE_COMPONENT_CONST_THIS
|| type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS
|| type == DEMANGLE_COMPONENT_TRANSACTION_SAFE
|| type == DEMANGLE_COMPONENT_NOEXCEPT
|| type == DEMANGLE_COMPONENT_THROW_SPEC
|| type == DEMANGLE_COMPONENT_REFERENCE_THIS);
}
#define FNQUAL_COMPONENT_CASE \ #define FNQUAL_COMPONENT_CASE \
case DEMANGLE_COMPONENT_RESTRICT_THIS: \ case DEMANGLE_COMPONENT_RESTRICT_THIS: \
case DEMANGLE_COMPONENT_VOLATILE_THIS: \ case DEMANGLE_COMPONENT_VOLATILE_THIS: \
@ -594,6 +578,23 @@ is_fnqual_component_type (enum demangle_component_type type)
case DEMANGLE_COMPONENT_NOEXCEPT: \ case DEMANGLE_COMPONENT_NOEXCEPT: \
case DEMANGLE_COMPONENT_THROW_SPEC case DEMANGLE_COMPONENT_THROW_SPEC
/* True iff TYPE is a demangling component representing a
function-type-qualifier. */
static int
is_fnqual_component_type (enum demangle_component_type type)
{
switch (type)
{
FNQUAL_COMPONENT_CASE:
return 1;
default:
break;
}
return 0;
}
#ifdef CP_DEMANGLE_DEBUG #ifdef CP_DEMANGLE_DEBUG
static void static void
@ -1305,7 +1306,7 @@ d_encoding (struct d_info *di, int top_level)
return d_special_name (di); return d_special_name (di);
else else
{ {
struct demangle_component *dc; struct demangle_component *dc, *dcr;
dc = d_name (di); dc = d_name (di);
@ -1327,8 +1328,6 @@ d_encoding (struct d_info *di, int top_level)
which is local to a function. */ which is local to a function. */
if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME) if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
{ {
struct demangle_component *dcr;
dcr = d_right (dc); dcr = d_right (dc);
while (is_fnqual_component_type (dcr->type)) while (is_fnqual_component_type (dcr->type))
dcr = d_left (dcr); dcr = d_left (dcr);
@ -1341,8 +1340,8 @@ d_encoding (struct d_info *di, int top_level)
peek = d_peek_char (di); peek = d_peek_char (di);
if (dc == NULL || peek == '\0' || peek == 'E') if (dc == NULL || peek == '\0' || peek == 'E')
return dc; return dc;
return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc, dcr = d_bare_function_type (di, has_return_type (dc));
d_bare_function_type (di, has_return_type (dc))); return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc, dcr);
} }
} }
@ -3571,6 +3570,7 @@ static struct demangle_component *
d_local_name (struct d_info *di) d_local_name (struct d_info *di)
{ {
struct demangle_component *function; struct demangle_component *function;
struct demangle_component *name;
if (! d_check_char (di, 'Z')) if (! d_check_char (di, 'Z'))
return NULL; return NULL;
@ -3585,13 +3585,10 @@ d_local_name (struct d_info *di)
d_advance (di, 1); d_advance (di, 1);
if (! d_discriminator (di)) if (! d_discriminator (di))
return NULL; return NULL;
return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name = d_make_name (di, "string literal", sizeof "string literal" - 1);
d_make_name (di, "string literal",
sizeof "string literal" - 1));
} }
else else
{ {
struct demangle_component *name;
int num = -1; int num = -1;
if (d_peek_char (di) == 'd') if (d_peek_char (di) == 'd')
@ -3604,21 +3601,19 @@ d_local_name (struct d_info *di)
} }
name = d_name (di); name = d_name (di);
if (name) if (name
switch (name->type) /* Lambdas and unnamed types have internal discriminators. */
{ && name->type != DEMANGLE_COMPONENT_LAMBDA
/* Lambdas and unnamed types have internal discriminators. */ && name->type != DEMANGLE_COMPONENT_UNNAMED_TYPE
case DEMANGLE_COMPONENT_LAMBDA: /* Otherwise read and ignore an optional discriminator. */
case DEMANGLE_COMPONENT_UNNAMED_TYPE: && ! d_discriminator (di))
break; return NULL;
default:
if (! d_discriminator (di))
return NULL;
}
if (num >= 0) if (num >= 0)
name = d_make_default_arg (di, num, name); name = d_make_default_arg (di, num, name);
return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
} }
return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name);
} }
/* <discriminator> ::= _ <number> # when number < 10 /* <discriminator> ::= _ <number> # when number < 10

View File

@ -4720,18 +4720,19 @@ _ZdvMMMMMMMMMMMMMrrrrA_DTdvfp_fp_Eededilfdfdfdfd
_Z1MA_aMMMMA_MMA_MMMMMMMMSt1MS_o11T0000000000t2M0oooozoooo _Z1MA_aMMMMA_MMA_MMMMMMMMSt1MS_o11T0000000000t2M0oooozoooo
_Z1MA_aMMMMA_MMA_MMMMMMMMSt1MS_o11T0000000000t2M0oooozoooo _Z1MA_aMMMMA_MMA_MMMMMMMMSt1MS_o11T0000000000t2M0oooozoooo
# #
# demangler/80513 Test for overflow in d_number # demangler/80513 Test for overflow in d_number
_Z4294967297x
_Z4294967297x
_Z4294967297x
_Z4294967297x
# #
# demangler/80513 Test for bogus characters after __thunk_ # demangler/80513 Test for bogus characters after __thunk_
__thunk_16a_$_1x
__thunk_16a_$_1x
__thunk_16a_$_1x
__thunk_16a_$_1x
# #
# demangler/80513 Test for overflow in consume_count # demangler/80513 Test for overflow in consume_count
__thunk_4294967297__$_1x __thunk_4294967297__$_1x
__thunk_4294967297__$_1x __thunk_4294967297__$_1x
#