diff mbox

DWARF: do not emit DW_TAG_variable to materialize DWARF procedures

Message ID 20160818093330.31645-1-derodat@adacore.com
State New
Headers show

Commit Message

Pierre-Marie de Rodat Aug. 18, 2016, 9:33 a.m. UTC
Hello,

For -gdwarf-3 and newer, the DWARF back-end sometimes generates DWARF
procedures to factorize complex location descriptions.  DWARF procedures
can be materialized as DW_TAG_dwarf_procedure DIEs, but actually any DIE
that can hold a DW_AT_location attribute is also accepted.

Unlike what I thought at some point, the DW_TAG_dwarf_procedure tag was
introduced in the DWARFv3 standard, not the DWARFv4 one, so the back-end
can always emit DW_TAG_dwarf_procedure DIEs, as this simplifies code and
prevents the types pruning pass from missing a DWARF procedure.

Boostrapped and regtested on x86_64-linux: no regression.  Ok to commit?
Thank you in advance!

gcc/

	* dwarf2out.c (copy_dwarf_procedure): Remove obsolete comment.
	(new_dwarf_proc_die): Emit DW_TAG_dwarf_procedure DIEs even for
	-gdwarf-3.
	(function_to_dwarf_procedure): Update comment.
---
 gcc/dwarf2out.c | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

Comments

Richard Biener Aug. 18, 2016, 12:39 p.m. UTC | #1
On Thu, Aug 18, 2016 at 11:33 AM, Pierre-Marie de Rodat
<derodat@adacore.com> wrote:
> Hello,
>
> For -gdwarf-3 and newer, the DWARF back-end sometimes generates DWARF
> procedures to factorize complex location descriptions.  DWARF procedures
> can be materialized as DW_TAG_dwarf_procedure DIEs, but actually any DIE
> that can hold a DW_AT_location attribute is also accepted.
>
> Unlike what I thought at some point, the DW_TAG_dwarf_procedure tag was
> introduced in the DWARFv3 standard, not the DWARFv4 one, so the back-end
> can always emit DW_TAG_dwarf_procedure DIEs, as this simplifies code and
> prevents the types pruning pass from missing a DWARF procedure.
>
> Boostrapped and regtested on x86_64-linux: no regression.  Ok to commit?
> Thank you in advance!

Ok.

Richard.

> gcc/
>
>         * dwarf2out.c (copy_dwarf_procedure): Remove obsolete comment.
>         (new_dwarf_proc_die): Emit DW_TAG_dwarf_procedure DIEs even for
>         -gdwarf-3.
>         (function_to_dwarf_procedure): Update comment.
> ---
>  gcc/dwarf2out.c | 16 ++--------------
>  1 file changed, 2 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> index 0fdab9a..98f08b7 100644
> --- a/gcc/dwarf2out.c
> +++ b/gcc/dwarf2out.c
> @@ -7747,9 +7747,6 @@ copy_dwarf_procedure (dw_die_ref die,
>                       comdat_type_node *type_node,
>                       hash_map<dw_die_ref, dw_die_ref> &copied_dwarf_procs)
>  {
> -  /* We do this for COMDAT section, which is DWARFv4 specific, so
> -     DWARF procedure are always DW_TAG_dwarf_procedure DIEs (unlike
> -     DW_TAG_variable in DWARFv3).  */
>    gcc_assert (die->die_tag == DW_TAG_dwarf_procedure);
>
>    /* DWARF procedures are not supposed to have children...  */
> @@ -15332,22 +15329,15 @@ static dw_die_ref
>  new_dwarf_proc_die (dw_loc_descr_ref location, tree fndecl,
>                     dw_die_ref parent_die)
>  {
> -  const bool dwarf_proc_supported = dwarf_version >= 4;
>    dw_die_ref dwarf_proc_die;
>
>    if ((dwarf_version < 3 && dwarf_strict)
>        || location == NULL)
>      return NULL;
>
> -  dwarf_proc_die  = new_die (dwarf_proc_supported
> -                            ? DW_TAG_dwarf_procedure
> -                            : DW_TAG_variable,
> -                            parent_die,
> -                            fndecl);
> +  dwarf_proc_die = new_die (DW_TAG_dwarf_procedure, parent_die, fndecl);
>    if (fndecl)
>      equate_decl_number_to_die (fndecl, dwarf_proc_die);
> -  if (!dwarf_proc_supported)
> -    add_AT_flag (dwarf_proc_die, DW_AT_artificial, 1);
>    add_AT_loc (dwarf_proc_die, DW_AT_location, location);
>    return dwarf_proc_die;
>  }
> @@ -15673,9 +15663,7 @@ function_to_dwarf_procedure (tree fndecl)
>    if (dwarf_proc_die != NULL)
>      return dwarf_proc_die;
>
> -  /* DWARF procedures are available starting with the DWARFv3 standard, but
> -     it's the DWARFv4 standard that introduces the DW_TAG_dwarf_procedure
> -     DIE.  */
> +  /* DWARF procedures are available starting with the DWARFv3 standard.  */
>    if (dwarf_version < 3 && dwarf_strict)
>      return NULL;
>
> --
> 2.9.3
>
Pierre-Marie de Rodat Aug. 18, 2016, 2:40 p.m. UTC | #2
On 08/18/2016 02:39 PM, Richard Biener wrote:
> Ok.

Thank you for the quick review! This is commited, now (revision 239575).
diff mbox

Patch

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 0fdab9a..98f08b7 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -7747,9 +7747,6 @@  copy_dwarf_procedure (dw_die_ref die,
 		      comdat_type_node *type_node,
 		      hash_map<dw_die_ref, dw_die_ref> &copied_dwarf_procs)
 {
-  /* We do this for COMDAT section, which is DWARFv4 specific, so
-     DWARF procedure are always DW_TAG_dwarf_procedure DIEs (unlike
-     DW_TAG_variable in DWARFv3).  */
   gcc_assert (die->die_tag == DW_TAG_dwarf_procedure);
 
   /* DWARF procedures are not supposed to have children...  */
@@ -15332,22 +15329,15 @@  static dw_die_ref
 new_dwarf_proc_die (dw_loc_descr_ref location, tree fndecl,
 		    dw_die_ref parent_die)
 {
-  const bool dwarf_proc_supported = dwarf_version >= 4;
   dw_die_ref dwarf_proc_die;
 
   if ((dwarf_version < 3 && dwarf_strict)
       || location == NULL)
     return NULL;
 
-  dwarf_proc_die  = new_die (dwarf_proc_supported
-			     ? DW_TAG_dwarf_procedure
-			     : DW_TAG_variable,
-			     parent_die,
-			     fndecl);
+  dwarf_proc_die = new_die (DW_TAG_dwarf_procedure, parent_die, fndecl);
   if (fndecl)
     equate_decl_number_to_die (fndecl, dwarf_proc_die);
-  if (!dwarf_proc_supported)
-    add_AT_flag (dwarf_proc_die, DW_AT_artificial, 1);
   add_AT_loc (dwarf_proc_die, DW_AT_location, location);
   return dwarf_proc_die;
 }
@@ -15673,9 +15663,7 @@  function_to_dwarf_procedure (tree fndecl)
   if (dwarf_proc_die != NULL)
     return dwarf_proc_die;
 
-  /* DWARF procedures are available starting with the DWARFv3 standard, but
-     it's the DWARFv4 standard that introduces the DW_TAG_dwarf_procedure
-     DIE.  */
+  /* DWARF procedures are available starting with the DWARFv3 standard.  */
   if (dwarf_version < 3 && dwarf_strict)
     return NULL;