mirror of git://gcc.gnu.org/git/gcc.git
re PR target/65249 (unable to find a register to spill in class 'R0_REGS' when compiling protobuf on sh4)
PR target/65249 * config/sh/sh.md (symGOT_load): Use R0 reg for operands[2] when called for __stack_chk_guard symbol. From-SVN: r221165
This commit is contained in:
parent
f6115d44cc
commit
ac841cf7d0
|
|
@ -1,3 +1,9 @@
|
||||||
|
2015-03-03 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR target/65249
|
||||||
|
* config/sh/sh.md (symGOT_load): Use R0 reg for operands[2] when
|
||||||
|
called for __stack_chk_guard symbol.
|
||||||
|
|
||||||
2015-03-03 DJ Delorie <dj@redhat.com>
|
2015-03-03 DJ Delorie <dj@redhat.com>
|
||||||
|
|
||||||
* config/rl78/rl78-real.md (*addqi_real): Allow SADDR types for
|
* config/rl78/rl78-real.md (*addqi_real): Allow SADDR types for
|
||||||
|
|
|
||||||
|
|
@ -10690,10 +10690,26 @@ label:
|
||||||
""
|
""
|
||||||
{
|
{
|
||||||
rtx mem;
|
rtx mem;
|
||||||
|
bool stack_chk_guard_p = false;
|
||||||
|
|
||||||
operands[2] = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
|
operands[2] = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
|
||||||
operands[3] = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
|
operands[3] = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
|
||||||
|
|
||||||
|
if (!TARGET_SHMEDIA
|
||||||
|
&& flag_stack_protect
|
||||||
|
&& GET_CODE (operands[1]) == CONST
|
||||||
|
&& GET_CODE (XEXP (operands[1], 0)) == UNSPEC
|
||||||
|
&& GET_CODE (XVECEXP (XEXP (operands[1], 0), 0, 0)) == SYMBOL_REF
|
||||||
|
&& strcmp (XSTR (XVECEXP (XEXP (operands[1], 0), 0, 0), 0),
|
||||||
|
"__stack_chk_guard") == 0)
|
||||||
|
stack_chk_guard_p = true;
|
||||||
|
|
||||||
|
/* Use R0 to avoid long R0 liveness which stack-protector tends to
|
||||||
|
produce. */
|
||||||
|
if (! sh_lra_flag
|
||||||
|
&& stack_chk_guard_p && ! reload_in_progress && ! reload_completed)
|
||||||
|
operands[2] = gen_rtx_REG (Pmode, R0_REG);
|
||||||
|
|
||||||
if (TARGET_SHMEDIA)
|
if (TARGET_SHMEDIA)
|
||||||
{
|
{
|
||||||
rtx reg = operands[2];
|
rtx reg = operands[2];
|
||||||
|
|
@ -10721,13 +10737,7 @@ label:
|
||||||
insn to avoid combining (set A (plus rX r12)) and (set op0 (mem A))
|
insn to avoid combining (set A (plus rX r12)) and (set op0 (mem A))
|
||||||
when rX is a GOT address for the guard symbol. Ugly but doesn't
|
when rX is a GOT address for the guard symbol. Ugly but doesn't
|
||||||
matter because this is a rare situation. */
|
matter because this is a rare situation. */
|
||||||
if (!TARGET_SHMEDIA
|
if (stack_chk_guard_p)
|
||||||
&& flag_stack_protect
|
|
||||||
&& GET_CODE (operands[1]) == CONST
|
|
||||||
&& GET_CODE (XEXP (operands[1], 0)) == UNSPEC
|
|
||||||
&& GET_CODE (XVECEXP (XEXP (operands[1], 0), 0, 0)) == SYMBOL_REF
|
|
||||||
&& strcmp (XSTR (XVECEXP (XEXP (operands[1], 0), 0, 0), 0),
|
|
||||||
"__stack_chk_guard") == 0)
|
|
||||||
emit_insn (gen_chk_guard_add (operands[3], operands[2]));
|
emit_insn (gen_chk_guard_add (operands[3], operands[2]));
|
||||||
else
|
else
|
||||||
emit_move_insn (operands[3], gen_rtx_PLUS (Pmode, operands[2],
|
emit_move_insn (operands[3], gen_rtx_PLUS (Pmode, operands[2],
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue