Hi! While adjusting the PR85644 patch, I've noticed that while pretty much the whole ix86_option_override_internal works only with opts_set->x_ and opts->x_, the stack protector guard code was accessing global_options_set.x_ or using the macros that expand to global_options.x_ . While it is probably not breaking anything because the target attribute doesn't (at least so far) allow any of these options, it looks inconsistent with the rest.
So, the following patch adjusts it to do what the rest of ix86_option_override_internal is doing. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-11-22 Jakub Jelinek <ja...@redhat.com> * config/i386/i386.c (ix86_option_override_internal): For stack_protector_guard related options, use opts_set->x_ instead of global_options_set. and prefix options with opts->x_ . Move defaults for offset and reg into else block. --- gcc/config/i386/i386.c.jj 2018-11-22 10:44:32.767690142 +0100 +++ gcc/config/i386/i386.c 2018-11-22 11:35:08.294512244 +0100 @@ -4568,14 +4568,10 @@ ix86_option_override_internal (bool main opts->x_ix86_stack_protector_guard = SSP_GLOBAL; } -#ifdef TARGET_THREAD_SSP_OFFSET - ix86_stack_protector_guard_offset = TARGET_THREAD_SSP_OFFSET; -#endif - - if (global_options_set.x_ix86_stack_protector_guard_offset_str) + if (opts_set->x_ix86_stack_protector_guard_offset_str) { char *endp; - const char *str = ix86_stack_protector_guard_offset_str; + const char *str = opts->x_ix86_stack_protector_guard_offset_str; errno = 0; int64_t offset; @@ -4595,20 +4591,16 @@ ix86_option_override_internal (bool main error ("%qs is not a valid offset " "in -mstack-protector-guard-offset=", str); - ix86_stack_protector_guard_offset = offset; + opts->x_ix86_stack_protector_guard_offset = offset; } +#ifdef TARGET_THREAD_SSP_OFFSET + else + opts->x_ix86_stack_protector_guard_offset = TARGET_THREAD_SSP_OFFSET; +#endif - ix86_stack_protector_guard_reg = DEFAULT_TLS_SEG_REG; - - /* 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) - ix86_stack_protector_guard_reg = ADDR_SPACE_SEG_GS; - - if (global_options_set.x_ix86_stack_protector_guard_reg_str) + if (opts_set->x_ix86_stack_protector_guard_reg_str) { - const char *str = ix86_stack_protector_guard_reg_str; + const char *str = opts->x_ix86_stack_protector_guard_reg_str; addr_space_t seg = ADDR_SPACE_GENERIC; /* Discard optional register prefix. */ @@ -4626,9 +4618,19 @@ ix86_option_override_internal (bool main if (seg == ADDR_SPACE_GENERIC) error ("%qs is not a valid base register " "in -mstack-protector-guard-reg=", - ix86_stack_protector_guard_reg_str); + opts->x_ix86_stack_protector_guard_reg_str); + + opts->x_ix86_stack_protector_guard_reg = seg; + } + else + { + opts->x_ix86_stack_protector_guard_reg = DEFAULT_TLS_SEG_REG; - ix86_stack_protector_guard_reg = seg; + /* 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 (opts->x_ix86_cmodel == CM_KERNEL) + opts->x_ix86_stack_protector_guard_reg = ADDR_SPACE_SEG_GS; } /* Handle -mmemcpy-strategy= and -mmemset-strategy= */ Jakub