aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2017-09-15 10:50:05 +0000
committerNathan Sidwell <nathan@acm.org>2017-09-15 10:50:05 +0000
commitd0b4342c4c60d6c1cfcb4cb4a9a4804e571be868 (patch)
tree94e0883a0fd5c2512e92b4bfdddc51a68d9d580f
parent83abfdb254cb1dc016a55c3366608c4c1b460f21 (diff)
[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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@252802 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libiberty/ChangeLog9
-rw-r--r--libiberty/cp-demangle.c69
-rw-r--r--libiberty/testsuite/demangle-expected7
3 files changed, 45 insertions, 40 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index ca2b1a0aca2..2ecd478f31e 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -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>
* dwarfnames.c (DW_CFA_DUP): New define.
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index 7b8d0b4cbaa..e8705984c52 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -568,22 +568,6 @@ static int d_demangle_callback (const char *, int,
demangle_callbackref, void *);
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 \
case DEMANGLE_COMPONENT_RESTRICT_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_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
static void
@@ -1305,7 +1306,7 @@ d_encoding (struct d_info *di, int top_level)
return d_special_name (di);
else
{
- struct demangle_component *dc;
+ struct demangle_component *dc, *dcr;
dc = d_name (di);
@@ -1327,8 +1328,6 @@ d_encoding (struct d_info *di, int top_level)
which is local to a function. */
if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME)
{
- struct demangle_component *dcr;
-
dcr = d_right (dc);
while (is_fnqual_component_type (dcr->type))
dcr = d_left (dcr);
@@ -1341,8 +1340,8 @@ d_encoding (struct d_info *di, int top_level)
peek = d_peek_char (di);
if (dc == NULL || peek == '\0' || peek == 'E')
return dc;
- return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc,
- d_bare_function_type (di, has_return_type (dc)));
+ dcr = 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)
{
struct demangle_component *function;
+ struct demangle_component *name;
if (! d_check_char (di, 'Z'))
return NULL;
@@ -3585,13 +3585,10 @@ d_local_name (struct d_info *di)
d_advance (di, 1);
if (! d_discriminator (di))
return NULL;
- return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function,
- d_make_name (di, "string literal",
- sizeof "string literal" - 1));
+ name = d_make_name (di, "string literal", sizeof "string literal" - 1);
}
else
{
- struct demangle_component *name;
int num = -1;
if (d_peek_char (di) == 'd')
@@ -3604,21 +3601,19 @@ d_local_name (struct d_info *di)
}
name = d_name (di);
- if (name)
- switch (name->type)
- {
- /* Lambdas and unnamed types have internal discriminators. */
- case DEMANGLE_COMPONENT_LAMBDA:
- case DEMANGLE_COMPONENT_UNNAMED_TYPE:
- break;
- default:
- if (! d_discriminator (di))
- return NULL;
- }
+ if (name
+ /* Lambdas and unnamed types have internal discriminators. */
+ && name->type != DEMANGLE_COMPONENT_LAMBDA
+ && name->type != DEMANGLE_COMPONENT_UNNAMED_TYPE
+ /* Otherwise read and ignore an optional discriminator. */
+ && ! d_discriminator (di))
+ return NULL;
+
if (num >= 0)
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
diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected
index f2a12b9a7d1..519f6d05f27 100644
--- a/libiberty/testsuite/demangle-expected
+++ b/libiberty/testsuite/demangle-expected
@@ -4720,18 +4720,19 @@ _ZdvMMMMMMMMMMMMMrrrrA_DTdvfp_fp_Eededilfdfdfdfd
_Z1MA_aMMMMA_MMA_MMMMMMMMSt1MS_o11T0000000000t2M0oooozoooo
_Z1MA_aMMMMA_MMA_MMMMMMMMSt1MS_o11T0000000000t2M0oooozoooo
-
#
# demangler/80513 Test for overflow in d_number
+
_Z4294967297x
_Z4294967297x
-
#
# demangler/80513 Test for bogus characters after __thunk_
+
__thunk_16a_$_1x
__thunk_16a_$_1x
-
#
# demangler/80513 Test for overflow in consume_count
+
__thunk_4294967297__$_1x
__thunk_4294967297__$_1x
+#