Hi!

As I wrote in the PR, before PR81708 commits,
while i386 defaulted to SSP_TLS rather than SSP_GLOBAL on everything but
Android, the -mstack-protector-guard= switch controlled pretty much
whether the i386.md special stack protector patterns are used (if tls)
or whether generic code is used (global).  These special stack protector
patterns did one thing if TARGET_THREAD_SSP_OFFSET macro was defined
(only defined on glibc targets) - code like:
        movq    %fs:40, %rax
        movq    %rax, -8(%rbp)
        xorl    %eax, %eax
in the prologue and
        movq    -8(%rbp), %rdx
        xorq    %fs:40, %rdx
        je      .L4
in the epilogue.  If TARGET_THREAD_SSP_OFFSET macro wasn't defined, it would
do instead:
        movq    .refptr.__stack_chk_guard(%rip), %rax
        movq    (%rax), %rcx
        movq    %rcx, -8(%rbp)
        xorl    %ecx, %ecx
and
        movq    .refptr.__stack_chk_guard(%rip), %rdx
        movq    -8(%rbp), %rcx
        xorq    (%rdx), %rcx
        je      .L4
(this is taken from 7.x cross to mingw).
Finally, for Android or when -mstack-protector-guard=global was used, it
emitted:
        movq    __stack_chk_guard(%rip), %rax
        movq    %rax, -8(%rbp)
and
        movq    __stack_chk_guard(%rip), %rdx
        cmpq    %rdx, %rcx
        je      .L4
Note, apart from OS specific details, those =global sequences are similar
to the =tls ones when TARGET_THREAD_SSP_OFFSET is not defined, the main
difference is that the =tls ones are more secure as they clear registers
containing the guard as quickly as possible.  The PR81708 changes dropped
the non-tls special stack_protector_* patterns from i386.md and now =tls
implies really tls, but the default remained, so mingw32 or darwin still
default to tls and just use 0 offset by default.

So, this patch changes the default for mingw32, darwin and everything else
except gnu-user*.h to be =global, and just forces those special i386.md
more secure patterns unconditionally (slightly changing the generated code
on Android, but it is one extra insn in prologue and one fewer in the
epilogue).

With this patch -mstack-protector-guard=tls is really for tls and =global
for pure var access and user can override the defaults on non-glibc targets,
but they should get a default that works there.

Bootstrapped/regtested on x86_64-linux and i686-linux, plus tested with a
cross to mingw, ok for trunk?

2018-11-21  Jakub Jelinek  <ja...@redhat.com>

        PR target/85644
        PR target/86832
        * config/i386/i386.c (ix86_option_override_internal): Default
        ix86_stack_protector_guard to SSP_TLS only if TARGET_THREAD_SSP_OFFSET
        is defined.
        * config/i386/i386.md (stack_protect_set, stack_protect_set_<mode>,
        stack_protect_test, stack_protect_test_<mode>): Use empty condition
        instead of TARGET_SSP_TLS_GUARD.

--- gcc/config/i386/i386.c.jj   2018-11-20 21:39:00.905577452 +0100
+++ gcc/config/i386/i386.c      2018-11-21 18:02:49.448049161 +0100
@@ -4557,8 +4557,13 @@ ix86_option_override_internal (bool main
 
   /* Handle stack protector */
   if (!opts_set->x_ix86_stack_protector_guard)
-    opts->x_ix86_stack_protector_guard
-      = TARGET_HAS_BIONIC ? SSP_GLOBAL : SSP_TLS;
+    {
+      opts->x_ix86_stack_protector_guard = SSP_GLOBAL;
+#ifdef TARGET_THREAD_SSP_OFFSET
+      if (!TARGET_HAS_BIONIC)
+       opts->x_ix86_stack_protector_guard = SSP_TLS;
+#endif
+    }
 
 #ifdef TARGET_THREAD_SSP_OFFSET
   ix86_stack_protector_guard_offset = TARGET_THREAD_SSP_OFFSET;
--- gcc/config/i386/i386.md.jj  2018-11-21 11:45:12.090721862 +0100
+++ gcc/config/i386/i386.md     2018-11-21 18:03:46.166119350 +0100
@@ -19010,7 +19010,7 @@ (define_insn "*prefetch_prefetchwt1"
 (define_expand "stack_protect_set"
   [(match_operand 0 "memory_operand")
    (match_operand 1 "memory_operand")]
-  "TARGET_SSP_TLS_GUARD"
+  ""
 {
   rtx (*insn)(rtx, rtx);
 
@@ -19028,7 +19028,7 @@ (define_insn "stack_protect_set_<mode>"
                    UNSPEC_SP_SET))
    (set (match_scratch:PTR 2 "=&r") (const_int 0))
    (clobber (reg:CC FLAGS_REG))]
-  "TARGET_SSP_TLS_GUARD"
+  ""
   "mov{<imodesuffix>}\t{%1, %2|%2, %1}\;mov{<imodesuffix>}\t{%2, %0|%0, 
%2}\;xor{l}\t%k2, %k2"
   [(set_attr "type" "multi")])
 
@@ -19036,7 +19036,7 @@ (define_expand "stack_protect_test"
   [(match_operand 0 "memory_operand")
    (match_operand 1 "memory_operand")
    (match_operand 2)]
-  "TARGET_SSP_TLS_GUARD"
+  ""
 {
   rtx flags = gen_rtx_REG (CCZmode, FLAGS_REG);
 
@@ -19059,7 +19059,7 @@ (define_insn "stack_protect_test_<mode>"
                     (match_operand:PTR 2 "memory_operand" "m")]
                    UNSPEC_SP_TEST))
    (clobber (match_scratch:PTR 3 "=&r"))]
-  "TARGET_SSP_TLS_GUARD"
+  ""
   "mov{<imodesuffix>}\t{%1, %3|%3, %1}\;xor{<imodesuffix>}\t{%2, %3|%3, %2}"
   [(set_attr "type" "multi")])
 

        Jakub

Reply via email to