On Thu, Jun 1, 2017 at 11:28 AM, Pierre-Marie de Rodat
<dero...@adacore.com> wrote:
> Hi,
>
> 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.
>
> 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!

Ok.

Richard.

> 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.
> ---
>  gcc/dwarf2out.c                   | 5 +++--
>  gcc/testsuite/gnat.dg/debug12.adb | 9 +++++++++
>  gcc/testsuite/gnat.dg/debug12.ads | 8 ++++++++
>  3 files changed, 20 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gnat.dg/debug12.adb
>  create mode 100644 gcc/testsuite/gnat.dg/debug12.ads
>
> 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);
>           else
>             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/debug12.ads 
> b/gcc/testsuite/gnat.dg/debug12.ads
> new file mode 100644
> index 00000000000..dbc5896cc73
> --- /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;
> --
> 2.13.0
>

Reply via email to