Re: [PATCH v2 2/4] Parse base classes for GTY-marked types

2013-10-23 Thread David Malcolm
On Tue, 2013-10-15 at 12:45 -0600, Jeff Law wrote:
> On 09/24/13 11:49, David Malcolm wrote:
> > Extend gengtype (and gtype.state reading/writing) so that it is able to
> > parse base classes in simple cases, and only attempt to do it for
> > GTY-marked types.
> >
> > * gengtype-parse.c (require_without_advance): New.
> > (type): For GTY-marked types that are not GTY((user)), parse any
> > base classes, requiring them to be single-inheritance, and not
> > be templates.  For non-GTY-marked types and GTY((user)),
> > continue to skip over any C++ inheritance specification.
> > * gengtype-state.c (state_writer::write_state_struct_type):
> > Write base class of type (if any).
> > (read_state_struct_type): Read base class of type (if any).
> > * gengtype.c (new_structure): Add a "base_class" parameter.
> > (create_optional_field_): Update for new parameter to
> > new_structure.
> > (adjust_field_rtx_def): Likewise.
> > (adjust_field_tree_exp): Likewise.
> > * gengtype.h (struct type): Add "base_class" field to the s
> > union field.
> > (new_structure): Add "base" parameter.
> This is OK.
Sorry about belated response.

I've now committed this to trunk as r204003, having doublechecked the
bootstrap and testsuites.

Thanks
Dave



Re: [PATCH v2 2/4] Parse base classes for GTY-marked types

2013-10-15 Thread Jeff Law

On 09/24/13 11:49, David Malcolm wrote:

Extend gengtype (and gtype.state reading/writing) so that it is able to
parse base classes in simple cases, and only attempt to do it for
GTY-marked types.

* gengtype-parse.c (require_without_advance): New.
(type): For GTY-marked types that are not GTY((user)), parse any
base classes, requiring them to be single-inheritance, and not
be templates.  For non-GTY-marked types and GTY((user)),
continue to skip over any C++ inheritance specification.
* gengtype-state.c (state_writer::write_state_struct_type):
Write base class of type (if any).
(read_state_struct_type): Read base class of type (if any).
* gengtype.c (new_structure): Add a "base_class" parameter.
(create_optional_field_): Update for new parameter to
new_structure.
(adjust_field_rtx_def): Likewise.
(adjust_field_tree_exp): Likewise.
* gengtype.h (struct type): Add "base_class" field to the s
union field.
(new_structure): Add "base" parameter.

This is OK.

jeff



[PATCH v2 2/4] Parse base classes for GTY-marked types

2013-09-24 Thread David Malcolm
Extend gengtype (and gtype.state reading/writing) so that it is able to
parse base classes in simple cases, and only attempt to do it for
GTY-marked types.

* gengtype-parse.c (require_without_advance): New.
(type): For GTY-marked types that are not GTY((user)), parse any
base classes, requiring them to be single-inheritance, and not
be templates.  For non-GTY-marked types and GTY((user)),
continue to skip over any C++ inheritance specification.
* gengtype-state.c (state_writer::write_state_struct_type):
Write base class of type (if any).
(read_state_struct_type): Read base class of type (if any).
* gengtype.c (new_structure): Add a "base_class" parameter.
(create_optional_field_): Update for new parameter to
new_structure.
(adjust_field_rtx_def): Likewise.
(adjust_field_tree_exp): Likewise.
* gengtype.h (struct type): Add "base_class" field to the s
union field.
(new_structure): Add "base" parameter.
---
 gcc/gengtype-parse.c | 50 +-
 gcc/gengtype-state.c |  2 ++
 gcc/gengtype.c   | 15 ---
 gcc/gengtype.h   |  4 +++-
 4 files changed, 58 insertions(+), 13 deletions(-)

diff --git a/gcc/gengtype-parse.c b/gcc/gengtype-parse.c
index e5204c1..31d493a 100644
--- a/gcc/gengtype-parse.c
+++ b/gcc/gengtype-parse.c
@@ -165,6 +165,21 @@ require (int t)
   return v;
 }
 
+/* As per require, but do not advance.  */
+static const char *
+require_without_advance (int t)
+{
+  int u = token ();
+  const char *v = T.value;
+  if (u != t)
+{
+  parse_error ("expected %s, have %s",
+  print_token (t, 0), print_token (u, v));
+  return 0;
+}
+  return v;
+}
+
 /* If the next token does not have one of the codes T1 or T2, report a
parse error; otherwise return the token's value.  */
 static const char *
@@ -829,6 +844,7 @@ type (options_p *optsp, bool nested)
 case STRUCT:
 case UNION:
   {
+   type_p base_class = NULL;
options_p opts = 0;
/* GTY annotations follow attribute syntax
   GTY_BEFORE_ID is for union/struct declarations
@@ -868,16 +884,39 @@ type (options_p *optsp, bool nested)
opts = gtymarker_opt ();
  }
 
+   bool is_user_gty = opts_have (opts, "user");
+
if (token () == ':')
  {
-   /* Skip over C++ inheritance specification.  */
-   while (token () != '{')
- advance ();
+   if (is_gty && !is_user_gty)
+ {
+   /* For GTY-marked types that are not "user", parse some C++
+  inheritance specifications.
+  We require single-inheritance from a non-template type.  */
+   advance ();
+   const char *basename = require (ID);
+   /* This may be either an access specifier, or the base name.  */
+   if (0 == strcmp (basename, "public")
+   || 0 == strcmp (basename, "protected")
+   || 0 == strcmp (basename, "private"))
+ basename = require (ID);
+   base_class = find_structure (basename, TYPE_STRUCT);
+   if (!base_class)
+ parse_error ("unrecognized base class: %s", basename);
+   require_without_advance ('{');
+ }
+   else
+ {
+   /* For types lacking GTY-markings, skip over C++ inheritance
+  specification (and thus avoid having to parse e.g. template
+  types).  */
+   while (token () != '{')
+ advance ();
+ }
  }
 
if (is_gty)
  {
-   bool is_user_gty = opts_have (opts, "user");
if (token () == '{')
  {
pair_p fields;
@@ -900,7 +939,8 @@ type (options_p *optsp, bool nested)
return create_user_defined_type (s, &lexer_line);
  }
 
-   return new_structure (s, kind, &lexer_line, fields, opts);
+   return new_structure (s, kind, &lexer_line, fields, opts,
+ base_class);
  }
  }
else if (token () == '{')
diff --git a/gcc/gengtype-state.c b/gcc/gengtype-state.c
index ba7948a..54e4287 100644
--- a/gcc/gengtype-state.c
+++ b/gcc/gengtype-state.c
@@ -957,6 +957,7 @@ state_writer::write_state_struct_type (type_p current)
 {
   write_state_struct_union_type (current, "struct");
   write_state_type (current->u.s.lang_struct);
+  write_state_type (current->u.s.base_class);
 }
 
 /* Write a GTY user-defined struct type.  */
@@ -1613,6 +1614,7 @@ read_state_struct_type (type_p type)
   read_state_options (&(type->u.s.opt));
   read_state_lang_bitmap (&(type->u.s.bitmap));
   read_state_type (&(type->u.s.lang_struct));
+  read_state_type (&(type->u.s.base_class));