Hi!

DWARF5 that has been released recently had a fairly late change where
it says that C++ static data members should use DW_TAG_variable tag
instead of DW_TAG_member inside of the class DIE.

The following patch implements just that, not any further changes e.g.
to inline static data members (i.e. it still emits a declaration in
the class and specification right after it, just both will now be
DW_TAG_variable instead DW_TAG_member followed by DW_TAG_variable).

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2017-02-17  Jakub Jelinek  <ja...@redhat.com>

        * dwarf2out.c (add_linkage_name): Handle DW_TAG_variable with
        class_scope_p parent like DW_TAG_member.
        (gen_variable_die): For -gdwarf-5, use DW_TAG_variable instead of
        DW_TAG_member for static data member declarations.
        (gen_member_die): For -gdwarf-5 don't change DW_TAG_variable
        to DW_TAG_member.

--- gcc/dwarf2out.c.jj  2017-02-17 11:56:13.000000000 +0100
+++ gcc/dwarf2out.c     2017-02-17 16:28:12.336632166 +0100
@@ -20226,7 +20226,8 @@ add_linkage_name (dw_die_ref die, tree d
       && VAR_OR_FUNCTION_DECL_P (decl)
       && TREE_PUBLIC (decl)
       && !(VAR_P (decl) && DECL_REGISTER (decl))
-      && die->die_tag != DW_TAG_member)
+      && die->die_tag != DW_TAG_member
+      && (die->die_tag != DW_TAG_variable || !class_scope_p (die->die_parent)))
     add_linkage_name_raw (die, decl);
 }
 
@@ -22818,9 +22819,10 @@ gen_variable_die (tree decl, tree origin
     }
 
   /* For static data members, the declaration in the class is supposed
-     to have DW_TAG_member tag; the specification should still be
-     DW_TAG_variable referencing the DW_TAG_member DIE.  */
-  if (declaration && class_scope_p (context_die))
+     to have DW_TAG_member tag in DWARF{3,4} and we emit it for compatibility
+     also in DWARF2; the specification should still be DW_TAG_variable
+     referencing the DW_TAG_member DIE.  */
+  if (declaration && class_scope_p (context_die) && dwarf_version < 5)
     var_die = new_die (DW_TAG_member, context_die, decl);
   else
     var_die = new_die (DW_TAG_variable, context_die, decl);
@@ -22858,7 +22860,8 @@ gen_variable_die (tree decl, tree origin
                  != (unsigned) s.column))
            add_AT_unsigned (var_die, DW_AT_decl_column, s.column);
 
-         if (old_die->die_tag == DW_TAG_member)
+         if (old_die->die_tag == DW_TAG_member
+             || (dwarf_version >= 5 && class_scope_p (old_die->die_parent)))
            add_linkage_name (var_die, decl);
        }
     }
@@ -24089,7 +24092,8 @@ gen_member_die (tree type, dw_die_ref co
              && get_AT (child, DW_AT_specification) == NULL)
            {
              reparent_child (child, context_die);
-             child->die_tag = DW_TAG_member;
+             if (dwarf_version < 5)
+               child->die_tag = DW_TAG_member;
            }
          else
            splice_child_die (context_die, child);
@@ -24111,7 +24115,7 @@ gen_member_die (tree type, dw_die_ref co
        }
 
       /* For C++ inline static data members emit immediately a DW_TAG_variable
-        DIE that will refer to that DW_TAG_member through
+        DIE that will refer to that DW_TAG_member/DW_TAG_variable through
         DW_AT_specification.  */
       if (TREE_STATIC (member)
          && (lang_hooks.decls.decl_dwarf_attribute (member, DW_AT_inline)

        Jakub

Reply via email to