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" } } */