From: Kaz Kojima Date: Fri, 8 Jun 2007 05:56:28 +0000 (+0000) Subject: re PR target/32163 (Compiling with stack protector causes reigster spill failure) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c7f5a2c0f397ac79449bdcf2dfb99166b1d86c80;p=thirdparty%2Fgcc.git re PR target/32163 (Compiling with stack protector causes reigster spill failure) PR target/32163 Backport from mainline. * config/sh/sh.md (symGOT_load): Don't schedule insns when the symbol is generated with the stack protector. From-SVN: r125559 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7abb4246f5ce..b8a9a69c5d3f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-06-08 Kaz Kojima + + PR target/32163 + Backport from mainline. + * config/sh/sh.md (symGOT_load): Don't schedule insns when + the symbol is generated with the stack protector. + 2007-05-31 John David Anglin Backport from mainline: diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 13ed3845cbe0..e136761ae89a 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -8287,6 +8287,20 @@ label: operands[2], gen_rtx_REG (Pmode, PIC_REG))); + /* When stack protector inserts codes after the result is set to + R0, @(rX, r12) will cause a spill failure for R0. Don't schedule + insns 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) + emit_insn (gen_blockage ()); + /* N.B. This is not constant for a GOTPLT relocation. */ mem = gen_rtx_MEM (Pmode, operands[3]); MEM_NOTRAP_P (mem) = 1;