d-demangle: properly skip anonymous symbols

Message ID 20211005171358.1010162-1-contact@lsferreira.net
State New
Headers
Series d-demangle: properly skip anonymous symbols |

Commit Message

Luís Ferreira Oct. 5, 2021, 5:13 p.m. UTC
  This patch fixes a bug on the D demangler by parsing and skip anonymous symbols
correctly, according the ABI specification. Furthermore, it also includes tests
to cover anonymous symbols.

The spec specifies [1] that a symbol name can be anonymous and multiple
anonymous symbols are allowed.

[1]: https://dlang.org/spec/abi.html#SymbolName

ChangeLog:
libiberty/
	* d-demangle.c (dlang_parse_qualified): Handle anonymous symbols
	  correctly.

	* testsuite/d-demangle-expected: New tests to cover anonymous symbols.

Signed-off-by: Luís Ferreira <contact@lsferreira.net>
---
 libiberty/d-demangle.c                  | 13 +++++++++----
 libiberty/testsuite/d-demangle-expected |  8 ++++++++
 2 files changed, 17 insertions(+), 4 deletions(-)
  

Comments

Luís Ferreira Oct. 5, 2021, 5:34 p.m. UTC | #1
On Tue, 2021-10-05 at 18:13 +0100, Luís Ferreira wrote:
> This patch fixes a bug on the D demangler by parsing and skip
> anonymous symbols
> correctly, according the ABI specification. Furthermore, it also
> includes tests
> to cover anonymous symbols.
> 
> The spec specifies [1] that a symbol name can be anonymous and
> multiple
> anonymous symbols are allowed.
> 
> [1]: https://dlang.org/spec/abi.html#SymbolName
> 
> ChangeLog:
> libiberty/
>         * d-demangle.c (dlang_parse_qualified): Handle anonymous
> symbols
>           correctly.
> 
>         * testsuite/d-demangle-expected: New tests to cover anonymous
> symbols.
> 
> Signed-off-by: Luís Ferreira <contact@lsferreira.net>
> ---
>  libiberty/d-demangle.c                  | 13 +++++++++----
>  libiberty/testsuite/d-demangle-expected |  8 ++++++++
>  2 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
> index 3adf7b562d1..682f73f9923 100644
> --- a/libiberty/d-demangle.c
> +++ b/libiberty/d-demangle.c
> @@ -1650,13 +1650,18 @@ dlang_parse_qualified (string *decl, const
> char *mangled,
>    size_t n = 0;
>    do
>      {
> +      /* Skip over anonymous symbols.  */
> +      if (*mangled == '0')
> +      {
> +       do mangled++;
> +       while (*mangled == '0');
> +
> +       continue;
> +      }
> +
>        if (n++)
>         string_append (decl, ".");
>  
> -      /* Skip over anonymous symbols.  */
> -      while (*mangled == '0')
> -       mangled++;
> -
>        mangled = dlang_identifier (decl, mangled, info);
>  
>        /* Consume the encoded arguments.  However if this is not
> followed by the
> diff --git a/libiberty/testsuite/d-demangle-expected
> b/libiberty/testsuite/d-demangle-expected
> index 44a3649c429..9459f600779 100644
> --- a/libiberty/testsuite/d-demangle-expected
> +++ b/libiberty/testsuite/d-demangle-expected
> @@ -1450,3 +1450,11 @@ mod.func().nested!(int).nested()
>  --format=dlang
>  _D6mangle__T8fun21753VSQv6S21753S1f_DQBj10__lambda71MFNaNbNiNfZvZQCb
> Qp
>  mangle.fun21753!(mangle.S21753(mangle.__lambda71())).fun21753
> +#
> +--format=dlang
> +_D8demangle9anonymous0Z
> +demangle.anonymous
> +#
> +--format=dlang
> +_D8demangle9anonymous03fooZ
> +demangle.anonymous.foo

I can't create an issue on bugzilla for this patch, since I don't have
an account. I'm going to create one right now. On the meanwhile, feel
free to review it.
  
Luís Ferreira Oct. 5, 2021, 5:53 p.m. UTC | #2
On Tue, 2021-10-05 at 18:13 +0100, Luís Ferreira wrote:
> This patch fixes a bug on the D demangler by parsing and skip anonymous
> symbols
> correctly, according the ABI specification. Furthermore, it also
> includes tests
> to cover anonymous symbols.
> 
> The spec specifies [1] that a symbol name can be anonymous and multiple
> anonymous symbols are allowed.
> 
> [1]: https://dlang.org/spec/abi.html#SymbolName
> 
> ChangeLog:
> libiberty/
>         * d-demangle.c (dlang_parse_qualified): Handle anonymous
> symbols
>           correctly.
> 
>         * testsuite/d-demangle-expected: New tests to cover anonymous
> symbols.
> 
> Signed-off-by: Luís Ferreira <contact@lsferreira.net>
> ---
>  libiberty/d-demangle.c                  | 13 +++++++++----
>  libiberty/testsuite/d-demangle-expected |  8 ++++++++
>  2 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
> index 3adf7b562d1..682f73f9923 100644
> --- a/libiberty/d-demangle.c
> +++ b/libiberty/d-demangle.c
> @@ -1650,13 +1650,18 @@ dlang_parse_qualified (string *decl, const char
> *mangled,
>    size_t n = 0;
>    do
>      {
> +      /* Skip over anonymous symbols.  */
> +      if (*mangled == '0')
> +      {
> +       do mangled++;
> +       while (*mangled == '0');
> +
> +       continue;
> +      }
> +
>        if (n++)
>         string_append (decl, ".");
>  
> -      /* Skip over anonymous symbols.  */
> -      while (*mangled == '0')
> -       mangled++;
> -
>        mangled = dlang_identifier (decl, mangled, info);
>  
>        /* Consume the encoded arguments.  However if this is not
> followed by the
> diff --git a/libiberty/testsuite/d-demangle-expected
> b/libiberty/testsuite/d-demangle-expected
> index 44a3649c429..9459f600779 100644
> --- a/libiberty/testsuite/d-demangle-expected
> +++ b/libiberty/testsuite/d-demangle-expected
> @@ -1450,3 +1450,11 @@ mod.func().nested!(int).nested()
>  --format=dlang
>  _D6mangle__T8fun21753VSQv6S21753S1f_DQBj10__lambda71MFNaNbNiNfZvZQCbQp
>  mangle.fun21753!(mangle.S21753(mangle.__lambda71())).fun21753
> +#
> +--format=dlang
> +_D8demangle9anonymous0Z
> +demangle.anonymous
> +#
> +--format=dlang
> +_D8demangle9anonymous03fooZ
> +demangle.anonymous.foo

Updated ChangeLog:

ChangeLog:
    libiberty/
	PR bugzilla_component/102618
	* d-demangle.c (dlang_parse_qualified): Handle anonymous
symbols correctly.

	* testsuite/d-demangle-expected: New tests to cover anonymous
symbols.
  
Jeff Law Oct. 17, 2021, 10:39 p.m. UTC | #3
On 10/5/2021 11:53 AM, Luís Ferreira wrote:
> On Tue, 2021-10-05 at 18:13 +0100, Luís Ferreira wrote:
>> This patch fixes a bug on the D demangler by parsing and skip anonymous
>> symbols
>> correctly, according the ABI specification. Furthermore, it also
>> includes tests
>> to cover anonymous symbols.
>>
>> The spec specifies [1] that a symbol name can be anonymous and multiple
>> anonymous symbols are allowed.
>>
>> [1]: https://dlang.org/spec/abi.html#SymbolName
>>
>> ChangeLog:
>> libiberty/
>>          * d-demangle.c (dlang_parse_qualified): Handle anonymous
>> symbols
>>            correctly.
>>
>>          * testsuite/d-demangle-expected: New tests to cover anonymous
>> symbols.
Thanks.  I fixed a whitespace nit and installed this patch.

Jeff
  

Patch

diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
index 3adf7b562d1..682f73f9923 100644
--- a/libiberty/d-demangle.c
+++ b/libiberty/d-demangle.c
@@ -1650,13 +1650,18 @@  dlang_parse_qualified (string *decl, const char *mangled,
   size_t n = 0;
   do
     {
+      /* Skip over anonymous symbols.  */
+      if (*mangled == '0')
+      {
+	do mangled++;
+	while (*mangled == '0');
+
+	continue;
+      }
+
       if (n++)
 	string_append (decl, ".");
 
-      /* Skip over anonymous symbols.  */
-      while (*mangled == '0')
-	mangled++;
-
       mangled = dlang_identifier (decl, mangled, info);
 
       /* Consume the encoded arguments.  However if this is not followed by the
diff --git a/libiberty/testsuite/d-demangle-expected b/libiberty/testsuite/d-demangle-expected
index 44a3649c429..9459f600779 100644
--- a/libiberty/testsuite/d-demangle-expected
+++ b/libiberty/testsuite/d-demangle-expected
@@ -1450,3 +1450,11 @@  mod.func().nested!(int).nested()
 --format=dlang
 _D6mangle__T8fun21753VSQv6S21753S1f_DQBj10__lambda71MFNaNbNiNfZvZQCbQp
 mangle.fun21753!(mangle.S21753(mangle.__lambda71())).fun21753
+#
+--format=dlang
+_D8demangle9anonymous0Z
+demangle.anonymous
+#
+--format=dlang
+_D8demangle9anonymous03fooZ
+demangle.anonymous.foo