This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] 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/ 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.

Bootstrapped and reg-tested on x86_64-linux.  Also, I have a ~150 bytes
increase in the size of cc1, cc1plus and gnat1 (each of these is ~200MB
large).  Ok to commit?  Thank you in advance!


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


	* debug12.adb, New testcase.
 gcc/dwarf2out.c                   | 5 +++--
 gcc/testsuite/gnat.dg/debug12.adb | 9 +++++++++
 gcc/testsuite/gnat.dg/ | 8 ++++++++
 3 files changed, 20 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gnat.dg/debug12.adb
 create mode 100644 gcc/testsuite/gnat.dg/

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 5ff45eb4efd..013c902bc89 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -25526,9 +25526,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);
 	    add_location_or_const_value_attribute (die, decl, false);
diff --git a/gcc/testsuite/gnat.dg/debug12.adb b/gcc/testsuite/gnat.dg/debug12.adb
new file mode 100644
index 00000000000..07175968703
--- /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/ b/gcc/testsuite/gnat.dg/
new file mode 100644
index 00000000000..dbc5896cc73
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/
@@ -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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]