> 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