re PR debug/46724 (Wrong debug info: Invalid variable location)

PR debug/46724
* function.c (assign_parms_augmented_arg_list): Name and mark
DECL of result address as NAMELESS rather than IGNORED.
(assign_parms): Set DECL_VALUE_EXPR for indirect result.
* tree.h (tree_decl_common::decl_flag_2): Document RESULT_DECL.
(DECL_HAS_VALUE_EXPR_P): Accept RESULT_DECL.
* dwarf2out.c (loc_list_from_tree) <RESULT_DECL>: Use
DECL_VALUE_EXPR.
* dbxout.c (dbxout_expand_expr) <RESULT_DECL>: Likewise.
* var-tracking.c (vt_add_function_parameter): New, split out of...
(vt_add_function_parameters): ... this.  Handle incoming
pointer to hold result.

From-SVN: r168160
This commit is contained in:
Alexandre Oliva 2010-12-22 03:49:00 +00:00 committed by Alexandre Oliva
parent 16a9afdc66
commit 8dcfef8f2b
6 changed files with 152 additions and 108 deletions

View File

@ -1,3 +1,18 @@
2010-12-22 Alexandre Oliva <aoliva@redhat.com>
PR debug/46724
* function.c (assign_parms_augmented_arg_list): Name and mark
DECL of result address as NAMELESS rather than IGNORED.
(assign_parms): Set DECL_VALUE_EXPR for indirect result.
* tree.h (tree_decl_common::decl_flag_2): Document RESULT_DECL.
(DECL_HAS_VALUE_EXPR_P): Accept RESULT_DECL.
* dwarf2out.c (loc_list_from_tree) <RESULT_DECL>: Use
DECL_VALUE_EXPR.
* dbxout.c (dbxout_expand_expr) <RESULT_DECL>: Likewise.
* var-tracking.c (vt_add_function_parameter): New, split out of...
(vt_add_function_parameters): ... this. Handle incoming
pointer to hold result.
2010-12-22 Jie Zhang <jie@codesourcery.com>
* config/arm/arm.c (output_move_double): Update the comment

View File

@ -2396,12 +2396,12 @@ dbxout_expand_expr (tree expr)
/* FALLTHRU */
case PARM_DECL:
case RESULT_DECL:
if (DECL_HAS_VALUE_EXPR_P (expr))
return dbxout_expand_expr (DECL_VALUE_EXPR (expr));
/* FALLTHRU */
case CONST_DECL:
case RESULT_DECL:
return DECL_RTL_IF_SET (expr);
case INTEGER_CST:

View File

@ -15446,12 +15446,12 @@ loc_list_from_tree (tree loc, int want_address)
/* FALLTHRU */
case PARM_DECL:
case RESULT_DECL:
if (DECL_HAS_VALUE_EXPR_P (loc))
return loc_list_from_tree (DECL_VALUE_EXPR (loc),
want_address);
/* FALLTHRU */
case RESULT_DECL:
case FUNCTION_DECL:
{
rtx rtl;

View File

@ -2253,10 +2253,11 @@ assign_parms_augmented_arg_list (struct assign_parm_data_all *all)
tree decl;
decl = build_decl (DECL_SOURCE_LOCATION (fndecl),
PARM_DECL, NULL_TREE, type);
PARM_DECL, get_identifier (".result_ptr"), type);
DECL_ARG_TYPE (decl) = type;
DECL_ARTIFICIAL (decl) = 1;
DECL_IGNORED_P (decl) = 1;
DECL_NAMELESS (decl) = 1;
TREE_CONSTANT (decl) = 1;
DECL_CHAIN (decl) = all->orig_fnargs;
all->orig_fnargs = decl;
@ -3418,13 +3419,22 @@ assign_parms (tree fndecl)
rtx x;
if (DECL_BY_REFERENCE (result))
{
SET_DECL_VALUE_EXPR (result, all.function_result_decl);
x = addr;
}
else
{
SET_DECL_VALUE_EXPR (result,
build1 (INDIRECT_REF, TREE_TYPE (result),
all.function_result_decl));
addr = convert_memory_address (Pmode, addr);
x = gen_rtx_MEM (DECL_MODE (result), addr);
set_mem_attributes (x, result, 1);
}
DECL_HAS_VALUE_EXPR_P (result) = 1;
SET_DECL_RTL (result, x);
}

View File

@ -2773,7 +2773,8 @@ struct GTY(()) tree_decl_common {
In TYPE_DECL, this is TYPE_DECL_SUPPRESS_DEBUG. */
unsigned decl_flag_1 : 1;
/* In FIELD_DECL, this is DECL_NONADDRESSABLE_P
In VAR_DECL and PARM_DECL, this is DECL_HAS_VALUE_EXPR_P. */
In VAR_DECL, PARM_DECL and RESULT_DECL, this is
DECL_HAS_VALUE_EXPR_P. */
unsigned decl_flag_2 : 1;
/* Logically, these two would go in a theoretical base shared by var and
parm decl. */
@ -2818,7 +2819,8 @@ extern void decl_value_expr_insert (tree, tree);
decl itself. This should only be used for debugging; once this field has
been set, the decl itself may not legitimately appear in the function. */
#define DECL_HAS_VALUE_EXPR_P(NODE) \
(TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl_common.decl_flag_2)
(TREE_CHECK3 (NODE, VAR_DECL, PARM_DECL, RESULT_DECL) \
->decl_common.decl_flag_2)
#define DECL_VALUE_EXPR(NODE) \
(decl_value_expr_lookup (DECL_WRTL_CHECK (NODE)))
#define SET_DECL_VALUE_EXPR(NODE, VAL) \

View File

@ -7999,16 +7999,11 @@ vt_get_decl_and_offset (rtx rtl, tree *declp, HOST_WIDE_INT *offsetp)
return false;
}
/* Insert function parameters to IN and OUT sets of ENTRY_BLOCK. */
/* Insert function parameter PARM in IN and OUT sets of ENTRY_BLOCK. */
static void
vt_add_function_parameters (void)
vt_add_function_parameter (tree parm)
{
tree parm;
for (parm = DECL_ARGUMENTS (current_function_decl);
parm; parm = DECL_CHAIN (parm))
{
rtx decl_rtl = DECL_RTL_IF_SET (parm);
rtx incoming = DECL_INCOMING_RTL (parm);
tree decl;
@ -8018,16 +8013,13 @@ vt_add_function_parameters (void)
decl_or_value dv;
if (TREE_CODE (parm) != PARM_DECL)
continue;
if (!DECL_NAME (parm))
continue;
return;
if (!decl_rtl || !incoming)
continue;
return;
if (GET_MODE (decl_rtl) == BLKmode || GET_MODE (incoming) == BLKmode)
continue;
return;
if (!vt_get_decl_and_offset (incoming, &decl, &offset))
{
@ -8041,14 +8033,14 @@ vt_add_function_parameters (void)
else
{
if (!vt_get_decl_and_offset (decl_rtl, &decl, &offset))
continue;
return;
offset += byte_lowpart_offset (GET_MODE (incoming),
GET_MODE (decl_rtl));
}
}
if (!decl)
continue;
return;
if (parm != decl)
{
@ -8062,7 +8054,7 @@ vt_add_function_parameters (void)
}
if (!track_loc_p (incoming, parm, offset, false, &mode, &offset))
continue;
return;
out = &VTI (ENTRY_BLOCK_PTR)->out;
@ -8082,7 +8074,7 @@ vt_add_function_parameters (void)
above: incoming-rtl will have Pmode rather than the
expected mode for the type. */
if (offset)
continue;
return;
val = cselib_lookup (var_lowpart (mode, incoming), mode, true);
@ -8112,6 +8104,31 @@ vt_add_function_parameters (void)
set_variable_part (out, incoming, dv, offset,
VAR_INIT_STATUS_INITIALIZED, NULL, INSERT);
}
}
/* Insert function parameters to IN and OUT sets of ENTRY_BLOCK. */
static void
vt_add_function_parameters (void)
{
tree parm;
for (parm = DECL_ARGUMENTS (current_function_decl);
parm; parm = DECL_CHAIN (parm))
vt_add_function_parameter (parm);
if (DECL_HAS_VALUE_EXPR_P (DECL_RESULT (current_function_decl)))
{
tree vexpr = DECL_VALUE_EXPR (DECL_RESULT (current_function_decl));
if (TREE_CODE (vexpr) == INDIRECT_REF)
vexpr = TREE_OPERAND (vexpr, 0);
if (TREE_CODE (vexpr) == PARM_DECL
&& DECL_ARTIFICIAL (vexpr)
&& !DECL_IGNORED_P (vexpr)
&& DECL_NAMELESS (vexpr))
vt_add_function_parameter (vexpr);
}
if (MAY_HAVE_DEBUG_INSNS)