aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-10-21 17:11:48 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-10-21 17:11:48 +0200
commit8e6982f7aac4c8d539f194e302fb67179f98c3f1 (patch)
tree23d9b415e858a7e4be5217e8b836ea49a685e47b
parentf9faea3725f6064ab226f1089d255b4f23bc5bef (diff)
downloadgcc-8e6982f7aac4c8d539f194e302fb67179f98c3f1.zip
gcc-8e6982f7aac4c8d539f194e302fb67179f98c3f1.tar.gz
gcc-8e6982f7aac4c8d539f194e302fb67179f98c3f1.tar.bz2
dwarf2out.c (gen_variable_die): Emit DW_AT_const_expr attribute if needed.
* dwarf2out.c (gen_variable_die): Emit DW_AT_const_expr attribute if needed. Re-add origin_die variable and its initialization. cp/ * cp-objcp-common.c (cp_decl_dwarf_attribute): Handle DW_AT_const_expr. testsuite/ * g++.dg/debug/dwarf2/constexpr-var-1.C: New test. From-SVN: r241408
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-objcp-common.c5
-rw-r--r--gcc/dwarf2out.c11
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C9
6 files changed, 36 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3c81903..b0bf6e2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2016-10-21 Jakub Jelinek <jakub@redhat.com>
+ * dwarf2out.c (gen_variable_die): Emit DW_AT_const_expr attribute
+ if needed. Re-add origin_die variable and its initialization.
+
* gimplify.c (gimplify_bind_expr): Handle oacc_declare_returns
even for -fstack-reuse=none, or for volatile vars etc.
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d2e6fa8..f2c23a2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2016-10-21 Jakub Jelinek <jakub@redhat.com>
+
+ * cp-objcp-common.c (cp_decl_dwarf_attribute): Handle
+ DW_AT_const_expr.
+
2016-10-17 Jakub Jelinek <jakub@redhat.com>
* cp-objcp-common.h (cp_function_decl_explicit_p,
diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c
index abcc1ca..50ac07f0 100644
--- a/gcc/cp/cp-objcp-common.c
+++ b/gcc/cp/cp-objcp-common.c
@@ -168,6 +168,11 @@ cp_decl_dwarf_attribute (const_tree decl, int attr)
}
break;
+ case DW_AT_const_expr:
+ if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl))
+ return 1;
+ break;
+
default:
break;
}
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 1d2e385..3e3dea9 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -21264,6 +21264,7 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
tree ultimate_origin;
dw_die_ref var_die;
dw_die_ref old_die = decl ? lookup_decl_die (decl) : NULL;
+ dw_die_ref origin_die = NULL;
bool declaration = (DECL_EXTERNAL (decl_or_origin)
|| class_or_namespace_scope_p (context_die));
bool specialization_p = false;
@@ -21423,7 +21424,7 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
var_die = new_die (DW_TAG_variable, context_die, decl);
if (origin != NULL)
- add_abstract_origin_attribute (var_die, origin);
+ origin_die = add_abstract_origin_attribute (var_die, origin);
/* Loop unrolling can create multiple blocks that refer to the same
static variable, so we must test for the DW_AT_declaration flag.
@@ -21509,6 +21510,14 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
}
else
tree_add_const_value_attribute_for_decl (var_die, decl_or_origin);
+
+ if ((dwarf_version >= 4 || !dwarf_strict)
+ && lang_hooks.decls.decl_dwarf_attribute (decl_or_origin,
+ DW_AT_const_expr) == 1
+ && !get_AT (var_die, DW_AT_const_expr)
+ && (origin_die == NULL || get_AT (origin_die, DW_AT_const_expr) == NULL)
+ && !specialization_p)
+ add_AT_flag (var_die, DW_AT_const_expr, 1);
}
/* Generate a DIE to represent a named constant. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 83414ed..fafdbfc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-10-21 Jakub Jelinek <jakub@redhat.com>
+
+ * g++.dg/debug/dwarf2/constexpr-var-1.C: New test.
+
2016-10-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/69566
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C
new file mode 100644
index 0000000..045d5fe
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+// { dg-options "-O -std=c++11 -g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler-times " DW_AT_const_expr" 2 } }
+
+constexpr int a = 5;
+struct S
+{
+ static constexpr int b = 6;
+} s;