c++: only cache constexpr calls that are constant exprs
[official-gcc.git] / config / cet.m4
blob7718be1afe891196b9d0547fa4c13d3dbb70b137
1 dnl
2 dnl GCC_CET_FLAGS
3 dnl    (SHELL-CODE_HANDLER)
4 dnl
5 AC_DEFUN([GCC_CET_FLAGS],[dnl
6 GCC_ENABLE(cet, auto, ,[enable Intel CET in target libraries],
7            permit yes|no|auto)
8 AC_MSG_CHECKING([for CET support])
10 # NB: Avoid nested save_CFLAGS and save_LDFLAGS.
11 case "$host" in
12   i[[34567]]86-*-linux* | x86_64-*-linux*)
13     case "$enable_cet" in
14       auto)
15         # Check if target supports multi-byte NOPs
16         # and if compiler and assembler support CET insn.
17         cet_save_CFLAGS="$CFLAGS"
18         CFLAGS="$CFLAGS -fcf-protection"
19         AC_COMPILE_IFELSE(
20          [AC_LANG_PROGRAM(
21           [],
22           [
23 #if !defined(__SSE2__)
24 #error target does not support multi-byte NOPs
25 #else
26 asm ("setssbsy");
27 #endif
28           ])],
29          [enable_cet=yes],
30          [enable_cet=no])
31         CFLAGS="$cet_save_CFLAGS"
32         ;;
33       yes)
34         # Check if assembler supports CET.
35         AC_COMPILE_IFELSE(
36          [AC_LANG_PROGRAM(
37           [],
38           [asm ("setssbsy");])],
39          [],
40          [AC_MSG_ERROR([assembler with CET support is required for --enable-cet])])
41         ;;
42     esac
43     ;;
44   *)
45     enable_cet=no
46     ;;
47 esac
48 if test x$enable_cet = xyes; then
49   $1="-fcf-protection -mshstk"
50   AC_MSG_RESULT([yes])
51 else
52   AC_MSG_RESULT([no])
56 dnl
57 dnl GCC_CET_HOST_FLAGS
58 dnl    (SHELL-CODE_HANDLER)
59 dnl
60 AC_DEFUN([GCC_CET_HOST_FLAGS],[dnl
61 GCC_ENABLE(cet, auto, ,[enable Intel CET in host libraries],
62            permit yes|no|auto)
63 AC_MSG_CHECKING([for CET support])
65 case "$host" in
66   i[[34567]]86-*-linux* | x86_64-*-linux*)
67     may_have_cet=yes
68     cet_save_CFLAGS="$CFLAGS"
69     CFLAGS="$CFLAGS -fcf-protection"
70     case "$enable_cet" in
71       auto)
72         # Check if target supports multi-byte NOPs
73         # and if compiler and assembler support CET.
74         AC_COMPILE_IFELSE(
75          [AC_LANG_PROGRAM(
76           [],
77           [
78 #if !defined(__SSE2__)
79 #error target does not support multi-byte NOPs
80 #else
81 asm ("setssbsy");
82 #endif
83           ])],
84          [enable_cet=yes],
85          [enable_cet=no])
86         ;;
87       yes)
88         # Check if compiler and assembler support CET.
89         AC_COMPILE_IFELSE(
90          [AC_LANG_PROGRAM(
91           [],
92           [asm ("setssbsy");])],
93          [support_cet=yes],
94          [support_cet=no])
95         if test $support_cet = "no"; then
96           if test x$enable_bootstrap != xno \
97              && test -z "${with_build_subdir}" \
98              && (test ! -f ../stage_current \
99                  || test `cat ../stage_current` != "stage1"); then
100             # Require CET support only for the final GCC build.
101             AC_MSG_ERROR([compiler and assembler with CET support are required for --enable-cet])
102           else
103             # Don't enable CET without CET support for non-bootstrap
104             # build, in stage1 nor for build support.
105             enable_cet=no
106           fi
107         fi
108         ;;
109     esac
110     CFLAGS="$cet_save_CFLAGS"
111     ;;
112   *)
113     may_have_cet=no
114     enable_cet=no
115     ;;
116 esac
118 cet_save_CFLAGS="$CFLAGS"
119 CFLAGS="$CFLAGS -fcf-protection=none"
120 cet_save_LDFLAGS="$LDFLAGS"
121 LDFLAGS="$LDFLAGS -Wl,-z,ibt,-z,shstk"
122 if test x$may_have_cet = xyes; then
123   # Check whether -fcf-protection=none -Wl,-z,ibt,-z,shstk work.
124   AC_TRY_LINK(
125     [],[return 0;],
126     [may_have_cet=yes],
127     [may_have_cet=no])
130 if test x$may_have_cet = xyes; then
131   if test x$cross_compiling = xno; then
132     AC_TRY_RUN([
134 main ()
136   asm ("endbr32");
137   return 0;
139     ],
140     [have_multi_byte_nop=yes],
141     [have_multi_byte_nop=no])
142     have_cet=no
143     if test x$have_multi_byte_nop = xyes; then
144       AC_TRY_RUN([
145 static void
146 foo (void)
150 static void
151 __attribute__ ((noinline, noclone))
152 xxx (void (*f) (void))
154   f ();
157 static void
158 __attribute__ ((noinline, noclone))
159 bar (void)
161   xxx (foo);
165 main ()
167   bar ();
168   return 0;
170       ],
171       [have_cet=no],
172       [have_cet=yes])
173     fi
174     if test x$enable_cet = xno -a x$have_cet = xyes; then
175       AC_MSG_ERROR([Intel CET must be enabled on Intel CET enabled host])
176     fi
177   fi
178 else
179   # Enable CET in cross compiler if possible so that it will run on both
180   # CET and non-CET hosts.
181   have_cet=yes
183 if test x$enable_cet = xyes; then
184   $1="-fcf-protection"
185   AC_MSG_RESULT([yes])
186 else
187   AC_MSG_RESULT([no])
189 CFLAGS="$cet_save_CFLAGS"
190 LDFLAGS="$cet_save_LDFLAGS"