diff mbox

Emit DW_AT_const_expr for constexpr variables

Message ID 20161014173116.GL7282@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Oct. 14, 2016, 5:31 p.m. UTC
Hi!

This relies on the previous langhook patch (which greatly simplifies it).

I'm only handling variables for now, DW_AT_const_expr is just weird on
functions/methods, it is supposed to appear only on
DW_TAG_inlined_subroutine?

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

2016-10-14  Jakub Jelinek  <jakub@redhat.com>

	* dwarf2out.c (gen_variable_die): Emit DW_AT_const_expr attribute
	if needed.
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.


	Jakub
diff mbox

Patch

--- gcc/dwarf2out.c.jj	2016-10-14 14:37:15.000000000 +0200
+++ gcc/dwarf2out.c	2016-10-14 15:22:57.878078634 +0200
@@ -21513,6 +21513,14 @@  gen_variable_die (tree decl, tree origin
     }
   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.  */
--- gcc/cp/cp-objcp-common.c.jj	2016-10-14 14:27:56.000000000 +0200
+++ gcc/cp/cp-objcp-common.c	2016-10-14 15:01:27.770495885 +0200
@@ -168,6 +168,11 @@  cp_decl_dwarf_attribute (const_tree decl
 	}
       break;
 
+    case DW_AT_const_expr:
+      if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_DECLARED_CONSTEXPR_P (decl))
+	return 1;
+      break;
+
     default:
       break;
     }
--- gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C.jj	2016-10-14 15:32:23.323882991 +0200
+++ gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C	2016-10-14 15:31:56.000000000 +0200
@@ -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;