diff mbox

Two DW_OP_GNU_variable_value fixes / tweaks

Message ID alpine.LSU.2.20.1705151439060.20726@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener May 15, 2017, 12:43 p.m. UTC
While bringing early LTO debug up-to-speed I noticed the following two
issues.  The first patch avoids useless work in 
note_variable_value_in_expr and actually makes use of the DIE we
eventually create in resolve_variable_value_in_expr.

The second avoids generating a DW_OP_GNU_variable_value for a decl
we'll never have a DIE for -- this might be less obvious than the
other patch but I think we'll also never have any other debug info
we can resolve the decl with(?)

Bootstrapped and tested the first patch sofar
on x86_64-unknown-linux-gnu, 2nd is pending.

Ok?

Thanks,
Richard.

2017-05-15  Richard Biener  <rguenther@suse.de>

	* dwarf2out.c (resolve_variable_value_in_expr): Lookup DIE
	just generated.
	(note_variable_value_in_expr): If we resolved the decl ref
	do not push to the stack.

Comments

Jakub Jelinek May 15, 2017, 1:19 p.m. UTC | #1
On Mon, May 15, 2017 at 02:43:43PM +0200, Richard Biener wrote:
> 
> While bringing early LTO debug up-to-speed I noticed the following two
> issues.  The first patch avoids useless work in 
> note_variable_value_in_expr and actually makes use of the DIE we
> eventually create in resolve_variable_value_in_expr.
> 
> The second avoids generating a DW_OP_GNU_variable_value for a decl
> we'll never have a DIE for -- this might be less obvious than the
> other patch but I think we'll also never have any other debug info
> we can resolve the decl with(?)
> 
> Bootstrapped and tested the first patch sofar
> on x86_64-unknown-linux-gnu, 2nd is pending.
> 
> Ok?
> 
> Thanks,
> Richard.
> 
> 2017-05-15  Richard Biener  <rguenther@suse.de>
> 
> 	* dwarf2out.c (resolve_variable_value_in_expr): Lookup DIE
> 	just generated.
> 	(note_variable_value_in_expr): If we resolved the decl ref
> 	do not push to the stack.

LGTM.

> 2017-05-15  Richard Biener  <rguenther@suse.de>
> 
> 	* dwarf2out.c (loc_list_from_tree_1): Do not create
> 	DW_OP_GNU_variable_value for DECL_IGNORED_P decls.

Can you verify it e.g. in a bootstrapped cc1plus doesn't change the debug info
(except for dwarf2out.o itself)?
It looks reasonable and it would surprise me if did, just want to be sure.

	Jakub
Richard Biener May 16, 2017, 11:03 a.m. UTC | #2
On Mon, May 15, 2017 at 3:19 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Mon, May 15, 2017 at 02:43:43PM +0200, Richard Biener wrote:
>>
>> While bringing early LTO debug up-to-speed I noticed the following two
>> issues.  The first patch avoids useless work in
>> note_variable_value_in_expr and actually makes use of the DIE we
>> eventually create in resolve_variable_value_in_expr.
>>
>> The second avoids generating a DW_OP_GNU_variable_value for a decl
>> we'll never have a DIE for -- this might be less obvious than the
>> other patch but I think we'll also never have any other debug info
>> we can resolve the decl with(?)
>>
>> Bootstrapped and tested the first patch sofar
>> on x86_64-unknown-linux-gnu, 2nd is pending.
>>
>> Ok?
>>
>> Thanks,
>> Richard.
>>
>> 2017-05-15  Richard Biener  <rguenther@suse.de>
>>
>>       * dwarf2out.c (resolve_variable_value_in_expr): Lookup DIE
>>       just generated.
>>       (note_variable_value_in_expr): If we resolved the decl ref
>>       do not push to the stack.
>
> LGTM.
>
>> 2017-05-15  Richard Biener  <rguenther@suse.de>
>>
>>       * dwarf2out.c (loc_list_from_tree_1): Do not create
>>       DW_OP_GNU_variable_value for DECL_IGNORED_P decls.
>
> Can you verify it e.g. in a bootstrapped cc1plus doesn't change the debug info
> (except for dwarf2out.o itself)?
> It looks reasonable and it would surprise me if did, just want to be sure.

Done.  Note it only happened for Ada.

Richard.

>         Jakub
diff mbox

Patch

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 248055)
+++ gcc/dwarf2out.c	(working copy)
@@ -30109,8 +30109,9 @@  resolve_variable_value_in_expr (dw_attr_
 	      break;
 	    }
 	  /* Create DW_TAG_variable that we can refer to.  */
-	  ref = gen_decl_die (decl, NULL_TREE, NULL,
-			      lookup_decl_die (current_function_decl));
+	  gen_decl_die (decl, NULL_TREE, NULL,
+			lookup_decl_die (current_function_decl));
+	  ref = lookup_decl_die (decl);
 	  if (ref)
 	    {
 	      loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
@@ -30203,6 +30204,7 @@  note_variable_value_in_expr (dw_die_ref
 	    loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
 	    loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
 	    loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
+	    continue;
 	  }
 	if (VAR_P (decl)
 	    && DECL_CONTEXT (decl)


2017-05-15  Richard Biener  <rguenther@suse.de>

	* dwarf2out.c (loc_list_from_tree_1): Do not create
	DW_OP_GNU_variable_value for DECL_IGNORED_P decls.

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 248054)
+++ gcc/dwarf2out.c	(working copy)
@@ -17373,6 +17685,7 @@  loc_list_from_tree_1 (tree loc, int want
 		&& early_dwarf
 		&& current_function_decl
 		&& want_address != 1
+		&& ! DECL_IGNORED_P (loc)
 		&& (INTEGRAL_TYPE_P (TREE_TYPE (loc))
 		    || POINTER_TYPE_P (TREE_TYPE (loc)))
 		&& DECL_CONTEXT (loc) == current_function_decl