On 2/14/13, Richard Biener <richard.guent...@gmail.com> wrote: > On Tue, Feb 12, 2013 at 8:47 PM, Lawrence Crowl <cr...@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. -- Lawrence Crowl