123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- dnl
- dnl GCC_CET_FLAGS
- dnl (SHELL-CODE_HANDLER)
- dnl
- AC_DEFUN([GCC_CET_FLAGS],[dnl
- GCC_ENABLE(cet, auto, ,[enable Intel CET in target libraries],
- permit yes|no|auto)
- AC_MSG_CHECKING([for CET support])
- # NB: Avoid nested save_CFLAGS and save_LDFLAGS.
- case "$host" in
- i[[34567]]86-*-linux* | x86_64-*-linux*)
- case "$enable_cet" in
- auto)
- # Check if target supports multi-byte NOPs
- # and if compiler and assembler support CET insn.
- cet_save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fcf-protection"
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM(
- [],
- [
- #if !defined(__SSE2__)
- #error target does not support multi-byte NOPs
- #else
- asm ("setssbsy");
- #endif
- ])],
- [enable_cet=yes],
- [enable_cet=no])
- CFLAGS="$cet_save_CFLAGS"
- ;;
- yes)
- # Check if assembler supports CET.
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM(
- [],
- [asm ("setssbsy");])],
- [],
- [AC_MSG_ERROR([assembler with CET support is required for --enable-cet])])
- ;;
- esac
- ;;
- *)
- enable_cet=no
- ;;
- esac
- if test x$enable_cet = xyes; then
- $1="-fcf-protection -mshstk"
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- fi
- ])
- dnl
- dnl GCC_CET_HOST_FLAGS
- dnl (SHELL-CODE_HANDLER)
- dnl
- AC_DEFUN([GCC_CET_HOST_FLAGS],[dnl
- GCC_ENABLE(cet, auto, ,[enable Intel CET in host libraries],
- permit yes|no|auto)
- AC_MSG_CHECKING([for CET support])
- case "$host" in
- i[[34567]]86-*-linux* | x86_64-*-linux*)
- may_have_cet=yes
- cet_save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fcf-protection"
- case "$enable_cet" in
- auto)
- # Check if target supports multi-byte NOPs
- # and if compiler and assembler support CET.
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM(
- [],
- [
- #if !defined(__SSE2__)
- #error target does not support multi-byte NOPs
- #else
- asm ("setssbsy");
- #endif
- ])],
- [enable_cet=yes],
- [enable_cet=no])
- ;;
- yes)
- # Check if compiler and assembler support CET.
- AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM(
- [],
- [asm ("setssbsy");])],
- [support_cet=yes],
- [support_cet=no])
- if test $support_cet = "no"; then
- if test x$enable_bootstrap != xno \
- && test -z "${with_build_subdir}" \
- && (test ! -f ../stage_current \
- || test `cat ../stage_current` != "stage1"); then
- # Require CET support only for the final GCC build.
- AC_MSG_ERROR([compiler and assembler with CET support are required for --enable-cet])
- else
- # Don't enable CET without CET support for non-bootstrap
- # build, in stage1 nor for build support.
- enable_cet=no
- fi
- fi
- ;;
- esac
- CFLAGS="$cet_save_CFLAGS"
- ;;
- *)
- may_have_cet=no
- enable_cet=no
- ;;
- esac
- cet_save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fcf-protection=none"
- cet_save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -Wl,-z,ibt,-z,shstk"
- if test x$may_have_cet = xyes; then
- # Check whether -fcf-protection=none -Wl,-z,ibt,-z,shstk work.
- AC_TRY_LINK(
- [],[return 0;],
- [may_have_cet=yes],
- [may_have_cet=no])
- fi
- if test x$may_have_cet = xyes; then
- if test x$cross_compiling = xno; then
- AC_TRY_RUN([
- int
- main ()
- {
- asm ("endbr32");
- return 0;
- }
- ],
- [have_multi_byte_nop=yes],
- [have_multi_byte_nop=no])
- have_cet=no
- if test x$have_multi_byte_nop = xyes; then
- AC_TRY_RUN([
- static void
- foo (void)
- {
- }
- static void
- __attribute__ ((noinline, noclone))
- xxx (void (*f) (void))
- {
- f ();
- }
- static void
- __attribute__ ((noinline, noclone))
- bar (void)
- {
- xxx (foo);
- }
- int
- main ()
- {
- bar ();
- return 0;
- }
- ],
- [have_cet=no],
- [have_cet=yes])
- fi
- if test x$enable_cet = xno -a x$have_cet = xyes; then
- AC_MSG_ERROR([Intel CET must be enabled on Intel CET enabled host])
- fi
- fi
- else
- # Enable CET in cross compiler if possible so that it will run on both
- # CET and non-CET hosts.
- have_cet=yes
- fi
- if test x$enable_cet = xyes; then
- $1="-fcf-protection"
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- fi
- CFLAGS="$cet_save_CFLAGS"
- LDFLAGS="$cet_save_LDFLAGS"
- ])
|