]>
Commit | Line | Data |
---|---|---|
bf41f30d NC |
1 | dnl |
2 | dnl GCC_CET_FLAGS | |
3 | dnl (SHELL-CODE_HANDLER) | |
4 | dnl | |
5 | AC_DEFUN([GCC_CET_FLAGS],[dnl | |
56770bda | 6 | GCC_ENABLE(cet, auto, ,[enable Intel CET in target libraries], |
37f980dc | 7 | permit yes|no|auto) |
552d4da4 L |
8 | AC_MSG_CHECKING([for CET support]) |
9 | ||
727b7b18 | 10 | # NB: Avoid nested save_CFLAGS and save_LDFLAGS. |
bf41f30d NC |
11 | case "$host" in |
12 | i[[34567]]86-*-linux* | x86_64-*-linux*) | |
13 | case "$enable_cet" in | |
37f980dc | 14 | auto) |
552d4da4 | 15 | # Check if target supports multi-byte NOPs |
7ade7fba | 16 | # and if compiler and assembler support CET insn. |
727b7b18 | 17 | cet_save_CFLAGS="$CFLAGS" |
56770bda | 18 | CFLAGS="$CFLAGS -fcf-protection" |
bf41f30d NC |
19 | AC_COMPILE_IFELSE( |
20 | [AC_LANG_PROGRAM( | |
21 | [], | |
552d4da4 L |
22 | [ |
23 | #if !defined(__SSE2__) | |
24 | #error target does not support multi-byte NOPs | |
25 | #else | |
26 | asm ("setssbsy"); | |
27 | #endif | |
28 | ])], | |
bf41f30d NC |
29 | [enable_cet=yes], |
30 | [enable_cet=no]) | |
727b7b18 | 31 | CFLAGS="$cet_save_CFLAGS" |
bf41f30d NC |
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 | |
37f980dc | 49 | $1="-fcf-protection -mshstk" |
552d4da4 L |
50 | AC_MSG_RESULT([yes]) |
51 | else | |
52 | AC_MSG_RESULT([no]) | |
bf41f30d NC |
53 | fi |
54 | ]) | |
87c66b2e L |
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 | |
727b7b18 | 68 | cet_save_CFLAGS="$CFLAGS" |
87c66b2e L |
69 | CFLAGS="$CFLAGS -fcf-protection" |
70 | case "$enable_cet" in | |
71 | auto) | |
72 | # Check if target supports multi-byte NOPs | |
7ade7fba | 73 | # and if compiler and assembler support CET. |
87c66b2e L |
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) | |
7ade7fba | 88 | # Check if compiler and assembler support CET. |
87c66b2e L |
89 | AC_COMPILE_IFELSE( |
90 | [AC_LANG_PROGRAM( | |
91 | [], | |
92 | [asm ("setssbsy");])], | |
7ade7fba AM |
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 | |
87c66b2e L |
108 | ;; |
109 | esac | |
727b7b18 | 110 | CFLAGS="$cet_save_CFLAGS" |
87c66b2e L |
111 | ;; |
112 | *) | |
113 | may_have_cet=no | |
114 | enable_cet=no | |
115 | ;; | |
116 | esac | |
117 | ||
727b7b18 | 118 | cet_save_CFLAGS="$CFLAGS" |
87c66b2e | 119 | CFLAGS="$CFLAGS -fcf-protection=none" |
727b7b18 | 120 | cet_save_LDFLAGS="$LDFLAGS" |
87c66b2e L |
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 | |
90d00bbd L |
131 | if test x$cross_compiling = xno; then |
132 | AC_TRY_RUN([ | |
87c66b2e L |
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 | } | |
90d00bbd L |
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 | |
87c66b2e | 164 | fi |
90d00bbd L |
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 | |
87c66b2e L |
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 | |
727b7b18 L |
176 | CFLAGS="$cet_save_CFLAGS" |
177 | LDFLAGS="$cet_save_LDFLAGS" | |
87c66b2e | 178 | ]) |