aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2006-07-27 23:12:08 +0000
committerChristopher Faylor <cgf@gcc.gnu.org>2006-07-27 23:12:08 +0000
commitfa6adcab9d8c2ff6be87e30fb663ede9a664b9ff (patch)
tree8a8ae5d5601b225f6c7d6129e61fd25a2b15f49f
parentab7efd9148063d4bcb27ae72dd390b1c5fc18a58 (diff)
downloadgcc-fa6adcab9d8c2ff6be87e30fb663ede9a664b9ff.zip
gcc-fa6adcab9d8c2ff6be87e30fb663ede9a664b9ff.tar.gz
gcc-fa6adcab9d8c2ff6be87e30fb663ede9a664b9ff.tar.bz2
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. * testsuite/gcc.target/i386/stack-prot-kernel.c: New test. From-SVN: r115782
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.md20
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/i386/stack-prot-kernel.c12
4 files changed, 40 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 40420e0..9a2580c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2006-07-27 Carlos O'Donell <carlos@codesourcery.com>
* Makefile.in: Use mkinstalldirs.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 00e06ba..4808853 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -20393,7 +20393,15 @@
(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"
+ {
+ /* 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"
@@ -20461,7 +20469,15 @@
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}"
+ {
+ /* 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")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cc0bc14..4cfaccf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2006-07-27 Arjan van de Ven <arjan@linux.intel.com>
+
+ * gcc.target/i386/stack-prot-kernel.c: New test.
+
2006-07-27 Roger Sayle <roger@eyesopen.com>
* gcc.dg/builtins-55.c: New test case.
diff --git a/gcc/testsuite/gcc.target/i386/stack-prot-kernel.c b/gcc/testsuite/gcc.target/i386/stack-prot-kernel.c
new file mode 100644
index 0000000..94fdf4f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/stack-prot-kernel.c
@@ -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" } } */