1dnl #
2dnl # Enabled -fsanitize=address if supported by $CC.
3dnl #
4dnl # LDFLAGS needs -fsanitize=address at all times so libraries compiled with
5dnl # it will be linked successfully. CFLAGS will vary by binary being built.
6dnl #
7dnl # The ASAN_OPTIONS environment variable can be used to further control
8dnl # the behavior of binaries and libraries build with -fsanitize=address.
9dnl #
10AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_ASAN], [
11	AC_MSG_CHECKING([whether to build with -fsanitize=address support])
12	AC_ARG_ENABLE([asan],
13		[AS_HELP_STRING([--enable-asan],
14		[Enable -fsanitize=address support  @<:@default=no@:>@])],
15		[],
16		[enable_asan=no])
17
18	AM_CONDITIONAL([ASAN_ENABLED], [test x$enable_asan = xyes])
19	AC_SUBST([ASAN_ENABLED], [$enable_asan])
20	AC_MSG_RESULT($enable_asan)
21
22	AS_IF([ test "$enable_asan" = "yes" ], [
23		AC_MSG_CHECKING([whether $CC supports -fsanitize=address])
24		saved_cflags="$CFLAGS"
25		CFLAGS="$CFLAGS -Werror -fsanitize=address"
26		AC_LINK_IFELSE([
27			AC_LANG_SOURCE([[ int main() { return 0; } ]])
28		], [
29			ASAN_CFLAGS="-fsanitize=address"
30			ASAN_LDFLAGS="-fsanitize=address"
31			ASAN_ZFS="_with_asan"
32			AC_MSG_RESULT([yes])
33		], [
34			AC_MSG_ERROR([$CC does not support -fsanitize=address])
35		])
36		CFLAGS="$saved_cflags"
37	], [
38		ASAN_CFLAGS=""
39		ASAN_LDFLAGS=""
40		ASAN_ZFS="_without_asan"
41	])
42
43	AC_SUBST([ASAN_CFLAGS])
44	AC_SUBST([ASAN_LDFLAGS])
45	AC_SUBST([ASAN_ZFS])
46])
47
48dnl #
49dnl # Enabled -fsanitize=undefined if supported by cc.
50dnl #
51dnl # LDFLAGS needs -fsanitize=undefined at all times so libraries compiled with
52dnl # it will be linked successfully. CFLAGS will vary by binary being built.
53dnl #
54dnl # The UBSAN_OPTIONS environment variable can be used to further control
55dnl # the behavior of binaries and libraries build with -fsanitize=undefined.
56dnl #
57AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_UBSAN], [
58	AC_MSG_CHECKING([whether to build with -fsanitize=undefined support])
59	AC_ARG_ENABLE([ubsan],
60		[AS_HELP_STRING([--enable-ubsan],
61		[Enable -fsanitize=undefined support  @<:@default=no@:>@])],
62		[],
63		[enable_ubsan=no])
64
65	AM_CONDITIONAL([UBSAN_ENABLED], [test x$enable_ubsan = xyes])
66	AC_SUBST([UBSAN_ENABLED], [$enable_ubsan])
67	AC_MSG_RESULT($enable_ubsan)
68
69	AS_IF([ test "$enable_ubsan" = "yes" ], [
70		AC_MSG_CHECKING([whether $CC supports -fsanitize=undefined])
71		saved_cflags="$CFLAGS"
72		CFLAGS="$CFLAGS -Werror -fsanitize=undefined"
73		AC_LINK_IFELSE([
74			AC_LANG_SOURCE([[ int main() { return 0; } ]])
75		], [
76			UBSAN_CFLAGS="-fsanitize=undefined"
77			UBSAN_LDFLAGS="-fsanitize=undefined"
78			UBSAN_ZFS="_with_ubsan"
79			AC_MSG_RESULT([yes])
80		], [
81			AC_MSG_ERROR([$CC does not support -fsanitize=undefined])
82		])
83		CFLAGS="$saved_cflags"
84	], [
85		UBSAN_CFLAGS=""
86		UBSAN_LDFLAGS=""
87		UBSAN_ZFS="_without_ubsan"
88	])
89
90	AC_SUBST([UBSAN_CFLAGS])
91	AC_SUBST([UBSAN_LDFLAGS])
92	AC_SUBST([UBSAN_ZFS])
93])
94
95dnl #
96dnl # Check if cc supports -Wframe-larger-than=<size> option.
97dnl #
98AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN], [
99	AC_MSG_CHECKING([whether $CC supports -Wframe-larger-than=<size>])
100
101	saved_flags="$CFLAGS"
102	CFLAGS="$CFLAGS -Werror -Wframe-larger-than=4096"
103
104	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
105		FRAME_LARGER_THAN="-Wframe-larger-than=4096"
106		AC_MSG_RESULT([yes])
107	], [
108		FRAME_LARGER_THAN=""
109		AC_MSG_RESULT([no])
110	])
111
112	CFLAGS="$saved_flags"
113	AC_SUBST([FRAME_LARGER_THAN])
114])
115
116dnl #
117dnl # Check if cc supports -Wno-format-truncation option.
118dnl #
119AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION], [
120	AC_MSG_CHECKING([whether $CC supports -Wno-format-truncation])
121
122	saved_flags="$CFLAGS"
123	CFLAGS="$CFLAGS -Werror -Wno-format-truncation"
124
125	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
126		NO_FORMAT_TRUNCATION=-Wno-format-truncation
127		AC_MSG_RESULT([yes])
128	], [
129		NO_FORMAT_TRUNCATION=
130		AC_MSG_RESULT([no])
131	])
132
133	CFLAGS="$saved_flags"
134	AC_SUBST([NO_FORMAT_TRUNCATION])
135])
136
137dnl #
138dnl # Check if cc supports -Wno-format-zero-length option.
139dnl #
140AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH], [
141	AC_MSG_CHECKING([whether $CC supports -Wno-format-zero-length])
142
143	saved_flags="$CFLAGS"
144	CFLAGS="$CFLAGS -Werror -Wno-format-zero-length"
145
146	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
147		NO_FORMAT_ZERO_LENGTH=-Wno-format-zero-length
148		AC_MSG_RESULT([yes])
149	], [
150		NO_FORMAT_ZERO_LENGTH=
151		AC_MSG_RESULT([no])
152	])
153
154	CFLAGS="$saved_flags"
155	AC_SUBST([NO_FORMAT_ZERO_LENGTH])
156])
157
158dnl #
159dnl # Check if cc supports -Wno-clobbered option.
160dnl #
161dnl # We actually invoke it with the -Wclobbered option
162dnl # and infer the 'no-' version does or doesn't exist based upon
163dnl # the results.  This is required because when checking any of
164dnl # no- prefixed options gcc always returns success.
165dnl #
166AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED], [
167	AC_MSG_CHECKING([whether $CC supports -Wno-clobbered])
168
169	saved_flags="$CFLAGS"
170	CFLAGS="$CFLAGS -Werror -Wclobbered"
171
172	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
173		NO_CLOBBERED=-Wno-clobbered
174		AC_MSG_RESULT([yes])
175	], [
176		NO_CLOBBERED=
177		AC_MSG_RESULT([no])
178	])
179
180	CFLAGS="$saved_flags"
181	AC_SUBST([NO_CLOBBERED])
182])
183
184dnl #
185dnl # Check if cc supports -Wimplicit-fallthrough option.
186dnl #
187AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH], [
188	AC_MSG_CHECKING([whether $CC supports -Wimplicit-fallthrough])
189
190	saved_flags="$CFLAGS"
191	CFLAGS="$CFLAGS -Werror -Wimplicit-fallthrough"
192
193	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
194		IMPLICIT_FALLTHROUGH=-Wimplicit-fallthrough
195		AC_DEFINE([HAVE_IMPLICIT_FALLTHROUGH], 1,
196			[Define if compiler supports -Wimplicit-fallthrough])
197		AC_MSG_RESULT([yes])
198	], [
199		IMPLICIT_FALLTHROUGH=
200		AC_MSG_RESULT([no])
201	])
202
203	CFLAGS="$saved_flags"
204	AC_SUBST([IMPLICIT_FALLTHROUGH])
205])
206
207dnl #
208dnl # Check if cc supports -Winfinite-recursion option.
209dnl #
210AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION], [
211	AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion])
212
213	saved_flags="$CFLAGS"
214	CFLAGS="$CFLAGS -Werror -Winfinite-recursion"
215
216	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
217		INFINITE_RECURSION=-Winfinite-recursion
218		AC_DEFINE([HAVE_INFINITE_RECURSION], 1,
219			[Define if compiler supports -Winfinite-recursion])
220		AC_MSG_RESULT([yes])
221	], [
222		INFINITE_RECURSION=
223		AC_MSG_RESULT([no])
224	])
225
226	CFLAGS="$saved_flags"
227	AC_SUBST([INFINITE_RECURSION])
228])
229
230dnl #
231dnl # Check if cc supports -fno-omit-frame-pointer option.
232dnl #
233AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER], [
234	AC_MSG_CHECKING([whether $CC supports -fno-omit-frame-pointer])
235
236	saved_flags="$CFLAGS"
237	CFLAGS="$CFLAGS -Werror -fno-omit-frame-pointer"
238
239	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
240		NO_OMIT_FRAME_POINTER=-fno-omit-frame-pointer
241		AC_MSG_RESULT([yes])
242	], [
243		NO_OMIT_FRAME_POINTER=
244		AC_MSG_RESULT([no])
245	])
246
247	CFLAGS="$saved_flags"
248	AC_SUBST([NO_OMIT_FRAME_POINTER])
249])
250
251dnl #
252dnl # Check if cc supports -fno-ipa-sra option.
253dnl #
254AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA], [
255	AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra])
256
257	saved_flags="$CFLAGS"
258	CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
259
260	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
261		NO_IPA_SRA=-fno-ipa-sra
262		AC_MSG_RESULT([yes])
263	], [
264		NO_IPA_SRA=
265		AC_MSG_RESULT([no])
266	])
267
268	CFLAGS="$saved_flags"
269	AC_SUBST([NO_IPA_SRA])
270])
271