On 05/28/2015 04:35 PM, Jason Merrill wrote:
On 05/28/2015 02:53 PM, Aldy Hernandez wrote:
On 05/27/2015 08:39 AM, Jason Merrill wrote:
On 05/20/2015 11:50 AM, Aldy Hernandez wrote:

+  /* Fill in the size of variable-length fields in late dwarf.  */
+  if (TREE_ASM_WRITTEN (type)
+      && !early_dwarf_dumping)
+    {
+      tree member;
+      for (member = TYPE_FIELDS (type); member; member = DECL_CHAIN
(member))
+    fill_variable_array_bounds (TREE_TYPE (member));
+      return;
+    }

Why is this happening in late dwarf?  I'm concerned that front-end
information that is necessary to do this might be lost by that point.

I thought only after the optimizations had run their course would we be
guaranteed to have accurate bound information.  At least, that's what my
experience showed.

Hmm, I'm don't know why optimizations would change the representation of
the array type.

+      /* Variable-length types may be incomplete even if
+     TREE_ASM_WRITTEN.  For such types, fall through to
+     gen_array_type_die() and possibly fill in
+     DW_AT_{upper,lower}_bound attributes.  */
+      if ((TREE_CODE (type) != ARRAY_TYPE
+       && TREE_CODE (type) != RECORD_TYPE
+       && TREE_CODE (type) != UNION_TYPE
+       && TREE_CODE (type) != QUAL_UNION_TYPE)
+      || (TYPE_SIZE (type)
+          && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))

Similarly, why check for INTEGER_CST here?

The INTEGER_CST check was supposed to mean "we have bound information
already, no need to look further".

I guess we could have a variable length bound that does not decay to a
constant.

Right.  I would expect that to usually be the case with VLAs.

Perhaps I could check the presence of a cached DIE with a
type DIE containing a DW_TAG_subrange_type *and*
DW_AT_{lower,upper}_bound ??.  Basically I just want to add bound
information, if available and not already present.

Suggestions?

I'm still not sure why we can't just emit bound info in early dwarf. Can
you be more specific about the optimization thing?

Ok, I see what I was trying to do, albeit incorrectly.  Imagine this:

unsigned int i=555;

int main()
{
  unsigned int array[i];
  ...
}

For the VLA, I'd like to check if we have an array type with a missing DW_AT_{upper,lower}_bound late in the game, and fill it in.

During early dwarf we only have an uninitialized gimple register representing the bound, and loc_list_from_tree() cannot find the RTL with the final bound location. Thus, we end up with a missing bound, which I propose to fill in late dwarf.

Obviously I was doing some nonsense with TYPE_SIZE != INTEGER_CST, when in reality I should probably check that TREE_CODE (type) == ARRAY_TYPE and that we are missing the bound late (by looking for DW_AT_*_bound in the cached DIE).

Is this acceptable, or where you thinking of some other scheme?

Thanks.
Aldy

Reply via email to