public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Update source location for PRE inserted stmt
@ 2012-10-30 23:04 Dehao Chen
  2012-10-30 23:55 ` Steven Bosscher
  0 siblings, 1 reply; 22+ messages in thread
From: Dehao Chen @ 2012-10-30 23:04 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 659 bytes --]

Hi,

This patch aims to improve debugging of optimized code. It ensures
that PRE inserted statements have the same source location as the
statement at the insertion point, instead of UNKNOWN_LOCATION.

Bootstrapped on x86_64, and passed gcc regression tests and gdb
regression tests.

Is it okay for trunk?

Thanks,
Dehao

gcc/ChangeLog:
2012-10-30  Dehao Chen  <dehao@google.com>

        * tree-ssa-pre.c (insert_into_pred_update_location): New Function.
        (insert_into_preds_of_block): Update source location for inserted stmts.

gcc/testsuite/ChangeLog:
2012-10-30  Dehao Chen  <dehao@google.com>

        * gcc.dg/debug/dwarf2/pre.c: New testcase.

[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 5608 bytes --]

Index: testsuite/g++.dg/debug/dwarf2/block.C
===================================================================
--- testsuite/g++.dg/debug/dwarf2/block.C	(revision 0)
+++ testsuite/g++.dg/debug/dwarf2/block.C	(revision 0)
@@ -0,0 +1,29 @@
+// Compiler should not generate too many lexical blocks for this function.
+// { dg-do compile { target { i?86-*-* x86_64-*-* } } }
+// { dg-options "-O0 -fno-exceptions -g -dA" }
+
+union UElement {
+    void* pointer;
+    int integer;
+};
+struct UColToken {
+  unsigned source;
+  unsigned char **rulesToParseHdl;
+};
+
+int uhash_hashTokens(const union UElement k)
+{
+  int hash = 0;
+  struct UColToken *key = (struct UColToken *)k.pointer;
+  if (key != 0) {
+    int len = (key->source & 0xFF000000)>>24;
+    int inc = ((len - 32) / 32) + 1;
+    const unsigned char *p = (key->source & 0x00FFFFFF)
+			     + *(key->rulesToParseHdl);
+    const unsigned char *limit = p + len;
+    hash = *p + *limit;
+  }
+  return hash;
+}
+
+// { dg-final { scan-assembler-not "LBB10" } }
Index: tree-eh.c
===================================================================
--- tree-eh.c	(revision 192809)
+++ tree-eh.c	(working copy)
@@ -739,6 +739,7 @@ do_return_redirection (struct goto_queue_node *q,
     gimple_seq_add_seq (&q->repl_stmt, mod);
 
   x = gimple_build_goto (finlab);
+  gimple_set_location (x, q->location);
   gimple_seq_add_stmt (&q->repl_stmt, x);
 }
 
@@ -758,6 +759,7 @@ do_goto_redirection (struct goto_queue_node *q, tr
     gimple_seq_add_seq (&q->repl_stmt, mod);
 
   x = gimple_build_goto (finlab);
+  gimple_set_location (x, q->location);
   gimple_seq_add_stmt (&q->repl_stmt, x);
 }
 
@@ -857,6 +859,7 @@ frob_into_branch_around (gimple tp, eh_region regi
       if (!over)
 	over = create_artificial_label (loc);
       x = gimple_build_goto (over);
+      gimple_set_location (x, loc);
       gimple_seq_add_stmt (&cleanup, x);
     }
   gimple_seq_add_seq (&eh_seq, cleanup);
@@ -1085,6 +1088,7 @@ lower_try_finally_nofallthru (struct leh_state *st
 	  emit_post_landing_pad (&eh_seq, tf->region);
 
 	  x = gimple_build_goto (lab);
+	  gimple_set_location (x, gimple_location (tf->try_finally_expr));
 	  gimple_seq_add_stmt (&eh_seq, x);
 	}
     }
@@ -1223,6 +1227,7 @@ lower_try_finally_copy (struct leh_state *state, s
 
       tmp = lower_try_finally_fallthru_label (tf);
       x = gimple_build_goto (tmp);
+      gimple_set_location (x, tf_loc);
       gimple_seq_add_stmt (&new_stmt, x);
     }
 
@@ -1395,6 +1400,7 @@ lower_try_finally_switch (struct leh_state *state,
 
       tmp = lower_try_finally_fallthru_label (tf);
       x = gimple_build_goto (tmp);
+      gimple_set_location (x, tf_loc);
       gimple_seq_add_stmt (&switch_body, x);
     }
 
@@ -1423,6 +1429,7 @@ lower_try_finally_switch (struct leh_state *state,
       gimple_seq_add_stmt (&eh_seq, x);
 
       x = gimple_build_goto (finally_label);
+      gimple_set_location (x, tf_loc);
       gimple_seq_add_stmt (&eh_seq, x);
 
       tmp = build_int_cst (integer_type_node, eh_index);
Index: expr.c
===================================================================
--- expr.c	(revision 192809)
+++ expr.c	(working copy)
@@ -5030,7 +5030,7 @@ store_expr (tree exp, rtx target, int call_param_p
 {
   rtx temp;
   rtx alt_rtl = NULL_RTX;
-  location_t loc = EXPR_LOCATION (exp);
+  location_t loc = curr_insn_location ();
 
   if (VOID_TYPE_P (TREE_TYPE (exp)))
     {
@@ -7869,31 +7869,7 @@ expand_expr_real (tree exp, rtx target, enum machi
       return ret ? ret : const0_rtx;
     }
 
-  /* If this is an expression of some kind and it has an associated line
-     number, then emit the line number before expanding the expression.
-
-     We need to save and restore the file and line information so that
-     errors discovered during expansion are emitted with the right
-     information.  It would be better of the diagnostic routines
-     used the file/line information embedded in the tree nodes rather
-     than globals.  */
-  if (cfun && EXPR_HAS_LOCATION (exp))
-    {
-      location_t saved_location = input_location;
-      location_t saved_curr_loc = curr_insn_location ();
-      input_location = EXPR_LOCATION (exp);
-      set_curr_insn_location (input_location);
-
-      ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
-
-      input_location = saved_location;
-      set_curr_insn_location (saved_curr_loc);
-    }
-  else
-    {
-      ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
-    }
-
+  ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
   return ret;
 }
 
@@ -9250,8 +9226,15 @@ expand_expr_real_1 (tree exp, rtx target, enum mac
 	g = SSA_NAME_DEF_STMT (exp);
       if (g)
 	{
-	  rtx r = expand_expr_real (gimple_assign_rhs_to_tree (g), target,
-				    tmode, modifier, NULL);
+	  rtx r;
+	  location_t saved_loc = input_location;
+
+	  input_location = gimple_location (g);
+	  set_curr_insn_location (input_location);
+	  r = expand_expr_real (gimple_assign_rhs_to_tree (g), target,
+				tmode, modifier, NULL);
+	  input_location = saved_loc;
+	  set_curr_insn_location (saved_loc);
 	  if (REG_P (r) && !REG_EXPR (r))
 	    set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (exp), r);
 	  return r;
@@ -9481,7 +9464,7 @@ expand_expr_real_1 (tree exp, rtx target, enum mac
 	       with non-BLKmode values.  */
 	    gcc_assert (GET_MODE (ret) != BLKmode);
 
-	    val = build_decl (EXPR_LOCATION (exp),
+	    val = build_decl (curr_insn_location (),
 			      VAR_DECL, NULL, TREE_TYPE (exp));
 	    DECL_ARTIFICIAL (val) = 1;
 	    DECL_IGNORED_P (val) = 1;

^ permalink raw reply	[flat|nested] 22+ messages in thread
* Re: [PATCH] Update source location for PRE inserted stmt
@ 2012-11-25 19:37 Xinliang David Li
  2012-11-26 15:38 ` Dehao Chen
  0 siblings, 1 reply; 22+ messages in thread
From: Xinliang David Li @ 2012-11-25 19:37 UTC (permalink / raw)
  To: Richard Biener
  Cc: Eric Botcazou, Diego Novillo, GCC Patches, Steven Bosscher, Dehao Chen

On Sun, Nov 25, 2012 at 4:40 AM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Thu, Nov 15, 2012 at 5:46 PM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>>> But UNKNOWN_LOCATION is effectively wrong as well.  If other
>>> optimizations move the statements above the inserted instruction, then
>>> the new instruction ends up inheriting whatever location happens to be
>>> in the previous statement.
>>
>> That's correct, UNKNOWN_LOCATION isn't a panacea either, although it can help
>> in some cases.  The only safe thing to do is to put the exact source location
>> of the statement, i.e. the location of the source construct for which the
>> statement has been generated.
>
> There may not be a source location for a generated statement, the computed
> value might not have been computed in the source at any point even.  Consider
> re-association of an expression and then a re-associated part becoming
> partially redundant.
>
>  if ()
>    tem = a + b;
>  tem2 = a + c  + b;
>
> after re-assoc + PRE:
>
>  if ()
>    tem = a + b;
> else
>    tem' = a + b;  // which sloc here?

If there was a else branch, the proposed patch by Dehao will use the
source location of the previous stmt 'tem' = a + b' was inserted
after.

I did not see any special source location handling in
tree-ssa-reassoc.c -- looks like the same principle is used there --
the new assignment after the operand shuffling will inherit the source
location of the placeholder gimple stmt.


> tem'' = PHI <tem, tem'>  //  or here?  on the args?
> tem2 = tem'' + c;
>
> so what source location would you use for the inserted expression?  If
> UNKNOWN is not
> correct here then I think we need an explicit NOWHERE?

Can that break line coverage info too, say, when source location get
stripped from reassociated expressions?

David




>
>>> Fixing the location when the statement is inserted will reduce this
>>> randomness.  I'm not sure I understand why you think this will break
>>> coverage.  The examples given in this thread were helped by this
>>> location fixing.
>>
>> What do you call randomness exactly?  GDB jumpiness?  I'm a little wary of
>> fixing GDB jumpiness by distorting the debug info.  Ian has clearly outlined
>> the correct approach to addressing it.
>>
>> Note that I didn't specifically reply to Dehao's patch here, which might be
>> acceptable in the end, only to David's seemingly general statement about the
>> "natural way" of putting a location on these statements.
>
> Richard.
>
>> --
>> Eric Botcazou

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

end of thread, other threads:[~2012-11-26 15:38 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-30 23:04 [PATCH] Update source location for PRE inserted stmt Dehao Chen
2012-10-30 23:55 ` Steven Bosscher
2012-10-30 23:57   ` Dehao Chen
2012-10-31  0:15   ` Xinliang David Li
2012-10-31  9:47     ` Richard Biener
2012-10-31 14:44       ` Dehao Chen
2012-10-31 19:16       ` Xinliang David Li
2012-11-04 16:07         ` Richard Biener
2012-11-04 17:42           ` Dehao Chen
2012-11-04 22:19           ` Xinliang David Li
2012-11-05 11:56             ` Eric Botcazou
2012-11-05 15:37               ` Dehao Chen
2012-11-05 17:00               ` Xinliang David Li
2012-11-15 13:11               ` Diego Novillo
2012-11-15 16:50                 ` Eric Botcazou
2012-11-15 17:05                   ` Dehao Chen
2012-11-15 17:35                     ` Eric Botcazou
2012-11-15 18:30                       ` Xinliang David Li
2012-11-15 18:32                         ` Dehao Chen
2012-11-25 12:40                   ` Richard Biener
2012-11-25 19:37 Xinliang David Li
2012-11-26 15:38 ` Dehao Chen

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).