Commit 823e9473 by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/43983 (var-tracking needlessly throws away location info for SRAed vars)

	PR debug/43983
	* var-tracking.c (track_expr_p): Allow tracking of variables optimized
	by SRA.
	* Makefile.in (dwarf2out.o): Depend on $(TREE_FLOW_H).
	* tree-sra.c (create_access_replacement): Call unshare_expr before
	passing expr to SET_DECL_DEBUG_EXPR, and remove any SSA_NAMEs from
	it.
	* dwarf2out.c: Include tree-flow.h.
	(struct var_loc_node): Rename var_loc_note field to loc, add comment.
	(size_of_loc_descr, output_loc_operands, output_loc_operands_raw):
	Handle DW_OP_bit_piece.
	(decl_piece_bitsize, decl_piece_varloc_ptr, decl_piece_node,
	construct_piece_list, adjust_piece_list): New functions.
	(add_var_loc_to_decl): Handle SRA optimized variables.
	Adjust for var_loc_note to loc field renaming.
	(dw_loc_list_1): For WANT_ADDRESS == 2 prefer DECL_MODE of decl
	in VAR_LOCATION note.
	(new_loc_descr_op_bit_piece): New function.
	(dw_sra_loc_expr): New function.
	(dw_loc_list): Use it.  Don't handle the last range after the
	loop, handle it inside of the loop.  Adjust for var_loc_note
	to loc field renaming.
	(add_location_or_const_value_attribute): Only special case
	single entry loc lists if loc is NOTE_P.  Adjust for
	var_loc_note to loc field renaming.
	(dwarf2out_var_location): Don't set newloc->var_loc_note
	and newloc->next here.

	* gcc.dg/guality/sra-1.c: New test.

From-SVN: r159357
parent d20cfbc2
2010-05-13 Jakub Jelinek <jakub@redhat.com>
PR debug/43983
* var-tracking.c (track_expr_p): Allow tracking of variables optimized
by SRA.
* Makefile.in (dwarf2out.o): Depend on $(TREE_FLOW_H).
* tree-sra.c (create_access_replacement): Call unshare_expr before
passing expr to SET_DECL_DEBUG_EXPR, and remove any SSA_NAMEs from
it.
* dwarf2out.c: Include tree-flow.h.
(struct var_loc_node): Rename var_loc_note field to loc, add comment.
(size_of_loc_descr, output_loc_operands, output_loc_operands_raw):
Handle DW_OP_bit_piece.
(decl_piece_bitsize, decl_piece_varloc_ptr, decl_piece_node,
construct_piece_list, adjust_piece_list): New functions.
(add_var_loc_to_decl): Handle SRA optimized variables.
Adjust for var_loc_note to loc field renaming.
(dw_loc_list_1): For WANT_ADDRESS == 2 prefer DECL_MODE of decl
in VAR_LOCATION note.
(new_loc_descr_op_bit_piece): New function.
(dw_sra_loc_expr): New function.
(dw_loc_list): Use it. Don't handle the last range after the
loop, handle it inside of the loop. Adjust for var_loc_note
to loc field renaming.
(add_location_or_const_value_attribute): Only special case
single entry loc lists if loc is NOTE_P. Adjust for
var_loc_note to loc field renaming.
(dwarf2out_var_location): Don't set newloc->var_loc_note
and newloc->next here.
2010-05-12 Jan Hubicka <jh@suse.cz> 2010-05-12 Jan Hubicka <jh@suse.cz>
* cgraph.c (cgraph_mark_address_taken_node): No longer imply needed flag. * cgraph.c (cgraph_mark_address_taken_node): No longer imply needed flag.
......
...@@ -2846,7 +2846,7 @@ dwarf2out.o : dwarf2out.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ ...@@ -2846,7 +2846,7 @@ dwarf2out.o : dwarf2out.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
output.h $(DIAGNOSTIC_H) $(REAL_H) hard-reg-set.h $(REGS_H) $(EXPR_H) \ output.h $(DIAGNOSTIC_H) $(REAL_H) hard-reg-set.h $(REGS_H) $(EXPR_H) \
libfuncs.h $(TOPLEV_H) dwarf2out.h reload.h $(GGC_H) $(EXCEPT_H) dwarf2asm.h \ libfuncs.h $(TOPLEV_H) dwarf2out.h reload.h $(GGC_H) $(EXCEPT_H) dwarf2asm.h \
$(TM_P_H) langhooks.h $(HASHTAB_H) gt-dwarf2out.h $(TARGET_H) $(CGRAPH_H) \ $(TM_P_H) langhooks.h $(HASHTAB_H) gt-dwarf2out.h $(TARGET_H) $(CGRAPH_H) \
$(MD5_H) $(INPUT_H) $(FUNCTION_H) $(GIMPLE_H) $(TREE_PASS_H) $(MD5_H) $(INPUT_H) $(FUNCTION_H) $(GIMPLE_H) $(TREE_PASS_H) $(TREE_FLOW_H)
dwarf2asm.o : dwarf2asm.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ dwarf2asm.o : dwarf2asm.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(FLAGS_H) $(RTL_H) $(TREE_H) output.h dwarf2asm.h $(TM_P_H) $(GGC_H) \ $(FLAGS_H) $(RTL_H) $(TREE_H) output.h dwarf2asm.h $(TM_P_H) $(GGC_H) \
gt-dwarf2asm.h $(DWARF2_H) $(SPLAY_TREE_H) $(TARGET_H) gt-dwarf2asm.h $(DWARF2_H) $(SPLAY_TREE_H) $(TARGET_H)
......
2010-05-13 Jakub Jelinek <jakub@redhat.com>
PR debug/43983
* gcc.dg/guality/sra-1.c: New test.
2010-05-12 Jan Hubicka <jh@suse.cz> 2010-05-12 Jan Hubicka <jh@suse.cz>
* tree-ssa/unreachable.c: New test. * tree-ssa/unreachable.c: New test.
......
/* PR debug/43983 */
/* { dg-do run } */
/* { dg-options "-g" } */
struct A { int i; int j; };
struct B { int : 4; int i : 12; int j : 12; int : 4; };
__attribute__((noinline)) void
bar (int x)
{
asm volatile ("" : : "r" (x) : "memory");
}
__attribute__((noinline)) int
f1 (int k)
{
struct A a = { 4, k + 6 };
asm ("" : "+r" (a.i));
a.j++;
bar (a.i); /* { dg-final { gdb-test 20 "a.i" "4" } } */
bar (a.j); /* { dg-final { gdb-test 20 "a.j" "14" } } */
return a.i + a.j;
}
__attribute__((noinline)) int
f2 (int k)
{
int a[2] = { 4, k + 6 };
asm ("" : "+r" (a[0]));
a[1]++;
bar (a[0]); /* { dg-final { gdb-test 31 "a\[0\]" "4" } } */
bar (a[1]); /* { dg-final { gdb-test 31 "a\[1\]" "14" } } */
return a[0] + a[1];
}
__attribute__((noinline)) int
f3 (int k)
{
struct B a = { 4, k + 6 };
asm ("" : "+r" (a.i));
a.j++;
bar (a.i); /* { dg-final { gdb-test 42 "a.i" "4" } } */
bar (a.j); /* { dg-final { gdb-test 42 "a.j" "14" } } */
return a.i + a.j;
}
int
main (void)
{
int k;
asm ("" : "=r" (k) : "0" (7));
f1 (k);
f2 (k);
f3 (k);
return 0;
}
...@@ -1609,11 +1609,38 @@ create_access_replacement (struct access *access) ...@@ -1609,11 +1609,38 @@ create_access_replacement (struct access *access)
&& !DECL_ARTIFICIAL (access->base)) && !DECL_ARTIFICIAL (access->base))
{ {
char *pretty_name = make_fancy_name (access->expr); char *pretty_name = make_fancy_name (access->expr);
tree debug_expr = unshare_expr (access->expr), d;
DECL_NAME (repl) = get_identifier (pretty_name); DECL_NAME (repl) = get_identifier (pretty_name);
obstack_free (&name_obstack, pretty_name); obstack_free (&name_obstack, pretty_name);
SET_DECL_DEBUG_EXPR (repl, access->expr); /* Get rid of any SSA_NAMEs embedded in debug_expr,
as DECL_DEBUG_EXPR isn't considered when looking for still
used SSA_NAMEs and thus they could be freed. All debug info
generation cares is whether something is constant or variable
and that get_ref_base_and_extent works properly on the
expression. */
for (d = debug_expr; handled_component_p (d); d = TREE_OPERAND (d, 0))
switch (TREE_CODE (d))
{
case ARRAY_REF:
case ARRAY_RANGE_REF:
if (TREE_OPERAND (d, 1)
&& TREE_CODE (TREE_OPERAND (d, 1)) == SSA_NAME)
TREE_OPERAND (d, 1) = SSA_NAME_VAR (TREE_OPERAND (d, 1));
if (TREE_OPERAND (d, 3)
&& TREE_CODE (TREE_OPERAND (d, 3)) == SSA_NAME)
TREE_OPERAND (d, 3) = SSA_NAME_VAR (TREE_OPERAND (d, 3));
/* FALLTHRU */
case COMPONENT_REF:
if (TREE_OPERAND (d, 2)
&& TREE_CODE (TREE_OPERAND (d, 2)) == SSA_NAME)
TREE_OPERAND (d, 2) = SSA_NAME_VAR (TREE_OPERAND (d, 2));
break;
default:
break;
}
SET_DECL_DEBUG_EXPR (repl, debug_expr);
DECL_DEBUG_EXPR_IS_FROM (repl) = 1; DECL_DEBUG_EXPR_IS_FROM (repl) = 1;
TREE_NO_WARNING (repl) = TREE_NO_WARNING (access->base); TREE_NO_WARNING (repl) = TREE_NO_WARNING (access->base);
} }
......
...@@ -4505,10 +4505,27 @@ track_expr_p (tree expr, bool need_rtl) ...@@ -4505,10 +4505,27 @@ track_expr_p (tree expr, bool need_rtl)
realdecl = DECL_DEBUG_EXPR (realdecl); realdecl = DECL_DEBUG_EXPR (realdecl);
if (realdecl == NULL_TREE) if (realdecl == NULL_TREE)
realdecl = expr; realdecl = expr;
/* ??? We don't yet know how to emit DW_OP_piece for variable
that has been SRA'ed. */
else if (!DECL_P (realdecl)) else if (!DECL_P (realdecl))
return 0; {
if (handled_component_p (realdecl))
{
HOST_WIDE_INT bitsize, bitpos, maxsize;
tree innerdecl
= get_ref_base_and_extent (realdecl, &bitpos, &bitsize,
&maxsize);
if (!DECL_P (innerdecl)
|| DECL_IGNORED_P (innerdecl)
|| TREE_STATIC (innerdecl)
|| bitsize <= 0
|| bitpos + bitsize > 256
|| bitsize != maxsize)
return 0;
else
realdecl = expr;
}
else
return 0;
}
} }
/* Do not track EXPR if REALDECL it should be ignored for debugging /* Do not track EXPR if REALDECL it should be ignored for debugging
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment