File stack-protect-kernel.patch of Package gcc41

2006-07-27  Arjan van de Ven <arjan@linux.intel.com>
 
 	* config/i386/i386.md (stack_tls_protect_set_di) Use %gs rather than
 	%fs for -mcmodel=kernel.
 	(stack_tls_protect_test_di): Likewise.
 
 	* gcc.target/i386/stack-prot-kernel.c: New test.
 
Index: gcc/config/i386/i386.md
===================================================================
*** gcc/config/i386/i386.md	(revision 116239)
--- gcc/config/i386/i386.md	(working copy)
*************** (define_insn "stack_tls_protect_set_di"
*** 20212,20218 ****
     (set (match_scratch:DI 2 "=&r") (const_int 0))
     (clobber (reg:CC FLAGS_REG))]
    "TARGET_64BIT"
!   "mov{q}\t{%%fs:%P1, %2|%2, QWORD PTR %%fs:%P1}\;mov{q}\t{%2, %0|%0, %2}\;xor{l}\t%k2, %k2"
    [(set_attr "type" "multi")])
  
  (define_expand "stack_protect_test"
--- 20212,20226 ----
     (set (match_scratch:DI 2 "=&r") (const_int 0))
     (clobber (reg:CC FLAGS_REG))]
    "TARGET_64BIT"
!   {
!      /* The kernel uses a different segment register for performance reasons; a
!         system call would not have to trash the userspace segment register,
!         which would be expensive */
!      if (ix86_cmodel != CM_KERNEL)
!         return "mov{q}\t{%%fs:%P1, %2|%2, QWORD PTR %%fs:%P1}\;mov{q}\t{%2, %0|%0, %2}\;xor{l}\t%k2, %k2";
!      else
!         return "mov{q}\t{%%gs:%P1, %2|%2, QWORD PTR %%gs:%P1}\;mov{q}\t{%2, %0|%0, %2}\;xor{l}\t%k2, %k2";
!   }
    [(set_attr "type" "multi")])
  
  (define_expand "stack_protect_test"
*************** (define_insn "stack_tls_protect_test_di"
*** 20280,20286 ****
  		    UNSPEC_SP_TLS_TEST))
     (clobber (match_scratch:DI 3 "=r"))]
    "TARGET_64BIT"
!   "mov{q}\t{%1, %3|%3, %1}\;xor{q}\t{%%fs:%P2, %3|%3, QWORD PTR %%fs:%P2}"
    [(set_attr "type" "multi")])
  
  (include "sse.md")
--- 20288,20302 ----
  		    UNSPEC_SP_TLS_TEST))
     (clobber (match_scratch:DI 3 "=r"))]
    "TARGET_64BIT"
!   {
!      /* The kernel uses a different segment register for performance reasons; a
!         system call would not have to trash the userspace segment register,
!         which would be expensive */
!      if (ix86_cmodel != CM_KERNEL)
!         return "mov{q}\t{%1, %3|%3, %1}\;xor{q}\t{%%fs:%P2, %3|%3, QWORD PTR %%fs:%P2}";
!      else
!         return "mov{q}\t{%1, %3|%3, %1}\;xor{q}\t{%%gs:%P2, %3|%3, QWORD PTR %%gs:%P2}";
!   }
    [(set_attr "type" "multi")])
  
  (include "sse.md")
--- /dev/null	2006-05-02 08:45:04.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/stack-prot-kernel.c	2006-08-18 17:42:47.000000000 +0200
@@ -0,0 +1,12 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O2 -fstack-protector-all -mcmodel=kernel" } */
+
+void test1 (int x)
+{
+  char p[40];
+  int i;
+  for (i=0; i<40; i++)
+	p[i] = x;
+}
+
+/* { dg-final { scan-assembler-not "%fs" } } */
openSUSE Build Service is sponsored by