From: Jakub Jelinek Date: Fri, 21 Oct 2016 15:11:48 +0000 (+0200) Subject: dwarf2out.c (gen_variable_die): Emit DW_AT_const_expr attribute if needed. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8e6982f7aac4c8d539f194e302fb67179f98c3f1;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c819032613..b0bf6e21094 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2016-10-21 Jakub Jelinek + * 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 d2e6fa818ce..f2c23a23016 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-10-21 Jakub Jelinek + + * cp-objcp-common.c (cp_decl_dwarf_attribute): Handle + DW_AT_const_expr. + 2016-10-17 Jakub Jelinek * 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 abcc1ca3d5d..50ac07f0790 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 1d2e385bdde..3e3dea999d1 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 83414ed3833..fafdbfcf93b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-10-21 Jakub Jelinek + + * g++.dg/debug/dwarf2/constexpr-var-1.C: New test. + 2016-10-21 Paul Thomas 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 00000000000..045d5fed744 --- /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;