[patch 10/10] debug-early merge: compiler proper

Aldy Hernandez aldyh@redhat.com
Fri May 29 19:33:00 GMT 2015


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



More information about the Gcc-patches mailing list