On 06/05/2015 10:02 AM, Jason Merrill wrote:
On 06/04/2015 07:31 PM, Aldy Hernandez wrote:
So... if I revert the !declaration change and move the big block below
said change, would you be OK with it, or did you still want some changes
to it?

I'm still hoping to simplify it.  Actually, I think we can just remove the

   if (old_die && declaration && !local_scope_p (context_die))

check; since inverting its logic didn't seem to break anything before,
it can just go.

And I'd like to rework the logic in the big block so we don't have three
ways of getting to the same thing.  Does this work?

g++.dg/debug/dwarf2/static-data-member1.C fails because it doesn't get a DW_AT_specification. How about:

  if (old_die)
    {
      if (declaration)
        {
          /* A declaration that has been previously dumped, needs no
             further annotations, since it doesn't need location on
             the second pass.  */
          return;
        }
      else if (decl_will_get_specification_p (old_die, decl, declaration)
               && !get_AT (old_die, DW_AT_specification))
        {
          /* Fall-thru so we can make a new variable die along with a
             DW_AT_specification.  */
        }
      else if (origin && old_die->die_parent != context_die)
        {
          /* If we will be creating an inlined instance, we need a
             new DIE that will get annotated with
             DW_AT_abstract_origin.  Clear things so we can get a
             new DIE.  */
          gcc_assert (!DECL_ABSTRACT_P (decl));
          old_die = NULL;
        }
      else
        {
          /* If a DIE was dumped early, it still needs location info.
             Skip to where we fill the location bits.  */
          var_die = old_die;
          goto gen_variable_die_location;
        }
    }

Reply via email to