Patchwork Fix debug info for expr and jump stmt

login
register
mail settings
Submitter Dehao Chen
Date Oct. 29, 2012, 8:40 p.m.
Message ID <CAO2gOZW2DjFFG40oXxOc=BJfb6q-PwAFCjsCs9piL0vD5XWNbg@mail.gmail.com>
Download mbox | patch
Permalink /patch/195136/
State New
Headers show

Comments

Dehao Chen - Oct. 29, 2012, 8:40 p.m.
Hi,

Attached is the new patch. This patch bootstrapped and passed all
tests except the following:

FAIL: gcc.dg/guality/pr43479.c  -O1  line 13 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O1  line 18 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O2  line 13 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O2  line 18 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O3 -fomit-frame-pointer  line 13 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O3 -fomit-frame-pointer  line 18 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O3 -g  line 13 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O3 -g  line 18 h == 9
FAIL: gcc.dg/guality/pr43479.c  -Os  line 13 h == 9
FAIL: gcc.dg/guality/pr43479.c  -Os  line 18 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O2 -flto -fno-use-linker-plugin
-flto-partition=none  line 13 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O2 -flto -fno-use-linker-plugin
-flto-partition=none  line 18 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O2 -flto -fuse-linker-plugin
-fno-fat-lto-objects  line 13 h == 9
FAIL: gcc.dg/guality/pr43479.c  -O2 -flto -fuse-linker-plugin
-fno-fat-lto-objects  line 18 h == 9

But looks like they are all non-O0 related debugging issues. Is it acceptable?

Thanks,
Dehao

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

        * tree-eh.c (do_return_redirection): Set location for jump statement.
        (do_goto_redirection): Likewise.
        (frob_into_branch_around): Likewise.
        (lower_try_finally_nofallthru): Likewise.
        (lower_try_finally_copy): Likewise.
        (lower_try_finally_switch): Likewise.
        * expr.c (store_expr): Use current insn location instead of expr
        location.
        (expand_expr_real): Likewise.
        (expand_expr_real_1): Likewise.

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

        * g++.dg/debug/dwarf2/block.C: New testcase.
Jakub Jelinek - Oct. 29, 2012, 8:47 p.m.
On Mon, Oct 29, 2012 at 01:40:35PM -0700, Dehao Chen wrote:
> Attached is the new patch. This patch bootstrapped and passed all
> tests except the following:
> 
> FAIL: gcc.dg/guality/pr43479.c  -O1  line 13 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O1  line 18 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O2  line 13 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O2  line 18 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O3 -fomit-frame-pointer  line 13 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O3 -fomit-frame-pointer  line 18 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O3 -g  line 13 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O3 -g  line 18 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -Os  line 13 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -Os  line 18 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O2 -flto -fno-use-linker-plugin
> -flto-partition=none  line 13 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O2 -flto -fno-use-linker-plugin
> -flto-partition=none  line 18 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O2 -flto -fuse-linker-plugin
> -fno-fat-lto-objects  line 13 h == 9
> FAIL: gcc.dg/guality/pr43479.c  -O2 -flto -fuse-linker-plugin
> -fno-fat-lto-objects  line 18 h == 9

That testcase is a test exactly for correct block handling, so regressing it
is not acceptable.

	Jakub
Dehao Chen - Oct. 29, 2012, 10:14 p.m.
Yeah, I looked into the testcase. Indeed, the expr location should be
used instead of curr_insn_location(). Otherwise the source line for
all definitions will be attributed to the use point. But if we use
EXPR_LOCATION, then we need to make sure the block is also correct.

Any suggestions how we should do about the patch?

Thanks,
Dehao

Patch

Index: gcc/expr.c
===================================================================
--- gcc/expr.c	(revision 192809)
+++ gcc/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)))
     {
@@ -7881,8 +7881,7 @@  expand_expr_real (tree exp, rtx target, enum machi
     {
       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);
+      input_location = curr_insn_location ();
 
       ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl);
 
@@ -9481,7 +9480,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;
Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog	(revision 192809)
+++ gcc/ChangeLog	(working copy)
@@ -1,3 +1,14 @@ 
+2012-10-25  Dehao Chen  <dehao@google.com>
+
+	* tree-eh.c (do_return_redirection): Set location for jump statement.
+	(do_goto_redirection): Likewise.
+	(frob_into_branch_around): Likewise.
+	(lower_try_finally_nofallthru): Likewise.
+	(lower_try_finally_copy): Likewise.
+	(lower_try_finally_switch): Likewise.
+	* gimple-low.c (tree_set_block_r): New callback function.
+	(lower_stmt): Set block for tested expr.
+
 2012-10-25  Jan Hubicka  <jh@suse.cz>
 
 	PR tree-optimize/54980
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(revision 192809)
+++ gcc/testsuite/ChangeLog	(working copy)
@@ -1,3 +1,7 @@ 
+2012-10-25  Dehao Chen  <dehao@google.com>
+
+	* g++.dg/debug/dwarf2/block.C: New testcase.
+
 2012-10-25  Marc Glisse  <marc.glisse@inria.fr>
 
 	PR c++/54427
Index: gcc/testsuite/g++.dg/debug/dwarf2/block.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/block.C	(revision 0)
+++ gcc/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: gcc/tree-eh.c
===================================================================
--- gcc/tree-eh.c	(revision 192809)
+++ gcc/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);