aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/expr.c41
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/block.C29
-rw-r--r--gcc/tree-eh.c7
5 files changed, 65 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 21fd726..9db326f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2012-10-31 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.
+
2012-10-31 Easwaran Raman <eraman@google.com>
PR target/54938
diff --git a/gcc/expr.c b/gcc/expr.c
index db20e9c..0ad3b57 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -5024,7 +5024,7 @@ store_expr (tree exp, rtx target, int call_param_p, bool nontemporal)
{
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)))
{
@@ -7863,31 +7863,7 @@ expand_expr_real (tree exp, rtx target, enum machine_mode tmode,
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;
}
@@ -9244,8 +9220,15 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
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;
@@ -9475,7 +9458,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 29a9bfb..926b179 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2012-10-31 Dehao Chen <dehao@google.com>
+
+ * g++.dg/debug/dwarf2/block.C: New testcase.
+
2012-10-31 Jan Hubicka <jh@suse.cz>
* gcc.dg/pr44974.c: Add noinline.
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/block.C b/gcc/testsuite/g++.dg/debug/dwarf2/block.C
new file mode 100644
index 0000000..176823f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/block.C
@@ -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" } }
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index 9042f06..960a966 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -739,6 +739,7 @@ do_return_redirection (struct goto_queue_node *q, tree finlab, gimple_seq mod)
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, tree finlab, gimple_seq mod,
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 region, tree over)
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 *state,
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, struct leh_tf_state *tf)
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, struct leh_tf_state *tf)
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, struct leh_tf_state *tf)
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);