config/debuginfod: do not include pkg.m4 directly
[deliverable/binutils-gdb.git] / config / cet.m4
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])
9
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])
53 fi
54 ])
55
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])
64
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
117
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])
128 fi
129
130 if test x$may_have_cet = xyes; then
131 if test x$cross_compiling = xno; then
132 AC_TRY_RUN([
133 static void
134 foo (void)
135 {
136 }
137
138 static void
139 __attribute__ ((noinline, noclone))
140 xxx (void (*f) (void))
141 {
142 f ();
143 }
144
145 static void
146 __attribute__ ((noinline, noclone))
147 bar (void)
148 {
149 xxx (foo);
150 }
151
152 int
153 main ()
154 {
155 bar ();
156 return 0;
157 }
158 ],
159 [have_cet=no],
160 [have_cet=yes])
161 if test x$enable_cet = xno -a x$have_cet = xyes; then
162 AC_MSG_ERROR([Intel CET must be enabled on Intel CET enabled host])
163 fi
164 fi
165 else
166 # Enable CET in cross compiler if possible so that it will run on both
167 # CET and non-CET hosts.
168 have_cet=yes
169 fi
170 if test x$enable_cet = xyes; then
171 $1="-fcf-protection"
172 AC_MSG_RESULT([yes])
173 else
174 AC_MSG_RESULT([no])
175 fi
176 CFLAGS="$cet_save_CFLAGS"
177 LDFLAGS="$cet_save_LDFLAGS"
178 ])
This page took 0.032063 seconds and 4 git commands to generate.