------- Comment #4 from kkojima at gcc dot gnu dot org  2007-06-01 00:17 -------
In the faulty case, stack protector inserts PIC codes after the result
is set to R0 register.  It looks like

  rX = [EMAIL PROTECTED]
  A = rX + r12
  B = mem[A]

and combine optimization pass makes this turn into

  rX = [EMAIL PROTECTED]
  B = mem[rX + r12]

Unfortunately, the last insn requires R0 which is already used and we
see the famous R0 spill failure.  We didn't get this error on SH4 with
-O2 because the first insn scheduling and other optimizations move
the insn which set the result to R0 after these protector codes.
But it looks to be fragile even on SH4 -O2.  I'm testing the patch
below on the trunk.

        * config/sh/sh.md (symGOT_load): Don't schedule insns when
        the symbol is generated with the stack protector.

--- ORIG/trunk/gcc/config/sh/sh.md      2007-04-27 21:30:47.000000000 +0900
+++ LOCAL/trunk/gcc/config/sh/sh.md     2007-06-01 08:21:18.000000000 +0900
@@ -8502,6 +8502,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;


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32163

Reply via email to