------- Comment #5 from jan dot kratochvil at redhat dot com 2008-11-28 01:36
-------
(In reply to comment #4)
> First, I think the DIE representing the defining declaration of A::elsewhere
> in class2.c should have a DW_AT_specification pointing back to the DIE
> representing the declaration or A::elsewhere in class.h.
Already present: non-defining declaration is <cf>, the defining declaration
is <ed>. <ed> properly points by DW_AT_specification to its <cf>.
> Second, I think the DIE of the defining declaration of A::elsewhere in class2
> should have a DW_AT_const_value attribute whose value should be the constant
> "211".
>
> This can be deduced from the dwarf2 spec, section [4.1 Data Object Entries],
> point 9, pdf page 35, spec page 33 that reads:
>
> "9. An entry describing a variable whose value is constant and not represented
> by an object in the address space of the program, or an entry describing a
> named constant, does not have a location attribute.
DW_AT_const_value is more for Fortran constants which are an equivalent
of C #define. In the sample code here `static const int' is in .rodata, it has
its address (DW_AT_location) and can be tracked by `rwatch' (read-watchpoint).
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[15] .rodata PROGBITS 0000000000400658 00000658
0000000000000014 0000000000000000 A 0 0 8
Symbol table '.symtab' contains 73 entries:
Num: Value Size Type Bind Vis Ndx Name
55: 0000000000400668 4 OBJECT GLOBAL DEFAULT 15 _ZN1A9elsewhereE
It should be sufficient the type entry at <0xe1> (not shown in the sample dump
here) is already correctly DW_TAG_const_type.
> And third, as you pointed out, the DIE of the declaration of A::elsewhere
> should not appear twice in the class.c compilation unit. It should only appear
> once, in the scope of the A class.
Two vs. one DIE is not a mistake but more a minor optimization (such
optimization is already Bug debug/37941).
With single DIE it would look OK to me. With two DIEs there are currently
these problems:
(1) DW_AT_name is now `elsewhere' while it should be either `A::elsewhere'
or whole DW_TAG_variable should be enclosed by DW_TAG_class_type for `A'.
It may be Bug c++/37590.
(Non-standard DW_AT_MIPS_linkage_name should be removed in the future.)
(2) Defining declaration <86> should point by DW_AT_specification to its
non-defining declaration <37>. (The DWARF citation is here from Dodji.)
(But I do not see these two problems as real issues for debugging.)
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37982