On Thu, Nov 22, 2018 at 8:47 PM Jakub Jelinek <ja...@redhat.com> wrote:
>
> 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.

OK.

Thanks,
Uros.

> --- 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

Reply via email to