This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [cxx-conversion] Add Record Builder Class


On Thu, Feb 14, 2013 at 8:44 PM, Lawrence Crowl <crowl@google.com> wrote:
> On 2/14/13, Richard Biener <richard.guenther@gmail.com> wrote:
>> On Tue, Feb 12, 2013 at 8:47 PM, Lawrence Crowl <crowl@google.com> wrote:
>> > Add class record_builder to ease construction of records and unions.  Use
>> > it
>> > in some appropriate places.
> ....
>> >  tree
>> > -default_emutls_var_fields (tree type, tree *name ATTRIBUTE_UNUSED)
>> > +default_emutls_object_type (void)
>> >  {
>> > -  tree word_type_node, field, next_field;
>> > -
>> > -  field = build_decl (UNKNOWN_LOCATION,
>> > -                     FIELD_DECL, get_identifier ("__templ"), ptr_type_node);
>> > -  DECL_CONTEXT (field) = type;
>> > -  next_field = field;
>> > -
>> > -  field = build_decl (UNKNOWN_LOCATION,
>> > -                     FIELD_DECL, get_identifier ("__offset"),
>> > -                     ptr_type_node);
>> > -  DECL_CONTEXT (field) = type;
>> > -  DECL_CHAIN (field) = next_field;
>> > -  next_field = field;
>> > -
>> > -  word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
>> > -  field = build_decl (UNKNOWN_LOCATION,
>> > -                     FIELD_DECL, get_identifier ("__align"),
>> > -                     word_type_node);
>> > -  DECL_CONTEXT (field) = type;
>> > -  DECL_CHAIN (field) = next_field;
>> > -  next_field = field;
>> > -
>> > -  field = build_decl (UNKNOWN_LOCATION,
>> > -                     FIELD_DECL, get_identifier ("__size"), word_type_node);
>> > -  DECL_CONTEXT (field) = type;
>> > -  DECL_CHAIN (field) = next_field;
>> > -
>> > -  return field;
>> > +  tree word_type_node = lang_hooks.types.type_for_mode (word_mode, 1);
>> > +  record_builder rec;
>> > +  rec.add_field ("__size", word_type_node);
>> > +  rec.add_field ("__align", word_type_node);
>> > +  rec.add_field ("__offset", ptr_type_node);
>> > +  rec.add_field ("__templ", ptr_type_node);
>> > +  rec.layout ();
>>
>> That's awkward - you want to hide the fact that layout has
>> to happen and that it has to happen "last".  Just make it a
>> side-effect of .as_tree ().
>
> Sometimes you want to construct recursive types, and for that you
> need .as_tree to execute before layout.  This feature is used in
> the patch.
>
>> Note that add_field want's to return the FIELD_DECL created,
>> people may want to alter it.
>
> Do you have a use case?  Until we have one, I'm not convinced that
> we should widen the interface.
>
>> Note that tag_name does not allow the way C++ uses this (it can
>> be a TYPE_DECL).
>
> That is what the .decl_name member function does.
>
>> Overall I'm not sure this is a good abstraction unless you manage
>> to make the frontends use it.
>
> The intent is for use by the middle/back ends constructing code.
> As such, it should be using middle/back end types, not front-end
> types.

Note that there is no such thing as a "middle-end" or "back-end" type.

Richard.

> --
> Lawrence Crowl


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]