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