aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Marie de Rodat <derodat@adacore.com>2017-06-01 14:06:37 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2017-06-01 14:06:37 +0000
commit2ded3754ad63a2eb375b34e2719303ec673cc72f (patch)
treef97bfb3229e74b8b7cb0be754b8a86319ff4f709 /gcc
parente34fd4dc1c10ff16eebd39318d90ad6f68e15ae7 (diff)
downloadgcc-2ded3754ad63a2eb375b34e2719303ec673cc72f.zip
gcc-2ded3754ad63a2eb375b34e2719303ec673cc72f.tar.gz
gcc-2ded3754ad63a2eb375b34e2719303ec673cc72f.tar.bz2
DWARF: add DW_AT_location for global decls with DECL_VALUE_EXPR
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/dwarf2out.c5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/debug12.adb9
-rw-r--r--gcc/testsuite/gnat.dg/debug12.ads8
5 files changed, 29 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 81d8337..587d61c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 7983f52..036d0a8 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e398b31..ff1b070 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..0717596
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/debug12.adb
@@ -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
index 0000000..dbc5896
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/debug12.ads
@@ -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;