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