diff options
author | Kaz Kojima <kkojima@gcc.gnu.org> | 2015-03-03 23:51:55 +0000 |
---|---|---|
committer | Kaz Kojima <kkojima@gcc.gnu.org> | 2015-03-03 23:51:55 +0000 |
commit | ac841cf7d0a30682ea241b5af2992a54697eebbd (patch) | |
tree | a033f8674200fb240cb399310cab5d2ce82523b9 /gcc | |
parent | f6115d44cc5053b718f77679ef98b0e93e53a78b (diff) | |
download | gcc-ac841cf7d0a30682ea241b5af2992a54697eebbd.zip gcc-ac841cf7d0a30682ea241b5af2992a54697eebbd.tar.gz gcc-ac841cf7d0a30682ea241b5af2992a54697eebbd.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/sh/sh.md | 24 |
2 files changed, 23 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 10f36fa..2108eb0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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> * config/rl78/rl78-real.md (*addqi_real): Allow SADDR types for diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 2435ec9..24ddc9e 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -10690,10 +10690,26 @@ label: "" { rtx mem; + bool stack_chk_guard_p = false; operands[2] = !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) { rtx reg = operands[2]; @@ -10721,13 +10737,7 @@ label: 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 matter because this is a rare situation. */ - 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) + if (stack_chk_guard_p) emit_insn (gen_chk_guard_add (operands[3], operands[2])); else emit_move_insn (operands[3], gen_rtx_PLUS (Pmode, operands[2], |