public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Fix problem with variable tracking and lcoation lists
@ 2004-03-27  8:55 Josef Zlomek
  2004-03-29 18:51 ` Richard Henderson
  0 siblings, 1 reply; 5+ messages in thread
From: Josef Zlomek @ 2004-03-27  8:55 UTC (permalink / raw)
  To: gcc-patches

Hello,

When the variable has only one location and it holds its location
until end of function, the code producing the location list in
add_location_or_const_value_attribute () will not trigger because
the loc_list has only one element.
This patch fixes it by emiting a special note (NOTE_INSN_VAR_LOCATION
with decl == NULL) and when dwarf2out code sees it
it adds a "terminator" node to loc_list for each variable.
As the result the loc_list has at least 2 elements and the location list
is emitted.

Bootstrapped/regtested x86-64.

Josef

2004-03-26  Josef Zlomek  <zlomekj@suse.cz>

	* dwarf2out.c (add_var_loc_end_to_decl): New function.
	(add_location_or_const_value_attribute): Situation where the last
	location in location chain is not NULL can't happen.
	(dwarf2out_var_location): Fix the consistency test as
	NOTE_VAR_LOCATION_DECL (loc_note) can be NULL now.
	If NOTE_VAR_LOCATION_DECL (loc_note) is NULL add the terminator
	node to loc_list for each variable.
	* print-rtl.c (print_rtx): Print note with
	NOTE_VAR_LOCATION_DECL == NULL correctly.
	* var-tracking.c (vt_emit_notes): Emit a note with decl == NULL
	for the end of function.

Index: dwarf2out.c
===================================================================
RCS file: /cvs/gcc-cvs/gcc/gcc/dwarf2out.c,v
retrieving revision 1.509
diff -c -p -c -3 -p -r1.509 dwarf2out.c
*** dwarf2out.c	22 Mar 2004 20:56:59 -0000	1.509
--- dwarf2out.c	27 Mar 2004 08:48:30 -0000
*************** static int decl_loc_table_eq (const void
*** 3725,3730 ****
--- 3725,3731 ----
  static var_loc_list *lookup_decl_loc (tree);
  static void equate_decl_number_to_die (tree, dw_die_ref);
  static void add_var_loc_to_decl (tree, struct var_loc_node *);
+ static int add_var_loc_end_to_decl (void **, void *);
  static void print_spaces (FILE *);
  static void print_die (dw_die_ref, FILE *);
  static void print_dwarf_line_table (FILE *);
*************** add_var_loc_to_decl (tree decl, struct v
*** 5383,5388 ****
--- 5384,5412 ----
        temp->last = loc;
      }
  }
+ 
+ /* Add a variable location node X ending the location list *SLOT
+    at the end of a function.  */
+ 
+ static int
+ add_var_loc_end_to_decl (void **slot, void *x)
+ {
+   var_loc_list *temp = *slot;
+   struct var_loc_node *loc = x;
+ 
+   if (temp->last)
+     {
+       /* If the location list is already terminated we have nothing to do.  */
+       if (NOTE_VAR_LOCATION_LOC (temp->last->var_loc_note))
+ 	{
+ 	  /* Add LOC to the end of list and update LAST.  */
+ 	  temp->last->next = loc;
+ 	  temp->last = loc;
+ 	}
+     }
+ 
+   return 1;
+ }
  \f
  /* Keep track of the number of spaces used to indent the
     output of the debugging routines that print the structure of
*************** add_location_or_const_value_attribute (d
*** 9849,9855 ****
    if (loc_list && loc_list->first != loc_list->last)
      {
        const char *secname;
-       const char *endname;
        dw_loc_list_ref list;
        rtx varloc;
        struct var_loc_node *node;
--- 9873,9878 ----
*************** add_location_or_const_value_attribute (d
*** 9907,9932 ****
  				       node->label, node->next->label, secname);
  	  }
  
!       /* If the variable has a location at the last label
! 	 it keeps its location until the end of function.  */
        if (NOTE_VAR_LOCATION_LOC (node->var_loc_note) != NULL_RTX)
! 	{
! 	  char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
! 
! 	  varloc = NOTE_VAR_LOCATION (node->var_loc_note);
! 	  if (!current_function_decl)
! 	    endname = text_end_label;
! 	  else
! 	    {
! 	      ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
! 					   current_function_funcdef_no);
! 	      endname = ggc_strdup (label_id);
! 	    }
! 	  add_loc_descr_to_loc_list (&list,
! 				     loc_descriptor (varloc,
! 						     attr != DW_AT_frame_base),
! 				     node->label, endname, secname);
! 	}
  
        /* Finally, add the location list to the DIE, and we are done.  */
        add_AT_loc_list (die, attr, list);
--- 9930,9942 ----
  				       node->label, node->next->label, secname);
  	  }
  
! #ifdef ENABLE_CHECKING
!       /* Each location chain should be terminated by a node whose
! 	 NOTE_VAR_LOCATION_LOC (node->var_loc_note) == NULL_RTX
! 	 in add_var_loc_end_to_decl.  */
        if (NOTE_VAR_LOCATION_LOC (node->var_loc_note) != NULL_RTX)
! 	abort ();
! #endif
  
        /* Finally, add the location list to the DIE, and we are done.  */
        add_AT_loc_list (die, attr, list);
*************** dwarf2out_var_location (rtx loc_note)
*** 13009,13016 ****
    static rtx last_insn;
    static const char *last_label;
  
!   if (!DECL_P (NOTE_VAR_LOCATION_DECL (loc_note)))
!     return;
    prev_insn = PREV_INSN (loc_note);
  
    newloc = ggc_alloc_cleared (sizeof (struct var_loc_node));
--- 13019,13030 ----
    static rtx last_insn;
    static const char *last_label;
  
! #ifdef ENABLE_CHECKING
!   if (NOTE_VAR_LOCATION_DECL (loc_note)
!       && !DECL_P (NOTE_VAR_LOCATION_DECL (loc_note)))
!     abort ();
! #endif
! 
    prev_insn = PREV_INSN (loc_note);
  
    newloc = ggc_alloc_cleared (sizeof (struct var_loc_node));
*************** dwarf2out_var_location (rtx loc_note)
*** 13037,13043 ****
    last_insn = loc_note;
    last_label = newloc->label;
  
!   add_var_loc_to_decl (NOTE_VAR_LOCATION_DECL (loc_note), newloc);
  }
  
  /* We need to reset the locations at the beginning of each
--- 13051,13060 ----
    last_insn = loc_note;
    last_label = newloc->label;
  
!   if (NOTE_VAR_LOCATION_DECL (loc_note))
!     add_var_loc_to_decl (NOTE_VAR_LOCATION_DECL (loc_note), newloc);
!   else
!     htab_traverse (decl_loc_table, add_var_loc_end_to_decl, newloc);
  }
  
  /* We need to reset the locations at the beginning of each
Index: print-rtl.c
===================================================================
RCS file: /cvs/gcc-cvs/gcc/gcc/print-rtl.c,v
retrieving revision 1.106
diff -c -p -c -3 -p -r1.106 print-rtl.c
*** print-rtl.c	7 Feb 2004 14:14:51 -0000	1.106
--- print-rtl.c	26 Mar 2004 17:57:09 -0000
*************** print_rtx (rtx in_rtx)
*** 293,299 ****
  
  	      case NOTE_INSN_VAR_LOCATION:
  		fprintf (outfile, " (");
! 		print_mem_expr (outfile, NOTE_VAR_LOCATION_DECL (in_rtx));
  		fprintf (outfile, " ");
  		print_rtx (NOTE_VAR_LOCATION_LOC (in_rtx));
  		fprintf (outfile, ")");
--- 293,302 ----
  
  	      case NOTE_INSN_VAR_LOCATION:
  		fprintf (outfile, " (");
! 		if (NOTE_VAR_LOCATION_DECL (in_rtx))
! 		  print_mem_expr (outfile, NOTE_VAR_LOCATION_DECL (in_rtx));
! 		else
! 		  fprintf (outfile, " (all)");
  		fprintf (outfile, " ");
  		print_rtx (NOTE_VAR_LOCATION_LOC (in_rtx));
  		fprintf (outfile, ")");
Index: var-tracking.c
===================================================================
RCS file: /cvs/gcc-cvs/gcc/gcc/var-tracking.c,v
retrieving revision 2.12
diff -c -p -c -3 -p -r2.12 var-tracking.c
*** var-tracking.c	22 Mar 2004 02:57:27 -0000	2.12
--- var-tracking.c	25 Mar 2004 16:14:44 -0000
*************** vt_emit_notes (void)
*** 2418,2423 ****
--- 2418,2424 ----
    basic_block bb;
    dataflow_set *last_out;
    dataflow_set empty;
+   rtx note;
  
  #ifdef ENABLE_CHECKING
    if (htab_elements (changed_variables))
*************** vt_emit_notes (void)
*** 2443,2448 ****
--- 2444,2455 ----
        last_out = &VTI (bb)->out;
      }
    dataflow_set_destroy (&empty);
+ 
+   /* Emit the special note terminating all location lists.  */
+   note = emit_note_after (NOTE_INSN_VAR_LOCATION, get_last_insn ());
+   NOTE_VAR_LOCATION (note)
+     = gen_rtx_VAR_LOCATION (VOIDmode, NULL_TREE, NULL_RTX);
+ 
    emit_notes = false;
  }
  

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fix problem with variable tracking and lcoation lists
  2004-03-27  8:55 Fix problem with variable tracking and lcoation lists Josef Zlomek
@ 2004-03-29 18:51 ` Richard Henderson
  2004-03-29 19:12   ` Josef Zlomek
                     ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Richard Henderson @ 2004-03-29 18:51 UTC (permalink / raw)
  To: Josef Zlomek; +Cc: gcc-patches

On Sat, Mar 27, 2004 at 09:55:21AM +0100, Josef Zlomek wrote:
> As the result the loc_list has at least 2 elements and the location list
> is emitted.

Why are we emitting a location list of one location?  That
seems like needless indirection...


r~

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fix problem with variable tracking and lcoation lists
  2004-03-29 18:51 ` Richard Henderson
@ 2004-03-29 19:12   ` Josef Zlomek
  2004-03-29 19:13   ` Daniel Berlin
  2004-03-29 19:19   ` Josef Zlomek
  2 siblings, 0 replies; 5+ messages in thread
From: Josef Zlomek @ 2004-03-29 19:12 UTC (permalink / raw)
  To: Richard Henderson, gcc-patches

> > As the result the loc_list has at least 2 elements and the location list
> > is emitted.
> 
> Why are we emitting a location list of one location?  That
> seems like needless indirection...

The location may have limited range, i.e. the validity is not the whole range
from the beginning of function to the end of function.

Josef

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fix problem with variable tracking and lcoation lists
  2004-03-29 18:51 ` Richard Henderson
  2004-03-29 19:12   ` Josef Zlomek
@ 2004-03-29 19:13   ` Daniel Berlin
  2004-03-29 19:19   ` Josef Zlomek
  2 siblings, 0 replies; 5+ messages in thread
From: Daniel Berlin @ 2004-03-29 19:13 UTC (permalink / raw)
  To: Richard Henderson; +Cc: gcc-patches, Josef Zlomek


On Mar 29, 2004, at 1:51 PM, Richard Henderson wrote:

> On Sat, Mar 27, 2004 at 09:55:21AM +0100, Josef Zlomek wrote:
>> As the result the loc_list has at least 2 elements and the location 
>> list
>> is emitted.
>
> Why are we emitting a location list of one location?  That
> seems like needless indirection...

It is.
In fact, when i originally wrote this stuff (Josef rewrote and cleaned 
it up, big time), it wouldn't use location lists if there was only one 
location.
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Fix problem with variable tracking and lcoation lists
  2004-03-29 18:51 ` Richard Henderson
  2004-03-29 19:12   ` Josef Zlomek
  2004-03-29 19:13   ` Daniel Berlin
@ 2004-03-29 19:19   ` Josef Zlomek
  2 siblings, 0 replies; 5+ messages in thread
From: Josef Zlomek @ 2004-03-29 19:19 UTC (permalink / raw)
  To: Richard Henderson, gcc-patches

> > As the result the loc_list has at least 2 elements and the location list
> > is emitted.
> 
> Why are we emitting a location list of one location?  That
> seems like needless indirection...

IIRC there are also some situations when the original debug info would say "reg 8"
but the only location the variable is in is "mem[bp - const]".
In this case, the debug info is completelly wrong.

Josef

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2004-03-29 19:19 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-03-27  8:55 Fix problem with variable tracking and lcoation lists Josef Zlomek
2004-03-29 18:51 ` Richard Henderson
2004-03-29 19:12   ` Josef Zlomek
2004-03-29 19:13   ` Daniel Berlin
2004-03-29 19:19   ` Josef Zlomek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).