aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-02-22 22:33:47 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-02-22 22:33:47 +0100
commitfe8ece053b4e3f5570881c774cd3f76b9fb41360 (patch)
tree5a5749461ba4f9bbeaf92f3105049952f5c7c129
parent61ac5ebe618c2cbdc591854eff96c6aa64514382 (diff)
downloadgcc-fe8ece053b4e3f5570881c774cd3f76b9fb41360.zip
gcc-fe8ece053b4e3f5570881c774cd3f76b9fb41360.tar.gz
gcc-fe8ece053b4e3f5570881c774cd3f76b9fb41360.tar.bz2
dwarf2out.c (gen_variable_die): For -gdwarf-5...
* dwarf2out.c (gen_variable_die): For -gdwarf-5, use DW_TAG_variable instead of DW_TAG_member for static data member declarations and don't set no_linkage_name for static inline data members. (gen_member_die): For -gdwarf-5 don't change DW_TAG_variable to DW_TAG_member. * g++.dg/debug/dwarf2/inline-var-2.C: New test. From-SVN: r245661
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/dwarf2out.c15
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/inline-var-2.C35
4 files changed, 56 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fc21097..f6168c9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2017-02-22 Jakub Jelinek <jakub@redhat.com>
+
+ * dwarf2out.c (gen_variable_die): For -gdwarf-5, use DW_TAG_variable
+ instead of DW_TAG_member for static data member declarations and don't
+ set no_linkage_name for static inline data members.
+ (gen_member_die): For -gdwarf-5 don't change DW_TAG_variable
+ to DW_TAG_member.
+
2017-02-22 Martin Liska <mliska@suse.cz>
* doc/invoke.texi: Replace inequality signs with square brackets
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 14c14f3..541d868 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -22669,7 +22669,8 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
&& lang_hooks.decls.decl_dwarf_attribute (decl, DW_AT_inline) != -1)
{
declaration = true;
- no_linkage_name = true;
+ if (dwarf_version < 5)
+ no_linkage_name = true;
}
ultimate_origin = decl_ultimate_origin (decl_or_origin);
@@ -22820,9 +22821,10 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
}
/* 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);
@@ -24091,7 +24093,8 @@ gen_member_die (tree type, dw_die_ref context_die)
&& 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);
@@ -24113,7 +24116,7 @@ gen_member_die (tree type, dw_die_ref context_die)
}
/* 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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6fae11a..c5f7576 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2017-02-22 Jakub Jelinek <jakub@redhat.com>
+
+ * g++.dg/debug/dwarf2/inline-var-2.C: New test.
+
2017-02-22 Marek Polacek <polacek@redhat.com>
PR c++/79653
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/inline-var-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/inline-var-2.C
new file mode 100644
index 0000000..d04bbd6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/inline-var-2.C
@@ -0,0 +1,35 @@
+// { dg-do compile }
+// { dg-options "-O -std=c++1z -gdwarf-5 -dA -gno-strict-dwarf" }
+// { dg-require-weak "" }
+// { dg-final { scan-assembler-not "DW_TAG_member" { xfail *-*-aix* } } }
+
+inline int a;
+struct S
+{
+ static inline double b = 4.0;
+ static constexpr int c = 2;
+ static constexpr inline char d = 3;
+ static const int j = 7;
+ static int k;
+ static double l;
+} s;
+const int S::j;
+int S::k = 8;
+template <int N>
+inline int e = N;
+int &f = e<2>;
+template <int N>
+struct T
+{
+ static inline double g = 4.0;
+ static constexpr int h = 2;
+ static inline constexpr char i = 3;
+ static const int m = 8;
+ static int n;
+ static double o;
+};
+T<5> t;
+template <>
+const int T<5>::m;
+template <>
+int T<5>::n = 9;