[RFA 2/4] dwarf2_physname

Keith Seitz keiths@redhat.com
Fri Feb 5 20:24:00 GMT 2010


On 02/05/2010 09:24 AM, Daniel Jacobowitz wrote:
> Recursing to follow the specification makes sense.  I don't think
> recursing onto the parent makes sense though.  Won't this cause
> the wrong answer for:
>
> DW_TAG_subprogram
>    DW_TAG_variable
>
> ?  If that doesn't matter, then I'm totally confused again :-)
> That's your basic local variable.

It might be a gcc-ism, but we actually get a DW_TAG_lexical_block 
between DW_TAG_subprogram and DW_TAG_variable. I presume this is to mark 
the prologue. It is a very nice way to know that a variable is not 
global. O:-)

I can certainly understand why this is not such a desirable solution.

But at least I now remember (or rather -- I am now reminded) why I 
originally wrote what I did for this (with DW_AT_external and checking 
the parent DIE's tag).

After revisiting that, I think it clearer to understand if I invert the 
original test:

     case DW_TAG_variable:
       {
	struct attribute *attr;

	/* We only need to prefix "globally" visible variables.  These include
	   any variable marked with DW_AT_external or any variable that
	   lives in a namespace.  [Variables in anonymous namespaces
	   require prefixing, but they are not DW_AT_external.]  */

	if (dwarf2_attr (die, DW_AT_specification, cu))
	  {
	    struct dwarf2_cu *spec_cu = cu;
	    return die_needs_namespace (die_specification (die, &spec_cu),
					spec_cu);
	  }

	attr = dwarf2_attr (die, DW_AT_external, cu);
	if (attr || die->parent->tag == DW_TAG_namespace)
	  return 1;

	return 0;
       }

How does that look?

Keith



More information about the Gdb-patches mailing list