On Thu, Apr 19, 2018 at 2:18 PM, Tsimbalist, Igor V
<igor.v.tsimbal...@intel.com> wrote:
>> -----Original Message-----
>> From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
>> ow...@gcc.gnu.org] On Behalf Of H.J. Lu
>> Sent: Thursday, April 19, 2018 10:02 PM
>> To: Jakub Jelinek <ja...@redhat.com>
>> Cc: Richard Biener <richard.guent...@gmail.com>; Uros Bizjak
>> <ubiz...@gmail.com>; gcc-patches@gcc.gnu.org; Tsimbalist, Igor V
>> <igor.v.tsimbal...@intel.com>
>> Subject: Re: [PATCH] x86: Allow -fcf-protection with multi-byte NOPs
>>
>> On Thu, Apr 19, 2018 at 12:25 PM, Jakub Jelinek <ja...@redhat.com>
>> wrote:
>> > On Thu, Apr 19, 2018 at 06:30:37AM -0700, H.J. Lu wrote:
>> >>       * config/i386/i386-c.c (ix86_target_macros_internal): Also
>> >>       define __IBT__ and __SHSTK__ for -fcf-protection.
>> >
>> >> --- a/gcc/config/i386/i386-c.c
>> >> +++ b/gcc/config/i386/i386-c.c
>> >> @@ -499,13 +499,15 @@ ix86_target_macros_internal (HOST_WIDE_INT
>> isa_flag,
>> >>      def_or_undef (parse_in, "__RDPID__");
>> >>    if (isa_flag & OPTION_MASK_ISA_GFNI)
>> >>      def_or_undef (parse_in, "__GFNI__");
>> >> -  if (isa_flag2 & OPTION_MASK_ISA_IBT)
>> >> +  if ((isa_flag2 & OPTION_MASK_ISA_IBT)
>> >> +      || (flag_cf_protection & CF_BRANCH))
>> >>      {
>> >>        def_or_undef (parse_in, "__IBT__");
>> >>        if (flag_cf_protection != CF_NONE)
>> >>       def_or_undef (parse_in, "__CET__");
>> >>      }
>> >> -  if (isa_flag & OPTION_MASK_ISA_SHSTK)
>> >> +  if ((isa_flag & OPTION_MASK_ISA_SHSTK)
>> >> +      || (flag_cf_protection & CF_RETURN))
>> >>      {
>> >>        def_or_undef (parse_in, "__SHSTK__");
>> >>        if (flag_cf_protection != CF_NONE)
>> >>       def_or_undef (parse_in, "__CET__");
>> >>      }
>> >
>> > This looks completely wrong to me.
>> > 1) there is no way to find out through preprocessor macros if
>> > -mibt or -mshstk was actually used or not, so e.g. if you
>> > #include <cetintrin.h>
>> > and compile with -fcf-protection -mno-cet, then
>> > #ifndef __SHSTK__
>> > #pragma GCC push_options
>> > #pragma GCC target ("shstk")
>> > #define __DISABLE_SHSTK__
>> > #endif /* __SHSTK__ */
>> > will not be done and thus the intrinsics will appear to be in
>> > in the default target (-mno-cet)
>> > 2) preexisting - __CET__ is predefined twice, it should be done only
>> > once using a condition that covers all cases when the macro should be
>> > defined
>> >
>> > Don't you want to just predefine __CET__ and not __IBT__/__SHSTK__
>> > if -fcf-protection -mno-cet, to make it clear?
>> >
>>
>> We are removing -mibt:
>>
>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85469
>>
>> How about this?
>>
>>
>> diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c
>> index fa8b3682b0c..26c7641075d 100644
>> --- a/gcc/config/i386/i386-c.c
>> +++ b/gcc/config/i386/i386-c.c
>> @@ -499,20 +499,14 @@ ix86_target_macros_internal (HOST_WIDE_INT
>> isa_flag,
>>      def_or_undef (parse_in, "__RDPID__");
>>    if (isa_flag & OPTION_MASK_ISA_GFNI)
>>      def_or_undef (parse_in, "__GFNI__");
>> -  if ((isa_flag2 & OPTION_MASK_ISA_IBT)
>> -      || (flag_cf_protection & CF_BRANCH))
>> -    {
>> -      def_or_undef (parse_in, "__IBT__");
>> -      if (flag_cf_protection != CF_NONE)
>> -  def_or_undef (parse_in, "__CET__");
>> -    }
>> -  if ((isa_flag & OPTION_MASK_ISA_SHSTK)
>> -      || (flag_cf_protection & CF_RETURN))
>> -    {
>> -      def_or_undef (parse_in, "__SHSTK__");
>> -      if (flag_cf_protection != CF_NONE)
>> -  def_or_undef (parse_in, "__CET__");
>> -    }
>> +  if ((isa_flag & OPTION_MASK_ISA_SHSTK))
>> +    def_or_undef (parse_in, "__SHSTK__");
>> +  if (flag_cf_protection != CF_NONE)
>> +    def_or_undef (parse_in, "__CET__");
>> +  if ((flag_cf_protection & CF_BRANCH))
>> +    def_or_undef (parse_in, "__CET_IBT__");
>> +  if ((flag_cf_protection & CF_RETURN))
>> +    def_or_undef (parse_in, "__CET_SHSTK__");
>>    if (isa_flag2 & OPTION_MASK_ISA_VAES)
>>      def_or_undef (parse_in, "__VAES__");
>>    if (isa_flag & OPTION_MASK_ISA_VPCLMULQDQ)
>>
>> This adds __CET_IBT__ and __CET_SHSTK__.
>
> As -fcf-protection and -mcet/-mibt/-mshstk are are disjoint and
> control different parts I agree with
>
> +  if ((isa_flag & OPTION_MASK_ISA_SHSTK))
> +    def_or_undef (parse_in, "__SHSTK__");
> +  if (flag_cf_protection != CF_NONE)
> +    def_or_undef (parse_in, "__CET__");
>
> Why __CET_IBT__ and __CET_SHSTK__ are needed? Moreover the naming is
> confusing as 'IBT' and 'SHSTK' are related to HW features which are controlled
> by -m options. __CET__ seems to be enough.
>

One needs to know if IBT and SHSTK are enabled by -fcf-protection.  They will
be checked by <cet.h> and glibc.

-- 
H.J.

Reply via email to