> Gimplification is done in-place and thus relies on all processed
> trees being unshared.  This is achieved by unshare_body which
> in the end uses walk_tree to get at all interesting trees that possibly
> need unsharing.
> 
> Unfortunately it doesn't really work because walk_tree only walks
> types and type-related fields (TYPE_SIZE, TYPE_MIN_VALUE, etc.) in
> very narrow circumstances.

Right, but well defined and explained:

    case DECL_EXPR:
      /* If this is a TYPE_DECL, walk into the fields of the type that it's
         defining.  We only want to walk into these fields of a type in this
         case and not in the general case of a mere reference to the type.

         The criterion is as follows: if the field can be an expression, it
         must be walked only here.  This should be in keeping with the fields
         that are directly gimplified in gimplify_type_sizes in order for the
         mark/copy-if-shared/unmark machinery of the gimplifier to work with
         variable-sized types.

         Note that DECLs get walked as part of processing the BIND_EXPR.  */

> Thus the following patch which makes the gimplifier unsharing
> visit all types.

I think this will generate a lot of useless walking in Ada...

> So - any opinion on the "correct" way to fix this?

Add DECL_EXPRs for the types, that's what done in Ada.

-- 
Eric Botcazou

Reply via email to