> So this is sth like (invalid C)
> 
> t.h
> ---
> int n;
> struct X { int x[n]; };
> 
> t1.c
> --
> #include "t.h"
> struct X x;
> t2.c
> --
> #include "t.h"
> struct X x;
> 
> ?

Essentially yes, but with a single definition for 'n' and references to it.

> It's not obvious from the fix (which I think is in the wrong place)
> which operand_equal/hash
> call during WPA this is supposed to fix.  So can you please provide a
> little more context here?

It's called during the canonical type computation invoked from lto_read_decls:

              /* Compute the canonical type of all types.
                 ???  Should be able to assert that !TYPE_CANONICAL.  */
              if (TYPE_P (t) && !TYPE_CANONICAL (t))
                {
                  gimple_register_canonical_type (t);
                  if (odr_type_p (t))
                    register_odr_type (t);
                }

In particular for VLAs:

  /* For array types hash the domain bounds and the string flag.  */
  if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
    {
      hstate.add_int (TYPE_STRING_FLAG (type));
      /* OMP lowering can introduce error_mark_node in place of
         random local decls in types.  */
      if (TYPE_MIN_VALUE (TYPE_DOMAIN (type)) != error_mark_node)
        inchash::add_expr (TYPE_MIN_VALUE (TYPE_DOMAIN (type)), hstate);
      if (TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != error_mark_node)
        inchash::add_expr (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), hstate);
    }

-- 
Eric Botcazou

Reply via email to