DWARF: add DW_AT_location for global decls with DECL_VALUE_EXPR
authorPierre-Marie de Rodat <derodat@adacore.com>
Thu, 1 Jun 2017 14:06:37 +0000 (14:06 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 1 Jun 2017 14:06:37 +0000 (14:06 +0000)
In GNAT, we materialize renamings that cannot be described in standard
DWARF as synthetic variables that describe how to fetch the renamed
object.  Look for "___XR" in gcc/ada/exp_dbug.ads for more details about
this convention.

In order to have a location for these variables in the debug info (GDB
requires it not to discard the variable) but also to avoid allocating
runtime space for them, we make these variable hold a DECL_VALUE_EXPR
tree.  However, since GCC 7, the DWARF back-end no longer generates a
DW_AT_location attribute for those.  This patch is an attempt to restore
this attribute.

gcc/

* dwarf2out.c (dwarf2out_late_global_decl): Add locations for
symbols that hold a DECL_VALUE_EXPR.

gcc/testsuite/

* debug12.adb, debug12.ads: New testcase.

From-SVN: r248792

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/debug12.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/debug12.ads [new file with mode: 0644]

index 81d8337e05040ce1bb93b4cd9f28945d918d5ed8..587d61c6a6b2b39061e2250ecfd883fe164f160d 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-01  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+       * dwarf2out.c (dwarf2out_late_global_decl): Add locations for
+       symbols that hold a DECL_VALUE_EXPR.
+
 2017-06-01  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/80898
index 7983f52c5efff88a4d6bfd913f7fb368cde5ef94..036d0a8f84686ce7ae3de6ed73cf9a7b2ed8d8c1 100644 (file)
@@ -25545,9 +25545,10 @@ dwarf2out_late_global_decl (tree decl)
        {
          /* We get called via the symtab code invoking late_global_decl
             for symbols that are optimized out.  Do not add locations
-            for those.  */
+            for those, except if they have a DECL_VALUE_EXPR, in which case
+            they are relevant for debuggers.  */
          varpool_node *node = varpool_node::get (decl);
-         if (! node || ! node->definition)
+         if ((! node || ! node->definition) && ! DECL_HAS_VALUE_EXPR_P (decl))
            tree_add_const_value_attribute_for_decl (die, decl);
          else
            add_location_or_const_value_attribute (die, decl, false);
index e398b31644a176b49fee1b83f9470c860e2f7a36..ff1b0703d51c773c6e08b955c1c9cd2d010d7d1a 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-01  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+       * debug12.adb, debug12.ads: New testcase.
+
 2017-06-01  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/80898
diff --git a/gcc/testsuite/gnat.dg/debug12.adb b/gcc/testsuite/gnat.dg/debug12.adb
new file mode 100644 (file)
index 0000000..0717596
--- /dev/null
@@ -0,0 +1,9 @@
+--  { dg-options "-cargs -gdwarf-4 -fdebug-types-section -dA -margs" }
+--  { dg-final { scan-assembler-times "DW_AT_location" 4 } }
+
+package body Debug12 is
+   function Get_A2 return Boolean is
+   begin
+      return A2;
+   end Get_A2;
+end Debug12;
diff --git a/gcc/testsuite/gnat.dg/debug12.ads b/gcc/testsuite/gnat.dg/debug12.ads
new file mode 100644 (file)
index 0000000..dbc5896
--- /dev/null
@@ -0,0 +1,8 @@
+package Debug12 is
+   type Bit_Array is array (Positive range <>) of Boolean
+      with Pack;
+   A  : Bit_Array := (1 .. 10 => False);
+   A2 : Boolean renames A (2);
+
+   function Get_A2 return Boolean;
+end Debug12;