xref: /freebsd/sys/contrib/openzfs/config/always-compiler-options.m4 (revision 59c8e88e72633afbc47a4ace0d2170d00d51f7dc)
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 kernel cc supports -Winfinite-recursion option.
232dnl #
233AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION], [
234	AC_MSG_CHECKING([whether $KERNEL_CC supports -Winfinite-recursion])
235
236	saved_cc="$CC"
237	saved_flags="$CFLAGS"
238	CC="gcc"
239	CFLAGS="$CFLAGS -Werror -Winfinite-recursion"
240
241	AS_IF([ test -n "$KERNEL_CC" ], [
242		CC="$KERNEL_CC"
243	])
244	AS_IF([ test -n "$KERNEL_LLVM" ], [
245		CC="clang"
246	])
247
248	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
249		KERNEL_INFINITE_RECURSION=-Winfinite-recursion
250		AC_DEFINE([HAVE_KERNEL_INFINITE_RECURSION], 1,
251			[Define if compiler supports -Winfinite-recursion])
252		AC_MSG_RESULT([yes])
253	], [
254		KERNEL_INFINITE_RECURSION=
255		AC_MSG_RESULT([no])
256	])
257
258	CC="$saved_cc"
259	CFLAGS="$saved_flags"
260	AC_SUBST([KERNEL_INFINITE_RECURSION])
261])
262
263dnl #
264dnl # Check if cc supports -Wformat-overflow option.
265dnl #
266AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW], [
267	AC_MSG_CHECKING([whether $CC supports -Wformat-overflow])
268
269	saved_flags="$CFLAGS"
270	CFLAGS="$CFLAGS -Werror -Wformat-overflow"
271
272	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
273		FORMAT_OVERFLOW=-Wformat-overflow
274		AC_DEFINE([HAVE_FORMAT_OVERFLOW], 1,
275			[Define if compiler supports -Wformat-overflow])
276		AC_MSG_RESULT([yes])
277	], [
278		FORMAT_OVERFLOW=
279		AC_MSG_RESULT([no])
280	])
281
282	CFLAGS="$saved_flags"
283	AC_SUBST([FORMAT_OVERFLOW])
284])
285
286dnl #
287dnl # Check if cc supports -fno-omit-frame-pointer option.
288dnl #
289AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER], [
290	AC_MSG_CHECKING([whether $CC supports -fno-omit-frame-pointer])
291
292	saved_flags="$CFLAGS"
293	CFLAGS="$CFLAGS -Werror -fno-omit-frame-pointer"
294
295	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
296		NO_OMIT_FRAME_POINTER=-fno-omit-frame-pointer
297		AC_MSG_RESULT([yes])
298	], [
299		NO_OMIT_FRAME_POINTER=
300		AC_MSG_RESULT([no])
301	])
302
303	CFLAGS="$saved_flags"
304	AC_SUBST([NO_OMIT_FRAME_POINTER])
305])
306
307dnl #
308dnl # Check if cc supports -fno-ipa-sra option.
309dnl #
310AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA], [
311	AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra])
312
313	saved_flags="$CFLAGS"
314	CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
315
316	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
317		NO_IPA_SRA=-fno-ipa-sra
318		AC_MSG_RESULT([yes])
319	], [
320		NO_IPA_SRA=
321		AC_MSG_RESULT([no])
322	])
323
324	CFLAGS="$saved_flags"
325	AC_SUBST([NO_IPA_SRA])
326])
327
328dnl #
329dnl # Check if kernel cc supports -fno-ipa-sra option.
330dnl #
331AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA], [
332	AC_MSG_CHECKING([whether $KERNEL_CC supports -fno-ipa-sra])
333
334	saved_cc="$CC"
335	saved_flags="$CFLAGS"
336	CC="gcc"
337	CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
338
339	AS_IF([ test -n "$KERNEL_CC" ], [
340		CC="$KERNEL_CC"
341	])
342	AS_IF([ test -n "$KERNEL_LLVM" ], [
343		CC="clang"
344	])
345
346	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
347		KERNEL_NO_IPA_SRA=-fno-ipa-sra
348		AC_MSG_RESULT([yes])
349	], [
350		KERNEL_NO_IPA_SRA=
351		AC_MSG_RESULT([no])
352	])
353
354	CC="$saved_cc"
355	CFLAGS="$saved_flags"
356	AC_SUBST([KERNEL_NO_IPA_SRA])
357])
358