Commit 7d810276 by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/50299 (entryval: bigendian 32bit->64bit extension breaks address match)

	PR debug/50299
	* calls.c (load_register_parameters): Use use_reg_mode instead
	of use_reg when adding a single register CALL_INSN_FUNCTION_USAGE
	entry.
	(expand_call): Set EXPR_LIST mode to TYPE_MODE of the argument
	for stack CALL_INSN_FUNCTION_USAGE uses.
	* expr.h (use_reg_mode): New prototype.
	(use_reg): Changed into inline around use_reg_mode.
	* expr.c (use_reg): Renamed to...
	(use_reg_mode): ... this.  Added MODE argument, set EXPR_LIST
	mode to that mode instead of VOIDmode.
	* var-tracking.c (prepare_call_arguments): Don't track parameters
	whose EXPR_LIST mode is VOIDmode, BLKmode or X mode isn't convertible
	to it using lowpart_subreg.  Convert VALUE and REG/MEM to the
	EXPR_LIST mode.

From-SVN: r178784
parent 886a64f9
2011-09-12 Jakub Jelinek <jakub@redhat.com>
PR debug/50299
* calls.c (load_register_parameters): Use use_reg_mode instead
of use_reg when adding a single register CALL_INSN_FUNCTION_USAGE
entry.
(expand_call): Set EXPR_LIST mode to TYPE_MODE of the argument
for stack CALL_INSN_FUNCTION_USAGE uses.
* expr.h (use_reg_mode): New prototype.
(use_reg): Changed into inline around use_reg_mode.
* expr.c (use_reg): Renamed to...
(use_reg_mode): ... this. Added MODE argument, set EXPR_LIST
mode to that mode instead of VOIDmode.
* var-tracking.c (prepare_call_arguments): Don't track parameters
whose EXPR_LIST mode is VOIDmode, BLKmode or X mode isn't convertible
to it using lowpart_subreg. Convert VALUE and REG/MEM to the
EXPR_LIST mode.
2011-09-12 Georg-Johann Lay <avr@gjlay.de> 2011-09-12 Georg-Johann Lay <avr@gjlay.de>
PR target/43746 PR target/43746
...@@ -1756,7 +1756,8 @@ load_register_parameters (struct arg_data *args, int num_actuals, ...@@ -1756,7 +1756,8 @@ load_register_parameters (struct arg_data *args, int num_actuals,
if (GET_CODE (reg) == PARALLEL) if (GET_CODE (reg) == PARALLEL)
use_group_regs (call_fusage, reg); use_group_regs (call_fusage, reg);
else if (nregs == -1) else if (nregs == -1)
use_reg (call_fusage, reg); use_reg_mode (call_fusage, reg,
TYPE_MODE (TREE_TYPE (args[i].tree_value)));
else if (nregs > 0) else if (nregs > 0)
use_regs (call_fusage, REGNO (reg), nregs); use_regs (call_fusage, REGNO (reg), nregs);
} }
...@@ -2815,10 +2816,10 @@ expand_call (tree exp, rtx target, int ignore) ...@@ -2815,10 +2816,10 @@ expand_call (tree exp, rtx target, int ignore)
} }
if (args[i].stack) if (args[i].stack)
call_fusage = gen_rtx_EXPR_LIST (VOIDmode, call_fusage
gen_rtx_USE (VOIDmode, = gen_rtx_EXPR_LIST (TYPE_MODE (TREE_TYPE (args[i].tree_value)),
args[i].stack), gen_rtx_USE (VOIDmode, args[i].stack),
call_fusage); call_fusage);
} }
/* If we have a parm that is passed in registers but not in memory /* If we have a parm that is passed in registers but not in memory
......
...@@ -2184,13 +2184,12 @@ copy_blkmode_from_reg (rtx tgtblk, rtx srcreg, tree type) ...@@ -2184,13 +2184,12 @@ copy_blkmode_from_reg (rtx tgtblk, rtx srcreg, tree type)
to by CALL_FUSAGE. REG must denote a hard register. */ to by CALL_FUSAGE. REG must denote a hard register. */
void void
use_reg (rtx *call_fusage, rtx reg) use_reg_mode (rtx *call_fusage, rtx reg, enum machine_mode mode)
{ {
gcc_assert (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER); gcc_assert (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER);
*call_fusage *call_fusage
= gen_rtx_EXPR_LIST (VOIDmode, = gen_rtx_EXPR_LIST (mode, gen_rtx_USE (VOIDmode, reg), *call_fusage);
gen_rtx_USE (VOIDmode, reg), *call_fusage);
} }
/* Add USE expressions to *CALL_FUSAGE for each of NREGS consecutive regs, /* Add USE expressions to *CALL_FUSAGE for each of NREGS consecutive regs,
......
...@@ -321,8 +321,16 @@ extern void emit_group_store (rtx, rtx, tree, int); ...@@ -321,8 +321,16 @@ extern void emit_group_store (rtx, rtx, tree, int);
/* Copy BLKmode object from a set of registers. */ /* Copy BLKmode object from a set of registers. */
extern rtx copy_blkmode_from_reg (rtx, rtx, tree); extern rtx copy_blkmode_from_reg (rtx, rtx, tree);
/* Mark REG as holding a parameter for the next CALL_INSN.
Mode is TYPE_MODE of the non-promoted parameter, or VOIDmode. */
extern void use_reg_mode (rtx *, rtx, enum machine_mode);
/* Mark REG as holding a parameter for the next CALL_INSN. */ /* Mark REG as holding a parameter for the next CALL_INSN. */
extern void use_reg (rtx *, rtx); static inline void
use_reg (rtx *fusage, rtx reg)
{
use_reg_mode (fusage, reg, VOIDmode);
}
/* Mark NREGS consecutive regs, starting at REGNO, as holding parameters /* Mark NREGS consecutive regs, starting at REGNO, as holding parameters
for the next CALL_INSN. */ for the next CALL_INSN. */
......
...@@ -5730,11 +5730,18 @@ prepare_call_arguments (basic_block bb, rtx insn) ...@@ -5730,11 +5730,18 @@ prepare_call_arguments (basic_block bb, rtx insn)
{ {
rtx item = NULL_RTX; rtx item = NULL_RTX;
x = XEXP (XEXP (link, 0), 0); x = XEXP (XEXP (link, 0), 0);
if (REG_P (x)) if (GET_MODE (link) == VOIDmode
|| GET_MODE (link) == BLKmode
|| (GET_MODE (link) != GET_MODE (x)
&& (GET_MODE_CLASS (GET_MODE (link)) != MODE_INT
|| GET_MODE_CLASS (GET_MODE (x)) != MODE_INT)))
/* Can't do anything for these, if the original type mode
isn't known or can't be converted. */;
else if (REG_P (x))
{ {
cselib_val *val = cselib_lookup (x, GET_MODE (x), 0, VOIDmode); cselib_val *val = cselib_lookup (x, GET_MODE (x), 0, VOIDmode);
if (val && cselib_preserved_value_p (val)) if (val && cselib_preserved_value_p (val))
item = gen_rtx_CONCAT (GET_MODE (x), x, val->val_rtx); item = val->val_rtx;
else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT) else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT)
{ {
enum machine_mode mode = GET_MODE (x); enum machine_mode mode = GET_MODE (x);
...@@ -5749,10 +5756,7 @@ prepare_call_arguments (basic_block bb, rtx insn) ...@@ -5749,10 +5756,7 @@ prepare_call_arguments (basic_block bb, rtx insn)
val = cselib_lookup (reg, mode, 0, VOIDmode); val = cselib_lookup (reg, mode, 0, VOIDmode);
if (val && cselib_preserved_value_p (val)) if (val && cselib_preserved_value_p (val))
{ {
item = gen_rtx_CONCAT (GET_MODE (x), x, item = val->val_rtx;
lowpart_subreg (GET_MODE (x),
val->val_rtx,
mode));
break; break;
} }
} }
...@@ -5776,7 +5780,7 @@ prepare_call_arguments (basic_block bb, rtx insn) ...@@ -5776,7 +5780,7 @@ prepare_call_arguments (basic_block bb, rtx insn)
} }
val = cselib_lookup (mem, GET_MODE (mem), 0, VOIDmode); val = cselib_lookup (mem, GET_MODE (mem), 0, VOIDmode);
if (val && cselib_preserved_value_p (val)) if (val && cselib_preserved_value_p (val))
item = gen_rtx_CONCAT (GET_MODE (x), copy_rtx (x), val->val_rtx); item = val->val_rtx;
else if (GET_MODE_CLASS (GET_MODE (mem)) != MODE_INT) else if (GET_MODE_CLASS (GET_MODE (mem)) != MODE_INT)
{ {
/* For non-integer stack argument see also if they weren't /* For non-integer stack argument see also if they weren't
...@@ -5787,15 +5791,22 @@ prepare_call_arguments (basic_block bb, rtx insn) ...@@ -5787,15 +5791,22 @@ prepare_call_arguments (basic_block bb, rtx insn)
val = cselib_lookup (adjust_address_nv (mem, imode, 0), val = cselib_lookup (adjust_address_nv (mem, imode, 0),
imode, 0, VOIDmode); imode, 0, VOIDmode);
if (val && cselib_preserved_value_p (val)) if (val && cselib_preserved_value_p (val))
item = gen_rtx_CONCAT (GET_MODE (x), copy_rtx (x), item = lowpart_subreg (GET_MODE (x), val->val_rtx,
lowpart_subreg (GET_MODE (x), imode);
val->val_rtx,
imode));
} }
} }
} }
if (item) if (item)
call_arguments = gen_rtx_EXPR_LIST (VOIDmode, item, call_arguments); {
rtx x2 = x;
if (GET_MODE (item) != GET_MODE (link))
item = lowpart_subreg (GET_MODE (link), item, GET_MODE (item));
if (GET_MODE (x2) != GET_MODE (link))
x2 = lowpart_subreg (GET_MODE (link), x2, GET_MODE (x2));
item = gen_rtx_CONCAT (GET_MODE (link), x2, item);
call_arguments
= gen_rtx_EXPR_LIST (VOIDmode, item, call_arguments);
}
if (t && t != void_list_node) if (t && t != void_list_node)
{ {
tree argtype = TREE_VALUE (t); tree argtype = TREE_VALUE (t);
......
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