GTY: Repair 'enum gty_token', 'token_names' desynchronization (was: [cxx-conversion] Support garbage-collected C++ templates)

Message ID 87jzveu08y.fsf@euler.schwinge.homeip.net
State Accepted
Headers
Series GTY: Repair 'enum gty_token', 'token_names' desynchronization (was: [cxx-conversion] Support garbage-collected C++ templates) |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Thomas Schwinge July 5, 2023, 10:21 a.m. UTC
  Hi!

On 2012-08-10T11:06:46-0400, Diego Novillo <dnovillo@google.com> wrote:
>          * gengtype-lex.l (USER_GTY): Add pattern for "user".
>          * gengtype-parse.c (option): Handle USER_GTY.
>          (opts_have): New.
>          (type): Call it.
>          If the keyword 'user' is used, do not walk the fields
>          of the structure.
>          * gengtype.h (USER_GTY): Add.

These changes got incorporated in
commit 0823efedd0fb8669b7e840954bc54c3b2cf08d67 (Subversion r190402).

> --- a/gcc/gengtype-lex.l
> +++ b/gcc/gengtype-lex.l
> @@ -108,6 +108,7 @@ EOID      [^[:alnum:]_]
>   "enum"/{EOID}                       { return ENUM; }
>   "ptr_alias"/{EOID}          { return PTR_ALIAS; }
>   "nested_ptr"/{EOID}         { return NESTED_PTR; }
> +"user"/{EOID}                        { return USER_GTY; }
>   [0-9]+                              { return NUM; }
>   "param"[0-9]*"_is"/{EOID}           {
>     *yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);

> --- a/gcc/gengtype-parse.c
> +++ b/gcc/gengtype-parse.c
> @@ -499,6 +499,10 @@ option (options_p prev)
> [...]

> --- a/gcc/gengtype.h
> +++ b/gcc/gengtype.h
> @@ -463,6 +463,7 @@ enum
>       ELLIPSIS,
>       PTR_ALIAS,
>       NESTED_PTR,
> +    USER_GTY,
>       PARAM_IS,
>       NUM,
>       SCALAR,

This did add 'USER_GTY' to what nowadays is known as 'enum gty_token',
but didn't accordingly update 'gcc/gengtype-parse.c:token_names', leaving
those out of sync.  Updating 'gcc/gengtype-parse.c:token_value_format'
wasn't necessary, as:

    /* print_token assumes that any token >= FIRST_TOKEN_WITH_VALUE may have
       a meaningful value to be printed.  */
    FIRST_TOKEN_WITH_VALUE = PARAM_IS

This, in turn, got further confused -- or "fixed" -- by later changes:
2014 commit 63f5d5b818319129217e41bcb23db53f99ff11b0 (Subversion r218558)
"remove gengtype support for param_is use_param, if_marked and splay tree allocators",
which reciprocally missed corresponding clean-up.

OK to push the attached
"GTY: Repair 'enum gty_token', 'token_names' desynchronization"?


On top of that, I'll then re-submit an adjusted
<https://inbox.sourceware.org/873522vkmu.fsf@euler.schwinge.homeip.net>
"GTY: Clean up obsolete parametrized structs remnants".


Grüße
 Thomas


-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  

Comments

Richard Biener July 6, 2023, 6:01 a.m. UTC | #1
On Wed, Jul 5, 2023 at 12:21 PM Thomas Schwinge <thomas@codesourcery.com> wrote:
>
> Hi!
>
> On 2012-08-10T11:06:46-0400, Diego Novillo <dnovillo@google.com> wrote:
> >          * gengtype-lex.l (USER_GTY): Add pattern for "user".
> >          * gengtype-parse.c (option): Handle USER_GTY.
> >          (opts_have): New.
> >          (type): Call it.
> >          If the keyword 'user' is used, do not walk the fields
> >          of the structure.
> >          * gengtype.h (USER_GTY): Add.
>
> These changes got incorporated in
> commit 0823efedd0fb8669b7e840954bc54c3b2cf08d67 (Subversion r190402).
>
> > --- a/gcc/gengtype-lex.l
> > +++ b/gcc/gengtype-lex.l
> > @@ -108,6 +108,7 @@ EOID      [^[:alnum:]_]
> >   "enum"/{EOID}                       { return ENUM; }
> >   "ptr_alias"/{EOID}          { return PTR_ALIAS; }
> >   "nested_ptr"/{EOID}         { return NESTED_PTR; }
> > +"user"/{EOID}                        { return USER_GTY; }
> >   [0-9]+                              { return NUM; }
> >   "param"[0-9]*"_is"/{EOID}           {
> >     *yylval = XDUPVAR (const char, yytext, yyleng, yyleng+1);
>
> > --- a/gcc/gengtype-parse.c
> > +++ b/gcc/gengtype-parse.c
> > @@ -499,6 +499,10 @@ option (options_p prev)
> > [...]
>
> > --- a/gcc/gengtype.h
> > +++ b/gcc/gengtype.h
> > @@ -463,6 +463,7 @@ enum
> >       ELLIPSIS,
> >       PTR_ALIAS,
> >       NESTED_PTR,
> > +    USER_GTY,
> >       PARAM_IS,
> >       NUM,
> >       SCALAR,
>
> This did add 'USER_GTY' to what nowadays is known as 'enum gty_token',
> but didn't accordingly update 'gcc/gengtype-parse.c:token_names', leaving
> those out of sync.  Updating 'gcc/gengtype-parse.c:token_value_format'
> wasn't necessary, as:
>
>     /* print_token assumes that any token >= FIRST_TOKEN_WITH_VALUE may have
>        a meaningful value to be printed.  */
>     FIRST_TOKEN_WITH_VALUE = PARAM_IS
>
> This, in turn, got further confused -- or "fixed" -- by later changes:
> 2014 commit 63f5d5b818319129217e41bcb23db53f99ff11b0 (Subversion r218558)
> "remove gengtype support for param_is use_param, if_marked and splay tree allocators",
> which reciprocally missed corresponding clean-up.
>
> OK to push the attached
> "GTY: Repair 'enum gty_token', 'token_names' desynchronization"?

OK.

>
> On top of that, I'll then re-submit an adjusted
> <https://inbox.sourceware.org/873522vkmu.fsf@euler.schwinge.homeip.net>
> "GTY: Clean up obsolete parametrized structs remnants".
>
>
> Grüße
>  Thomas
>
>
> -----------------
> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  

Patch

From 8d2b040e825acdcddb7e1ff991fd538db13392f2 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Wed, 5 Jul 2023 11:10:55 +0200
Subject: [PATCH] GTY: Repair 'enum gty_token', 'token_names' desynchronization

For example, for the following (made-up) changes:

    --- gcc/ggc-tests.cc
    +++ gcc/ggc-tests.cc
    @@ -258 +258 @@ class GTY((tag("1"))) some_subclass : public example_base
    -class GTY((tag("2"))) some_other_subclass : public example_base
    +class GTY((tag(user))) some_other_subclass : public example_base
    @@ -384 +384 @@ test_chain_next ()
    -struct GTY((user)) user_struct
    +struct GTY((user user)) user_struct

..., we get unexpected "have a param<N>_is option" diagnostics:

    [...]
    build/gengtype  \
                        -S [...]/source-gcc/gcc -I gtyp-input.list -w tmp-gtype.state
    [...]/source-gcc/gcc/ggc-tests.cc:258: parse error: expected a string constant, have a param<N>_is option
    [...]/source-gcc/gcc/ggc-tests.cc:384: parse error: expected ')', have a param<N>_is option
    make[2]: *** [Makefile:2888: s-gtype] Error 1
    [...]

This traces back to 2012 "Support garbage-collected C++ templates", which got
incorporated in commit 0823efedd0fb8669b7e840954bc54c3b2cf08d67
(Subversion r190402), which did add 'USER_GTY' to what nowadays is known as
'enum gty_token', but didn't accordingly update
'gcc/gengtype-parse.c:token_names', leaving those out of sync.  Updating
'gcc/gengtype-parse.c:token_value_format' wasn't necessary, as:

    /* print_token assumes that any token >= FIRST_TOKEN_WITH_VALUE may have
       a meaningful value to be printed.  */
    FIRST_TOKEN_WITH_VALUE = PARAM_IS

This, in turn, got further confused -- or "fixed" -- by later changes:
2014 commit 63f5d5b818319129217e41bcb23db53f99ff11b0 (Subversion r218558)
"remove gengtype support for param_is use_param, if_marked and splay tree allocators",
which reciprocally missed corresponding clean-up.

With that addressed via adding the missing '"user"' to 'token_names', and,
until that is properly fixed, a temporary 'UNUSED_PARAM_IS' (re-)added for use
with 'FIRST_TOKEN_WITH_VALUE', we then get the expected:

    [...]/source-gcc/gcc/ggc-tests.cc:258: parse error: expected a string constant, have 'user'
    [...]/source-gcc/gcc/ggc-tests.cc:384: parse error: expected ')', have 'user'

	gcc/
	* gengtype-parse.cc (token_names): Add '"user"'.
	* gengtype.h (gty_token): Add 'UNUSED_PARAM_IS' for use with
	'FIRST_TOKEN_WITH_VALUE'.
---
 gcc/gengtype-parse.cc | 3 +++
 gcc/gengtype.h        | 5 ++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/gcc/gengtype-parse.cc b/gcc/gengtype-parse.cc
index 2b2156c5f45..8791b35a3da 100644
--- a/gcc/gengtype-parse.cc
+++ b/gcc/gengtype-parse.cc
@@ -69,6 +69,7 @@  advance (void)
 /* Diagnostics.  */
 
 /* This array is indexed by the token code minus CHAR_TOKEN_OFFSET.  */
+/* Keep in sync with 'gengtype.h:enum gty_token'.  */
 static const char *const token_names[] = {
   "GTY",
   "typedef",
@@ -80,6 +81,7 @@  static const char *const token_names[] = {
   "...",
   "ptr_alias",
   "nested_ptr",
+  "user",
   "a param<N>_is option",
   "a number",
   "a scalar type",
@@ -91,6 +93,7 @@  static const char *const token_names[] = {
 };
 
 /* This array is indexed by token code minus FIRST_TOKEN_WITH_VALUE.  */
+/* Keep in sync with 'gengtype.h:enum gty_token'.  */
 static const char *const token_value_format[] = {
   "%s",
   "'%s'",
diff --git a/gcc/gengtype.h b/gcc/gengtype.h
index 4e5df544fbf..2122373edf2 100644
--- a/gcc/gengtype.h
+++ b/gcc/gengtype.h
@@ -458,6 +458,8 @@  extern void parse_file (const char *name);
 extern bool hit_error;
 
 /* Token codes.  */
+/* Keep 'gengtype-parse.cc:token_names', 'gengtype-parse.cc:token_value_format'
+   in sync.  */
 enum gty_token
 {
   EOF_TOKEN = 0,
@@ -476,6 +478,7 @@  enum gty_token
   PTR_ALIAS,
   NESTED_PTR,
   USER_GTY,
+  UNUSED_PARAM_IS,
   NUM,
   SCALAR,
   ID,
@@ -486,7 +489,7 @@  enum gty_token
 
   /* print_token assumes that any token >= FIRST_TOKEN_WITH_VALUE may have
      a meaningful value to be printed.  */
-  FIRST_TOKEN_WITH_VALUE = USER_GTY
+  FIRST_TOKEN_WITH_VALUE = UNUSED_PARAM_IS
 };
 
 
-- 
2.34.1