xref: /freebsd/sys/contrib/openzfs/config/always-compiler-options.m4 (revision 70999532eea52da609e90c003b583ee0bfa5246b)
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 kernel cc supports -Wno-format-zero-length option.
160dnl #
161AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_FORMAT_ZERO_LENGTH], [
162	saved_cc="$CC"
163	AS_IF(
164		[ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
165		[ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
166		[ CC="gcc" ]
167	)
168	AC_MSG_CHECKING([whether $CC supports -Wno-format-zero-length])
169
170	saved_flags="$CFLAGS"
171	CFLAGS="$CFLAGS -Werror -Wno-format-zero-length"
172
173	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
174		KERNEL_NO_FORMAT_ZERO_LENGTH=-Wno-format-zero-length
175		AC_MSG_RESULT([yes])
176	], [
177		KERNEL_NO_FORMAT_ZERO_LENGTH=
178		AC_MSG_RESULT([no])
179	])
180
181	CC="$saved_cc"
182	CFLAGS="$saved_flags"
183	AC_SUBST([KERNEL_NO_FORMAT_ZERO_LENGTH])
184])
185
186dnl #
187dnl # Check if cc supports -Wno-clobbered option.
188dnl #
189dnl # We actually invoke it with the -Wclobbered option
190dnl # and infer the 'no-' version does or doesn't exist based upon
191dnl # the results.  This is required because when checking any of
192dnl # no- prefixed options gcc always returns success.
193dnl #
194AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_CLOBBERED], [
195	AC_MSG_CHECKING([whether $CC supports -Wno-clobbered])
196
197	saved_flags="$CFLAGS"
198	CFLAGS="$CFLAGS -Werror -Wclobbered"
199
200	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
201		NO_CLOBBERED=-Wno-clobbered
202		AC_MSG_RESULT([yes])
203	], [
204		NO_CLOBBERED=
205		AC_MSG_RESULT([no])
206	])
207
208	CFLAGS="$saved_flags"
209	AC_SUBST([NO_CLOBBERED])
210])
211
212dnl #
213dnl # Check if cc supports -Wimplicit-fallthrough option.
214dnl #
215AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_IMPLICIT_FALLTHROUGH], [
216	AC_MSG_CHECKING([whether $CC supports -Wimplicit-fallthrough])
217
218	saved_flags="$CFLAGS"
219	CFLAGS="$CFLAGS -Werror -Wimplicit-fallthrough"
220
221	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
222		IMPLICIT_FALLTHROUGH=-Wimplicit-fallthrough
223		AC_DEFINE([HAVE_IMPLICIT_FALLTHROUGH], 1,
224			[Define if compiler supports -Wimplicit-fallthrough])
225		AC_MSG_RESULT([yes])
226	], [
227		IMPLICIT_FALLTHROUGH=
228		AC_MSG_RESULT([no])
229	])
230
231	CFLAGS="$saved_flags"
232	AC_SUBST([IMPLICIT_FALLTHROUGH])
233])
234
235dnl #
236dnl # Check if cc supports -Winfinite-recursion option.
237dnl #
238AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_INFINITE_RECURSION], [
239	AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion])
240
241	saved_flags="$CFLAGS"
242	CFLAGS="$CFLAGS -Werror -Winfinite-recursion"
243
244	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
245		INFINITE_RECURSION=-Winfinite-recursion
246		AC_DEFINE([HAVE_INFINITE_RECURSION], 1,
247			[Define if compiler supports -Winfinite-recursion])
248		AC_MSG_RESULT([yes])
249	], [
250		INFINITE_RECURSION=
251		AC_MSG_RESULT([no])
252	])
253
254	CFLAGS="$saved_flags"
255	AC_SUBST([INFINITE_RECURSION])
256])
257
258dnl #
259dnl # Check if kernel cc supports -Winfinite-recursion option.
260dnl #
261AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION], [
262	saved_cc="$CC"
263	AS_IF(
264		[ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
265		[ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
266		[ CC="gcc" ]
267	)
268	AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion])
269
270	saved_flags="$CFLAGS"
271	CFLAGS="$CFLAGS -Werror -Winfinite-recursion"
272
273	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
274		KERNEL_INFINITE_RECURSION=-Winfinite-recursion
275		AC_DEFINE([HAVE_KERNEL_INFINITE_RECURSION], 1,
276			[Define if compiler supports -Winfinite-recursion])
277		AC_MSG_RESULT([yes])
278	], [
279		KERNEL_INFINITE_RECURSION=
280		AC_MSG_RESULT([no])
281	])
282
283	CC="$saved_cc"
284	CFLAGS="$saved_flags"
285	AC_SUBST([KERNEL_INFINITE_RECURSION])
286])
287
288dnl #
289dnl # Check if cc supports -Wformat-overflow option.
290dnl #
291AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW], [
292	AC_MSG_CHECKING([whether $CC supports -Wformat-overflow])
293
294	saved_flags="$CFLAGS"
295	CFLAGS="$CFLAGS -Werror -Wformat-overflow"
296
297	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
298		FORMAT_OVERFLOW=-Wformat-overflow
299		AC_DEFINE([HAVE_FORMAT_OVERFLOW], 1,
300			[Define if compiler supports -Wformat-overflow])
301		AC_MSG_RESULT([yes])
302	], [
303		FORMAT_OVERFLOW=
304		AC_MSG_RESULT([no])
305	])
306
307	CFLAGS="$saved_flags"
308	AC_SUBST([FORMAT_OVERFLOW])
309])
310
311dnl #
312dnl # Check if cc supports -fno-omit-frame-pointer option.
313dnl #
314AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER], [
315	AC_MSG_CHECKING([whether $CC supports -fno-omit-frame-pointer])
316
317	saved_flags="$CFLAGS"
318	CFLAGS="$CFLAGS -Werror -fno-omit-frame-pointer"
319
320	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
321		NO_OMIT_FRAME_POINTER=-fno-omit-frame-pointer
322		AC_MSG_RESULT([yes])
323	], [
324		NO_OMIT_FRAME_POINTER=
325		AC_MSG_RESULT([no])
326	])
327
328	CFLAGS="$saved_flags"
329	AC_SUBST([NO_OMIT_FRAME_POINTER])
330])
331
332dnl #
333dnl # Check if cc supports -fno-ipa-sra option.
334dnl #
335AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA], [
336	AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra])
337
338	saved_flags="$CFLAGS"
339	CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
340
341	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
342		NO_IPA_SRA=-fno-ipa-sra
343		AC_MSG_RESULT([yes])
344	], [
345		NO_IPA_SRA=
346		AC_MSG_RESULT([no])
347	])
348
349	CFLAGS="$saved_flags"
350	AC_SUBST([NO_IPA_SRA])
351])
352
353dnl #
354dnl # Check if kernel cc supports -fno-ipa-sra option.
355dnl #
356AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA], [
357	saved_cc="$CC"
358	AS_IF(
359		[ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
360		[ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
361		[ CC="gcc" ]
362	)
363	AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra])
364
365	saved_flags="$CFLAGS"
366	CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
367
368	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
369		KERNEL_NO_IPA_SRA=-fno-ipa-sra
370		AC_MSG_RESULT([yes])
371	], [
372		KERNEL_NO_IPA_SRA=
373		AC_MSG_RESULT([no])
374	])
375
376	CC="$saved_cc"
377	CFLAGS="$saved_flags"
378	AC_SUBST([KERNEL_NO_IPA_SRA])
379])
380